btmux/autom4te.cache/
btmux/doc/.svn/
btmux/event/.svn/
btmux/game/.svn/
btmux/game/bin/.svn/
btmux/game/data/.svn/
btmux/game/logs/.svn/
btmux/game/maps/
btmux/game/maps/.svn/
btmux/game/maps/.svn/prop-base/
btmux/game/maps/.svn/props/
btmux/game/maps/.svn/text-base/
btmux/game/maps/.svn/wcprops/
btmux/game/mechs/
btmux/game/mechs/.svn/
btmux/game/mechs/.svn/prop-base/
btmux/game/mechs/.svn/props/
btmux/game/mechs/.svn/text-base/
btmux/game/mechs/.svn/wcprops/
btmux/game/text/.svn/
btmux/include/.svn/
btmux/misc/
btmux/misc/.svn/
btmux/misc/.svn/prop-base/
btmux/misc/.svn/props/
btmux/misc/.svn/text-base/
btmux/misc/.svn/wcprops/
btmux/python/
btmux/python/.svn/
btmux/python/.svn/prop-base/
btmux/python/.svn/props/
btmux/python/.svn/text-base/
btmux/python/.svn/wcprops/
btmux/src/.svn/prop-base/
btmux/src/.svn/props/
btmux/src/.svn/text-base/
btmux/src/.svn/wcprops/
btmux/src/hcode/.svn/
btmux/src/hcode/btech/
btmux/src/hcode/btech/.svn/
btmux/src/hcode/btech/.svn/prop-base/
btmux/src/hcode/btech/.svn/props/
btmux/src/hcode/btech/.svn/text-base/
btmux/src/hcode/btech/.svn/wcprops/
btmux/src/hcode/include/.svn/
/*
 * commac.c 
 */

/*
 * $Id: commac.c,v 1.3 2005/08/08 09:43:05 murrayma Exp $ 
 */

#include "copyright.h"
#include "config.h"
#include <ctype.h>
#include <sys/types.h>

#include "db.h"
#include "interface.h"
#include "match.h"
#include "config.h"
#include "externs.h"

#include "commac.h"

extern void load_comsystem(FILE *);
extern void load_macros(FILE *);
extern void save_comsystem(FILE *);
extern void save_macros(FILE *);

void load_comsys_and_macros(char *filename) {
    FILE *fp;
    int i;
    char buffer[200];

    for (i = 0; i < NUM_COMMAC; i++)
        commac_table[i] = NULL;

    if (!(fp = fopen(filename, "r"))) {
        fprintf(stderr, "Error: Couldn't find %s.\n", filename);
    } else {
        fprintf(stderr, "LOADING: %s\n", filename);
        if (fscanf(fp, "*** Begin %s ***\n", buffer) == 1 &&
                !strcmp(buffer, "COMMAC")) {
            load_commac(fp);
        } else {
            fprintf(stderr, "Error: Couldn't find Begin COMMAC in %s.",
                    filename);
            return;
        }

        if (fscanf(fp, "*** Begin %s ***\n", buffer) == 1 &&
                !strcmp(buffer, "COMSYS")) {
            load_comsystem(fp);
        } else {
            fprintf(stderr, "Error: Couldn't find Begin COMSYS in %s.",
                    filename);
            return;
        }

        if (fscanf(fp, "*** Begin %s ***\n", buffer) == 1 &&
                !strcmp(buffer, "MACRO")) {
            load_macros(fp);
        } else {
            fprintf(stderr, "Error: Couldn't find Begin MACRO in %s.",
                    filename);
            return;
        }

        fclose(fp);
        fprintf(stderr, "LOADING: %s (done)\n", filename);
    }
}

void save_comsys_and_macros(char *filename) {
    FILE *fp;
    char buffer[500];

    sprintf(buffer, "%s.#", filename);
    if (!(fp = fopen(buffer, "w"))) {
        fprintf(stderr, "Unable to open %s for writing.\n", buffer);
        return;
    }
    fprintf(fp, "*** Begin COMMAC ***\n");
    save_commac(fp);

    fprintf(fp, "*** Begin COMSYS ***\n");
    save_comsystem(fp);

    fprintf(fp, "*** Begin MACRO ***\n");
    save_macros(fp);

    fclose(fp);
    rename(buffer, filename);
}

void load_commac(FILE * fp) {
    int i, j;
    char buffer[100];
    int np;
    struct commac *c;
    char *t;
    char in;

    fscanf(fp, "%d\n", &np);
    for (i = 0; i < np; i++) {
        c = create_new_commac();
        fscanf(fp, "%d %d %d %d %d %d %d %d\n", &(c->who),
                &(c->numchannels), &(c->macros[0]), &(c->macros[1]),
                &c->macros[2], &(c->macros[3]), &(c->macros[4]), &(c->curmac));
        c->maxchannels = c->numchannels;
        if (c->maxchannels > 0) {
            c->alias = (char *) malloc(c->maxchannels * 6);
            c->channels =
                (char **) malloc(sizeof(char *) * c->maxchannels);

            for (j = 0; j < c->numchannels; j++) {
                t = c->alias + j * 6;
                while ((in = fgetc(fp)) != ' ')
                    *t++ = in;
                *t = 0;

                fscanf(fp, "%[^\n]\n", buffer);

                c->channels[j] = (char *) malloc(strlen(buffer) + 1);
                StringCopy(c->channels[j], buffer);
            }
            sort_com_aliases(c);
        } else {
            c->alias = NULL;
            c->channels = NULL;
        }
        if ((Typeof(c->who) == TYPE_PLAYER) || (!God(Owner(c->who))) ||
                ((!Going(c->who))))
            add_commac(c);
        purge_commac();
    }
}

void purge_commac(void) {
    struct commac *c;
    struct commac *d;
    int i;

#ifdef ABORT_PURGE_COMSYS
    return;
#endif				/*
                     * * ABORT_PURGE_COMSYS  
                     */

    for (i = 0; i < NUM_COMMAC; i++) {
        c = commac_table[i];
        while (c) {
            d = c;
            c = c->next;
            if (d->numchannels == 0 && d->curmac == -1 &&
                    d->macros[1] == -1 && d->macros[2] == -1 &&
                    d->macros[3] == -1 && d->macros[4] == -1 &&
                    d->macros[0] == -1) {
                del_commac(d->who);
                continue;
            }

            /*
             * if ((Typeof(d->who) != TYPE_PLAYER) && (God(Owner(d->who))) &&
             * * (Going(d->who))) 
             */
            if (Typeof(d->who) == TYPE_PLAYER)
                continue;
            if (God(Owner(d->who)) && Going(d->who)) {
                del_commac(d->who);
                continue;
            }
        }
    }
}

void save_commac(FILE * fp) {
    int np;
    struct commac *c;
    int i, j;

    purge_commac();
    np = 0;
    for (i = 0; i < NUM_COMMAC; i++) {
        c = commac_table[i];
        while (c) {
            np++;
            c = c->next;
        }
    }

    fprintf(fp, "%d\n", np);
    for (i = 0; i < NUM_COMMAC; i++) {
        c = commac_table[i];
        while (c) {
            fprintf(fp, "%d %d %d %d %d %d %d %d\n", c->who,
                    c->numchannels, c->macros[0], c->macros[1], c->macros[2],
                    c->macros[3], c->macros[4], c->curmac);
            for (j = 0; j < c->numchannels; j++) {
                fprintf(fp, "%s %s\n", c->alias + j * 6, c->channels[j]);
            }
            c = c->next;
        }
    }
}

struct commac *create_new_commac(void) {
    struct commac *c;
    int i;

    c = (struct commac *) malloc(sizeof(struct commac));

    c->who = -1;
    c->numchannels = 0;
    c->maxchannels = 0;
    c->alias = NULL;
    c->channels = NULL;

    c->curmac = -1;
    for (i = 0; i < 5; i++)
        c->macros[i] = -1;

    c->next = NULL;
    return c;
}

struct commac *get_commac(dbref which) {
    struct commac *c;

    if (which < 0)
        return NULL;

    c = commac_table[which % NUM_COMMAC];

    while (c && (c->who != which))
        c = c->next;

    if (!c) {
        c = create_new_commac();
        c->who = which;
        add_commac(c);
    }
    return c;
}

void add_commac(struct commac *c) {
    if (c->who < 0)
        return;

    c->next = commac_table[c->who % NUM_COMMAC];
    commac_table[c->who % NUM_COMMAC] = c;
}

void del_commac(dbref who) {
    struct commac *c;
    struct commac *last;

    if (who < 0)
        return;

    c = commac_table[who % NUM_COMMAC];

    if (c == NULL)
        return;

    if (c->who == who) {
        commac_table[who % NUM_COMMAC] = c->next;
        destroy_commac(c);
        return;
    }
    last = c;
    c = c->next;
    while (c) {
        if (c->who == who) {
            last->next = c->next;
            destroy_commac(c);
            return;
        }
        last = c;
        c = c->next;
    }
}

void destroy_commac(struct commac *c) {
    int i;

    free(c->alias);
    for (i = 0; i < c->numchannels; i++)
        free(c->channels[i]);
    free(c->channels);
    free(c);
}

void sort_com_aliases(struct commac *c) {
    int i;
    int cont;
    char buffer[10];
    char *s;

    cont = 1;
    while (cont) {
        cont = 0;
        for (i = 0; i < c->numchannels - 1; i++)
            if (strcasecmp(c->alias + i * 6, c->alias + (i + 1) * 6) > 0) {
                StringCopy(buffer, c->alias + i * 6);
                StringCopy(c->alias + i * 6, c->alias + (i + 1) * 6);
                StringCopy(c->alias + (i + 1) * 6, buffer);
                s = c->channels[i];
                c->channels[i] = c->channels[i + 1];
                c->channels[i + 1] = s;
                cont = 1;
            }
    }
}