1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
/**
* This file is part of Hercules.
* http://herc.ws - http://github.com/HerculesWS/Hercules
*
* Copyright (C) 2013-2015 Hercules Dev Team
*
* Hercules is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef COMMON_CONSOLE_H
#define COMMON_CONSOLE_H
#include "common/hercules.h"
#include "common/db.h"
#include "common/spinlock.h"
/* Forward Declarations */
struct Sql; // common/sql.h
struct cond_data;
struct mutex_data;
struct spin_lock;
struct thread_handle;
/**
* Queue Max
* why is there a limit, why not make it dynamic? - I'm playing it safe, I'd rather not play with memory management between threads
**/
#define CONSOLE_PARSE_SIZE 10
/**
* Default parsing function abstract prototype
**/
typedef void (*CParseFunc)(char *line);
/**
* Console parsing function prototypes
* CPCMD: Console Parsing CoMmand
* x - command
* y - category
**/
#define CPCMD(x) void console_parse_ ##x (char *line)
#define CPCMD_A(x) console_parse_ ##x
#define CPCMD_C(x,y) void console_parse_ ##y ##x (char *line)
#define CPCMD_C_A(x,y) console_parse_ ##y ##x
#define CP_CMD_LENGTH 20
enum CONSOLE_PARSE_ENTRY_TYPE {
CPET_UNKNOWN,
CPET_FUNCTION,
CPET_CATEGORY,
};
struct CParseEntry {
char cmd[CP_CMD_LENGTH];
int type; ///< Entry type (@see enum CONSOLE_PARSE_ENTRY_TYPE)
union {
CParseFunc func;
VECTOR_DECL(struct CParseEntry *) children;
} u;
};
struct console_input_interface {
#ifdef CONSOLE_INPUT
/* vars */
struct spin_lock *ptlock; ///< parse thread lock.
struct thread_handle *pthread; ///< parse thread.
volatile int32 ptstate; ///< parse thread state.
struct mutex_data *ptmutex; ///< parse thread mutex.
struct cond_data *ptcond; ///< parse thread conditional variable.
/* */
VECTOR_DECL(struct CParseEntry *) command_list;
VECTOR_DECL(struct CParseEntry *) commands;
/* */
struct Sql *SQL;
/* */
void (*parse_init) (void);
void (*parse_final) (void);
int (*parse_timer) (int tid, int64 tick, int id, intptr_t data);
void *(*pthread_main) (void *x);
void (*parse) (char* line);
void (*parse_sub) (char* line);
int (*key_pressed) (void);
void (*load_defaults) (void);
void (*parse_list_subs) (struct CParseEntry *cmd, unsigned char depth);
void (*addCommand) (char *name, CParseFunc func);
void (*setSQL) (struct Sql *SQL_handle);
#else // not CONSOLE_INPUT
UNAVAILABLE_STRUCT;
#endif
};
struct console_interface {
void (*init) (void);
void (*final) (void);
void (*display_title) (void);
void (*display_gplnotice) (void);
struct console_input_interface *input;
};
#ifdef HERCULES_CORE
void console_defaults(void);
#endif // HERCULES_CORE
HPShared struct console_interface *console;
#endif /* COMMON_CONSOLE_H */
|