summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--make.defs10
-rw-r--r--src/char/Makefile4
-rw-r--r--src/char/char.c302
-rw-r--r--src/char/int_guild.c62
-rw-r--r--src/char/int_party.c33
-rw-r--r--src/char/int_storage.c46
-rw-r--r--src/char/inter.c52
-rw-r--r--src/common/Makefile3
-rw-r--r--src/common/core.c132
-rw-r--r--src/common/core.h23
-rw-r--r--src/common/db.c424
-rw-r--r--src/common/db.h102
-rw-r--r--src/common/grfio.c1189
-rw-r--r--src/common/grfio.h29
-rw-r--r--src/common/lock.c27
-rw-r--r--src/common/lock.h11
-rw-r--r--src/common/malloc.c68
-rw-r--r--src/common/malloc.h27
-rw-r--r--src/common/md5calc.c505
-rw-r--r--src/common/md5calc.h67
-rw-r--r--src/common/mmo.h125
-rw-r--r--src/common/mt_rand.c86
-rw-r--r--src/common/mt_rand.h26
-rw-r--r--src/common/nullpo.c56
-rw-r--r--src/common/nullpo.h254
-rw-r--r--src/common/sanity.h36
-rw-r--r--src/common/socket.c420
-rw-r--r--src/common/socket.h197
-rw-r--r--src/common/timer.c328
-rw-r--r--src/common/timer.h86
-rw-r--r--src/common/utils.c121
-rw-r--r--src/common/utils.h49
-rw-r--r--src/common/version.h43
-rw-r--r--src/ladmin/Makefile4
-rw-r--r--src/ladmin/ladmin.c86
-rw-r--r--src/login/Makefile4
-rw-r--r--src/login/login.c336
-rw-r--r--src/map/Makefile4
-rw-r--r--src/map/atcommand.c29
-rw-r--r--src/map/battle.c26
-rw-r--r--src/map/chat.c5
-rw-r--r--src/map/chrif.c33
-rw-r--r--src/map/clif.c56
-rw-r--r--src/map/clif.h2
-rw-r--r--src/map/guild.c77
-rw-r--r--src/map/itemdb.c26
-rw-r--r--src/map/magic-expr.c5
-rw-r--r--src/map/magic-interpreter-base.c11
-rw-r--r--src/map/magic-interpreter-parser.y14
-rw-r--r--src/map/magic-interpreter.h1
-rw-r--r--src/map/magic-stmt.c31
-rw-r--r--src/map/map.c125
-rw-r--r--src/map/map.h6
-rw-r--r--src/map/mob.c183
-rw-r--r--src/map/mob.h8
-rw-r--r--src/map/npc.c215
-rw-r--r--src/map/npc.h2
-rw-r--r--src/map/party.c26
-rw-r--r--src/map/pc.c125
-rw-r--r--src/map/pc.h10
-rw-r--r--src/map/script.c125
-rw-r--r--src/map/skill-pools.c2
-rw-r--r--src/map/skill.c225
-rw-r--r--src/map/skill.h4
-rw-r--r--src/map/storage.c20
-rw-r--r--src/map/tmw.c3
-rw-r--r--src/tool/Makefile10
-rw-r--r--src/tool/eathena-monitor.c6
-rw-r--r--src/tool/itemfrob.c7
-rw-r--r--src/tool/mapfrob.c7
-rw-r--r--src/tool/marriage-info.c6
-rw-r--r--src/tool/moneycount/mmo.h15
-rw-r--r--src/tool/skillfrob.c5
74 files changed, 2385 insertions, 4444 deletions
diff --git a/.gitignore b/.gitignore
index 2e84a3a..0bba20b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@
src/char/char
char-server
src/ladmin/ladmin
+/ladmin
src/login/login
login-server
src/map/map
diff --git a/make.defs b/make.defs
index 55710c4..6f648e3 100644
--- a/make.defs
+++ b/make.defs
@@ -1,16 +1,20 @@
# defaults
CC = gcc
-CFLAGS = -pipe -g -fno-strict-aliasing -O2 -Wall
+CFLAGS = -pipe -g -fno-strict-aliasing -Wall -Wextra -Werror=all -Werror=implicit-function-declaration
CP = cp -f
# The below might cause problems sometimes
# CP = cp -lf
# CP = cp -sf
# works on both x86 and x86_64
-override CC += -m32
+override CC += -m32 -std=gnu99
ifeq ($(findstring CYGWIN,$(shell uname)), CYGWIN)
override CFLAGS += -DFD_SETSIZE=4096 -DCYGWIN
else
- override CFLAGS += -fstack-protector -Wno-pointer-sign
+ override CFLAGS += -fstack-protector
endif
+# The default recipe is suboptimal
+%.c: %.l
+ $(LEX) -o $@ $<
+
diff --git a/src/char/Makefile b/src/char/Makefile
index 308747d..c448627 100644
--- a/src/char/Makefile
+++ b/src/char/Makefile
@@ -2,8 +2,8 @@ include ../../make.defs
all: char
-COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/lock.o ../common/malloc.o ../common/mt_rand.o
-COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/db.h ../common/lock.h ../common/timer.h ../common/malloc.h ../common/mt_rand.h
+COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/lock.o ../common/mt_rand.o
+COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/db.h ../common/lock.h ../common/timer.h ../common/mt_rand.h
char: char.o inter.o int_party.o int_guild.o int_storage.o $(COMMON_OBJ)
char.o: char.c char.h inter.h $(COMMON_H) ../common/version.h
diff --git a/src/char/char.c b/src/char/char.c
index 5ac11d4..d340f1d 100644
--- a/src/char/char.c
+++ b/src/char/char.c
@@ -199,7 +199,7 @@ int search_character_index (char *character_name)
for (i = 0; i < char_num; i++)
{
// Without case sensitive check (increase the number of similar character names found)
- if (stricmp (char_dat[i].name, character_name) == 0)
+ if (strcasecmp (char_dat[i].name, character_name) == 0)
{
// Strict comparison (if found, we finish the function immediatly with correct value)
if (strcmp (char_dat[i].name, character_name) == 0)
@@ -427,7 +427,7 @@ int mmo_char_fromstr (char *str, struct mmo_charstatus *p)
}
}
- if (strcmpi (wisp_server_name, p->name) == 0)
+ if (strcasecmp (wisp_server_name, p->name) == 0)
{
printf
("mmo_auth_init: ******WARNING: character name has wisp server name.\n");
@@ -592,18 +592,8 @@ int mmo_char_init (void)
FILE *fp;
char_max = 256;
- char_dat = calloc (sizeof (struct mmo_charstatus) * 256, 1);
- if (!char_dat)
- {
- printf ("out of memory: mmo_char_init (calloc of char_dat).\n");
- exit (1);
- }
- online_chars = calloc (sizeof (int) * 256, 1);
- if (!online_chars)
- {
- printf ("out of memory: mmo_char_init (calloc of online_chars).\n");
- exit (1);
- }
+ CREATE (char_dat, struct mmo_charstatus, 256);
+ CREATE (online_chars, int, 256);
for (i = 0; i < char_max; i++)
online_chars[i] = -1;
@@ -640,27 +630,8 @@ int mmo_char_init (void)
if (char_num >= char_max)
{
char_max += 256;
- char_dat =
- realloc (char_dat, sizeof (struct mmo_charstatus) * char_max);
- if (!char_dat)
- {
- printf
- ("Out of memory: mmo_char_init (realloc of char_dat).\n");
- char_log
- ("Out of memory: mmo_char_init (realloc of char_dat)."
- RETCODE);
- exit (1);
- }
- online_chars = realloc (online_chars, sizeof (int) * char_max);
- if (!online_chars)
- {
- printf
- ("Out of memory: mmo_char_init (realloc of online_chars).\n");
- char_log
- ("Out of memory: mmo_char_init (realloc of online_chars)."
- RETCODE);
- exit (1);
- }
+ RECREATE (char_dat, struct mmo_charstatus, char_max);
+ RECREATE (online_chars, int, char_max);
for (i = char_max - 256; i < char_max; i++)
online_chars[i] = -1;
}
@@ -829,7 +800,7 @@ void mmo_char_sync (void)
//----------------------------------------------------
// Function to save (in a periodic way) datas in files
//----------------------------------------------------
-int mmo_char_sync_timer (int tid, unsigned int tick, int id, int data)
+void mmo_char_sync_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
if (pid != 0)
{
@@ -839,14 +810,14 @@ int mmo_char_sync_timer (int tid, unsigned int tick, int id, int data)
// Need to check status too?
if (temp == 0)
{
- return 0;
+ return;
}
}
// This can take a lot of time. Fork a child to handle the work and return at once
// If we're unable to fork just continue running the function normally
if ((pid = fork ()) > 0)
- return 0;
+ return;
mmo_char_sync ();
inter_save ();
@@ -854,8 +825,6 @@ int mmo_char_sync_timer (int tid, unsigned int tick, int id, int data)
// If we're a child we should suicide now.
if (pid == 0)
_exit (0);
-
- return 0;
}
//----------------------------------------------------
@@ -972,7 +941,7 @@ int make_new_char (int fd, unsigned char *dat)
{
if ((name_ignoring_case != 0 && strcmp (char_dat[i].name, dat) == 0)
|| (name_ignoring_case == 0
- && strcmpi (char_dat[i].name, dat) == 0))
+ && strcasecmp (char_dat[i].name, dat) == 0))
{
char_log
("Make new char error (name already exists): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %s), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d."
@@ -1009,25 +978,8 @@ int make_new_char (int fd, unsigned char *dat)
if (char_num >= char_max)
{
char_max += 256;
- char_dat =
- realloc (char_dat, sizeof (struct mmo_charstatus) * char_max);
- if (!char_dat)
- {
- printf ("Out of memory: make_new_char (realloc of char_dat).\n");
- char_log ("Out of memory: make_new_char (realloc of char_dat)."
- RETCODE);
- exit (1);
- }
- online_chars = realloc (online_chars, sizeof (int) * char_max);
- if (!online_chars)
- {
- printf
- ("Out of memory: make_new_char (realloc of online_chars).\n");
- char_log
- ("Out of memory: make_new_char (realloc of online_chars)."
- RETCODE);
- exit (1);
- }
+ RECREATE (char_dat, struct mmo_charstatus, char_max);
+ RECREATE (online_chars, int, char_max);
for (j = char_max - 256; j < char_max; j++)
online_chars[j] = -1;
}
@@ -1282,9 +1234,9 @@ void create_online_files (void)
{
char *p_name = char_dat[i].name; //speed up sorting when there are a lot of players. But very rarely players have same name.
for (j = 0; j < players; j++)
- if (stricmp (p_name, char_dat[id[j]].name) < 0 ||
+ if (strcasecmp (p_name, char_dat[id[j]].name) < 0 ||
// if same name, we sort with case sensitive.
- (stricmp (p_name, char_dat[id[j]].name) == 0 &&
+ (strcasecmp (p_name, char_dat[id[j]].name) == 0 &&
strcmp (p_name, char_dat[id[j]].name) < 0))
{
for (k = players; k > j; k--)
@@ -1299,7 +1251,7 @@ void create_online_files (void)
if (char_dat[i].zeny < char_dat[id[j]].zeny ||
// if same number of zenys, we sort by name.
(char_dat[i].zeny == char_dat[id[j]].zeny &&
- stricmp (char_dat[i].name,
+ strcasecmp (char_dat[i].name,
char_dat[id[j]].name) < 0))
{
for (k = players; k > j; k--)
@@ -1348,10 +1300,10 @@ void create_online_files (void)
{
int cpm_result; // A lot of player maps are identical. So, test if done often twice.
for (j = 0; j < players; j++)
- if ((cpm_result = strcmp (char_dat[i].last_point.map, char_dat[id[j]].last_point.map)) < 0 || // no map are identical and with upper cases (not use stricmp)
+ if ((cpm_result = strcmp (char_dat[i].last_point.map, char_dat[id[j]].last_point.map)) < 0 || // no map are identical and with upper cases (not use strcasecmp)
// if same map name, we sort by name.
(cpm_result == 0 &&
- stricmp (char_dat[i].name,
+ strcasecmp (char_dat[i].name,
char_dat[id[j]].name) < 0))
{
for (k = players; k > j; k--)
@@ -1876,7 +1828,7 @@ static int char_delete (struct mmo_charstatus *cs)
return 0;
}
-int parse_tologin (int fd)
+void parse_tologin (int fd)
{
int i;
struct char_session_data *sd;
@@ -1894,7 +1846,7 @@ int parse_tologin (int fd)
}
close (fd);
delete_session (fd);
- return 0;
+ return;
}
sd = session[fd]->session_data;
@@ -1907,7 +1859,7 @@ int parse_tologin (int fd)
{
case 0x2711:
if (RFIFOREST (fd) < 3)
- return 0;
+ return;
if (RFIFOB (fd, 2))
{
// printf("connect login server error : %d\n", RFIFOB(fd,2));
@@ -1936,7 +1888,7 @@ int parse_tologin (int fd)
case 0x2713:
if (RFIFOREST (fd) < 51)
- return 0;
+ return;
// printf("parse_tologin 2713 : %d\n", RFIFOB(fd,6));
for (i = 0; i < fd_max; i++)
{
@@ -1980,7 +1932,7 @@ int parse_tologin (int fd)
// Receiving of an e-mail/time limit from the login-server (answer of a request because a player comes back from map-server to char-server) by [Yor]
case 0x2717:
if (RFIFOREST (fd) < 50)
- return 0;
+ return;
for (i = 0; i < fd_max; i++)
{
if (session[i] && (sd = session[i]->session_data))
@@ -2000,7 +1952,7 @@ int parse_tologin (int fd)
case 0x2721: // gm reply
if (RFIFOREST (fd) < 10)
- return 0;
+ return;
{
unsigned char buf[10];
WBUFW (buf, 0) = 0x2b0b;
@@ -2014,7 +1966,7 @@ int parse_tologin (int fd)
case 0x2723: // changesex reply (modified by [Yor])
if (RFIFOREST (fd) < 7)
- return 0;
+ return;
{
int acc, sex, i, j;
unsigned char buf[7];
@@ -2079,7 +2031,7 @@ int parse_tologin (int fd)
case 0x2726: // Request to send a broadcast message (no answer)
if (RFIFOREST (fd) < 8
|| RFIFOREST (fd) < (8 + RFIFOL (fd, 4)))
- return 0;
+ return;
if (RFIFOL (fd, 4) < 1)
char_log
("Receiving a message for broadcast, but message is void."
@@ -2166,7 +2118,7 @@ int parse_tologin (int fd)
// account_reg2変更通知
case 0x2729:
if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
- return 0;
+ return;
{
struct global_reg reg[ACCOUNT_REG2_NUM];
unsigned char buf[4096];
@@ -2192,7 +2144,7 @@ int parse_tologin (int fd)
case 0x7924:
{ // [Fate] Itemfrob package: forwarded from login-server
if (RFIFOREST (fd) < 10)
- return 0;
+ return;
int source_id = RFIFOL (fd, 2);
int dest_id = RFIFOL (fd, 6);
unsigned char buf[10];
@@ -2240,7 +2192,7 @@ int parse_tologin (int fd)
// Account deletion notification (from login-server)
case 0x2730:
if (RFIFOREST (fd) < 6)
- return 0;
+ return;
// Deletion of all characters of the account
for (i = 0; i < char_num; i++)
{
@@ -2302,7 +2254,7 @@ int parse_tologin (int fd)
// State change of account/ban notification (from login-server) by [Yor]
case 0x2731:
if (RFIFOREST (fd) < 11)
- return 0;
+ return;
// send to all map-servers to disconnect the player
{
unsigned char buf[11];
@@ -2320,14 +2272,12 @@ int parse_tologin (int fd)
// Receiving GM acounts info from login-server (by [Yor])
case 0x2732:
if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
- return 0;
+ return;
{
char buf[32000];
if (gm_account != NULL)
free (gm_account);
- gm_account =
- calloc (sizeof (struct gm_account) *
- ((RFIFOW (fd, 2) - 4) / 5), 1);
+ CREATE (gm_account, struct gm_account, (RFIFOW (fd, 2) - 4) / 5);
GM_num = 0;
for (i = 4; i < RFIFOW (fd, 2); i = i + 5)
{
@@ -2353,7 +2303,7 @@ int parse_tologin (int fd)
case 0x2741: // change password reply
if (RFIFOREST (fd) < 7)
- return 0;
+ return;
{
int acc, status, i;
acc = RFIFOL (fd, 2);
@@ -2378,18 +2328,17 @@ int parse_tologin (int fd)
default:
session[fd]->eof = 1;
- return 0;
+ return;
}
}
RFIFOFLUSH (fd);
-
- return 0;
}
//--------------------------------
// Map-server anti-freeze system
//--------------------------------
-int map_anti_freeze_system (int tid, unsigned int tick, int id, int data)
+typedef void (*timer_func) (timer_id, tick_t, custom_id_t, custom_data_t);
+void map_anti_freeze_system (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
int i;
@@ -2411,11 +2360,9 @@ int map_anti_freeze_system (int tid, unsigned int tick, int id, int data)
}
}
}
-
- return 0;
}
-int parse_frommap (int fd)
+void parse_frommap (int fd)
{
int i, j;
int id;
@@ -2438,7 +2385,7 @@ int parse_frommap (int fd)
}
close (fd);
delete_session (fd);
- return 0;
+ return;
}
while (RFIFOREST (fd) >= 2)
@@ -2461,7 +2408,7 @@ int parse_frommap (int fd)
// Receiving map names list from the map-server
case 0x2afa:
if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
- return 0;
+ return;
memset (server[id].map, 0, sizeof (server[id].map));
j = 0;
for (i = 4; i < RFIFOW (fd, 2); i += 16)
@@ -2531,7 +2478,7 @@ int parse_frommap (int fd)
// 認証要求
case 0x2afc:
if (RFIFOREST (fd) < 22)
- return 0;
+ return;
//printf("auth_fifo search: account: %d, char: %d, secure: %08x-%08x\n", RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14));
for (i = 0; i < AUTH_FIFO_SIZE; i++)
{
@@ -2581,7 +2528,7 @@ int parse_frommap (int fd)
// MAPサーバー上のユーザー数受信
case 0x2aff:
if (RFIFOREST (fd) < 6 || RFIFOREST (fd) < RFIFOW (fd, 2))
- return 0;
+ return;
server[id].users = RFIFOW (fd, 4);
if (anti_freeze_enable)
server_freezeflag[id] = 5; // Map anti-freeze system. Counter. 5 ok, 4...0 freezed
@@ -2613,7 +2560,7 @@ int parse_frommap (int fd)
// キャラデータ保存
case 0x2b01:
if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
- return 0;
+ return;
for (i = 0; i < char_num; i++)
{
if (char_dat[i].account_id == RFIFOL (fd, 4) &&
@@ -2629,7 +2576,7 @@ int parse_frommap (int fd)
// キャラセレ要求
case 0x2b02:
if (RFIFOREST (fd) < 18)
- return 0;
+ return;
if (auth_fifo_pos >= AUTH_FIFO_SIZE)
auth_fifo_pos = 0;
//printf("auth_fifo set (auth #%d) - account: %d, secure: %08x-%08x\n", auth_fifo_pos, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
@@ -2652,7 +2599,7 @@ int parse_frommap (int fd)
// マップサーバー間移動要求
case 0x2b05:
if (RFIFOREST (fd) < 49)
- return 0;
+ return;
if (auth_fifo_pos >= AUTH_FIFO_SIZE)
auth_fifo_pos = 0;
WFIFOW (fd, 0) = 0x2b06;
@@ -2684,7 +2631,7 @@ int parse_frommap (int fd)
// キャラ名検索
case 0x2b08:
if (RFIFOREST (fd) < 6)
- return 0;
+ return;
for (i = 0; i < char_num; i++)
{
if (char_dat[i].char_id == RFIFOL (fd, 2))
@@ -2703,7 +2650,7 @@ int parse_frommap (int fd)
// it is a request to become GM
case 0x2b0a:
if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
- return 0;
+ return;
// printf("parse_frommap: change gm -> login, account: %d, pass: '%s'.\n", RFIFOL(fd,4), RFIFOP(fd,8));
if (login_fd > 0)
{ // don't send request if no login-server
@@ -2725,7 +2672,7 @@ int parse_frommap (int fd)
// Map server send information to change an email of an account -> login-server
case 0x2b0c:
if (RFIFOREST (fd) < 86)
- return 0;
+ return;
if (login_fd > 0)
{ // don't send request if no login-server
memcpy (WFIFOP (login_fd, 0), RFIFOP (fd, 0), 86); // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B
@@ -2738,7 +2685,7 @@ int parse_frommap (int fd)
// Map server ask char-server about a character name to do some operations (all operations are transmitted to login-server)
case 0x2b0e:
if (RFIFOREST (fd) < 44)
- return 0;
+ return;
{
char character_name[24];
int acc = RFIFOL (fd, 2); // account_id of who ask (-1 if nobody)
@@ -2877,7 +2824,7 @@ int parse_frommap (int fd)
// account_reg保存要求
case 0x2b10:
if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
- return 0;
+ return;
{
struct global_reg reg[ACCOUNT_REG2_NUM];
int p, acc;
@@ -2910,7 +2857,7 @@ int parse_frommap (int fd)
// Map server is requesting a divorce
case 0x2b16:
if (RFIFOREST (fd) < 4)
- return 0;
+ return;
{
for (i = 0; i < char_num; i++)
if (char_dat[i].char_id == RFIFOL (fd, 2))
@@ -2931,17 +2878,16 @@ int parse_frommap (int fd)
if (r == 1) // 処理できた
break;
if (r == 2) // パケット長が足りない
- return 0;
+ return;
}
// inter server処理でもない場合は切断
printf
("char: unknown packet 0x%04x (%d bytes to read in buffer)! (from map).\n",
RFIFOW (fd, 0), RFIFOREST (fd));
session[fd]->eof = 1;
- return 0;
+ return;
}
}
- return 0;
}
int search_mapserver (char *map)
@@ -3002,7 +2948,7 @@ int lan_ip_check (unsigned char *p)
return lancheck;
}
-int parse_char (int fd)
+void parse_char (int fd)
{
int i, ch;
char email[40];
@@ -3015,7 +2961,7 @@ int parse_char (int fd)
login_fd = -1;
close (fd);
delete_session (fd);
- return 0;
+ return;
}
sd = session[fd]->session_data;
@@ -3029,13 +2975,13 @@ int parse_char (int fd)
{
case 0x20b: //20040622暗号化ragexe対応
if (RFIFOREST (fd) < 19)
- return 0;
+ return;
RFIFOSKIP (fd, 19);
break;
case 0x61: // change password request
if (RFIFOREST (fd) < 50)
- return 0;
+ return;
{
WFIFOW (login_fd, 0) = 0x2740;
WFIFOL (login_fd, 2) = sd->account_id;
@@ -3048,7 +2994,7 @@ int parse_char (int fd)
case 0x65: // 接続要求
if (RFIFOREST (fd) < 17)
- return 0;
+ return;
{
int GM_value;
if ((GM_value = isGM (RFIFOL (fd, 2))))
@@ -3060,9 +3006,8 @@ int parse_char (int fd)
RFIFOL (fd, 2));
if (sd == NULL)
{
- sd = session[fd]->session_data =
- calloc (sizeof (struct char_session_data), 1);
- memset (sd, 0, sizeof (struct char_session_data));
+ CREATE (sd, struct char_session_data, 1);
+ session[fd]->session_data = sd;
memcpy (sd->email, "no mail", 40); // put here a mail without '@' to refuse deletion if we don't receive the e-mail
sd->connect_until_time = 0; // unknow or illimited (not displaying on map-server)
}
@@ -3141,7 +3086,7 @@ int parse_char (int fd)
case 0x66: // キャラ選択
if (!sd || RFIFOREST (fd) < 3)
- return 0;
+ return;
char ip[16];
unsigned char *sin_addr =
@@ -3311,7 +3256,7 @@ int parse_char (int fd)
case 0x67: // 作成
if (!sd || RFIFOREST (fd) < 37)
- return 0;
+ return;
i = make_new_char (fd, RFIFOP (fd, 2));
if (i < 0)
{
@@ -3386,7 +3331,7 @@ int parse_char (int fd)
case 0x68: // delete char //Yor's Fix
if (!sd || RFIFOREST (fd) < 46)
- return 0;
+ return;
memcpy (email, RFIFOP (fd, 6), 40);
if (e_mail_check (email) == 0)
strncpy (email, "a@a.com", 40); // default e-mail
@@ -3440,7 +3385,7 @@ int parse_char (int fd)
}
else
{
- /*if (strcmpi(email, sd->email) != 0) { // if it's an invalid email
+ /*if (strcasecmp(email, sd->email) != 0) { // if it's an invalid email
* WFIFOW(fd, 0) = 0x70;
* WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address
* WFIFOSET(fd, 3);
@@ -3512,7 +3457,7 @@ int parse_char (int fd)
case 0x2af8: // マップサーバーログイン
if (RFIFOREST (fd) < 60)
- return 0;
+ return;
WFIFOW (fd, 0) = 0x2af9;
for (i = 0; i < MAX_MAP_SERVERS; i++)
{
@@ -3555,13 +3500,13 @@ int parse_char (int fd)
}
WFIFOW (fd, 2) = len;
WFIFOSET (fd, len);
- return 0;
+ return;
}
break;
case 0x187: // Alive信号?
if (RFIFOREST (fd) < 6)
- return 0;
+ return;
RFIFOSKIP (fd, 6);
break;
@@ -3576,19 +3521,17 @@ int parse_char (int fd)
WFIFOW (fd, 8) = ATHENA_MOD_VERSION;
WFIFOSET (fd, 10);
RFIFOSKIP (fd, 2);
- return 0;
+ return;
case 0x7532: // 接続の切断(defaultと処理は一緒だが明示的にするため)
session[fd]->eof = 1;
- return 0;
+ return;
default:
session[fd]->eof = 1;
- return 0;
+ return;
}
}
- RFIFOFLUSH (fd);
- return 0;
}
// 全てのMAPサーバーにデータ送信(送信したmap鯖の数を返す)
@@ -3649,7 +3592,7 @@ int mapif_send (int fd, unsigned char *buf, unsigned int len)
return 0;
}
-int send_users_tologin (int tid, unsigned int tick, int id, int data)
+void send_users_tologin (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
int users = count_users ();
char buf[16];
@@ -3665,17 +3608,15 @@ int send_users_tologin (int tid, unsigned int tick, int id, int data)
WBUFW (buf, 0) = 0x2b00;
WBUFL (buf, 2) = users;
mapif_sendall (buf, 6);
-
- return 0;
}
-int check_connect_login_server (int tid, unsigned int tick, int id, int data)
+void check_connect_login_server (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
if (login_fd <= 0 || session[login_fd] == NULL)
{
printf ("Attempt to connect to login-server...\n");
if ((login_fd = make_connection (login_ip, login_port)) < 0)
- return 0;
+ return;
session[login_fd]->func_parse = parse_tologin;
realloc_fifo (login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
WFIFOW (login_fd, 0) = 0x2710;
@@ -3696,7 +3637,6 @@ int check_connect_login_server (int tid, unsigned int tick, int id, int data)
WFIFOW (login_fd, 84) = char_new;
WFIFOSET (login_fd, 86);
}
- return 0;
}
//----------------------------------------------------------
@@ -3705,12 +3645,12 @@ int check_connect_login_server (int tid, unsigned int tick, int id, int data)
//----------------------------------------------------------
int config_switch (const char *str)
{
- if (strcmpi (str, "on") == 0 || strcmpi (str, "yes") == 0
- || strcmpi (str, "oui") == 0 || strcmpi (str, "ja") == 0
- || strcmpi (str, "si") == 0)
+ if (strcasecmp (str, "on") == 0 || strcasecmp (str, "yes") == 0
+ || strcasecmp (str, "oui") == 0 || strcasecmp (str, "ja") == 0
+ || strcasecmp (str, "si") == 0)
return 1;
- if (strcmpi (str, "off") == 0 || strcmpi (str, "no") == 0
- || strcmpi (str, "non") == 0 || strcmpi (str, "nein") == 0)
+ if (strcasecmp (str, "off") == 0 || strcasecmp (str, "no") == 0
+ || strcasecmp (str, "non") == 0 || strcasecmp (str, "nein") == 0)
return 0;
return atoi (str);
@@ -3756,7 +3696,7 @@ int lan_config_read (const char *lancfgName)
remove_control_chars (w1);
remove_control_chars (w2);
- if (strcmpi (w1, "lan_map_ip") == 0)
+ if (strcasecmp (w1, "lan_map_ip") == 0)
{ // Read map-server Lan IP Address
h = gethostbyname (w2);
if (h != NULL)
@@ -3774,7 +3714,7 @@ int lan_config_read (const char *lancfgName)
}
printf ("LAN IP of map-server: %s.\n", lan_map_ip);
}
- else if (strcmpi (w1, "subnet") == 0)
+ else if (strcasecmp (w1, "subnet") == 0)
{ // Read Subnetwork
for (j = 0; j < 4; j++)
subneti[j] = 0;
@@ -3792,7 +3732,7 @@ int lan_config_read (const char *lancfgName)
printf ("Sub-network of the map-server: %d.%d.%d.%d.\n",
subneti[0], subneti[1], subneti[2], subneti[3]);
}
- else if (strcmpi (w1, "subnetmask") == 0)
+ else if (strcasecmp (w1, "subnetmask") == 0)
{ // Read Subnetwork Mask
for (j = 0; j < 4; j++)
subnetmaski[j] = 255;
@@ -3859,21 +3799,21 @@ int char_config_read (const char *cfgName)
remove_control_chars (w1);
remove_control_chars (w2);
- if (strcmpi (w1, "userid") == 0)
+ if (strcasecmp (w1, "userid") == 0)
{
memcpy (userid, w2, 24);
}
- else if (strcmpi (w1, "passwd") == 0)
+ else if (strcasecmp (w1, "passwd") == 0)
{
memcpy (passwd, w2, 24);
}
- else if (strcmpi (w1, "server_name") == 0)
+ else if (strcasecmp (w1, "server_name") == 0)
{
memcpy (server_name, w2, sizeof (server_name));
server_name[sizeof (server_name) - 1] = '\0';
printf ("%s server has been intialized\n", w2);
}
- else if (strcmpi (w1, "wisp_server_name") == 0)
+ else if (strcasecmp (w1, "wisp_server_name") == 0)
{
if (strlen (w2) >= 4)
{
@@ -3881,7 +3821,7 @@ int char_config_read (const char *cfgName)
wisp_server_name[sizeof (wisp_server_name) - 1] = '\0';
}
}
- else if (strcmpi (w1, "login_ip") == 0)
+ else if (strcasecmp (w1, "login_ip") == 0)
{
h = gethostbyname (w2);
if (h != NULL)
@@ -3900,11 +3840,11 @@ int char_config_read (const char *cfgName)
else
memcpy (login_ip_str, w2, 16);
}
- else if (strcmpi (w1, "login_port") == 0)
+ else if (strcasecmp (w1, "login_port") == 0)
{
login_port = atoi (w2);
}
- else if (strcmpi (w1, "char_ip") == 0)
+ else if (strcasecmp (w1, "char_ip") == 0)
{
h = gethostbyname (w2);
if (h != NULL)
@@ -3923,51 +3863,51 @@ int char_config_read (const char *cfgName)
else
memcpy (char_ip_str, w2, 16);
}
- else if (strcmpi (w1, "char_port") == 0)
+ else if (strcasecmp (w1, "char_port") == 0)
{
char_port = atoi (w2);
}
- else if (strcmpi (w1, "char_maintenance") == 0)
+ else if (strcasecmp (w1, "char_maintenance") == 0)
{
char_maintenance = atoi (w2);
}
- else if (strcmpi (w1, "char_new") == 0)
+ else if (strcasecmp (w1, "char_new") == 0)
{
char_new = atoi (w2);
}
- else if (strcmpi (w1, "email_creation") == 0)
+ else if (strcasecmp (w1, "email_creation") == 0)
{
email_creation = config_switch (w2);
}
- else if (strcmpi (w1, "char_txt") == 0)
+ else if (strcasecmp (w1, "char_txt") == 0)
{
strcpy (char_txt, w2);
}
- else if (strcmpi (w1, "backup_txt") == 0)
+ else if (strcasecmp (w1, "backup_txt") == 0)
{ //By zanetheinsane
strcpy (backup_txt, w2);
}
- else if (strcmpi (w1, "backup_txt_flag") == 0)
+ else if (strcasecmp (w1, "backup_txt_flag") == 0)
{ // The backup_txt file was created because char deletion bug existed. Now it's finish and that take a lot of time to create a second file when there are a lot of characters. By [Yor]
backup_txt_flag = config_switch (w2);
}
- else if (strcmpi (w1, "max_connect_user") == 0)
+ else if (strcasecmp (w1, "max_connect_user") == 0)
{
max_connect_user = atoi (w2);
if (max_connect_user < 0)
max_connect_user = 0; // unlimited online players
}
- else if (strcmpi (w1, "check_ip_flag") == 0)
+ else if (strcasecmp (w1, "check_ip_flag") == 0)
{
check_ip_flag = config_switch (w2);
}
- else if (strcmpi (w1, "autosave_time") == 0)
+ else if (strcasecmp (w1, "autosave_time") == 0)
{
autosave_interval = atoi (w2) * 1000;
if (autosave_interval <= 0)
autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
}
- else if (strcmpi (w1, "start_point") == 0)
+ else if (strcasecmp (w1, "start_point") == 0)
{
char map[32];
int x, y;
@@ -3980,85 +3920,85 @@ int char_config_read (const char *cfgName)
start_point.y = y;
}
}
- else if (strcmpi (w1, "start_zeny") == 0)
+ else if (strcasecmp (w1, "start_zeny") == 0)
{
start_zeny = atoi (w2);
if (start_zeny < 0)
start_zeny = 0;
}
- else if (strcmpi (w1, "start_weapon") == 0)
+ else if (strcasecmp (w1, "start_weapon") == 0)
{
start_weapon = atoi (w2);
if (start_weapon < 0)
start_weapon = 0;
}
- else if (strcmpi (w1, "start_armor") == 0)
+ else if (strcasecmp (w1, "start_armor") == 0)
{
start_armor = atoi (w2);
if (start_armor < 0)
start_armor = 0;
}
- else if (strcmpi (w1, "unknown_char_name") == 0)
+ else if (strcasecmp (w1, "unknown_char_name") == 0)
{
strcpy (unknown_char_name, w2);
unknown_char_name[24] = 0;
}
- else if (strcmpi (w1, "char_log_filename") == 0)
+ else if (strcasecmp (w1, "char_log_filename") == 0)
{
strcpy (char_log_filename, w2);
}
- else if (strcmpi (w1, "name_ignoring_case") == 0)
+ else if (strcasecmp (w1, "name_ignoring_case") == 0)
{
name_ignoring_case = config_switch (w2);
}
- else if (strcmpi (w1, "char_name_option") == 0)
+ else if (strcasecmp (w1, "char_name_option") == 0)
{
char_name_option = atoi (w2);
}
- else if (strcmpi (w1, "char_name_letters") == 0)
+ else if (strcasecmp (w1, "char_name_letters") == 0)
{
strcpy (char_name_letters, w2);
// online files options
}
- else if (strcmpi (w1, "online_txt_filename") == 0)
+ else if (strcasecmp (w1, "online_txt_filename") == 0)
{
strcpy (online_txt_filename, w2);
}
- else if (strcmpi (w1, "online_html_filename") == 0)
+ else if (strcasecmp (w1, "online_html_filename") == 0)
{
strcpy (online_html_filename, w2);
}
- else if (strcmpi (w1, "online_sorting_option") == 0)
+ else if (strcasecmp (w1, "online_sorting_option") == 0)
{
online_sorting_option = atoi (w2);
}
- else if (strcmpi (w1, "online_display_option") == 0)
+ else if (strcasecmp (w1, "online_display_option") == 0)
{
online_display_option = atoi (w2);
}
- else if (strcmpi (w1, "online_gm_display_min_level") == 0)
+ else if (strcasecmp (w1, "online_gm_display_min_level") == 0)
{ // minimum GM level to display 'GM' when we want to display it
online_gm_display_min_level = atoi (w2);
if (online_gm_display_min_level < 5) // send online file every 5 seconds to player is enough
online_gm_display_min_level = 5;
}
- else if (strcmpi (w1, "online_refresh_html") == 0)
+ else if (strcasecmp (w1, "online_refresh_html") == 0)
{
online_refresh_html = atoi (w2);
if (online_refresh_html < 1)
online_refresh_html = 1;
}
- else if (strcmpi (w1, "anti_freeze_enable") == 0)
+ else if (strcasecmp (w1, "anti_freeze_enable") == 0)
{
anti_freeze_enable = config_switch (w2);
}
- else if (strcmpi (w1, "anti_freeze_interval") == 0)
+ else if (strcasecmp (w1, "anti_freeze_interval") == 0)
{
ANTI_FREEZE_INTERVAL = atoi (w2);
if (ANTI_FREEZE_INTERVAL < 5)
ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds
}
- else if (strcmpi (w1, "import") == 0)
+ else if (strcasecmp (w1, "import") == 0)
{
char_config_read (w2);
}
@@ -4068,7 +4008,7 @@ int char_config_read (const char *cfgName)
return 0;
}
-void do_final (void)
+void term_func (void)
{
int i;
@@ -4119,15 +4059,14 @@ int do_init (int argc, char **argv)
inter_init ((argc > 2) ? argv[2] : inter_cfgName); // inter server 初期化
- set_termfunc (do_final);
+// set_termfunc (do_final);
set_defaultparse (parse_char);
char_fd = make_listen_port (char_port);
- add_timer_func_list (check_connect_login_server,
- "check_connect_login_server");
- add_timer_func_list (send_users_tologin, "send_users_tologin");
- add_timer_func_list (mmo_char_sync_timer, "mmo_char_sync_timer");
+// add_timer_func_list (check_connect_login_server, "check_connect_login_server");
+// add_timer_func_list (send_users_tologin, "send_users_tologin");
+// add_timer_func_list (mmo_char_sync_timer, "mmo_char_sync_timer");
i = add_timer_interval (gettick () + 1000, check_connect_login_server, 0,
0, 10 * 1000);
@@ -4138,8 +4077,7 @@ int do_init (int argc, char **argv)
if (anti_freeze_enable > 0)
{
- add_timer_func_list (map_anti_freeze_system,
- "map_anti_freeze_system");
+// add_timer_func_list (map_anti_freeze_system, "map_anti_freeze_system");
i = add_timer_interval (gettick () + 1000, map_anti_freeze_system, 0, 0, ANTI_FREEZE_INTERVAL * 1000); // checks every X seconds user specifies
}
diff --git a/src/char/int_guild.c b/src/char/int_guild.c
index e145b66..9715700 100644
--- a/src/char/int_guild.c
+++ b/src/char/int_guild.c
@@ -30,7 +30,7 @@ int guild_calcinfo (struct guild *g);
int mapif_guild_basicinfochanged (int guild_id, int type, const void *data,
int len);
int mapif_guild_info (int fd, struct guild *g);
-int guild_break_sub (void *key, void *data, va_list ap);
+void guild_break_sub (db_key_t key, db_val_t data, va_list ap);
// ギルドデータの文字列への変換
int inter_guild_tostr (char *str, struct guild *g)
@@ -448,14 +448,7 @@ int inter_guild_init ()
guild_newid = i;
continue;
}
-
- g = calloc (sizeof (struct guild), 1);
- if (g == NULL)
- {
- printf ("int_guild: out of memory!\n");
- exit (0);
- }
- memset (g, 0, sizeof (struct guild));
+ CREATE (g, struct guild, 1);
if (inter_guild_fromstr (line, g) == 0 && g->guild_id > 0)
{
if (g->guild_id >= guild_newid)
@@ -483,13 +476,7 @@ int inter_guild_init ()
while (fgets (line, sizeof (line) - 1, fp))
{
- gc = calloc (sizeof (struct guild_castle), 1);
- if (gc == NULL)
- {
- printf ("int_guild: out of memory!\n");
- exit (0);
- }
- memset (gc, 0, sizeof (struct guild_castle));
+ CREATE (gc, struct guild_castle, 1);
if (inter_guildcastle_fromstr (line, gc) == 0)
{
numdb_insert (castle_db, gc->castle_id, gc);
@@ -508,13 +495,7 @@ int inter_guild_init ()
//デフォルトデータを作成
for (i = 0; i < MAX_GUILDCASTLE; i++)
{
- gc = calloc (sizeof (struct guild_castle), 1);
- if (gc == NULL)
- {
- printf ("int_guild: out of memory!\n");
- exit (0);
- }
- memset (gc, 0, sizeof (struct guild_castle));
+ CREATE (gc, struct guild_castle, 1);
gc->castle_id = i;
gc->guild_id = 0;
gc->economy = 0;
@@ -562,7 +543,7 @@ struct guild *inter_guild_search (int guild_id)
}
// ギルドデータのセーブ用
-int inter_guild_save_sub (void *key, void *data, va_list ap)
+void inter_guild_save_sub (db_key_t key, db_val_t data, va_list ap)
{
char line[16384];
FILE *fp;
@@ -570,12 +551,10 @@ int inter_guild_save_sub (void *key, void *data, va_list ap)
inter_guild_tostr (line, (struct guild *) data);
fp = va_arg (ap, FILE *);
fprintf (fp, "%s" RETCODE, line);
-
- return 0;
}
// ギルド城データのセーブ用
-int inter_castle_save_sub (void *key, void *data, va_list ap)
+void inter_castle_save_sub (db_key_t key, db_val_t data, va_list ap)
{
char line[16384];
FILE *fp;
@@ -583,8 +562,6 @@ int inter_castle_save_sub (void *key, void *data, va_list ap)
inter_guildcastle_tostr (line, (struct guild_castle *) data);
fp = va_arg (ap, FILE *);
fprintf (fp, "%s" RETCODE, line);
-
- return 0;
}
// ギルドデータのセーブ
@@ -617,16 +594,15 @@ int inter_guild_save ()
}
// ギルド名検索用
-int search_guildname_sub (void *key, void *data, va_list ap)
+void search_guildname_sub (db_key_t key, db_val_t data, va_list ap)
{
struct guild *g = (struct guild *) data, **dst;
char *str;
str = va_arg (ap, char *);
dst = va_arg (ap, struct guild **);
- if (strcmpi (g->name, str) == 0)
+ if (strcasecmp (g->name, str) == 0)
*dst = g;
- return 0;
}
// ギルド名検索
@@ -660,7 +636,7 @@ int guild_check_empty (struct guild *g)
}
// キャラの競合がないかチェック用
-int guild_check_conflict_sub (void *key, void *data, va_list ap)
+void guild_check_conflict_sub (db_key_t key, db_val_t data, va_list ap)
{
struct guild *g = (struct guild *) data;
int guild_id, account_id, char_id, i;
@@ -670,7 +646,7 @@ int guild_check_conflict_sub (void *key, void *data, va_list ap)
char_id = va_arg (ap, int);
if (g->guild_id == guild_id) // 本来の所属なので問題なし
- return 0;
+ return;
for (i = 0; i < MAX_GUILD; i++)
{
@@ -683,8 +659,6 @@ int guild_check_conflict_sub (void *key, void *data, va_list ap)
"**データ競合**");
}
}
-
- return 0;
}
// キャラの競合がないかチェック
@@ -1037,7 +1011,7 @@ int mapif_guild_castle_datasave (int castle_id, int index, int value)
return 0;
}
-int mapif_guild_castle_alldataload_sub (void *key, void *data, va_list ap)
+void mapif_guild_castle_alldataload_sub (db_key_t key, db_val_t data, va_list ap)
{
int fd = va_arg (ap, int);
int *p = va_arg (ap, int *);
@@ -1045,8 +1019,6 @@ int mapif_guild_castle_alldataload_sub (void *key, void *data, va_list ap)
memcpy (WFIFOP (fd, *p), (struct guild_castle *) data,
sizeof (struct guild_castle));
(*p) += sizeof (struct guild_castle);
-
- return 0;
}
int mapif_guild_castle_alldataload (int fd)
@@ -1087,14 +1059,7 @@ int mapif_parse_CreateGuild (int fd, int account_id, char *name,
mapif_guild_created (fd, account_id, NULL);
return 0;
}
- g = calloc (sizeof (struct guild), 1);
- if (g == NULL)
- {
- printf ("int_guild: CreateGuild: out of memory !\n");
- mapif_guild_created (fd, account_id, NULL);
- exit (0);
- }
- memset (g, 0, sizeof (struct guild));
+ CREATE (g, struct guild, 1);
g->guild_id = guild_newid++;
memcpy (g->name, name, 24);
memcpy (g->master, master->name, 24);
@@ -1263,7 +1228,7 @@ int mapif_parse_GuildChangeMemberInfoShort (int fd, int guild_id,
}
// ギルド解散処理用(同盟/敵対を解除)
-int guild_break_sub (void *key, void *data, va_list ap)
+void guild_break_sub (db_key_t key, db_val_t data, va_list ap)
{
struct guild *g = (struct guild *) data;
int guild_id = va_arg (ap, int);
@@ -1274,7 +1239,6 @@ int guild_break_sub (void *key, void *data, va_list ap)
if (g->alliance[i].guild_id == guild_id)
g->alliance[i].guild_id = 0;
}
- return 0;
}
// ギルド解散要求
diff --git a/src/char/int_party.c b/src/char/int_party.c
index c5ed033..b728b1e 100644
--- a/src/char/int_party.c
+++ b/src/char/int_party.c
@@ -110,13 +110,7 @@ int inter_party_init ()
continue;
}
- p = calloc (sizeof (struct party), 1);
- if (p == NULL)
- {
- printf ("int_party: out of memory!\n");
- exit (0);
- }
- memset (p, 0, sizeof (struct party));
+ CREATE (p, struct party, 1);
if (inter_party_fromstr (line, p) == 0 && p->party_id > 0)
{
if (p->party_id >= party_newid)
@@ -139,7 +133,7 @@ int inter_party_init ()
}
// パーティーデータのセーブ用
-int inter_party_save_sub (void *key, void *data, va_list ap)
+void inter_party_save_sub (db_key_t key, db_val_t data, va_list ap)
{
char line[8192];
FILE *fp;
@@ -147,8 +141,6 @@ int inter_party_save_sub (void *key, void *data, va_list ap)
inter_party_tostr (line, (struct party *) data);
fp = va_arg (ap, FILE *);
fprintf (fp, "%s" RETCODE, line);
-
- return 0;
}
// パーティーデータのセーブ
@@ -172,17 +164,15 @@ int inter_party_save ()
}
// パーティ名検索用
-int search_partyname_sub (void *key, void *data, va_list ap)
+void search_partyname_sub (db_key_t key, db_val_t data, va_list ap)
{
struct party *p = (struct party *) data, **dst;
char *str;
str = va_arg (ap, char *);
dst = va_arg (ap, struct party **);
- if (strcmpi (p->name, str) == 0)
+ if (strcasecmp (p->name, str) == 0)
*dst = p;
-
- return 0;
}
// パーティ名検索
@@ -238,7 +228,7 @@ int party_check_empty (struct party *p)
}
// キャラの競合がないかチェック用
-int party_check_conflict_sub (void *key, void *data, va_list ap)
+void party_check_conflict_sub (db_key_t key, db_val_t data, va_list ap)
{
struct party *p = (struct party *) data;
int party_id, account_id, i;
@@ -249,7 +239,7 @@ int party_check_conflict_sub (void *key, void *data, va_list ap)
nick = va_arg (ap, char *);
if (p->party_id == party_id) // 本来の所属なので問題なし
- return 0;
+ return;
for (i = 0; i < MAX_PARTY; i++)
{
@@ -262,8 +252,6 @@ int party_check_conflict_sub (void *key, void *data, va_list ap)
mapif_parse_PartyLeave (-1, p->party_id, account_id);
}
}
-
- return 0;
}
// キャラの競合がないかチェック
@@ -449,14 +437,7 @@ int mapif_parse_CreateParty (int fd, int account_id, char *name, char *nick,
mapif_party_created (fd, account_id, NULL);
return 0;
}
- p = calloc (sizeof (struct party), 1);
- if (p == NULL)
- {
- printf ("int_party: out of memory !\n");
- mapif_party_created (fd, account_id, NULL);
- return 0;
- }
- memset (p, 0, sizeof (struct party));
+ CREATE (p, struct party, 1);
p->party_id = party_newid++;
memcpy (p->name, name, 24);
p->exp = 0;
diff --git a/src/char/int_storage.c b/src/char/int_storage.c
index 744a59f..99af725 100644
--- a/src/char/int_storage.c
+++ b/src/char/int_storage.c
@@ -7,7 +7,6 @@
#include "../common/socket.h"
#include "../common/db.h"
#include "../common/lock.h"
-#include "../common/malloc.h"
#include "char.h"
#include "inter.h"
#include "int_storage.h"
@@ -222,12 +221,7 @@ struct storage *account2storage (int account_id)
s = (struct storage *) numdb_search (storage_db, account_id);
if (s == NULL)
{
- s = (struct storage *) aCalloc (sizeof (struct storage), 1);
- if (s == NULL)
- {
- printf ("int_storage: out of memory!\n");
- exit (0);
- }
+ CREATE (s, struct storage, 1);
memset (s, 0, sizeof (struct storage));
s->account_id = account_id;
numdb_insert (storage_db, s->account_id, s);
@@ -244,14 +238,7 @@ struct guild_storage *guild2storage (int guild_id)
guild_id);
if (gs == NULL)
{
- gs = (struct guild_storage *)
- aCalloc (sizeof (struct guild_storage), 1);
- if (gs == NULL)
- {
- printf ("int_storage: out of memory!\n");
- exit (0);
- }
-// memset(gs,0,sizeof(struct guild_storage)); aCalloc does this! [Skotlex]
+ CREATE (gs, struct guild_storage, 1);
gs->guild_id = guild_id;
numdb_insert (guild_storage_db, gs->guild_id, gs);
}
@@ -280,13 +267,7 @@ int inter_storage_init ()
while (fgets (line, 65535, fp))
{
sscanf (line, "%d", &tmp_int);
- s = (struct storage *) aCalloc (sizeof (struct storage), 1);
- if (s == NULL)
- {
- printf ("int_storage: out of memory!\n");
- exit (0);
- }
-// memset(s,0,sizeof(struct storage)); aCalloc does this...
+ CREATE (s, struct storage, 1);
s->account_id = tmp_int;
if (s->account_id > 0 && storage_fromstr (line, s) == 0)
{
@@ -314,14 +295,7 @@ int inter_storage_init ()
while (fgets (line, 65535, fp))
{
sscanf (line, "%d", &tmp_int);
- gs = (struct guild_storage *) aCalloc (sizeof (struct guild_storage),
- 1);
- if (gs == NULL)
- {
- printf ("int_storage: out of memory!\n");
- exit (0);
- }
-// memset(gs,0,sizeof(struct guild_storage)); aCalloc...
+ CREATE (gs, struct guild_storage, 1);
gs->guild_id = tmp_int;
if (gs->guild_id > 0 && guild_storage_fromstr (line, gs) == 0)
{
@@ -340,20 +314,18 @@ int inter_storage_init ()
return 0;
}
-int storage_db_final (void *k, void *data, va_list ap)
+void storage_db_final (db_key_t k, db_val_t data, va_list ap)
{
struct storage *p = (struct storage *) data;
if (p)
free (p);
- return 0;
}
-int guild_storage_db_final (void *k, void *data, va_list ap)
+void guild_storage_db_final (db_key_t k, db_val_t data, va_list ap)
{
struct guild_storage *p = (struct guild_storage *) data;
if (p)
free (p);
- return 0;
}
void inter_storage_final ()
@@ -363,7 +335,7 @@ void inter_storage_final ()
return;
}
-int inter_storage_save_sub (void *key, void *data, va_list ap)
+void inter_storage_save_sub (db_key_t key, db_val_t data, va_list ap)
{
char line[65536];
FILE *fp;
@@ -371,7 +343,6 @@ int inter_storage_save_sub (void *key, void *data, va_list ap)
fp = va_arg (ap, FILE *);
if (*line)
fprintf (fp, "%s" RETCODE, line);
- return 0;
}
//---------------------------------------------------------
@@ -396,7 +367,7 @@ int inter_storage_save ()
return 0;
}
-int inter_guild_storage_save_sub (void *key, void *data, va_list ap)
+void inter_guild_storage_save_sub (db_key_t key, db_val_t data, va_list ap)
{
char line[65536];
FILE *fp;
@@ -409,7 +380,6 @@ int inter_guild_storage_save_sub (void *key, void *data, va_list ap)
if (*line)
fprintf (fp, "%s" RETCODE, line);
}
- return 0;
}
//---------------------------------------------------------
diff --git a/src/char/inter.c b/src/char/inter.c
index 5bee90f..f563931 100644
--- a/src/char/inter.c
+++ b/src/char/inter.c
@@ -120,13 +120,7 @@ int inter_accreg_init ()
while (fgets (line, sizeof (line) - 1, fp))
{
line[sizeof (line) - 1] = '\0';
-
- reg = calloc (sizeof (struct accreg), 1);
- if (reg == NULL)
- {
- printf ("inter: accreg: out of memory!\n");
- exit (0);
- }
+ CREATE (reg, struct accreg, 1);
if (inter_accreg_fromstr (line, reg) == 0 && reg->account_id > 0)
{
numdb_insert (accreg_db, reg->account_id, reg);
@@ -146,7 +140,7 @@ int inter_accreg_init ()
}
// アカウント変数のセーブ用
-int inter_accreg_save_sub (void *key, void *data, va_list ap)
+void inter_accreg_save_sub (db_key_t key, db_val_t data, va_list ap)
{
char line[8192];
FILE *fp;
@@ -158,8 +152,6 @@ int inter_accreg_save_sub (void *key, void *data, va_list ap)
fp = va_arg (ap, FILE *);
fprintf (fp, "%s" RETCODE, line);
}
-
- return 0;
}
// アカウント変数のセーブ
@@ -207,41 +199,41 @@ int inter_config_read (const char *cfgName)
if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) != 2)
continue;
- if (strcmpi (w1, "storage_txt") == 0)
+ if (strcasecmp (w1, "storage_txt") == 0)
{
strncpy (storage_txt, w2, sizeof (storage_txt));
}
- else if (strcmpi (w1, "party_txt") == 0)
+ else if (strcasecmp (w1, "party_txt") == 0)
{
strncpy (party_txt, w2, sizeof (party_txt));
}
- else if (strcmpi (w1, "guild_txt") == 0)
+ else if (strcasecmp (w1, "guild_txt") == 0)
{
strncpy (guild_txt, w2, sizeof (guild_txt));
}
- else if (strcmpi (w1, "castle_txt") == 0)
+ else if (strcasecmp (w1, "castle_txt") == 0)
{
strncpy (castle_txt, w2, sizeof (castle_txt));
}
- else if (strcmpi (w1, "accreg_txt") == 0)
+ else if (strcasecmp (w1, "accreg_txt") == 0)
{
strncpy (accreg_txt, w2, sizeof (accreg_txt));
}
- else if (strcmpi (w1, "guild_storage_txt") == 0)
+ else if (strcasecmp (w1, "guild_storage_txt") == 0)
{
strncpy (guild_storage_txt, w2, sizeof (guild_storage_txt));
}
- else if (strcmpi (w1, "party_share_level") == 0)
+ else if (strcasecmp (w1, "party_share_level") == 0)
{
party_share_level = atoi (w2);
if (party_share_level < 0)
party_share_level = 0;
}
- else if (strcmpi (w1, "inter_log_filename") == 0)
+ else if (strcasecmp (w1, "inter_log_filename") == 0)
{
strncpy (inter_log_filename, w2, sizeof (inter_log_filename));
}
- else if (strcmpi (w1, "import") == 0)
+ else if (strcasecmp (w1, "import") == 0)
{
inter_config_read (w2);
}
@@ -392,7 +384,7 @@ int mapif_account_reg_reply (int fd, int account_id)
//--------------------------------------------------------
// Existence check of WISP data
-int check_ttl_wisdata_sub (void *key, void *data, va_list ap)
+void check_ttl_wisdata_sub (db_key_t key, db_val_t data, va_list ap)
{
unsigned long tick;
struct WisData *wd = (struct WisData *) data;
@@ -401,8 +393,6 @@ int check_ttl_wisdata_sub (void *key, void *data, va_list ap)
if (DIFF_TICK (tick, wd->tick) > WISDATA_TTL
&& wis_delnum < WISDELLIST_MAX)
wis_dellist[wis_delnum++] = wd->id;
-
- return 0;
}
int check_ttl_wisdata ()
@@ -485,13 +475,7 @@ int mapif_parse_WisRequest (int fd)
}
else
{
-
- wd = (struct WisData *) calloc (sizeof (struct WisData), 1);
- if (wd == NULL)
- {
- printf ("inter: WisRequest: out of memory !\n");
- return 0;
- }
+ CREATE (wd, struct WisData, 1);
// Whether the failure of previous wisp/page transmission (timeout)
check_ttl_wisdata ();
@@ -546,17 +530,13 @@ int mapif_parse_WisToGM (int fd)
int mapif_parse_AccReg (int fd)
{
int j, p;
- struct accreg *reg = numdb_search (accreg_db, RFIFOL (fd, 4));
+ struct accreg *reg = numdb_search (accreg_db, (numdb_key_t)RFIFOL (fd, 4));
if (reg == NULL)
{
- if ((reg = calloc (sizeof (struct accreg), 1)) == NULL)
- {
- printf ("inter: accreg: out of memory !\n");
- exit (0);
- }
+ CREATE (reg, struct accreg, 1);
reg->account_id = RFIFOL (fd, 4);
- numdb_insert (accreg_db, RFIFOL (fd, 4), reg);
+ numdb_insert (accreg_db, (numdb_key_t)RFIFOL (fd, 4), reg);
}
for (j = 0, p = 8; j < ACCOUNT_REG_NUM && p < RFIFOW (fd, 2);
diff --git a/src/common/Makefile b/src/common/Makefile
index 549268b..43552dc 100644
--- a/src/common/Makefile
+++ b/src/common/Makefile
@@ -1,5 +1,5 @@
include ../../make.defs
-all: core.o socket.o timer.o grfio.o db.o lock.o nullpo.o malloc.o mt_rand.o md5calc.o
+all: core.o socket.o timer.o grfio.o db.o lock.o nullpo.o mt_rand.o md5calc.o
core.o: core.c core.h
socket.o: socket.c socket.h mmo.h
@@ -8,7 +8,6 @@ grfio.o: grfio.c grfio.h
db.o: db.c db.h
lock.o: lock.c lock.h
nullpo.o: nullpo.c nullpo.h
-malloc.o: malloc.c malloc.h
mt_rand.o: mt_rand.c mt_rand.h
md5calc.o: md5calc.c md5calc.h
diff --git a/src/common/core.c b/src/common/core.c
index bf48dfc..2b1b67c 100644
--- a/src/common/core.c
+++ b/src/common/core.c
@@ -1,11 +1,6 @@
-// $Id: core.c,v 1.1.1.1 2004/09/10 17:44:49 MagicalTux Exp $
-// original : core.c 2003/02/26 18:03:12 Rev 1.7
-
#include <stdio.h>
#include <stdlib.h>
-#ifndef LCCWIN32
#include <unistd.h>
-#endif
#include <signal.h>
#include <sys/wait.h>
@@ -14,84 +9,23 @@
#include "timer.h"
#include "version.h"
#include "mt_rand.h"
+#include "nullpo.h"
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-static void (*term_func) (void) = NULL;
-
-/*======================================
- * CORE : Set function
- *--------------------------------------
- */
-void set_termfunc (void (*termfunc) (void))
-{
- term_func = termfunc;
-}
-
-/*======================================
- * CORE : Signal Sub Function
- *--------------------------------------
- */
+/// Defined by each server
+extern int do_init (int, char **);
+extern void term_func (void);
-static void sig_proc (int sn)
+static void chld_proc (int UNUSED)
{
- int i;
- switch (sn)
- {
- case SIGINT:
- case SIGTERM:
- if (term_func)
- term_func ();
- for (i = 0; i < fd_max; i++)
- {
- if (!session[i])
- continue;
- close (i);
- }
- exit (0);
- break;
- case SIGCHLD:
- wait (&i);
- break;
- }
+ wait(NULL);
}
-
-int eathena_interactive_session = 1; // [fate] interactive session: print pretty graphics
-
-/*======================================
- * CORE : Display title
- *--------------------------------------
- */
-
-static void display_title (void)
+static void sig_proc (int UNUSED)
{
- // for help with the console colors look here:
- // http://www.edoceo.com/liberum/?doc=printf-with-color
- // some code explanation (used here):
- // \033[2J : clear screen and go up/left (0, 0 position)
- // \033[K : clear line from actual position to end of the line
- // \033[0m : reset color parameter
- // \033[1m : use bold for font
- if (eathena_interactive_session)
- {
- printf ("\033[2J"); // clear screen and go up/left (0, 0 position in text)
- printf ("\033[37;44m (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n"); // white writing (37) on blue background (44), \033[K clean until end of file
- printf ("\033[0;44m (\033[1;33m (c)2004 eAthena Development Team presents \033[0;44m)\033[K\033[0m\n"); // yellow writing (33)
- printf ("\033[0;44m (\033[1m ______ __ __ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf ("\033[0;44m (\033[1m /\\ _ \\/\\ \\__/\\ \\ v%2d.%02d.%02d \033[0;44m)\033[K\033[0m\n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION); // 1: bold char, 0: normal char
- printf ("\033[0;44m (\033[1m __\\ \\ \\_\\ \\ \\ ,_\\ \\ \\___ __ ___ __ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf ("\033[0;44m (\033[1m /'__`\\ \\ __ \\ \\ \\/\\ \\ _ `\\ /'__`\\/' _ `\\ /'__`\\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf ("\033[0;44m (\033[1m /\\ __/\\ \\ \\/\\ \\ \\ \\_\\ \\ \\ \\ \\/\\ __//\\ \\/\\ \\/\\ \\_\\.\\_ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf ("\033[0;44m (\033[1m \\ \\____\\\\ \\_\\ \\_\\ \\__\\\\ \\_\\ \\_\\ \\____\\ \\_\\ \\_\\ \\__/.\\_\\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf ("\033[0;44m (\033[1m \\/____/ \\/_/\\/_/\\/__/ \\/_/\\/_/\\/____/\\/_/\\/_/\\/__/\\/_/ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf ("\033[0;44m (\033[1m _ _ _ _ _ _ _ _ _ _ _ _ _ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf ("\033[0;44m (\033[1m / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf ("\033[0;44m (\033[1m ( e | n | g | l | i | s | h ) ( A | t | h | e | n | a ) \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf ("\033[0;44m (\033[1m \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
- printf ("\033[37;44m (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n\n"); // reset color
- }
+ term_func ();
+ for (int i = 0; i < fd_max; i++)
+ if (session[i])
+ close (i);
+ exit (0);
}
// Added by Gabuzomeu
@@ -100,69 +34,45 @@ static void display_title (void)
// (sigaction() is POSIX; signal() is not.) Taken from Stevens' _Advanced
// Programming in the UNIX Environment_.
//
-#ifndef SIGPIPE
-#define SIGPIPE SIGINT
-#endif
-
-#ifndef POSIX
-#define compat_signal(signo, func) signal(signo, func)
-#else
-sigfunc *compat_signal (int signo, sigfunc * func)
+typedef void (*sigfunc)(int);
+sigfunc compat_signal (int signo, sigfunc func)
{
struct sigaction sact, oact;
sact.sa_handler = func;
sigemptyset (&sact.sa_mask);
sact.sa_flags = 0;
-#ifdef SA_INTERRUPT
- sact.sa_flags |= SA_INTERRUPT; /* SunOS */
-#endif
if (sigaction (signo, &sact, &oact) < 0)
- return (SIG_ERR);
+ return SIG_ERR;
- return (oact.sa_handler);
+ return oact.sa_handler;
}
-#endif
-/*======================================
- * CORE : MAINROUTINE
- *--------------------------------------
- */
-
-int runflag = 1;
+bool runflag = true;
int main (int argc, char **argv)
{
- int next;
-
- mt_seed (time (NULL) ^ getpid () ^ getppid ());
+ /// Note that getpid() and getppid() may be very close
+ mt_seed (time (NULL) ^ (getpid () << 16) ^ (getppid () << 8));
- Net_Init ();
do_socket ();
compat_signal (SIGPIPE, SIG_IGN);
compat_signal (SIGTERM, sig_proc);
compat_signal (SIGINT, sig_proc);
- compat_signal (SIGCHLD, sig_proc);
+ compat_signal (SIGCHLD, chld_proc);
// Signal to create coredumps by system when necessary (crash)
compat_signal (SIGSEGV, SIG_DFL);
-#ifndef LCCWIN32
compat_signal (SIGBUS, SIG_DFL);
compat_signal (SIGTRAP, SIG_DFL);
-#endif
compat_signal (SIGILL, SIG_DFL);
- // [fate] detect interactive session
- eathena_interactive_session = isatty (0);
- display_title ();
do_init (argc, argv);
while (runflag)
{
- next = do_timer (gettick_nocache ());
- do_sendrecv (next);
+ do_sendrecv (do_timer (gettick_nocache ()));
do_parsepacket ();
}
- return 0;
}
diff --git a/src/common/core.h b/src/common/core.h
index 90d8303..6722ca2 100644
--- a/src/common/core.h
+++ b/src/common/core.h
@@ -1,12 +1,19 @@
-// original : core.h 2003/03/14 11:55:25 Rev 1.4
+#ifndef CORE_H
+#define CORE_H
+#include <stdbool.h>
+/// core.c contains a server-independent main() function
+/// and then runs a do_sendrecv loop
-#ifndef _CORE_H_
-#define _CORE_H_
+/// When this is cleared, the server exits gracefully
+/// only used by map server's GM command: @mapexit
+extern bool runflag;
-extern int runflag;
+/// This is an external function defined by each server
+/// This function must register stuff for the parse loop
+extern int do_init (int, char **);
-int do_init (int, char **);
+/// Cleanup function called whenever a signal kills us
+/// NOT currently called when exit() is called
+extern void term_func (void);
-void set_termfunc (void (*termfunc) (void));
-
-#endif // _CORE_H_
+#endif // CORE_H
diff --git a/src/common/db.c b/src/common/db.c
index 07b08c8..cee17df 100644
--- a/src/common/db.c
+++ b/src/common/db.c
@@ -1,125 +1,93 @@
-// $Id: db.c,v 1.2 2004/09/23 14:43:06 MouseJstr Exp $
-// #define MALLOC_DBN
+#include "db.h"
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "db.h"
-#include "utils.h"
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
+#include "utils.h"
#define ROOT_SIZE 4096
-#ifdef MALLOC_DBN
-static struct dbn *dbn_root[512], *dbn_free;
-static int dbn_root_rest = 0, dbn_root_num = 0;
-
-static void *malloc_dbn (void)
-{
- struct dbn *ret;
-
- if (dbn_free == NULL)
- {
- if (dbn_root_rest <= 0)
- {
- CREATE (dbn_root[dbn_root_num], struct dbn, ROOT_SIZE);
-
- dbn_root_rest = ROOT_SIZE;
- dbn_root_num++;
- }
- return &(dbn_root[dbn_root_num - 1][--dbn_root_rest]);
- }
- ret = dbn_free;
- dbn_free = dbn_free->parent;
- return ret;
-}
-
-static void free_dbn (struct dbn *add_dbn)
-{
- add_dbn->parent = dbn_free;
- dbn_free = add_dbn;
-}
-#endif
-static int strdb_cmp (struct dbt *table, void *a, void *b)
+static int strdb_cmp (struct dbt *table, const char *a, const char* b)
{
if (table->maxlen)
return strncmp (a, b, table->maxlen);
return strcmp (a, b);
}
-static unsigned int strdb_hash (struct dbt *table, void *a)
+static hash_t strdb_hash (struct dbt *table, const char *a)
{
- int i;
- unsigned int h;
- unsigned char *p = a;
-
- i = table->maxlen;
+ size_t i = table->maxlen;
if (i == 0)
- i = 0x7fffffff;
- for (h = 0; *p && --i >= 0;)
+ i = (size_t)-1;
+ hash_t h = 0;
+ const unsigned char *p = (const unsigned char*)a;
+ while (*p && i--)
{
h = (h * 33 + *p++) ^ (h >> 24);
}
return h;
}
-struct dbt *strdb_init (int maxlen)
+struct dbt *strdb_init (size_t maxlen)
{
- int i;
struct dbt *table;
-
CREATE (table, struct dbt, 1);
-
- table->cmp = strdb_cmp;
- table->hash = strdb_hash;
+ table->type = DB_STRING;
table->maxlen = maxlen;
- for (i = 0; i < HASH_SIZE; i++)
- table->ht[i] = NULL;
return table;
}
-static int numdb_cmp (struct dbt *table, void *a, void *b)
+static int numdb_cmp (numdb_key_t a, numdb_key_t b)
{
- int ia, ib;
-
- ia = (int) a;
- ib = (int) b;
-
- if ((ia ^ ib) & 0x80000000)
- return ia < 0 ? -1 : 1;
-
- return ia - ib;
+ if (a == b)
+ return 0;
+ if (a < b)
+ return -1;
+ return 1;
}
-static unsigned int numdb_hash (struct dbt *table, void *a)
+static hash_t numdb_hash (numdb_key_t a)
{
- return (unsigned int) a;
+ return (hash_t) a;
}
struct dbt *numdb_init (void)
{
- int i;
struct dbt *table;
-
CREATE (table, struct dbt, 1);
-
- table->cmp = numdb_cmp;
- table->hash = numdb_hash;
- table->maxlen = sizeof (int);
- for (i = 0; i < HASH_SIZE; i++)
- table->ht[i] = NULL;
+ table->type = DB_NUMBER;
return table;
}
-void *db_search (struct dbt *table, void *key)
+static int table_cmp (struct dbt *table, db_key_t a, db_key_t b)
+{
+ switch(table->type)
+ {
+ case DB_NUMBER: return numdb_cmp (a.i, b.i);
+ case DB_STRING: return strdb_cmp (table, a.s, b.s);
+ }
+ abort();
+}
+
+static hash_t table_hash (struct dbt *table, db_key_t key)
+{
+ switch(table->type)
+ {
+ case DB_NUMBER: return numdb_hash (key.i);
+ case DB_STRING: return strdb_hash (table, key.s);
+ }
+ abort();
+}
+
+/// Search for a node with the given key
+db_val_t db_search (struct dbt *table, db_key_t key)
{
- struct dbn *p;
+ struct dbn *p = table->ht[table_hash (table, key) % HASH_SIZE];
- for (p = table->ht[table->hash (table, key) % HASH_SIZE]; p;)
+ while (p)
{
- int c = table->cmp (table, key, p->key);
+ int c = table_cmp (table, key, p->key);
if (c == 0)
return p->data;
if (c < 0)
@@ -130,52 +98,12 @@ void *db_search (struct dbt *table, void *key)
return NULL;
}
-void *db_search2 (struct dbt *table, const char *key)
-{
- int i, sp;
- struct dbn *p, *pn, *stack[64];
- int slen = strlen (key);
-
- for (i = 0; i < HASH_SIZE; i++)
- {
- if ((p = table->ht[i]) == NULL)
- continue;
- sp = 0;
- while (1)
- {
- if (strncasecmp (key, p->key, slen) == 0)
- return p->data;
- if ((pn = p->left) != NULL)
- {
- if (p->right)
- {
- stack[sp++] = p->right;
- }
- p = pn;
- }
- else
- {
- if (p->right)
- {
- p = p->right;
- }
- else
- {
- if (sp == 0)
- break;
- p = stack[--sp];
- }
- }
- }
- }
- return 0;
-}
-
+// Tree maintainance methods
static void db_rotate_left (struct dbn *p, struct dbn **root)
{
struct dbn *y = p->right;
p->right = y->left;
- if (y->left != 0)
+ if (y->left)
y->left->parent = p;
y->parent = p->parent;
@@ -193,7 +121,7 @@ static void db_rotate_right (struct dbn *p, struct dbn **root)
{
struct dbn *y = p->left;
p->left = y->right;
- if (y->right != 0)
+ if (y->right)
y->right->parent = p;
y->parent = p->parent;
@@ -211,7 +139,7 @@ static void db_rebalance (struct dbn *p, struct dbn **root)
{
p->color = RED;
while (p != *root && p->parent->color == RED)
- { // rootは必ず黒で親は赤いので親の親は必ず存在する
+ {
if (p->parent == p->parent->parent->left)
{
struct dbn *y = p->parent->parent->right;
@@ -260,23 +188,26 @@ static void db_rebalance (struct dbn *p, struct dbn **root)
(*root)->color = BLACK;
}
+// param z = node to remove
static void db_rebalance_erase (struct dbn *z, struct dbn **root)
{
- struct dbn *y = z, *x = NULL, *x_parent = NULL;
+ struct dbn *y = z;
+ struct dbn *x = NULL;
- if (y->left == NULL)
+ if (!y->left)
x = y->right;
- else if (y->right == NULL)
+ else if (!y->right)
x = y->left;
else
{
y = y->right;
- while (y->left != NULL)
+ while (y->left)
y = y->left;
x = y->right;
}
+ struct dbn *x_parent = NULL;
if (y != z)
- { // 左右が両方埋まっていた時 yをzの位置に持ってきてzを浮かせる
+ {
z->left->parent = y;
y->left = z->left;
if (y != z->right)
@@ -305,7 +236,7 @@ static void db_rebalance_erase (struct dbn *z, struct dbn **root)
y = z;
}
else
- { // どちらか空いていた場合 xをzの位置に持ってきてzを浮かせる
+ {
x_parent = y->parent;
if (x)
x->parent = y->parent;
@@ -316,10 +247,9 @@ static void db_rebalance_erase (struct dbn *z, struct dbn **root)
else
z->parent->right = x;
}
- // ここまで色の移動の除いて通常の2分木と同じ
if (y->color != RED)
- { // 赤が消える分には影響無し
- while (x != *root && (x == NULL || x->color == BLACK))
+ {
+ while (x != *root && (!x || x->color == BLACK))
if (x == x_parent->left)
{
struct dbn *w = x_parent->right;
@@ -330,17 +260,16 @@ static void db_rebalance_erase (struct dbn *z, struct dbn **root)
db_rotate_left (x_parent, root);
w = x_parent->right;
}
- if ((w->left == NULL ||
- w->left->color == BLACK) &&
- (w->right == NULL || w->right->color == BLACK))
+ if ((!w->left || w->left->color == BLACK) &&
+ (!w->right || w->right->color == BLACK))
{
w->color = RED;
x = x_parent;
- x_parent = x_parent->parent;
+ x_parent = x->parent;
}
else
{
- if (w->right == NULL || w->right->color == BLACK)
+ if (!w->right|| w->right->color == BLACK)
{
if (w->left)
w->left->color = BLACK;
@@ -357,7 +286,8 @@ static void db_rebalance_erase (struct dbn *z, struct dbn **root)
}
}
else
- { // same as above, with right <-> left.
+ {
+ // same as above, with right <-> left.
struct dbn *w = x_parent->left;
if (w->color == RED)
{
@@ -366,9 +296,8 @@ static void db_rebalance_erase (struct dbn *z, struct dbn **root)
db_rotate_right (x_parent, root);
w = x_parent->left;
}
- if ((w->right == NULL ||
- w->right->color == BLACK) &&
- (w->left == NULL || w->left->color == BLACK))
+ if ((!w->right || w->right->color == BLACK) &&
+ (!w->left || w->left->color == BLACK))
{
w->color = RED;
x = x_parent;
@@ -376,7 +305,7 @@ static void db_rebalance_erase (struct dbn *z, struct dbn **root)
}
else
{
- if (w->left == NULL || w->left->color == BLACK)
+ if (!w->left || w->left->color == BLACK)
{
if (w->right)
w->right->color = BLACK;
@@ -397,46 +326,33 @@ static void db_rebalance_erase (struct dbn *z, struct dbn **root)
}
}
-struct dbn *db_insert (struct dbt *table, void *key, void *data)
+struct dbn *db_insert (struct dbt *table, db_key_t key, db_val_t data)
{
- struct dbn *p, *priv;
- int c, hash;
-
- hash = table->hash (table, key) % HASH_SIZE;
- for (c = 0, priv = NULL, p = table->ht[hash]; p;)
+ hash_t hash = table_hash (table, key) % HASH_SIZE;
+ int c = 0;
+ struct dbn *prev = NULL;
+ struct dbn *p = table->ht[hash];
+ while (p)
{
- c = table->cmp (table, key, p->key);
+ c = table_cmp (table, key, p->key);
if (c == 0)
- { // replace
+ {
+ // key found in table, replace
+ // Tell the user of the table to free the key and value
if (table->release)
- table->release (p, 3);
+ table->release (p->key, p->data);
p->data = data;
p->key = key;
return p;
}
- priv = p;
+ // prev is always p->parent?
+ prev = p;
if (c < 0)
- {
p = p->left;
- }
else
- {
p = p->right;
- }
}
-#ifdef MALLOC_DBN
- p = malloc_dbn ();
-#else
CREATE (p, struct dbn, 1);
-#endif
- if (p == NULL)
- {
- printf ("out of memory : db_insert\n");
- return NULL;
- }
- p->parent = NULL;
- p->left = NULL;
- p->right = NULL;
p->key = key;
p->data = data;
p->color = RED;
@@ -444,37 +360,28 @@ struct dbn *db_insert (struct dbt *table, void *key, void *data)
{ // hash entry is empty
table->ht[hash] = p;
p->color = BLACK;
+ return p;
}
+ p->parent = prev;
+ if (c < 0)
+ prev->left = p;
else
+ prev->right = p;
+ if (prev->color == RED)
{
- if (c < 0)
- { // left node
- priv->left = p;
- p->parent = priv;
- }
- else
- { // right node
- priv->right = p;
- p->parent = priv;
- }
- if (priv->color == RED)
- { // must rebalance
- db_rebalance (p, &table->ht[hash]);
- }
+ // must rebalance
+ db_rebalance (p, &table->ht[hash]);
}
return p;
}
-void *db_erase (struct dbt *table, void *key)
+db_val_t db_erase (struct dbt *table, db_key_t key)
{
- void *data;
- struct dbn *p;
- int c, hash;
-
- hash = table->hash (table, key) % HASH_SIZE;
- for (c = 0, p = table->ht[hash]; p;)
+ hash_t hash = table_hash (table, key) % HASH_SIZE;
+ struct dbn *p = table->ht[hash];
+ while (p)
{
- c = table->cmp (table, key, p->key);
+ int c = table_cmp (table, key, p->key);
if (c == 0)
break;
if (c < 0)
@@ -484,103 +391,156 @@ void *db_erase (struct dbt *table, void *key)
}
if (!p)
return NULL;
- data = p->data;
+ db_val_t data = p->data;
db_rebalance_erase (p, &table->ht[hash]);
-#ifdef MALLOC_DBN
- free_dbn (p);
-#else
free (p);
-#endif
return data;
}
+#ifdef SMART_WALK_TREE
+static inline void db_walk_tree (bool dealloc, struct dbn* p, db_func_t func, va_list ap)
+{
+ if (!p)
+ return;
+ if (!dealloc && !func)
+ {
+ fprintf(stderr, "DEBUG: Must walk tree to either free or invoke a function.\n");
+ abort();
+ }
+ if (p->parent)
+ {
+ fprintf(stderr, "DEBUG: Root nodes must not have parents\n");
+ abort();
+ }
+ while (true)
+ {
+ // apply_func loop
+ if (func)
+ func (p->key, p->data, ap);
+ if (p->left)
+ {
+ // continue descending
+ p = p->left;
+ continue; //goto apply_func;
+ }
+ if (p->right)
+ {
+ // descending the other side
+ p = p->right;
+ continue; //goto apply_func;
+ }
+ while (true)
+ {
+ // backtrack loop
+ if (!p->parent)
+ {
+ if (dealloc)
+ free (p);
+ // if we have already done both children, there is no more to do
+ return;
+ }
+ if (p->parent->left == p && p->parent->right)
+ {
+ // finished the left tree, now walk the right tree
+ p = p->parent->right;
+ if (dealloc)
+ free (p->parent->left);
+ break; //goto apply_func;
+ }
+ // p->parent->right == p
+ // or p->parent->left == p but p->parent->right == NULL
+ // keep backtracking
+ p = p->parent;
+ if (dealloc)
+ free (p->right?:p->left);
+ } //backtrack loop
+ } // apply_func loop
+}
+#endif // SMART_WALK_TREE
-void db_foreach (struct dbt *table, int (*func) (void *, void *, va_list),
- ...)
+void db_foreach (struct dbt *table, db_func_t func, ...)
{
- int i, sp;
- // red-black treeなので64個stackがあれば2^32個ノードまで大丈夫
- struct dbn *p, *pn, *stack[64];
va_list ap;
-
va_start (ap, func);
- for (i = 0; i < HASH_SIZE; i++)
+
+ for (int i = 0; i < HASH_SIZE; i++)
{
- if ((p = table->ht[i]) == NULL)
+#ifdef SMART_WALK_TREE
+ db_walk_tree (false, table->ht[i], func, ap);
+#else
+ struct dbn *p = table->ht[i];
+ if (!p)
continue;
- sp = 0;
+ struct dbn *stack[64];
+ int sp = 0;
while (1)
{
func (p->key, p->data, ap);
- if ((pn = p->left) != NULL)
+ struct dbn *pn = p->left;
+ if (pn)
{
if (p->right)
- {
stack[sp++] = p->right;
- }
p = pn;
}
- else
+ else // pn == NULL, time to do the right branch
{
if (p->right)
- {
p = p->right;
- }
else
{
if (sp == 0)
break;
p = stack[--sp];
}
- }
- }
- }
+ } // if pn else if !pn
+ } // while true
+#endif // else ! SMART_WALK_TREE
+ } // for i
va_end (ap);
}
-void db_final (struct dbt *table, int (*func) (void *, void *, va_list), ...)
+// This function is suspiciously similar to the previous
+void db_final (struct dbt *table, db_func_t func, ...)
{
- int i, sp;
- struct dbn *p, *pn, *stack[64];
va_list ap;
-
va_start (ap, func);
- for (i = 0; i < HASH_SIZE; i++)
+
+ for (int i = 0; i < HASH_SIZE; i++)
{
- if ((p = table->ht[i]) == NULL)
+#ifdef SMART_WALK_TREE
+ db_walk_tree (true, table->ht[i], func, ap);
+#else
+ struct dbn *p = table->ht[i];
+ if (!p)
continue;
- sp = 0;
+ struct dbn *stack[64];
+ int sp = 0;
while (1)
{
if (func)
func (p->key, p->data, ap);
- if ((pn = p->left) != NULL)
+ struct dbn *pn = p->left;
+ if (pn)
{
if (p->right)
- {
stack[sp++] = p->right;
- }
}
- else
+ else // pn == NULL, check the right
{
if (p->right)
- {
pn = p->right;
- }
else
{
if (sp == 0)
break;
pn = stack[--sp];
}
- }
-#ifdef MALLOC_DBN
- free_dbn (p);
-#else
+ } // if pn else if !pn
free (p);
-#endif
p = pn;
- }
- }
+ } // while true
+#endif // else ! SMART_WALK_TREE
+ } // for i
free (table);
va_end (ap);
}
diff --git a/src/common/db.h b/src/common/db.h
index 8de32d5..7152854 100644
--- a/src/common/db.h
+++ b/src/common/db.h
@@ -1,49 +1,87 @@
-#ifndef _DB_H_
-#define _DB_H_
+// WARNING: there is a system header by this name
+#ifndef DB_H
+#define DB_H
+# include "sanity.h"
-#include <stdarg.h>
+# include <stdarg.h>
-#define HASH_SIZE (256+27)
+/// Number of tree roots
+// Somewhat arbitrary - larger wastes more space but is faster for large trees
+// num % HASH_SIZE minimize collisions even for similar num
+# define HASH_SIZE (256+27)
-#define RED 0
-#define BLACK 1
+typedef enum dbn_color
+{
+ RED,
+ BLACK
+} dbn_color;
+
+typedef intptr_t numdb_key_t;
+typedef union db_key_t
+{
+ char *ms __attribute__((deprecated));
+ const char* s;
+ numdb_key_t i;
+} db_key_t;
+typedef void* db_val_t;
+typedef uint32_t hash_t;
+typedef void (*db_func_t)(db_key_t, db_val_t, va_list);
+/// DataBase Node
struct dbn
{
struct dbn *parent, *left, *right;
- int color;
- void *key;
- void *data;
+ dbn_color color;
+ db_key_t key;
+ db_val_t data;
};
+typedef enum dbt_type
+{
+ DB_NUMBER,
+ DB_STRING,
+} dbt_type;
+
+/// DataBase Table
struct dbt
{
- int (*cmp) (struct dbt *, void *, void *);
- unsigned int (*hash) (struct dbt *, void *);
- // which 1 - key, 2 - data, 3 - both
- void (*release) (struct dbn *, int which);
- int maxlen;
+ dbt_type type;
+ /// Note, before replacement, key/values to be replaced
+ // TODO refactor to decrease/eliminate the uses of this?
+ void (*release) (db_key_t, db_val_t) __attribute__((deprecated));
+ /// Maximum length of a string key - TODO refactor to ensure all strings are NUL-terminated
+ size_t maxlen __attribute__((deprecated));
+ /// The root trees
struct dbn *ht[HASH_SIZE];
};
-#define strdb_search(t,k) db_search((t),(void*)(k))
-#define strdb_insert(t,k,d) db_insert((t),(void*)(k),(void*)(d))
-#define strdb_erase(t,k) db_erase ((t),(void*)(k))
-#define strdb_foreach db_foreach
-#define strdb_final db_final
-#define numdb_search(t,k) db_search((t),(void*)(k))
-#define numdb_insert(t,k,d) db_insert((t),(void*)(k),(void*)(d))
-#define numdb_erase(t,k) db_erase ((t),(void*)(k))
-#define numdb_foreach db_foreach
-#define numdb_final db_final
-
-struct dbt *strdb_init (int maxlen);
+# define strdb_search(t,k) db_search((t),(db_key_t)(k))
+# define strdb_insert(t,k,d) db_insert((t),(db_key_t)(k),(db_val_t)(d))
+# define strdb_erase(t,k) db_erase ((t),(db_key_t)(k))
+# define strdb_foreach db_foreach
+# define strdb_final db_final
+# define numdb_search(t,k) db_search((t),(db_key_t)(k))
+# define numdb_insert(t,k,d) db_insert((t),(db_key_t)(k),(db_val_t)(d))
+# define numdb_erase(t,k) db_erase ((t),(db_key_t)(k))
+# define numdb_foreach db_foreach
+# define numdb_final db_final
+
+/// Create a map from char* to void*, with strings possibly not null-terminated
+struct dbt *strdb_init (size_t maxlen);
+/// Create a map from int to void*
struct dbt *numdb_init (void);
-void *db_search (struct dbt *table, void *key);
-void *db_search2 (struct dbt *table, const char *key); // [MouseJstr]
-struct dbn *db_insert (struct dbt *table, void *key, void *data);
-void *db_erase (struct dbt *table, void *key);
-void db_foreach (struct dbt *, int (*)(void *, void *, va_list), ...);
-void db_final (struct dbt *, int (*)(void *, void *, va_list), ...);
+/// Return the value corresponding to the key, or NULL if not found
+db_val_t db_search (struct dbt *table, db_key_t key);
+/// Add or replace table[key] = data
+// if it was already there, call release
+struct dbn *db_insert (struct dbt *table, db_key_t key, db_val_t data);
+/// Remove a key from the table, returning the data
+db_val_t db_erase (struct dbt *table, db_key_t key);
+
+/// Execute a function for every element, in unspecified order
+void db_foreach (struct dbt *, db_func_t, ...);
+// opposite of init? Calls release for every element and frees memory
+// This probably isn't really needed: we don't have to free memory while exiting
+void db_final (struct dbt *, db_func_t, ...) __attribute__((deprecated));
#endif
diff --git a/src/common/grfio.c b/src/common/grfio.c
index b460dc6..5e03b7c 100644
--- a/src/common/grfio.c
+++ b/src/common/grfio.c
@@ -1,1159 +1,212 @@
-/*********************************************************************
- *
- * Ragnarok Online Emulator : grfio.c -- grf file I/O Module
- *--------------------------------------------------------------------
- * special need library : zlib
- *********************************************************************
- * $Id: grfio.c,v 1.2 2004/09/29 17:31:49 kalaspuff Exp $
- *
- * 2002/12/18... the original edition
- * 2003/01/23 ... Code correction
- * 2003/02/01 ... An addition and decryption processing are improved for LocalFile and two or more GRF(s) check processing.
- * 2003/02/02 ... Even if there is no grf it does not stop -- as -- correction
- * 2003/02/02... grf reading specification can be added later -- as -- correction (grfio_add function addition)
- * 2003/02 / 03... at the time of grfio_resourcecheck processing the entry addition processing method -- correction
- * 2003/02/05... change of the processing in grfio_init
- * 2003/02/23... a local file check -- GRFIO_LOCAL -- switch (Defoe -- Function Off)
- * 2003/10/21 ... The data of alpha client was read.
- * 2003/11/10 ... Ready new grf format.
- * 2003/11/11 ... version check fix & bug fix
- */
-
+// Reads .gat files by name-mapping .wlk files
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <ctype.h>
#include <sys/stat.h>
-#include <zlib.h>
-
#include "utils.h"
#include "grfio.h"
#include "mmo.h"
#include "socket.h"
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
-typedef unsigned char BYTE;
-typedef unsigned short WORD;
-typedef unsigned long DWORD;
-
-static char data_file[1024] = ""; // "data.grf";
-static char sdata_file[1024] = ""; // "sdata.grf";
-static char adata_file[1024] = ""; // "adata.grf";
-static char data_dir[1024] = ""; // "../";
-
-// accessor to data_file,adata_file,sdata_file
-char *grfio_setdatafile (const char *str)
-{
- strcpy (data_file, str);
- return data_file;
-}
-
-char *grfio_setadatafile (const char *str)
-{
- strcpy (adata_file, str);
- return adata_file;
-}
-
-char *grfio_setsdatafile (const char *str)
-{
- strcpy (sdata_file, str);
- return sdata_file;
-}
-
//----------------------------
// file entry table struct
//----------------------------
typedef struct
{
- int srclen; // compressed size
- int srclen_aligned; //
- int declen; // original size
- int srcpos;
- short next;
- char cycle;
- char type;
- char fn[128 - 4 * 5]; // file name
- char gentry; // read grf file select
+ size_t declen;
+ int16_t next; // next index into the filelist[] array, or -1
+ char fn[128 - 4 - 2]; // file name
} FILELIST;
-//gentry ... 0 : It acquires from a local file.
-// It acquires from the resource file of 1>=:gentry_table[gentry-1].
-// 1<=: Check a local file.
-// If it is, after re-setting to 0, it acquires from a local file.
-// If there is nothing, mark reversal will be carried out, and it will re-set, and will acquire from a resource file as well as 1>=.
-//Since char defines *FILELIST.gentry, the maximum which can be added by grfio_add becomes by 127 pieces.
+#define FILELIST_LIMIT 32768 // limit to number of filelists - if you increase this, change all shorts to int
+#define FILELIST_ADDS 1024 // amount to increment when reallocing
-#define GENTRY_LIMIT 127
-#define FILELIST_LIMIT 32768 // temporary maximum, and a theory top maximum are 2G.
+static FILELIST *filelist = NULL;
+/// Number of entries used
+static uint16_t filelist_entrys = 0;
+/// Number of FILELIST entries actually allocated
+static uint16_t filelist_maxentry = 0;
-static FILELIST *filelist;
-static int filelist_entrys;
-static int filelist_maxentry;
+/// First index of the given hash, into the filelist[] array
+static int16_t filelist_hash[256] = {[0 ... 255] = -1};
-static char **gentry_table;
-static int gentry_entrys;
-static int gentry_maxentry;
-
-//----------------------------
-// file list hash table
-//----------------------------
-static int filelist_hash[256];
-
-//----------------------------
-// grf decode data table
-//----------------------------
-static unsigned char BitMaskTable[8] = {
- 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
-};
-
-static char BitSwapTable1[64] = {
- 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
- 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
- 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
- 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7
-};
-
-static char BitSwapTable2[64] = {
- 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,
- 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,
- 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,
- 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25
-};
-
-static char BitSwapTable3[32] = {
- 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
- 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25
-};
-
-static unsigned char NibbleData[4][64] = {
- {
- 0xef, 0x03, 0x41, 0xfd, 0xd8, 0x74, 0x1e, 0x47, 0x26, 0xef, 0xfb, 0x22,
- 0xb3, 0xd8, 0x84, 0x1e,
- 0x39, 0xac, 0xa7, 0x60, 0x62, 0xc1, 0xcd, 0xba, 0x5c, 0x96, 0x90, 0x59,
- 0x05, 0x3b, 0x7a, 0x85,
- 0x40, 0xfd, 0x1e, 0xc8, 0xe7, 0x8a, 0x8b, 0x21, 0xda, 0x43, 0x64, 0x9f,
- 0x2d, 0x14, 0xb1, 0x72,
- 0xf5, 0x5b, 0xc8, 0xb6, 0x9c, 0x37, 0x76, 0xec, 0x39, 0xa0, 0xa3, 0x05,
- 0x52, 0x6e, 0x0f, 0xd9,
- }, {
- 0xa7, 0xdd, 0x0d, 0x78, 0x9e, 0x0b, 0xe3, 0x95, 0x60, 0x36, 0x36,
- 0x4f, 0xf9, 0x60, 0x5a, 0xa3,
- 0x11, 0x24, 0xd2, 0x87, 0xc8, 0x52, 0x75, 0xec, 0xbb, 0xc1, 0x4c,
- 0xba, 0x24, 0xfe, 0x8f, 0x19,
- 0xda, 0x13, 0x66, 0xaf, 0x49, 0xd0, 0x90, 0x06, 0x8c, 0x6a, 0xfb,
- 0x91, 0x37, 0x8d, 0x0d, 0x78,
- 0xbf, 0x49, 0x11, 0xf4, 0x23, 0xe5, 0xce, 0x3b, 0x55, 0xbc, 0xa2,
- 0x57, 0xe8, 0x22, 0x74, 0xce,
- }, {
- 0x2c, 0xea, 0xc1, 0xbf, 0x4a, 0x24, 0x1f, 0xc2, 0x79, 0x47, 0xa2,
- 0x7c, 0xb6, 0xd9, 0x68, 0x15,
- 0x80, 0x56, 0x5d, 0x01, 0x33, 0xfd, 0xf4, 0xae, 0xde, 0x30, 0x07,
- 0x9b, 0xe5, 0x83, 0x9b, 0x68,
- 0x49, 0xb4, 0x2e, 0x83, 0x1f, 0xc2, 0xb5, 0x7c, 0xa2, 0x19, 0xd8,
- 0xe5, 0x7c, 0x2f, 0x83, 0xda,
- 0xf7, 0x6b, 0x90, 0xfe, 0xc4, 0x01, 0x5a, 0x97, 0x61, 0xa6, 0x3d,
- 0x40, 0x0b, 0x58, 0xe6, 0x3d,
- }, {
- 0x4d, 0xd1, 0xb2, 0x0f, 0x28, 0xbd, 0xe4, 0x78, 0xf6, 0x4a,
- 0x0f, 0x93, 0x8b, 0x17, 0xd1, 0xa4,
- 0x3a, 0xec, 0xc9, 0x35, 0x93, 0x56, 0x7e, 0xcb, 0x55, 0x20,
- 0xa0, 0xfe, 0x6c, 0x89, 0x17, 0x62,
- 0x17, 0x62, 0x4b, 0xb1, 0xb4, 0xde, 0xd1, 0x87, 0xc9, 0x14,
- 0x3c, 0x4a, 0x7e, 0xa8, 0xe2, 0x7d,
- 0xa0, 0x9f, 0xf6, 0x5c, 0x6a, 0x09, 0x8d, 0xf0, 0x0f, 0xe3,
- 0x53, 0x25, 0x95, 0x36, 0x28, 0xcb,
- }
-};
-
-/*-----------------
- * long data get
- */
-static unsigned int getlong (unsigned char *p)
+/// Hash a filename
+static uint8_t filehash (const char *fname)
{
- return *p + p[1] * 256 + (p[2] + p[3] * 256) * 65536;
-}
-
-/*==========================================
- * Grf data decode : Subs
- *------------------------------------------
- */
-static void NibbleSwap (BYTE * Src, int len)
-{
- for (; 0 < len; len--, Src++)
- {
- *Src = (*Src >> 4) | (*Src << 4);
- }
-}
-
-static void BitConvert (BYTE * Src, char *BitSwapTable)
-{
- int lop, prm;
- BYTE tmp[8];
- *(DWORD *) tmp = *(DWORD *) (tmp + 4) = 0;
- for (lop = 0; lop != 64; lop++)
- {
- prm = BitSwapTable[lop] - 1;
- if (Src[(prm >> 3) & 7] & BitMaskTable[prm & 7])
- {
- tmp[(lop >> 3) & 7] |= BitMaskTable[lop & 7];
- }
- }
- *(DWORD *) Src = *(DWORD *) tmp;
- *(DWORD *) (Src + 4) = *(DWORD *) (tmp + 4);
-}
-
-static void BitConvert4 (BYTE * Src)
-{
- int lop, prm;
- BYTE tmp[8];
- tmp[0] = ((Src[7] << 5) | (Src[4] >> 3)) & 0x3f; // ..0 vutsr
- tmp[1] = ((Src[4] << 1) | (Src[5] >> 7)) & 0x3f; // ..srqpo n
- tmp[2] = ((Src[4] << 5) | (Src[5] >> 3)) & 0x3f; // ..o nmlkj
- tmp[3] = ((Src[5] << 1) | (Src[6] >> 7)) & 0x3f; // ..kjihg f
- tmp[4] = ((Src[5] << 5) | (Src[6] >> 3)) & 0x3f; // ..g fedcb
- tmp[5] = ((Src[6] << 1) | (Src[7] >> 7)) & 0x3f; // ..cba98 7
- tmp[6] = ((Src[6] << 5) | (Src[7] >> 3)) & 0x3f; // ..8 76543
- tmp[7] = ((Src[7] << 1) | (Src[4] >> 7)) & 0x3f; // ..43210 v
-
- for (lop = 0; lop != 4; lop++)
- {
- tmp[lop] = (NibbleData[lop][tmp[lop * 2]] & 0xf0)
- | (NibbleData[lop][tmp[lop * 2 + 1]] & 0x0f);
- }
-
- *(DWORD *) (tmp + 4) = 0;
- for (lop = 0; lop != 32; lop++)
- {
- prm = BitSwapTable3[lop] - 1;
- if (tmp[prm >> 3] & BitMaskTable[prm & 7])
- {
- tmp[(lop >> 3) + 4] |= BitMaskTable[lop & 7];
- }
- }
- *(DWORD *) Src ^= *(DWORD *) (tmp + 4);
-}
-
-static void decode_des_etc (BYTE * buf, int len, int type, int cycle)
-{
- int lop, cnt = 0;
- if (cycle < 3)
- cycle = 3;
- else if (cycle < 5)
- cycle++;
- else if (cycle < 7)
- cycle += 9;
- else
- cycle += 15;
-
- for (lop = 0; lop * 8 < len; lop++, buf += 8)
- {
- if (lop < 20 || (type == 0 && lop % cycle == 0))
- { // des
- BitConvert (buf, BitSwapTable1);
- BitConvert4 (buf);
- BitConvert (buf, BitSwapTable2);
- }
- else
- {
- if (cnt == 7 && type == 0)
- {
- int a;
- BYTE tmp[8];
- *(DWORD *) tmp = *(DWORD *) buf;
- *(DWORD *) (tmp + 4) = *(DWORD *) (buf + 4);
- cnt = 0;
- buf[0] = tmp[3];
- buf[1] = tmp[4];
- buf[2] = tmp[6];
- buf[3] = tmp[0];
- buf[4] = tmp[1];
- buf[5] = tmp[2];
- buf[6] = tmp[5];
- a = tmp[7];
- if (a == 0x00)
- a = 0x2b;
- else if (a == 0x2b)
- a = 0x00;
- else if (a == 0x01)
- a = 0x68;
- else if (a == 0x68)
- a = 0x01;
- else if (a == 0x48)
- a = 0x77;
- else if (a == 0x77)
- a = 0x48;
- else if (a == 0x60)
- a = 0xff;
- else if (a == 0xff)
- a = 0x60;
- else if (a == 0x6c)
- a = 0x80;
- else if (a == 0x80)
- a = 0x6c;
- else if (a == 0xb9)
- a = 0xc0;
- else if (a == 0xc0)
- a = 0xb9;
- else if (a == 0xeb)
- a = 0xfe;
- else if (a == 0xfe)
- a = 0xeb;
- buf[7] = a;
- }
- cnt++;
- }
- }
-}
-
-/*==========================================
- * Grf data decode sub : zip
- *------------------------------------------
- */
-static int decode_zip (Bytef * dest, uLongf * destLen, const Bytef * source,
- uLong sourceLen)
-{
- z_stream stream;
- int err;
-
- stream.next_in = (Bytef *) source;
- stream.avail_in = (uInt) sourceLen;
- /* Check for source > 64K on 16-bit machine: */
- if ((uLong) stream.avail_in != sourceLen)
- return Z_BUF_ERROR;
-
- stream.next_out = dest;
- stream.avail_out = (uInt) * destLen;
- if ((uLong) stream.avail_out != *destLen)
- return Z_BUF_ERROR;
-
- stream.zalloc = (alloc_func) 0;
- stream.zfree = (free_func) 0;
-
- err = inflateInit (&stream);
- if (err != Z_OK)
- return err;
-
- err = inflate (&stream, Z_FINISH);
- if (err != Z_STREAM_END)
- {
- inflateEnd (&stream);
- return err == Z_OK ? Z_BUF_ERROR : err;
- }
- *destLen = stream.total_out;
-
- err = inflateEnd (&stream);
- return err;
-}
-
-/***********************************************************
- *** File List Sobroutines ***
- ***********************************************************/
-
-/*==========================================
- * File List : Hash make
- *------------------------------------------
- */
-static int filehash (unsigned char *fname)
-{
- unsigned int hash = 0;
+ // Larger than the return type - upper bits are used in the process
+ uint32_t hash = 0;
while (*fname)
{
- hash = ((hash << 1) + (hash >> 7) * 9 + tolower (*fname));
+ hash = (hash << 1) + (hash >> 7) * 9 + (unsigned char)*fname;
fname++;
}
- return hash & 255;
-}
-
-/*==========================================
- * File List : Hash initalize
- *------------------------------------------
- */
-static void hashinit (void)
-{
- int lop;
- for (lop = 0; lop < 256; lop++)
- filelist_hash[lop] = -1;
+ return hash;
}
-/*==========================================
- * File List : File find
- *------------------------------------------
- */
-FILELIST *filelist_find (char *fname)
+/// Find the filelist entry for the given filename, or NULL if it is not
+FILELIST *filelist_find (const char *fname)
{
- int hash;
-
- for (hash = filelist_hash[filehash (fname)]; hash >= 0;
- hash = filelist[hash].next)
+ int16_t index = filelist_hash[filehash (fname)];
+ while (index >= 0)
{
- if (strcasecmp (filelist[hash].fn, fname) == 0)
- break;
+ if (strcmp (filelist[index].fn, fname) == 0)
+ return &filelist[index];
+ index = filelist[index].next;
}
-
- return (hash >= 0) ? &filelist[hash] : NULL;
+ return NULL;
}
-/*==========================================
- * File List : Filelist add
- *------------------------------------------
- */
-#define FILELIST_ADDS 1024 // number increment of file lists `
-
+/// Copy a temporary entry into the hash map
static FILELIST *filelist_add (FILELIST * entry)
{
- int hash;
-
if (filelist_entrys >= FILELIST_LIMIT)
{
- printf ("filelist limit : filelist_add\n");
+ fprintf (stderr, "filelist limit : filelist_add\n");
exit (1);
}
if (filelist_entrys >= filelist_maxentry)
{
- FILELIST *new_filelist = (FILELIST *) realloc ((void *) filelist,
- (filelist_maxentry +
- FILELIST_ADDS) *
- sizeof (FILELIST));
- if (new_filelist != NULL)
- {
- filelist = new_filelist;
- memset (filelist + filelist_maxentry, '\0',
- FILELIST_ADDS * sizeof (FILELIST));
- filelist_maxentry += FILELIST_ADDS;
- }
- else
- {
- printf ("out of memory : filelist_add\n");
- exit (1);
- }
+ RECREATE(filelist, FILELIST, filelist_maxentry + FILELIST_ADDS);
+ memset (filelist + filelist_maxentry, '\0',
+ FILELIST_ADDS * sizeof (FILELIST));
+ filelist_maxentry += FILELIST_ADDS;
}
- memcpy (&filelist[filelist_entrys], entry, sizeof (FILELIST));
-
- hash = filehash (entry->fn);
- filelist[filelist_entrys].next = filelist_hash[hash];
- filelist_hash[hash] = filelist_entrys;
+ uint16_t new_index = filelist_entrys++;
+ uint8_t hash = filehash (entry->fn);
+ entry->next = filelist_hash[hash];
+ filelist_hash[hash] = new_index;
- filelist_entrys++;
+ filelist[new_index] = *entry;
- return &filelist[filelist_entrys - 1];
+ return &filelist[new_index];
}
static FILELIST *filelist_modify (FILELIST * entry)
{
- FILELIST *fentry;
- if ((fentry = filelist_find (entry->fn)) != NULL)
- {
- int tmp = fentry->next;
- memcpy (fentry, entry, sizeof (FILELIST));
- fentry->next = tmp;
- }
- else
- {
- fentry = filelist_add (entry);
- }
- return fentry;
-}
-
-/*==========================================
- * File List : filelist size adjust
- *------------------------------------------
- */
-static void filelist_adjust (void)
-{
- if (filelist != NULL)
+ FILELIST *fentry = filelist_find (entry->fn);
+ if (fentry)
{
- if (filelist_maxentry > filelist_entrys)
- {
- FILELIST *new_filelist = (FILELIST *) realloc ((void *) filelist,
- filelist_entrys *
- sizeof (FILELIST));
- if (new_filelist != NULL)
- {
- filelist = new_filelist;
- filelist_maxentry = filelist_entrys;
- }
- else
- {
- printf ("out of memory : filelist\n");
- exit (1);
- }
- }
+ entry->next = fentry->next;
+ *fentry = *entry;
+ return fentry;
}
+ return filelist_add (entry);
}
-/***********************************************************
- *** Grfio Sobroutines ***
- ***********************************************************/
-/*==========================================
- * Grfio : Resnametable replace
- *------------------------------------------
- */
-char *grfio_resnametable (char *fname, char *lfname)
+/// Change fname data/*.gat to lfname data/*.wlk
+// TODO even if the file exists, don't keep reopening it every time one loads
+void grfio_resnametable (const char *fname, char *lfname)
{
- FILE *fp;
- char *p;
- char w1[256], w2[256], restable[256], line[512];
-
- sprintf (restable, "%sdata\\resnametable.txt", data_dir);
+ char restable[] = "data/resnametable.txt";
- for (p = &restable[0]; *p != 0; p++)
- if (*p == '\\')
- *p = '/';
-
- fp = fopen_ (restable, "rb");
+ FILE *fp = fopen_ (restable, "rb");
if (fp == NULL)
{
- printf ("%s not found\n", restable);
- exit (1); // 1:not found error
+ fprintf(stderr, "No resnametable, can't look for %s\n", fname);
+ strcpy(lfname, fname);
+ char* ext = lfname + strlen(lfname) - 4;
+ if (!strcmp(ext, ".gat"))
+ strcpy(ext, ".wlk");
+ return;
}
- while (fgets (line, 508, fp))
+ char line[512];
+ while (fgets (line, sizeof (line), fp))
{
- if ((sscanf (line, "%[^#]#%[^#]#", w1, w2) == 2)
- && (sscanf (fname, "%*5s%s", lfname) == 1)
- && (!strcmpi (w1, lfname)))
+ char w1[256], w2[256];
+ if (
+ // line is of the form foo.gat#foo.wlk#
+ (sscanf (line, "%[^#]#%[^#]#", w1, w2) == 2)
+ // strip data/ from foo.gat before comparing
+ && (!strcmp (w1, fname + 5)))
{
- sprintf (lfname, "data\\%s", w2);
+ strcpy (lfname, "data/");
+ strcpy (lfname + 5, w2);
fclose_ (fp);
- return lfname;
+ return;
}
}
+ fprintf(stderr, "Unable to find resource: %s\n", fname);
fclose_ (fp);
- return fname;
-
-}
-
-/*==========================================
- * Grfio : Resource file size get
- *------------------------------------------
- */
-int grfio_size (char *fname)
-{
- FILELIST *entry;
-
- entry = filelist_find (fname);
-
- if (entry == NULL || entry->gentry < 0)
- { // LocalFileCheck
- char lfname[256], rname[256], *p;
- FILELIST lentry;
- struct stat st;
- //printf("%s\t",fname);
- sprintf (rname, "%s", grfio_resnametable (fname, lfname));
- //printf("%s\n",rname);
- sprintf (lfname, "%s%s", data_dir, rname);
- //printf("%s\n",lfname);
-
- for (p = &lfname[0]; *p != 0; p++)
- if (*p == '\\')
- *p = '/'; // * At the time of Unix
-
- if (stat (lfname, &st) == 0)
- {
- strncpy (lentry.fn, fname, sizeof (lentry.fn) - 1);
- lentry.declen = st.st_size;
- lentry.gentry = 0; // 0:LocalFile
- entry = filelist_modify (&lentry);
- }
- else if (entry == NULL)
- {
- printf ("%s not found\n", fname);
- //exit(1);
- return -1;
- }
- }
- return entry->declen;
+ strcpy(lfname, fname);
+ char* ext = lfname + strlen(lfname) - 4;
+ if (!strcmp(ext, ".gat"))
+ strcpy(ext, ".wlk");
+ return;
}
-/*==========================================
- * Grfio : Resource file read & size get
- *------------------------------------------
- */
-void *grfio_reads (char *fname, int *size)
+/// Size of resource
+size_t grfio_size (const char *fname)
{
- FILE *in = NULL;
- unsigned char *buf = NULL, *buf2 = NULL;
- char *gfname;
- FILELIST *entry;
+ FILELIST *entry = filelist_find (fname);
+ if (entry)
+ return entry->declen;
- entry = filelist_find (fname);
+ char lfname[256];
+ FILELIST lentry;
+ struct stat st;
- if (entry == NULL || entry->gentry <= 0)
- { // LocalFileCheck
- char lfname[256], rname[256], *p;
- FILELIST lentry;
+ grfio_resnametable (fname, lfname);
- strncpy (lfname, fname, 255);
- sprintf (rname, "%s", grfio_resnametable (fname, lfname));
- sprintf (lfname, "%s%s", data_dir, rname);
- //printf("%s\n",lfname);
-
- for (p = &lfname[0]; *p != 0; p++)
- if (*p == '\\')
- *p = '/'; // * At the time of Unix
-
- in = fopen_ (lfname, "rb");
- if (in != NULL)
- {
- if (entry != NULL && entry->gentry == 0)
- {
- lentry.declen = entry->declen;
- }
- else
- {
- fseek (in, 0, 2); // SEEK_END
- lentry.declen = ftell (in);
- }
- fseek (in, 0, 0); // SEEK_SET
- buf2 = calloc (lentry.declen + 1024, 1);
- if (buf2 == NULL)
- {
- printf ("file read memory allocate error : declen\n");
- goto errret;
- }
- if (!fread (buf2, 1, lentry.declen, in))
- goto errret;
- fclose_ (in);
- in = NULL;
- strncpy (lentry.fn, fname, sizeof (lentry.fn) - 1);
- lentry.gentry = 0; // 0:LocalFile
- entry = filelist_modify (&lentry);
- }
- else
- {
- if (entry != NULL && entry->gentry < 0)
- {
- entry->gentry = -entry->gentry; // local file checked
- }
- else
- {
- printf ("%s not found\n", fname);
- //goto errret;
- free (buf2);
- return NULL;
- }
- }
- }
- if (entry != NULL && entry->gentry > 0)
- { // Archive[GRF] File Read
- buf = calloc (entry->srclen_aligned + 1024, 1);
- if (buf == NULL)
- {
- printf ("file read memory allocate error : srclen_aligned\n");
- goto errret;
- }
- gfname = gentry_table[entry->gentry - 1];
- in = fopen_ (gfname, "rb");
- if (in == NULL)
- {
- printf ("%s not found\n", gfname);
- //goto errret;
- free (buf);
- return NULL;
- }
- fseek (in, entry->srcpos, 0);
- if (!fread (buf, 1, entry->srclen_aligned, in))
- goto errret;
- fclose_ (in);
- buf2 = calloc (entry->declen + 1024, 1);
- if (buf2 == NULL)
- {
- printf ("file decode memory allocate error\n");
- goto errret;
- }
- if (entry->type == 1 || entry->type == 3 || entry->type == 5)
- {
- uLongf len;
- if (entry->cycle >= 0)
- {
- decode_des_etc (buf, entry->srclen_aligned, entry->cycle == 0,
- entry->cycle);
- }
- len = entry->declen;
- decode_zip (buf2, &len, buf, entry->srclen);
- if (len != entry->declen)
- {
- printf ("decode_zip size miss match err: %d != %d\n",
- (int) len, entry->declen);
- goto errret;
- }
- }
- else
- {
- memcpy (buf2, buf, entry->declen);
- }
- free (buf);
- }
- if (size != NULL && entry != NULL)
- *size = entry->declen;
- return buf2;
- errret:
- if (buf != NULL)
- free (buf);
- if (buf2 != NULL)
- free (buf2);
- if (in != NULL)
- fclose_ (in);
- exit (1); //return NULL;
-}
-
-/*==========================================
- * Grfio : Resource file read
- *------------------------------------------
- */
-void *grfio_read (char *fname)
-{
- return grfio_reads (fname, NULL);
-}
-
-/*==========================================
- * Resource filename decode
- *------------------------------------------
- */
-static unsigned char *decode_filename (unsigned char *buf, int len)
-{
- int lop;
- for (lop = 0; lop < len; lop += 8)
- {
- NibbleSwap (&buf[lop], 8);
- BitConvert (&buf[lop], BitSwapTable1);
- BitConvert4 (&buf[lop]);
- BitConvert (&buf[lop], BitSwapTable2);
- }
- return buf;
-}
-
-/*==========================================
- * Grfio : Entry table read
- *------------------------------------------
- */
-static int grfio_entryread (char *gfname, int gentry)
-{
- FILE *fp;
- int grf_size, list_size;
- unsigned char grf_header[0x2e];
- int lop, entry, entrys, ofs, grf_version;
- unsigned char *fname;
- unsigned char *grf_filelist;
+ for (char *p = lfname; *p; p++)
+ if (*p == '\\')
+ *p = '/';
- fp = fopen_ (gfname, "rb");
- if (fp == NULL)
+ if (stat (lfname, &st) == 0)
{
- printf ("%s not found\n", gfname);
- return 1; // 1:not found error
- }
-
- fseek (fp, 0, 2); // SEEK_END
- grf_size = ftell (fp);
- fseek (fp, 0, 0); // SEEK_SET
- if (!fread (grf_header, 1, 0x2e, fp))
- return 2;
-
- if (strcmp (grf_header, "Master of Magic")
- || fseek (fp, getlong (grf_header + 0x1e), 1))
- { // SEEK_CUR
- fclose_ (fp);
- printf ("%s read error\n", gfname);
- return 2; // 2:file format error
- }
-
- grf_version = getlong (grf_header + 0x2a) >> 8;
-
- if (grf_version == 0x01)
- { //****** Grf version 01xx ******
- list_size = grf_size - ftell (fp);
- grf_filelist = calloc (list_size, 1);
- if (grf_filelist == NULL)
- {
- fclose_ (fp);
- printf ("out of memory : grf_filelist\n");
- return 3; // 3:memory alloc error
- }
- if (!fread (grf_filelist, 1, list_size, fp))
- return 2;
- fclose_ (fp);
-
- entrys =
- getlong (grf_header + 0x26) - getlong (grf_header + 0x22) - 7;
-
- // Get an entry
- for (entry = 0, ofs = 0; entry < entrys; entry++)
- {
- int ofs2, srclen, srccount, type;
- char *period_ptr;
- FILELIST aentry;
-
- ofs2 = ofs + getlong (grf_filelist + ofs) + 4;
- type = grf_filelist[ofs2 + 12];
- if (type != 0)
- { // Directory Index ... skip
- fname =
- decode_filename (grf_filelist + ofs + 6,
- grf_filelist[ofs] - 6);
- if (strlen (fname) > sizeof (aentry.fn) - 1)
- {
- printf ("file name too long : %s\n", fname);
- free (grf_filelist);
- exit (1);
- }
- srclen = 0;
- if ((period_ptr = rindex (fname, '.')) != NULL)
- {
- for (lop = 0; lop < 4; lop++)
- {
- if (strcasecmp
- (period_ptr,
- ".gnd\0.gat\0.act\0.str" + lop * 5) == 0)
- break;
- }
- srclen =
- getlong (grf_filelist + ofs2) -
- getlong (grf_filelist + ofs2 + 8) - 715;
- if (lop == 4)
- {
- for (lop = 10, srccount = 1; srclen >= lop;
- lop = lop * 10, srccount++);
- }
- else
- {
- srccount = 0;
- }
- }
- else
- {
- srccount = 0;
- }
-
- aentry.srclen = srclen;
- aentry.srclen_aligned =
- getlong (grf_filelist + ofs2 + 4) - 37579;
- aentry.declen = getlong (grf_filelist + ofs2 + 8);
- aentry.srcpos = getlong (grf_filelist + ofs2 + 13) + 0x2e;
- aentry.cycle = srccount;
- aentry.type = type;
- strncpy (aentry.fn, fname, sizeof (aentry.fn) - 1);
-#ifdef GRFIO_LOCAL
- aentry.gentry = -(gentry + 1); // As Flag for making it a negative number carrying out the first time LocalFileCheck
-#else
- aentry.gentry = gentry + 1; // With no first time LocalFileCheck
-#endif
- filelist_modify (&aentry);
- }
- ofs = ofs2 + 17;
- }
- free (grf_filelist);
-
- }
- else if (grf_version == 0x02)
- { //****** Grf version 02xx ******
- unsigned char eheader[8];
- unsigned char *rBuf;
- uLongf rSize, eSize;
-
- if (!fread (eheader, 1, 8, fp))
- return 4;
-
- rSize = getlong (eheader); // Read Size
- eSize = getlong (eheader + 4); // Extend Size
-
- if (rSize > grf_size - ftell (fp))
- {
- fclose_ (fp);
- printf ("Illegal data format : grf compress entry size\n");
- return 4;
- }
-
- rBuf = calloc (rSize, 1); // Get a Read Size
- if (rBuf == NULL)
- {
- fclose_ (fp);
- printf ("out of memory : grf compress entry table buffer\n");
- return 3;
- }
- grf_filelist = calloc (eSize, 1); // Get a Extend Size
- if (grf_filelist == NULL)
- {
- free (rBuf);
- fclose_ (fp);
- printf ("out of memory : grf extract entry table buffer\n");
- return 3;
- }
-
- if (!fread (rBuf, 1, rSize, fp))
- return 4;
-
- fclose_ (fp);
- decode_zip (grf_filelist, &eSize, rBuf, rSize); // Decode function
- list_size = eSize;
- free (rBuf);
-
- entrys = getlong (grf_header + 0x26) - 7;
-
- // Get an entry
- for (entry = 0, ofs = 0; entry < entrys; entry++)
- {
- int ofs2, srclen, srccount, type;
- FILELIST aentry;
-
- fname = grf_filelist + ofs;
- if (strlen (fname) > sizeof (aentry.fn) - 1)
- {
- printf ("grf : file name too long : %s\n", fname);
- free (grf_filelist);
- exit (1);
- }
- ofs2 = ofs + strlen (grf_filelist + ofs) + 1;
- type = grf_filelist[ofs2 + 12];
- if (type == 1 || type == 3 || type == 5)
- {
- srclen = getlong (grf_filelist + ofs2);
- if (grf_filelist[ofs2 + 12] == 3)
- {
- for (lop = 10, srccount = 1; srclen >= lop;
- lop = lop * 10, srccount++);
- }
- else if (grf_filelist[ofs2 + 12] == 5)
- {
- srccount = 0;
- }
- else
- { // if (grf_filelist[ofs2+12]==1) {
- srccount = -1;
- }
-
- aentry.srclen = srclen;
- aentry.srclen_aligned = getlong (grf_filelist + ofs2 + 4);
- aentry.declen = getlong (grf_filelist + ofs2 + 8);
- aentry.srcpos = getlong (grf_filelist + ofs2 + 13) + 0x2e;
- aentry.cycle = srccount;
- aentry.type = type;
- strncpy (aentry.fn, fname, sizeof (aentry.fn) - 1);
-#ifdef GRFIO_LOCAL
- aentry.gentry = -(gentry + 1); // As Flag for making it a negative number carrying out the first time LocalFileCheck
-#else
- aentry.gentry = gentry + 1; // With no first time LocalFileCheck
-#endif
- filelist_modify (&aentry);
- }
- ofs = ofs2 + 17;
- }
- free (grf_filelist);
-
+ strncpy (lentry.fn, fname, sizeof (lentry.fn) - 1);
+ lentry.declen = st.st_size;
+ entry = filelist_modify (&lentry);
}
else
- { //****** Grf Other version ******
- fclose_ (fp);
- printf ("not support grf versions : %04x\n",
- getlong (grf_header + 0x2a));
- return 4;
- }
-
- filelist_adjust (); // Unnecessary area release of filelist
-
- return 0; // 0:no error
-}
-
-/*==========================================
- * Grfio : Resource file check
- *------------------------------------------
- */
-static void grfio_resourcecheck ()
-{
- int size;
- unsigned char *buf, *ptr;
- char w1[256], w2[256], src[256], dst[256];
- FILELIST *entry;
-
- buf = grfio_reads ("data\\resnametable.txt", &size);
- buf[size] = 0;
-
- for (ptr = buf; ptr - buf < size;)
{
- if (sscanf (ptr, "%[^#]#%[^#]#", w1, w2) == 2)
- {
- if (strstr (w2, "bmp"))
- {
- sprintf (src, "data\\texture\\%s", w1);
- sprintf (dst, "data\\texture\\%s", w2);
- }
- else
- {
- sprintf (src, "data\\%s", w1);
- sprintf (dst, "data\\%s", w2);
- }
- entry = filelist_find (dst);
- if (entry != NULL)
- {
- FILELIST fentry;
- memcpy (&fentry, entry, sizeof (FILELIST));
- strncpy (fentry.fn, src, sizeof (fentry.fn) - 1);
- filelist_modify (&fentry);
- }
- else
- {
- //printf("file not found in data.grf : %s < %s\n",dst,src);
- }
- }
- ptr = strchr (ptr, '\n'); // Next line
- if (!ptr)
- break;
- ptr++;
+ printf ("%s not found\n", fname);
+ return 0;
}
- free (buf);
- filelist_adjust (); // Unnecessary area release of filelist
+ return entry->declen;
}
-/*==========================================
- * Grfio : Resource add
- *------------------------------------------
- */
-#define GENTRY_ADDS 16 // The number increment of gentry_table entries
-
-int grfio_add (char *fname)
+void *grfio_reads (const char *fname, size_t *size)
{
- int len, result;
- char *buf;
-
- if (gentry_entrys >= GENTRY_LIMIT)
- {
- printf ("gentrys limit : grfio_add\n");
- exit (1);
- }
+ char lfname[256];
+ grfio_resnametable (fname, lfname);
- printf ("%s file reading...\n", fname);
+ for (char *p = &lfname[0]; *p != 0; p++)
+ if (*p == '\\')
+ *p = '/'; // * At the time of Unix
- if (gentry_entrys >= gentry_maxentry)
+ FILE *in = fopen_ (lfname, "rb");
+ if (!in)
{
- char **new_gentry = (char **) realloc ((void *) gentry_table,
- (gentry_maxentry +
- GENTRY_ADDS) *
- sizeof (char *));
- if (new_gentry != NULL)
- {
- int lop;
- gentry_table = new_gentry;
- gentry_maxentry += GENTRY_ADDS;
- for (lop = gentry_entrys; lop < gentry_maxentry; lop++)
- gentry_table[lop] = NULL;
- }
- else
- {
- printf ("out of memory : grfio_add\n");
- exit (1);
- }
- }
- len = strlen (fname);
- buf = calloc (len + 1, 1);
- if (buf == NULL)
- {
- printf ("out of memory : gentry\n");
- exit (1);
+ fprintf (stderr, "%s not found\n", fname);
+ return NULL;
}
- strcpy (buf, fname);
- gentry_table[gentry_entrys++] = buf;
-
- result = grfio_entryread (fname, gentry_entrys - 1);
-
- if (result == 0)
+ FILELIST lentry;
+ FILELIST *entry = filelist_find (fname);
+ if (entry)
{
- // Resource check
- grfio_resourcecheck ();
+ lentry.declen = entry->declen;
}
-
- return result;
-}
-
-/*==========================================
- * Grfio : Finalize
- *------------------------------------------
- */
-void grfio_final (void)
-{
- int lop;
-
- if (filelist != NULL)
- free (filelist);
- filelist = NULL;
- filelist_entrys = filelist_maxentry = 0;
-
- if (gentry_table != NULL)
+ else
{
- for (lop = 0; lop < gentry_entrys; lop++)
- {
- if (gentry_table[lop] != NULL)
- {
- free (gentry_table[lop]);
- }
- }
- free (gentry_table);
+ fseek (in, 0, SEEK_END);
+ lentry.declen = ftell (in);
+ fseek (in, 0, SEEK_SET);
+ strncpy (lentry.fn, fname, sizeof (lentry.fn) - 1);
+ entry = filelist_modify (&lentry);
}
- gentry_table = NULL;
- gentry_entrys = gentry_maxentry = 0;
-}
-
-/*==========================================
- * Grfio : Initialize
- *------------------------------------------
- */
-void grfio_init (char *fname)
-{
- FILE *data_conf;
- char line[1024], w1[1024], w2[1024];
- int result = 0, result2 = 0, result3 = 0;
-
- data_conf = fopen_ (fname, "r");
+ uint8_t *buf2;
+ CREATE (buf2, uint8_t, lentry.declen + 1024);
+ if (!fread (buf2, 1, lentry.declen, in))
+ exit(1);
+ fclose_ (in);
+ in = NULL;
- // It will read, if there is grf-files.txt.
- if (data_conf)
- {
- while (fgets (line, 1020, data_conf))
- {
- if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) == 2)
- {
- if (strcmp (w1, "data") == 0)
- strcpy (data_file, w2);
- else if (strcmp (w1, "sdata") == 0)
- strcpy (sdata_file, w2);
- else if (strcmp (w1, "adata") == 0)
- strcpy (adata_file, w2);
- else if (strcmp (w1, "data_dir") == 0)
- strcpy (data_dir, w2);
- }
- }
-
- fclose_ (data_conf);
- printf ("read %s done\n", fname);
- } // end of reading grf-files.txt
-
- hashinit (); // hash table initialization
-
- filelist = NULL;
- filelist_entrys = filelist_maxentry = 0;
- gentry_table = NULL;
- gentry_entrys = gentry_maxentry = 0;
- atexit (grfio_final); // End processing definition
-
- // Entry table reading
-
- if (strcmp (data_file, "") != 0) // If data directive exists in grf-files.txt (i.e. data_file is not equal to "")
- result = grfio_add (data_file); // Primary data file
-
- if (strcmp (sdata_file, "") != 0) // If sdata directive exists in grf-files.txt (i.e. sdata_file is not equal to "")
- result2 = grfio_add (sdata_file); // Sakray data file
-
- if (strcmp (adata_file, "") != 0) // If data directive exists in grf-files.txt (i.e. adata_file is not equal to "")
- result3 = grfio_add (adata_file); // Alpha version data file
-
- if (result != 0 && result2 != 0 && result3 != 0)
- {
- printf ("not grf file readed exit!!\n");
- exit (1); // It ends, if a resource cannot read one.
- }
+ if (size)
+ *size = entry->declen;
+ return buf2;
}
diff --git a/src/common/grfio.h b/src/common/grfio.h
index 5d3f69c..4919a7b 100644
--- a/src/common/grfio.h
+++ b/src/common/grfio.h
@@ -1,16 +1,17 @@
-// $Id: grfio.h,v 1.1.1.1 2004/09/10 17:44:49 MagicalTux Exp $
-#ifndef _GRFIO_H_
-#define _GRFIO_H_
+/// Accessor to the .gat map virtual files
+// Note .gat files are mapped to .wlk files by data/resnametable.txt
+// Note that there currently is a 1-1 correlation between them,
+// but it is possible for a single .wlk to have multiple .gats reference it
+#ifndef GRFIO_H
+#define GRFIO_H
-void grfio_init (char *); // GRFIO Initialize
-int grfio_add (char *); // GRFIO Resource file add
-void *grfio_read (char *); // GRFIO data file read
-void *grfio_reads (char *, int *); // GRFIO data file read & size get
-int grfio_size (char *); // GRFIO data file size get
+/// Load file into memory
+# define grfio_read(resourcename) grfio_reads (resourcename, NULL)
+/// Load file into memory and possibly record length
+// For some reason, this allocates an extra 1024 bytes at the end
+void *grfio_reads (const char *resourcename, size_t *size);
+/// Get size of file
+// This is only called once, and that is to check the existence of a file.
+size_t grfio_size (const char *resourcename) __attribute__((deprecated));
-// Accessor to GRF filenames
-char *grfio_setdatafile (const char *str);
-char *grfio_setadatafile (const char *str);
-char *grfio_setsdatafile (const char *str);
-
-#endif // _GRFIO_H_
+#endif // GRFIO_H
diff --git a/src/common/lock.c b/src/common/lock.c
index bed657f..dd42ef2 100644
--- a/src/common/lock.c
+++ b/src/common/lock.c
@@ -1,45 +1,36 @@
-
#include <unistd.h>
#include <stdio.h>
#include "lock.h"
#include "socket.h"
-// 書き込みファイルの保護処理
-// (書き込みが終わるまで、旧ファイルを保管しておく)
+/// Protected file writing
+/// (Until the file is closed, it keeps the old file)
-// 新しいファイルの書き込み開始
+// Start writing a tmpfile
FILE *lock_fopen (const char *filename, int *info)
{
char newfile[512];
FILE *fp;
int no = getpid ();
- // 安全なファイル名を得る(手抜き)
+ // Get a filename that doesn't already exist
do
{
sprintf (newfile, "%s_%d.tmp", filename, no++);
}
- while ((fp = fopen_ (newfile, "r")) && fclose_ (fp));
+ while ((fp = fopen_ (newfile, "r")) && (fclose_ (fp), 1));
*info = --no;
return fopen_ (newfile, "w");
}
-// 旧ファイルを削除&新ファイルをリネーム
-int lock_fclose (FILE * fp, const char *filename, int *info)
+// Delete the old file and rename the new file
+void lock_fclose (FILE * fp, const char *filename, int *info)
{
- int ret = 0;
char newfile[512];
- if (fp != NULL)
+ if (fp)
{
- ret = fclose_ (fp);
+ fclose_ (fp);
sprintf (newfile, "%s_%d.tmp", filename, *info);
- remove (filename);
- // このタイミングで落ちると最悪。
rename (newfile, filename);
- return ret;
- }
- else
- {
- return 1;
}
}
diff --git a/src/common/lock.h b/src/common/lock.h
index 6175241..2f087fd 100644
--- a/src/common/lock.h
+++ b/src/common/lock.h
@@ -1,7 +1,8 @@
-#ifndef _LOCK_H_
-#define _LOCK_H_
-
+#ifndef LOCK_H
+#define LOCK_H
+/// Locked FILE I/O
+// Changes are made in a separate file until lock_fclose
FILE *lock_fopen (const char *filename, int *info);
-int lock_fclose (FILE * fp, const char *filename, int *info);
+void lock_fclose (FILE * fp, const char *filename, int *info);
-#endif
+#endif // LOCK_H
diff --git a/src/common/malloc.c b/src/common/malloc.c
deleted file mode 100644
index 8d68bee..0000000
--- a/src/common/malloc.c
+++ /dev/null
@@ -1,68 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "malloc.h"
-
-#define SHOW_MEMORY_ERROR(file, line, func, type, msg) \
- fprintf (stderr, "%s:%d: in func %s(): %s() error, %s\n", \
- file, line, func, type, msg)
-
-void *aMalloc_ (size_t size, const char *file, int line, const char *func)
-{
- void *ret = malloc (size);
-
- /* printf ("%s:%d: in func %s(): malloc(%d)\n", file, line, func, size); */
- if (ret == NULL)
- {
- SHOW_MEMORY_ERROR (file, line, func, "malloc", "out of memory");
- exit (EXIT_FAILURE);
- }
-
- return ret;
-}
-
-void *aCalloc_ (size_t num, size_t size, const char *file, int line,
- const char *func)
-{
- void *ret = calloc (num, size);
-
- /* printf ("%s:%d: in func %s(): calloc(%d, %d)\n", file, line, func, num,
- size); */
- if (ret == NULL)
- {
- SHOW_MEMORY_ERROR (file, line, func, "calloc", "out of memory");
- exit (EXIT_FAILURE);
- }
-
- return ret;
-}
-
-void *aRealloc_ (void *p, size_t size, const char *file, int line,
- const char *func)
-{
- void *ret = realloc (p, size);
-
- /* printf ("%s:%d: in func %s(): realloc(%p, %d)\n", file, line, func, p,
- size); */
- if (ret == NULL)
- {
- SHOW_MEMORY_ERROR (file, line, func, "realloc", "out of memory");
- exit (EXIT_FAILURE);
- }
-
- return ret;
-}
-
-char *aStrdup_ (const char *p, const char *file, int line, const char *func)
-{
- char *ret = strdup (p);
-
- /* printf ("%s:%d: in func %s(): strdup(%p)\n", file, line, func, p); */
- if (ret == NULL)
- {
- SHOW_MEMORY_ERROR (file, line, func, "strdup", "out of memory");
- exit (EXIT_FAILURE);
- }
-
- return ret;
-}
diff --git a/src/common/malloc.h b/src/common/malloc.h
deleted file mode 100644
index 5fc8cbe..0000000
--- a/src/common/malloc.h
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef _MALLOC_H_
-#define _MALLOC_H_
-
-#if __STDC_VERSION__ < 199901L
-# if __GNUC__ >= 2
-# define __func__ __FUNCTION__
-# else
-# define __func__ ""
-# endif
-#endif
-
-#define ALC_MARK __FILE__, __LINE__, __func__
-
-void *aMalloc_ (size_t, const char *, int, const char *);
-void *aCalloc_ (size_t, size_t, const char *, int, const char *);
-void *aRealloc_ (void *, size_t, const char *, int, const char *);
-char *aStrdup_ (const char *, const char *, int, const char *);
-
-#define aMalloc(n) aMalloc_(n,ALC_MARK)
-#define aMallocA(n) aMalloc_(n,ALC_MARK)
-#define aCalloc(m,n) aCalloc_(m,n,ALC_MARK)
-#define aCallocA(m,n) aCalloc_(m,n,ALC_MARK)
-#define aRealloc(p,n) aRealloc_(p,n,ALC_MARK)
-#define aStrdup(p) aStrdup_(p,ALC_MARK)
-#define aFree(p) aFree_(p,ALC_MARK)
-
-#endif
diff --git a/src/common/md5calc.c b/src/common/md5calc.c
index 6069070..d5ebcf8 100644
--- a/src/common/md5calc.c
+++ b/src/common/md5calc.c
@@ -1,335 +1,310 @@
-// $Id: md5calc.c,v 1.1.1.1 2004/09/10 17:26:54 MagicalTux Exp $
-/***********************************************************
- * md5 calculation algorithm
- *
- * The source code referred to the following URL.
- * http://www.geocities.co.jp/SiliconValley-Oakland/8878/lab17/lab17.html
- *
- ***********************************************************/
-
#include "md5calc.h"
#include <string.h>
-#include <stdio.h>
#include "mt_rand.h"
-#ifndef UINT_MAX
-#define UINT_MAX 4294967295U
-#endif
-
-// Global variable
-static unsigned int *pX;
-
-// Stirng Table
-static const unsigned int T[] = {
+// auxilary data
+/*
+sin() constant table
+# Reformatted output of:
+echo 'scale=40; obase=16; for (i=1;i<=64;i++) print 2^32 * sin(i), "\n"' |
+bc | sed 's/^-//;s/^/0x/;s/\..*$/,/'
+*/
+static const uint32_t T[64] =
+{
+ // used by round 1
0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, //0
0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, //4
0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, //8
0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, //12
+ // used by round 2
0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, //16
- 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, //20
+ 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, //20
0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, //24
0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, //28
+ // used by round 3
0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, //32
0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, //36
- 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, //40
+ 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, //40
0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, //44
+ // used by round 4
0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, //48
0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, //52
0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, //56
- 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 //60
+ 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391, //60
};
-// ROTATE_LEFT The left is made to rotate x [ n-bit ]. This is diverted as it is from RFC.
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+// auxilary functions
+// note - the RFC defines these by non-CS conventions: or=v, and=(empty)
+static inline uint32_t rotate_left(uint32_t val, unsigned shift)
+{
+ return val << shift | val >> (32-shift);
+}
-// The function used for other calculation
-static unsigned int F (unsigned int X, unsigned int Y, unsigned int Z)
+static inline uint32_t F(uint32_t X, uint32_t Y, uint32_t Z)
{
return (X & Y) | (~X & Z);
}
-
-static unsigned int G (unsigned int X, unsigned int Y, unsigned int Z)
+static inline uint32_t G(uint32_t X, uint32_t Y, uint32_t Z)
{
return (X & Z) | (Y & ~Z);
}
-
-static unsigned int H (unsigned int X, unsigned int Y, unsigned int Z)
+static inline uint32_t H(uint32_t X, uint32_t Y, uint32_t Z)
{
return X ^ Y ^ Z;
}
-
-static unsigned int I (unsigned int X, unsigned int Y, unsigned int Z)
+static inline uint32_t I(uint32_t X, uint32_t Y, uint32_t Z)
{
return Y ^ (X | ~Z);
}
-static unsigned int Round (unsigned int a, unsigned int b, unsigned int FGHI,
- unsigned int k, unsigned int s, unsigned int i)
+static const struct
{
- return b + ROTATE_LEFT (a + FGHI + pX[k] + T[i], s);
+ uint8_t k : 4;
+ uint8_t : 0;
+ uint8_t s : 5;
+// uint8_t i : 6; just increments constantly, from 1 .. 64 over all rounds
}
+MD5_round1[16] =
+{
+ { 0, 7}, { 1, 12}, { 2, 17}, { 3, 22},
+ { 4, 7}, { 5, 12}, { 6, 17}, { 7, 22},
+ { 8, 7}, { 9, 12}, {10, 17}, {11, 22},
+ {12, 7}, {13, 12}, {14, 17}, {15, 22},
+},
+MD5_round2[16] =
+{
+ { 1, 5}, { 6, 9}, {11, 14}, { 0, 20},
+ { 5, 5}, {10, 9}, {15, 14}, { 4, 20},
+ { 9, 5}, {14, 9}, { 3, 14}, { 8, 20},
+ {13, 5}, { 2, 9}, { 7, 14}, {12, 20},
+},
+MD5_round3[16] =
+{
+ { 5, 4}, { 8, 11}, {11, 16}, {14, 23},
+ { 1, 4}, { 4, 11}, { 7, 16}, {10, 23},
+ {13, 4}, { 0, 11}, { 3, 16}, { 6, 23},
+ { 9, 4}, {12, 11}, {15, 16}, { 2, 23},
+},
+MD5_round4[16] =
+{
+ { 0, 6}, { 7, 10}, {14, 15}, { 5, 21},
+ {12, 6}, { 3, 10}, {10, 15}, { 1, 21},
+ { 8, 6}, {15, 10}, { 6, 15}, {13, 21},
+ { 4, 6}, {11, 10}, { 2, 15}, { 9, 21},
+};
-static void Round1 (unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d, unsigned int k, unsigned int s,
- unsigned int i)
+
+void MD5_init(MD5_state* state)
{
- *a = Round (*a, b, F (b, c, d), k, s, i);
+ // in the RFC, these are specified as bytes, interpreted as little-endian
+ state->val[0] = 0x67452301;
+ state->val[1] = 0xEFCDAB89;
+ state->val[2] = 0x98BADCFE;
+ state->val[3] = 0x10325476;
}
-static void Round2 (unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d, unsigned int k, unsigned int s,
- unsigned int i)
+void MD5_do_block(MD5_state* state, MD5_block block)
{
- *a = Round (*a, b, G (b, c, d), k, s, i);
+#define X block.data
+#define a state->val[(16-i)%4]
+#define b state->val[(17-i)%4]
+#define c state->val[(18-i)%4]
+#define d state->val[(19-i)%4]
+ // save the values
+ const MD5_state saved = *state;
+ // round 1
+ for (int i=0; i<16; i++)
+ {
+#define k MD5_round1[i].k
+#define s MD5_round1[i].s
+ a = b + rotate_left(a + F(b,c,d) + X[k] + T[i+0x0], s);
+#undef k
+#undef s
+ }
+ // round 2
+ for (int i=0; i<16; i++)
+ {
+#define k MD5_round2[i].k
+#define s MD5_round2[i].s
+ a = b + rotate_left(a + G(b,c,d) + X[k] + T[i+0x10], s);
+#undef k
+#undef s
+ }
+ // round 3
+ for (int i=0; i<16; i++)
+ {
+#define k MD5_round3[i].k
+#define s MD5_round3[i].s
+ a = b + rotate_left(a + H(b,c,d) + X[k] + T[i+0x20], s);
+#undef k
+#undef s
+ }
+ // round 4
+ for (int i=0; i<16; i++)
+ {
+#define k MD5_round4[i].k
+#define s MD5_round4[i].s
+ a = b + rotate_left(a + I(b,c,d) + X[k] + T[i+0x30], s);
+#undef k
+#undef s
+ }
+ // adjust state based on original
+ state->val[0] += saved.val[0];
+ state->val[1] += saved.val[1];
+ state->val[2] += saved.val[2];
+ state->val[3] += saved.val[3];
+#undef a
+#undef b
+#undef c
+#undef d
}
-static void Round3 (unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d, unsigned int k, unsigned int s,
- unsigned int i)
+void MD5_to_bin(MD5_state state, uint8_t out[0x10])
{
- *a = Round (*a, b, H (b, c, d), k, s, i);
+ for (int i=0; i<0x10; i++)
+ out[i] = state.val[i/4] >> 8*(i%4);
}
-static void Round4 (unsigned int *a, unsigned int b, unsigned int c,
- unsigned int d, unsigned int k, unsigned int s,
- unsigned int i)
+static const char hex[0x10] = "0123456789abcdef";
+
+void MD5_to_str(MD5_state state, char out[0x21])
{
- *a = Round (*a, b, I (b, c, d), k, s, i);
+ uint8_t bin[16];
+ MD5_to_bin(state, bin);
+ for (int i=0; i<0x10; i++)
+ out[2*i] = hex[bin[i] >> 4],
+ out[2*i+1] = hex[bin[i] & 0xf];
+ out[0x20] = '\0';
}
-static void MD5_Round_Calculate (const unsigned char *block,
- unsigned int *A2, unsigned int *B2,
- unsigned int *C2, unsigned int *D2)
+MD5_state MD5_from_string(const char* msg, const size_t msglen)
{
- //create X It is since it is required.
- unsigned int X[16]; //512bit 64byte
- int j, k;
-
- //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D)
- unsigned int A = *A2, B = *B2, C = *C2, D = *D2;
- unsigned int AA = A, BB = B, CC = C, DD = D;
-
- //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4
- pX = X;
-
- //Copy block(padding_message) i into X
- for (j = 0, k = 0; j < 64; j += 4, k++)
- X[k] = ((unsigned int) block[j]) // 8byte*4 -> 32byte conversion
- | (((unsigned int) block[j + 1]) << 8) // A function called Decode as used in the field of RFC
- | (((unsigned int) block[j + 2]) << 16)
- | (((unsigned int) block[j + 3]) << 24);
-
- //Round 1
- Round1 (&A, B, C, D, 0, 7, 0);
- Round1 (&D, A, B, C, 1, 12, 1);
- Round1 (&C, D, A, B, 2, 17, 2);
- Round1 (&B, C, D, A, 3, 22, 3);
- Round1 (&A, B, C, D, 4, 7, 4);
- Round1 (&D, A, B, C, 5, 12, 5);
- Round1 (&C, D, A, B, 6, 17, 6);
- Round1 (&B, C, D, A, 7, 22, 7);
- Round1 (&A, B, C, D, 8, 7, 8);
- Round1 (&D, A, B, C, 9, 12, 9);
- Round1 (&C, D, A, B, 10, 17, 10);
- Round1 (&B, C, D, A, 11, 22, 11);
- Round1 (&A, B, C, D, 12, 7, 12);
- Round1 (&D, A, B, C, 13, 12, 13);
- Round1 (&C, D, A, B, 14, 17, 14);
- Round1 (&B, C, D, A, 15, 22, 15);
-
- //Round 2
- Round2 (&A, B, C, D, 1, 5, 16);
- Round2 (&D, A, B, C, 6, 9, 17);
- Round2 (&C, D, A, B, 11, 14, 18);
- Round2 (&B, C, D, A, 0, 20, 19);
- Round2 (&A, B, C, D, 5, 5, 20);
- Round2 (&D, A, B, C, 10, 9, 21);
- Round2 (&C, D, A, B, 15, 14, 22);
- Round2 (&B, C, D, A, 4, 20, 23);
- Round2 (&A, B, C, D, 9, 5, 24);
- Round2 (&D, A, B, C, 14, 9, 25);
- Round2 (&C, D, A, B, 3, 14, 26);
- Round2 (&B, C, D, A, 8, 20, 27);
- Round2 (&A, B, C, D, 13, 5, 28);
- Round2 (&D, A, B, C, 2, 9, 29);
- Round2 (&C, D, A, B, 7, 14, 30);
- Round2 (&B, C, D, A, 12, 20, 31);
-
- //Round 3
- Round3 (&A, B, C, D, 5, 4, 32);
- Round3 (&D, A, B, C, 8, 11, 33);
- Round3 (&C, D, A, B, 11, 16, 34);
- Round3 (&B, C, D, A, 14, 23, 35);
- Round3 (&A, B, C, D, 1, 4, 36);
- Round3 (&D, A, B, C, 4, 11, 37);
- Round3 (&C, D, A, B, 7, 16, 38);
- Round3 (&B, C, D, A, 10, 23, 39);
- Round3 (&A, B, C, D, 13, 4, 40);
- Round3 (&D, A, B, C, 0, 11, 41);
- Round3 (&C, D, A, B, 3, 16, 42);
- Round3 (&B, C, D, A, 6, 23, 43);
- Round3 (&A, B, C, D, 9, 4, 44);
- Round3 (&D, A, B, C, 12, 11, 45);
- Round3 (&C, D, A, B, 15, 16, 46);
- Round3 (&B, C, D, A, 2, 23, 47);
-
- //Round 4
- Round4 (&A, B, C, D, 0, 6, 48);
- Round4 (&D, A, B, C, 7, 10, 49);
- Round4 (&C, D, A, B, 14, 15, 50);
- Round4 (&B, C, D, A, 5, 21, 51);
- Round4 (&A, B, C, D, 12, 6, 52);
- Round4 (&D, A, B, C, 3, 10, 53);
- Round4 (&C, D, A, B, 10, 15, 54);
- Round4 (&B, C, D, A, 1, 21, 55);
- Round4 (&A, B, C, D, 8, 6, 56);
- Round4 (&D, A, B, C, 15, 10, 57);
- Round4 (&C, D, A, B, 6, 15, 58);
- Round4 (&B, C, D, A, 13, 21, 59);
- Round4 (&A, B, C, D, 4, 6, 60);
- Round4 (&D, A, B, C, 11, 10, 61);
- Round4 (&C, D, A, B, 2, 15, 62);
- Round4 (&B, C, D, A, 9, 21, 63);
-
- // Then perform the following additions. (let's add)
- *A2 = A + AA;
- *B2 = B + BB;
- *C2 = C + CC;
- *D2 = D + DD;
-
- //The clearance of confidential information
- memset (pX, 0, sizeof (X));
+ MD5_state state;
+ MD5_init(&state);
+ MD5_block block;
+ size_t rem = msglen;
+ while (rem >= 64)
+ {
+ for (int i=0; i<0x10; i++)
+ X[i] = msg[4*i+0] | msg[4*i+1]<<8 | msg[4*i+2]<<16 | msg[4*i+3]<<24;
+ MD5_do_block(&state, block);
+ msg += 64;
+ rem -= 64;
+ }
+ // now pad 1-512 bits + the 64-bit length - may be two blocks
+ uint8_t buf[0x40] = {};
+ memcpy (buf, msg, rem);
+ buf[rem] = 0x80; // a single one bit
+ if (64 - rem > 8)
+ {
+ for (int i=0; i<8; i++)
+ buf[0x38+i] = (msglen*8) >> (i*8);
+ }
+ for (int i=0; i<0x10; i++)
+ X[i] = buf[4*i+0] | buf[4*i+1]<<8 | buf[4*i+2]<<16 | buf[4*i+3]<<24;
+ MD5_do_block(&state, block);
+ if (64 - rem <= 8)
+ {
+ memset(buf,'\0', 0x38);
+ for (int i=0; i<8; i++)
+ buf[0x38+i] = (msglen*8) >> (i*8);
+ for (int i=0; i<0x10; i++)
+ X[i] = buf[4*i+0] | buf[4*i+1]<<8 | buf[4*i+2]<<16 | buf[4*i+3]<<24;
+ MD5_do_block(&state, block);
+ }
+ return state;
}
-//-------------------------------------------------------------------
-// The function for the exteriors
-
-/** output is the coded binary in the character sequence which wants to code string. */
-void MD5_String2binary (const char *string, char *output)
+// This could be reimplemented without the strlen()
+MD5_state MD5_from_cstring(const char* msg)
{
-//var
- /*8bit */
- unsigned char padding_message[64]; //Extended message 512bit 64byte
- unsigned char *pstring; //The position of string in the present scanning notes is held.
-
-// unsigned char digest[16];
- /*32bit */
- unsigned int string_byte_len, //The byte chief of string is held.
- string_bit_len, //The bit length of string is held.
- copy_len, //The number of bytes which is used by 1-3 and which remained
- msg_digest[4]; //Message digest 128bit 4byte
- unsigned int *A = &msg_digest[0], //The message digest in accordance with RFC (reference)
- *B = &msg_digest[1], *C = &msg_digest[2], *D = &msg_digest[3];
- int i;
+ return MD5_from_string(msg, strlen(msg));
+}
-//prog
- //Step 3.Initialize MD Buffer (although it is the initialization; step 3 of A, B, C, and D -- unavoidable -- a head)
- *A = 0x67452301;
- *B = 0xefcdab89;
- *C = 0x98badcfe;
- *D = 0x10325476;
+MD5_state MD5_from_FILE(FILE* in) {
+ uint64_t total_len = 0;
- //Step 1.Append Padding Bits (extension of a mark bit)
- //1-1
- string_byte_len = strlen (string); //The byte chief of a character sequence is acquired.
- pstring = (unsigned char *) string; //The position of the present character sequence is set.
+ uint8_t buf[0x40];
+ uint8_t block_len = 0;
- //1-2 Repeat calculation until length becomes less than 64 bytes.
- for (i = string_byte_len; 64 <= i; i -= 64, pstring += 64)
- MD5_Round_Calculate (pstring, A, B, C, D);
+ MD5_state state;
+ MD5_init(&state);
- //1-3
- copy_len = string_byte_len % 64; //The number of bytes which remained is computed.
- strncpy ((char *) padding_message, (char *) pstring, copy_len); //A message is copied to an extended bit sequence.
- memset (padding_message + copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length.
- padding_message[copy_len] |= 0x80; //The next of a message is 1.
+ MD5_block block;
- //1-4
- //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes.
- if (56 <= copy_len)
+ while (true)
{
- MD5_Round_Calculate (padding_message, A, B, C, D);
- memset (padding_message, 0, 56); //56 bytes is newly fill uped with 0.
+ size_t rv = fread(buf + block_len, 1, 0x40 - block_len, in);
+ if (!rv)
+ break;
+ total_len += 8*rv; // in bits
+ block_len += rv;
+ if (block_len != 0x40)
+ continue;
+ for (int i=0; i<0x10; i++)
+ X[i] = buf[4*i+0] | buf[4*i+1]<<8 | buf[4*i+2]<<16 | buf[4*i+3]<<24;
+ MD5_do_block(&state, block);
+ block_len = 0;
}
-
- //Step 2.Append Length (the information on length is added)
- string_bit_len = string_byte_len * 8; //From the byte chief to bit length (32 bytes of low rank)
- memcpy (&padding_message[56], &string_bit_len, 4); //32 bytes of low rank is set.
-
- //When bit length cannot be expressed in 32 bytes of low rank, it is a beam raising to a higher rank.
- if (UINT_MAX / 8 < string_byte_len)
+ // no more input, just pad and append the length
+ buf[block_len] = 0x80;
+ memset(buf + block_len + 1, '\0', 0x40 - block_len - 1);
+ if (block_len < 0x38)
{
- unsigned int high = (string_byte_len - UINT_MAX / 8) * 8;
- memcpy (&padding_message[60], &high, 4);
+ for (int i=0; i<8; i++)
+ buf[0x38+i] = total_len >> i*8;
}
- else
- memset (&padding_message[60], 0, 4); //In this case, it is good for a higher rank at 0.
-
- //Step 4.Process Message in 16-Word Blocks (calculation of MD5)
- MD5_Round_Calculate (padding_message, A, B, C, D);
-
- //Step 5.Output (output)
- memcpy (output, msg_digest, 16);
-// memcpy (digest, msg_digest, and 16); //8 byte*4 < - 32byte conversion A function called Encode as used in the field of RFC
-/* sprintf(output,
- "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
- digest[ 0], digest[ 1], digest[ 2], digest[ 3],
- digest[ 4], digest[ 5], digest[ 6], digest[ 7],
- digest[ 8], digest[ 9], digest[10], digest[11],
- digest[12], digest[13], digest[14], digest[15]);*/
+ for (int i=0; i<0x10; i++)
+ X[i] = buf[4*i+0] | buf[4*i+1]<<8 | buf[4*i+2]<<16 | buf[4*i+3]<<24;
+ MD5_do_block(&state, block);
+ if (0x38 <= block_len)
+ {
+ memset(buf, '\0', 0x38);
+ for (int i=0; i<8; i++)
+ buf[0x38+i] = total_len >> i*8;
+ for (int i=0; i<0x10; i++)
+ X[i] = buf[4*i+0] | buf[4*i+1]<<8 | buf[4*i+2]<<16 | buf[4*i+3]<<24;
+ MD5_do_block(&state, block);
+ }
+ return state;
}
-/** output is the coded character sequence in the character sequence which wants to code string. */
-void MD5_String (const char *string, char *output)
-{
- unsigned char digest[16];
-
- MD5_String2binary (string, digest);
- sprintf (output,
- "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
- digest[0], digest[1], digest[2], digest[3],
- digest[4], digest[5], digest[6], digest[7],
- digest[8], digest[9], digest[10], digest[11],
- digest[12], digest[13], digest[14], digest[15]);
-}
// Hash a password with a salt.
-char *MD5_saltcrypt(const char *key, const char *salt)
+// Whoever wrote this FAILS programming
+const char *MD5_saltcrypt(const char *key, const char *salt)
{
- char buf[66], *sbuf = buf+32;
- static char obuf[33];
+ char buf[65];
- // hash the key then the salt
- // buf ends up as a 64char null terminated string
- MD5_String(key, buf);
- MD5_String(salt, sbuf);
+ // hash the key then the salt
+ // buf ends up as a 64-char NUL-terminated string
+ MD5_to_str(MD5_from_cstring(key), buf);
+ MD5_to_str(MD5_from_cstring(salt), buf+32);
- // Hash the buffer back into sbuf
- MD5_String(buf, sbuf);
+ // Hash the buffer back into sbuf - this is stupid
+ // (luckily, putting the result into itself is safe)
+ MD5_to_str(MD5_from_cstring(buf), buf+32);
- snprintf(obuf, 32, "!%s$%s", salt, sbuf);
- return(obuf);
+ static char obuf[33];
+ // This truncates the string, but we have to keep it like that for compatibility
+ snprintf(obuf, 32, "!%s$%s", salt, buf+32);
+ return obuf;
}
-char *make_salt() {
- static char salt[6];
- int i;
- for (i=0; i<5; i++)
- salt[i] = (char)((mt_rand() % 78) + 48);
- salt[5] = '\0';
- return(salt);
+const char *make_salt() {
+ static char salt[6];
+ for (int i=0; i<5; i++)
+ salt[i] = MPRAND(48, 78);
+ return salt;
}
-int pass_ok(const char *password, const char *crypted) {
- char buf[40], *salt=buf+1;
+bool pass_ok(const char *password, const char *crypted) {
+ char buf[40];
+ strncpy(buf, crypted, 40);
+ char *salt = buf + 1;
+ *strchr(salt, '$') = '\0';
- strncpy(buf, crypted, 40);
- *strchr(buf, '$') = '\0';
-
- if (!strcmp(crypted, MD5_saltcrypt(password, salt)))
- return(1);
-
- return(0);
+ return !strcmp(crypted, MD5_saltcrypt(password, salt));
}
// [M|h]ashes up an IP address and a secret key
@@ -337,13 +312,13 @@ int pass_ok(const char *password, const char *crypted) {
in_addr_t MD5_ip(char *secret, in_addr_t ip)
{
char ipbuf[32];
- char obuf[16];
+ uint8_t obuf[16];
union {
struct bytes {
- unsigned char b1;
- unsigned char b2;
- unsigned char b3;
- unsigned char b4;
+ uint8_t b1;
+ uint8_t b2;
+ uint8_t b3;
+ uint8_t b4;
} bytes;
in_addr_t ip;
} conv;
@@ -351,7 +326,8 @@ in_addr_t MD5_ip(char *secret, in_addr_t ip)
// MD5sum a secret + the IP address
memset(&ipbuf, 0, sizeof(ipbuf));
snprintf(ipbuf, sizeof(ipbuf), "%lu%s", (unsigned long)ip, secret);
- MD5_String2binary(ipbuf, obuf);
+ /// TODO stop it from being a cstring
+ MD5_to_bin(MD5_from_cstring(ipbuf), obuf);
// Fold the md5sum to 32 bits, pack the bytes to an in_addr_t
conv.bytes.b1 = obuf[0] ^ obuf[1] ^ obuf[8] ^ obuf[9];
@@ -361,4 +337,3 @@ in_addr_t MD5_ip(char *secret, in_addr_t ip)
return conv.ip;
}
-
diff --git a/src/common/md5calc.h b/src/common/md5calc.h
index 5994376..cf1425f 100644
--- a/src/common/md5calc.h
+++ b/src/common/md5calc.h
@@ -1,13 +1,64 @@
-// $Id: md5calc.h,v 1.1.1.1 2004/09/10 17:26:54 MagicalTux Exp $
-#ifndef _MD5CALC_H_
-#define _MD5CALC_H_
+#ifndef MD5CALC_H
+#define MD5CALC_H
+
+#include "sanity.h"
+
#include <netinet/in.h>
-void MD5_String (const char *string, char *output);
-void MD5_String2binary (const char *string, char *output);
-char *MD5_saltcrypt(const char *key, const char *salt);
-char *make_salt();
-int pass_ok(const char *password, const char *crypted);
+#include <stdint.h> // uint32_t, uint8_t
+#include <stddef.h> // size_t
+#include <stdio.h> // FILE*
+
+/// The digest state - becomes the output
+typedef struct
+{
+ // classically named {A,B,C,D}
+ // but use an so we can index
+ uint32_t val[4];
+} MD5_state;
+typedef struct
+{
+ uint32_t data[16];
+} MD5_block;
+
+// Implementation
+void MD5_init(MD5_state* state);
+void MD5_do_block(MD5_state* state, MD5_block block);
+
+// Output formatting
+void MD5_to_bin(MD5_state state, uint8_t out[0x10]);
+void MD5_to_str(MD5_state state, char out[0x21]);
+
+// Convenience
+MD5_state MD5_from_string(const char* msg, const size_t msglen);
+MD5_state MD5_from_cstring(const char* msg);
+MD5_state MD5_from_FILE(FILE* in);
+
+
+/// Output in ASCII - with lowercase hex digits, null-terminated
+// these may overlap safely
+static void MD5_String (const char *string, char output[33]) __attribute__((deprecated));
+static inline void MD5_String (const char *string, char output[33]) {
+ MD5_to_str(MD5_from_cstring(string), output);
+}
+/// Output in binary
+static void MD5_String2binary (const char *string, uint8_t output[16]) __attribute__((deprecated));
+static inline void MD5_String2binary (const char *string, uint8_t output[16]) {
+ MD5_to_bin(MD5_from_cstring(string), output);
+}
+
+// statically-allocated output
+// whoever wrote this fails basic understanding of
+const char *MD5_saltcrypt(const char *key, const char *salt);
+
+/// return some random characters (statically allocated)
+// Currently, returns a 5-char string
+const char *make_salt();
+
+/// check plaintext password against saved saltcrypt
+bool pass_ok(const char *password, const char *crypted);
+
+/// This returns an in_addr_t because it is configurable whether it gets called at all
in_addr_t MD5_ip(char *secret, in_addr_t ip);
#endif
diff --git a/src/common/mmo.h b/src/common/mmo.h
index 279bf4a..906f5c1 100644
--- a/src/common/mmo.h
+++ b/src/common/mmo.h
@@ -1,69 +1,67 @@
-// $Id: mmo.h,v 1.3 2004/09/25 20:12:25 PoW Exp $
-// Original : mmo.h 2003/03/14 12:07:02 Rev.1.7
+/// Global structures and defines
+#ifndef MMO_H
+#define MMO_H
-#ifndef _MMO_H_
-#define _MMO_H_
+# include <time.h>
+# include "utils.h" // LCCWIN32
-#include <time.h>
-#include "utils.h" // LCCWIN32
+# ifdef CYGWIN
+# define RETCODE "\r\n"
+# else
+# define RETCODE "\n"
+# endif
-#ifdef CYGWIN
-#define RETCODE "\r\n" // (CR/LF:Windows系)
-#else
-#define RETCODE "\n" // (LF:Unix系)
-#endif
-
-#define FIFOSIZE_SERVERLINK 256*1024
+# define FIFOSIZE_SERVERLINK 256*1024
// set to 0 to not check IP of player between each server.
// set to another value if you want to check (1)
-#define CMP_AUTHFIFO_IP 1
-
-#define CMP_AUTHFIFO_LOGIN2 1
-
-#define MAX_MAP_PER_SERVER 512
-#define MAX_INVENTORY 100
-#define MAX_AMOUNT 30000
-#define MAX_ZENY 1000000000 // 1G zeny
-#define MAX_CART 100
-#define MAX_SKILL 450
-#define GLOBAL_REG_NUM 96
-#define ACCOUNT_REG_NUM 16
-#define ACCOUNT_REG2_NUM 16
-#define DEFAULT_WALK_SPEED 150
-#define MIN_WALK_SPEED 0
-#define MAX_WALK_SPEED 1000
-#define MAX_STORAGE 300
-#define MAX_GUILD_STORAGE 1000
-#define MAX_PARTY 12
-#define MAX_GUILD 120 // increased max guild members to accomodate for +2 increase for extension levels [Valaris] (removed) [PoW]
-#define MAX_GUILDPOSITION 20 // increased max guild positions to accomodate for all members [Valaris] (removed) [PoW]
-#define MAX_GUILDEXPLUSION 32
-#define MAX_GUILDALLIANCE 16
-#define MAX_GUILDSKILL 8
-#define MAX_GUILDCASTLE 24 // increased to include novice castles [Valaris]
-#define MAX_GUILDLEVEL 50
-
-#define MIN_HAIR_STYLE battle_config.min_hair_style
-#define MAX_HAIR_STYLE battle_config.max_hair_style
-#define MIN_HAIR_COLOR battle_config.min_hair_color
-#define MAX_HAIR_COLOR battle_config.max_hair_color
-#define MIN_CLOTH_COLOR battle_config.min_cloth_color
-#define MAX_CLOTH_COLOR battle_config.max_cloth_color
+# define CMP_AUTHFIFO_IP 1
+
+# define CMP_AUTHFIFO_LOGIN2 1
+
+# define MAX_MAP_PER_SERVER 512
+# define MAX_INVENTORY 100
+# define MAX_AMOUNT 30000
+# define MAX_ZENY 1000000000 // 1G zeny
+# define MAX_CART 100
+# define MAX_SKILL 450
+# define GLOBAL_REG_NUM 96
+# define ACCOUNT_REG_NUM 16
+# define ACCOUNT_REG2_NUM 16
+# define DEFAULT_WALK_SPEED 150
+# define MIN_WALK_SPEED 0
+# define MAX_WALK_SPEED 1000
+# define MAX_STORAGE 300
+# define MAX_GUILD_STORAGE 1000
+# define MAX_PARTY 12
+# define MAX_GUILD 120 // increased max guild members to accomodate for +2 increase for extension levels [Valaris] (removed) [PoW]
+# define MAX_GUILDPOSITION 20 // increased max guild positions to accomodate for all members [Valaris] (removed) [PoW]
+# define MAX_GUILDEXPLUSION 32
+# define MAX_GUILDALLIANCE 16
+# define MAX_GUILDSKILL 8
+# define MAX_GUILDCASTLE 24 // increased to include novice castles [Valaris]
+# define MAX_GUILDLEVEL 50
+
+# define MIN_HAIR_STYLE battle_config.min_hair_style
+# define MAX_HAIR_STYLE battle_config.max_hair_style
+# define MIN_HAIR_COLOR battle_config.min_hair_color
+# define MAX_HAIR_COLOR battle_config.max_hair_color
+# define MIN_CLOTH_COLOR battle_config.min_cloth_color
+# define MAX_CLOTH_COLOR battle_config.max_cloth_color
// for produce
-#define MIN_ATTRIBUTE 0
-#define MAX_ATTRIBUTE 4
-#define ATTRIBUTE_NORMAL 0
-#define MIN_STAR 0
-#define MAX_STAR 3
+# define MIN_ATTRIBUTE 0
+# define MAX_ATTRIBUTE 4
+# define ATTRIBUTE_NORMAL 0
+# define MIN_STAR 0
+# define MAX_STAR 3
-#define MIN_PORTAL_MEMO 0
-#define MAX_PORTAL_MEMO 2
+# define MIN_PORTAL_MEMO 0
+# define MAX_PORTAL_MEMO 2
-#define MAX_STATUS_TYPE 5
+# define MAX_STATUS_TYPE 5
-#define CHAR_CONF_NAME "conf/char_athena.conf"
+# define CHAR_CONF_NAME "conf/char_athena.conf"
struct item
{
@@ -288,19 +286,4 @@ enum
};
-#ifndef LCCWIN32
-#ifndef strcmpi
-#define strcmpi strcasecmp
-#endif
-#ifndef stricmp
-#define stricmp strcasecmp
-#endif
-#ifndef strncmpi
-#define strncmpi strncasecmp
-#endif
-#ifndef strnicmp
-#define strnicmp strncasecmp
-#endif
-#endif
-
-#endif // _MMO_H_
+#endif // MMO_H
diff --git a/src/common/mt_rand.c b/src/common/mt_rand.c
index 627d9dd..e4e8d12 100644
--- a/src/common/mt_rand.c
+++ b/src/common/mt_rand.c
@@ -48,71 +48,69 @@
#include <time.h>
#include "mt_rand.h"
-#define N (624) /* length of state vector */
-#define M (397) /* a period parameter */
-#define K (0x9908B0DFU) /* a magic constant */
-#define hiBit(u) ((u) & 0x80000000U) /* mask all but highest bit of u */
-#define loBit(u) ((u) & 0x00000001U) /* mask all but lowest bit of u */
-#define loBits(u) ((u) & 0x7FFFFFFFU) /* mask the highest bit of u */
-#define mixBits(u, v) (hiBit(u)|loBits(v)) /* move hi bit of u to hi bit of v */
+#define N 624 // length of state vector
+#define M 397 // a period parameter
+#define K 0x9908B0DFU // a magic constant
-static unsigned long state[N + 1]; /* state vector + 1 extra to not violate ANSI C */
-static unsigned long *next; /* next random value is computed from here */
-static int left = -1; /* can *next++ this many times before reloading */
+#define hiBit(u) ((u) & 0x80000000U) // mask all but highest bit of u
+#define loBit(u) ((u) & 0x00000001U) // mask all but lowest bit of u
+#define loBits(u) ((u) & 0x7FFFFFFFU) // mask the highest bit of u
+#define mixBits(u, v) (hiBit(u)|loBits(v)) // move hi bit of u to hi bit of v
-void mt_seed (unsigned long seed)
+static uint32_t state[N+1]; // state vector the +1 is needed due to the coding
+static uint32_t *next; // next random value is computed from here
+static int left = -1; // can *next++ this many times before reloading
+
+void mt_seed (uint32_t seed)
{
- register unsigned long x = (seed | 1U) & 0xFFFFFFFFU, *s = state;
- register int j;
+ uint32_t x = seed | 1U;
+ uint32_t *s = state;
+ left = 0;
- for (left = 0, *s++ = x, j = N; --j; *s++ = (x *= 69069U) & 0xFFFFFFFFU);
+ for (int j = N; *s++ = x, --j; x *= 69069U);
}
-unsigned long mt_reload (void)
+void mt_reload (void)
{
- register unsigned long *p0 = state, *p2 = state + 2, *pM =
- state + M, s0, s1;
- register int j;
-
+ // if mt_seed has never been called
if (left < -1)
mt_seed (time (NULL));
- left = N - 1, next = state + 1;
+ // conceptually, these are indices into the state that wrap
+ uint32_t *p0 = state;
+ uint32_t *p2 = state + 2;
+ uint32_t *pM = state + M;
+
+ uint32_t s0 = state[0];
+ uint32_t s1 = state[1];
- for (s0 = state[0], s1 = state[1], j = N - M + 1; --j;
- s0 = s1, s1 = *p2++)
+ // regenerate the lower N-M elements of the state
+ for (int j = N-M+1; --j != 0; s0 = s1, s1 = *p2++)
*p0++ = *pM++ ^ (mixBits (s0, s1) >> 1) ^ (loBit (s1) ? K : 0U);
- for (pM = state, j = M; --j; s0 = s1, s1 = *p2++)
+ pM = state;
+ // regenerate the next M-1 elements of the state
+ // note that s1 is set to state[N] at the end, but discarded
+ for (int j = M; --j != 0; s0 = s1, s1 = *p2++)
*p0++ = *pM++ ^ (mixBits (s0, s1) >> 1) ^ (loBit (s1) ? K : 0U);
- s1 = state[0], *p0 =
- *pM ^ (mixBits (s0, s1) >> 1) ^ (loBit (s1) ? K : 0U);
- s1 ^= (s1 >> 11);
- s1 ^= (s1 << 7) & 0x9D2C5680U;
- s1 ^= (s1 << 15) & 0xEFC60000U;
- return (s1 ^ (s1 >> 18));
+ // regenerate the last 1 element of the state
+ s1 = state[0];
+ *p0 = *pM ^ (mixBits (s0, s1) >> 1) ^ (loBit (s1) ? K : 0U);
+
+ // ready for the normal mt_random algorithm
+ left = N;
+ next = state;
}
-unsigned long mt_random (void)
+uint32_t mt_random (void)
{
- unsigned long y;
-
if (--left < 0)
- return (mt_reload ());
+ mt_reload ();
- y = *next++;
+ uint32_t y = *next++;
y ^= (y >> 11);
y ^= (y << 7) & 0x9D2C5680U;
y ^= (y << 15) & 0xEFC60000U;
- return (y ^ (y >> 18));
-}
-
-int mt_rand (void)
-{
- unsigned long r = mt_random ();
- while (r >> 16)
- r = (r & 0xFFFF) + (r >> 16);
-
- return (r);
+ return y ^ (y >> 18);
}
diff --git a/src/common/mt_rand.h b/src/common/mt_rand.h
index d798fee..95f30e5 100644
--- a/src/common/mt_rand.h
+++ b/src/common/mt_rand.h
@@ -1,9 +1,21 @@
-#ifndef __mt_rand_h
-#define __mt_rand_h
+#ifndef MT_RAND_H
+#define MT_RAND_H
-void mt_seed (unsigned long seed);
-unsigned long mt_reload (void);
-unsigned long mt_random (void);
-int mt_rand (void);
+# include "sanity.h"
-#endif /* __mt_rand_h */
+/// Initialize the generator (called automatically with time() if you don't)
+void mt_seed (uint32_t seed);
+/// Get a random number
+uint32_t mt_random (void);
+
+/**
+ * ModuloRand and ModuloPlusRand
+ * These macros are used to replace the vast number of calls to rand()%mod
+ * TODO eliminate the rest of the calls to rand()
+ * MRAND(10) returns 0..9
+ * MPRAND(5,10) returns 5..14
+ */
+# define MRAND(mod) (mt_random() % (mod))
+# define MPRAND(add, mod) ((add) + MRAND(mod))
+
+#endif // MT_RAND_H
diff --git a/src/common/nullpo.c b/src/common/nullpo.c
index 3205293..de10517 100644
--- a/src/common/nullpo.c
+++ b/src/common/nullpo.c
@@ -2,21 +2,17 @@
#include <stdarg.h>
#include <string.h>
#include "nullpo.h"
-// #include "logs.h" // 布石してみる
static void nullpo_info_core (const char *file, int line, const char *func,
const char *fmt, va_list ap);
-/*======================================
- * Nullチェック 及び 情報出力
- *--------------------------------------
- */
-int nullpo_chk_f (const char *file, int line, const char *func,
- const void *target, const char *fmt, ...)
+/// Null check and print format
+bool nullpo_chk_f (const char *file, int line, const char *func,
+ const void *target, const char *fmt, ...)
{
va_list ap;
- if (target != NULL)
+ if (target)
return 0;
va_start (ap, fmt);
@@ -24,21 +20,17 @@ int nullpo_chk_f (const char *file, int line, const char *func,
va_end (ap);
return 1;
}
-
-int nullpo_chk (const char *file, int line, const char *func,
- const void *target)
+bool nullpo_chk (const char *file, int line, const char *func,
+ const void *target)
{
- if (target != NULL)
+ if (target)
return 0;
nullpo_info_core (file, line, func, NULL, NULL);
return 1;
}
-/*======================================
- * nullpo情報出力(外部呼出し向けラッパ)
- *--------------------------------------
- */
+/// External functions
void nullpo_info_f (const char *file, int line, const char *func,
const char *fmt, ...)
{
@@ -48,39 +40,25 @@ void nullpo_info_f (const char *file, int line, const char *func,
nullpo_info_core (file, line, func, fmt, ap);
va_end (ap);
}
-
void nullpo_info (const char *file, int line, const char *func)
{
nullpo_info_core (file, line, func, NULL, NULL);
}
-/*======================================
- * nullpo情報出力(Main)
- *--------------------------------------
- */
+/// Actual output function
static void nullpo_info_core (const char *file, int line, const char *func,
const char *fmt, va_list ap)
{
- if (file == NULL)
+ if (!file)
file = "??";
+ if (!func || !*func)
+ func = "unknown";
- func = func == NULL ? "unknown" : func[0] == '\0' ? "unknown" : func;
-
- printf ("--- nullpo info --------------------------------------------\n");
- printf ("%s:%d: in func `%s'\n", file, line, func);
- if (fmt != NULL)
+ fprintf (stderr, "%s:%d: in func `%s': NULL pointer\n", file, line, func);
+ if (fmt && *fmt)
{
- if (fmt[0] != '\0')
- {
- vprintf (fmt, ap);
-
- // 最後に改行したか確認
- if (fmt[strlen (fmt) - 1] != '\n')
- printf ("\n");
- }
+ vfprintf (stderr, fmt, ap);
+ if (fmt[strlen (fmt) - 1] != '\n')
+ fputc('\n', stderr);
}
- printf ("--- end nullpo info ----------------------------------------\n");
-
- // ここらでnullpoログをファイルに書き出せたら
- // まとめて提出できるなと思っていたり。
}
diff --git a/src/common/nullpo.h b/src/common/nullpo.h
index baeacdc..9b33b4b 100644
--- a/src/common/nullpo.h
+++ b/src/common/nullpo.h
@@ -1,215 +1,61 @@
-#ifndef _NULLPO_H_
-#define _NULLPO_H_
-
-#define NULLPO_CHECK 1
- // 全体のスイッチを宣言しているヘッダがあれば
- // そこに移動していただけると
-
-#if __STDC_VERSION__ < 199901L
-# if __GNUC__ >= 2
-# define __func__ __FUNCTION__
-# else
-# define __func__ ""
-# endif
-#endif
-
-#ifdef LCCWIN32
-#define __attribute__(x) /* nothing */
-#endif
-
-#define NLP_MARK __FILE__, __LINE__, __func__
-
-/*----------------------------------------------------------------------------
- * Macros
- *----------------------------------------------------------------------------
- */
-/*======================================
- * Nullチェック 及び 情報出力後 return
- *・展開するとifとかreturn等が出るので
- * 一行単体で使ってください。
- *・nullpo_ret(x = func());
- * のような使用法も想定しています。
- *--------------------------------------
- * nullpo_ret(t)
- * 戻り値 0固定
- * [引数]
- * t チェック対象
- *--------------------------------------
- * nullpo_retv(t)
- * 戻り値 なし
- * [引数]
- * t チェック対象
- *--------------------------------------
- * nullpo_retr(ret, t)
- * 戻り値 指定
- * [引数]
- * ret return(ret);
- * t チェック対象
- *--------------------------------------
- * nullpo_ret_f(t, fmt, ...)
- * 詳細情報出力用
- * 戻り値 0
- * [引数]
- * t チェック対象
- * fmt ... vprintfに渡される
- * 備考や関係変数の書き出しなどに
- *--------------------------------------
- * nullpo_retv_f(t, fmt, ...)
- * 詳細情報出力用
- * 戻り値 なし
- * [引数]
- * t チェック対象
- * fmt ... vprintfに渡される
- * 備考や関係変数の書き出しなどに
- *--------------------------------------
- * nullpo_retr_f(ret, t, fmt, ...)
- * 詳細情報出力用
- * 戻り値 指定
- * [引数]
- * ret return(ret);
- * t チェック対象
- * fmt ... vprintfに渡される
- * 備考や関係変数の書き出しなどに
- *--------------------------------------
- */
-
-#if NULLPO_CHECK
-
-#define nullpo_ret(t) \
- if (nullpo_chk(NLP_MARK, (void *)(t))) {return(0);}
-
-#define nullpo_retv(t) \
- if (nullpo_chk(NLP_MARK, (void *)(t))) {return;}
-
-#define nullpo_retr(ret, t) \
- if (nullpo_chk(NLP_MARK, (void *)(t))) {return(ret);}
-
-// 可変引数マクロに関する条件コンパイル
-#if __STDC_VERSION__ >= 199901L
-/* C99に対応 */
-#define nullpo_ret_f(t, fmt, ...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(0);}
-
-#define nullpo_retv_f(t, fmt, ...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return;}
-
-#define nullpo_retr_f(ret, t, fmt, ...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {return(ret);}
-
-#elif __GNUC__ >= 2
-/* GCC用 */
-#define nullpo_ret_f(t, fmt, args...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(0);}
-
-#define nullpo_retv_f(t, fmt, args...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return;}
-
-#define nullpo_retr_f(ret, t, fmt, args...) \
- if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {return(ret);}
-
-#else
-
-/* その他の場合・・・ orz */
-
-#endif
-
-#else /* NULLPO_CHECK */
-/* No Nullpo check */
-
-// if((t)){;}
-// 良い方法が思いつかなかったので・・・苦肉の策です。
-// 一応ワーニングは出ないはず
-
-#define nullpo_ret(t) if((t)){;}
-#define nullpo_retv(t) if((t)){;}
-#define nullpo_retr(ret, t) if((t)){;}
-
-// 可変引数マクロに関する条件コンパイル
-#if __STDC_VERSION__ >= 199901L
-/* C99に対応 */
-#define nullpo_ret_f(t, fmt, ...) if((t)){;}
-#define nullpo_retv_f(t, fmt, ...) if((t)){;}
-#define nullpo_retr_f(ret, t, fmt, ...) if((t)){;}
-
-#elif __GNUC__ >= 2
-/* GCC用 */
-#define nullpo_ret_f(t, fmt, args...) if((t)){;}
-#define nullpo_retv_f(t, fmt, args...) if((t)){;}
-#define nullpo_retr_f(ret, t, fmt, args...) if((t)){;}
-
-#else
-/* その他の場合・・・ orz */
-#endif
-
-#endif /* NULLPO_CHECK */
-
-/*----------------------------------------------------------------------------
- * Functions
- *----------------------------------------------------------------------------
- */
-/*======================================
- * nullpo_chk
- * Nullチェック 及び 情報出力
- * [引数]
- * file __FILE__
- * line __LINE__
- * func __func__ (関数名)
- * これらには NLP_MARK を使うとよい
- * target チェック対象
- * [返り値]
- * 0 OK
- * 1 NULL
- *--------------------------------------
- */
-int nullpo_chk (const char *file, int line, const char *func,
+/// return wrappers for unexpected NULL pointers
+#ifndef NULLPO_H
+#define NULLPO_H
+/// Comment this out to live dangerously
+# define NULLPO_CHECK
+
+/// All functions print to standard error (was: standard output)
+/// nullpo_ret(cond) - return 0 if given pointer is NULL
+/// nullpo_retv(cond) - just return (function returns void)
+/// nullpo_retr(rv, cond) - return given value instead
+/// the _f variants take a printf-format string and arguments
+
+# ifdef NULLPO_CHECK
+# define NLP_MARK __FILE__, __LINE__, __func__
+# define nullpo_ret(t) \
+ if (nullpo_chk(NLP_MARK, t)) \
+ return 0;
+# define nullpo_retv(t) \
+ if (nullpo_chk(NLP_MARK, t)) \
+ return;
+# define nullpo_retr(ret, t) \
+ if (nullpo_chk(NLP_MARK, t)) \
+ return ret;
+# define nullpo_ret_f(t, fmt, ...) \
+ if (nullpo_chk_f(NLP_MARK, t, fmt, ##__VA_ARGS__)) \
+ return 0;
+# define nullpo_retv_f(t, fmt, ...) \
+ if (nullpo_chk_f(NLP_MARK, t, fmt, ##__VA_ARGS__)) \
+ return;
+# define nullpo_retr_f(ret, t, fmt, ...) \
+ if (nullpo_chk_f(NLP_MARK, t, fmt, ##__VA_ARGS__)) \
+ return ret;
+# else // NULLPO_CHECK
+# define nullpo_ret(t) t;
+# define nullpo_retv(t) t;
+# define nullpo_retr(ret, t) t;
+# define nullpo_ret_f(t, fmt, ...) t;
+# define nullpo_retv_f(t, fmt, ...) t;
+# define nullpo_retr_f(ret, t, fmt, ...) t;
+# endif // NULLPO_CHECK
+
+# include "sanity.h"
+
+/// Used by macros in this header
+bool nullpo_chk (const char *file, int line, const char *func,
const void *target);
-/*======================================
- * nullpo_chk_f
- * Nullチェック 及び 詳細な情報出力
- * [引数]
- * file __FILE__
- * line __LINE__
- * func __func__ (関数名)
- * これらには NLP_MARK を使うとよい
- * target チェック対象
- * fmt ... vprintfに渡される
- * 備考や関係変数の書き出しなどに
- * [返り値]
- * 0 OK
- * 1 NULL
- *--------------------------------------
- */
-int nullpo_chk_f (const char *file, int line, const char *func,
+/// Used by macros in this header
+bool nullpo_chk_f (const char *file, int line, const char *func,
const void *target, const char *fmt, ...)
__attribute__ ((format (printf, 5, 6)));
-/*======================================
- * nullpo_info
- * nullpo情報出力
- * [引数]
- * file __FILE__
- * line __LINE__
- * func __func__ (関数名)
- * これらには NLP_MARK を使うとよい
- *--------------------------------------
- */
+/// Used only by map/battle.c
void nullpo_info (const char *file, int line, const char *func);
-/*======================================
- * nullpo_info_f
- * nullpo詳細情報出力
- * [引数]
- * file __FILE__
- * line __LINE__
- * func __func__ (関数名)
- * これらには NLP_MARK を使うとよい
- * fmt ... vprintfに渡される
- * 備考や関係変数の書き出しなどに
- *--------------------------------------
- */
+/// Not used
void nullpo_info_f (const char *file, int line, const char *func,
const char *fmt, ...)
__attribute__ ((format (printf, 4, 5)));
-#endif
+#endif // NULLPO_H
diff --git a/src/common/sanity.h b/src/common/sanity.h
new file mode 100644
index 0000000..168671f
--- /dev/null
+++ b/src/common/sanity.h
@@ -0,0 +1,36 @@
+/// return wrappers for unexpected NULL pointers
+#ifndef SANITY_H
+#define SANITY_H
+# if __STDC_VERSION__ < 199901L
+# error "Please compile in C99 mode"
+# endif
+# if __GNUC__ < 3
+// I don't specifically know what version this requires,
+// but GCC 3 was the beginning of modern GCC
+# error "Please upgrade your compiler to at least GCC 3"
+# endif
+# ifndef __i386__
+// Known platform dependencies:
+// endianness for the [RW]FIFO.* macros
+// possibly, some signal-handling
+# error "Unsupported platform"
+# endif
+# ifdef __x86_64__
+// I'm working on it - I know there are some pointer-size assumptions.
+# error "Sorry, this code is believed not to be 64-bit safe"
+# error "please compile with -m32"
+# endif
+
+/// A name for unused function arguments - can be repeated
+# define UNUSED UNUSED_IMPL(__COUNTER__)
+// Don't you just love the hoops the preprocessor makes you go through?
+# define UNUSED_IMPL(arg) UNUSED_IMPL2(arg)
+# define UNUSED_IMPL2(suffix) unused_ ## suffix __attribute__((unused))
+/// Convert conditions to use the bool type
+# include <stdbool.h>
+/// Convert type assumptions to use the standard types here
+# include <stdint.h>
+/// size_t, NULL
+# include <stddef.h>
+
+#endif // SANITY_H
diff --git a/src/common/socket.c b/src/common/socket.c
index dbf19c1..7c86b1a 100644
--- a/src/common/socket.c
+++ b/src/common/socket.c
@@ -6,17 +6,11 @@
#include <sys/types.h>
#include <errno.h>
-#ifdef LCCWIN32
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <winsock2.h>
-#else
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <sys/time.h>
#include <unistd.h>
-#endif
#include <fcntl.h>
#include <string.h>
@@ -25,191 +19,115 @@
#include "socket.h"
#include "utils.h"
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
fd_set readfds;
int fd_max;
int currentuse;
-int rfifo_size = 65536;
-int wfifo_size = 65536;
+const uint32_t rfifo_size = 65536;
+const uint32_t wfifo_size = 65536;
struct socket_data *session[FD_SETSIZE];
-static int null_parse (int fd);
-static int (*default_func_parse) (int) = null_parse;
+/// Discard all input
+static void null_parse (int fd);
+/// Default parser for new connections
+static void (*default_func_parse) (int) = null_parse;
-/*======================================
- * CORE : Set function
- *--------------------------------------
- */
-void set_defaultparse (int (*defaultparse) (int))
+void set_defaultparse (void (*defaultparse) (int))
{
default_func_parse = defaultparse;
}
-/*======================================
- * CORE : Socket Sub Function
- *--------------------------------------
- */
-
-static int recv_to_fifo (int fd)
+/// Read from socket to the queue
+static void recv_to_fifo (int fd)
{
- int len;
-
- //printf("recv_to_fifo : %d %d\n",fd,session[fd]->eof);
if (session[fd]->eof)
- return -1;
-
-#ifdef LCCWIN32
- len =
- recv (fd, session[fd]->rdata + session[fd]->rdata_size,
- RFIFOSPACE (fd), 0);
-#else
- len =
- read (fd, session[fd]->rdata + session[fd]->rdata_size,
- RFIFOSPACE (fd));
-#endif
+ return;
-// printf (":::RECEIVE:::\n");
-// dump(session[fd]->rdata, len); printf ("\n");
+ ssize_t len = read (fd, session[fd]->rdata + session[fd]->rdata_size,
+ RFIFOSPACE (fd));
- //{ int i; printf("recv %d : ",fd); for(i=0;i<len;i++){ printf("%02x ",RFIFOB(fd,session[fd]->rdata_size+i)); } printf("\n");}
if (len > 0)
{
session[fd]->rdata_size += len;
- if (!session[fd]->connected)
- session[fd]->connected = 1;
+ session[fd]->connected = 1;
}
- else if (len <= 0)
+ else
{
- // value of connection is not necessary the same
-// if (fd == 4) // Removed [Yor]
-// printf("Char-Server Has Disconnected.\n");
-// else if (fd == 5) // Removed [Yor]
-// printf("Attempt To Log In Successful.\n");
-// else if (fd == 7) // Removed [Yor]
-// printf("Char-Server Has Disconnected.\n");
-// else if (fd == 8) // Removed [Valaris]
-// printf("%s has logged off your server.\n",RFIFOP(fd,6)); // Removed [Valaris]
-
-// else if (fd != 8) // [Valaris]
- printf ("set eof : connection #%d\n", fd);
session[fd]->eof = 1;
}
- return 0;
}
-static int send_from_fifo (int fd)
+static void send_from_fifo (int fd)
{
- int len;
-
- //printf("send_from_fifo : %d\n",fd);
if (session[fd]->eof)
- return -1;
-
-#ifdef LCCWIN32
- len = send (fd, session[fd]->wdata, session[fd]->wdata_size, 0);
-#else
- len = write (fd, session[fd]->wdata, session[fd]->wdata_size);
-#endif
+ return;
-// printf (":::SEND:::\n");
-// dump(session[fd]->wdata, len); printf ("\n");
+ ssize_t len = write (fd, session[fd]->wdata, session[fd]->wdata_size);
- //{ int i; printf("send %d : ",fd); for(i=0;i<len;i++){ printf("%02x ",session[fd]->wdata[i]); } printf("\n");}
if (len > 0)
{
- if (len < session[fd]->wdata_size)
+ session[fd]->wdata_size -= len;
+ if (len < (ssize_t)session[fd]->wdata_size)
{
memmove (session[fd]->wdata, session[fd]->wdata + len,
- session[fd]->wdata_size - len);
- session[fd]->wdata_size -= len;
+ session[fd]->wdata_size);
}
- else
- {
- session[fd]->wdata_size = 0;
- }
- if (!session[fd]->connected)
- session[fd]->connected = 1;
+ session[fd]->connected = 1;
}
else
{
- printf ("set eof :%d\n", fd);
session[fd]->eof = 1;
}
- return 0;
}
-static int null_parse (int fd)
+static void null_parse (int fd)
{
printf ("null_parse : %d\n", fd);
RFIFOSKIP (fd, RFIFOREST (fd));
- return 0;
}
-/*======================================
- * CORE : Socket Function
- *--------------------------------------
- */
-static int connect_client (int listen_fd)
+static void connect_client (int listen_fd)
{
- int fd;
struct sockaddr_in client_address;
- unsigned int len;
- int result;
- int yes = 1; // reuse fix
-
- //printf("connect_client : %d\n",listen_fd);
-
- printf ("used: %d, max FDs: %d, SOFT: %d\n", currentuse, FD_SETSIZE,
- SOFT_LIMIT);
-
- len = sizeof (client_address);
+ socklen_t len = sizeof (client_address);
- fd = accept (listen_fd, (struct sockaddr *) &client_address, &len);
- if (fd_max <= fd)
+ int fd = accept (listen_fd, (struct sockaddr *) &client_address, &len);
+ if (fd == -1)
{
- fd_max = fd + 1;
+ perror ("accept");
+ return;
}
- else if (fd == -1)
+ if (fd_max <= fd)
{
- perror ("accept");
- return -1;
+ fd_max = fd + 1;
}
if (!free_fds ())
- { // gracefully end the connecting if no free FD
- printf ("softlimit reached, disconnecting : %d\n", fd);
+ {
+ fprintf (stderr, "softlimit reached, disconnecting : %d\n", fd);
delete_session (fd);
- return -1;
+ return;
}
-// setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,NULL,0);
- setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (char *) &yes, sizeof yes); // reuse fix
-#ifdef SO_REUSEPORT
-// setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,NULL,0);
- setsockopt (fd, SOL_SOCKET, SO_REUSEPORT, (char *) &yes, sizeof yes); //reuse fix
-#endif
-// setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,NULL,0);
- setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (char *) &yes, sizeof yes); // reuse fix
+ const int yes = 1;
+ /// Allow to bind() again after the server restarts.
+ // Since the socket is still in the TIME_WAIT, there's a possibility
+ // that formerly lost packets might be delivered and confuse the server.
+ setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes);
+ /// Send packets as soon as possible
+ /// even if the kernel thinks there is too little for it to be worth it!
+ // I'm not convinced this is a good idea; although in minimizes the
+ // latency for an individual write, it increases traffic in general.
+ setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof yes);
FD_SET (fd, &readfds);
-#ifdef LCCWIN32
- {
- unsigned long val = 1;
- ioctlsocket (fd, FIONBIO, &val);
- }
-#else
- result = fcntl (fd, F_SETFL, O_NONBLOCK);
-#endif
+ fcntl (fd, F_SETFL, O_NONBLOCK);
CREATE (session[fd], struct socket_data, 1);
- CREATE (session[fd]->rdata, unsigned char, rfifo_size);
- CREATE (session[fd]->wdata, unsigned char, wfifo_size);
+ CREATE (session[fd]->rdata, uint8_t, rfifo_size);
+ CREATE (session[fd]->wdata, uint8_t, wfifo_size);
session[fd]->max_rdata = rfifo_size;
session[fd]->max_wdata = wfifo_size;
@@ -221,59 +139,44 @@ static int connect_client (int listen_fd)
session[fd]->connected = 0;
currentuse++;
-
- //printf("new_session : %d %d\n",fd,session[fd]->eof);
- return fd;
}
-int make_listen_port (int port)
+int make_listen_port (uint16_t port)
{
struct sockaddr_in server_address;
- int fd;
- int result;
- int yes = 1; // reuse fix
-
- fd = socket (AF_INET, SOCK_STREAM, 0);
- if (fd_max <= fd)
- fd_max = fd + 1;
- else if (fd == -1)
+ int fd = socket (AF_INET, SOCK_STREAM, 0);
+ if (fd == -1)
{
- perror ("connect");
+ perror ("socket");
return -1;
}
+ if (fd_max <= fd)
+ fd_max = fd + 1;
-#ifdef LCCWIN32
- {
- unsigned long val = 1;
- ioctlsocket (fd, FIONBIO, &val);
- }
-#else
- result = fcntl (fd, F_SETFL, O_NONBLOCK);
-#endif
-
-// setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,NULL,0);
- setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (char *) &yes, sizeof yes); // reuse fix
-#ifdef SO_REUSEPORT
-// setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,NULL,0);
- setsockopt (fd, SOL_SOCKET, SO_REUSEPORT, (char *) &yes, sizeof yes); //reuse fix
-#endif
-// setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,NULL,0);
- setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (char *) &yes, sizeof yes); // reuse fix
+ fcntl (fd, F_SETFL, O_NONBLOCK);
+
+ const int yes = 1;
+ /// Allow to bind() again after the server restarts.
+ // Since the socket is still in the TIME_WAIT, there's a possibility
+ // that formerly lost packets might be delivered and confuse the server.
+ setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes);
+ /// Send packets as soon as possible
+ /// even if the kernel thinks there is too little for it to be worth it!
+ // I'm not convinced this is a good idea; although in minimizes the
+ // latency for an individual write, it increases traffic in general.
+ setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof yes);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl (INADDR_ANY);
server_address.sin_port = htons (port);
- result =
- bind (fd, (struct sockaddr *) &server_address,
- sizeof (server_address));
- if (result == -1)
+ if (bind (fd, (struct sockaddr *) &server_address,
+ sizeof (server_address)) == -1)
{
perror ("bind");
exit (1);
}
- result = listen (fd, 5);
- if (result == -1)
+ if (listen (fd, 5) == -1)
{ /* error */
perror ("listen");
exit (1);
@@ -283,12 +186,6 @@ int make_listen_port (int port)
CREATE (session[fd], struct socket_data, 1);
- if (session[fd] == NULL)
- {
- printf ("out of memory : make_listen_port\n");
- exit (1);
- }
- memset (session[fd], 0, sizeof (*session[fd]));
session[fd]->func_recv = connect_client;
session[fd]->created = time (NULL);
session[fd]->connected = 1;
@@ -297,53 +194,45 @@ int make_listen_port (int port)
return fd;
}
-int make_connection (long ip, int port)
+int make_connection (uint32_t ip, uint16_t port)
{
struct sockaddr_in server_address;
- int fd;
- int result;
- int yes = 1; // reuse fix
-
- fd = socket (AF_INET, SOCK_STREAM, 0);
- if (fd_max <= fd)
- fd_max = fd + 1;
- else if (fd == -1)
+ int fd = socket (AF_INET, SOCK_STREAM, 0);
+ if (fd == -1)
{
perror ("socket");
return -1;
}
+ if (fd_max <= fd)
+ fd_max = fd + 1;
-// setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,NULL,0);
- setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (char *) &yes, sizeof yes); // reuse fix
-#ifdef SO_REUSEPORT
-// setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,NULL,0);
- setsockopt (fd, SOL_SOCKET, SO_REUSEPORT, (char *) &yes, sizeof yes); //reuse fix
-#endif
-// setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,NULL,0);
- setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (char *) &yes, sizeof yes); // reuse fix
+ const int yes = 1;
+ /// Allow to bind() again after the server restarts.
+ // Since the socket is still in the TIME_WAIT, there's a possibility
+ // that formerly lost packets might be delivered and confuse the server.
+ setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes);
+ /// Send packets as soon as possible
+ /// even if the kernel thinks there is too little for it to be worth it!
+ // I'm not convinced this is a good idea; although in minimizes the
+ // latency for an individual write, it increases traffic in general.
+ setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof yes);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = ip;
server_address.sin_port = htons (port);
-#ifdef LCCWIN32
- {
- unsigned long val = 1;
- ioctlsocket (fd, FIONBIO, &val);
- }
-#else
- result = fcntl (fd, F_SETFL, O_NONBLOCK);
-#endif
+ fcntl (fd, F_SETFL, O_NONBLOCK);
- result =
- connect (fd, (struct sockaddr *) (&server_address),
- sizeof (struct sockaddr_in));
+ /// Errors not caught - we must not block
+ /// Let the main select() loop detect when we know the state
+ connect (fd, (struct sockaddr *) &server_address,
+ sizeof (struct sockaddr_in));
FD_SET (fd, &readfds);
CREATE (session[fd], struct socket_data, 1);
- CREATE (session[fd]->rdata, unsigned char, rfifo_size);
- CREATE (session[fd]->wdata, unsigned char, wfifo_size);
+ CREATE (session[fd]->rdata, uint8_t, rfifo_size);
+ CREATE (session[fd]->wdata, uint8_t, wfifo_size);
session[fd]->max_rdata = rfifo_size;
session[fd]->max_wdata = wfifo_size;
@@ -357,51 +246,53 @@ int make_connection (long ip, int port)
return fd;
}
-int delete_session (int fd)
+void delete_session (int fd)
{
if (fd < 0 || fd >= FD_SETSIZE)
- return -1;
+ return;
+ // If this was the highest fd, decrease it
+ // We could add a loop to decrement fd_max further for every null session,
+ // but this is cheap and good enough for the typical case
+ if (fd == fd_max - 1)
+ fd_max--;
FD_CLR (fd, &readfds);
if (session[fd])
{
- if (session[fd]->rdata)
- free (session[fd]->rdata);
- if (session[fd]->wdata)
- free (session[fd]->wdata);
- if (session[fd]->session_data)
- free (session[fd]->session_data);
+ free (session[fd]->rdata);
+ free (session[fd]->wdata);
+ free (session[fd]->session_data);
free (session[fd]);
}
session[fd] = NULL;
+
+ // just close() would try to keep sending buffers
shutdown (fd, SHUT_RDWR);
close (fd);
currentuse--;
if (currentuse < 0)
{
- printf ("delete_session: current sessions negative!\n");
+ fprintf (stderr, "delete_session: current sessions negative!\n");
currentuse = 0;
}
- //printf("delete_session:%d\n",fd);
- return 0;
+ return;
}
-int realloc_fifo (int fd, int rfifo_size, int wfifo_size)
+void realloc_fifo (int fd, size_t rfifo_size, size_t wfifo_size)
{
struct socket_data *s = session[fd];
if (s->max_rdata != rfifo_size && s->rdata_size < rfifo_size)
{
- RECREATE (s->rdata, unsigned char, rfifo_size);
+ RECREATE (s->rdata, uint8_t, rfifo_size);
s->max_rdata = rfifo_size;
}
if (s->max_wdata != wfifo_size && s->wdata_size < wfifo_size)
{
- RECREATE (s->wdata, unsigned char, wfifo_size);
+ RECREATE (s->wdata, uint8_t, wfifo_size);
s->max_wdata = wfifo_size;
}
- return 0;
}
-int WFIFOSET (int fd, int len)
+void WFIFOSET (int fd, size_t len)
{
struct socket_data *s = session[fd];
if (s->wdata_size + len + 16384 > s->max_wdata)
@@ -409,64 +300,49 @@ int WFIFOSET (int fd, int len)
realloc_fifo (fd, s->max_rdata, s->max_wdata << 1);
printf ("socket: %d wdata expanded to %d bytes.\n", fd, s->max_wdata);
}
- s->wdata_size = (s->wdata_size + (len) + 2048 < s->max_wdata) ?
- s->wdata_size + len : (printf ("socket: %d wdata lost !!\n", fd),
- s->wdata_size);
- return 0;
+ if (s->wdata_size + len + 2048 < s->max_wdata)
+ s->wdata_size += len;
+ else
+ fprintf (stderr, "socket: %d wdata lost !!\n", fd), abort ();
}
-int do_sendrecv (int next)
+void do_sendrecv (uint32_t next)
{
- fd_set rfd, wfd;
- struct timeval timeout;
- int ret, i;
-
- rfd = readfds;
+ fd_set rfd = readfds, wfd;
FD_ZERO (&wfd);
- for (i = 0; i < fd_max; i++)
+ for (int i = 0; i < fd_max; i++)
{
- if (!session[i] && FD_ISSET (i, &readfds))
- {
- printf ("force clr fds %d\n", i);
- FD_CLR (i, &readfds);
- continue;
- }
- if (!session[i])
- continue;
- if (session[i]->wdata_size)
+ if (session[i] && session[i]->wdata_size)
FD_SET (i, &wfd);
}
+ struct timeval timeout;
timeout.tv_sec = next / 1000;
timeout.tv_usec = next % 1000 * 1000;
- ret = select (fd_max, &rfd, &wfd, NULL, &timeout);
- if (ret <= 0)
- return 0;
- for (i = 0; i < fd_max; i++)
+ if (select (fd_max, &rfd, &wfd, NULL, &timeout) <= 0)
+ return;
+ for (int i = 0; i < fd_max; i++)
{
if (!session[i])
continue;
if (FD_ISSET (i, &wfd))
{
- //printf("write:%d\n",i);
if (session[i]->func_send)
//send_from_fifo(i);
session[i]->func_send (i);
}
if (FD_ISSET (i, &rfd))
{
- //printf("read:%d\n",i);
if (session[i]->func_recv)
//recv_to_fifo(i);
+ //or connect_client(i);
session[i]->func_recv (i);
}
}
- return 0;
}
-int do_parsepacket (void)
+void do_parsepacket (void)
{
- int i;
- for (i = 0; i < fd_max; i++)
+ for (int i = 0; i < fd_max; i++)
{
if (!session[i])
continue;
@@ -476,76 +352,54 @@ int do_parsepacket (void)
printf ("Session #%d timed out\n", i);
session[i]->eof = 1;
}
- if (session[i]->rdata_size == 0 && session[i]->eof == 0)
+ if (!session[i]->rdata_size && !session[i]->eof)
continue;
if (session[i]->func_parse)
{
session[i]->func_parse (i);
+ /// some func_parse may call delete_session
if (!session[i])
continue;
}
+ /// Reclaim buffer space for what was read
RFIFOFLUSH (i);
}
- return 0;
}
void do_socket (void)
{
FD_ZERO (&readfds);
- currentuse = 2;
+ currentuse = 3;
}
-int RFIFOSKIP (int fd, int len)
+void RFIFOSKIP (int fd, size_t len)
{
struct socket_data *s = session[fd];
+ s->rdata_pos += len;
- if (s->rdata_size - s->rdata_pos - len < 0)
+ if (s->rdata_size < s->rdata_pos)
{
fprintf (stderr, "too many skip\n");
- exit (1);
+ abort ();
}
-
- s->rdata_pos = s->rdata_pos + len;
-
- return 0;
}
-int Net_Init (void)
+void fclose_ (FILE * fp)
{
-#ifdef LCCWIN32
- /* Start up the windows networking */
- WORD version_wanted = MAKEWORD (1, 1);
- WSADATA wsaData;
-
- if (WSAStartup (version_wanted, &wsaData) != 0)
- {
- printf ("SYSERR: WinSock not available!\n");
- exit (1);
- }
-#endif
-
- return (0);
-}
-
-int fclose_ (FILE * fp)
-{
- int res = fclose (fp);
- if (res == 0)
- currentuse--;
-// printf("file closed: used: %d\n",currentuse);
- return res;
+ if (fclose (fp))
+ perror ("fclose"), abort ();
+ currentuse--;
}
FILE *fopen_ (const char *path, const char *mode)
{
FILE *f = fopen (path, mode);
- if (f != NULL)
+ if (f)
currentuse++;
-// printf("file opened: used: %d\n",currentuse);
return f;
}
-int free_fds ()
+bool free_fds ()
{
- return (currentuse + 1 < SOFT_LIMIT) ? 1 : 0;
+ return currentuse < SOFT_LIMIT;
}
diff --git a/src/common/socket.h b/src/common/socket.h
index aa4f91f..0e15f5b 100644
--- a/src/common/socket.h
+++ b/src/common/socket.h
@@ -1,110 +1,135 @@
-// original : core.h 2003/03/14 11:55:25 Rev 1.4
-
-#ifndef _SOCKET_H_
-#define _SOCKET_H_
-
-#include <stdio.h>
-
-#ifdef LCCWIN32
-#include <winsock.h>
-#else
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#endif
-#include <time.h>
-
-// define declaration
-
-#define RFIFOP(fd,pos) (session[fd]->rdata+session[fd]->rdata_pos+(pos))
-#define RFIFOB(fd,pos) (*(unsigned char*)(session[fd]->rdata+session[fd]->rdata_pos+(pos)))
-#define RFIFOW(fd,pos) (*(unsigned short*)(session[fd]->rdata+session[fd]->rdata_pos+(pos)))
-#define RFIFOL(fd,pos) (*(unsigned int*)(session[fd]->rdata+session[fd]->rdata_pos+(pos)))
-//#define RFIFOSKIP(fd,len) ((session[fd]->rdata_size-session[fd]->rdata_pos-(len)<0) ? (fprintf(stderr,"too many skip\n"),exit(1)) : (session[fd]->rdata_pos+=(len)))
-#define RFIFOREST(fd) (session[fd]->rdata_size-session[fd]->rdata_pos)
-#define RFIFOFLUSH(fd) (memmove(session[fd]->rdata,RFIFOP(fd,0),RFIFOREST(fd)),session[fd]->rdata_size=RFIFOREST(fd),session[fd]->rdata_pos=0)
-#define RFIFOSPACE(fd) (session[fd]->max_rdata-session[fd]->rdata_size)
-#define RBUFP(p,pos) (((unsigned char*)(p))+(pos))
-#define RBUFB(p,pos) (*(unsigned char*)RBUFP((p),(pos)))
-#define RBUFW(p,pos) (*(unsigned short*)RBUFP((p),(pos)))
-#define RBUFL(p,pos) (*(unsigned int*)RBUFP((p),(pos)))
-
-#define WFIFOSPACE(fd) (session[fd]->max_wdata-session[fd]->wdata_size)
-#define WFIFOP(fd,pos) (session[fd]->wdata+session[fd]->wdata_size+(pos))
-#define WFIFOB(fd,pos) (*(unsigned char*)(session[fd]->wdata+session[fd]->wdata_size+(pos)))
-#define WFIFOW(fd,pos) (*(unsigned short*)(session[fd]->wdata+session[fd]->wdata_size+(pos)))
-#define WFIFOL(fd,pos) (*(unsigned int*)(session[fd]->wdata+session[fd]->wdata_size+(pos)))
-// use function instead of macro.
-//#define WFIFOSET(fd,len) (session[fd]->wdata_size = (session[fd]->wdata_size+(len)+2048 < session[fd]->max_wdata) ? session[fd]->wdata_size+len : session[fd]->wdata_size)
-#define WBUFP(p,pos) (((unsigned char*)(p))+(pos))
-#define WBUFB(p,pos) (*(unsigned char*)WBUFP((p),(pos)))
-#define WBUFW(p,pos) (*(unsigned short*)WBUFP((p),(pos)))
-#define WBUFL(p,pos) (*(unsigned int*)WBUFP((p),(pos)))
-
-#ifdef __INTERIX
-#define FD_SETSIZE 4096
-#endif // __INTERIX
-
-/* Removed Cygwin FD_SETSIZE declarations, now are directly passed on to the compiler through Makefile [Valaris] */
+#ifndef SOCKET_H
+#define SOCKET_H
+
+# include "sanity.h"
+
+# include <stdio.h>
+
+# include <sys/types.h>
+# include <sys/socket.h>
+# include <netinet/in.h>
+
+# include <time.h>
+
+/// Check how much can be read
+# define RFIFOREST(fd) (session[fd]->rdata_size-session[fd]->rdata_pos)
+/// Read from the queue
+# define RFIFOP(fd,pos) (session[fd]->rdata+session[fd]->rdata_pos+(pos))
+# define RFIFOB(fd,pos) (*(uint8_t*)(RFIFOP(fd, pos)))
+# define RFIFOW(fd,pos) (*(uint16_t*)(RFIFOP(fd, pos)))
+# define RFIFOL(fd,pos) (*(uint32_t*)(RFIFOP(fd, pos)))
+/// Done reading
+void RFIFOSKIP (int fd, size_t len);
+/// Internal - clean up by discarding handled bytes
+// Atm this is also called in char/char.c, but that is unnecessary
+# define RFIFOFLUSH(fd) (memmove(session[fd]->rdata,RFIFOP(fd,0),RFIFOREST(fd)),\
+session[fd]->rdata_size=RFIFOREST(fd),\
+session[fd]->rdata_pos=0)
+
+/// Used internally - how much room there is to read more data
+# define RFIFOSPACE(fd) (session[fd]->max_rdata-session[fd]->rdata_size)
+
+/// Read from an arbitrary buffer
+# define RBUFP(p,pos) (((uint8_t*)(p))+(pos))
+# define RBUFB(p,pos) (*(uint8_t*)RBUFP((p),(pos)))
+# define RBUFW(p,pos) (*(uint16_t*)RBUFP((p),(pos)))
+# define RBUFL(p,pos) (*(uint32_t*)RBUFP((p),(pos)))
+
+
+
+/// Unused - check how much data can be written
+# define WFIFOSPACE(fd) (session[fd]->max_wdata-session[fd]->wdata_size)
+/// Write to the queue
+# define WFIFOP(fd,pos) (session[fd]->wdata+session[fd]->wdata_size+(pos))
+# define WFIFOB(fd,pos) (*(uint8_t*)(WFIFOP(fd,pos)))
+# define WFIFOW(fd,pos) (*(uint16_t*)(WFIFOP(fd,pos)))
+# define WFIFOL(fd,pos) (*(uint32_t*)(WFIFOP(fd,pos)))
+/// Finish writing
+void WFIFOSET (int fd, size_t len);
+
+/// Write to an arbitrary buffer
+#define WBUFP(p,pos) (((uint8_t*)(p))+(pos))
+#define WBUFB(p,pos) (*(uint8_t*)WBUFP((p),(pos)))
+#define WBUFW(p,pos) (*(uint16_t*)WBUFP((p),(pos)))
+#define WBUFL(p,pos) (*(uint32_t*)WBUFP((p),(pos)))
// Struct declaration
struct socket_data
{
- int eof;
+ /// Checks whether a newly-connected socket actually does anything
time_t created;
- int connected;
- unsigned char *rdata, *wdata;
- int max_rdata, max_wdata;
- int rdata_size, wdata_size;
- int rdata_pos;
- struct sockaddr_in client_addr;
- int (*func_recv) (int);
- int (*func_send) (int);
- int (*func_parse) (int);
- void *session_data;
-};
+ bool connected;
-// Data prototype declaration
+ /// Flag needed since structure must be freed in a server-dependent manner
+ bool eof;
-#ifdef LCCWIN32
+ /// Since this is a single-threaded application, it can't block
+ /// These are the read/write queues
+ uint8_t *rdata, *wdata;
+ size_t max_rdata, max_wdata;
+ /// How much is actually in the queue
+ size_t rdata_size, wdata_size;
+ /// How much has already been read from the queue
+ /// Note that there is no need for a wdata_pos
+ size_t rdata_pos;
-#undef FD_SETSIZE
-#define FD_SETSIZE 4096
+ struct sockaddr_in client_addr;
-#endif
+ /// Send or recieve
+ /// Only called when select() indicates the socket is ready
+ /// If, after that, nothing is read, it sets eof
+ // These could probably be hard-coded with a little work
+ void (*func_recv) (int);
+ void (*func_send) (int);
+ /// This is the important one
+ /// Set to different functions depending on whether the connection
+ /// is a player or a server/ladmin
+ /// Can be set explicitly or via set_defaultparse
+ void (*func_parse) (int);
+ /// Server-specific data type
+ void *session_data;
+};
// save file descriptors for important stuff
-#define SOFT_LIMIT (FD_SETSIZE - 50)
+# define SOFT_LIMIT (FD_SETSIZE - 50)
// socket timeout to establish a full connection in seconds
-#define CONNECT_TIMEOUT 15
+# define CONNECT_TIMEOUT 15
+/// Everyone who has connected
+// note: call delete_session(i) to null out an element
extern struct socket_data *session[FD_SETSIZE];
-extern int rfifo_size, wfifo_size;
+/// Maximum used FD, +1
extern int fd_max;
-// Function prototype declaration
-
-int make_listen_port (int);
-int make_connection (long, int);
-int delete_session (int);
-int realloc_fifo (int fd, int rfifo_size, int wfifo_size);
-int WFIFOSET (int fd, int len);
-int RFIFOSKIP (int fd, int len);
-
-int do_sendrecv (int next);
-int do_parsepacket (void);
+/// open a socket, bind, and listen. Return an fd, or -1 if socket() fails,
+/// but exit if bind() or listen() fails
+int make_listen_port (uint16_t port);
+/// Connect to an address, return a connected socket or -1
+// FIXME - this is IPv4 only!
+int make_connection (uint32_t ip, uint16_t port);
+/// free() the structure and close() the fd
+void delete_session (int);
+/// Make a the internal queues bigger
+void realloc_fifo (int fd, size_t rfifo_size, size_t wfifo_size);
+/// Update all sockets that can be read/written from the queues
+void do_sendrecv (uint32_t next);
+/// Call the parser function for every socket that has read data
+void do_parsepacket (void);
+
+/// An init function
void do_socket (void);
-void set_defaultparse (int (*defaultparse) (int));
+/// Change the default parser for newly connected clients
+// typically called once per server, but individual clients may identify
+// themselves as servers
+void set_defaultparse (void (*defaultparse) (int));
-int Net_Init (void);
-
-int fclose_ (FILE * fp);
+/// Wrappers to track number of free FDs
+void fclose_ (FILE * fp);
FILE *fopen_ (const char *path, const char *mode);
+bool free_fds ();
-int free_fds ();
-
-#endif // _SOCKET_H_
+#endif // SOCKET_H
diff --git a/src/common/timer.c b/src/common/timer.c
index fca6f42..bf21c8e 100644
--- a/src/common/timer.c
+++ b/src/common/timer.c
@@ -1,184 +1,127 @@
-// $Id: timer.c,v 1.1.1.1 2004/09/10 17:44:49 MagicalTux Exp $
-// original : core.c 2003/02/26 18:03:12 Rev 1.7
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
-#ifdef LCCWIN32
-#include <winsock.h>
-#else
#include <sys/socket.h>
#include <sys/time.h>
-#endif
#include "timer.h"
#include "utils.h"
-#ifdef MEMWATCH
-#include "memwatch.h"
-#endif
-
static struct TimerData *timer_data;
-static int timer_data_max, timer_data_num;
-static int *free_timer_list;
-static int free_timer_list_max, free_timer_list_pos;
-
-static int timer_heap_max;
-static int *timer_heap = NULL;
-
-// for debug
-struct timer_func_list
-{
- int (*func) (int, unsigned int, int, int);
- struct timer_func_list *next;
- char *name;
-};
-static struct timer_func_list *tfl_root;
-
-#if defined(LCCWIN32)
-void gettimeofday (struct timeval *t, struct timezone *dummy)
-{
- DWORD millisec = GetTickCount ();
-
- t->tv_sec = (int) (millisec / 1000);
- t->tv_usec = (millisec % 1000) * 1000;
-}
-
-#endif
-
-//
-int add_timer_func_list (int (*func) (int, unsigned int, int, int),
- char *name)
-{
- struct timer_func_list *tfl;
-
- CREATE (tfl, struct timer_func_list, 1);
- CREATE (tfl->name, char, strlen (name) + 1);
-
- tfl->next = tfl_root;
- tfl->func = func;
- strcpy (tfl->name, name);
- tfl_root = tfl;
-
- return 0;
-}
-
-char *search_timer_func_list (int (*func) (int, unsigned int, int, int))
-{
- struct timer_func_list *tfl;
- for (tfl = tfl_root; tfl; tfl = tfl->next)
- {
- if (func == tfl->func)
- return tfl->name;
- }
- return "???";
-}
-
-/*----------------------------
- * Get tick time
- *----------------------------*/
-static unsigned int gettick_cache;
-static int gettick_count;
-unsigned int gettick_nocache (void)
+static uint32_t timer_data_max, timer_data_num;
+static timer_id *free_timer_list;
+static uint32_t free_timer_list_max, free_timer_list_pos;
+
+/// Okay, I think I understand this structure now:
+/// the timer heap is a magic queue that allows inserting timers and then popping them in order
+/// designed to copy only log2(N) entries instead of N
+// timer_heap[0] is the size (greatest index into the heap)
+// timer_heap[1] is the first actual element
+// timer_heap_max increases 256 at a time and never decreases
+static uint32_t timer_heap_max = 256;
+/// FIXME: refactor the code to put the size in a separate variable
+//nontrivial because indices get multiplied
+static timer_id *timer_heap = NULL;
+
+
+static uint32_t gettick_cache;
+static uint8_t gettick_count = 0;
+
+uint32_t gettick_nocache (void)
{
struct timeval tval;
+ // BUG: This will cause strange behavior if the system clock is changed!
+ // it should be reimplemented in terms of clock_gettime(CLOCK_MONOTONIC, )
gettimeofday (&tval, NULL);
- gettick_count = 256;
+ gettick_count = 255;
return gettick_cache = tval.tv_sec * 1000 + tval.tv_usec / 1000;
}
-unsigned int gettick (void)
+uint32_t gettick (void)
{
- gettick_count--;
- if (gettick_count < 0)
- return gettick_nocache ();
- return gettick_cache;
+ if (gettick_count--)
+ return gettick_cache;
+ return gettick_nocache ();
}
-/*======================================
- * CORE : Timer Heap
- *--------------------------------------
- */
-static void push_timer_heap (int index)
+static void push_timer_heap (timer_id index)
{
- int i, h;
-
- if (timer_heap == NULL || timer_heap[0] + 1 >= timer_heap_max)
+ if (timer_heap == NULL)
{
- int first = timer_heap == NULL;
-
timer_heap_max += 256;
- RECREATE (timer_heap, int, timer_heap_max);
- memset (timer_heap + (timer_heap_max - 256), 0, sizeof (int) * 256);
- if (first)
- timer_heap[0] = 0;
+ CREATE (timer_heap, timer_id, timer_heap_max);
}
-
+// timer_heap[0] is the greatest index into the heap, which increases
timer_heap[0]++;
+ if (timer_heap[0] >= timer_heap_max)
+ {
+ timer_heap_max += 256;
+ RECREATE (timer_heap, timer_id, timer_heap_max);
+ memset (timer_heap + (timer_heap_max - 256), 0, 4 * 256);
+ }
- for (h = timer_heap[0] - 1, i = (h - 1) / 2;
- h > 0 && DIFF_TICK (timer_data[index].tick,
- timer_data[timer_heap[i + 1]].tick) < 0;
- i = (h - 1) / 2)
+ timer_id h = timer_heap[0]-1, i = (h - 1) / 2;
+ while (h)
{
+ // avoid wraparound problems, it really means this:
+ // timer_data[index].tick >= timer_data[timer_heap[i+1]].tick
+ if ( DIFF_TICK(timer_data[index].tick, timer_data[timer_heap[i+1]].tick) >= 0)
+ break;
timer_heap[h + 1] = timer_heap[i + 1];
h = i;
+ i = (h - 1) / 2;
}
timer_heap[h + 1] = index;
}
-static int top_timer_heap ()
+static timer_id top_timer_heap ()
{
- if (timer_heap == NULL || timer_heap[0] <= 0)
+ if (!timer_heap || !timer_heap[0])
return -1;
-
return timer_heap[1];
}
-static int pop_timer_heap ()
+static timer_id pop_timer_heap ()
{
- int i, h, k;
- int ret, last;
-
- if (timer_heap == NULL || timer_heap[0] <= 0)
+ if (!timer_heap || !timer_heap[0])
return -1;
- ret = timer_heap[1];
- last = timer_heap[timer_heap[0]];
+ timer_id ret = timer_heap[1];
+ timer_id last = timer_heap[timer_heap[0]];
timer_heap[0]--;
+ uint32_t h, k;
for (h = 0, k = 2; k < timer_heap[0]; k = k * 2 + 2)
{
- if (DIFF_TICK
- (timer_data[timer_heap[k + 1]].tick,
- timer_data[timer_heap[k]].tick) > 0)
+ if (DIFF_TICK(timer_data[timer_heap[k + 1]].tick, timer_data[timer_heap[k]].tick) > 0)
k--;
timer_heap[h + 1] = timer_heap[k + 1], h = k;
}
if (k == timer_heap[0])
timer_heap[h + 1] = timer_heap[k], h = k - 1;
- for (i = (h - 1) / 2;
- h > 0
- && DIFF_TICK (timer_data[timer_heap[i + 1]].tick,
- timer_data[last].tick) > 0; i = (h - 1) / 2)
+ uint32_t i = (h - 1) / 2;
+ while (h)
{
- timer_heap[h + 1] = timer_heap[i + 1], h = i;
+ if (DIFF_TICK(timer_data[timer_heap[i + 1]].tick, timer_data[last].tick) <= 0)
+ timer_heap[h + 1] = timer_heap[i + 1];
+ h = i;
+ i = (h - 1) / 2;
}
timer_heap[h + 1] = last;
return ret;
}
-int add_timer (unsigned int tick, int (*func) (int, unsigned int, int, int),
- int id, int data)
+timer_id add_timer (tick_t tick, timer_func func, custom_id_t id, custom_data_t data)
{
- struct TimerData *td;
- int i;
+ timer_id i;
if (free_timer_list_pos)
{
+ // Retrieve a freed timer id instead of a new one
+ // I think it should be possible to avoid the loop somehow
do
{
i = free_timer_list[--free_timer_list_pos];
@@ -187,12 +130,13 @@ int add_timer (unsigned int tick, int (*func) (int, unsigned int, int, int),
}
else
i = timer_data_num;
+
+ // I have no idea what this is doing
if (i >= timer_data_num)
- for (i = timer_data_num; i < timer_data_max && timer_data[i].type;
- i++);
+ for (i = timer_data_num; i < timer_data_max && timer_data[i].type; i++)
+ ;
if (i >= timer_data_num && i >= timer_data_max)
{
- int j;
if (timer_data_max == 0)
{
timer_data_max = 256;
@@ -202,143 +146,112 @@ int add_timer (unsigned int tick, int (*func) (int, unsigned int, int, int),
{
timer_data_max += 256;
RECREATE (timer_data, struct TimerData, timer_data_max);
- if (timer_data == NULL)
- {
- printf ("out of memory : add_timer timer_data\n");
- exit (1);
- }
memset (timer_data + (timer_data_max - 256), 0,
sizeof (struct TimerData) * 256);
}
- for (j = timer_data_max - 256; j < timer_data_max; j++)
- timer_data[j].type = 0;
}
- td = &timer_data[i];
- td->tick = tick;
- td->func = func;
- td->id = id;
- td->data = data;
- td->type = TIMER_ONCE_AUTODEL;
- td->interval = 1000;
+ timer_data[i].tick = tick;
+ timer_data[i].func = func;
+ timer_data[i].id = id;
+ timer_data[i].data = data;
+ timer_data[i].type = TIMER_ONCE_AUTODEL;
+ timer_data[i].interval = 1000;
push_timer_heap (i);
if (i >= timer_data_num)
timer_data_num = i + 1;
return i;
}
-int add_timer_interval (unsigned int tick,
- int (*func) (int, unsigned int, int, int), int id,
- int data, int interval)
+timer_id add_timer_interval (tick_t tick, timer_func func, custom_id_t id,
+ custom_data_t data, interdb_val_t interval)
{
- int tid;
- tid = add_timer (tick, func, id, data);
+ timer_id tid = add_timer (tick, func, id, data);
timer_data[tid].type = TIMER_INTERVAL;
timer_data[tid].interval = interval;
return tid;
}
-int delete_timer (int id, int (*func) (int, unsigned int, int, int))
+void delete_timer (timer_id id, timer_func func)
{
- if (id <= 0 || id >= timer_data_num)
+ if (id == 0 || id >= timer_data_num)
{
- printf ("delete_timer error : no such timer %d\n", id);
- return -1;
+ fprintf (stderr, "delete_timer error : no such timer %d\n", id);
+ abort ();
}
if (timer_data[id].func != func)
{
- printf
- ("delete_timer error : function dismatch %08x(%s) != %08x(%s)\n",
- (int) timer_data[id].func,
- search_timer_func_list (timer_data[id].func), (int) func,
- search_timer_func_list (func));
- return -2;
+ fprintf (stderr, "Timer mismatch\n");
+ abort ();
}
- // そのうち消えるにまかせる
+ // "to let them disappear" - is this just in case?
timer_data[id].func = NULL;
timer_data[id].type = TIMER_ONCE_AUTODEL;
timer_data[id].tick -= 60 * 60 * 1000;
- return 0;
}
-int addtick_timer (int tid, unsigned int tick)
+tick_t addtick_timer (timer_id tid, interdb_val_t tick)
{
return timer_data[tid].tick += tick;
}
-struct TimerData *get_timer (int tid)
+struct TimerData *get_timer (timer_id tid)
{
return &timer_data[tid];
}
-int do_timer (unsigned int tick)
+interdb_val_t do_timer (tick_t tick)
{
- int i, nextmin = 1000;
-
-#if 0
- static int disp_tick = 0;
- if (DIFF_TICK (disp_tick, tick) < -5000
- || DIFF_TICK (disp_tick, tick) > 5000)
- {
- printf ("timer %d(%d + %d)\n", timer_data_num, timer_heap[0],
- free_timer_list_pos);
- disp_tick = tick;
- }
-#endif
+ timer_id i;
+ /// Number of milliseconds until it calls this again
+ // this says to wait 1 sec if all timers get popped
+ interdb_val_t nextmin = 1000;
- while ((i = top_timer_heap ()) >= 0)
+ while ((i = top_timer_heap ()) != (timer_id)-1)
{
+ // while the heap is not empty and
if (DIFF_TICK (timer_data[i].tick, tick) > 0)
{
+ /// Return the time until the next timer needs to goes off
nextmin = DIFF_TICK (timer_data[i].tick, tick);
break;
}
pop_timer_heap ();
- timer_data[i].type |= TIMER_REMOVE_HEAP;
if (timer_data[i].func)
{
if (DIFF_TICK (timer_data[i].tick, tick) < -1000)
{
- // 1秒以上の大幅な遅延が発生しているので、
- // timer処理タイミングを現在値とする事で
- // 呼び出し時タイミング(引数のtick)相対で処理してる
- // timer関数の次回処理タイミングを遅らせる
- timer_data[i].func (i, tick, timer_data[i].id,
- timer_data[i].data);
+ // If we are too far past the requested tick, call with the current tick instead to fix reregistering problems
+ timer_data[i].func (i, tick, timer_data[i].id, timer_data[i].data);
}
else
{
- timer_data[i].func (i, timer_data[i].tick, timer_data[i].id,
- timer_data[i].data);
+ timer_data[i].func (i, timer_data[i].tick, timer_data[i].id, timer_data[i].data);
}
}
- if (timer_data[i].type & TIMER_REMOVE_HEAP)
+ switch (timer_data[i].type)
{
- switch (timer_data[i].type & ~TIMER_REMOVE_HEAP)
- {
- case TIMER_ONCE_AUTODEL:
- timer_data[i].type = 0;
- if (free_timer_list_pos >= free_timer_list_max)
- {
- free_timer_list_max += 256;
- RECREATE (free_timer_list, int, free_timer_list_max);
- memset (free_timer_list + (free_timer_list_max - 256),
- 0, 256 * sizeof (free_timer_list[0]));
- }
- free_timer_list[free_timer_list_pos++] = i;
- break;
- case TIMER_INTERVAL:
- if (DIFF_TICK (timer_data[i].tick, tick) < -1000)
- {
- timer_data[i].tick = tick + timer_data[i].interval;
- }
- else
- {
- timer_data[i].tick += timer_data[i].interval;
- }
- timer_data[i].type &= ~TIMER_REMOVE_HEAP;
- push_timer_heap (i);
- break;
- }
+ case TIMER_ONCE_AUTODEL:
+ timer_data[i].type = 0;
+ if (free_timer_list_pos >= free_timer_list_max)
+ {
+ free_timer_list_max += 256;
+ RECREATE (free_timer_list, uint32_t, free_timer_list_max);
+ memset (free_timer_list + (free_timer_list_max - 256),
+ 0, 256 * sizeof (timer_id));
+ }
+ free_timer_list[free_timer_list_pos++] = i;
+ break;
+ case TIMER_INTERVAL:
+ if (DIFF_TICK (timer_data[i].tick, tick) < -1000)
+ {
+ timer_data[i].tick = tick + timer_data[i].interval;
+ }
+ else
+ {
+ timer_data[i].tick += timer_data[i].interval;
+ }
+ push_timer_heap (i);
+ break;
}
}
@@ -346,8 +259,3 @@ int do_timer (unsigned int tick)
nextmin = 10;
return nextmin;
}
-
-void timer_final ()
-{
- free (timer_data);
-}
diff --git a/src/common/timer.h b/src/common/timer.h
index c6c4b52..4fa5db8 100644
--- a/src/common/timer.h
+++ b/src/common/timer.h
@@ -1,47 +1,67 @@
-// original : core.h 2003/03/14 11:55:25 Rev 1.4
+#ifndef TIMER_H
+#define TIMER_H
-#ifndef _TIMER_H_
-#define _TIMER_H_
+# include "sanity.h"
-#define BASE_TICK 5
-
-#define TIMER_ONCE_AUTODEL 1
-#define TIMER_INTERVAL 2
-#define TIMER_REMOVE_HEAP 16
-
-#define DIFF_TICK(a,b) ((int)((a)-(b)))
+enum TIMER_TYPE {
+ TIMER_ONCE_AUTODEL = 1,
+ TIMER_INTERVAL = 2,
+};
+/// This is needed to produce a signed result when 2 ticks are subtracted
+# define DIFF_TICK(a,b) ((int32_t)((a)-(b)))
-// Struct declaration
+// TODO replace with signed 64-bit to make code more clear and protect from the future
+typedef uint32_t tick_t;
+typedef uint32_t interdb_val_t;
+typedef uint32_t timer_id;
+// BUG: pointers are stored in here
+typedef int32_t custom_id_t;
+typedef int32_t custom_data_t;
+typedef void (*timer_func) (timer_id, tick_t, custom_id_t, custom_data_t);
struct TimerData
{
- unsigned int tick;
- int (*func) (int, unsigned int, int, int);
- int id;
- int data;
- int type;
- int interval;
- int heap_pos;
+ /// When it will be triggered
+ tick_t tick;
+ /// What will be done
+ timer_func func;
+ /// Arbitrary data. WARNING, callers are stupid and put pointers in here
+ // Should we change to void* or intptr_t ?
+ custom_id_t id;
+ custom_data_t data;
+ /// Type of timer - 0 initially
+ enum TIMER_TYPE type;
+ /// Repeat rate
+ uint32_t interval;
};
-// Function prototype declaration
-
-unsigned int gettick_nocache (void);
-unsigned int gettick (void);
+/// Server time, in milliseconds, since the epoch,
+/// but use of 32-bit integers means it wraps every 49 days.
+// The only external caller of this function is the core.c main loop, but that makes sense
+// in fact, it might make more sense if gettick() ALWAYS returned that cached value
+tick_t gettick_nocache (void);
+/// This function is called enough that it's worth caching the result for
+/// the next 255 times
+tick_t gettick (void);
-int add_timer (unsigned int, int (*)(int, unsigned int, int, int), int, int);
-int add_timer_interval (unsigned int, int (*)(int, unsigned int, int, int),
- int, int, int);
-int delete_timer (int, int (*)(int, unsigned int, int, int));
+timer_id add_timer (tick_t tick, timer_func func, custom_id_t id,
+ custom_data_t data);
+timer_id add_timer_interval (tick_t tick, timer_func func, custom_id_t id,
+ custom_data_t data, interdb_val_t interval);
+void delete_timer (timer_id, timer_func);
-int addtick_timer (int tid, unsigned int tick);
-struct TimerData *get_timer (int tid);
+tick_t addtick_timer (timer_id tid, interdb_val_t tick);
+struct TimerData *get_timer (timer_id tid);
-int do_timer (unsigned int tick);
+/// Do all timers scheduled before tick, and return the number of milliseconds until the next timer happens
+interdb_val_t do_timer (tick_t tick);
-int add_timer_func_list (int (*)(int, unsigned int, int, int), char *);
-char *search_timer_func_list (int (*)(int, unsigned int, int, int));
+// debugging
+static void add_timer_func_list (timer_func, char *) __attribute__((deprecated));
+static inline void add_timer_func_list (timer_func UNUSED, char *UNUSED) {}
-extern void timer_final ();
+// used to just call free(), which doesn't matter when we're exiting
+static void timer_final () __attribute__((deprecated));
+static inline void timer_final() {};
-#endif // _TIMER_H_
+#endif // TIMER_H
diff --git a/src/common/utils.c b/src/common/utils.c
deleted file mode 100644
index 1433a5e..0000000
--- a/src/common/utils.c
+++ /dev/null
@@ -1,121 +0,0 @@
-#include <string.h>
-#include "utils.h"
-#include <stdio.h>
-
-void dump (unsigned char *buffer, int num)
-{
- int icnt, jcnt;
-
- printf
- (" Hex ASCII\n");
- printf
- (" ----------------------------------------------- ----------------");
-
- for (icnt = 0; icnt < num; icnt += 16)
- {
- printf ("\n%p ", &buffer[icnt]);
- for (jcnt = icnt; jcnt < icnt + 16; ++jcnt)
- {
- if (jcnt < num)
- {
- printf ("%02hX ", buffer[jcnt]);
- }
- else
- printf (" ");
- }
-
- printf (" | ");
-
- for (jcnt = icnt; jcnt < icnt + 16; ++jcnt)
- {
- if (jcnt < num)
- {
- if (buffer[jcnt] > 31 && buffer[jcnt] < 127)
- printf ("%c", buffer[jcnt]);
- else
- printf (".");
- }
- else
- printf (" ");
- }
- }
- printf ("\n");
-}
-
-#ifdef LCCWIN32
-char *rindex (char *str, char c)
-{
- char *sptr;
-
- sptr = str;
- while (*sptr)
- ++sptr;
- if (c == '\0')
- return (sptr);
- while (str != sptr)
- if (*sptr-- == c)
- return (++sptr);
- return (NULL);
-}
-
-int strcasecmp (const char *arg1, const char *arg2)
-{
- int chk, i;
-
- if (arg1 == NULL || arg2 == NULL)
- {
- printf ("SYSERR: str_cmp() passed a NULL pointer, %p or %p.\n", arg1,
- arg2);
- return (0);
- }
-
- for (i = 0; arg1[i] || arg2[i]; i++)
- if ((chk = LOWER (arg1[i]) - LOWER (arg2[i])) != 0)
- return (chk); /* not equal */
-
- return (0);
-}
-
-int strncasecmp (const char *arg1, const char *arg2, int n)
-{
- int chk, i;
-
- if (arg1 == NULL || arg2 == NULL)
- {
- printf ("SYSERR: strn_cmp() passed a NULL pointer, %p or %p.\n", arg1,
- arg2);
- return (0);
- }
-
- for (i = 0; (arg1[i] || arg2[i]) && (n > 0); i++, n--)
- if ((chk = LOWER (arg1[i]) - LOWER (arg2[i])) != 0)
- return (chk); /* not equal */
-
- return (0);
-}
-
-void str_upper (char *name)
-{
-
- int len = strlen (name);
- while (len--)
- {
- if (*name >= 'a' && *name <= 'z')
- *name -= ('a' - 'A');
- name++;
- }
-}
-
-void str_lower (char *name)
-{
- int len = strlen (name);
-
- while (len--)
- {
- if (*name >= 'A' && *name <= 'Z')
- *name += ('a' - 'A');
- name++;
- }
-}
-
-#endif
diff --git a/src/common/utils.h b/src/common/utils.h
index 10c10ad..961d960 100644
--- a/src/common/utils.h
+++ b/src/common/utils.h
@@ -1,39 +1,18 @@
-#include "mt_rand.h"
-
-#ifndef NULL
-#define NULL (void *)0
-#endif
-
-#define LOWER(c) (((c)>='A' && (c) <= 'Z') ? ((c)+('a'-'A')) : (c))
-#define UPPER(c) (((c)>='a' && (c) <= 'z') ? ((c)+('A'-'a')) : (c) )
-
-/* strcasecmp -> stricmp -> str_cmp */
-
-#ifdef LCCWIN32
-int strcasecmp (const char *arg1, const char *arg2);
-int strncasecmp (const char *arg1, const char *arg2, int n);
-void str_upper (char *name);
-void str_lower (char *name);
-char *rindex (char *str, char c);
-#endif
-
-void dump (unsigned char *buffer, int num);
-
-#define CREATE(result, type, number) do {\
- if ((number) * sizeof(type) <= 0) \
- printf("SYSERR: Zero bytes or less requested at %s:%d.\n", __FILE__, __LINE__); \
+#ifndef UTILS_H
+#define UTILS_H
+/*
+Notes about memory allocation in tmwAthena:
+There used to be 3 sources of allocation: these macros,
+a{C,M,Re}alloc in common/malloc.{h,c}, and direct calls.
+I deleted malloc.{h,c} because it was redundant;
+future calls should either use this or depend on the coming segfault.
+*/
+# define CREATE(result, type, number) \
if (!((result) = (type *) calloc ((number), sizeof(type)))) \
- { perror("SYSERR: malloc failure"); abort(); } } while(0)
+ { perror("SYSERR: malloc failure"); abort(); } else (void)0
-#define RECREATE(result,type,number) do {\
+# define RECREATE(result,type,number) \
if (!((result) = (type *) realloc ((result), sizeof(type) * (number))))\
- { printf("SYSERR: realloc failure"); abort(); } } while(0)
+ { perror("SYSERR: realloc failure"); abort(); } else (void)0
-/*
- * ModuloRand and ModuloPlusRand. These macros are used to replace the
- * vast number of calls to rand()%mod ..
- * MRAND(10), returns 0-9.
- * MPRAND(5,10) returns 5-14.
- */
-#define MRAND(mod) (int) (mt_random() % (mod))
-#define MPRAND(add, mod) add + MRAND(mod)
+#endif //UTILS_H
diff --git a/src/common/version.h b/src/common/version.h
index cd9808e..46165aa 100644
--- a/src/common/version.h
+++ b/src/common/version.h
@@ -1,27 +1,24 @@
-// $Id: version.h,v 1.2 2004/09/22 09:49:06 PoW Exp $
-#ifndef _VERSION_H_
-#define _VERSION_H_
+/// Some constants to identify the version of (e)Athena
+/// The values are different if the client connects (-1,'T','M','W',flags32)
+// These numbers have never been changed while TMW
+#ifndef VERSION_H
+#define VERSION_H
+//When a server receives a 0x7530 packet from an admin connection,
+//it sends an 0x7531 packet with the following bytes
+# define ATHENA_MAJOR_VERSION 1 // Major Version
+# define ATHENA_MINOR_VERSION 0 // Minor Version
+# define ATHENA_REVISION 0 // Revision
-#define ATHENA_MAJOR_VERSION 1 // Major Version
-#define ATHENA_MINOR_VERSION 0 // Minor Version
-#define ATHENA_REVISION 0 // Revision
+# define ATHENA_RELEASE_FLAG 1 // 1=Develop,0=Stable
+# define ATHENA_OFFICIAL_FLAG 1 // 1=Mod,0=Official
-#define ATHENA_RELEASE_FLAG 1 // 1=Develop,0=Stable
-#define ATHENA_OFFICIAL_FLAG 1 // 1=Mod,0=Official
+// and a bitmask of these (the char server sends char and inter)
+# define ATHENA_SERVER_LOGIN 1 // login server
+# define ATHENA_SERVER_CHAR 2 // char server
+# define ATHENA_SERVER_INTER 4 // inter server
+# define ATHENA_SERVER_MAP 8 // map server
-#define ATHENA_SERVER_LOGIN 1 // login server
-#define ATHENA_SERVER_CHAR 2 // char server
-#define ATHENA_SERVER_INTER 4 // inter server
-#define ATHENA_SERVER_MAP 8 // map server
+// and this as two bytes
+# define ATHENA_MOD_VERSION 1052 // mod version (patch No.)
-// ATHENA_MOD_VERSIONはパッチ番号です。
-// これは無理に変えなくても気が向いたら変える程度の扱いで。
-// (毎回アップロードの度に変更するのも面倒と思われるし、そもそも
-//  この項目を参照する人がいるかどうかで疑問だから。)
-// その程度の扱いなので、サーバーに問い合わせる側も、あくまで目安程度の扱いで
-// あんまり信用しないこと。
-// 鯖snapshotの時や、大きな変更があった場合は設定してほしいです。
-// C言語の仕様上、最初に0を付けると8進数になるので間違えないで下さい。
-#define ATHENA_MOD_VERSION 1052 // mod version (patch No.)
-
-#endif
+#endif // VERSION_H
diff --git a/src/ladmin/Makefile b/src/ladmin/Makefile
index e873e69..4b4d2ec 100644
--- a/src/ladmin/Makefile
+++ b/src/ladmin/Makefile
@@ -2,8 +2,8 @@ include ../../make.defs
all: ladmin
-COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/malloc.o ../common/mt_rand.o
-COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/malloc.h ../common/mt_rand.h
+COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/mt_rand.o
+COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/mt_rand.h
ladmin: ladmin.o ../common/md5calc.o $(COMMON_OBJ)
ladmin.o: ladmin.c ladmin.h ../common/md5calc.h $(COMMON_H)
diff --git a/src/ladmin/ladmin.c b/src/ladmin/ladmin.c
index 6848152..49f52ca 100644
--- a/src/ladmin/ladmin.c
+++ b/src/ladmin/ladmin.c
@@ -36,7 +36,7 @@
#include "memwatch.h"
#endif
-extern int eathena_interactive_session; // from core.c
+int eathena_interactive_session; // from core.c
#define Iprintf if (eathena_interactive_session) printf
//-------------------------------INSTRUCTIONS------------------------------
@@ -4737,7 +4737,7 @@ int prompt ()
//-------------------------------------------------------------
// Function: Parse receiving informations from the login-server
//-------------------------------------------------------------
-int parse_fromlogin (int fd)
+void parse_fromlogin (int fd)
{
struct char_session_data *sd;
@@ -4775,7 +4775,7 @@ int parse_fromlogin (int fd)
{
case 0x7919: // answer of a connection request
if (RFIFOREST (fd) < 3)
- return 0;
+ return;
if (RFIFOB (fd, 2) != 0)
{
if (defaultlanguage == 'F')
@@ -4834,7 +4834,7 @@ int parse_fromlogin (int fd)
#ifdef PASSWORDENC
case 0x01dc: // answer of a coding key request
if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
- return 0;
+ return;
{
char md5str[64] =
"", md5bin[32], md5key[RFIFOW (fd, 2) - 4 + 1];
@@ -4851,7 +4851,7 @@ int parse_fromlogin (int fd)
sizeof (loginserveradminpassword));
strcat (md5str, RFIFOP (fd, 4));
}
- MD5_String2binary (md5str, md5bin);
+ MD5_to_bin(MD5_from_cstring(md5str), md5bin);
WFIFOW (login_fd, 0) = 0x7918; // Request for administation login (encrypted password)
WFIFOW (login_fd, 2) = passenc; // Encrypted type
memcpy (WFIFOP (login_fd, 4), md5bin, 16);
@@ -4880,7 +4880,7 @@ int parse_fromlogin (int fd)
case 0x7531: // Displaying of the version of the login-server
if (RFIFOREST (fd) < 10)
- return 0;
+ return;
Iprintf (" Login-Server [%s:%d]\n", loginserverip,
loginserverport);
if (((int) RFIFOB (login_fd, 5)) == 0)
@@ -4914,7 +4914,7 @@ int parse_fromlogin (int fd)
case 0x7921: // Displaying of the list of accounts
if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
- return 0;
+ return;
if (RFIFOW (fd, 2) < 5)
{
if (defaultlanguage == 'F')
@@ -5064,7 +5064,7 @@ int parse_fromlogin (int fd)
case 0x7931: // Answer of login-server about an account creation
if (RFIFOREST (fd) < 30)
- return 0;
+ return;
if (RFIFOL (fd, 2) == -1)
{
if (defaultlanguage == 'F')
@@ -5111,7 +5111,7 @@ int parse_fromlogin (int fd)
case 0x7933: // Answer of login-server about an account deletion
if (RFIFOREST (fd) < 30)
- return 0;
+ return;
if (RFIFOL (fd, 2) == -1)
{
if (defaultlanguage == 'F')
@@ -5159,7 +5159,7 @@ int parse_fromlogin (int fd)
case 0x7935: // answer of the change of an account password
if (RFIFOREST (fd) < 30)
- return 0;
+ return;
if (RFIFOL (fd, 2) == -1)
{
if (defaultlanguage == 'F')
@@ -5211,7 +5211,7 @@ int parse_fromlogin (int fd)
case 0x7937: // answer of the change of an account state
if (RFIFOREST (fd) < 34)
- return 0;
+ return;
if (RFIFOL (fd, 2) == -1)
{
if (defaultlanguage == 'F')
@@ -5301,7 +5301,7 @@ int parse_fromlogin (int fd)
case 0x7939: // answer of the number of online players
if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
- return 0;
+ return;
{
// Get length of the received packet
int i;
@@ -5360,7 +5360,7 @@ int parse_fromlogin (int fd)
case 0x793b: // answer of the check of a password
if (RFIFOREST (fd) < 30)
- return 0;
+ return;
if (RFIFOL (fd, 2) == -1)
{
if (defaultlanguage == 'F')
@@ -5409,7 +5409,7 @@ int parse_fromlogin (int fd)
case 0x793d: // answer of the change of an account sex
if (RFIFOREST (fd) < 30)
- return 0;
+ return;
if (RFIFOL (fd, 2) == -1)
{
if (defaultlanguage == 'F')
@@ -5463,7 +5463,7 @@ int parse_fromlogin (int fd)
case 0x793f: // answer of the change of an account GM level
if (RFIFOREST (fd) < 30)
- return 0;
+ return;
if (RFIFOL (fd, 2) == -1)
{
if (defaultlanguage == 'F')
@@ -5521,7 +5521,7 @@ int parse_fromlogin (int fd)
case 0x7941: // answer of the change of an account email
if (RFIFOREST (fd) < 30)
- return 0;
+ return;
if (RFIFOL (fd, 2) == -1)
{
if (defaultlanguage == 'F')
@@ -5573,7 +5573,7 @@ int parse_fromlogin (int fd)
case 0x7943: // answer of the change of an account memo
if (RFIFOREST (fd) < 30)
- return 0;
+ return;
if (RFIFOL (fd, 2) == -1)
{
if (defaultlanguage == 'F')
@@ -5622,7 +5622,7 @@ int parse_fromlogin (int fd)
case 0x7945: // answer of an account id search
if (RFIFOREST (fd) < 30)
- return 0;
+ return;
if (RFIFOL (fd, 2) == -1)
{
if (defaultlanguage == 'F')
@@ -5667,7 +5667,7 @@ int parse_fromlogin (int fd)
case 0x7947: // answer of an account name search
if (RFIFOREST (fd) < 30)
- return 0;
+ return;
if (strcmp (RFIFOP (fd, 6), "") == 0)
{
if (defaultlanguage == 'F')
@@ -5712,7 +5712,7 @@ int parse_fromlogin (int fd)
case 0x7949: // answer of an account validity limit set
if (RFIFOREST (fd) < 34)
- return 0;
+ return;
if (RFIFOL (fd, 2) == -1)
{
if (defaultlanguage == 'F')
@@ -5791,7 +5791,7 @@ int parse_fromlogin (int fd)
case 0x794b: // answer of an account ban set
if (RFIFOREST (fd) < 34)
- return 0;
+ return;
if (RFIFOL (fd, 2) == -1)
{
if (defaultlanguage == 'F')
@@ -5870,7 +5870,7 @@ int parse_fromlogin (int fd)
case 0x794d: // answer of an account ban date/time changing
if (RFIFOREST (fd) < 34)
- return 0;
+ return;
if (RFIFOL (fd, 2) == -1)
{
if (defaultlanguage == 'F')
@@ -5949,7 +5949,7 @@ int parse_fromlogin (int fd)
case 0x794f: // answer of a broadcast
if (RFIFOREST (fd) < 4)
- return 0;
+ return;
if (RFIFOW (fd, 2) == (unsigned short) -1)
{
if (defaultlanguage == 'F')
@@ -5994,7 +5994,7 @@ int parse_fromlogin (int fd)
case 0x7951: // answer of an account validity limit changing
if (RFIFOREST (fd) < 34)
- return 0;
+ return;
if (RFIFOL (fd, 2) == -1)
{
if (defaultlanguage == 'F')
@@ -6082,7 +6082,7 @@ int parse_fromlogin (int fd)
case 0x7953: // answer of a request about informations of an account (by account name/id)
if (RFIFOREST (fd) < 150
|| RFIFOREST (fd) < (150 + RFIFOW (fd, 148)))
- return 0;
+ return;
{
char userid[24], error_message[20], lastlogin[24],
last_ip[16], email[40], memo[255];
@@ -6328,14 +6328,12 @@ int parse_fromlogin (int fd)
("Remote administration has been disconnected (unknown packet).\n");
ladmin_log ("'End of connection, unknown packet." RETCODE);
session[fd]->eof = 1;
- return 0;
+ return;
}
}
// if we don't wait new packets, do the prompt
prompt ();
-
- return 0;
}
//------------------------------------
@@ -6406,12 +6404,12 @@ int Connect_login_server ()
//-------------------------------------------------
int config_switch (const char *str)
{
- if (strcmpi (str, "on") == 0 || strcmpi (str, "yes") == 0
- || strcmpi (str, "oui") == 0 || strcmpi (str, "ja") == 0
- || strcmpi (str, "si") == 0)
+ if (strcasecmp (str, "on") == 0 || strcasecmp (str, "yes") == 0
+ || strcasecmp (str, "oui") == 0 || strcasecmp (str, "ja") == 0
+ || strcasecmp (str, "si") == 0)
return 1;
- if (strcmpi (str, "off") == 0 || strcmpi (str, "no") == 0
- || strcmpi (str, "non") == 0 || strcmpi (str, "nein") == 0)
+ if (strcasecmp (str, "off") == 0 || strcasecmp (str, "no") == 0
+ || strcasecmp (str, "non") == 0 || strcasecmp (str, "nein") == 0)
return 0;
return atoi (str);
@@ -6463,7 +6461,7 @@ int ladmin_config_read (const char *cfgName)
remove_control_chars (w1);
remove_control_chars (w2);
- if (strcmpi (w1, "login_ip") == 0)
+ if (strcasecmp (w1, "login_ip") == 0)
{
struct hostent *h = gethostbyname (w2);
if (h != NULL)
@@ -6495,11 +6493,11 @@ int ladmin_config_read (const char *cfgName)
else
memcpy (loginserverip, w2, 16);
}
- else if (strcmpi (w1, "login_port") == 0)
+ else if (strcasecmp (w1, "login_port") == 0)
{
loginserverport = atoi (w2);
}
- else if (strcmpi (w1, "admin_pass") == 0)
+ else if (strcasecmp (w1, "admin_pass") == 0)
{
strncpy (loginserveradminpassword, w2,
sizeof (loginserveradminpassword));
@@ -6507,25 +6505,25 @@ int ladmin_config_read (const char *cfgName)
1] = '\0';
#ifdef PASSWORDENC
}
- else if (strcmpi (w1, "passenc") == 0)
+ else if (strcasecmp (w1, "passenc") == 0)
{
passenc = atoi (w2);
if (passenc < 0 || passenc > 2)
passenc = 0;
#endif
}
- else if (strcmpi (w1, "defaultlanguage") == 0)
+ else if (strcasecmp (w1, "defaultlanguage") == 0)
{
if (w2[0] == 'F' || w2[0] == 'E')
defaultlanguage = w2[0];
}
- else if (strcmpi (w1, "ladmin_log_filename") == 0)
+ else if (strcasecmp (w1, "ladmin_log_filename") == 0)
{
strncpy (ladmin_log_filename, w2,
sizeof (ladmin_log_filename));
ladmin_log_filename[sizeof (ladmin_log_filename) - 1] = '\0';
}
- else if (strcmpi (w1, "date_format") == 0)
+ else if (strcasecmp (w1, "date_format") == 0)
{ // note: never have more than 19 char for the date!
switch (atoi (w2))
{
@@ -6543,7 +6541,7 @@ int ladmin_config_read (const char *cfgName)
break;
}
}
- else if (strcmpi (w1, "import") == 0)
+ else if (strcasecmp (w1, "import") == 0)
{
ladmin_config_read (w2);
}
@@ -6568,7 +6566,7 @@ int ladmin_config_read (const char *cfgName)
//--------------------------------------
// Function called at exit of the server
//--------------------------------------
-void do_final (void)
+void term_func (void)
{
if (already_exit_function == 0)
@@ -6601,6 +6599,7 @@ void do_final (void)
//------------------------
int do_init (int argc, char **argv)
{
+ eathena_interactive_session = isatty (0);
// read ladmin configuration
ladmin_config_read ((argc > 1) ? argv[1] : LADMIN_CONF_NAME);
@@ -6616,7 +6615,6 @@ int do_init (int argc, char **argv)
srand (time (NULL));
- set_termfunc (do_final);
set_defaultparse (parse_fromlogin);
if (defaultlanguage == 'F')
@@ -6645,7 +6643,7 @@ int do_init (int argc, char **argv)
Connect_login_server ();
- atexit (do_final);
+ atexit (term_func);
return 0;
}
diff --git a/src/login/Makefile b/src/login/Makefile
index 8a7e5a6..bc1e7c0 100644
--- a/src/login/Makefile
+++ b/src/login/Makefile
@@ -2,8 +2,8 @@ include ../../make.defs
all: login
-COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/lock.o ../common/malloc.o ../common/mt_rand.o ../common/md5calc.o
-COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/lock.h ../common/malloc.h ../common/mt_rand.h ../common/md5calc.h
+COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o ../common/lock.o ../common/mt_rand.o ../common/md5calc.o
+COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h ../common/db.h ../common/lock.h ../common/mt_rand.h ../common/md5calc.h
login: $(COMMON_OBJ)
login.o: login.c login.h $(COMMON_H)
diff --git a/src/login/login.c b/src/login/login.c
index 480533e..6788371 100644
--- a/src/login/login.c
+++ b/src/login/login.c
@@ -219,12 +219,7 @@ int read_gm_account ()
if ((line[0] == '/' && line[1] == '/') || line[0] == '\0'
|| line[0] == '\n' || line[0] == '\r')
continue;
- p = calloc (sizeof (struct gm_account), 1);
- if (p == NULL)
- {
- printf ("read_gm_account: memory allocation failure (malloc)!\n");
- exit (0);
- }
+ CREATE (p, struct gm_account, 1);
if (sscanf (line, "%d %d", &p->account_id, &p->level) != 2
&& sscanf (line, "%d: %d", &p->account_id, &p->level) != 2)
printf
@@ -492,7 +487,7 @@ int search_account_index (char *account_name)
for (i = 0; i < auth_num; i++)
{
// Without case sensitive check (increase the number of similar account names found)
- if (stricmp (auth_dat[i].userid, account_name) == 0)
+ if (strcasecmp (auth_dat[i].userid, account_name) == 0)
{
// Strict comparison (if found, we finish the function immediatly with correct value)
if (strcmp (auth_dat[i].userid, account_name) == 0)
@@ -551,7 +546,7 @@ int mmo_auth_init (void)
int GM_count = 0;
int server_count = 0;
- auth_dat = calloc (sizeof (struct auth_dat) * 256, 1);
+ CREATE (auth_dat, struct auth_dat, 256);
auth_max = 256;
fp = fopen_ (account_filename, "r");
@@ -650,8 +645,7 @@ int mmo_auth_init (void)
if (auth_num >= auth_max)
{
auth_max += 256;
- auth_dat =
- realloc (auth_dat, sizeof (struct auth_dat) * auth_max);
+ RECREATE (auth_dat, struct auth_dat, auth_max);
}
memset (&auth_dat[auth_num], '\0', sizeof (struct auth_dat));
@@ -830,8 +824,7 @@ int mmo_auth_init (void)
if (auth_num >= auth_max)
{
auth_max += 256;
- auth_dat =
- realloc (auth_dat, sizeof (struct auth_dat) * auth_max);
+ RECREATE (auth_dat, struct auth_dat, auth_max);
}
memset (&auth_dat[auth_num], '\0', sizeof (struct auth_dat));
@@ -1046,12 +1039,18 @@ void mmo_auth_sync (void)
return;
}
-// We want to sync the DB to disk as little as possible as it's fairly
+void term_func (void)
+{
+ mmo_auth_sync ();
+}
+
+
+// We want to sync the DB to disk as little as possible as it's fairly
// resource intensive. therefore most player-triggerable events that
// update the account DB will not immideately trigger a save. Instead
// we save periodicly on a timer.
//-----------------------------------------------------
-int check_auth_sync (int tid, unsigned int tick, int id, int data)
+void check_auth_sync (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
if (pid != 0)
{
@@ -1061,14 +1060,14 @@ int check_auth_sync (int tid, unsigned int tick, int id, int data)
// Need to check status too?
if (temp == 0)
{
- return 0;
+ return;
}
}
// This can take a lot of time. Fork a child to handle the work and return at once
// If we're unable to fork just continue running the function normally
if ((pid = fork ()) > 0)
- return 0;
+ return;
mmo_auth_sync ();
@@ -1076,7 +1075,7 @@ int check_auth_sync (int tid, unsigned int tick, int id, int data)
if (pid == 0)
_exit (0);
- return 0;
+ return;
}
//--------------------------------------------------------------------
@@ -1128,14 +1127,14 @@ void send_GM_accounts ()
//-----------------------------------------------------
// Check if GM file account have been changed
//-----------------------------------------------------
-int check_GM_file (int tid, unsigned int tick, int id, int data)
+void check_GM_file (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct stat file_stat;
long new_time;
// if we would not check
if (gm_account_filename_check_timer < 1)
- return 0;
+ return;
// get last modify time/date
if (stat (GM_account_filename, &file_stat))
@@ -1148,8 +1147,6 @@ int check_GM_file (int tid, unsigned int tick, int id, int data)
read_gm_account ();
send_GM_accounts ();
}
-
- return 0;
}
//-------------------------------------
@@ -1164,7 +1161,7 @@ int mmo_auth_new (struct mmo_account *account, char sex, char *email)
if (auth_num >= auth_max)
{
auth_max += 256;
- auth_dat = realloc (auth_dat, sizeof (struct auth_dat) * auth_max);
+ RECREATE (auth_dat, struct auth_dat, auth_max);
}
memset (&auth_dat[i], '\0', sizeof (struct auth_dat));
@@ -1446,7 +1443,7 @@ int mmo_auth (struct mmo_account *account, int fd)
//-------------------------------
// Char-server anti-freeze system
//-------------------------------
-int char_anti_freeze_system (int tid, unsigned int tick, int id, int data)
+void char_anti_freeze_system (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
int i;
@@ -1468,14 +1465,12 @@ int char_anti_freeze_system (int tid, unsigned int tick, int id, int data)
}
}
}
-
- return 0;
}
//--------------------------------
// Packet parsing for char-servers
//--------------------------------
-int parse_fromchar (int fd)
+void parse_fromchar (int fd)
{
int i, j, id;
unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
@@ -1498,7 +1493,7 @@ int parse_fromchar (int fd)
}
close (fd);
delete_session (fd);
- return 0;
+ return;
}
while (RFIFOREST (fd) >= 2)
@@ -1523,7 +1518,7 @@ int parse_fromchar (int fd)
case 0x2712: // request from char-server to authentify an account
if (RFIFOREST (fd) < 19)
- return 0;
+ return;
{
int acc;
acc = RFIFOL (fd, 2); // speed up
@@ -1598,7 +1593,7 @@ int parse_fromchar (int fd)
case 0x2714:
if (RFIFOREST (fd) < 6)
- return 0;
+ return;
//printf("parse_fromchar: Receiving of the users number of the server '%s': %d\n", server[id].name, RFIFOL(fd,2));
server[id].users = RFIFOL (fd, 2);
if (anti_freeze_enable)
@@ -1612,7 +1607,7 @@ int parse_fromchar (int fd)
int acc;
char email[40];
if (RFIFOREST (fd) < 46)
- return 0;
+ return;
acc = RFIFOL (fd, 2); // speed up
memcpy (email, RFIFOP (fd, 6), 40);
email[39] = '\0';
@@ -1649,7 +1644,7 @@ int parse_fromchar (int fd)
}
case 0x2716:
if (RFIFOREST (fd) < 6)
- return 0;
+ return;
//printf("parse_fromchar: E-mail/limited time request from '%s' server (concerned account: %d)\n", server[id].name, RFIFOL(fd,2));
for (i = 0; i < auth_num; i++)
{
@@ -1678,7 +1673,7 @@ int parse_fromchar (int fd)
case 0x2720: // To become GM request
if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
- return 0;
+ return;
{
int acc;
unsigned char buf[10];
@@ -1765,12 +1760,12 @@ int parse_fromchar (int fd)
charif_sendallwos (-1, buf, 10);
}
RFIFOSKIP (fd, RFIFOW (fd, 2));
- return 0;
+ return;
// Map server send information to change an email of an account via char-server
case 0x2722: // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B
if (RFIFOREST (fd) < 86)
- return 0;
+ return;
{
int acc;
char actual_email[40], new_email[40];
@@ -1789,7 +1784,7 @@ int parse_fromchar (int fd)
login_log
("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a invalid new e-mail (account: %d, ip: %s)"
RETCODE, server[id].name, acc, ip);
- else if (strcmpi (new_email, "a@a.com") == 0)
+ else if (strcasecmp (new_email, "a@a.com") == 0)
login_log
("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a default e-mail (account: %d, ip: %s)"
RETCODE, server[id].name, acc, ip);
@@ -1799,7 +1794,7 @@ int parse_fromchar (int fd)
{
if (auth_dat[i].account_id == acc)
{
- if (strcmpi (auth_dat[i].email, actual_email)
+ if (strcasecmp (auth_dat[i].email, actual_email)
== 0)
{
memcpy (auth_dat[i].email, new_email, 40);
@@ -1829,7 +1824,7 @@ int parse_fromchar (int fd)
// Receiving of map-server via char-server a status change resquest (by Yor)
case 0x2724:
if (RFIFOREST (fd) < 10)
- return 0;
+ return;
{
int acc, statut;
acc = RFIFOL (fd, 2);
@@ -1874,11 +1869,11 @@ int parse_fromchar (int fd)
}
RFIFOSKIP (fd, 10);
}
- return 0;
+ return;
case 0x2725: // Receiving of map-server via char-server a ban resquest (by Yor)
if (RFIFOREST (fd) < 18)
- return 0;
+ return;
{
int acc;
acc = RFIFOL (fd, 2);
@@ -1970,11 +1965,11 @@ int parse_fromchar (int fd)
}
RFIFOSKIP (fd, 18);
}
- return 0;
+ return;
case 0x2727: // Change of sex (sex is reversed)
if (RFIFOREST (fd) < 6)
- return 0;
+ return;
{
int acc, sex;
acc = RFIFOL (fd, 2);
@@ -2020,11 +2015,11 @@ int parse_fromchar (int fd)
}
RFIFOSKIP (fd, 6);
}
- return 0;
+ return;
case 0x2728: // We receive account_reg2 from a char-server, and we send them to other char-servers.
if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2))
- return 0;
+ return;
{
int acc, p;
acc = RFIFOL (fd, 4);
@@ -2071,7 +2066,7 @@ int parse_fromchar (int fd)
case 0x272a: // Receiving of map-server via char-server a unban resquest (by Yor)
if (RFIFOREST (fd) < 6)
- return 0;
+ return;
{
int acc;
acc = RFIFOL (fd, 2);
@@ -2103,12 +2098,12 @@ int parse_fromchar (int fd)
}
RFIFOSKIP (fd, 6);
}
- return 0;
+ return;
// request from char-server to change account password
case 0x2740: // 0x2740 <account_id>.L <actual_password>.24B <new_password>.24B
if (RFIFOREST (fd) < 54)
- return 0;
+ return;
{
int acc;
char actual_pass[24], new_pass[24];
@@ -2218,16 +2213,16 @@ int parse_fromchar (int fd)
session[fd]->eof = 1;
printf
("Char-server has been disconnected (unknown packet).\n");
- return 0;
+ return;
}
}
- return 0;
+ return;
}
//---------------------------------------
// Packet parsing for administation login
//---------------------------------------
-int parse_admin (int fd)
+void parse_admin (int fd)
{
int i, j;
unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
@@ -2242,7 +2237,7 @@ int parse_admin (int fd)
delete_session (fd);
printf ("Remote administration has disconnected (session #%d).\n",
fd);
- return 0;
+ return;
}
while (RFIFOREST (fd) >= 2)
@@ -2278,7 +2273,7 @@ int parse_admin (int fd)
case 0x7920: // Request of an accounts list
if (RFIFOREST (fd) < 10)
- return 0;
+ return;
{
int st, ed, len;
int id[auth_num];
@@ -2342,7 +2337,7 @@ int parse_admin (int fd)
case 0x7924:
{ // [Fate] Itemfrob package: change item IDs
if (RFIFOREST (fd) < 10)
- return 0;
+ return;
charif_sendallwos (-1, RFIFOP (fd, 0), 10); // forward package to char servers
RFIFOSKIP (fd, 10);
WFIFOW (fd, 0) = 0x7925;
@@ -2352,7 +2347,7 @@ int parse_admin (int fd)
case 0x7930: // Request for an account creation
if (RFIFOREST (fd) < 91)
- return 0;
+ return;
{
struct mmo_account ma;
ma.userid = RFIFOP (fd, 2);
@@ -2423,7 +2418,7 @@ int parse_admin (int fd)
case 0x7932: // Request for an account deletion
if (RFIFOREST (fd) < 26)
- return 0;
+ return;
WFIFOW (fd, 0) = 0x7933;
WFIFOL (fd, 2) = -1;
account_name = RFIFOP (fd, 2);
@@ -2465,7 +2460,7 @@ int parse_admin (int fd)
case 0x7934: // Request to change a password
if (RFIFOREST (fd) < 50)
- return 0;
+ return;
WFIFOW (fd, 0) = 0x7935;
WFIFOL (fd, 2) = -1;
account_name = RFIFOP (fd, 2);
@@ -2495,7 +2490,7 @@ int parse_admin (int fd)
case 0x7936: // Request to modify a state
if (RFIFOREST (fd) < 50)
- return 0;
+ return;
{
char error_message[20];
int statut;
@@ -2593,7 +2588,7 @@ int parse_admin (int fd)
case 0x793a: // Request to password check
if (RFIFOREST (fd) < 50)
- return 0;
+ return;
WFIFOW (fd, 0) = 0x793b;
WFIFOL (fd, 2) = -1;
account_name = RFIFOP (fd, 2);
@@ -2635,7 +2630,7 @@ int parse_admin (int fd)
case 0x793c: // Request to modify sex
if (RFIFOREST (fd) < 27)
- return 0;
+ return;
WFIFOW (fd, 0) = 0x793d;
WFIFOL (fd, 2) = -1;
account_name = RFIFOP (fd, 2);
@@ -2707,7 +2702,7 @@ int parse_admin (int fd)
case 0x793e: // Request to modify GM level
if (RFIFOREST (fd) < 27)
- return 0;
+ return;
WFIFOW (fd, 0) = 0x793f;
WFIFOL (fd, 2) = -1;
account_name = RFIFOP (fd, 2);
@@ -2829,26 +2824,15 @@ int parse_admin (int fd)
RETCODE, auth_dat[i].userid, acc,
(int) new_gm_level, ip);
}
- if (lock_fclose
- (fp2, GM_account_filename,
- &lock) == 0)
- {
- WFIFOL (fd, 2) = acc;
- login_log
- ("'ladmin': Modification of a GM level (account: %s (%d), new GM level: %d, ip: %s)"
- RETCODE, auth_dat[i].userid, acc,
- (int) new_gm_level, ip);
- // read and send new GM informations
- read_gm_account ();
- send_GM_accounts ();
- }
- else
- {
- login_log
- ("'ladmin': Attempt to modify of a GM level - impossible to write GM accounts file (account: %s (%d), received GM level: %d, ip: %s)"
- RETCODE, auth_dat[i].userid, acc,
- (int) new_gm_level, ip);
- }
+ lock_fclose(fp2, GM_account_filename, &lock);
+ WFIFOL (fd, 2) = acc;
+ login_log
+ ("'ladmin': Modification of a GM level (account: %s (%d), new GM level: %d, ip: %s)"
+ RETCODE, auth_dat[i].userid, acc,
+ (int) new_gm_level, ip);
+ // read and send new GM informations
+ read_gm_account ();
+ send_GM_accounts ();
}
else
{
@@ -2881,7 +2865,7 @@ int parse_admin (int fd)
case 0x7940: // Request to modify e-mail
if (RFIFOREST (fd) < 66)
- return 0;
+ return;
WFIFOW (fd, 0) = 0x7941;
WFIFOL (fd, 2) = -1;
account_name = RFIFOP (fd, 2);
@@ -2925,7 +2909,7 @@ int parse_admin (int fd)
case 0x7942: // Request to modify memo field
if (RFIFOREST (fd) < 28
|| RFIFOREST (fd) < (28 + RFIFOW (fd, 26)))
- return 0;
+ return;
WFIFOW (fd, 0) = 0x7943;
WFIFOL (fd, 2) = -1;
account_name = RFIFOP (fd, 2);
@@ -2971,7 +2955,7 @@ int parse_admin (int fd)
case 0x7944: // Request to found an account id
if (RFIFOREST (fd) < 26)
- return 0;
+ return;
WFIFOW (fd, 0) = 0x7945;
WFIFOL (fd, 2) = -1;
account_name = RFIFOP (fd, 2);
@@ -3000,7 +2984,7 @@ int parse_admin (int fd)
case 0x7946: // Request to found an account name
if (RFIFOREST (fd) < 6)
- return 0;
+ return;
WFIFOW (fd, 0) = 0x7947;
WFIFOL (fd, 2) = RFIFOL (fd, 2);
memset (WFIFOP (fd, 6), '\0', 24);
@@ -3028,7 +3012,7 @@ int parse_admin (int fd)
case 0x7948: // Request to change the validity limit (timestamp) (absolute value)
if (RFIFOREST (fd) < 30)
- return 0;
+ return;
{
time_t timestamp;
char tmpstr[2048];
@@ -3066,7 +3050,7 @@ int parse_admin (int fd)
case 0x794a: // Request to change the final date of a banishment (timestamp) (absolute value)
if (RFIFOREST (fd) < 30)
- return 0;
+ return;
{
time_t timestamp;
char tmpstr[2048];
@@ -3122,7 +3106,7 @@ int parse_admin (int fd)
case 0x794c: // Request to change the final date of a banishment (timestamp) (relative change)
if (RFIFOREST (fd) < 38)
- return 0;
+ return;
{
time_t timestamp;
struct tm *tmtime;
@@ -3229,7 +3213,7 @@ int parse_admin (int fd)
case 0x794e: // Request to send a broadcast message
if (RFIFOREST (fd) < 8
|| RFIFOREST (fd) < (8 + RFIFOL (fd, 4)))
- return 0;
+ return;
WFIFOW (fd, 0) = 0x794f;
WFIFOW (fd, 2) = -1;
if (RFIFOL (fd, 4) < 1)
@@ -3280,7 +3264,7 @@ int parse_admin (int fd)
case 0x7950: // Request to change the validity limite (timestamp) (relative change)
if (RFIFOREST (fd) < 38)
- return 0;
+ return;
{
time_t timestamp;
struct tm *tmtime;
@@ -3384,7 +3368,7 @@ int parse_admin (int fd)
case 0x7952: // Request about informations of an account (by account name)
if (RFIFOREST (fd) < 26)
- return 0;
+ return;
WFIFOW (fd, 0) = 0x7953;
WFIFOL (fd, 2) = -1;
account_name = RFIFOP (fd, 2);
@@ -3434,7 +3418,7 @@ int parse_admin (int fd)
case 0x7954: // Request about information of an account (by account id)
if (RFIFOREST (fd) < 6)
- return 0;
+ return;
WFIFOW (fd, 0) = 0x7953;
WFIFOL (fd, 2) = RFIFOL (fd, 2);
memset (WFIFOP (fd, 7), '\0', 24);
@@ -3550,12 +3534,12 @@ int parse_admin (int fd)
session[fd]->eof = 1;
printf
("Remote administration has been disconnected (unknown packet).\n");
- return 0;
+ return;
}
//WFIFOW(fd,0) = 0x791f;
//WFIFOSET(fd,2);
}
- return 0;
+ return;
}
//--------------------------------------------
@@ -3586,7 +3570,7 @@ int lan_ip_check (unsigned char *p)
//----------------------------------------------------------------------------------------
// Default packet parsing (normal players or administation/char-server connexion requests)
//----------------------------------------------------------------------------------------
-int parse_login (int fd)
+void parse_login (int fd)
{
struct mmo_account account;
int result, i, j;
@@ -3600,7 +3584,7 @@ int parse_login (int fd)
{
close (fd);
delete_session (fd);
- return 0;
+ return;
}
while (RFIFOREST (fd) >= 2)
@@ -3631,20 +3615,20 @@ int parse_login (int fd)
{
case 0x200: // New alive packet: structure: 0x200 <account.userid>.24B. used to verify if client is always alive.
if (RFIFOREST (fd) < 26)
- return 0;
+ return;
RFIFOSKIP (fd, 26);
break;
case 0x204: // New alive packet: structure: 0x204 <encrypted.account.userid>.16B. (new ragexe from 22 june 2004)
if (RFIFOREST (fd) < 18)
- return 0;
+ return;
RFIFOSKIP (fd, 18);
break;
case 0x64: // Ask connection of a client
case 0x01dd: // Ask connection of a client (encryption mode)
if (RFIFOREST (fd) < ((RFIFOW (fd, 0) == 0x64) ? 55 : 47))
- return 0;
+ return;
account.userid = RFIFOP (fd, 6);
account.userid[23] = '\0';
@@ -3867,15 +3851,16 @@ int parse_login (int fd)
printf
("login: abnormal request of MD5 key (already opened session).\n");
session[fd]->eof = 1;
- return 0;
+ return;
}
- ld = session[fd]->session_data = calloc (sizeof (*ld), 1);
+ CREATE (ld, struct login_session_data, 1);
+ session[fd]->session_data = ld;
if (!ld)
{
printf
("login: Request for md5 key: memory allocation failure (malloc)!\n");
session[fd]->eof = 1;
- return 0;
+ return;
}
if (RFIFOW (fd, 0) == 0x01db)
{
@@ -3904,7 +3889,7 @@ int parse_login (int fd)
case 0x2710: // Connection request of a char-server
if (RFIFOREST (fd) < 86)
- return 0;
+ return;
{
int GM_value, len;
unsigned char *server_name;
@@ -3930,7 +3915,7 @@ int parse_login (int fd)
{
// If this is the main server, and we don't already have a main server
if (server_fd[0] <= 0
- && strcmpi (server_name, main_server) == 0)
+ && strcasecmp (server_name, main_server) == 0)
{
account.account_id = 0;
}
@@ -4006,7 +3991,7 @@ int parse_login (int fd)
}
}
RFIFOSKIP (fd, 86);
- return 0;
+ return;
case 0x7530: // Request of the server version
login_log ("Sending of the server version (ip: %s)" RETCODE,
@@ -4024,12 +4009,12 @@ int parse_login (int fd)
case 0x7532: // Request to end connection
login_log ("End of connection (ip: %s)" RETCODE, ip);
session[fd]->eof = 1;
- return 0;
+ return;
case 0x7918: // Request for administation login
if (RFIFOREST (fd) < 4
|| RFIFOREST (fd) < ((RFIFOW (fd, 2) == 0) ? 28 : 20))
- return 0;
+ return;
WFIFOW (fd, 0) = 0x7919;
WFIFOB (fd, 2) = 1;
if (!check_ladminip
@@ -4087,7 +4072,7 @@ int parse_login (int fd)
strncpy (md5str, admin_pass, sizeof (admin_pass)); // 24
strcat (md5str, ld->md5key); // 20
}
- MD5_String2binary (md5str, md5bin);
+ MD5_to_bin(MD5_from_cstring(md5str), md5bin);
// If remote administration is enabled and password hash sent by client matches hash of password read from login server configuration file
if ((admin_state == 1)
&& (memcmp (md5bin, RFIFOP (fd, 4), 16) == 0))
@@ -4173,10 +4158,10 @@ int parse_login (int fd)
login_log ("End of connection, unknown packet (ip: %s)"
RETCODE, ip);
session[fd]->eof = 1;
- return 0;
+ return;
}
}
- return 0;
+ return;
}
//-------------------------------------------------
@@ -4185,12 +4170,12 @@ int parse_login (int fd)
//-------------------------------------------------
int config_switch (const char *str)
{
- if (strcmpi (str, "on") == 0 || strcmpi (str, "yes") == 0
- || strcmpi (str, "oui") == 0 || strcmpi (str, "ja") == 0
- || strcmpi (str, "si") == 0)
+ if (strcasecmp (str, "on") == 0 || strcasecmp (str, "yes") == 0
+ || strcasecmp (str, "oui") == 0 || strcasecmp (str, "ja") == 0
+ || strcasecmp (str, "si") == 0)
return 1;
- if (strcmpi (str, "off") == 0 || strcmpi (str, "no") == 0
- || strcmpi (str, "non") == 0 || strcmpi (str, "nein") == 0)
+ if (strcasecmp (str, "off") == 0 || strcasecmp (str, "no") == 0
+ || strcasecmp (str, "non") == 0 || strcasecmp (str, "nein") == 0)
return 0;
return atoi (str);
@@ -4238,7 +4223,7 @@ int login_lan_config_read (const char *lancfgName)
remove_control_chars (w1);
remove_control_chars (w2);
- if (strcmpi (w1, "lan_char_ip") == 0)
+ if (strcasecmp (w1, "lan_char_ip") == 0)
{ // Read Char-Server Lan IP Address
h = gethostbyname (w2);
if (h != NULL)
@@ -4256,7 +4241,7 @@ int login_lan_config_read (const char *lancfgName)
}
printf ("LAN IP of char-server: %s.\n", lan_char_ip);
}
- else if (strcmpi (w1, "subnet") == 0)
+ else if (strcasecmp (w1, "subnet") == 0)
{ // Read Subnetwork
for (j = 0; j < 4; j++)
subneti[j] = 0;
@@ -4274,7 +4259,7 @@ int login_lan_config_read (const char *lancfgName)
printf ("Sub-network of the char-server: %d.%d.%d.%d.\n",
subneti[0], subneti[1], subneti[2], subneti[3]);
}
- else if (strcmpi (w1, "subnetmask") == 0)
+ else if (strcasecmp (w1, "subnetmask") == 0)
{ // Read Subnetwork Mask
for (j = 0; j < 4; j++)
subnetmaski[j] = 255;
@@ -4357,18 +4342,18 @@ int login_config_read (const char *cfgName)
remove_control_chars (w1);
remove_control_chars (w2);
- if (strcmpi (w1, "admin_state") == 0)
+ if (strcasecmp (w1, "admin_state") == 0)
{
admin_state = config_switch (w2);
}
- else if (strcmpi (w1, "admin_pass") == 0)
+ else if (strcasecmp (w1, "admin_pass") == 0)
{
strncpy (admin_pass, w2, sizeof (admin_pass));
admin_pass[sizeof (admin_pass) - 1] = '\0';
}
- else if (strcmpi (w1, "ladminallowip") == 0)
+ else if (strcasecmp (w1, "ladminallowip") == 0)
{
- if (strcmpi (w2, "clear") == 0)
+ if (strcasecmp (w2, "clear") == 0)
{
if (access_ladmin_allow)
free (access_ladmin_allow);
@@ -4377,27 +4362,23 @@ int login_config_read (const char *cfgName)
}
else
{
- if (strcmpi (w2, "all") == 0)
+ if (strcasecmp (w2, "all") == 0)
{
// reset all previous values
if (access_ladmin_allow)
free (access_ladmin_allow);
// set to all
- access_ladmin_allow = calloc (ACO_STRSIZE, 1);
+ CREATE (access_ladmin_allow, char, ACO_STRSIZE);
access_ladmin_allownum = 1;
- access_ladmin_allow[0] = '\0';
}
else if (w2[0]
&& !(access_ladmin_allownum == 1
&& access_ladmin_allow[0] == '\0'))
{ // don't add IP if already 'all'
if (access_ladmin_allow)
- access_ladmin_allow =
- realloc (access_ladmin_allow,
- (access_ladmin_allownum +
- 1) * ACO_STRSIZE);
+ RECREATE (access_ladmin_allow, char, (access_ladmin_allownum + 1) * ACO_STRSIZE);
else
- access_ladmin_allow = calloc (ACO_STRSIZE, 1);
+ CREATE (access_ladmin_allow, char, ACO_STRSIZE);
strncpy (access_ladmin_allow +
(access_ladmin_allownum++) * ACO_STRSIZE, w2,
ACO_STRSIZE);
@@ -4406,44 +4387,44 @@ int login_config_read (const char *cfgName)
}
}
}
- else if (strcmpi (w1, "gm_pass") == 0)
+ else if (strcasecmp (w1, "gm_pass") == 0)
{
strncpy (gm_pass, w2, sizeof (gm_pass));
gm_pass[sizeof (gm_pass) - 1] = '\0';
}
- else if (strcmpi (w1, "level_new_gm") == 0)
+ else if (strcasecmp (w1, "level_new_gm") == 0)
{
level_new_gm = atoi (w2);
}
- else if (strcmpi (w1, "new_account") == 0)
+ else if (strcasecmp (w1, "new_account") == 0)
{
new_account_flag = config_switch (w2);
}
- else if (strcmpi (w1, "login_port") == 0)
+ else if (strcasecmp (w1, "login_port") == 0)
{
login_port = atoi (w2);
}
- else if (strcmpi (w1, "account_filename") == 0)
+ else if (strcasecmp (w1, "account_filename") == 0)
{
strncpy (account_filename, w2, sizeof (account_filename));
account_filename[sizeof (account_filename) - 1] = '\0';
}
- else if (strcmpi (w1, "gm_account_filename") == 0)
+ else if (strcasecmp (w1, "gm_account_filename") == 0)
{
strncpy (GM_account_filename, w2,
sizeof (GM_account_filename));
GM_account_filename[sizeof (GM_account_filename) - 1] = '\0';
}
- else if (strcmpi (w1, "gm_account_filename_check_timer") == 0)
+ else if (strcasecmp (w1, "gm_account_filename_check_timer") == 0)
{
gm_account_filename_check_timer = atoi (w2);
}
- else if (strcmpi (w1, "login_log_filename") == 0)
+ else if (strcasecmp (w1, "login_log_filename") == 0)
{
strncpy (login_log_filename, w2, sizeof (login_log_filename));
login_log_filename[sizeof (login_log_filename) - 1] = '\0';
}
- else if (strcmpi (w1, "login_log_unknown_packets_filename") == 0)
+ else if (strcasecmp (w1, "login_log_unknown_packets_filename") == 0)
{
strncpy (login_log_unknown_packets_filename, w2,
sizeof (login_log_unknown_packets_filename));
@@ -4451,23 +4432,23 @@ int login_config_read (const char *cfgName)
(login_log_unknown_packets_filename)
- 1] = '\0';
}
- else if (strcmpi (w1, "save_unknown_packets") == 0)
+ else if (strcasecmp (w1, "save_unknown_packets") == 0)
{
save_unknown_packets = config_switch (w2);
}
- else if (strcmpi (w1, "display_parse_login") == 0)
+ else if (strcasecmp (w1, "display_parse_login") == 0)
{
display_parse_login = config_switch (w2); // 0: no, 1: yes
}
- else if (strcmpi (w1, "display_parse_admin") == 0)
+ else if (strcasecmp (w1, "display_parse_admin") == 0)
{
display_parse_admin = config_switch (w2); // 0: no, 1: yes
}
- else if (strcmpi (w1, "display_parse_fromchar") == 0)
+ else if (strcasecmp (w1, "display_parse_fromchar") == 0)
{
display_parse_fromchar = config_switch (w2); // 0: no, 1: yes (without packet 0x2714), 2: all packets
}
- else if (strcmpi (w1, "date_format") == 0)
+ else if (strcasecmp (w1, "date_format") == 0)
{ // note: never have more than 19 char for the date!
switch (atoi (w2))
{
@@ -4485,38 +4466,38 @@ int login_config_read (const char *cfgName)
break;
}
}
- else if (strcmpi (w1, "min_level_to_connect") == 0)
+ else if (strcasecmp (w1, "min_level_to_connect") == 0)
{
min_level_to_connect = atoi (w2);
}
- else if (strcmpi (w1, "add_to_unlimited_account") == 0)
+ else if (strcasecmp (w1, "add_to_unlimited_account") == 0)
{
add_to_unlimited_account = config_switch (w2);
}
- else if (strcmpi (w1, "start_limited_time") == 0)
+ else if (strcasecmp (w1, "start_limited_time") == 0)
{
start_limited_time = atoi (w2);
}
- else if (strcmpi (w1, "check_ip_flag") == 0)
+ else if (strcasecmp (w1, "check_ip_flag") == 0)
{
check_ip_flag = config_switch (w2);
}
- else if (strcmpi (w1, "order") == 0)
+ else if (strcasecmp (w1, "order") == 0)
{
access_order = atoi (w2);
- if (strcmpi (w2, "deny,allow") == 0 ||
- strcmpi (w2, "deny, allow") == 0)
+ if (strcasecmp (w2, "deny,allow") == 0 ||
+ strcasecmp (w2, "deny, allow") == 0)
access_order = ACO_DENY_ALLOW;
- if (strcmpi (w2, "allow,deny") == 0 ||
- strcmpi (w2, "allow, deny") == 0)
+ if (strcasecmp (w2, "allow,deny") == 0 ||
+ strcasecmp (w2, "allow, deny") == 0)
access_order = ACO_ALLOW_DENY;
- if (strcmpi (w2, "mutual-failture") == 0 ||
- strcmpi (w2, "mutual-failure") == 0)
+ if (strcasecmp (w2, "mutual-failture") == 0 ||
+ strcasecmp (w2, "mutual-failure") == 0)
access_order = ACO_MUTUAL_FAILTURE;
}
- else if (strcmpi (w1, "allow") == 0)
+ else if (strcasecmp (w1, "allow") == 0)
{
- if (strcmpi (w2, "clear") == 0)
+ if (strcasecmp (w2, "clear") == 0)
{
if (access_allow)
free (access_allow);
@@ -4525,26 +4506,23 @@ int login_config_read (const char *cfgName)
}
else
{
- if (strcmpi (w2, "all") == 0)
+ if (strcasecmp (w2, "all") == 0)
{
// reset all previous values
if (access_allow)
free (access_allow);
// set to all
- access_allow = calloc (ACO_STRSIZE, 1);
+ CREATE (access_allow, char, ACO_STRSIZE);
access_allownum = 1;
- access_allow[0] = '\0';
}
else if (w2[0]
&& !(access_allownum == 1
&& access_allow[0] == '\0'))
{ // don't add IP if already 'all'
if (access_allow)
- access_allow =
- realloc (access_allow,
- (access_allownum + 1) * ACO_STRSIZE);
+ RECREATE (access_allow, char, (access_allownum + 1) * ACO_STRSIZE);
else
- access_allow = calloc (ACO_STRSIZE, 1);
+ CREATE (access_allow, char, ACO_STRSIZE);
strncpy (access_allow +
(access_allownum++) * ACO_STRSIZE, w2,
ACO_STRSIZE);
@@ -4553,9 +4531,9 @@ int login_config_read (const char *cfgName)
}
}
}
- else if (strcmpi (w1, "deny") == 0)
+ else if (strcasecmp (w1, "deny") == 0)
{
- if (strcmpi (w2, "clear") == 0)
+ if (strcasecmp (w2, "clear") == 0)
{
if (access_deny)
free (access_deny);
@@ -4564,26 +4542,23 @@ int login_config_read (const char *cfgName)
}
else
{
- if (strcmpi (w2, "all") == 0)
+ if (strcasecmp (w2, "all") == 0)
{
// reset all previous values
if (access_deny)
free (access_deny);
// set to all
- access_deny = calloc (ACO_STRSIZE, 1);
+ CREATE (access_deny, char, ACO_STRSIZE);
access_denynum = 1;
- access_deny[0] = '\0';
}
else if (w2[0]
&& !(access_denynum == 1
&& access_deny[0] == '\0'))
{ // don't add IP if already 'all'
if (access_deny)
- access_deny =
- realloc (access_deny,
- (access_denynum + 1) * ACO_STRSIZE);
+ RECREATE (access_deny, char, (access_denynum + 1) * ACO_STRSIZE);
else
- access_deny = calloc (ACO_STRSIZE, 1);
+ CREATE (access_deny, char, ACO_STRSIZE);
strncpy (access_deny +
(access_denynum++) * ACO_STRSIZE, w2,
ACO_STRSIZE);
@@ -4591,26 +4566,26 @@ int login_config_read (const char *cfgName)
}
}
}
- else if (strcmpi (w1, "anti_freeze_enable") == 0)
+ else if (strcasecmp (w1, "anti_freeze_enable") == 0)
{
anti_freeze_enable = config_switch (w2);
}
- else if (strcmpi (w1, "anti_freeze_interval") == 0)
+ else if (strcasecmp (w1, "anti_freeze_interval") == 0)
{
ANTI_FREEZE_INTERVAL = atoi (w2);
if (ANTI_FREEZE_INTERVAL < 5)
ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds
}
- else if (strcmpi (w1, "import") == 0)
+ else if (strcasecmp (w1, "import") == 0)
{
login_config_read (w2);
}
- else if (strcmpi (w1, "update_host") == 0)
+ else if (strcasecmp (w1, "update_host") == 0)
{
strncpy (update_host, w2, sizeof (update_host));
update_host[sizeof (update_host) - 1] = '\0';
}
- else if (strcmpi (w1, "main_server") == 0)
+ else if (strcasecmp (w1, "main_server") == 0)
{
strncpy (main_server, w2, sizeof (main_server));
main_server[sizeof (main_server) - 1] = '\0';
@@ -5079,19 +5054,18 @@ int do_init (int argc, char **argv)
read_gm_account ();
mmo_auth_init ();
- set_termfunc (mmo_auth_sync);
+// set_termfunc (mmo_auth_sync);
set_defaultparse (parse_login);
login_fd = make_listen_port (login_port);
- add_timer_func_list (check_auth_sync, "check_auth_sync");
+// add_timer_func_list (check_auth_sync, "check_auth_sync");
// Trigger auth sync every 5 minutes
i = add_timer_interval (gettick () + 300000, check_auth_sync, 0, 0, 300000);
if (anti_freeze_enable > 0)
{
- add_timer_func_list (char_anti_freeze_system,
- "char_anti_freeze_system");
+// add_timer_func_list (char_anti_freeze_system, "char_anti_freeze_system");
i = add_timer_interval (gettick () + 1000, char_anti_freeze_system, 0,
0, ANTI_FREEZE_INTERVAL * 1000);
}
@@ -5100,7 +5074,7 @@ int do_init (int argc, char **argv)
j = gm_account_filename_check_timer;
if (j == 0) // if we would not to check, we check every 60 sec, just to have timer (if we change timer, is was not necessary to check if timer already exists)
j = 60;
- add_timer_func_list (check_GM_file, "check_GM_file");
+// add_timer_func_list (check_GM_file, "check_GM_file");
i = add_timer_interval (gettick () + j * 1000, check_GM_file, 0, 0, j * 1000); // every x sec we check if gm file has been changed
login_log
diff --git a/src/map/Makefile b/src/map/Makefile
index f31279c..d340015 100644
--- a/src/map/Makefile
+++ b/src/map/Makefile
@@ -5,8 +5,8 @@ all: map
obj:
mkdir obj
-COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/grfio.o ../common/db.o ../common/lock.o ../common/nullpo.o ../common/malloc.o ../common/mt_rand.o ../common/md5calc.o
-LDLIBS = -lz -lm
+COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/grfio.o ../common/db.o ../common/lock.o ../common/nullpo.o ../common/mt_rand.o ../common/md5calc.o
+LDLIBS = -lm
map: obj/tmw.o obj/magic-interpreter-lexer.o obj/magic-interpreter-parser.o obj/magic-interpreter-base.o obj/magic-expr.o obj/magic-stmt.o obj/magic.o obj/map.o obj/chrif.o obj/clif.o obj/pc.o obj/npc.o obj/chat.o obj/path.o obj/itemdb.o obj/mob.o obj/script.o obj/storage.o obj/skill.o obj/skill-pools.o obj/atcommand.o obj/battle.o obj/intif.o obj/trade.o obj/party.o obj/guild.o $(COMMON_OBJ)
${LINK.c} $^ ${LDLIBS} -o $@
diff --git a/src/map/atcommand.c b/src/map/atcommand.c
index cb9e93c..6a09970 100644
--- a/src/map/atcommand.c
+++ b/src/map/atcommand.c
@@ -13,6 +13,7 @@
#include "../common/socket.h"
#include "../common/timer.h"
#include "../common/nullpo.h"
+#include "../common/mt_rand.h"
#include "atcommand.h"
#include "battle.h"
@@ -794,7 +795,7 @@ AtCommandType atcommand (const int level, const char *message,
while (atcommand_info[i].type != AtCommand_Unknown)
{
- if (strcmpi (command + 1, atcommand_info[i].command + 1) == 0
+ if (strcasecmp (command + 1, atcommand_info[i].command + 1) == 0
&& level >= atcommand_info[i].level)
{
p[0] = atcommand_info[i].command[0]; // set correct first symbol for after.
@@ -862,7 +863,7 @@ int msg_config_read (const char *cfgName)
continue;
if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) == 2)
{
- if (strcmpi (w1, "import") == 0)
+ if (strcasecmp (w1, "import") == 0)
{
msg_config_read (w2);
}
@@ -891,7 +892,7 @@ static AtCommandInfo *get_atcommandinfo_byname (const char *name)
int i;
for (i = 0; atcommand_info[i].type != AtCommand_Unknown; i++)
- if (strcmpi (atcommand_info[i].command + 1, name) == 0)
+ if (strcasecmp (atcommand_info[i].command + 1, name) == 0)
return &atcommand_info[i];
return NULL;
@@ -930,9 +931,9 @@ int atcommand_config_read (const char *cfgName)
p->level = 0;
}
- if (strcmpi (w1, "import") == 0)
+ if (strcasecmp (w1, "import") == 0)
atcommand_config_read (w2);
- else if (strcmpi (w1, "command_symbol") == 0 && w2[0] > 31 && w2[0] != '/' && // symbol of standard ragnarok GM commands
+ else if (strcasecmp (w1, "command_symbol") == 0 && w2[0] > 31 && w2[0] != '/' && // symbol of standard ragnarok GM commands
w2[0] != '%') // symbol of party chat speaking
command_symbol = w2[0];
}
@@ -3506,7 +3507,7 @@ int atcommand_param (const int fd, struct map_session_data *sd,
index = -1;
for (i = 0; param[i] != NULL; i++)
{
- if (strcmpi (command, param[i]) == 0)
+ if (strcasecmp (command, param[i]) == 0)
{
index = i;
break;
@@ -7131,12 +7132,12 @@ int atcommand_email (const int fd, struct map_session_data *sd,
clif_displaymessage (fd, msg_table[145]); // Invalid new email. Please enter a real e-mail.
return -1;
}
- else if (strcmpi (new_email, "a@a.com") == 0)
+ else if (strcasecmp (new_email, "a@a.com") == 0)
{
clif_displaymessage (fd, msg_table[146]); // New email must be a real e-mail.
return -1;
}
- else if (strcmpi (actual_email, new_email) == 0)
+ else if (strcasecmp (actual_email, new_email) == 0)
{
clif_displaymessage (fd, msg_table[147]); // New email must be different of the actual e-mail.
return -1;
@@ -7829,7 +7830,7 @@ atcommand_dropall (const int fd, struct map_session_data *sd,
/*==========================================
* @chardropall by [MouseJstr]
- *
+ *
* Throw all the characters possessions on the ground. Normally
* done in response to them being disrespectful of a GM
*------------------------------------------
@@ -7967,8 +7968,8 @@ atcommand_skillid (const int fd, struct map_session_data *sd,
skillen = strlen (message);
while (skill_names[idx].id != 0)
{
- if ((strnicmp (skill_names[idx].name, message, skillen) == 0) ||
- (strnicmp (skill_names[idx].desc, message, skillen) == 0))
+ if ((strncasecmp (skill_names[idx].name, message, skillen) == 0) ||
+ (strncasecmp (skill_names[idx].desc, message, skillen) == 0))
{
char output[255];
sprintf (output, "skill %d: %s", skill_names[idx].id,
@@ -8116,7 +8117,7 @@ atcommand_leaves (const int fd, struct map_session_data *sd,
}
/*==========================================
- *
+ *
*------------------------------------------
*/
int atcommand_summon (const int fd, struct map_session_data *sd,
@@ -8182,7 +8183,7 @@ atcommand_adjcmdlvl (const int fd, struct map_session_data *sd,
}
for (i = 0; atcommand_info[i].type != AtCommand_None; i++)
- if (strcmpi (cmd, atcommand_info[i].command + 1) == 0)
+ if (strcasecmp (cmd, atcommand_info[i].command + 1) == 0)
{
atcommand_info[i].level = newlev;
clif_displaymessage (fd, "@command level changed.");
@@ -8230,7 +8231,7 @@ atcommand_adjgmlvl (const int fd, struct map_session_data *sd,
*
* Open a trade window with a remote player
*
- * If I have to jump to a remote player one more time, I am
+ * If I have to jump to a remote player one more time, I am
* gonna scream!
*------------------------------------------
*/
diff --git a/src/map/battle.c b/src/map/battle.c
index c9e341d..a6a803a 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -8,7 +8,6 @@
#include "../common/timer.h"
#include "../common/nullpo.h"
-#include "../common/malloc.h"
#include "clif.h"
#include "guild.h"
@@ -1423,22 +1422,19 @@ struct battle_delay_damage_
int damage;
int flag;
};
-int battle_delay_damage_sub (int tid, unsigned int tick, int id, int data)
+void battle_delay_damage_sub (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct battle_delay_damage_ *dat = (struct battle_delay_damage_ *) data;
if (dat && map_id2bl (id) == dat->src && dat->target->prev != NULL)
battle_damage (dat->src, dat->target, dat->damage, dat->flag);
free (dat);
- return 0;
}
int battle_delay_damage (unsigned int tick, struct block_list *src,
struct block_list *target, int damage, int flag)
{
- struct battle_delay_damage_ *dat =
- (struct battle_delay_damage_ *) aCalloc (1,
- sizeof (struct
- battle_delay_damage_));
+ struct battle_delay_damage_ *dat;
+ CREATE (dat, struct battle_delay_damage_, 1);
nullpo_retr (0, src);
nullpo_retr (0, target);
@@ -5432,12 +5428,12 @@ int battle_check_range (struct block_list *src, struct block_list *bl,
*/
int battle_config_switch (const char *str)
{
- if (strcmpi (str, "on") == 0 || strcmpi (str, "yes") == 0
- || strcmpi (str, "oui") == 0 || strcmpi (str, "ja") == 0
- || strcmpi (str, "si") == 0)
+ if (strcasecmp (str, "on") == 0 || strcasecmp (str, "yes") == 0
+ || strcasecmp (str, "oui") == 0 || strcasecmp (str, "ja") == 0
+ || strcasecmp (str, "si") == 0)
return 1;
- if (strcmpi (str, "off") == 0 || strcmpi (str, "no") == 0
- || strcmpi (str, "non") == 0 || strcmpi (str, "nein") == 0)
+ if (strcasecmp (str, "off") == 0 || strcasecmp (str, "no") == 0
+ || strcasecmp (str, "non") == 0 || strcasecmp (str, "nein") == 0)
return 0;
return atoi (str);
}
@@ -6118,10 +6114,10 @@ int battle_config_read (const char *cfgName)
if (sscanf (line, "%[^:]:%s", w1, w2) != 2)
continue;
for (i = 0; i < sizeof (data) / (sizeof (data[0])); i++)
- if (strcmpi (w1, data[i].str) == 0)
+ if (strcasecmp (w1, data[i].str) == 0)
*data[i].val = battle_config_switch (w2);
- if (strcmpi (w1, "import") == 0)
+ if (strcasecmp (w1, "import") == 0)
battle_config_read (w2);
}
fclose_ (fp);
@@ -6276,8 +6272,6 @@ int battle_config_read (const char *cfgName)
if ((battle_config.packet_ver_flag & 63) == 0) // added by [Yor]
battle_config.packet_ver_flag = 63; // accept all clients
- add_timer_func_list (battle_delay_damage_sub,
- "battle_delay_damage_sub");
}
return 0;
diff --git a/src/map/chat.c b/src/map/chat.c
index 0163eed..00aadea 100644
--- a/src/map/chat.c
+++ b/src/map/chat.c
@@ -5,7 +5,6 @@
#include "../common/db.h"
#include "../common/nullpo.h"
-#include "../common/malloc.h"
#include "map.h"
#include "clif.h"
#include "pc.h"
@@ -29,7 +28,7 @@ int chat_createchat (struct map_session_data *sd, int limit, int pub,
nullpo_retr (0, sd);
- cd = aCalloc (1, sizeof (struct chat_data));
+ cd = calloc (1, sizeof (struct chat_data));
cd->limit = limit;
cd->pub = pub;
@@ -280,7 +279,7 @@ int chat_createnpcchat (struct npc_data *nd, int limit, int pub, int trigger,
nullpo_retr (1, nd);
- cd = aCalloc (1, sizeof (struct chat_data));
+ cd = calloc (1, sizeof (struct chat_data));
cd->limit = cd->trigger = limit;
if (trigger > 0)
diff --git a/src/map/chrif.c b/src/map/chrif.c
index 8bbeb59..b80b4fd 100644
--- a/src/map/chrif.c
+++ b/src/map/chrif.c
@@ -1121,7 +1121,7 @@ void ladmin_itemfrob (int fd)
*
*------------------------------------------
*/
-int chrif_parse (int fd)
+void chrif_parse (int fd)
{
int packet_len, cmd;
@@ -1138,7 +1138,7 @@ int chrif_parse (int fd)
}
close (fd);
delete_session (fd);
- return 0;
+ return;
}
while (RFIFOREST (fd) >= 2)
@@ -1156,20 +1156,20 @@ int chrif_parse (int fd)
if (r == 1)
continue; // intifで処理した
if (r == 2)
- return 0; // intifで処理したが、データが足りない
+ return; // intifで処理したが、データが足りない
session[fd]->eof = 1;
- return 0;
+ return;
}
packet_len = packet_len_table[cmd - 0x2af8];
if (packet_len == -1)
{
if (RFIFOREST (fd) < 4)
- return 0;
+ return;
packet_len = RFIFOW (fd, 2);
}
if (RFIFOREST (fd) < packet_len)
- return 0;
+ return;
switch (cmd)
{
@@ -1235,12 +1235,10 @@ int chrif_parse (int fd)
printf ("chrif_parse : unknown packet %d %d\n", fd,
RFIFOW (fd, 0));
session[fd]->eof = 1;
- return 0;
+ return;
}
RFIFOSKIP (fd, packet_len);
}
-
- return 0;
}
/*==========================================
@@ -1248,13 +1246,13 @@ int chrif_parse (int fd)
* 今このmap鯖に繋がっているクライアント人数をchar鯖へ送る
*------------------------------------------
*/
-int send_users_tochar (int tid, unsigned int tick, int id, int data)
+void send_users_tochar (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
int users = 0, i;
struct map_session_data *sd;
if (char_fd <= 0 || session[char_fd] == NULL)
- return 0;
+ return;
WFIFOW (char_fd, 0) = 0x2aff;
for (i = 0; i < fd_max; i++)
@@ -1271,8 +1269,6 @@ int send_users_tochar (int tid, unsigned int tick, int id, int data)
WFIFOW (char_fd, 2) = 6 + 4 * users;
WFIFOW (char_fd, 4) = users;
WFIFOSET (char_fd, 6 + 4 * users);
-
- return 0;
}
/*==========================================
@@ -1280,21 +1276,19 @@ int send_users_tochar (int tid, unsigned int tick, int id, int data)
* char鯖との接続を確認し、もし切れていたら再度接続する
*------------------------------------------
*/
-int check_connect_char_server (int tid, unsigned int tick, int id, int data)
+void check_connect_char_server (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
if (char_fd <= 0 || session[char_fd] == NULL)
{
printf ("Attempt to connect to char-server...\n");
chrif_state = 0;
if ((char_fd = make_connection (char_ip, char_port)) < 0)
- return 0;
+ return;
session[char_fd]->func_parse = chrif_parse;
realloc_fifo (char_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);
chrif_connect (char_fd);
}
-
- return 0;
}
/*==========================================
@@ -1303,9 +1297,8 @@ int check_connect_char_server (int tid, unsigned int tick, int id, int data)
*/
int do_init_chrif (void)
{
- add_timer_func_list (check_connect_char_server,
- "check_connect_char_server");
- add_timer_func_list (send_users_tochar, "send_users_tochar");
+// add_timer_func_list (check_connect_char_server, "check_connect_char_server");
+// add_timer_func_list (send_users_tochar, "send_users_tochar");
add_timer_interval (gettick () + 1000, check_connect_char_server, 0, 0,
10 * 1000);
add_timer_interval (gettick () + 1000, send_users_tochar, 0, 0, 5 * 1000);
diff --git a/src/map/clif.c b/src/map/clif.c
index d630815..8bbf112 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -20,10 +20,10 @@
#include "../common/socket.h"
#include "../common/timer.h"
-#include "../common/malloc.h"
#include "../common/version.h"
#include "../common/nullpo.h"
#include "../common/md5calc.h"
+#include "../common/mt_rand.h"
#include "atcommand.h"
#include "battle.h"
@@ -755,15 +755,13 @@ int clif_clearchar (struct block_list *bl, int type)
return 0;
}
-static int clif_clearchar_delay_sub (int tid, unsigned int tick, int id,
- int data)
+static void clif_clearchar_delay_sub (timer_id tid, tick_t tick, custom_id_t id,
+ custom_data_t data)
{
struct block_list *bl = (struct block_list *) id;
clif_clearchar (bl, data);
map_freeblock (bl);
-
- return 0;
}
int clif_clearchar_delay (unsigned int tick, struct block_list *bl, int type)
@@ -775,7 +773,7 @@ int clif_clearchar_delay (unsigned int tick, struct block_list *bl, int type)
exit (1);
}
memcpy (tmpbl, bl, sizeof (struct block_list));
- add_timer (tick, clif_clearchar_delay_sub, (int) tmpbl, type);
+ add_timer (tick, clif_clearchar_delay_sub, (custom_id_t) tmpbl, type);
return 0;
}
@@ -1513,12 +1511,10 @@ void clif_quitsave (int fd, struct map_session_data *sd)
*
*------------------------------------------
*/
-static int clif_waitclose (int tid, unsigned int tick, int id, int data)
+static void clif_waitclose (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
if (session[id])
session[id]->eof = 1;
-
- return 0;
}
/*==========================================
@@ -5653,7 +5649,7 @@ int clif_combo_delay (struct block_list *bl, int wait)
*白刃取り
*------------------------------------------
*/
-int clif_bladestop (struct block_list *src, struct block_list *dst, int bool)
+int clif_bladestop (struct block_list *src, struct block_list *dst, int boolean)
{
unsigned char buf[32];
@@ -5663,7 +5659,7 @@ int clif_bladestop (struct block_list *src, struct block_list *dst, int bool)
WBUFW (buf, 0) = 0x1d1;
WBUFL (buf, 2) = src->id;
WBUFL (buf, 6) = dst->id;
- WBUFL (buf, 10) = bool;
+ WBUFL (buf, 10) = boolean;
clif_send (buf, packet_len_table[0x1d1], src, AREA);
@@ -8582,7 +8578,7 @@ void clif_parse_PartyMessage (int fd, struct map_session_data *sd)
clif_displaymessage (fd, msg_txt (505));
return;
}
-
+
if (is_atcommand (fd, sd, message, 0) != AtCommand_None
|| (sd->sc_data && (sd->sc_data[SC_BERSERK].timer != -1 //バーサーク時は会話も不可
|| sd->sc_data[SC_NOCHAT].timer != -1))) //チャット禁止
@@ -9907,7 +9903,7 @@ func_table clif_parse_func_table[0x220] =
// *INDENT-ON*
// Checks for packet flooding
-int clif_check_packet_flood(fd, cmd)
+int clif_check_packet_flood(int fd, int cmd)
{
struct map_session_data *sd = session[fd]->session_data;
unsigned int rate, tick = gettick();
@@ -10025,7 +10021,7 @@ static char *clif_validate_chat (struct map_session_data *sd, int type,
fd = sd->fd;
msg_len = RFIFOW (fd, 2) - 4;
name_len = strlen (sd->status.name);
- /*
+ /*
* At least one character is required in all instances.
* Notes for length checks:
*
@@ -10063,9 +10059,9 @@ static char *clif_validate_chat (struct map_session_data *sd, int type,
p = (char *) (type != 1) ? RFIFOP (fd, 4) : RFIFOP (fd, 28);
buf_len = (type == 1) ? msg_len - min_len: msg_len;
- /*
+ /*
* The client attempted to exceed the maximum message length.
- *
+ *
* The conf suggests up to chat_maxline characters, after which the message
* is truncated. But the previous behavior was to drop the message, so
* we'll do that, too.
@@ -10079,7 +10075,7 @@ static char *clif_validate_chat (struct map_session_data *sd, int type,
/* We're leaving an extra eight bytes for public/global chat, 1 for NUL. */
buf_len += (type == 2) ? 8 + 1 : 1;
- buf = (char *) aMalloc (buf_len);
+ buf = (char *) malloc (buf_len);
memcpy ((type != 2) ? buf : buf + 8, p,
(type != 2) ? buf_len - 1 : buf_len - 8 - 1);
buf[buf_len - 1] = '\0';
@@ -10118,7 +10114,7 @@ static char *clif_validate_chat (struct map_session_data *sd, int type,
* socket.cのdo_parsepacketから呼び出される
*------------------------------------------
*/
-static int clif_parse (int fd)
+static void clif_parse (int fd)
{
int packet_len = 0, cmd = 0;
struct map_session_data *sd = NULL;
@@ -10158,11 +10154,11 @@ static int clif_parse (int fd)
close (fd);
if (fd)
delete_session (fd);
- return 0;
+ return;
}
if (RFIFOREST (fd) < 2)
- return 0; // Too small (no packet number)
+ return; // Too small (no packet number)
cmd = RFIFOW (fd, 0);
@@ -10187,10 +10183,10 @@ static int clif_parse (int fd)
session[fd]->eof = 1;
break;
}
- return 0;
+ return;
}
else if (cmd >= 0x200)
- return 0;
+ return;
// パケット長を計算
packet_len = packet_len_table[cmd];
@@ -10198,19 +10194,19 @@ static int clif_parse (int fd)
{
if (RFIFOREST (fd) < 4)
{
- return 0; // Runt packet (variable length without a length sent)
+ return; // Runt packet (variable length without a length sent)
}
packet_len = RFIFOW (fd, 2);
if (packet_len < 4 || packet_len > 32768)
{
session[fd]->eof = 1;
- return 0; // Runt packet (variable out of bounds)
+ return; // Runt packet (variable out of bounds)
}
}
if (RFIFOREST (fd) < packet_len)
{
- return 0; // Runt packet (sent legnth is too small)
+ return; // Runt packet (sent legnth is too small)
}
if (sd && sd->state.auth == 1 && sd->state.waitingdisconnect == 1)
@@ -10223,7 +10219,7 @@ static int clif_parse (int fd)
{
// Flood triggered. Skip packet.
RFIFOSKIP(sd->fd, packet_len);
- return 0;
+ return;
}
clif_parse_func_table[cmd].func (fd, sd);
@@ -10267,7 +10263,7 @@ static int clif_parse (int fd)
{
printf ("clif.c: cant write [%s] !!! data is lost !!!\n",
packet_txt);
- return 1;
+ return;
}
else
{
@@ -10306,8 +10302,6 @@ static int clif_parse (int fd)
}
}
RFIFOSKIP (fd, packet_len);
-
- return 0;
}
/*==========================================
@@ -10335,9 +10329,5 @@ int do_init_clif (void)
exit (1);
}
- add_timer_func_list (clif_waitclose, "clif_waitclose");
- add_timer_func_list (clif_clearchar_delay_sub,
- "clif_clearchar_delay_sub");
-
return 0;
}
diff --git a/src/map/clif.h b/src/map/clif.h
index a7da92d..d947f95 100644
--- a/src/map/clif.h
+++ b/src/map/clif.h
@@ -177,7 +177,7 @@ int clif_devotion (struct map_session_data *sd, int target);
int clif_spiritball (struct map_session_data *sd);
int clif_combo_delay (struct block_list *src, int wait);
int clif_bladestop (struct block_list *src, struct block_list *dst,
- int bool);
+ int boolean);
int clif_changemapcell (int m, int x, int y, int cell_type, int type);
int clif_status_change (struct block_list *bl, int type, int flag);
diff --git a/src/map/guild.c b/src/map/guild.c
index 4a7552a..6017b8e 100644
--- a/src/map/guild.c
+++ b/src/map/guild.c
@@ -9,7 +9,6 @@
#include "../common/timer.h"
#include "../common/socket.h"
#include "../common/nullpo.h"
-#include "../common/malloc.h"
#include "battle.h"
#include "npc.h"
#include "pc.h"
@@ -72,8 +71,8 @@ int guild_checkskill (struct guild *g, int id)
return g->skill[id - 10000].lv;
}
-int guild_payexp_timer (int tid, unsigned int tick, int id, int data);
-int guild_gvg_eliminate_timer (int tid, unsigned int tick, int id, int data);
+void guild_payexp_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data);
+void guild_gvg_eliminate_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data);
static int guild_read_castledb (void)
{
@@ -94,8 +93,7 @@ static int guild_read_castledb (void)
if (line[0] == '/' && line[1] == '/')
continue;
memset (str, 0, sizeof (str));
- gc = (struct guild_castle *) aCalloc (1,
- sizeof (struct guild_castle));
+ CREATE (gc, struct guild_castle, 1);
for (j = 0, p = line; j < 6 && p; j++)
{
str[j] = p;
@@ -157,9 +155,6 @@ void do_init_guild (void)
guild_read_castledb ();
- add_timer_func_list (guild_gvg_eliminate_timer,
- "guild_gvg_eliminate_timer");
- add_timer_func_list (guild_payexp_timer, "guild_payexp_timer");
add_timer_interval (gettick () + GUILD_PAYEXP_INVERVAL,
guild_payexp_timer, 0, 0, GUILD_PAYEXP_INVERVAL);
}
@@ -170,15 +165,14 @@ struct guild *guild_search (int guild_id)
return numdb_search (guild_db, guild_id);
}
-int guild_searchname_sub (void *key, void *data, va_list ap)
+void guild_searchname_sub (db_key_t key, db_val_t data, va_list ap)
{
struct guild *g = (struct guild *) data, **dst;
char *str;
str = va_arg (ap, char *);
dst = va_arg (ap, struct guild **);
- if (strcmpi (g->name, str) == 0)
+ if (strcasecmp (g->name, str) == 0)
*dst = g;
- return 0;
}
// ギルド名検索
@@ -282,22 +276,22 @@ int guild_check_conflict (struct map_session_data *sd)
}
// ギルドのEXPキャッシュをinter鯖にフラッシュする
-int guild_payexp_timer_sub (void *key, void *data, va_list ap)
+void guild_payexp_timer_sub (db_key_t key, db_val_t data, va_list ap)
{
- int i, *dellist, *delp, dataid = (int) key;
+ int i, *dellist, *delp, dataid = key.i;
struct guild_expcache *c;
struct guild *g;
- nullpo_retr (0, ap);
- nullpo_retr (0, c = (struct guild_expcache *) data);
- nullpo_retr (0, dellist = va_arg (ap, int *));
- nullpo_retr (0, delp = va_arg (ap, int *));
+ nullpo_retv (ap);
+ nullpo_retv (c = (struct guild_expcache *) data);
+ nullpo_retv (dellist = va_arg (ap, int *));
+ nullpo_retv (delp = va_arg (ap, int *));
if (*delp >= GUILD_PAYEXP_LIST
|| (g = guild_search (c->guild_id)) == NULL)
- return 0;
+ return;
if ((i = guild_getindex (g, c->account_id, 0 /*c->char_id*/)) < 0)
- return 0;
+ return;
g->member[i].exp += c->exp;
intif_guild_change_memberinfo (g->guild_id, c->account_id, 0 /*char_id*/,
@@ -307,10 +301,9 @@ int guild_payexp_timer_sub (void *key, void *data, va_list ap)
dellist[(*delp)++] = dataid;
free (c);
- return 0;
}
-int guild_payexp_timer (int tid, unsigned int tick, int id, int data)
+void guild_payexp_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
int dellist[GUILD_PAYEXP_LIST], delp = 0, i;
numdb_foreach (guild_expcache_db, guild_payexp_timer_sub, dellist, &delp);
@@ -318,7 +311,6 @@ int guild_payexp_timer (int tid, unsigned int tick, int id, int data)
numdb_erase (guild_expcache_db, dellist[i]);
// if(battle_config.etc_log)
// printf("guild exp %d charactor's exp flushed !\n",delp);
- return 0;
}
//------------------------------------------------------------------------
@@ -424,7 +416,7 @@ int guild_npc_request_info (int guild_id, const char *event)
if (event == NULL || *event == 0)
return guild_request_info (guild_id);
- ev = (struct eventlist *) aCalloc (1, sizeof (struct eventlist));
+ CREATE (ev, struct eventlist, 1);
memcpy (ev->name, event, sizeof (ev->name));
ev->next =
(struct eventlist *) numdb_search (guild_infoevent_db, guild_id);
@@ -494,7 +486,7 @@ int guild_recv_info (struct guild *sg)
if ((g = numdb_search (guild_db, sg->guild_id)) == NULL)
{
- g = (struct guild *) aCalloc (1, sizeof (struct guild));
+ CREATE (g, struct guild, 1);
numdb_insert (guild_db, sg->guild_id, g);
before = *sg;
@@ -1094,9 +1086,7 @@ int guild_payexp (struct map_session_data *sd, int exp)
if ((c = numdb_search (guild_expcache_db, sd->status.account_id /*char_id*/)) == NULL)
{
- c = (struct guild_expcache *) aCalloc (1,
- sizeof (struct
- guild_expcache));
+ CREATE (c, struct guild_expcache, 1);
c->guild_id = sd->status.guild_id;
c->account_id = sd->status.account_id;
c->char_id = 0;
@@ -1452,14 +1442,14 @@ int guild_allianceack (int guild_id1, int guild_id2, int account_id1,
}
// ギルド解散通知用
-int guild_broken_sub (void *key, void *data, va_list ap)
+void guild_broken_sub (db_key_t key, db_val_t data, va_list ap)
{
struct guild *g = (struct guild *) data;
int guild_id = va_arg (ap, int);
int i, j;
struct map_session_data *sd = NULL;
- nullpo_retr (0, g);
+ nullpo_retv (g);
for (i = 0; i < MAX_GUILDALLIANCE; i++)
{ // 関係を破棄
@@ -1472,7 +1462,6 @@ int guild_broken_sub (void *key, void *data, va_list ap)
g->alliance[i].guild_id = 0;
}
}
- return 0;
}
// ギルド解散通知
@@ -1548,7 +1537,7 @@ int guild_addcastleinfoevent (int castle_id, int index, const char *name)
if (name == NULL || *name == 0)
return 0;
- ev = (struct eventlist *) aCalloc (1, sizeof (struct eventlist));
+ CREATE (ev, struct eventlist, 1);
memcpy (ev->name, name, sizeof (ev->name));
ev->next = numdb_search (guild_castleinfoevent_db, code);
numdb_insert (guild_castleinfoevent_db, code, ev);
@@ -1812,19 +1801,19 @@ int guild_agit_end (void)
return 0;
}
-int guild_gvg_eliminate_timer (int tid, unsigned int tick, int id, int data)
+void guild_gvg_eliminate_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{ // Run One NPC_Event[OnAgitEliminate]
size_t len = strlen ((const char *) data);
- char *evname = (char *) aCalloc (len + 4, sizeof (char));
+ char *evname;
+ CREATE (evname, char, len + 4);
int c = 0;
if (!agit_flag)
- return 0; // Agit already End
+ return; // Agit already End
memcpy (evname, (const char *) data, len - 5);
strcpy (evname + len - 5, "Eliminate");
c = npc_event_do (evname);
printf ("NPC_Event:[%s] Run (%d) Events.\n", evname, c);
- return 0;
}
int guild_agit_break (struct mob_data *md)
@@ -1833,7 +1822,7 @@ int guild_agit_break (struct mob_data *md)
nullpo_retr (0, md);
- evname = (char *) aCalloc (strlen (md->npc_event) + 1, sizeof (char));
+ CREATE (evname, char, strlen (md->npc_event) + 1);
strcpy (evname, md->npc_event);
// Now By User to Run [OnAgitBreak] NPC Event...
@@ -1891,40 +1880,32 @@ int guild_isallied (struct guild *g, struct guild_castle *gc)
return 0;
}
-static int guild_db_final (void *key, void *data, va_list ap)
+static void guild_db_final (db_key_t key, db_val_t data, va_list ap)
{
struct guild *g = data;
free (g);
-
- return 0;
}
-static int castle_db_final (void *key, void *data, va_list ap)
+static void castle_db_final (db_key_t key, db_val_t data, va_list ap)
{
struct guild_castle *gc = data;
free (gc);
-
- return 0;
}
-static int guild_expcache_db_final (void *key, void *data, va_list ap)
+static void guild_expcache_db_final (db_key_t key, db_val_t data, va_list ap)
{
struct guild_expcache *c = data;
free (c);
-
- return 0;
}
-static int guild_infoevent_db_final (void *key, void *data, va_list ap)
+static void guild_infoevent_db_final (db_key_t key, db_val_t data, va_list ap)
{
struct eventlist *ev = data;
free (ev);
-
- return 0;
}
void do_final_guild (void)
diff --git a/src/map/itemdb.c b/src/map/itemdb.c
index dfa3d36..6557d43 100644
--- a/src/map/itemdb.c
+++ b/src/map/itemdb.c
@@ -6,13 +6,13 @@
#include "../common/db.h"
#include "../common/grfio.h"
#include "../common/nullpo.h"
-#include "../common/malloc.h"
#include "map.h"
#include "battle.h"
#include "itemdb.h"
#include "script.h"
#include "pc.h"
#include "../common/socket.h"
+#include "../common/mt_rand.h"
#ifdef MEMWATCH
#include "memwatch.h"
@@ -49,17 +49,16 @@ void itemdb_reload (void);
*------------------------------------------
*/
// name = item alias, so we should find items aliases first. if not found then look for "jname" (full name)
-int itemdb_searchname_sub (void *key, void *data, va_list ap)
+void itemdb_searchname_sub (db_key_t key, db_val_t data, va_list ap)
{
struct item_data *item = (struct item_data *) data, **dst;
char *str;
str = va_arg (ap, char *);
dst = va_arg (ap, struct item_data **);
-// if( strcmpi(item->name,str)==0 || strcmp(item->jname,str)==0 ||
+// if( strcasecmp(item->name,str)==0 || strcmp(item->jname,str)==0 ||
// memcmp(item->name,str,24)==0 || memcmp(item->jname,str,24)==0 )
- if (strcmpi (item->name, str) == 0) //by lupus
+ if (strcasecmp (item->name, str) == 0) //by lupus
*dst = item;
- return 0;
}
/*==========================================
@@ -72,7 +71,7 @@ int itemdb_searchjname_sub (void *key, void *data, va_list ap)
char *str;
str = va_arg (ap, char *);
dst = va_arg (ap, struct item_data **);
- if (strcmpi (item->jname, str) == 0)
+ if (strcasecmp (item->jname, str) == 0)
*dst = item;
return 0;
}
@@ -159,7 +158,7 @@ struct item_data *itemdb_search (int nameid)
if (id)
return id;
- id = (struct item_data *) aCalloc (1, sizeof (struct item_data));
+ id = (struct item_data *) calloc (1, sizeof (struct item_data));
numdb_insert (item_db, nameid, id);
id->nameid = nameid;
@@ -264,10 +263,9 @@ static int itemdb_read_itemslottable (void)
char *buf, *p;
int s;
- buf = grfio_read ("data\\itemslottable.txt");
+ buf = grfio_reads ("data\\itemslottable.txt", &s);
if (buf == NULL)
return -1;
- s = grfio_size ("data\\itemslottable.txt");
buf[s] = 0;
for (p = buf; p - buf < s;)
{
@@ -674,28 +672,26 @@ static int itemdb_read_noequip (void)
*
*------------------------------------------
*/
-static int itemdb_final (void *key, void *data, va_list ap)
+static void itemdb_final (db_key_t key, db_val_t data, va_list ap)
{
struct item_data *id;
- nullpo_retr (0, id = data);
+ nullpo_retv (id = data);
if (id->use_script)
free (id->use_script);
if (id->equip_script)
free (id->equip_script);
free (id);
-
- return 0;
}
void itemdb_reload (void)
{
/*
- *
+ *
* <empty item databases>
* itemdb_read();
- *
+ *
*/
do_init_itemdb ();
diff --git a/src/map/magic-expr.c b/src/map/magic-expr.c
index 18c293d..c3846e2 100644
--- a/src/map/magic-expr.c
+++ b/src/map/magic-expr.c
@@ -3,6 +3,8 @@
#include "itemdb.h"
#include <math.h>
+#include "../common/mt_rand.h"
+
#define IS_SOLID(c) ((c) == 1 || (c) == 5)
int map_is_solid (int m, int x, int y)
@@ -180,7 +182,8 @@ static void intify (val_t * v)
area_t *area_new (int ty)
{
- area_t *retval = (area_t *) aCalloc (sizeof (area_t), 1);
+ area_t *retval;
+ CREATE (retval, area_t, 1);
retval->ty = ty;
return retval;
}
diff --git a/src/map/magic-interpreter-base.c b/src/map/magic-interpreter-base.c
index 9d21832..671f962 100644
--- a/src/map/magic-interpreter-base.c
+++ b/src/map/magic-interpreter-base.c
@@ -143,8 +143,9 @@ teleport_anchor_t *magic_find_anchor (char *name)
static env_t *alloc_env (magic_conf_t * conf)
{
- env_t *env = (env_t *) aCalloc (sizeof (env_t), 1);
- env->vars = (val_t *) aCalloc (sizeof (val_t), conf->vars_nr);
+ env_t *env;
+ CREATE (env, env_t, 1);
+ CREATE (env->vars, val_t, conf->vars_nr);
env->base_env = conf;
return env;
}
@@ -295,7 +296,7 @@ spellguard_can_satisfy (spellguard_check_t * check, character_t * caster,
/*
fprintf(stderr, "MC(%d/%s)? %d%d%d%d (%u <= %u)\n",
caster->bl.id, caster->status.name,
- retval,
+ retval,
caster->cast_tick <= tick,
check->mana <= caster->status.sp,
check_prerequisites(caster, check->components),
@@ -456,8 +457,8 @@ void spell_update_location (invocation_t * invocation)
invocation_t *spell_instantiate (effect_set_t * effect_set, env_t * env)
{
- invocation_t *retval =
- (invocation_t *) aCalloc (sizeof (invocation_t), 1);
+ invocation_t *retval;
+ CREATE (retval, invocation_t, 1);
entity_t *caster;
retval->env = env;
diff --git a/src/map/magic-interpreter-parser.y b/src/map/magic-interpreter-parser.y
index 8484902..c5ee41d 100644
--- a/src/map/magic-interpreter-parser.y
+++ b/src/map/magic-interpreter-parser.y
@@ -224,13 +224,13 @@ semicolons : /* empty */
proc_formals_list : /* empty */
- { $$ = aCalloc(sizeof(proc_t), 1); }
+ { CREATE ($$, proc_t, 1); }
| proc_formals_list_ne
{ $$ = $1; }
;
proc_formals_list_ne : ID
- { $$ = aCalloc(sizeof(proc_t), 1);
+ { CREATE ($$, proc_t, 1);
$$->args_nr = 1;
$$->args = malloc(sizeof(int));
$$->args[0] = intern_id($1);
@@ -414,7 +414,7 @@ arg_list : /* empty */
arg_list_ne : expr
- { $$.args = aCalloc(sizeof(expr_t *), 1);
+ { CREATE($$.args, expr_t *, 1);
$$.args_nr = 1;
$$.args[0] = $1;
}
@@ -452,7 +452,7 @@ area : location
spelldef : spellbody_list
{ $$ = new_spell($1); }
| LET defs IN spellbody_list
- { $$ = new_spell($4);
+ { $$ = new_spell($4);
$$->letdefs_nr = $2.letdefs_nr;
$$->letdefs = $2.letdefs;
$$->spellguard = $4;
@@ -693,7 +693,7 @@ effect_list : /* empty */
| effect semicolons effect_list
{ $$ = set_effect_continuation($1, $3); }
;
-
+
%%
@@ -743,7 +743,7 @@ add_spell(spell_t *spell, int line_nr)
magic_conf.spells = realloc(magic_conf.spells, magic_conf.spells_nr * sizeof (spell_t*));
magic_conf.spells[index] = spell;
-
+
}
static void
@@ -867,7 +867,7 @@ spellguard_implication(spellguard_t *a, spellguard_t *b)
spellguard_implication(a->next, b);
else
a->next = b;
-
+
return retval;
}
diff --git a/src/map/magic-interpreter.h b/src/map/magic-interpreter.h
index 006c8fb..e9232bd 100644
--- a/src/map/magic-interpreter.h
+++ b/src/map/magic-interpreter.h
@@ -8,7 +8,6 @@
#include <string.h>
#include <math.h>
-#include "../common/malloc.h"
#include "../common/nullpo.h"
#include "battle.h"
diff --git a/src/map/magic-stmt.c b/src/map/magic-stmt.c
index b9833d6..4ae7e5d 100644
--- a/src/map/magic-stmt.c
+++ b/src/map/magic-stmt.c
@@ -64,8 +64,8 @@ static void clear_activation_record (cont_activation_record_t * ar)
}
}
-static int
-invocation_timer_callback (int _, unsigned int __, int id, int data)
+static void
+invocation_timer_callback (timer_id UNUSED, tick_t UNUSED, custom_id_t id, custom_data_t data)
{
invocation_t *invocation = (invocation_t *) map_id2bl (id);
@@ -74,7 +74,6 @@ invocation_timer_callback (int _, unsigned int __, int id, int data)
invocation->timer = 0;
spell_execute (invocation);
}
- return 0;
}
static void clear_stack (invocation_t * invocation)
@@ -224,12 +223,11 @@ static void char_update (character_t * character)
character->bl.y);
}
-static int timer_callback_effect (int _, unsigned int __, int id, int data)
+static void timer_callback_effect (timer_id UNUSED, tick_t UNUSED, custom_id_t id, custom_data_t data)
{
entity_t *target = map_id2bl (id);
if (target)
clif_misceffect (target, data);
- return 0;
}
static void entity_effect (entity_t * entity, int effect_nr, int delay)
@@ -247,14 +245,12 @@ void magic_unshroud (character_t * other_char)
// entity_effect(&other_char->bl, MAGIC_EFFECT_REVEAL);
}
-static int
-timer_callback_effect_npc_delete (int timer_id, unsigned int odelay,
- int npc_id, int _)
+static void
+timer_callback_effect_npc_delete (timer_id UNUSED, tick_t odelay,
+ custom_id_t npc_id, custom_data_t UNUSED)
{
struct npc_data *effect_npc = (struct npc_data *) map_id2bl (npc_id);
npc_free (effect_npc);
-
- return 0;
}
static struct npc_data *local_spell_effect (int m, int x, int y, int effect,
@@ -370,15 +366,13 @@ static int op_message (env_t * env, int args_nr, val_t * args)
return 0;
}
-static int
-timer_callback_kill_npc (int timer_id, unsigned int odelay, int npc_id,
- int data)
+static void
+timer_callback_kill_npc (timer_id UNUSED, tick_t odelay, custom_id_t npc_id,
+ custom_data_t data)
{
struct npc_data *npc = (struct npc_data *) map_id2bl (npc_id);
if (npc)
npc_free (npc);
-
- return 0;
}
static int op_messenger_npc (env_t * env, int args_nr, val_t * args)
@@ -420,8 +414,8 @@ static void entity_warp (entity_t * target, int destm, int destx, int desty)
// Warp part #1: update relevant data, interrupt trading etc.:
pc_setpos (character, map_name, character->bl.x, character->bl.y, 0);
// Warp part #2: now notify the client
- clif_changemap (character, map_name,
- character->bl.x, character->bl.y);
+ clif_changemap (character, map_name,
+ character->bl.x, character->bl.y);
break;
}
case BL_MOB:
@@ -1252,7 +1246,8 @@ static effect_t *run_call (invocation_t * invocation,
cont_activation_record_t *ar;
int args_nr = current->e.e_call.args_nr;
int *formals = current->e.e_call.formals;
- val_t *old_actuals = aCalloc (sizeof (val_t), args_nr);
+ val_t *old_actuals;
+ CREATE (old_actuals, val_t, args_nr);
int i;
ar = add_stack_entry (invocation, CONT_STACK_PROC, return_location);
diff --git a/src/map/map.c b/src/map/map.c
index e1adcef..8261e49 100644
--- a/src/map/map.c
+++ b/src/map/map.c
@@ -13,8 +13,7 @@
#include "../common/timer.h"
#include "../common/db.h"
#include "../common/grfio.h"
-#include "../common/malloc.h"
-
+#include "../common/mt_rand.h"
#include "map.h"
#include "chrif.h"
#include "clif.h"
@@ -785,7 +784,7 @@ void map_foreachobject (int (*func) (struct block_list *, va_list), int type,
* map.h内で#defineしてある
*------------------------------------------
*/
-int map_clearflooritem_timer (int tid, unsigned int tick, int id, int data)
+void map_clearflooritem_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct flooritem_data *fitem = NULL;
@@ -795,14 +794,12 @@ int map_clearflooritem_timer (int tid, unsigned int tick, int id, int data)
{
if (battle_config.error_log)
printf ("map_clearflooritem_timer : error\n");
- return 1;
+ return;
}
if (data)
delete_timer (fitem->cleartimer, map_clearflooritem_timer);
clif_clearflooritem (fitem, 0);
map_delobject (fitem->bl.id, BL_ITEM);
-
- return 0;
}
/*==========================================
@@ -876,7 +873,7 @@ int map_addflooritem_any (struct item *item_data, int amount, int m, int x,
return 0;
r = mt_random ();
- fitem = (struct flooritem_data *) aCalloc (1, sizeof (*fitem));
+ CREATE (fitem, struct flooritem_data, 1);
fitem->bl.type = BL_ITEM;
fitem->bl.prev = fitem->bl.next = NULL;
fitem->bl.m = m;
@@ -1030,7 +1027,7 @@ void map_addchariddb (int charid, char *name)
p = numdb_search (charid_db, charid);
if (p == NULL)
{ // データベースにない
- p = (struct charid2nick *) aCalloc (1, sizeof (struct charid2nick));
+ CREATE (p, struct charid2nick, 1);
p->req_id = 0;
}
else
@@ -1061,7 +1058,7 @@ int map_reqchariddb (struct map_session_data *sd, int charid)
p = numdb_search (charid_db, charid);
if (p != NULL) // データベースにすでにある
return 0;
- p = (struct charid2nick *) aCalloc (1, sizeof (struct charid2nick));
+ CREATE (p, struct charid2nick, 1);
p->req_id = sd->bl.id;
numdb_insert (charid_db, charid, p);
return 0;
@@ -1302,7 +1299,7 @@ struct map_session_data *map_nick2sd (char *nick)
&& pl_sd->state.auth)
{
// Without case sensitive check (increase the number of similar character names found)
- if (strnicmp (pl_sd->status.name, nick, nicklen) == 0)
+ if (strncasecmp (pl_sd->status.name, nick, nicklen) == 0)
{
// Strict comparison (if found, we finish the function immediatly with correct value)
if (strcmp (pl_sd->status.name, nick) == 0)
@@ -1341,7 +1338,7 @@ struct block_list *map_id2bl (int id)
* id_db内の全てにfuncを実行
*------------------------------------------
*/
-int map_foreachiddb (int (*func) (void *, void *, va_list), ...)
+int map_foreachiddb (db_func_t func, ...)
{
va_list ap = NULL;
@@ -1573,10 +1570,7 @@ int map_setipport (char *name, unsigned long ip, int port)
md = strdb_search (map_db, name);
if (md == NULL)
{ // not exist -> add new data
- mdos =
- (struct map_data_other_server *) aCalloc (1,
- sizeof (struct
- map_data_other_server));
+ CREATE (mdos, struct map_data_other_server, 1);
memcpy (mdos->name, name, 24);
mdos->gat = NULL;
mdos->ip = ip;
@@ -1609,7 +1603,7 @@ int map_setipport (char *name, unsigned long ip, int port)
* 水場高さ設定
*------------------------------------------
*/
-static struct
+static struct Waterlist
{
char mapname[24];
int waterheight;
@@ -1642,7 +1636,9 @@ static void map_readwater (char *watertxt)
return;
}
if (waterlist == NULL)
- waterlist = aCalloc (MAX_MAP_PER_SERVER, sizeof (*waterlist));
+ {
+ CREATE (waterlist, struct Waterlist, MAX_MAP_PER_SERVER);
+ }
while (fgets (line, 1020, fp) && n < MAX_MAP_PER_SERVER)
{
int wh, count;
@@ -1777,7 +1773,8 @@ int map_readallmap (void)
if (strstr (map[i].name, ".gat") == NULL)
continue;
sprintf (fn, "data\\%s", map[i].name);
- if (grfio_size (fn) == -1)
+ // TODO - remove this, it is the last call to grfio_size, which is deprecated
+ if (!grfio_size (fn))
{
map_delmap (map[i].name);
maps_removed++;
@@ -1825,7 +1822,7 @@ int map_readallmap (void)
*/
int map_addmap (char *mapname)
{
- if (strcmpi (mapname, "clear") == 0)
+ if (strcasecmp (mapname, "clear") == 0)
{
map_num = 0;
return 0;
@@ -1849,7 +1846,7 @@ int map_delmap (char *mapname)
{
int i;
- if (strcmpi (mapname, "all") == 0)
+ if (strcasecmp (mapname, "all") == 0)
{
map_num = 0;
return 0;
@@ -1959,15 +1956,15 @@ int map_config_read (char *cfgName)
continue;
if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) == 2)
{
- if (strcmpi (w1, "userid") == 0)
+ if (strcasecmp (w1, "userid") == 0)
{
chrif_setuserid (w2);
}
- else if (strcmpi (w1, "passwd") == 0)
+ else if (strcasecmp (w1, "passwd") == 0)
{
chrif_setpasswd (w2);
}
- else if (strcmpi (w1, "char_ip") == 0)
+ else if (strcasecmp (w1, "char_ip") == 0)
{
h = gethostbyname (w2);
if (h != NULL)
@@ -1985,11 +1982,11 @@ int map_config_read (char *cfgName)
}
chrif_setip (w2);
}
- else if (strcmpi (w1, "char_port") == 0)
+ else if (strcasecmp (w1, "char_port") == 0)
{
chrif_setport (atoi (w2));
}
- else if (strcmpi (w1, "map_ip") == 0)
+ else if (strcasecmp (w1, "map_ip") == 0)
{
h = gethostbyname (w2);
if (h != NULL)
@@ -2006,70 +2003,58 @@ int map_config_read (char *cfgName)
}
clif_setip (w2);
}
- else if (strcmpi (w1, "map_port") == 0)
+ else if (strcasecmp (w1, "map_port") == 0)
{
clif_setport (atoi (w2));
map_port = (atoi (w2));
}
- else if (strcmpi (w1, "water_height") == 0)
+ else if (strcasecmp (w1, "water_height") == 0)
{
map_readwater (w2);
}
- else if (strcmpi (w1, "map") == 0)
+ else if (strcasecmp (w1, "map") == 0)
{
map_addmap (w2);
}
- else if (strcmpi (w1, "delmap") == 0)
+ else if (strcasecmp (w1, "delmap") == 0)
{
map_delmap (w2);
}
- else if (strcmpi (w1, "npc") == 0)
+ else if (strcasecmp (w1, "npc") == 0)
{
npc_addsrcfile (w2);
}
- else if (strcmpi (w1, "delnpc") == 0)
+ else if (strcasecmp (w1, "delnpc") == 0)
{
npc_delsrcfile (w2);
}
- else if (strcmpi (w1, "data_grf") == 0)
- {
- grfio_setdatafile (w2);
- }
- else if (strcmpi (w1, "sdata_grf") == 0)
- {
- grfio_setsdatafile (w2);
- }
- else if (strcmpi (w1, "adata_grf") == 0)
- {
- grfio_setadatafile (w2);
- }
- else if (strcmpi (w1, "autosave_time") == 0)
+ else if (strcasecmp (w1, "autosave_time") == 0)
{
autosave_interval = atoi (w2) * 1000;
if (autosave_interval <= 0)
autosave_interval = DEFAULT_AUTOSAVE_INTERVAL;
}
- else if (strcmpi (w1, "motd_txt") == 0)
+ else if (strcasecmp (w1, "motd_txt") == 0)
{
strcpy (motd_txt, w2);
}
- else if (strcmpi (w1, "help_txt") == 0)
+ else if (strcasecmp (w1, "help_txt") == 0)
{
strcpy (help_txt, w2);
}
- else if (strcmpi (w1, "mapreg_txt") == 0)
+ else if (strcasecmp (w1, "mapreg_txt") == 0)
{
strcpy (mapreg_txt, w2);
}
- else if (strcmpi (w1, "gm_log") == 0)
+ else if (strcasecmp (w1, "gm_log") == 0)
{
gm_logfile_name = strdup (w2);
}
- else if (strcmpi (w1, "log_file") == 0)
+ else if (strcasecmp (w1, "log_file") == 0)
{
map_set_logfile (w2);
}
- else if (strcmpi (w1, "import") == 0)
+ else if (strcasecmp (w1, "import") == 0)
{
map_config_read (w2);
}
@@ -2080,26 +2065,6 @@ int map_config_read (char *cfgName)
return 0;
}
-int id_db_final (void *k, void *d, va_list ap)
-{
- return 0;
-}
-
-int map_db_final (void *k, void *d, va_list ap)
-{
- return 0;
-}
-
-int nick_db_final (void *k, void *d, va_list ap)
-{
- return 0;
-}
-
-int charid_db_final (void *k, void *d, va_list ap)
-{
- return 0;
-}
-
static int cleanup_sub (struct block_list *bl, va_list ap)
{
nullpo_retr (0, bl);
@@ -2150,10 +2115,10 @@ void do_final (void)
map_removenpc ();
timer_final ();
- numdb_final (id_db, id_db_final);
- strdb_final (map_db, map_db_final);
- strdb_final (nick_db, nick_db_final);
- numdb_final (charid_db, charid_db_final);
+ numdb_final (id_db, NULL);
+ strdb_final (map_db, NULL);
+ strdb_final (nick_db, NULL);
+ numdb_final (charid_db, NULL);
for (i = 0; i <= map_num; i++)
{
@@ -2190,6 +2155,10 @@ int compare_item (struct item *a, struct item *b)
(a->card[2] == b->card[2]) && (a->card[3] == b->card[3]));
}
+// TODO move shutdown stuff here
+void term_func (void)
+{
+}
/*======================================================
* Map-Server Init and Command-line Arguments [Valaris]
*------------------------------------------------------
@@ -2203,7 +2172,6 @@ int do_init (int argc, char *argv[])
unsigned char *ATCOMMAND_CONF_FILENAME = "conf/atcommand_athena.conf";
unsigned char *SCRIPT_CONF_NAME = "conf/script_athena.conf";
unsigned char *MSG_CONF_NAME = "conf/msg_athena.conf";
- unsigned char *GRF_PATH_FILENAME = "conf/grf-files.txt";
for (i = 1; i < argc; i++)
{
@@ -2221,8 +2189,6 @@ int do_init (int argc, char *argv[])
SCRIPT_CONF_NAME = argv[i + 1];
else if (strcmp (argv[i], "--msg_config") == 0)
MSG_CONF_NAME = argv[i + 1];
- else if (strcmp (argv[i], "--grf_path_file") == 0)
- GRF_PATH_FILENAME = argv[i + 1];
}
map_config_read (MAP_CONF_NAME);
@@ -2238,12 +2204,9 @@ int do_init (int argc, char *argv[])
nick_db = strdb_init (24);
charid_db = numdb_init ();
- grfio_init (GRF_PATH_FILENAME);
-
map_readallmap ();
- add_timer_func_list (map_clearflooritem_timer,
- "map_clearflooritem_timer");
+// add_timer_func_list (map_clearflooritem_timer, "map_clearflooritem_timer");
do_init_chrif ();
do_init_clif ();
diff --git a/src/map/map.h b/src/map/map.h
index a558397..5955418 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -8,6 +8,8 @@
#include <sys/time.h>
#include <netinet/in.h>
#include "../common/mmo.h"
+#include "../common/timer.h"
+#include "../common/db.h"
#ifndef MAX
# define MAX(x,y) (((x)>(y)) ? (x) : (y))
@@ -762,7 +764,7 @@ void map_write_log (char *format, ...);
#define MAP_LOG_PC(sd, fmt, args...) MAP_LOG("PC%d %d:%d,%d " fmt, sd->status.char_id, sd->bl.m, sd->bl.x, sd->bl.y, ## args)
// 床アイテム関連
-int map_clearflooritem_timer (int, unsigned int, int, int);
+void map_clearflooritem_timer (timer_id, tick_t, custom_id_t, custom_data_t);
#define map_clearflooritem(id) map_clearflooritem_timer(0,0,id,1)
int map_addflooritem_any (struct item *, int amount, int m, int x, int y,
struct map_session_data **owners,
@@ -787,7 +789,7 @@ int map_setipport (char *name, unsigned long ip, int port);
int map_eraseipport (char *name, unsigned long ip, int port);
void map_addiddb (struct block_list *);
void map_deliddb (struct block_list *bl);
-int map_foreachiddb (int (*)(void *, void *, va_list), ...);
+int map_foreachiddb (db_func_t, ...);
void map_addnickdb (struct map_session_data *);
int map_scriptcont (struct map_session_data *sd, int id); /* Continues a script either on a spell or on an NPC */
struct map_session_data *map_nick2sd (char *);
diff --git a/src/map/mob.c b/src/map/mob.c
index 99d1cc2..3e3297d 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -9,7 +9,7 @@
#include "../common/socket.h"
#include "../common/db.h"
#include "../common/nullpo.h"
-#include "../common/malloc.h"
+#include "../common/mt_rand.h"
#include "map.h"
#include "clif.h"
#include "intif.h"
@@ -43,7 +43,7 @@ struct mob_db mob_db[2001];
*/
static int distance (int, int, int, int);
static int mob_makedummymobdb (int);
-static int mob_timer (int, unsigned int, int, int);
+static void mob_timer (timer_id, tick_t, custom_id_t, custom_data_t);
int mobskill_use (struct mob_data *md, unsigned int tick, int event);
int mobskill_deltimer (struct mob_data *md);
int mob_skillid2skillidx (int class, int skillid);
@@ -61,7 +61,7 @@ int mobdb_searchname (const char *str)
for (i = 0; i < sizeof (mob_db) / sizeof (mob_db[0]); i++)
{
- if (strcmpi (mob_db[i].name, str) == 0
+ if (strcasecmp (mob_db[i].name, str) == 0
|| strcmp (mob_db[i].jname, str) == 0
|| memcmp (mob_db[i].name, str, 24) == 0
|| memcmp (mob_db[i].jname, str, 24) == 0)
@@ -188,7 +188,7 @@ static void mob_mutate (struct mob_data *md, int stat, int intensity) // inten
{
int old_stat;
int new_stat;
- int real_intensity; // relative intensity
+ int real_intensity; // relative intensity
const int mut_base = mutation_base[stat];
int sign = 1;
@@ -399,11 +399,10 @@ int mob_once_spawn (struct map_session_data *sd, char *mapname,
for (count = 0; count < amount; count++)
{
- md = (struct mob_data *) aCalloc (1, sizeof (struct mob_data));
- memset (md, '\0', sizeof *md);
+ md = (struct mob_data *) calloc (1, sizeof (struct mob_data));
if (mob_db[class].mode & 0x02)
md->lootitem =
- (struct item *) aCalloc (LOOTITEM_SIZE, sizeof (struct item));
+ (struct item *) calloc (LOOTITEM_SIZE, sizeof (struct item));
else
md->lootitem = NULL;
@@ -1035,33 +1034,33 @@ int mob_changestate (struct mob_data *md, int state, int type)
* It branches to a walk and an attack.
*------------------------------------------
*/
-static int mob_timer (int tid, unsigned int tick, int id, int data)
+static void mob_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct mob_data *md;
struct block_list *bl;
if ((bl = map_id2bl (id)) == NULL)
{ //攻撃してきた敵がもういないのは正常のようだ
- return 1;
+ return;
}
if (!bl || !bl->type || bl->type != BL_MOB)
- return 1;
+ return;
- nullpo_retr (1, md = (struct mob_data *) bl);
+ nullpo_retv (md = (struct mob_data *) bl);
if (!md->bl.type || md->bl.type != BL_MOB)
- return 1;
+ return;
if (md->timer != tid)
{
if (battle_config.error_log == 1)
printf ("mob_timer %d != %d\n", md->timer, tid);
- return 0;
+ return;
}
md->timer = -1;
if (md->bl.prev == NULL || md->state.state == MS_DEAD)
- return 1;
+ return;
map_freeblock_lock ();
switch (md->state.state)
@@ -1082,7 +1081,7 @@ static int mob_timer (int tid, unsigned int tick, int id, int data)
break;
}
map_freeblock_unlock ();
- return 0;
+ return;
}
/*==========================================
@@ -1141,10 +1140,9 @@ int mob_walktoxy (struct mob_data *md, int x, int y, int easy)
* mob spawn with delay (timer function)
*------------------------------------------
*/
-static int mob_delayspawn (int tid, unsigned int tick, int m, int n)
+static void mob_delayspawn (timer_id tid, tick_t tick, custom_id_t m, custom_data_t n)
{
mob_spawn (m);
- return 0;
}
/*==========================================
@@ -2311,44 +2309,42 @@ static int mob_ai_sub_foreachclient (struct map_session_data *sd, va_list ap)
* Serious processing for mob in PC field of view (interval timer function)
*------------------------------------------
*/
-static int mob_ai_hard (int tid, unsigned int tick, int id, int data)
+static void mob_ai_hard (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
clif_foreachclient (mob_ai_sub_foreachclient, tick);
-
- return 0;
}
/*==========================================
* Negligent mode MOB AI (PC is not in near)
*------------------------------------------
*/
-static int mob_ai_sub_lazy (void *key, void *data, va_list app)
+static void mob_ai_sub_lazy (db_key_t key, db_val_t data, va_list app)
{
struct mob_data *md = data;
unsigned int tick;
va_list ap;
- nullpo_retr (0, md);
- nullpo_retr (0, app);
- nullpo_retr (0, ap = va_arg (app, va_list));
+ nullpo_retv (md);
+ nullpo_retv (app);
+ nullpo_retv (ap = va_arg (app, va_list));
if (md == NULL)
- return 0;
+ return;
if (!md->bl.type || md->bl.type != BL_MOB)
- return 0;
+ return;
tick = va_arg (ap, unsigned int);
if (DIFF_TICK (tick, md->last_thinktime) < MIN_MOBTHINKTIME * 10)
- return 0;
+ return;
md->last_thinktime = tick;
if (md->bl.prev == NULL || md->skilltimer != -1)
{
if (DIFF_TICK (tick, md->next_walktime) > MIN_MOBTHINKTIME * 10)
md->next_walktime = tick;
- return 0;
+ return;
}
if (DIFF_TICK (md->next_walktime, tick) < 0 &&
@@ -2383,18 +2379,15 @@ static int mob_ai_sub_lazy (void *key, void *data, va_list app)
md->next_walktime = tick + MPRAND (5000, 10000);
}
- return 0;
}
/*==========================================
* Negligent processing for mob outside PC field of view (interval timer function)
*------------------------------------------
*/
-static int mob_ai_lazy (int tid, unsigned int tick, int id, int data)
+static void mob_ai_lazy (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
map_foreachiddb (mob_ai_sub_lazy, tick);
-
- return 0;
}
/*==========================================
@@ -2421,13 +2414,13 @@ struct delay_item_drop2
* item drop with delay (timer function)
*------------------------------------------
*/
-static int mob_delay_item_drop (int tid, unsigned int tick, int id, int data)
+static void mob_delay_item_drop (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct delay_item_drop *ditem;
struct item temp_item;
int flag;
- nullpo_retr (0, ditem = (struct delay_item_drop *) id);
+ nullpo_retv (ditem = (struct delay_item_drop *) id);
memset (&temp_item, 0, sizeof (temp_item));
temp_item.nameid = ditem->nameid;
@@ -2446,26 +2439,25 @@ static int mob_delay_item_drop (int tid, unsigned int tick, int id, int data)
ditem->third_sd, 0);
}
free (ditem);
- return 0;
+ return;
}
map_addflooritem (&temp_item, 1, ditem->m, ditem->x, ditem->y,
ditem->first_sd, ditem->second_sd, ditem->third_sd, 0);
free (ditem);
- return 0;
}
/*==========================================
* item drop (timer function)-lootitem with delay
*------------------------------------------
*/
-static int mob_delay_item_drop2 (int tid, unsigned int tick, int id, int data)
+static void mob_delay_item_drop2 (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct delay_item_drop2 *ditem;
int flag;
- nullpo_retr (0, ditem = (struct delay_item_drop2 *) id);
+ nullpo_retv (ditem = (struct delay_item_drop2 *) id);
if (battle_config.item_auto_get == 1)
{
@@ -2480,7 +2472,7 @@ static int mob_delay_item_drop2 (int tid, unsigned int tick, int id, int data)
ditem->second_sd, ditem->third_sd, 0);
}
free (ditem);
- return 0;
+ return;
}
map_addflooritem (&ditem->item_data, ditem->item_data.amount, ditem->m,
@@ -2488,7 +2480,6 @@ static int mob_delay_item_drop2 (int tid, unsigned int tick, int id, int data)
ditem->third_sd, 0);
free (ditem);
- return 0;
}
/*==========================================
@@ -2524,16 +2515,15 @@ int mob_catch_delete (struct mob_data *md, int type)
return 0;
}
-int mob_timer_delete (int tid, unsigned int tick, int id, int data)
+void mob_timer_delete (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct block_list *bl = map_id2bl (id);
struct mob_data *md;
- nullpo_retr (0, bl);
+ nullpo_retv (bl);
md = (struct mob_data *) bl;
mob_catch_delete (md, 3);
- return 0;
}
/*==========================================
@@ -3009,10 +2999,8 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
if (drop_rate <= MRAND (10000))
continue;
- ditem =
- (struct delay_item_drop *) aCalloc (1,
- sizeof (struct
- delay_item_drop));
+ ditem = (struct delay_item_drop *)
+ calloc (1, sizeof (struct delay_item_drop));
ditem->nameid = mob_db[md->class].dropitem[i].nameid;
ditem->amount = 1;
ditem->m = md->bl.m;
@@ -3021,8 +3009,7 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
ditem->first_sd = mvp_sd;
ditem->second_sd = second_sd;
ditem->third_sd = third_sd;
- add_timer (tick + 500 + i, mob_delay_item_drop, (int) ditem,
- 0);
+ add_timer (tick + 500 + i, mob_delay_item_drop, (int) ditem, 0);
}
if (sd && sd->state.attack_type == BF_WEAPON)
{
@@ -3041,10 +3028,8 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
if (sd->monster_drop_itemrate[i] <= MRAND (10000))
continue;
- ditem =
- (struct delay_item_drop *) aCalloc (1,
- sizeof (struct
- delay_item_drop));
+ ditem = (struct delay_item_drop *)
+ calloc (1, sizeof (struct delay_item_drop));
ditem->nameid = sd->monster_drop_itemid[i];
ditem->amount = 1;
ditem->m = md->bl.m;
@@ -3068,10 +3053,8 @@ int mob_damage (struct block_list *src, struct mob_data *md, int damage,
{
struct delay_item_drop2 *ditem;
- ditem =
- (struct delay_item_drop2 *) aCalloc (1,
- sizeof (struct
- delay_item_drop2));
+ ditem = (struct delay_item_drop2 *)
+ calloc (1, sizeof (struct delay_item_drop2));
memcpy (&ditem->item_data, &md->lootitem[i],
sizeof (md->lootitem[0]));
ditem->m = md->bl.m;
@@ -3252,8 +3235,8 @@ int mob_class_change (struct mob_data *md, int *value)
md->skilllv = 0;
if (md->lootitem == NULL && mob_db[class].mode & 0x02)
- md->lootitem =
- (struct item *) aCalloc (LOOTITEM_SIZE, sizeof (struct item));
+ md->lootitem = (struct item *)
+ calloc (LOOTITEM_SIZE, sizeof (struct item));
skill_clear_unitgroup (&md->bl);
skill_cleartimerskill (&md->bl);
@@ -3487,11 +3470,10 @@ int mob_summonslave (struct mob_data *md2, int *value, int amount, int flag)
for (; amount > 0; amount--)
{
int x = 0, y = 0, c = 0, i = 0;
- md = (struct mob_data *) aCalloc (1, sizeof (struct mob_data));
+ md = (struct mob_data *) calloc (1, sizeof (struct mob_data));
if (mob_db[class].mode & 0x02)
- md->lootitem =
- (struct item *) aCalloc (LOOTITEM_SIZE,
- sizeof (struct item));
+ md->lootitem = (struct item *)
+ calloc (LOOTITEM_SIZE, sizeof (struct item));
else
md->lootitem = NULL;
@@ -3620,7 +3602,7 @@ int mob_skillid2skillidx (int class, int skillid)
* スキル使用(詠唱完了、ID指定)
*------------------------------------------
*/
-int mobskill_castend_id (int tid, unsigned int tick, int id, int data)
+void mobskill_castend_id (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct mob_data *md = NULL;
struct block_list *bl;
@@ -3628,16 +3610,16 @@ int mobskill_castend_id (int tid, unsigned int tick, int id, int data)
int range;
if ((mbl = map_id2bl (id)) == NULL) //詠唱したMobがもういないというのは良くある正常処理
- return 0;
+ return;
if ((md = (struct mob_data *) mbl) == NULL)
{
printf ("mobskill_castend_id nullpo mbl->id:%d\n", mbl->id);
- return 0;
+ return;
}
if (md->bl.type != BL_MOB || md->bl.prev == NULL)
- return 0;
+ return;
if (md->skilltimer != tid) // タイマIDの確認
- return 0;
+ return;
md->skilltimer = -1;
//沈黙や状態異常など
@@ -3646,13 +3628,13 @@ int mobskill_castend_id (int tid, unsigned int tick, int id, int data)
if (md->opt1 > 0 || md->sc_data[SC_DIVINA].timer != -1
|| md->sc_data[SC_ROKISWEIL].timer != -1
|| md->sc_data[SC_STEELBODY].timer != -1)
- return 0;
+ return;
if (md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //オートカウンター
- return 0;
+ return;
if (md->sc_data[SC_BLADESTOP].timer != -1) //白刃取り
- return 0;
+ return;
if (md->sc_data[SC_BERSERK].timer != -1) //バーサーク
- return 0;
+ return;
}
if (md->skillid != NPC_EMOTION)
md->last_thinktime = tick + battle_get_adelay (&md->bl);
@@ -3660,10 +3642,10 @@ int mobskill_castend_id (int tid, unsigned int tick, int id, int data)
if ((bl = map_id2bl (md->skilltarget)) == NULL || bl->prev == NULL)
{ //スキルターゲットが存在しない
//printf("mobskill_castend_id nullpo\n");//ターゲットがいないときはnullpoじゃなくて普通に終了
- return 0;
+ return;
}
if (md->bl.m != bl->m)
- return 0;
+ return;
if (md->skillid == PR_LEXAETERNA)
{
@@ -3672,7 +3654,7 @@ int mobskill_castend_id (int tid, unsigned int tick, int id, int data)
&& (sc_data[SC_FREEZE].timer != -1
|| (sc_data[SC_STONE].timer != -1
&& sc_data[SC_STONE].val2 == 0)))
- return 0;
+ return;
}
else if (md->skillid == RG_BACKSTAP)
{
@@ -3680,17 +3662,17 @@ int mobskill_castend_id (int tid, unsigned int tick, int id, int data)
battle_get_dir (bl);
int dist = distance (md->bl.x, md->bl.y, bl->x, bl->y);
if (bl->type != BL_SKILL && (dist == 0 || map_check_dir (dir, t_dir)))
- return 0;
+ return;
}
if (((skill_get_inf (md->skillid) & 1) || (skill_get_inf2 (md->skillid) & 4)) && // 彼我敵対関係チェック
battle_check_target (&md->bl, bl, BCT_ENEMY) <= 0)
- return 0;
+ return;
range = skill_get_range (md->skillid, md->skilllv);
if (range < 0)
range = battle_get_range (&md->bl) - (range + 1);
if (range + battle_config.mob_skill_add_range <
distance (md->bl.x, md->bl.y, bl->x, bl->y))
- return 0;
+ return;
md->skilldelay[md->skillidx] = tick;
@@ -3720,15 +3702,13 @@ int mobskill_castend_id (int tid, unsigned int tick, int id, int data)
md->skilllv, tick, 0);
break;
}
-
- return 0;
}
/*==========================================
* スキル使用(詠唱完了、場所指定)
*------------------------------------------
*/
-int mobskill_castend_pos (int tid, unsigned int tick, int id, int data)
+void mobskill_castend_pos (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct mob_data *md = NULL;
struct block_list *bl;
@@ -3736,15 +3716,15 @@ int mobskill_castend_pos (int tid, unsigned int tick, int id, int data)
//mobskill_castend_id同様詠唱したMobが詠唱完了時にもういないというのはありそうなのでnullpoから除外
if ((bl = map_id2bl (id)) == NULL)
- return 0;
+ return;
- nullpo_retr (0, md = (struct mob_data *) bl);
+ nullpo_retv (md = (struct mob_data *) bl);
if (md->bl.type != BL_MOB || md->bl.prev == NULL)
- return 0;
+ return;
if (md->skilltimer != tid) // タイマIDの確認
- return 0;
+ return;
md->skilltimer = -1;
if (md->sc_data)
@@ -3752,13 +3732,13 @@ int mobskill_castend_pos (int tid, unsigned int tick, int id, int data)
if (md->opt1 > 0 || md->sc_data[SC_DIVINA].timer != -1
|| md->sc_data[SC_ROKISWEIL].timer != -1
|| md->sc_data[SC_STEELBODY].timer != -1)
- return 0;
+ return;
if (md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //オートカウンター
- return 0;
+ return;
if (md->sc_data[SC_BLADESTOP].timer != -1) //白刃取り
- return 0;
+ return;
if (md->sc_data[SC_BERSERK].timer != -1) //バーサーク
- return 0;
+ return;
}
if (battle_config.monster_skill_reiteration == 0)
@@ -3789,7 +3769,7 @@ int mobskill_castend_pos (int tid, unsigned int tick, int id, int data)
{
if (skill_check_unit_range
(md->bl.m, md->skillx, md->skilly, range, md->skillid) > 0)
- return 0;
+ return;
}
}
if (battle_config.monster_skill_nofootset == 1)
@@ -3819,7 +3799,7 @@ int mobskill_castend_pos (int tid, unsigned int tick, int id, int data)
{
if (skill_check_unit_range2
(md->bl.m, md->skillx, md->skilly, range) > 0)
- return 0;
+ return;
}
}
@@ -3836,7 +3816,7 @@ int mobskill_castend_pos (int tid, unsigned int tick, int id, int data)
c++;
}
if (c >= maxcount)
- return 0;
+ return;
}
}
@@ -3845,7 +3825,7 @@ int mobskill_castend_pos (int tid, unsigned int tick, int id, int data)
range = battle_get_range (&md->bl) - (range + 1);
if (range + battle_config.mob_skill_add_range <
distance (md->bl.x, md->bl.y, md->skillx, md->skilly))
- return 0;
+ return;
md->skilldelay[md->skillidx] = tick;
if (battle_config.mob_skill_log == 1)
@@ -3856,7 +3836,7 @@ int mobskill_castend_pos (int tid, unsigned int tick, int id, int data)
skill_castend_pos2 (&md->bl, md->skillx, md->skilly, md->skillid,
md->skilllv, tick, 0);
- return 0;
+ return;
}
/*==========================================
@@ -4292,7 +4272,7 @@ int mobskill_use (struct mob_data *md, unsigned int tick, int event)
if (ms[i].target == MST_MASTER)
{
bl = &md->bl;
- if (md->master_id)
+ if (md->master_id)
bl = map_id2bl (md->master_id);
}
else
@@ -5048,10 +5028,10 @@ static int mob_readskilldb (void)
void mob_reload (void)
{
/*
- *
+ *
* <empty monster database>
* mob_read();
- *
+ *
*/
do_init_mob ();
@@ -5069,15 +5049,6 @@ int do_init_mob (void)
mob_read_randommonster ();
mob_readskilldb ();
- add_timer_func_list (mob_timer, "mob_timer");
- add_timer_func_list (mob_delayspawn, "mob_delayspawn");
- add_timer_func_list (mob_delay_item_drop, "mob_delay_item_drop");
- add_timer_func_list (mob_delay_item_drop2, "mob_delay_item_drop2");
- add_timer_func_list (mob_ai_hard, "mob_ai_hard");
- add_timer_func_list (mob_ai_lazy, "mob_ai_lazy");
- add_timer_func_list (mobskill_castend_id, "mobskill_castend_id");
- add_timer_func_list (mobskill_castend_pos, "mobskill_castend_pos");
- add_timer_func_list (mob_timer_delete, "mob_timer_delete");
add_timer_interval (gettick () + MIN_MOBTHINKTIME, mob_ai_hard, 0, 0,
MIN_MOBTHINKTIME);
add_timer_interval (gettick () + MIN_MOBTHINKTIME * 10, mob_ai_lazy, 0, 0,
diff --git a/src/map/mob.h b/src/map/mob.h
index 2463283..aff305b 100644
--- a/src/map/mob.h
+++ b/src/map/mob.h
@@ -1,7 +1,7 @@
// $Id: mob.h,v 1.4 2004/09/25 05:32:18 MouseJstr Exp $
#ifndef _MOB_H_
#define _MOB_H_
-
+#include "../common/timer.h"
#define MAX_RANDOMMONSTER 3
struct mob_skill
@@ -129,7 +129,7 @@ int do_init_mob (void);
int mob_delete (struct mob_data *md);
int mob_catch_delete (struct mob_data *md, int type);
-int mob_timer_delete (int tid, unsigned int tick, int id, int data);
+void mob_timer_delete (timer_id, tick_t, custom_id_t, custom_data_t);
int mob_deleteslave (struct mob_data *md);
@@ -141,8 +141,8 @@ int mob_warp (struct mob_data *md, int m, int x, int y, int type);
int mobskill_use (struct mob_data *md, unsigned int tick, int event);
int mobskill_event (struct mob_data *md, int flag);
-int mobskill_castend_id (int tid, unsigned int tick, int id, int data);
-int mobskill_castend_pos (int tid, unsigned int tick, int id, int data);
+void mobskill_castend_id (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data);
+void mobskill_castend_pos (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data);
int mob_summonslave (struct mob_data *md2, int *value, int amount, int flag);
int mob_gvmobcheck (struct map_session_data *sd, struct block_list *bl);
diff --git a/src/map/npc.c b/src/map/npc.c
index 5fd8291..54b13d8 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -6,7 +6,6 @@
#include <math.h>
#include <time.h>
-#include "../common/malloc.h"
#include "../common/nullpo.h"
#include "../common/timer.h"
@@ -63,7 +62,7 @@ int npc_enable_sub (struct block_list *bl, va_list ap)
{
struct map_session_data *sd;
struct npc_data *nd;
- char *name = (char *) aCalloc (50, sizeof (char));
+ char *name = (char *) calloc (50, sizeof (char));
nullpo_retr (0, bl);
nullpo_retr (0, ap);
@@ -173,15 +172,14 @@ int npc_delete (struct npc_data *nd)
* イベントの遅延実行
*------------------------------------------
*/
-int npc_event_timer (int tid, unsigned int tick, int id, int data)
+void npc_event_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct map_session_data *sd = map_id2sd (id);
if (sd == NULL)
- return 0;
+ return;
npc_event (sd, (const char *) data, 0);
free ((void *) data);
- return 0;
}
int npc_timer_event (const char *eventname) // Added by RoVeRT
@@ -294,18 +292,18 @@ int npc_event_export (void *key, void *data, va_list ap)
* 全てのNPCのOn*イベント実行
*------------------------------------------
*/
-int npc_event_doall_sub (void *key, void *data, va_list ap)
+void npc_event_doall_sub (db_key_t key, db_val_t data, va_list ap)
{
- char *p = (char *) key;
+ const char *p = key.s;
int rid, argc;
argrec_t *argv;
struct event_data *ev;
int *c;
const char *name;
- nullpo_retr (0, ev = (struct event_data *) data);
- nullpo_retr (0, ap);
- nullpo_retr (0, c = va_arg (ap, int *));
+ nullpo_retv (ev = (struct event_data *) data);
+ nullpo_retv (ap);
+ nullpo_retv (c = va_arg (ap, int *));
name = va_arg (ap, const char *);
rid = va_arg (ap, int);
@@ -318,8 +316,6 @@ int npc_event_doall_sub (void *key, void *data, va_list ap)
argv);
(*c)++;
}
-
- return 0;
}
int npc_event_doall_l (const char *name, int rid, int argc, argrec_t * args)
@@ -333,18 +329,18 @@ int npc_event_doall_l (const char *name, int rid, int argc, argrec_t * args)
return c;
}
-int npc_event_do_sub (void *key, void *data, va_list ap)
+void npc_event_do_sub (db_key_t key, db_val_t data, va_list ap)
{
- char *p = (char *) key;
+ const char *p = key.s;
struct event_data *ev;
int *c;
const char *name;
int rid, argc;
argrec_t *argv;
- nullpo_retr (0, ev = (struct event_data *) data);
- nullpo_retr (0, ap);
- nullpo_retr (0, c = va_arg (ap, int *));
+ nullpo_retv (ev = (struct event_data *) data);
+ nullpo_retv (ap);
+ nullpo_retv (c = va_arg (ap, int *));
name = va_arg (ap, const char *);
rid = va_arg (ap, int);
@@ -357,8 +353,6 @@ int npc_event_do_sub (void *key, void *data, va_list ap)
argv);
(*c)++;
}
-
- return 0;
}
int npc_event_do_l (const char *name, int rid, int argc, argrec_t * args)
@@ -378,7 +372,7 @@ int npc_event_do_l (const char *name, int rid, int argc, argrec_t * args)
* 時計イベント実行
*------------------------------------------
*/
-int npc_event_do_clock (int tid, unsigned int tick, int id, int data)
+void npc_event_do_clock (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
time_t timer;
struct tm *t;
@@ -406,7 +400,6 @@ int npc_event_do_clock (int tid, unsigned int tick, int id, int data)
c += npc_event_doall (buf);
}
memcpy (&ev_tm_b, t, sizeof (ev_tm_b));
- return c;
}
/*==========================================
@@ -482,9 +475,9 @@ int npc_cleareventtimer (struct npc_data *nd)
return 0;
}
-int npc_do_ontimer_sub (void *key, void *data, va_list ap)
+void npc_do_ontimer_sub (db_key_t key, db_val_t data, va_list ap)
{
- char *p = (char *) key;
+ const char *p = key.s;
struct event_data *ev = (struct event_data *) data;
int *c = va_arg (ap, int *);
// struct map_session_data *sd=va_arg(ap,struct map_session_data *);
@@ -511,7 +504,6 @@ int npc_do_ontimer_sub (void *key, void *data, va_list ap)
npc_deleventtimer (ev->nd, event);
}
}
- return 0;
}
int npc_do_ontimer (int npc_id, struct map_session_data *sd, int option)
@@ -567,7 +559,7 @@ int npc_timerevent_import (void *key, void *data, va_list ap)
* タイマーイベント実行
*------------------------------------------
*/
-int npc_timerevent (int tid, unsigned int tick, int id, int data)
+void npc_timerevent (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
int next, t;
struct npc_data *nd = (struct npc_data *) map_id2bl (id);
@@ -575,7 +567,7 @@ int npc_timerevent (int tid, unsigned int tick, int id, int data)
if (nd == NULL || nd->u.scr.nexttimer < 0)
{
printf ("npc_timerevent: ??\n");
- return 0;
+ return;
}
nd->u.scr.timertick = tick;
te = nd->u.scr.timer_event + nd->u.scr.nexttimer;
@@ -590,7 +582,6 @@ int npc_timerevent (int tid, unsigned int tick, int id, int data)
}
run_script (nd->u.scr.script, te->pos, 0, nd->bl.id);
- return 0;
}
/*==========================================
@@ -770,9 +761,9 @@ int npc_event (struct map_session_data *sd, const char *eventname,
return 0;
}
-int npc_command_sub (void *key, void *data, va_list ap)
+void npc_command_sub (db_key_t key, db_val_t data, va_list ap)
{
- char *p = (char *) key;
+ const char *p = key.s;
struct event_data *ev = (struct event_data *) data;
char *npcname = va_arg (ap, char *);
char *command = va_arg (ap, char *);
@@ -786,8 +777,6 @@ int npc_command_sub (void *key, void *data, va_list ap)
if (strcmp (command, temp) == 0)
run_script (ev->nd->u.scr.script, ev->pos, 0, ev->nd->bl.id);
}
-
- return 0;
}
int npc_command (struct map_session_data *sd, char *npcname, char *command)
@@ -858,7 +847,7 @@ int npc_touch_areanpc (struct map_session_data *sd, int m, int x, int y)
case MESSAGE:
case SCRIPT:
{
- char *name = (char *) aCalloc (50, sizeof (char));
+ char *name = calloc (50, 1);
memcpy (name, map[m].npc[i]->name, 50);
if (sd->areanpc_id == map[m].npc[i]->bl.id)
@@ -1235,14 +1224,14 @@ void npc_addsrcfile (char *name)
struct npc_src_list *new;
size_t len;
- if (strcmpi (name, "clear") == 0)
+ if (strcasecmp (name, "clear") == 0)
{
npc_clearsrcfile ();
return;
}
len = sizeof (*new) + strlen (name);
- new = (struct npc_src_list *) aCalloc (1, len);
+ new = (struct npc_src_list *) calloc (1, len);
new->next = NULL;
strncpy (new->name, name, strlen (name) + 1);
if (npc_src_first == NULL)
@@ -1261,7 +1250,7 @@ void npc_delsrcfile (char *name)
{
struct npc_src_list *p = npc_src_first, *pp = NULL, **lp = &npc_src_first;
- if (strcmpi (name, "all") == 0)
+ if (strcasecmp (name, "all") == 0)
{
npc_clearsrcfile ();
return;
@@ -1302,7 +1291,7 @@ int npc_parse_warp (char *w1, char *w2, char *w3, char *w4)
m = map_mapname2mapid (mapname);
- nd = (struct npc_data *) aCalloc (1, sizeof (struct npc_data));
+ nd = (struct npc_data *) calloc (1, sizeof (struct npc_data));
nd->bl.id = npc_get_new_npc_id ();
nd->n = map_addnpc (m, nd);
@@ -1377,7 +1366,7 @@ static int npc_parse_shop (char *w1, char *w2, char *w3, char *w4)
}
m = map_mapname2mapid (mapname);
- nd = (struct npc_data *) aCalloc (1, sizeof (struct npc_data) +
+ nd = (struct npc_data *) calloc (1, sizeof (struct npc_data) +
sizeof (nd->u.shop_item[0]) * (max +
1));
p = strchr (w4, ',');
@@ -1440,9 +1429,8 @@ static int npc_parse_shop (char *w1, char *w2, char *w3, char *w4)
nd->opt2 = 0;
nd->opt3 = 0;
- nd = (struct npc_data *) aRealloc (nd,
- sizeof (struct npc_data) +
- sizeof (nd->u.shop_item[0]) * pos);
+ nd = (struct npc_data *)
+ realloc (nd, sizeof (struct npc_data) + sizeof (nd->u.shop_item[0]) * pos);
//printf("shop npc %s %d read done\n",mapname,nd->bl.id);
npc_shop++;
@@ -1460,33 +1448,29 @@ static int npc_parse_shop (char *w1, char *w2, char *w3, char *w4)
* NPCのラベルデータコンバート
*------------------------------------------
*/
-int npc_convertlabel_db (void *key, void *data, va_list ap)
+void npc_convertlabel_db (db_key_t key, db_val_t data, va_list ap)
{
- char *lname = (char *) key;
+ const char *lname = key.s;
int pos = (int) data;
struct npc_data *nd;
struct npc_label_list *lst;
int num;
char *p = strchr (lname, ':');
- nullpo_retr (0, ap);
- nullpo_retr (0, nd = va_arg (ap, struct npc_data *));
+ nullpo_retv (ap);
+ nullpo_retv (nd = va_arg (ap, struct npc_data *));
lst = nd->u.scr.label_list;
num = nd->u.scr.label_list_num;
if (!lst)
{
- lst =
- (struct npc_label_list *) aCalloc (1,
- sizeof (struct
- npc_label_list));
+ lst = (struct npc_label_list *)
+ calloc (1, sizeof (struct npc_label_list));
num = 0;
}
else
- lst =
- (struct npc_label_list *) aRealloc (lst,
- sizeof (struct npc_label_list)
- * (num + 1));
+ lst = (struct npc_label_list *)
+ realloc (lst, sizeof (struct npc_label_list) * (num + 1));
*p = '\0';
strncpy (lst[num].name, lname, sizeof(lst[num].name)-1);
@@ -1495,7 +1479,6 @@ int npc_convertlabel_db (void *key, void *data, va_list ap)
lst[num].pos = pos;
nd->u.scr.label_list = lst;
nd->u.scr.label_list_num = num + 1;
- return 0;
}
/*==========================================
@@ -1541,7 +1524,7 @@ static int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
if (strcmp (w2, "script") == 0)
{
// スクリプトの解析
- srcbuf = (char *) aCalloc (srcsize, sizeof (char));
+ srcbuf = (char *) calloc (srcsize, sizeof (char));
if (strchr (first_line, '{'))
{
strcpy (srcbuf, strchr (first_line, '{'));
@@ -1562,7 +1545,7 @@ static int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
if (strlen (srcbuf) + strlen (line) + 1 >= srcsize)
{
srcsize += 65536;
- srcbuf = (char *) aRealloc (srcbuf, srcsize);
+ srcbuf = (char *) realloc (srcbuf, srcsize);
memset (srcbuf + srcsize - 65536, '\0', 65536);
}
if (srcbuf[0] != '{')
@@ -1608,7 +1591,7 @@ static int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
} // end of スクリプト解析
- nd = (struct npc_data *) aCalloc (1, sizeof (struct npc_data));
+ nd = (struct npc_data *) calloc (1, sizeof (struct npc_data));
if (m == -1)
{
@@ -1702,7 +1685,7 @@ static int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
if (evflag)
{ // イベント型
struct event_data *ev =
- (struct event_data *) aCalloc (1, sizeof (struct event_data));
+ (struct event_data *) calloc (1, sizeof (struct event_data));
ev->nd = nd;
ev->pos = 0;
strdb_insert (ev_db, nd->exname, ev);
@@ -1750,9 +1733,9 @@ static int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
struct event_data *ev;
char *buf;
// エクスポートされる
- ev = (struct event_data *) aCalloc (1,
+ ev = (struct event_data *) calloc (1,
sizeof (struct event_data));
- buf = (char *) aCalloc (50, sizeof (char));
+ buf = (char *) calloc (50, sizeof (char));
if (strlen (lname) > 24)
{
printf ("npc_parse_script: label name error !\n");
@@ -1781,11 +1764,11 @@ static int npc_parse_script (char *w1, char *w2, char *w3, char *w4,
struct npc_timerevent_list *te = nd->u.scr.timer_event;
int j, k = nd->u.scr.timeramount;
if (te == NULL)
- te = (struct npc_timerevent_list *) aCalloc (1,
+ te = (struct npc_timerevent_list *) calloc (1,
sizeof (struct
npc_timerevent_list));
else
- te = (struct npc_timerevent_list *) aRealloc (te,
+ te = (struct npc_timerevent_list *) realloc (te,
sizeof (struct
npc_timerevent_list)
* (k + 1));
@@ -1826,7 +1809,7 @@ static int npc_parse_function (char *w1, char *w2, char *w3, char *w4,
char *p;
// スクリプトの解析
- srcbuf = (char *) aCalloc (srcsize, sizeof (char));
+ srcbuf = (char *) calloc (srcsize, sizeof (char));
if (strchr (first_line, '{'))
{
strcpy (srcbuf, strchr (first_line, '{'));
@@ -1847,7 +1830,7 @@ static int npc_parse_function (char *w1, char *w2, char *w3, char *w4,
if (strlen (srcbuf) + strlen (line) + 1 >= srcsize)
{
srcsize += 65536;
- srcbuf = (char *) aRealloc (srcbuf, srcsize);
+ srcbuf = (char *) realloc (srcbuf, srcsize);
memset (srcbuf + srcsize - 65536, '\0', 65536);
}
if (srcbuf[0] != '{')
@@ -1869,7 +1852,7 @@ static int npc_parse_function (char *w1, char *w2, char *w3, char *w4,
return 1;
}
- p = (char *) aCalloc (50, sizeof (char));
+ p = (char *) calloc (50, sizeof (char));
strncpy (p, w3, 49);
strdb_insert (script_get_userfunc_db (), p, script);
@@ -1917,7 +1900,7 @@ int npc_parse_mob (char *w1, char *w2, char *w3, char *w4)
for (i = 0; i < num; i++)
{
- md = (struct mob_data *) aCalloc (1, sizeof (struct mob_data));
+ md = (struct mob_data *) calloc (1, sizeof (struct mob_data));
md->bl.prev = NULL;
md->bl.next = NULL;
@@ -1949,7 +1932,7 @@ int npc_parse_mob (char *w1, char *w2, char *w3, char *w4)
if (mob_db[class].mode & 0x02)
md->lootitem =
- (struct item *) aCalloc (LOOTITEM_SIZE, sizeof (struct item));
+ (struct item *) calloc (LOOTITEM_SIZE, sizeof (struct item));
else
md->lootitem = NULL;
@@ -1993,7 +1976,7 @@ static int npc_parse_mapflag (char *w1, char *w2, char *w3, char *w4)
return 1;
//マップフラグ
- if (strcmpi (w3, "nosave") == 0)
+ if (strcasecmp (w3, "nosave") == 0)
{
if (strcmp (w4, "SavePoint") == 0)
{
@@ -2009,51 +1992,51 @@ static int npc_parse_mapflag (char *w1, char *w2, char *w3, char *w4)
}
map[m].flag.nosave = 1;
}
- else if (strcmpi (w3, "nomemo") == 0)
+ else if (strcasecmp (w3, "nomemo") == 0)
{
map[m].flag.nomemo = 1;
}
- else if (strcmpi (w3, "noteleport") == 0)
+ else if (strcasecmp (w3, "noteleport") == 0)
{
map[m].flag.noteleport = 1;
}
- else if (strcmpi (w3, "nowarp") == 0)
+ else if (strcasecmp (w3, "nowarp") == 0)
{
map[m].flag.nowarp = 1;
}
- else if (strcmpi (w3, "nowarpto") == 0)
+ else if (strcasecmp (w3, "nowarpto") == 0)
{
map[m].flag.nowarpto = 1;
}
- else if (strcmpi (w3, "noreturn") == 0)
+ else if (strcasecmp (w3, "noreturn") == 0)
{
map[m].flag.noreturn = 1;
}
- else if (strcmpi (w3, "monster_noteleport") == 0)
+ else if (strcasecmp (w3, "monster_noteleport") == 0)
{
map[m].flag.monster_noteleport = 1;
}
- else if (strcmpi (w3, "nobranch") == 0)
+ else if (strcasecmp (w3, "nobranch") == 0)
{
map[m].flag.nobranch = 1;
}
- else if (strcmpi (w3, "nopenalty") == 0)
+ else if (strcasecmp (w3, "nopenalty") == 0)
{
map[m].flag.nopenalty = 1;
}
- else if (strcmpi (w3, "pvp") == 0)
+ else if (strcasecmp (w3, "pvp") == 0)
{
map[m].flag.pvp = 1;
}
- else if (strcmpi (w3, "pvp_noparty") == 0)
+ else if (strcasecmp (w3, "pvp_noparty") == 0)
{
map[m].flag.pvp_noparty = 1;
}
- else if (strcmpi (w3, "pvp_noguild") == 0)
+ else if (strcasecmp (w3, "pvp_noguild") == 0)
{
map[m].flag.pvp_noguild = 1;
}
- else if (strcmpi (w3, "pvp_nightmaredrop") == 0)
+ else if (strcasecmp (w3, "pvp_nightmaredrop") == 0)
{
if (sscanf (w4, "%[^,],%[^,],%d", drop_arg1, drop_arg2, &drop_per) ==
3)
@@ -2086,64 +2069,64 @@ static int npc_parse_mapflag (char *w1, char *w2, char *w3, char *w4)
}
}
}
- else if (strcmpi (w3, "pvp_nocalcrank") == 0)
+ else if (strcasecmp (w3, "pvp_nocalcrank") == 0)
{
map[m].flag.pvp_nocalcrank = 1;
}
- else if (strcmpi (w3, "gvg") == 0)
+ else if (strcasecmp (w3, "gvg") == 0)
{
map[m].flag.gvg = 1;
}
- else if (strcmpi (w3, "gvg_noparty") == 0)
+ else if (strcasecmp (w3, "gvg_noparty") == 0)
{
map[m].flag.gvg_noparty = 1;
}
- else if (strcmpi (w3, "nozenypenalty") == 0)
+ else if (strcasecmp (w3, "nozenypenalty") == 0)
{
map[m].flag.nozenypenalty = 1;
}
- else if (strcmpi (w3, "notrade") == 0)
+ else if (strcasecmp (w3, "notrade") == 0)
{
map[m].flag.notrade = 1;
}
- else if (strcmpi (w3, "noskill") == 0)
+ else if (strcasecmp (w3, "noskill") == 0)
{
map[m].flag.noskill = 1;
}
- else if (battle_config.pk_mode && strcmpi (w3, "nopvp") == 0)
+ else if (battle_config.pk_mode && strcasecmp (w3, "nopvp") == 0)
{ // nopvp for pk mode [Valaris]
map[m].flag.nopvp = 1;
map[m].flag.pvp = 0;
}
- else if (strcmpi (w3, "noicewall") == 0)
+ else if (strcasecmp (w3, "noicewall") == 0)
{ // noicewall [Valaris]
map[m].flag.noicewall = 1;
}
- else if (strcmpi (w3, "snow") == 0)
+ else if (strcasecmp (w3, "snow") == 0)
{ // snow [Valaris]
map[m].flag.snow = 1;
}
- else if (strcmpi (w3, "fog") == 0)
+ else if (strcasecmp (w3, "fog") == 0)
{ // fog [Valaris]
map[m].flag.fog = 1;
}
- else if (strcmpi (w3, "sakura") == 0)
+ else if (strcasecmp (w3, "sakura") == 0)
{ // sakura [Valaris]
map[m].flag.sakura = 1;
}
- else if (strcmpi (w3, "leaves") == 0)
+ else if (strcasecmp (w3, "leaves") == 0)
{ // leaves [Valaris]
map[m].flag.leaves = 1;
}
- else if (strcmpi (w3, "rain") == 0)
+ else if (strcasecmp (w3, "rain") == 0)
{ // rain [Valaris]
map[m].flag.rain = 1;
}
- else if (strcmpi (w3, "no_player_drops") == 0)
+ else if (strcasecmp (w3, "no_player_drops") == 0)
{ // no player drops [Jaxad0127]
map[m].flag.no_player_drops = 1;
}
- else if (strcmpi (w3, "town") == 0)
+ else if (strcasecmp (w3, "town") == 0)
{ // town/safe zone [remoitnane]
map[m].flag.town = 1;
}
@@ -2151,24 +2134,18 @@ static int npc_parse_mapflag (char *w1, char *w2, char *w3, char *w4)
return 0;
}
-static int ev_db_final (void *key, void *data, va_list ap)
+static void ev_db_final (db_key_t key, db_val_t data, va_list ap)
{
free (data);
- if (strstr (key, "::") != NULL)
- free (key);
- return 0;
-}
-
-static int npcname_db_final (void *key, void *data, va_list ap)
-{
- return 0;
+ if (strstr (key.s, "::") != NULL)
+ free ((char*)key.s);
}
struct npc_data *npc_spawn_text (int m, int x, int y,
int class, char *name, char *message)
{
struct npc_data *retval =
- (struct npc_data *) aCalloc (1, sizeof (struct npc_data));
+ (struct npc_data *) calloc (1, sizeof (struct npc_data));
retval->bl.id = npc_get_new_npc_id ();
retval->bl.x = x;
retval->bl.y = y;
@@ -2259,8 +2236,6 @@ int do_final_npc (void)
if (ev_db)
strdb_final (ev_db, ev_db_final);
- if (npcname_db)
- strdb_final (npcname_db, npcname_db_final);
for (i = START_NPC_NUM; i < npc_id; i++)
{
@@ -2284,12 +2259,10 @@ int do_final_npc (void)
return 0;
}
-void ev_release (struct dbn *db, int which)
+void ev_release (db_key_t key, db_val_t val)
{
- if (which & 0x1)
- free (db->key);
- if (which & 0x2)
- free (db->data);
+ free ((char*)key.s);
+ free (val);
}
/*==========================================
@@ -2361,7 +2334,7 @@ int do_init_npc (void)
continue;
}
// マップの存在確認
- if (strcmp (w1, "-") != 0 && strcmpi (w1, "function") != 0)
+ if (strcmp (w1, "-") != 0 && strcasecmp (w1, "function") != 0)
{
sscanf (w1, "%[^,]", mapname);
m = map_mapname2mapid (mapname);
@@ -2371,17 +2344,17 @@ int do_init_npc (void)
continue;
}
}
- if (strcmpi (w2, "warp") == 0 && count > 3)
+ if (strcasecmp (w2, "warp") == 0 && count > 3)
{
npc_parse_warp (w1, w2, w3, w4);
}
- else if (strcmpi (w2, "shop") == 0 && count > 3)
+ else if (strcasecmp (w2, "shop") == 0 && count > 3)
{
npc_parse_shop (w1, w2, w3, w4);
}
- else if (strcmpi (w2, "script") == 0 && count > 3)
+ else if (strcasecmp (w2, "script") == 0 && count > 3)
{
- if (strcmpi (w1, "function") == 0)
+ if (strcasecmp (w1, "function") == 0)
{
npc_parse_function (w1, w2, w3, w4, line + w4pos, fp,
&lines);
@@ -2399,11 +2372,11 @@ int do_init_npc (void)
{
npc_parse_script (w1, w2, w3, w4, line + w4pos, fp, &lines);
}
- else if (strcmpi (w2, "monster") == 0 && count > 3)
+ else if (strcasecmp (w2, "monster") == 0 && count > 3)
{
npc_parse_mob (w1, w2, w3, w4);
}
- else if (strcmpi (w2, "mapflag") == 0 && count >= 3)
+ else if (strcasecmp (w2, "mapflag") == 0 && count >= 3)
{
npc_parse_mapflag (w1, w2, w3, w4);
}
@@ -2416,11 +2389,5 @@ int do_init_npc (void)
printf ("\rNPCs Loaded: %d [Warps:%d Shops:%d Scripts:%d Mobs:%d]\n",
npc_id - START_NPC_NUM, npc_warp, npc_shop, npc_script, npc_mob);
- add_timer_func_list (npc_event_timer, "npc_event_timer");
- add_timer_func_list (npc_event_do_clock, "npc_event_do_clock");
- add_timer_func_list (npc_timerevent, "npc_timerevent");
-
- //exit(1);
-
return 0;
}
diff --git a/src/map/npc.h b/src/map/npc.h
index 4c08c02..248bad7 100644
--- a/src/map/npc.h
+++ b/src/map/npc.h
@@ -9,7 +9,7 @@
#define INVISIBLE_CLASS 32767
int npc_event_dequeue (struct map_session_data *sd);
-int npc_event_timer (int tid, unsigned int tick, int id, int data);
+void npc_event_timer (timer_id, tick_t, custom_id_t, custom_data_t);
int npc_event (struct map_session_data *sd, const char *npcname, int);
int npc_timer_event (const char *eventname); // Added by RoVeRT
int npc_command (struct map_session_data *sd, char *npcname, char *command);
diff --git a/src/map/party.c b/src/map/party.c
index 4e59fae..cc35d2a 100644
--- a/src/map/party.c
+++ b/src/map/party.c
@@ -8,7 +8,6 @@
#include "../common/timer.h"
#include "../common/socket.h"
#include "../common/nullpo.h"
-#include "../common/malloc.h"
#include "pc.h"
#include "map.h"
#include "battle.h"
@@ -25,15 +24,14 @@
static struct dbt *party_db;
-int party_send_xyhp_timer (int tid, unsigned int tick, int id, int data);
+void party_send_xyhp_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data);
/*==========================================
* 終了
*------------------------------------------
*/
-static int party_db_final (void *key, void *data, va_list ap)
+static void party_db_final (db_key_t key, db_val_t data, va_list ap)
{
free (data);
- return 0;
}
void do_final_party (void)
@@ -46,7 +44,6 @@ void do_final_party (void)
void do_init_party (void)
{
party_db = numdb_init ();
- add_timer_func_list (party_send_xyhp_timer, "party_send_xyhp_timer");
add_timer_interval (gettick () + PARTY_SEND_XYHP_INVERVAL,
party_send_xyhp_timer, 0, 0,
PARTY_SEND_XYHP_INVERVAL);
@@ -58,15 +55,14 @@ struct party *party_search (int party_id)
return numdb_search (party_db, party_id);
}
-int party_searchname_sub (void *key, void *data, va_list ap)
+void party_searchname_sub (db_key_t key, db_val_t data, va_list ap)
{
struct party *p = (struct party *) data, **dst;
char *str;
str = va_arg (ap, char *);
dst = va_arg (ap, struct party **);
- if (strcmpi (p->name, str) == 0)
+ if (strcasecmp (p->name, str) == 0)
*dst = p;
- return 0;
}
// パーティ名検索
@@ -120,7 +116,7 @@ int party_created (int account_id, int fail, int party_id, char *name)
exit (1);
}
- p = (struct party *) aCalloc (1, sizeof (struct party));
+ CREATE (p, struct party, 1);
p->party_id = party_id;
memcpy (p->name, name, 24);
numdb_insert (party_db, party_id, p);
@@ -205,7 +201,7 @@ int party_recv_info (struct party *sp)
if ((p = numdb_search (party_db, sp->party_id)) == NULL)
{
- p = (struct party *) aCalloc (1, sizeof (struct party));
+ CREATE (p, struct party, 1);
numdb_insert (party_db, sp->party_id, p);
// 最初のロードなのでユーザーのチェックを行う
@@ -574,7 +570,7 @@ int party_send_movemap (struct map_session_data *sd)
if (sd->party_sended != 0) // もうパーティデータは送信済み
return 0;
- // 競合確認
+ // 競合確認
party_check_conflict (sd);
// あるならパーティ情報送信
@@ -645,12 +641,12 @@ int party_check_conflict (struct map_session_data *sd)
}
// 位置やHP通知用
-int party_send_xyhp_timer_sub (void *key, void *data, va_list ap)
+void party_send_xyhp_timer_sub (db_key_t key, db_val_t data, va_list ap)
{
struct party *p = (struct party *) data;
int i;
- nullpo_retr (0, p);
+ nullpo_retv (p);
for (i = 0; i < MAX_PARTY; i++)
{
@@ -673,14 +669,12 @@ int party_send_xyhp_timer_sub (void *key, void *data, va_list ap)
}
}
- return 0;
}
// 位置やHP通知
-int party_send_xyhp_timer (int tid, unsigned int tick, int id, int data)
+void party_send_xyhp_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
numdb_foreach (party_db, party_send_xyhp_timer_sub, tick);
- return 0;
}
// 位置通知クリア
diff --git a/src/map/pc.c b/src/map/pc.c
index fc2732f..ac03334 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -9,8 +9,8 @@
#include "../common/timer.h"
#include "../common/db.h"
-#include "../common/malloc.h"
#include "../common/nullpo.h"
+#include "../common/mt_rand.h"
#include "atcommand.h"
#include "battle.h"
@@ -171,23 +171,21 @@ static int distance (int x0, int y0, int x1, int y1)
return dx > dy ? dx : dy;
}
-static int pc_invincible_timer (int tid, unsigned int tick, int id, int data)
+static void pc_invincible_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct map_session_data *sd;
if ((sd = (struct map_session_data *) map_id2sd (id)) == NULL
|| sd->bl.type != BL_PC)
- return 1;
+ return;
if (sd->invincible_timer != tid)
{
if (battle_config.error_log)
printf ("invincible_timer %d != %d\n", sd->invincible_timer, tid);
- return 0;
+ return;
}
sd->invincible_timer = -1;
-
- return 0;
}
int pc_setinvincibletimer (struct map_session_data *sd, int val)
@@ -213,20 +211,20 @@ int pc_delinvincibletimer (struct map_session_data *sd)
return 0;
}
-static int pc_spiritball_timer (int tid, unsigned int tick, int id, int data)
+static void pc_spiritball_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct map_session_data *sd;
int i;
if ((sd = (struct map_session_data *) map_id2sd (id)) == NULL
|| sd->bl.type != BL_PC)
- return 1;
+ return;
if (sd->spirit_timer[0] != tid)
{
if (battle_config.error_log)
printf ("spirit_timer %d != %d\n", sd->spirit_timer[0], tid);
- return 0;
+ return;
}
sd->spirit_timer[0] = -1;
for (i = 1; i < sd->spiritball; i++)
@@ -238,8 +236,6 @@ static int pc_spiritball_timer (int tid, unsigned int tick, int id, int data)
if (sd->spiritball < 0)
sd->spiritball = 0;
clif_spiritball (sd);
-
- return 0;
}
int pc_addspiritball (struct map_session_data *sd, int interval, int max)
@@ -4334,7 +4330,7 @@ static int calc_next_walk_step (struct map_session_data *sd)
* 半歩進む(timer関数)
*------------------------------------------
*/
-static int pc_walk (int tid, unsigned int tick, int id, int data)
+static void pc_walk (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct map_session_data *sd;
int i, ctype;
@@ -4343,18 +4339,18 @@ static int pc_walk (int tid, unsigned int tick, int id, int data)
sd = map_id2sd (id);
if (sd == NULL)
- return 0;
+ return;
if (sd->walktimer != tid)
{
if (battle_config.error_log)
printf ("pc_walk %d != %d\n", sd->walktimer, tid);
- return 0;
+ return;
}
sd->walktimer = -1;
if (sd->walkpath.path_pos >= sd->walkpath.path_len
|| sd->walkpath.path_pos != data)
- return 0;
+ return;
//歩いたので息吹のタイマーを初期化
sd->inchealspirithptick = 0;
@@ -4367,13 +4363,13 @@ static int pc_walk (int tid, unsigned int tick, int id, int data)
if (sd->state.change_walk_target)
{
pc_walktoxy_sub (sd);
- return 0;
+ return;
}
}
else
{ // マス目境界へ到着
if (sd->walkpath.path[sd->walkpath.path_pos] >= 8)
- return 1;
+ return;
x = sd->bl.x;
y = sd->bl.y;
@@ -4381,7 +4377,7 @@ static int pc_walk (int tid, unsigned int tick, int id, int data)
if (ctype == 1 || ctype == 5)
{
pc_stop_walking (sd, 1);
- return 0;
+ return;
}
sd->dir = sd->head_dir = sd->walkpath.path[sd->walkpath.path_pos];
dx = dirx[(int) sd->dir];
@@ -4390,7 +4386,7 @@ static int pc_walk (int tid, unsigned int tick, int id, int data)
if (ctype == 1 || ctype == 5)
{
pc_walktoxy_sub (sd);
- return 0;
+ return;
}
moveblock = (x / BLOCK_SIZE != (x + dx) / BLOCK_SIZE
@@ -4465,8 +4461,6 @@ static int pc_walk (int tid, unsigned int tick, int id, int data)
sd->walktimer =
add_timer (tick + i, pc_walk, id, sd->walkpath.path_pos);
}
-
- return 0;
}
/*==========================================
@@ -4804,7 +4798,7 @@ struct pc_base_job pc_calc_base_job (int b_class)
* PCの攻撃 (timer関数)
*------------------------------------------
*/
-int pc_attack_timer (int tid, unsigned int tick, int id, int data)
+void pc_attack_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct map_session_data *sd;
struct block_list *bl;
@@ -4815,48 +4809,48 @@ int pc_attack_timer (int tid, unsigned int tick, int id, int data)
sd = map_id2sd (id);
if (sd == NULL)
- return 0;
+ return;
if (sd->attacktimer != tid)
{
if (battle_config.error_log)
printf ("pc_attack_timer %d != %d\n", sd->attacktimer, tid);
- return 0;
+ return;
}
sd->attacktimer = -1;
if (sd->bl.prev == NULL)
- return 0;
+ return;
bl = map_id2bl (sd->attacktarget);
if (bl == NULL || bl->prev == NULL)
- return 0;
+ return;
if (bl->type == BL_PC && pc_isdead ((struct map_session_data *) bl))
- return 0;
+ return;
// 同じmapでないなら攻撃しない
// PCが死んでても攻撃しない
if (sd->bl.m != bl->m || pc_isdead (sd))
- return 0;
+ return;
if (sd->opt1 > 0 || sd->status.option & 2 || sd->status.option & 16388) // 異常などで攻撃できない
- return 0;
+ return;
if (sd->sc_data[SC_AUTOCOUNTER].timer != -1)
- return 0;
+ return;
if (sd->sc_data[SC_BLADESTOP].timer != -1)
- return 0;
+ return;
if ((opt = battle_get_option (bl)) != NULL && *opt & 0x46)
- return 0;
+ return;
if (((sc_data = battle_get_sc_data (bl)) != NULL
&& sc_data[SC_TRICKDEAD].timer != -1)
|| ((sc_data = battle_get_sc_data (bl)) != NULL
&& sc_data[SC_BASILICA].timer != -1))
- return 0;
+ return;
if (sd->skilltimer != -1 && pc_checkskill (sd, SA_FREECAST) <= 0)
- return 0;
+ return;
if (!battle_config.sdelay_attack_enable
&& pc_checkskill (sd, SA_FREECAST) <= 0)
@@ -4864,12 +4858,12 @@ int pc_attack_timer (int tid, unsigned int tick, int id, int data)
if (DIFF_TICK (tick, sd->canact_tick) < 0)
{
clif_skill_fail (sd, 1, 4, 0);
- return 0;
+ return;
}
}
if (sd->attackabletime > tick)
- return 0; // cannot attack yet
+ return; // cannot attack yet
attack_spell_delay = sd->attack_spell_delay;
if (sd->attack_spell_override // [Fate] If we have an active attack spell, use that
@@ -4889,7 +4883,7 @@ int pc_attack_timer (int tid, unsigned int tick, int id, int data)
{ // 届 かないので移動
//if(pc_can_reach(sd,bl->x,bl->y))
//clif_movetoattack(sd,bl);
- return 0;
+ return;
}
if (dist <= range && !battle_check_range (&sd->bl, bl, range))
@@ -4944,8 +4938,6 @@ int pc_attack_timer (int tid, unsigned int tick, int id, int data)
sd->attacktimer =
add_timer (sd->attackabletime, pc_attack_timer, sd->bl.id, 0);
}
-
- return 0;
}
/*==========================================
@@ -5011,13 +5003,13 @@ int pc_stopattack (struct map_session_data *sd)
return 0;
}
-int pc_follow_timer (int tid, unsigned int tick, int id, int data)
+void pc_follow_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct map_session_data *sd, *bl;
sd = map_id2sd (id);
if (sd == NULL || sd->followtimer != tid)
- return 0;
+ return;
sd->followtimer = -1;
@@ -5029,14 +5021,14 @@ int pc_follow_timer (int tid, unsigned int tick, int id, int data)
bl = (struct map_session_data *) map_id2bl (sd->followtarget);
if (bl == NULL)
- return 0;
+ return;
if (bl->bl.prev == NULL)
break;
if (bl->bl.type == BL_PC
&& pc_isdead ((struct map_session_data *) bl))
- return 0;
+ return;
if (sd->skilltimer == -1 && sd->attacktimer == -1
&& sd->walktimer == -1)
@@ -5056,8 +5048,6 @@ int pc_follow_timer (int tid, unsigned int tick, int id, int data)
sd->followtimer =
add_timer (tick + sd->aspd, pc_follow_timer, sd->bl.id, 0);
-
- return 0;
}
int pc_follow (struct map_session_data *sd, int target_id)
@@ -5677,8 +5667,8 @@ int pc_resetlvl (struct map_session_data *sd, int type)
sd->status.skill_point = 0;
sd->status.base_level = 1;
sd->status.job_level = 1;
- sd->status.base_exp = sd->status.base_exp = 0;
- sd->status.job_exp = sd->status.job_exp = 0;
+ sd->status.base_exp = 0;
+ sd->status.job_exp = 0;
if (sd->status.option != 0)
sd->status.option = 0;
@@ -7213,12 +7203,12 @@ int pc_percentrefinery (struct map_session_data *sd, struct item *item)
* イベントタイマー処理
*------------------------------------------
*/
-int pc_eventtimer (int tid, unsigned int tick, int id, int data)
+void pc_eventtimer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct map_session_data *sd = map_id2sd (id);
int i;
if (sd == NULL)
- return 0;
+ return;
for (i = 0; i < MAX_EVENTTIMER; i++)
{
@@ -7235,8 +7225,6 @@ int pc_eventtimer (int tid, unsigned int tick, int id, int data)
if (battle_config.error_log)
printf ("pc_eventtimer: no such event timer\n");
}
-
- return 0;
}
/*==========================================
@@ -7255,7 +7243,7 @@ int pc_addeventtimer (struct map_session_data *sd, int tick, const char *name)
if (i < MAX_EVENTTIMER)
{
- char *evname = (char *) aCalloc (24, sizeof (char));
+ char *evname = (char *) calloc (24, 1);
strncpy (evname, name, 24);
evname[23] = '\0';
sd->eventtimer[i] = add_timer (gettick () + tick,
@@ -7811,20 +7799,19 @@ int pc_calc_pvprank (struct map_session_data *sd)
* PVP順位計算(timer)
*------------------------------------------
*/
-int pc_calc_pvprank_timer (int tid, unsigned int tick, int id, int data)
+void pc_calc_pvprank_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct map_session_data *sd = NULL;
if (battle_config.pk_mode) // disable pvp ranking if pk_mode on [Valaris]
- return 0;
+ return;
sd = map_id2sd (id);
if (sd == NULL)
- return 0;
+ return;
sd->pvp_timer = -1;
if (pc_calc_pvprank (sd) > 0)
sd->pvp_timer = add_timer (gettick () + PVP_CALCRANK_INTERVAL,
pc_calc_pvprank_timer, id, data);
- return 0;
}
/*==========================================
@@ -8387,7 +8374,7 @@ static int pc_natural_heal_sub (struct map_session_data *sd, va_list ap)
* HP/SP自然回復 (interval timer関数)
*------------------------------------------
*/
-int pc_natural_heal (int tid, unsigned int tick, int id, int data)
+void pc_natural_heal (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
natural_heal_tick = tick;
natural_heal_diff_tick =
@@ -8395,7 +8382,6 @@ int pc_natural_heal (int tid, unsigned int tick, int id, int data)
clif_foreachclient (pc_natural_heal_sub);
natural_heal_prev_tick = tick;
- return 0;
}
/*==========================================
@@ -8465,7 +8451,7 @@ static int pc_autosave_sub (struct map_session_data *sd, va_list ap)
* 自動セーブ (timer関数)
*------------------------------------------
*/
-int pc_autosave (int tid, unsigned int tick, int id, int data)
+void pc_autosave (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
int interval;
@@ -8478,8 +8464,6 @@ int pc_autosave (int tid, unsigned int tick, int id, int data)
if (interval <= 0)
interval = 1;
add_timer (gettick () + interval, pc_autosave, 0, 0);
-
- return 0;
}
int pc_read_gm_account (int fd)
@@ -8505,7 +8489,7 @@ int pc_read_gm_account (int fd)
* timer to do the day
*------------------------------------------
*/
-int map_day_timer (int tid, unsigned int tick, int id, int data)
+void map_day_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{ // by [yor]
struct map_session_data *pl_sd = NULL;
int i;
@@ -8530,15 +8514,13 @@ int map_day_timer (int tid, unsigned int tick, int id, int data)
}
}
}
-
- return 0;
}
/*==========================================
* timer to do the night
*------------------------------------------
*/
-int map_night_timer (int tid, unsigned int tick, int id, int data)
+void map_night_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{ // by [yor]
struct map_session_data *pl_sd = NULL;
int i;
@@ -8563,8 +8545,6 @@ int map_night_timer (int tid, unsigned int tick, int id, int data)
}
}
}
-
- return 0;
}
void pc_setstand (struct map_session_data *sd)
@@ -8973,22 +8953,11 @@ int do_init_pc (void)
// gm_account_db = numdb_init();
- add_timer_func_list (pc_walk, "pc_walk");
- add_timer_func_list (pc_attack_timer, "pc_attack_timer");
- add_timer_func_list (pc_natural_heal, "pc_natural_heal");
- add_timer_func_list (pc_invincible_timer, "pc_invincible_timer");
- add_timer_func_list (pc_eventtimer, "pc_eventtimer");
- add_timer_func_list (pc_calc_pvprank_timer, "pc_calc_pvprank_timer");
- add_timer_func_list (pc_autosave, "pc_autosave");
- add_timer_func_list (pc_spiritball_timer, "pc_spiritball_timer");
add_timer_interval ((natural_heal_prev_tick =
gettick () + NATURAL_HEAL_INTERVAL), pc_natural_heal,
0, 0, NATURAL_HEAL_INTERVAL);
add_timer (gettick () + autosave_interval, pc_autosave, 0, 0);
- // add night/day timer (by [yor])
- add_timer_func_list (map_day_timer, "map_day_timer"); // by [yor]
- add_timer_func_list (map_night_timer, "map_night_timer"); // by [yor]
{
int day_duration = battle_config.day_duration;
int night_duration = battle_config.night_duration;
diff --git a/src/map/pc.h b/src/map/pc.h
index 20ae26e..742d9d4 100644
--- a/src/map/pc.h
+++ b/src/map/pc.h
@@ -169,7 +169,7 @@ int pc_addeventtimercount (struct map_session_data *sd, const char *name,
int tick);
int pc_calc_pvprank (struct map_session_data *sd);
-int pc_calc_pvprank_timer (int tid, unsigned int tick, int id, int data);
+void pc_calc_pvprank_timer (timer_id, tick_t, custom_id_t, custom_data_t);
int pc_ismarried (struct map_session_data *sd);
int pc_marriage (struct map_session_data *sd,
@@ -202,9 +202,9 @@ enum
{ ADDITEM_EXIST, ADDITEM_NEW, ADDITEM_OVERAMOUNT };
// timer for night.day
-int day_timer_tid;
-int night_timer_tid;
-int map_day_timer (int, unsigned int, int, int); // by [yor]
-int map_night_timer (int, unsigned int, int, int); // by [yor]
+timer_id day_timer_tid;
+timer_id night_timer_tid;
+void map_day_timer (timer_id, tick_t, custom_id_t, custom_data_t); // by [yor]
+void map_night_timer (timer_id, tick_t, custom_id_t, custom_data_t); // by [yor]
#endif
diff --git a/src/map/script.c b/src/map/script.c
index 0c01ac0..fb8b8af 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -17,8 +17,8 @@
#include "../common/socket.h"
#include "../common/timer.h"
-#include "../common/malloc.h"
#include "../common/lock.h"
+#include "../common/mt_rand.h"
#include "atcommand.h"
#include "battle.h"
@@ -85,11 +85,6 @@ struct dbt *script_get_userfunc_db ()
return userfunc_db;
}
-int scriptlabel_final (void *k, void *d, va_list ap)
-{
- return 0;
-}
-
static char pos[11][100] =
{ "頭", "体", "左手", "右手", "ローブ", "靴", "アクセサリー1",
"アクセサリー2", "頭2", "頭3", "装着していない"
@@ -831,13 +826,13 @@ static int add_str (const unsigned char *p)
if (str_num >= str_data_size)
{
str_data_size += 128;
- str_data = aRealloc (str_data, sizeof (str_data[0]) * str_data_size);
+ str_data = realloc (str_data, sizeof (str_data[0]) * str_data_size);
memset (str_data + (str_data_size - 128), '\0', 128);
}
while (str_pos + strlen (p) + 1 >= str_size)
{
str_size += 256;
- str_buf = (char *) aRealloc (str_buf, str_size);
+ str_buf = (char *) realloc (str_buf, str_size);
memset (str_buf + (str_size - 256), '\0', 256);
}
strcpy (str_buf + str_pos, p);
@@ -860,7 +855,7 @@ static void check_script_buf (int size)
if (script_pos + size >= script_size)
{
script_size += SCRIPT_BLOCK_SIZE;
- script_buf = (char *) aRealloc (script_buf, script_size);
+ script_buf = (char *) realloc (script_buf, script_size);
memset (script_buf + script_size - SCRIPT_BLOCK_SIZE, '\0',
SCRIPT_BLOCK_SIZE);
}
@@ -1474,8 +1469,7 @@ unsigned char *parse_script (unsigned char *src, int line)
read_constdb ();
}
first = 0;
- script_buf =
- (unsigned char *) aCalloc (SCRIPT_BLOCK_SIZE, sizeof (unsigned char));
+ script_buf = (unsigned char *) calloc (SCRIPT_BLOCK_SIZE, 1);
script_pos = 0;
script_size = SCRIPT_BLOCK_SIZE;
str_data[LABEL_NEXTLINE].type = C_NOP;
@@ -1493,7 +1487,7 @@ unsigned char *parse_script (unsigned char *src, int line)
// 外部用label dbの初期化
if (scriptlabel_db != NULL)
- strdb_final (scriptlabel_db, scriptlabel_final);
+ strdb_final (scriptlabel_db, NULL);
scriptlabel_db = strdb_init (50);
// for error message
@@ -1526,7 +1520,7 @@ unsigned char *parse_script (unsigned char *src, int line)
exit (1);
}
set_label (l, script_pos);
- strdb_insert (scriptlabel_db, p, script_pos); // 外部用label db登録
+ strdb_insert (scriptlabel_db, (const char*)p, script_pos); // 外部用label db登録
*skip_word (p) = c;
p = tmpp + 1;
continue;
@@ -1546,7 +1540,7 @@ unsigned char *parse_script (unsigned char *src, int line)
add_scriptc (C_NOP);
script_size = script_pos;
- script_buf = (char *) aRealloc (script_buf, script_pos + 1);
+ script_buf = (char *) realloc (script_buf, script_pos + 1);
// 未解決のラベルを解決
for (i = LABEL_START; i < str_num; i++)
@@ -1772,7 +1766,7 @@ char *conv_str (struct script_state *st, struct script_data *data)
if (data->type == C_INT)
{
char *buf;
- buf = (char *) aCalloc (16, sizeof (char));
+ buf = (char *) calloc (16, 1);
sprintf (buf, "%d", data->u.num);
data->type = C_STR;
data->u.str = buf;
@@ -1816,10 +1810,9 @@ void push_val (struct script_stack *stack, int type, int val)
if (stack->sp >= stack->sp_max)
{
stack->sp_max += 64;
- stack->stack_data =
- (struct script_data *) aRealloc (stack->stack_data,
- sizeof (stack->stack_data[0]) *
- stack->sp_max);
+ stack->stack_data = (struct script_data *)
+ realloc (stack->stack_data, sizeof (stack->stack_data[0]) *
+ stack->sp_max);
memset (stack->stack_data + (stack->sp_max - 64), 0,
64 * sizeof (*(stack->stack_data)));
}
@@ -1839,10 +1832,9 @@ void push_str (struct script_stack *stack, int type, unsigned char *str)
if (stack->sp >= stack->sp_max)
{
stack->sp_max += 64;
- stack->stack_data =
- (struct script_data *) aRealloc (stack->stack_data,
- sizeof (stack->stack_data[0]) *
- stack->sp_max);
+ stack->stack_data = (struct script_data *)
+ realloc (stack->stack_data, sizeof (stack->stack_data[0]) *
+ stack->sp_max);
memset (stack->stack_data + (stack->sp_max - 64), '\0',
64 * sizeof (*(stack->stack_data)));
}
@@ -2091,7 +2083,7 @@ int buildin_menu (struct script_state *st)
st->state = RERUNLINE;
sd->state.menu_or_input = 1;
- buf = (char *) aCalloc (len + 1, sizeof (char));
+ buf = (char *) calloc (len + 1, 1);
buf[0] = 0;
for (i = st->start + 2; menu_choices > 0; i += 2, --menu_choices)
{
@@ -3180,7 +3172,7 @@ char *buildin_getpartyname_sub (int party_id)
if (p != NULL)
{
char *buf;
- buf = (char *) aCalloc (24, sizeof (char));
+ buf = (char *) calloc (24, 1);
strcpy (buf, p->name);
return buf;
}
@@ -3245,7 +3237,7 @@ char *buildin_getguildname_sub (int guild_id)
if (g != NULL)
{
char *buf;
- buf = (char *) aCalloc (24, sizeof (char));
+ buf = (char *) calloc (24, 1);
strcpy (buf, g->name);
return buf;
}
@@ -3276,7 +3268,7 @@ char *buildin_getguildmaster_sub (int guild_id)
if (g != NULL)
{
char *buf;
- buf = (char *) aCalloc (24, sizeof (char));
+ buf = (char *) calloc (24, 1);
strncpy (buf, g->master, 23);
return buf;
}
@@ -3332,7 +3324,7 @@ int buildin_strcharinfo (struct script_state *st)
if (num == 0)
{
char *buf;
- buf = (char *) aCalloc (24, sizeof (char));
+ buf = (char *) calloc (24, 1);
strncpy (buf, sd->status.name, 23);
push_str (st->stack, C_STR, buf);
}
@@ -3407,7 +3399,7 @@ int buildin_getequipname (struct script_state *st)
struct item_data *item;
char *buf;
- buf = (char *) aCalloc (64, sizeof (char));
+ buf = (char *) calloc (64, 1);
sd = script_rid2sd (st);
num = conv_num (st, &(st->stack->stack_data[st->start + 2]));
i = pc_checkequip (sd, equip[num - 1]);
@@ -4208,7 +4200,7 @@ int buildin_gettimestr (struct script_state *st)
fmtstr = conv_str (st, &(st->stack->stack_data[st->start + 2]));
maxlen = conv_num (st, &(st->stack->stack_data[st->start + 3]));
- tmpstr = (char *) aCalloc (maxlen + 1, sizeof (char));
+ tmpstr = (char *) calloc (maxlen + 1, 1);
strftime (tmpstr, maxlen, fmtstr, gmtime (&now));
tmpstr[maxlen] = '\0';
@@ -5773,7 +5765,7 @@ int buildin_getcastlename (struct script_state *st)
{
if (strcmp (mapname, gc->map_name) == 0)
{
- buf = (char *) aCalloc (24, sizeof (char));
+ buf = (char *) calloc (24, 1);
strncpy (buf, gc->castle_name, 23);
break;
}
@@ -6451,7 +6443,7 @@ int buildin_getitemname (struct script_state *st)
i_data = itemdb_search (item_id);
}
- item_name = (char *) aCalloc (24, sizeof (char));
+ item_name = (char *) calloc (24, 1);
if (i_data)
strncpy (item_name, i_data->jname, 23);
else
@@ -7353,11 +7345,10 @@ void op_add (struct script_state *st)
else
{ // ssの予定
char *buf;
- buf =
- (char *)
- aCalloc (strlen (st->stack->stack_data[st->stack->sp - 1].u.str) +
- strlen (st->stack->stack_data[st->stack->sp].u.str) + 1,
- sizeof (char));
+ buf = (char *)
+ calloc (strlen (st->stack->stack_data[st->stack->sp - 1].u.str) +
+ strlen (st->stack->stack_data[st->stack->sp].u.str) + 1,
+ 1);
strcpy (buf, st->stack->stack_data[st->stack->sp - 1].u.str);
strcat (buf, st->stack->stack_data[st->stack->sp].u.str);
if (st->stack->stack_data[st->stack->sp - 1].type == C_STR)
@@ -7772,9 +7763,8 @@ int run_script_main (unsigned char *script, int pos, int rid, int oid,
{
if (sd->npc_stackbuf)
free (sd->npc_stackbuf);
- sd->npc_stackbuf =
- (char *) aCalloc (sizeof (stack->stack_data[0]) *
- stack->sp_max, sizeof (char));
+ sd->npc_stackbuf = (char *)
+ calloc (sizeof (stack->stack_data[0]) * stack->sp_max, 1);
memcpy (sd->npc_stackbuf, stack->stack_data,
sizeof (stack->stack_data[0]) * stack->sp_max);
sd->npc_stack = stack->sp;
@@ -7813,9 +7803,8 @@ int run_script_l (unsigned char *script, int pos, int rid, int oid,
script = sd->npc_script;
stack.sp = sd->npc_stack;
stack.sp_max = sd->npc_stackmax;
- stack.stack_data =
- (struct script_data *) aCalloc (stack.sp_max,
- sizeof (stack.stack_data[0]));
+ stack.stack_data = (struct script_data *)
+ calloc (stack.sp_max, sizeof (stack.stack_data[0]));
memcpy (stack.stack_data, sd->npc_stackbuf,
sizeof (stack.stack_data[0]) * stack.sp_max);
free (sd->npc_stackbuf);
@@ -7826,9 +7815,8 @@ int run_script_l (unsigned char *script, int pos, int rid, int oid,
// スタック初期化
stack.sp = 0;
stack.sp_max = 64;
- stack.stack_data =
- (struct script_data *) aCalloc (stack.sp_max,
- sizeof (stack.stack_data[0]));
+ stack.stack_data = (struct script_data *)
+ calloc (stack.sp_max, sizeof (stack.stack_data[0]));
}
st.stack = &stack;
st.pos = pos;
@@ -7880,7 +7868,7 @@ int mapreg_setregstr (int num, const char *str)
mapreg_dirty = 1;
return 0;
}
- p = (char *) aCalloc (strlen (str) + 1, sizeof (char));
+ p = (char *) calloc (strlen (str) + 1, 1);
strcpy (p, str);
numdb_insert (mapregstr_db, num, p);
mapreg_dirty = 1;
@@ -7913,7 +7901,7 @@ static int script_load_mapreg ()
printf ("%s: %s broken data !\n", mapreg_txt, buf1);
continue;
}
- p = (char *) aCalloc (strlen (buf2) + 1, sizeof (char));
+ p = (char *) calloc (strlen (buf2) + 1, 1);
strcpy (p, buf2);
s = add_str (buf1);
numdb_insert (mapregstr_db, (i << 24) | s, p);
@@ -7938,10 +7926,10 @@ static int script_load_mapreg ()
* 永続的マップ変数の書き込み
*------------------------------------------
*/
-static int script_save_mapreg_intsub (void *key, void *data, va_list ap)
+static void script_save_mapreg_intsub (db_key_t key, db_val_t data, va_list ap)
{
FILE *fp = va_arg (ap, FILE *);
- int num = ((int) key) & 0x00ffffff, i = ((int) key) >> 24;
+ int num = key.i & 0x00ffffff, i = key.i >> 24;
char *name = str_buf + str_data[num].str;
if (name[1] != '@')
{
@@ -7950,13 +7938,12 @@ static int script_save_mapreg_intsub (void *key, void *data, va_list ap)
else
fprintf (fp, "%s,%d\t%d\n", name, i, (int) data);
}
- return 0;
}
-static int script_save_mapreg_strsub (void *key, void *data, va_list ap)
+static void script_save_mapreg_strsub (db_key_t key, db_val_t data, va_list ap)
{
FILE *fp = va_arg (ap, FILE *);
- int num = ((int) key) & 0x00ffffff, i = ((int) key) >> 24;
+ int num = key.i & 0x00ffffff, i = key.i >> 24;
char *name = str_buf + str_data[num].str;
if (name[1] != '@')
{
@@ -7965,7 +7952,6 @@ static int script_save_mapreg_strsub (void *key, void *data, va_list ap)
else
fprintf (fp, "%s,%d\t%s\n", name, i, (char *) data);
}
- return 0;
}
static int script_save_mapreg ()
@@ -7982,12 +7968,11 @@ static int script_save_mapreg ()
return 0;
}
-static int script_autosave_mapreg (int tid, unsigned int tick, int id,
- int data)
+static void script_autosave_mapreg (timer_id tid, tick_t tick, custom_id_t id,
+ custom_data_t data)
{
if (mapreg_dirty)
script_save_mapreg ();
- return 0;
}
/*==========================================
@@ -8043,11 +8028,11 @@ int script_config_read (char *cfgName)
i = sscanf (line, "%[^:]: %[^\r\n]", w1, w2);
if (i != 2)
continue;
- if (strcmpi (w1, "refine_posword") == 0)
+ if (strcasecmp (w1, "refine_posword") == 0)
{
set_posword (w2);
}
- if (strcmpi (w1, "import") == 0)
+ if (strcasecmp (w1, "import") == 0)
{
script_config_read (w2);
}
@@ -8061,27 +8046,16 @@ int script_config_read (char *cfgName)
* 終了
*------------------------------------------
*/
-static int mapreg_db_final (void *key, void *data, va_list ap)
-{
- return 0;
-}
-static int mapregstr_db_final (void *key, void *data, va_list ap)
+static void mapregstr_db_final (db_key_t key, db_val_t data, va_list ap)
{
free (data);
- return 0;
-}
-
-static int scriptlabel_db_final (void *key, void *data, va_list ap)
-{
- return 0;
}
-static int userfunc_db_final (void *key, void *data, va_list ap)
+static void userfunc_db_final (db_key_t key, db_val_t data, va_list ap)
{
- free (key);
+ free ((char*)key.s);
free (data);
- return 0;
}
int do_final_script ()
@@ -8092,11 +8066,11 @@ int do_final_script ()
free (script_buf);
if (mapreg_db)
- numdb_final (mapreg_db, mapreg_db_final);
+ numdb_final (mapreg_db, NULL);
if (mapregstr_db)
strdb_final (mapregstr_db, mapregstr_db_final);
if (scriptlabel_db)
- strdb_final (scriptlabel_db, scriptlabel_db_final);
+ strdb_final (scriptlabel_db, NULL);
if (userfunc_db)
strdb_final (userfunc_db, userfunc_db_final);
@@ -8118,7 +8092,6 @@ int do_init_script ()
mapregstr_db = numdb_init ();
script_load_mapreg ();
- add_timer_func_list (script_autosave_mapreg, "script_autosave_mapreg");
add_timer_interval (gettick () + MAPREG_AUTOSAVE_INTERVAL,
script_autosave_mapreg, 0, 0,
MAPREG_AUTOSAVE_INTERVAL);
diff --git a/src/map/skill-pools.c b/src/map/skill-pools.c
index 50dafcb..0c91360 100644
--- a/src/map/skill-pools.c
+++ b/src/map/skill-pools.c
@@ -5,7 +5,7 @@
#include "../common/timer.h"
#include "../common/nullpo.h"
-#include "../common/malloc.h"
+#include "../common/mt_rand.h"
#include "magic.h"
#include "battle.h"
diff --git a/src/map/skill.c b/src/map/skill.c
index 54ff545..d8b64e8 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -8,7 +8,7 @@
#include "../common/timer.h"
#include "../common/nullpo.h"
-#include "../common/malloc.h"
+#include "../common/mt_rand.h"
#include "magic.h"
#include "battle.h"
@@ -2250,7 +2250,7 @@ int skill_area_sub_count (struct block_list *src, struct block_list *target,
*
*------------------------------------------
*/
-static int skill_timerskill (int tid, unsigned int tick, int id, int data)
+static void skill_timerskill (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct map_session_data *sd = NULL;
struct mob_data *md = NULL;
@@ -2258,26 +2258,26 @@ static int skill_timerskill (int tid, unsigned int tick, int id, int data)
struct skill_timerskill *skl = NULL;
int range;
- nullpo_retr (0, src);
+ nullpo_retv (src);
if (src->prev == NULL)
- return 0;
+ return;
if (src->type == BL_PC)
{
- nullpo_retr (0, sd = (struct map_session_data *) src);
+ nullpo_retv (sd = (struct map_session_data *) src);
skl = &sd->skilltimerskill[data];
}
else if (src->type == BL_MOB)
{
- nullpo_retr (0, md = (struct mob_data *) src);
+ nullpo_retv (md = (struct mob_data *) src);
skl = &md->skilltimerskill[data];
}
else
- return 0;
+ return;
- nullpo_retr (0, skl);
+ nullpo_retv (skl);
skl->timer = -1;
if (skl->target_id)
@@ -2295,17 +2295,17 @@ static int skill_timerskill (int tid, unsigned int tick, int id, int data)
}
}
if (target == NULL)
- return 0;
+ return;
if (target->prev == NULL && skl->skill_id != RG_INTIMIDATE)
- return 0;
+ return;
if (src->m != target->m)
- return 0;
+ return;
if (sd && pc_isdead (sd))
- return 0;
+ return;
if (target->type == BL_PC
&& pc_isdead ((struct map_session_data *) target)
&& skl->skill_id != RG_INTIMIDATE)
- return 0;
+ return;
switch (skl->skill_id)
{
@@ -2392,7 +2392,7 @@ static int skill_timerskill (int tid, unsigned int tick, int id, int data)
else
{
if (src->m != skl->map)
- return 0;
+ return;
switch (skl->skill_id)
{
case WZ_METEOR:
@@ -2410,8 +2410,6 @@ static int skill_timerskill (int tid, unsigned int tick, int id, int data)
break;
}
}
-
- return 0;
}
/*==========================================
@@ -5145,19 +5143,19 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl,
* スキル使用(詠唱完了、ID指定)
*------------------------------------------
*/
-int skill_castend_id (int tid, unsigned int tick, int id, int data)
+void skill_castend_id (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct map_session_data *sd = map_id2sd (id) /*,*target_sd=NULL */ ;
struct block_list *bl;
int range, inf2;
- nullpo_retr (0, sd);
+ nullpo_retv ( sd);
if (sd->bl.prev == NULL) //prevが無いのはありなの?
- return 0;
+ return;
if (sd->skillid != SA_CASTCANCEL && sd->skilltimer != tid) /* タイマIDの確認 */
- return 0;
+ return;
if (sd->skillid != SA_CASTCANCEL && sd->skilltimer != -1
&& pc_checkskill (sd, SA_FREECAST) > 0)
{
@@ -5172,14 +5170,14 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
sd->canact_tick = tick;
sd->canmove_tick = tick;
sd->skillitem = sd->skillitemlv = -1;
- return 0;
+ return;
}
if (sd->bl.m != bl->m || pc_isdead (sd))
{ //マップが違うか自分が死んでいる
sd->canact_tick = tick;
sd->canmove_tick = tick;
sd->skillitem = sd->skillitemlv = -1;
- return 0;
+ return;
}
if (sd->skillid == PR_LEXAETERNA)
@@ -5194,7 +5192,7 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
sd->canact_tick = tick;
sd->canmove_tick = tick;
sd->skillitem = sd->skillitemlv = -1;
- return 0;
+ return;
}
}
else if (sd->skillid == RG_BACKSTAP)
@@ -5208,7 +5206,7 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
sd->canact_tick = tick;
sd->canmove_tick = tick;
sd->skillitem = sd->skillitemlv = -1;
- return 0;
+ return;
}
}
@@ -5219,7 +5217,7 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
sd->canact_tick = tick;
sd->canmove_tick = tick;
sd->skillitem = sd->skillitemlv = -1;
- return 0;
+ return;
}
if (inf2 & 0xC00 && sd->bl.id != bl->id)
{
@@ -5235,7 +5233,7 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
sd->canact_tick = tick;
sd->canmove_tick = tick;
sd->skillitem = sd->skillitemlv = -1;
- return 0;
+ return;
}
}
@@ -5261,7 +5259,7 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
sd->canact_tick = tick;
sd->canmove_tick = tick;
sd->skillitem = sd->skillitemlv = -1;
- return 0;
+ return;
}
}
if (!skill_check_condition (sd, 1))
@@ -5269,7 +5267,7 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
sd->canact_tick = tick;
sd->canmove_tick = tick;
sd->skillitem = sd->skillitemlv = -1;
- return 0;
+ return;
}
sd->skillitem = sd->skillitemlv = -1;
if (battle_config.skill_out_range_consume)
@@ -5279,7 +5277,7 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
clif_skill_fail (sd, sd->skillid, 0, 0);
sd->canact_tick = tick;
sd->canmove_tick = tick;
- return 0;
+ return;
}
}
@@ -5308,8 +5306,6 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
sd->skilllv, tick, 0);
break;
}
-
- return 0;
}
/*==========================================
@@ -5631,7 +5627,7 @@ int skill_castend_map (struct map_session_data *sd, int skill_num,
skill_unitsetting (&sd->bl, sd->skillid, sd->skilllv,
sd->skillx, sd->skilly, 0)) == NULL)
return 0;
- group->valstr = (char *) aCalloc (24, sizeof (char));
+ CREATE (group->valstr, char, 24);
memcpy (group->valstr, map, 24);
group->val2 = (x << 16) | y;
}
@@ -7001,17 +6997,17 @@ int skill_unit_ondamaged (struct skill_unit *src, struct block_list *bl,
* スキル使用(詠唱完了、場所指定)
*------------------------------------------
*/
-int skill_castend_pos (int tid, unsigned int tick, int id, int data)
+void skill_castend_pos (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
struct map_session_data *sd = map_id2sd (id) /*,*target_sd=NULL */ ;
int range, maxcount;
- nullpo_retr (0, sd);
+ nullpo_retv (sd);
if (sd->bl.prev == NULL)
- return 0;
+ return;
if (sd->skilltimer != tid) /* タイマIDの確認 */
- return 0;
+ return;
if (sd->skilltimer != -1 && pc_checkskill (sd, SA_FREECAST) > 0)
{
sd->speed = sd->prev_speed;
@@ -7023,7 +7019,7 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
sd->canact_tick = tick;
sd->canmove_tick = tick;
sd->skillitem = sd->skillitemlv = -1;
- return 0;
+ return;
}
if (battle_config.pc_skill_reiteration == 0)
@@ -7061,7 +7057,7 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
sd->canact_tick = tick;
sd->canmove_tick = tick;
sd->skillitem = sd->skillitemlv = -1;
- return 0;
+ return;
}
}
}
@@ -7098,7 +7094,7 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
sd->canact_tick = tick;
sd->canmove_tick = tick;
sd->skillitem = sd->skillitemlv = -1;
- return 0;
+ return;
}
}
}
@@ -7121,7 +7117,7 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
sd->canact_tick = tick;
sd->canmove_tick = tick;
sd->skillitem = sd->skillitemlv = -1;
- return 0;
+ return;
}
}
}
@@ -7138,7 +7134,7 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
sd->canact_tick = tick;
sd->canmove_tick = tick;
sd->skillitem = sd->skillitemlv = -1;
- return 0;
+ return;
}
}
if (!skill_check_condition (sd, 1))
@@ -7146,7 +7142,7 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
sd->canact_tick = tick;
sd->canmove_tick = tick;
sd->skillitem = sd->skillitemlv = -1;
- return 0;
+ return;
}
sd->skillitem = sd->skillitemlv = -1;
if (battle_config.skill_out_range_consume)
@@ -7156,7 +7152,7 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
clif_skill_fail (sd, sd->skillid, 0, 0);
sd->canact_tick = tick;
sd->canmove_tick = tick;
- return 0;
+ return;
}
}
@@ -7166,8 +7162,6 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
skill_castend_pos2 (&sd->bl, sd->skillx, sd->skilly, sd->skillid,
sd->skilllv, tick, 0);
-
- return 0;
}
/*==========================================
@@ -7338,8 +7332,11 @@ static int skill_check_condition_mob_master_sub (struct block_list *bl,
nullpo_retr (0, bl);
nullpo_retr (0, ap);
nullpo_retr (0, md = (struct mob_data *) bl);
- nullpo_retr (0, src_id = va_arg (ap, int));
- nullpo_retr (0, mob_class = va_arg (ap, int));
+
+ if (!(src_id = va_arg (ap, int)))
+ return 0;
+ if (!(mob_class = va_arg (ap, int)))
+ return 0;
nullpo_retr (0, c = va_arg (ap, int *));
if (md->class == mob_class && md->master_id == src_id)
@@ -8418,7 +8415,6 @@ int skill_use_pos (struct map_session_data *sd,
int skill_castcancel (struct block_list *bl, int type)
{
int inf;
- int ret = 0;
nullpo_retr (0, bl);
@@ -8439,22 +8435,16 @@ int skill_castcancel (struct block_list *bl, int type)
if (!type)
{
if ((inf = skill_get_inf (sd->skillid)) == 2 || inf == 32)
- ret = delete_timer (sd->skilltimer, skill_castend_pos);
+ delete_timer (sd->skilltimer, skill_castend_pos);
else
- ret = delete_timer (sd->skilltimer, skill_castend_id);
- if (ret < 0)
- printf ("delete timer error : skillid : %d\n",
- sd->skillid);
+ delete_timer (sd->skilltimer, skill_castend_id);
}
else
{
if ((inf = skill_get_inf (sd->skillid_old)) == 2 || inf == 32)
- ret = delete_timer (sd->skilltimer, skill_castend_pos);
+ delete_timer (sd->skilltimer, skill_castend_pos);
else
- ret = delete_timer (sd->skilltimer, skill_castend_id);
- if (ret < 0)
- printf ("delete timer error : skillid : %d\n",
- sd->skillid_old);
+ delete_timer (sd->skilltimer, skill_castend_id);
}
sd->skilltimer = -1;
clif_skillcastcancel (bl);
@@ -8469,14 +8459,12 @@ int skill_castcancel (struct block_list *bl, int type)
if (md->skilltimer != -1)
{
if ((inf = skill_get_inf (md->skillid)) == 2 || inf == 32)
- ret = delete_timer (md->skilltimer, mobskill_castend_pos);
+ delete_timer (md->skilltimer, mobskill_castend_pos);
else
- ret = delete_timer (md->skilltimer, mobskill_castend_id);
+ delete_timer (md->skilltimer, mobskill_castend_id);
md->skilltimer = -1;
clif_skillcastcancel (bl);
}
- if (ret < 0)
- printf ("delete timer error : skillid : %d\n", md->skillid);
return 0;
}
return 1;
@@ -9496,7 +9484,7 @@ int skill_update_heal_animation (struct map_session_data *sd)
* ステータス異常終了タイマー
*------------------------------------------
*/
-int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
+void skill_status_change_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
int type = data;
struct block_list *bl;
@@ -9505,8 +9493,8 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
//short *sc_count; //使ってない?
if ((bl = map_id2bl (id)) == NULL)
- return 0; //該当IDがすでに消滅しているというのはいかにもありそうなのでスルーしてみる
- nullpo_retr (0, sc_data = battle_get_sc_data (bl));
+ return; //該当IDがすでに消滅しているというのはいかにもありそうなのでスルーしてみる
+ nullpo_retv (sc_data = battle_get_sc_data (bl));
if (bl->type == BL_PC)
sd = (struct map_session_data *) bl;
@@ -9543,7 +9531,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
tick,
skill_status_change_timer,
bl->id, data);
- return 0;
+ return;
}
}
break;
@@ -9562,7 +9550,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
1000 + tick,
skill_status_change_timer,
bl->id, data);
- return 0;
+ return;
}
}
break;
@@ -9581,7 +9569,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
250 + tick,
skill_status_change_timer,
bl->id, data);
- return 0;
+ return;
}
}
break;
@@ -9599,7 +9587,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
250 + tick,
skill_status_change_timer,
bl->id, data);
- return 0;
+ return;
}
}
break;
@@ -9613,7 +9601,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
sc_data[type].timer =
add_timer (1000 * 600 + tick, skill_status_change_timer,
bl->id, data);
- return 0;
+ return;
}
}
break;
@@ -9626,7 +9614,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
sc_data[type].timer =
add_timer (1000 + tick, skill_status_change_timer, bl->id,
data);
- return 0;
+ return;
}
break;
@@ -9642,7 +9630,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
sc_data[type].timer =
add_timer (150 + tick, skill_status_change_timer, bl->id,
data);
- return 0;
+ return;
}
}
break;
@@ -9654,7 +9642,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
add_timer (1000 * 600 + tick, skill_status_change_timer,
bl->id, data);
sc_data[type].val2 = 1;
- return 0;
+ return;
}
break;
@@ -9678,7 +9666,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
(unit->group->skill_id,
unit->group->skill_lv) + tick,
skill_status_change_timer, bl->id, data);
- return 0;
+ return;
}
break;
@@ -9697,7 +9685,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
(unit->group->skill_id,
unit->group->skill_lv) / 10 + tick,
skill_status_change_timer, bl->id, data);
- return 0;
+ return;
}
break;
@@ -9716,7 +9704,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
sc_data[type].timer =
add_timer (1000 + tick, skill_status_change_timer, bl->id,
data);
- return 0;
+ return;
}
else if ((--sc_data[type].val3) > 0)
{
@@ -9740,7 +9728,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
sc_data[type].timer =
add_timer (1000 + tick, skill_status_change_timer, bl->id,
data);
- return 0;
+ return;
}
break;
case SC_POISON:
@@ -9796,7 +9784,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
10000 + tick,
skill_status_change_timer,
bl->id, data);
- return 0;
+ return;
}
if (sd->status.max_hp <= sd->status.hp)
skill_status_change_end (&sd->bl, SC_TENSIONRELAX, -1);
@@ -9819,7 +9807,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
sc_data[type].timer =
add_timer (1000 * 600 + tick, skill_status_change_timer,
bl->id, data);
- return 0;
+ return;
case SC_DANCING: //ダンススキルの時間SP消費
{
@@ -9869,7 +9857,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
1000 + tick,
skill_status_change_timer,
bl->id, data);
- return 0;
+ return;
}
}
}
@@ -9885,7 +9873,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
15000 + tick,
skill_status_change_timer,
bl->id, data);
- return 0;
+ return;
}
}
break;
@@ -9899,7 +9887,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
10000 + tick,
skill_status_change_timer,
bl->id, data);
- return 0;
+ return;
}
}
break;
@@ -9916,7 +9904,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
60000 + tick,
skill_status_change_timer,
bl->id, data);
- return 0;
+ return;
}
}
break;
@@ -9934,7 +9922,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
1000 + tick,
skill_status_change_timer,
bl->id, data);
- return 0;
+ return;
}
break;
@@ -9944,7 +9932,7 @@ int skill_status_change_timer (int tid, unsigned int tick, int id, int data)
}
- return skill_status_change_end (bl, type, tid);
+ skill_status_change_end (bl, type, tid);
}
/*==========================================
@@ -11153,8 +11141,7 @@ struct skill_unit_group *skill_initunitgroup (struct block_list *src,
group->group_id = skill_unit_group_newid++;
if (skill_unit_group_newid <= 0)
skill_unit_group_newid = 10;
- group->unit =
- (struct skill_unit *) aCalloc (count, sizeof (struct skill_unit));
+ CREATE (group->unit, struct skill_unit, count);
group->unit_count = count;
group->val1 = group->val2 = 0;
group->skill_id = skillid;
@@ -11493,15 +11480,13 @@ int skill_unit_timer_sub (struct block_list *bl, va_list ap)
* スキルユニットタイマー処理
*------------------------------------------
*/
-int skill_unit_timer (int tid, unsigned int tick, int id, int data)
+void skill_unit_timer (timer_id tid, tick_t tick, custom_id_t id, custom_data_t data)
{
map_freeblock_lock ();
map_foreachobject (skill_unit_timer_sub, BL_SKILL, tick);
map_freeblock_unlock ();
-
- return 0;
}
/*==========================================
@@ -11814,19 +11799,19 @@ int skill_unit_move_unit_group (struct skill_unit_group *group, int m, int dx,
static int scan_stat (char *statname)
{
- if (!strcmpi (statname, "str"))
+ if (!strcasecmp (statname, "str"))
return SP_STR;
- if (!strcmpi (statname, "dex"))
+ if (!strcasecmp (statname, "dex"))
return SP_DEX;
- if (!strcmpi (statname, "agi"))
+ if (!strcasecmp (statname, "agi"))
return SP_AGI;
- if (!strcmpi (statname, "vit"))
+ if (!strcasecmp (statname, "vit"))
return SP_VIT;
- if (!strcmpi (statname, "int"))
+ if (!strcasecmp (statname, "int"))
return SP_INT;
- if (!strcmpi (statname, "luk"))
+ if (!strcasecmp (statname, "luk"))
return SP_LUK;
- if (!strcmpi (statname, "none"))
+ if (!strcasecmp (statname, "none"))
return 0;
else
@@ -11911,18 +11896,18 @@ int skill_readdb (void)
skill_db[i].num[k] =
(split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
- if (strcmpi (split[9], "yes") == 0)
+ if (strcasecmp (split[9], "yes") == 0)
skill_db[i].castcancel = 1;
else
skill_db[i].castcancel = 0;
skill_db[i].cast_def_rate = atoi (split[9]);
skill_db[i].inf2 = atoi (split[10]);
skill_db[i].maxcount = atoi (split[11]);
- if (strcmpi (split[13], "weapon") == 0)
+ if (strcasecmp (split[13], "weapon") == 0)
skill_db[i].skill_type = BF_WEAPON;
- else if (strcmpi (split[12], "magic") == 0)
+ else if (strcasecmp (split[12], "magic") == 0)
skill_db[i].skill_type = BF_MAGIC;
- else if (strcmpi (split[12], "misc") == 0)
+ else if (strcasecmp (split[12], "misc") == 0)
skill_db[i].skill_type = BF_MISC;
else
skill_db[i].skill_type = 0;
@@ -11938,12 +11923,12 @@ int skill_readdb (void)
skill_db[i].blewcount[k] =
(split2[k]) ? atoi (split2[k]) : atoi (split2[0]);
- if (!strcmpi (split[15], "passive"))
+ if (!strcasecmp (split[15], "passive"))
{
skill_pool_register (i);
skill_db[i].poolflags = SKILL_POOL_FLAG;
}
- else if (!strcmpi (split[15], "active"))
+ else if (!strcasecmp (split[15], "active"))
{
skill_pool_register (i);
skill_db[i].poolflags = SKILL_POOL_FLAG | SKILL_POOL_ACTIVE;
@@ -12086,29 +12071,29 @@ int skill_readdb (void)
skill_db[i].weapon |= 1 << l;
}
- if (strcmpi (split[8], "hiding") == 0)
+ if (strcasecmp (split[8], "hiding") == 0)
skill_db[i].state = ST_HIDING;
- else if (strcmpi (split[8], "cloaking") == 0)
+ else if (strcasecmp (split[8], "cloaking") == 0)
skill_db[i].state = ST_CLOAKING;
- else if (strcmpi (split[8], "hidden") == 0)
+ else if (strcasecmp (split[8], "hidden") == 0)
skill_db[i].state = ST_HIDDEN;
- else if (strcmpi (split[8], "riding") == 0)
+ else if (strcasecmp (split[8], "riding") == 0)
skill_db[i].state = ST_RIDING;
- else if (strcmpi (split[8], "falcon") == 0)
+ else if (strcasecmp (split[8], "falcon") == 0)
skill_db[i].state = ST_FALCON;
- else if (strcmpi (split[8], "cart") == 0)
+ else if (strcasecmp (split[8], "cart") == 0)
skill_db[i].state = ST_CART;
- else if (strcmpi (split[8], "shield") == 0)
+ else if (strcasecmp (split[8], "shield") == 0)
skill_db[i].state = ST_SHIELD;
- else if (strcmpi (split[8], "sight") == 0)
+ else if (strcasecmp (split[8], "sight") == 0)
skill_db[i].state = ST_SIGHT;
- else if (strcmpi (split[8], "explosionspirits") == 0)
+ else if (strcasecmp (split[8], "explosionspirits") == 0)
skill_db[i].state = ST_EXPLOSIONSPIRITS;
- else if (strcmpi (split[8], "recover_weight_rate") == 0)
+ else if (strcasecmp (split[8], "recover_weight_rate") == 0)
skill_db[i].state = ST_RECOV_WEIGHT_RATE;
- else if (strcmpi (split[8], "move_enable") == 0)
+ else if (strcasecmp (split[8], "move_enable") == 0)
skill_db[i].state = ST_MOVE_ENABLE;
- else if (strcmpi (split[8], "water") == 0)
+ else if (strcasecmp (split[8], "water") == 0)
skill_db[i].state = ST_WATER;
else
skill_db[i].state = ST_NONE;
@@ -12275,10 +12260,10 @@ int skill_readdb (void)
void skill_reload (void)
{
/*
- *
+ *
* <empty skill database>
* <?>
- *
+ *
*/
do_init_skill ();
@@ -12292,12 +12277,6 @@ int do_init_skill (void)
{
skill_readdb ();
- add_timer_func_list (skill_unit_timer, "skill_unit_timer");
- add_timer_func_list (skill_castend_id, "skill_castend_id");
- add_timer_func_list (skill_castend_pos, "skill_castend_pos");
- add_timer_func_list (skill_timerskill, "skill_timerskill");
- add_timer_func_list (skill_status_change_timer,
- "skill_status_change_timer");
add_timer_interval (gettick () + SKILLUNITTIMER_INVERVAL,
skill_unit_timer, 0, 0, SKILLUNITTIMER_INVERVAL);
diff --git a/src/map/skill.h b/src/map/skill.h
index 08f2e18..d0a698c 100644
--- a/src/map/skill.h
+++ b/src/map/skill.h
@@ -2,6 +2,8 @@
#ifndef _SKILL_H_
#define _SKILL_H_
+#include "../common/timer.h"
+
#include "map.h"
#include "magic.h"
@@ -149,7 +151,7 @@ int skill_status_effect (struct block_list *bl, int type, int val1, int val2,
int skill_status_change_start (struct block_list *bl, int type, int val1,
int val2, int val3, int val4, int tick,
int flag);
-int skill_status_change_timer (int tid, unsigned int tick, int id, int data);
+void skill_status_change_timer (timer_id, tick_t, custom_id_t, custom_data_t);
int skill_status_change_active (struct block_list *bl, int type); // [fate]
int skill_encchant_eremental_end (struct block_list *bl, int type);
int skill_status_change_end (struct block_list *bl, int type, int tid);
diff --git a/src/map/storage.c b/src/map/storage.c
index 84dedb3..4a0d934 100644
--- a/src/map/storage.c
+++ b/src/map/storage.c
@@ -7,7 +7,6 @@
#include "../common/db.h"
#include "../common/nullpo.h"
-#include "../common/malloc.h"
#include "storage.h"
#include "chrif.h"
@@ -40,18 +39,16 @@ int storage_comp_item (const void *_i1, const void *_i2)
return i1->nameid - i2->nameid;
}
-static int guild_storage_db_final (void *key, void *data, va_list ap)
+static void guild_storage_db_final (db_key_t key, db_val_t data, va_list ap)
{
struct guild_storage *gstor = (struct guild_storage *) data;
free (gstor);
- return 0;
}
-static int storage_db_final (void *key, void *data, va_list ap)
+static void storage_db_final (db_key_t key, db_val_t data, va_list ap)
{
struct storage *stor = (struct storage *) data;
free (stor);
- return 0;
}
void sortage_sortitem (struct storage *stor)
@@ -87,7 +84,7 @@ void do_final_storage (void) // by [MC Cameri]
numdb_final (guild_storage_db, guild_storage_db_final);
}
-static int storage_reconnect_sub (void *key, void *data, va_list ap)
+static void storage_reconnect_sub (db_key_t key, db_val_t data, va_list ap)
{ //Parses storage and saves 'dirty' ones upon reconnect. [Skotlex]
int type = va_arg (ap, int);
if (type)
@@ -102,7 +99,6 @@ static int storage_reconnect_sub (void *key, void *data, va_list ap)
if (stor->dirty && stor->storage_status == 0) //Save closed storages.
storage_storage_save (stor->account_id, stor->dirty == 2 ? 1 : 0);
}
- return 0;
}
//Function to be invoked upon server reconnection to char. To save all 'dirty' storages [Skotlex
@@ -118,7 +114,7 @@ struct storage *account2storage (int account_id)
(struct storage *) numdb_search (storage_db, account_id);
if (stor == NULL)
{
- stor = (struct storage *) aCallocA (sizeof (struct storage), 1);
+ CREATE (stor, struct storage, 1);
stor->account_id = account_id;
numdb_insert (storage_db, stor->account_id, stor);
}
@@ -481,13 +477,7 @@ struct guild_storage *guild2storage (int guild_id)
guild_id);
if (gs == NULL)
{
- gs = (struct guild_storage *)
- aCallocA (sizeof (struct guild_storage), 1);
- if (gs == NULL)
- {
- printf ("storage: out of memory!\n");
- exit (0);
- }
+ CREATE (gs, struct guild_storage, 1);
gs->guild_id = guild_id;
numdb_insert (guild_storage_db, gs->guild_id, gs);
}
diff --git a/src/map/tmw.c b/src/map/tmw.c
index c04c9c8..3487c1d 100644
--- a/src/map/tmw.c
+++ b/src/map/tmw.c
@@ -8,7 +8,6 @@
#include "../common/socket.h"
#include "../common/timer.h"
-#include "../common/malloc.h"
#include "../common/version.h"
#include "../common/nullpo.h"
@@ -30,7 +29,7 @@
#include "skill.h"
#include "storage.h"
#include "trade.h"
-
+
int tmw_CheckChatSpam (struct map_session_data *sd, char *message)
{
nullpo_retr (1, sd);
diff --git a/src/tool/Makefile b/src/tool/Makefile
index 87393fb..8d51c25 100644
--- a/src/tool/Makefile
+++ b/src/tool/Makefile
@@ -1,15 +1,13 @@
include ../../make.defs
-COBJS=../common/timer.o ../common/malloc.o ../common/socket.o ../common/lock.o ../common/db.o ../char/int_storage.o ../char/inter.o ../char/int_party.o ../char/int_guild.o
-MOBJS=../common/socket.o ../common/timer.o ../common/db.o ../common/lock.o ../common/malloc.o ../char/int_guild.o ../char/int_party.o ../char/int_storage.o ../char/inter.o
+OBJS =../common/timer.o ../common/socket.o ../common/db.o ../common/lock.o ../char/inter.o ../char/int_guild.o ../char/int_party.o ../char/int_storage.o
all: adduser itemfrob mapfrob marriage-info eathena-monitor
adduser: adduser.o ../common/socket.o
-itemfrob: itemfrob.o ${COBJS}
-mapfrob: mapfrob.o ${COBJS}
-marriage-info: marriage-info.o ${MOBJS}
+itemfrob: itemfrob.o ${OBJS}
+mapfrob: mapfrob.o ${OBJS}
+marriage-info: marriage-info.o ${OBJS}
eathena-monitor: eathena-monitor.c
- $(CC) $(CFLAGS) -o eathena-monitor eathena-monitor.c
clean:
rm -f adduser itemfrob mapfrob marriage-info eathena-monitor
diff --git a/src/tool/eathena-monitor.c b/src/tool/eathena-monitor.c
index 04a48cf..6e26706 100644
--- a/src/tool/eathena-monitor.c
+++ b/src/tool/eathena-monitor.c
@@ -27,7 +27,7 @@
#define SKIP_BLANK(ptr) ptr += skip_blank(ptr)
-inline size_t skip_blank(const char* ptr) {
+static inline size_t skip_blank(const char* ptr) {
size_t i = 0;
while (
(ptr[i] == ' ') ||
@@ -39,7 +39,7 @@ inline size_t skip_blank(const char* ptr) {
}
#define GOTO_EQL(ptr) ptr += goto_eql(ptr)
-inline size_t goto_eql(const char* ptr) {
+static inline size_t goto_eql(const char* ptr) {
size_t i = 0;
while (
(ptr[i] != '\0') &&
@@ -51,7 +51,7 @@ inline size_t goto_eql(const char* ptr) {
}
#define GOTO_EOL(ptr) ptr += goto_newline(ptr)
-inline size_t goto_newline(const char* ptr) {
+static inline size_t goto_newline(const char* ptr) {
size_t i = 0;
while (
(ptr[i] != '\0') &&
diff --git a/src/tool/itemfrob.c b/src/tool/itemfrob.c
index bc9ff35..646ec73 100644
--- a/src/tool/itemfrob.c
+++ b/src/tool/itemfrob.c
@@ -4,6 +4,7 @@
#include <stdio.h>
#include <stdlib.h>
#include "../common/mmo.h"
+// Yes, this is intentional
#include "../char/char.c"
// Well, this is not terribly elegant, but I don't have that much time.
@@ -37,7 +38,6 @@ int mmo_char_convert ()
fprintf (ofp, "%s" RETCODE, line);
}
}
- fcloseall ();
return 0;
}
@@ -128,8 +128,3 @@ int main (int argc, char *argv[])
return 0;
}
-
-/* satisfy linker */
-void set_termfunc (void (*termfunc) (void))
-{
-};
diff --git a/src/tool/mapfrob.c b/src/tool/mapfrob.c
index d410878..11983eb 100644
--- a/src/tool/mapfrob.c
+++ b/src/tool/mapfrob.c
@@ -4,6 +4,7 @@
#include <stdio.h>
#include <stdlib.h>
#include "../common/mmo.h"
+// Yes, this is intentional
#include "../char/char.c"
// Well, this is not terribly elegant, but I don't have that much time.
@@ -63,7 +64,6 @@ int mmo_char_convert ()
fprintf (ofp, "%s" RETCODE, line);
}
}
- fcloseall ();
return 0;
}
@@ -127,8 +127,3 @@ int main (int argc, char *argv[])
return 0;
}
-
-/* satisfy linker */
-void set_termfunc (void (*termfunc) (void))
-{
-};
diff --git a/src/tool/marriage-info.c b/src/tool/marriage-info.c
index 9b91955..4d7cbc3 100644
--- a/src/tool/marriage-info.c
+++ b/src/tool/marriage-info.c
@@ -9,6 +9,7 @@ src/char/int_party.o src/char/int_storage.o src/char/inter.o
#include <stdlib.h>
#include "../login/login.h"
#include "../common/mmo.h"
+// Yes, this is intentional
#include "../char/char.c"
int mode;
@@ -442,7 +443,6 @@ int mmo_char_dump()
mmo_check_dumpworthy(&char_dat);
}
}
- fcloseall();
return 0;
}
@@ -480,7 +480,3 @@ int main(int argc,char *argv[])
return 0;
}
-
-
-/* satisfy linker */
-void set_termfunc(void (*termfunc)(void)) {};
diff --git a/src/tool/moneycount/mmo.h b/src/tool/moneycount/mmo.h
index 640065a..c7ab21f 100644
--- a/src/tool/moneycount/mmo.h
+++ b/src/tool/moneycount/mmo.h
@@ -310,20 +310,5 @@ enum
};
-#ifndef LCCWIN32
-#ifndef strcmpi
-#define strcmpi strcasecmp
-#endif
-#ifndef stricmp
-#define stricmp strcasecmp
-#endif
-#ifndef strncmpi
-#define strncmpi strncasecmp
-#endif
-#ifndef strnicmp
-#define strnicmp strncasecmp
-#endif
-#endif
-
#endif // _MMO_H_
diff --git a/src/tool/skillfrob.c b/src/tool/skillfrob.c
index ea68660..c7b6bb6 100644
--- a/src/tool/skillfrob.c
+++ b/src/tool/skillfrob.c
@@ -78,8 +78,3 @@ int main (int argc, char *argv[])
return 0;
}
-
-/* satisfy linker */
-void set_termfunc (void (*termfunc) (void))
-{
-};