diff options
author | Ben Longbons <b.r.longbons@gmail.com> | 2011-03-24 13:57:13 -0700 |
---|---|---|
committer | Ben Longbons <b.r.longbons@gmail.com> | 2011-03-24 13:57:13 -0700 |
commit | a2306446c86b3333e69b082e41ae76ba71a42d9d (patch) | |
tree | ac032fc4566d2ae3091a0dc95329ac86d50b9a23 /src | |
parent | b6fa80d4c17994771cb796317c52cb8fb7a38a16 (diff) | |
download | tmwa-a2306446c86b3333e69b082e41ae76ba71a42d9d.tar.gz tmwa-a2306446c86b3333e69b082e41ae76ba71a42d9d.tar.bz2 tmwa-a2306446c86b3333e69b082e41ae76ba71a42d9d.tar.xz tmwa-a2306446c86b3333e69b082e41ae76ba71a42d9d.zip |
Optimize common objects, and adjust other objects accordingly.
Major changes still need to be made to each of the servers.
Diffstat (limited to 'src')
72 files changed, 2377 insertions, 4441 deletions
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)) -{ -}; |