home · contact · privacy
0bf7c84d7aa8b36a69b81f32f7ac31308aaa95a6
[plomrogue] / src / command_db.c
1 /* command.c */
2
3 #include "command_db.h"
4 #include <stdlib.h> /* for free() */
5 #include <stdio.h> /* for FILE typedef, fgets() */
6 #include <stdint.h> /* for uint8_t */
7 #include <string.h> /* for strlen(), strtok() */
8 #include "main.h" /* for World struct */
9 #include "rexit.h" /* for exit_err() */
10 #include "readwrite.h" /* for textfile_sizes(), try_fopen(), try_fclose() */
11 #include "misc.h" /* for try_malloc() */
12
13
14
15 /* Build string pointed to by "ch_ptr" from next token delimited by "delim". */
16 static void copy_tokenized_string(struct World * world, char ** ch_ptr,
17                                   char * delim)
18 {
19     char * f_name = "copy_tokenized_string()";
20     char * dsc_ptr = strtok(NULL, delim);
21     * ch_ptr = try_malloc(strlen(dsc_ptr) + 1, world, f_name);
22     memcpy(* ch_ptr, dsc_ptr, strlen(dsc_ptr) + 1);
23 }
24
25
26
27 extern uint8_t is_command_id_shortdsc(struct World * world,
28                                       uint8_t id, char * shortdsc)
29 {
30     struct Command * cmd_ptr = world->cmd_db->cmds;
31     while (1)
32     {
33         if (id == cmd_ptr->id)
34         {
35             if (strcmp(shortdsc, cmd_ptr->dsc_short))
36             {
37                 return 0;
38             }
39             return 1;
40         }
41         cmd_ptr = &cmd_ptr[1];
42     }
43 }
44
45
46
47 extern uint8_t get_command_id(struct World * world, char * dsc_short)
48 {
49     struct Command * cmd_ptr = world->cmd_db->cmds;
50     while (1)
51     {
52         if (0 == strcmp(dsc_short, cmd_ptr->dsc_short))
53         {
54             return cmd_ptr->id;
55         }
56         cmd_ptr = &cmd_ptr[1];
57     }
58 }
59
60
61
62 extern char * get_command_longdsc(struct World * world, char * dsc_short)
63 {
64     struct Command * cmd_ptr = world->cmd_db->cmds;
65     while (1)
66     {
67         if (0 == strcmp(dsc_short, cmd_ptr->dsc_short))
68         {
69             return cmd_ptr->dsc_long;
70         }
71         cmd_ptr = &cmd_ptr[1];
72     }
73 }
74
75
76
77 extern void init_command_db(struct World * world)
78 {
79     char * f_name = "init_command_db()";
80     char * err_s = "Trouble in init_cmds() with textfile_sizes().";
81
82     char * path = "config/commands";
83     FILE * file = try_fopen(path, "r", world, f_name);
84     uint16_t lines, linemax;
85     exit_err(textfile_sizes(file, &linemax, &lines), world, err_s);
86     char line[linemax + 1];
87
88     struct Command * cmds = try_malloc(lines * sizeof(struct Command),
89                                        world, f_name);
90     uint8_t i = 0;
91     while (fgets(line, linemax + 1, file))
92     {
93         cmds[i].id = atoi(strtok(line, " "));
94         copy_tokenized_string(world, &cmds[i].dsc_short, " ");
95         copy_tokenized_string(world, &cmds[i].dsc_long, "\n");
96         i++;
97     }
98     try_fclose(file, world, f_name);
99
100     world->cmd_db = try_malloc(sizeof(struct CommandDB), world, f_name);
101     world->cmd_db->cmds = cmds;
102     world->cmd_db->n = lines;
103 }
104
105
106
107 extern void free_command_db(struct World * world)
108 {
109     uint8_t i = 0;
110     while (i < world->cmd_db->n)
111     {
112         free(world->cmd_db->cmds[i].dsc_short);
113         free(world->cmd_db->cmds[i].dsc_long);
114         i++;
115     }
116     free(world->cmd_db->cmds);
117     free(world->cmd_db);
118 }