/
rogue25b1/
rogue25b1/space/planets/
rogue25b1/space/prototypes/
rogue25b1/space/ships/
#include "merc.h"
#include "db.h"
#include "olc.h"
#include "interp.h"
#include "tables.h"
#include "lookup.h"
#include "recycle.h"

extern	bool	fBootDb;
	int	MAX_CMD;
struct cmd_type	*cmd_table;

DO_FUN *cmd_func_lookup(char *arg);
char *cmd_func_name(DO_FUN *command);

#if defined(COMMAND)
#undef COMMAND
#endif

#define COMMAND(cmd)	{    #cmd,	cmd	},

const struct cmd_list_type cmd_list []= {
#include "command.h"
    {	NULL,		NULL	}
};

#undef COMMAND
#define COMMAND(cmd)	DECLARE_DO_FUN(cmd);

ACMD(do_nothing) {
    return;
}

void save_command(const struct cmd_type *cmd, FILE *fp) {
    fprintf(fp, "%s~\n", cmd->name);
    fprintf(fp, "%s~\n", cmd->sort_as);
    fprintf(fp, "%s~\n", cmd_func_name(cmd->do_fun));
    fprintf(fp, "%s~\n", position_table[cmd->position].short_name);
    fprintf(fp, "%s\n", print_flags(cmd->staffcmd));
    fprintf(fp, "%d %d %d %d\n\n",
	cmd->level, cmd->show, cmd->log, cmd->subcmd);
}

void load_command(FILE *fp, struct cmd_type *cmd) {
    cmd->name		= fread_string(fp);
    cmd->sort_as	= fread_string(fp);
    cmd->do_fun		= cmd_func_lookup(fread_string(fp));
    cmd->position	= position_lookup(fread_string(fp));
    cmd->staffcmd	= fread_flag(fp);
    cmd->level		= fread_number(fp);
    cmd->show		= fread_number(fp);
    cmd->log		= fread_number(fp);
    cmd->subcmd		= fread_number(fp);
}

void save_cmd_table(void) {
    FILE *fp;
    int i, cnt = 0;

    if (!(fp = fopen(CMD_FILE, "w"))) {
	mudlogf(BRF, LVL_STAFF, TRUE, "SYSERR: save_cmd_table: Cannot open %s for saving.", CMD_FILE);
	return;
    }

/*
    for (const struct cmd_type *temp = cmd_table;
    !IS_NULLSTR(temp->name); temp = temp++)
	cnt++;

    MAX_CMD = cnt;
*/
    fprintf(fp, "%d\n", MAX_CMD);

    for (i = 0; i < MAX_CMD; i++)
	save_command(&cmd_table[i], fp);

    fclose(fp);
}

void load_cmd_table(void) {
    int i;
    FILE *fp;

    if (!(fp = fopen(CMD_FILE, "r"))) {
	mudlogf(BRF, LVL_CODER, TRUE, "SYSERR: Could not open %s for reading.", CMD_FILE);
	exit(1);
    }

    fscanf(fp, "%d\n", &MAX_CMD);
    cmd_table = (struct cmd_type *)malloc(sizeof(struct cmd_type) * (MAX_CMD+1));

    for (i = 0; i < MAX_CMD; i++)
	load_command(fp, &cmd_table[i]);

    cmd_table[MAX_CMD].name = str_dup("");
    fclose(fp);
}

char *cmd_func_name(DO_FUN *command) {
    int cmd;

    for (cmd = 0; cmd_list[cmd].name; cmd++) {
	if (cmd_list[cmd].function == command)
	    return cmd_list[cmd].name;
    }
    return "";    
}

DO_FUN *cmd_func_lookup(char *arg) {
    int cmd;

    for (cmd = 0; cmd_list[cmd].name; cmd++) {
	if (!str_cmp(cmd_list[cmd].name, arg))
	    return cmd_list[cmd].function;
    }

    if (fBootDb) {
	mudlogf(BRF, LVL_STAFF, TRUE, "SYSERR: cmd_func_lookup: invalid function: %s does not exist.", arg);
	return do_nothing;
    }
    return NULL;
}

int cmd_lookup(char *arg) {
    int cmd;

    for (cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++) {
	if (LOWER(arg[0]) == LOWER(cmd_table[cmd].name[0])
	&& (!str_prefix(arg, cmd_table[cmd].name)))
	    return cmd;
    }
    return -1;
}

CMD_DATA *get_command_data(char *name) {
    int i;
    for (i = 0; i < MAX_CMD; i++)
	if (!str_cmp(name, cmd_table[i].name))
	    return &cmd_table[i];
    return NULL;
}

void list_functions(BUFFER *pbuf) {
    int i;
    char buf[MAX_STRING_LENGTH];

    sprintf(buf, "Num %-13.13s Num %-13.13s Num %-13.13s Num %-13.13s\n\r",
	"Number", "Number", "Number", "Number");
    add_buf(pbuf, buf);

    for (i = 0; cmd_list[i].name; i++) {
	sprintf(buf, "%3d %-13.13s", i, cmd_list[i].name);
	if (i % 4 == 3)
	    strcat(buf, "\n\r");
	else
	    strcat(buf, " ");
	add_buf(pbuf, buf);
    }
    if (i % 4 != 0)
	add_buf(pbuf, "\n\r");
}

void list_commands(BUFFER *pbuf, int minlev, int maxlev) {
    int i, cnt = 0;
    char buf[MAX_STRING_LENGTH];

    sprintf(buf, "Lvl %-12.12s %-13.13s Lvl %-12.12s %-13.13s\n\r",
	"Number", "Function", "Number", "Function");
    add_buf(pbuf, buf);

    for (i = 0; i < MAX_CMD; i++) {
	if (cmd_table[i].level < minlev || cmd_table[i].level > maxlev)
	    continue;

	sprintf(buf, "%3d %-12.12s %-13.13s",
	    cmd_table[i].level, cmd_table[i].name,
	    cmd_func_name(cmd_table[i].do_fun));
	if (cnt % 2 == 1)
	    strcat(buf, "\n\r");
	else
	    strcat(buf, " ");
	add_buf(pbuf, buf);
	cnt++;
    }
    if (cnt % 2 != 0)
	add_buf(pbuf, "\n\r");
}