diff options
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/.svnignore | 2 | ||||
-rw-r--r-- | src/common/Makefile | 23 | ||||
-rw-r--r-- | src/common/buffer.h | 18 | ||||
-rw-r--r-- | src/common/core.c | 327 | ||||
-rw-r--r-- | src/common/core.h | 21 | ||||
-rw-r--r-- | src/common/db.c | 662 | ||||
-rw-r--r-- | src/common/db.h | 68 | ||||
-rw-r--r-- | src/common/dll.h | 25 | ||||
-rw-r--r-- | src/common/grfio.c | 1070 | ||||
-rw-r--r-- | src/common/grfio.h | 19 | ||||
-rw-r--r-- | src/common/lock.c | 55 | ||||
-rw-r--r-- | src/common/lock.h | 8 | ||||
-rw-r--r-- | src/common/malloc.c | 548 | ||||
-rw-r--r-- | src/common/malloc.h | 77 | ||||
-rw-r--r-- | src/common/mmo.h | 353 | ||||
-rw-r--r-- | src/common/nullpo.c | 90 | ||||
-rw-r--r-- | src/common/nullpo.h | 233 | ||||
-rw-r--r-- | src/common/showmsg.c | 140 | ||||
-rw-r--r-- | src/common/showmsg.h | 57 | ||||
-rw-r--r-- | src/common/socket.c | 1069 | ||||
-rw-r--r-- | src/common/socket.h | 116 | ||||
-rw-r--r-- | src/common/strlib.c | 98 | ||||
-rw-r--r-- | src/common/strlib.h | 13 | ||||
-rw-r--r-- | src/common/timer.c | 315 | ||||
-rw-r--r-- | src/common/timer.h | 55 | ||||
-rw-r--r-- | src/common/utils.c | 189 | ||||
-rw-r--r-- | src/common/utils.h | 57 | ||||
-rw-r--r-- | src/common/version.h | 27 |
28 files changed, 0 insertions, 5735 deletions
diff --git a/src/common/.svnignore b/src/common/.svnignore deleted file mode 100644 index fbbf39b06..000000000 --- a/src/common/.svnignore +++ /dev/null @@ -1,2 +0,0 @@ -GNUmakefile -obj diff --git a/src/common/Makefile b/src/common/Makefile deleted file mode 100644 index 7a00c5a3c..000000000 --- a/src/common/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -txt sql all: obj common - -obj: - mkdir obj - -common: obj/core.o obj/socket.o obj/timer.o obj/grfio.o obj/db.o obj/lock.o obj/nullpo.o obj/malloc.o obj/showmsg.o obj/strlib.o obj/utils.o - -obj/%.o: %.c - $(COMPILE.c) $(OUTPUT_OPTION) $< - -obj/core.o: core.c core.h showmsg.h -obj/socket.o: socket.c socket.h mmo.h showmsg.h dll.h -obj/timer.o: timer.c timer.h showmsg.h -obj/grfio.o: grfio.c grfio.h showmsg.h -obj/db.o: db.c db.h showmsg.h -obj/lock.o: lock.h showmsg.h -obj/nullpo.o: nullpo.c nullpo.h showmsg.h -obj/malloc.o: malloc.c malloc.h showmsg.h -obj/showmsg.o: showmsg.c showmsg.h -obj/strlib.o: strlib.c strlib.h utils.h - -clean: - rm -rf *.o obj diff --git a/src/common/buffer.h b/src/common/buffer.h deleted file mode 100644 index ea94380ce..000000000 --- a/src/common/buffer.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _BUFFER_H_ -#define _BUFFER_H_ - -// Full credit for this goes to Shinomori [Ajarn] - -#ifdef __GNUC__ // GCC has variable length arrays - -#define CREATE_BUFFER(name, type, size) type name[size] -#define DELETE_BUFFER(name) - -#else // others don't, so we emulate them - -#define CREATE_BUFFER(name, type, size) type *name=(type*)aCalloc(size,sizeof(type)) -#define DELETE_BUFFER(name) aFree(name);name=NULL - -#endif - -#endif diff --git a/src/common/core.c b/src/common/core.c deleted file mode 100644 index 0a9e76120..000000000 --- a/src/common/core.c +++ /dev/null @@ -1,327 +0,0 @@ -// $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 _WIN32 -#include <unistd.h> -#endif -#include <signal.h> -#include <string.h> -#ifdef DUMPSTACK - #ifndef CYGWIN // HAVE_EXECINFO_H - #include <execinfo.h> - #endif -#endif - -#include "core.h" -#include "../common/mmo.h" -#include "../common/malloc.h" -#include "../common/socket.h" -#include "../common/timer.h" -#include "../common/version.h" -#include "../common/showmsg.h" - -#ifdef MEMWATCH -#include "memwatch.h" -#endif - -char *argp; -int runflag = 1; -char SERVER_TYPE = SERVER_NONE; -unsigned long ticks = 0; // by MC Cameri -char pid_file[256]; -static void (*term_func)(void)=NULL; - -/*====================================== - * CORE : Set function - *-------------------------------------- - */ -void set_termfunc(void (*termfunc)(void)) -{ - term_func = termfunc; -} - -// Added by Gabuzomeu -// -// This is an implementation of signal() using sigaction() for portability. -// (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) -{ - 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 (oact.sa_handler); -} -#endif - -/*====================================== - * CORE : Signal Sub Function - *-------------------------------------- - */ -// for handling certain signals ourselves, like SIGPIPE -static void sig_ignore(int sn) { - printf ("Broken pipe found... closing socket\n"); // set to eof in socket.c - return; // does nothing here -} -static void sig_proc(int sn) -{ - int i; - static int is_called = 0; - - if(is_called++) - return; - - 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; - } -} - -/*========================================= - * Dumps the stack using glibc's backtrace - *----------------------------------------- - */ -#ifndef DUMPSTACK - #define sig_dump SIG_DFL -#else - #ifdef CYGWIN - #define FOPEN_ freopen - extern void cygwin_stackdump(); - #else - #define FOPEN_(fn,m,s) fopen(fn,m) - #endif -extern const char *strsignal(int); -void sig_dump(int sn) -{ - FILE *fp; - char file[256]; - int no = 0; - - #ifndef CYGWIN - void* array[20]; - char **stack; - size_t size; - #endif - - // search for a usable filename - do { - sprintf (file, "log/%s%04d.stackdump", argp, ++no); - } while((fp = fopen(file,"r")) && (fclose(fp), no < 9999)); - // dump the trace into the file - - if ((fp = FOPEN_(file, "w", stderr)) != NULL) { - printf ("Dumping stack... "); - fprintf(fp, "Exception: %s \n", strsignal(sn)); - fflush (fp); - - #ifdef CYGWIN - cygwin_stackdump (); - #else - fprintf(fp, "Stack trace:\n"); - size = backtrace (array, 20); - stack = backtrace_symbols (array, size); - for (no = 0; no < size; no++) { - fprintf(fp, "%s\n", stack[no]); - } - fprintf(fp,"End of stack trace\n"); - aFree(stack); - #endif - - printf ("Done.\n"); - fflush(stdout); - fclose(fp); - } - // Pass the signal to the system's default handler - compat_signal(sn, SIG_DFL); - raise(sn); -} -#endif - -int get_svn_revision(char *svnentry) { // Warning: minor syntax checking - char line[1024]; - int rev = 0; - FILE *fp; - if ((fp = fopen(svnentry, "r")) == NULL) { - return 0; - } else { - while (fgets(line,1023,fp)) - if (strstr(line,"revision=")) break; - fclose(fp); - if (sscanf(line," %*[^\"]\"%d%*[^\n]",&rev) == 1) - return rev; - else - return 0; - } -// return 0; -} - -/*====================================== - * CORE : Display title - *-------------------------------------- - */ - -static void display_title(void) -{ - int revision; - // 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 - 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)2005 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[0;44m (\033[1m \033[0;44m)\033[K\033[0m\n"); // yellow writing (33) - printf("\033[0;44m (\033[1;33m Advanced Fusion Maps (c) 2003-2005 The Fusion Project \033[0;44m)\033[K\033[0m\n"); // yellow writing (33) - printf("\033[37;44m (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n\n"); // reset color - - if ((revision = get_svn_revision(".svn\\entries"))>0) { - snprintf(tmp_output,sizeof(tmp_output),"SVN Revision: '"CL_WHITE"%d"CL_RESET"'.\n",revision); - ShowInfo(tmp_output); - } -} - -/*====================================== - * CORE : MAINROUTINE - *-------------------------------------- - */ - -void pid_delete(void) { - unlink(pid_file); -} - -void pid_create(const char* file) { - FILE *fp; - int len = strlen(file); - strcpy(pid_file,file); - if(len > 4 && pid_file[len - 4] == '.') { - pid_file[len - 4] = 0; - } - strcat(pid_file,".pid"); - fp = fopen(pid_file,"w"); - if(fp) { -#ifdef _WIN32 - fprintf(fp,"%d",GetCurrentProcessId()); -#else - fprintf(fp,"%d",getpid()); -#endif - fclose(fp); - atexit(pid_delete); - } -} - -#define LOG_UPTIME 0 -void log_uptime(void) -{ -#if LOG_UPTIME - time_t curtime; - char curtime2[24]; - FILE *fp; - long seconds = 0, day = 24*60*60, hour = 60*60, - minute = 60, days = 0, hours = 0, minutes = 0; - - fp = fopen("log/uptime.log","a"); - if (fp) { - time(&curtime); - strftime(curtime2, 24, "%m/%d/%Y %H:%M:%S", localtime(&curtime)); - - seconds = (gettick()-ticks)/CLOCKS_PER_SEC; - days = seconds/day; - seconds -= (seconds/day>0)?(seconds/day)*day:0; - hours = seconds/hour; - seconds -= (seconds/hour>0)?(seconds/hour)*hour:0; - minutes = seconds/minute; - seconds -= (seconds/minute>0)?(seconds/minute)*minute:0; - - fprintf(fp, "%s: %s uptime - %ld days, %ld hours, %ld minutes, %ld seconds.\n", - curtime2, argp, days, hours, minutes, seconds); - fclose(fp); - } - - return; -#endif -} - -int main(int argc,char **argv) -{ - int next; - - if ((argp = strstr(argv[0], "./")) != NULL) - argp+=2; - else argp = argv[0]; - - display_title(); - - do_init_memmgr(argp); // 一番最初に実行する必要がある - atexit(log_uptime); - pid_create(argp); - Net_Init(); - do_socket(); - - compat_signal(SIGPIPE, sig_ignore); - compat_signal(SIGTERM,sig_proc); - compat_signal(SIGINT,sig_proc); - - // Signal to create coredumps by system when necessary (crash) - compat_signal(SIGSEGV, sig_dump); - compat_signal(SIGFPE, sig_dump); - compat_signal(SIGILL, sig_dump); - #ifndef _WIN32 - compat_signal(SIGBUS, sig_dump); - compat_signal(SIGTRAP, SIG_DFL); - #endif - - tick_ = time(0); - ticks = gettick(); - - do_init(argc,argv); - - while(runflag){ - next=do_timer(gettick_nocache()); - do_sendrecv(next); - do_parsepacket(); - } - - return 0; -} diff --git a/src/common/core.h b/src/common/core.h deleted file mode 100644 index e9b5c8227..000000000 --- a/src/common/core.h +++ /dev/null @@ -1,21 +0,0 @@ -// original : core.h 2003/03/14 11:55:25 Rev 1.4 - -#ifndef _CORE_H_ -#define _CORE_H_ - -extern char *argp; -extern int runflag; -extern unsigned long ticks; -extern char SERVER_TYPE; - -enum { - SERVER_NONE, - SERVER_LOGIN, - SERVER_CHAR, - SERVER_MAP, -}; - -int do_init(int,char**); -void set_termfunc(void (*termfunc)(void)); - -#endif // _CORE_H_ diff --git a/src/common/db.c b/src/common/db.c deleted file mode 100644 index 377128e8f..000000000 --- a/src/common/db.c +++ /dev/null @@ -1,662 +0,0 @@ -// $Id: db.c,v 1.2 2004/09/23 14:43:06 MouseJstr Exp $ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "db.h" -#include "mmo.h" -#include "utils.h" -#include "malloc.h" - -#ifdef MEMWATCH -#include "memwatch.h" -#endif - -//#define MALLOC_DBN - -// Backup cleaning routine in case the core doesn't do so properly, -// only enabled if malloc_dbn is not defined. -// As a temporary solution the root of the problem should still be found and fixed -struct dbn *head; -struct dbn *tail; - -#ifdef MALLOC_DBN -#define ROOT_SIZE 4096 -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; -} - -void exit_dbn(void) -{ - int i; - - for (i=0;i<dbn_root_num;i++) - if (dbn_root[i]) - aFree(dbn_root[i]); - - dbn_root_rest=0; - dbn_root_num=0; - - return; -} -#else -void exit_dbn(void) -{ - int i = 0; - struct dbn *p = head, *p2; - while (p) { - p2 = p->next; - aFree(p); - p = p2; - i++; - } - //printf ("freed %d stray dbn\n", i); - return; -} -#endif - -// maybe change the void* to const char* ??? -static int strdb_cmp(struct dbt* table,void* a,void* b) -{ - if(table->maxlen) - return strncmp((const char*)a,(const char*)b,table->maxlen); - return strcmp((const char*)a,(const char*)b); -} - -// maybe change the void* to unsigned char* ??? -static unsigned int strdb_hash(struct dbt* table,void* a) -{ - int i; - unsigned int h; - unsigned char *p = (unsigned char*)a; - - i=table->maxlen; - if(i==0) i=0x7fffffff; - for(h=0;*p && --i>=0;){ - h=(h*33 + *p++) ^ (h>>24); - } - return h; -} - -struct dbt* strdb_init_(int maxlen,const char *file,int line) -{ - int i; - struct dbt* table; - - CREATE(table, struct dbt, 1); - - table->cmp=strdb_cmp; - table->hash=strdb_hash; - table->maxlen=maxlen; - for(i=0;i<HASH_SIZE;i++) - table->ht[i]=NULL; - table->alloc_file = file; - table->alloc_line = line; - table->item_count = 0; - return table; -} - -static int numdb_cmp(struct dbt* table,void* a,void* b) -{ - int ia,ib; - - ia=(int)a; - ib=(int)b; - - if((ia^ib) & 0x80000000) - return ia<0 ? -1 : 1; - - return ia-ib; -} - -static unsigned int numdb_hash(struct dbt* table,void* a) -{ - return (unsigned int)a; -} - -struct dbt* numdb_init_(const char *file,int line) -{ - 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->alloc_file = file; - table->alloc_line = line; - table->item_count = 0; - return table; -} - -void* db_search(struct dbt *table,void* key) -{ - struct dbn *p; - - for(p=table->ht[table->hash(table,key) % HASH_SIZE];p;){ - int c=table->cmp(table,key,p->key); - if(c==0) - return p->data; - if(c<0) - p=p->left; - else - p=p->right; - } - 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 (strnicmp(key, (const char*)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; -} - -static void db_rotate_left(struct dbn *p,struct dbn **root) -{ - struct dbn * y = p->right; - p->right = y->left; - if (y->left !=0) - y->left->parent = p; - y->parent = p->parent; - - if (p == *root) - *root = y; - else if (p == p->parent->left) - p->parent->left = y; - else - p->parent->right = y; - y->left = p; - p->parent = y; -} - -static void db_rotate_right(struct dbn *p,struct dbn **root) -{ - struct dbn * y = p->left; - p->left = y->right; - if (y->right != 0) - y->right->parent = p; - y->parent = p->parent; - - if (p == *root) - *root = y; - else if (p == p->parent->right) - p->parent->right = y; - else - p->parent->left = y; - y->right = p; - p->parent = y; -} - -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; - if (y && y->color == RED) { - p->parent->color = BLACK; - y->color = BLACK; - p->parent->parent->color = RED; - p = p->parent->parent; - } else { - if (p == p->parent->right) { - p = p->parent; - db_rotate_left(p, root); - } - p->parent->color = BLACK; - p->parent->parent->color = RED; - db_rotate_right(p->parent->parent, root); - } - } else { - struct dbn* y = p->parent->parent->left; - if (y && y->color == RED) { - p->parent->color = BLACK; - y->color = BLACK; - p->parent->parent->color = RED; - p = p->parent->parent; - } else { - if (p == p->parent->left) { - p = p->parent; - db_rotate_right(p, root); - } - p->parent->color = BLACK; - p->parent->parent->color = RED; - db_rotate_left(p->parent->parent, root); - } - } - } - (*root)->color=BLACK; -} - -static void db_rebalance_erase(struct dbn *z,struct dbn **root) -{ - struct dbn *y = z, *x = NULL, *x_parent = NULL; - - if (y->left == NULL) - x = y->right; - else if (y->right == NULL) - x = y->left; - else { - y = y->right; - while (y->left != NULL) - y = y->left; - x = y->right; - } - if (y != z) { // 左右が両方埋まっていた時 yをzの位置に持ってきてzを浮かせる - z->left->parent = y; - y->left = z->left; - if (y != z->right) { - x_parent = y->parent; - if (x) x->parent = y->parent; - y->parent->left = x; - y->right = z->right; - z->right->parent = y; - } else - x_parent = y; - if (*root == z) - *root = y; - else if (z->parent->left == z) - z->parent->left = y; - else - z->parent->right = y; - y->parent = z->parent; - { int tmp=y->color; y->color=z->color; z->color=tmp; } - y = z; - } else { // どちらか空いていた場合 xをzの位置に持ってきてzを浮かせる - x_parent = y->parent; - if (x) x->parent = y->parent; - if (*root == z) - *root = x; - else if (z->parent->left == z) - z->parent->left = x; - else - z->parent->right = x; - } - // ここまで色の移動の除いて通常の2分木と同じ - if (y->color != RED) { // 赤が消える分には影響無し - while (x != *root && (x == NULL || x->color == BLACK)) - if (x == x_parent->left) { - struct dbn* w = x_parent->right; - if (w->color == RED) { - w->color = BLACK; - x_parent->color = RED; - 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)) { - w->color = RED; - x = x_parent; - x_parent = x_parent->parent; - } else { - if (w->right == NULL || - w->right->color == BLACK) { - if (w->left) w->left->color = BLACK; - w->color = RED; - db_rotate_right(w, root); - w = x_parent->right; - } - w->color = x_parent->color; - x_parent->color = BLACK; - if (w->right) w->right->color = BLACK; - db_rotate_left(x_parent, root); - break; - } - } else { // same as above, with right <-> left. - struct dbn* w = x_parent->left; - if (w->color == RED) { - w->color = BLACK; - x_parent->color = RED; - 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)) { - w->color = RED; - x = x_parent; - x_parent = x_parent->parent; - } else { - if (w->left == NULL || - w->left->color == BLACK) { - if (w->right) w->right->color = BLACK; - w->color = RED; - db_rotate_left(w, root); - w = x_parent->left; - } - w->color = x_parent->color; - x_parent->color = BLACK; - if (w->left) w->left->color = BLACK; - db_rotate_right(x_parent, root); - break; - } - } - if (x) x->color = BLACK; - } -} - -void db_free_lock(struct dbt *table) { - table->free_lock++; -} - -void db_free_unlock(struct dbt *table) { - if(--table->free_lock == 0) { - int i; - for(i = 0; i < table->free_count ; i++) { - db_rebalance_erase(table->free_list[i].z,table->free_list[i].root); - if(table->cmp == strdb_cmp) { - aFree(table->free_list[i].z->key); - } -#ifdef MALLOC_DBN - free_dbn(table->free_list[i].z); -#else - aFree(table->free_list[i].z); -#endif - table->item_count--; - } - table->free_count = 0; - } -} - -struct dbn* db_insert(struct dbt *table,void* key,void* 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;){ - c=table->cmp(table,key,p->key); - if(c==0){ // replace - if (table->release) - table->release(p, 3); - if(p->deleted) { - // 削除されたデータなので、free_list 上の削除予定を消す - int i; - for(i = 0; i < table->free_count ; i++) { - if(table->free_list[i].z == p) { - memmove( - &table->free_list[i], - &table->free_list[i+1], - sizeof(struct db_free)*(table->free_count - i - 1) - ); - break; - } - } - if(i == table->free_count || table->free_count <= 0) { - printf("db_insert: cannnot find deleted db node.\n"); - } else { - table->free_count--; - if(table->cmp == strdb_cmp) { - aFree(p->key); - } - } - } - p->data=data; - p->key=key; - p->deleted = 0; - return p; - } - priv=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; - p->deleted = 0; - p->prev = NULL; - p->next = NULL; - if (head == NULL) - head = tail = p; - else { - p->prev = tail; - tail->next = p; - tail = p; - } - - if(c==0){ // hash entry is empty - table->ht[hash] = p; - p->color = BLACK; - } else { - 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]); - } - } - table->item_count++; - - return p; -} - -void* db_erase(struct dbt *table,void* key) -{ - void *data; - struct dbn *p; - int c,hash; - - hash = table->hash(table,key) % HASH_SIZE; - for(c=0,p = table->ht[hash];p;){ - c=table->cmp(table,key,p->key); - if(c==0) - break; - if(c<0) - p=p->left; - else - p=p->right; - } - if(!p) - return NULL; - data=p->data; - if(table->free_lock) { - if(table->free_count == table->free_max) { - table->free_max += 32; - table->free_list = (struct db_free*)realloc(table->free_list,sizeof(struct db_free) * table->free_max); - } - table->free_list[table->free_count].z = p; - table->free_list[table->free_count].root = &table->ht[hash]; - table->free_count++; - p->deleted = 1; - p->data = NULL; - if(table->cmp == strdb_cmp) { - if(table->maxlen) { - char *key = (char*)malloc(table->maxlen); - memcpy(key,p->key,table->maxlen); - p->key = key; - } else { - p->key = strdup((const char*)p->key); - } - } - } else { - db_rebalance_erase(p,&table->ht[hash]); - if (p->prev) - p->prev->next = p->next; - else - head = p->next; - if (p->next) - p->next->prev = p->prev; - else - tail = p->prev; - - #ifdef MALLOC_DBN - free_dbn(p); - #else - aFree(p); - #endif - table->item_count--; - } - return data; -} - -void db_foreach(struct dbt *table,int (*func)(void*,void*,va_list),...) -{ - int i,sp; - int count = table->item_count; - // red-black treeなので64個stackがあれば2^32個ノードまで大丈夫 - struct dbn *p,*pn,*stack[64]; - va_list ap; - - va_start(ap,func); - db_free_lock(table); - for(i=0;i<HASH_SIZE;i++){ - if((p=table->ht[i])==NULL) - continue; - sp=0; - while(1){ - //reverted it back. sorry that brought thios bug from Freya [Lupus] - //if (!p->data) { - // printf("Warning: no data for key %d in db_foreach (db.c) !\n",(int)p->key); - //} else { - if(!p->deleted) - func(p->key, p->data, ap); - count--; - //} - 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]; - } - } - } - } - db_free_unlock(table); - if(count) { - printf( - "db_foreach : data lost %d item(s) allocated from %s line %d\n", - count,table->alloc_file,table->alloc_line - ); - } - va_end(ap); -} - -void db_final(struct dbt *table,int (*func)(void*,void*,va_list),...) -{ - int i,sp; - struct dbn *p,*pn,*stack[64]; - va_list ap; - - va_start(ap,func); - db_free_lock(table); - for(i=0;i<HASH_SIZE;i++){ - if((p=table->ht[i])==NULL) - continue; - sp=0; - while(1){ - if(func && !p->deleted) - func(p->key,p->data,ap); - if((pn=p->left)!=NULL){ - if(p->right){ - stack[sp++]=p->right; - } - } else { - if(p->right){ - pn=p->right; - } else { - if(sp==0) - break; - pn=stack[--sp]; - } - } - if (p->prev) - p->prev->next = p->next; - else - head = p->next; - if (p->next) - p->next->prev = p->prev; - else - tail = p->prev; -#ifdef MALLOC_DBN - free_dbn(p); -#else - aFree(p); -#endif - p=pn; - } - } - db_free_unlock(table); - aFree(table->free_list); - aFree(table); - va_end(ap); -} diff --git a/src/common/db.h b/src/common/db.h deleted file mode 100644 index 6980099cf..000000000 --- a/src/common/db.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef _DB_H_ -#define _DB_H_ - -#include <stdarg.h> - -#define HASH_SIZE (256+27) - -#define RED 0 -#define BLACK 1 - -struct dbn { - struct dbn *parent,*left,*right; - int color; - void *key; - void *data; - int deleted; // 削除済みフラグ(db_foreach) - struct dbn *next; - struct dbn *prev; -}; - -struct db_free { - struct dbn *z; - struct dbn **root; -}; - -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; - struct dbn *ht[HASH_SIZE]; - int item_count; // vf? - const char* alloc_file; // DB?t@C - int alloc_line; // DB?s - // db_foreach 内部でdb_erase される対策として、 - // db_foreach が終わるまでロックすることにする - struct db_free *free_list; - int free_count; - int free_max; - int free_lock; -}; - -#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 -#define strdb_init(a) strdb_init_(a,__FILE__,__LINE__) -#define numdb_init() numdb_init_(__FILE__,__LINE__) - -struct dbt* strdb_init_(int maxlen,const char *file,int line); -struct dbt* numdb_init_(const char *file,int line); - -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),...); -void exit_dbn(void); - -#endif diff --git a/src/common/dll.h b/src/common/dll.h deleted file mode 100644 index 1ad49143c..000000000 --- a/src/common/dll.h +++ /dev/null @@ -1,25 +0,0 @@ - -#ifndef _DLL_H_ -#define _DLL_H_ - -#ifdef _WIN32 - - #include <windows.h> - #define DLL_OPEN(x) LoadLibrary(x) - #define DLL_SYM(x,y,z) (FARPROC)(x) = GetProcAddress(y,z) - #define DLL_CLOSE(x) FreeLibrary(x) - #define DLL HINSTANCE - -#else - - #include <dlfcn.h> - #define DLL_OPEN(x) dlopen(x,RTLD_NOW) - #define DLL_SYM(x,y,z) (x) = (void *)dlsym(y,z) - #define DLL_CLOSE(x) dlclose(x) - #define DLL void * - -#endif - -#endif // _DLL_H_ - - diff --git a/src/common/grfio.c b/src/common/grfio.c deleted file mode 100644 index 1a3829bf7..000000000 --- a/src/common/grfio.c +++ /dev/null @@ -1,1070 +0,0 @@ -/********************************************************************* - * - * 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 - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <sys/stat.h> - -#include "grfio.h" -#include "../common/utils.h" -#include "../common/mmo.h" -#include "../common/showmsg.h" -#include "../common/malloc.h" - -#ifdef _WIN32 - #ifdef LOCALZLIB - #include "zlib.h" - #define zlib_inflateInit inflateInit - #define zlib_inflate inflate - #define zlib_inflateEnd inflateEnd - #define zlib_deflateInit deflateInit - #define zlib_deflate deflate - #define zlib_deflateEnd deflateEnd - #else - #include "../lib/zlib_win32.h" - #include "../common/dll.h" - DLL zlib_dll; - #define zlib_inflateInit(strm) zlib_inflateInit_((strm),ZLIB_VERSION, sizeof(z_stream)) - #define zlib_deflateInit(strm, level) zlib_deflateInit_((strm),(level),ZLIB_VERSION,sizeof(z_stream)) - - int (WINAPI* zlib_inflateInit_) (z_streamp strm, const char *version, int stream_size); - int (WINAPI* zlib_inflate) (z_streamp strm, int flush); - int (WINAPI* zlib_inflateEnd) (z_streamp strm); - - int (WINAPI* zlib_deflateInit_) (z_streamp strm, int level, const char *version, int stream_size); - int (WINAPI* zlib_deflate) (z_streamp strm, int flush); - int (WINAPI* zlib_deflateEnd) (z_streamp strm); - #endif -#else - #ifdef LOCALZLIB - #include "zlib/zlib.h" - #else - #include <zlib.h> - #endif - - #define zlib_inflateInit inflateInit - #define zlib_inflate inflate - #define zlib_inflateEnd inflateEnd - #define zlib_deflateInit deflateInit - #define zlib_deflate deflate - #define zlib_deflateEnd deflateEnd -#endif - -#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 -} 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 GENTRY_LIMIT 127 -#define FILELIST_LIMIT 65536 // temporary maximum, and a theory top maximum are 2G. - -static FILELIST *filelist; -static int filelist_entrys; -static int filelist_maxentry; - -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) -{ -// return *p+p[1]*256+(p[2]+p[3]*256)*65536; - return p[0] - | p[1] << 0x08 - | p[2] << 0x10 - | p[3] << 0x18; // Shinomori -} - -/*========================================== - * 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; - memset(tmp,0,8); - 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); - memcpy(Src,tmp,8); -} - -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); - Src[0] ^= tmp[4]; - Src[1] ^= tmp[5]; - Src[2] ^= tmp[6]; - Src[3] ^= tmp[7]; -} - -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 - *------------------------------------------ - */ -int decode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* source, unsigned long 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 = (Bytef*) 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 = zlib_inflateInit(&stream); - if (err != Z_OK) return err; - - err = zlib_inflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - zlib_inflateEnd(&stream); - return err == Z_OK ? Z_BUF_ERROR : err; - } - *destLen = stream.total_out; - - err = zlib_inflateEnd(&stream); - return err; -} - -int encode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* source, unsigned long 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 = (Bytef*) 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 = zlib_deflateInit(&stream,Z_DEFAULT_COMPRESSION); - if (err != Z_OK) return err; - - err = zlib_deflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - zlib_inflateEnd(&stream); - return err == Z_OK ? Z_BUF_ERROR : err; - } - *destLen = stream.total_out; - - err = zlib_deflateEnd(&stream); - return err; -} - -/*********************************************************** - *** File List Sobroutines *** - ***********************************************************/ - -/*========================================== - * File List : Hash make - *------------------------------------------ - */ -static int filehash(unsigned char *fname) -{ - unsigned int hash=0; - while(*fname) { - hash = ((hash<<1)+(hash>>7)*9+tolower(*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; -} - -/*========================================== - * File List : File find - *------------------------------------------ - */ -FILELIST *filelist_find(char *fname) -{ - int hash; - - for(hash=filelist_hash[filehash((unsigned char *) fname)];hash>=0;hash=filelist[hash].next) { - if(strcmpi(filelist[hash].fn,fname)==0) - break; - } - - return (hash>=0)? &filelist[hash] : NULL; -} - -/*========================================== - * File List : Filelist add - *------------------------------------------ - */ -#define FILELIST_ADDS 1024 // number increment of file lists ` - -static FILELIST* filelist_add(FILELIST *entry) -{ - int hash; - - if (filelist_entrys>=FILELIST_LIMIT) { - printf("filelist limit : filelist_add\n"); - exit(1); - } - - if (filelist_entrys>=filelist_maxentry) { - FILELIST *new_filelist = (FILELIST*)aRealloc( - (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); - } - } - - memcpy( &filelist[filelist_entrys], entry, sizeof(FILELIST) ); - - hash = filehash((unsigned char *) entry->fn); - filelist[filelist_entrys].next = filelist_hash[hash]; - filelist_hash[hash] = filelist_entrys; - - filelist_entrys++; - - return &filelist[filelist_entrys-1]; -} - -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) { - if (filelist_maxentry>filelist_entrys) { - FILELIST *new_filelist = (FILELIST*)aRealloc( - (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); - } - } - } -} - -/*********************************************************** - *** Grfio Sobroutines *** - ***********************************************************/ -/*========================================== - * Grfio : Resnametable replace - *------------------------------------------ - */ -char* grfio_resnametable(char* fname, char *lfname) -{ - FILE *fp; - char *p; - char w1[256],w2[256],restable[256],line[512]; - - sprintf(restable,"%sdata\\resnametable.txt",data_dir); - - for(p=&restable[0];*p!=0;p++) if (*p=='\\') *p = '/'; - - fp = fopen(restable,"rb"); - if(fp==NULL) { - printf("%s not found (grfio_resnametable)\n",restable); - return NULL; // 1:not found error - } - - while(fgets(line,508,fp)){ - if((sscanf(line,"%[^#]#%[^#]#",w1,w2)==2) && (sscanf(fname,"%*5s%s",lfname)==1) && (!strcmpi(w1,lfname))){ - sprintf(lfname,"data\\%s",w2); - fclose(fp); - return lfname; - } - } - 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,*p; - FILELIST lentry; - struct stat st; - - if(strcmp(data_dir, "") != 0 && (rname=grfio_resnametable(fname,lfname))!=NULL) { - //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 (grfio_size)\n", fname); - //exit(1); - return -1; - } - } - return entry->declen; -} - -/*========================================== - * Grfio : Resource file read & size get - *------------------------------------------ - */ -void* grfio_reads(char *fname, int *size) -{ - FILE *in = NULL; - unsigned char *buf=NULL,*buf2=NULL; - char *gfname; - FILELIST *entry; - - entry = filelist_find(fname); - - if (entry==NULL || entry->gentry<=0) { // LocalFileCheck - char lfname[256],*rname,*p; - FILELIST lentry; - - strncpy(lfname,fname,255); - // i hope this is the correct way =p [celest] - if ((rname=grfio_resnametable(fname,lfname))!=NULL) { - char tbuf[255]; - //sprintf(rname,"%s",grfio_resnametable(fname,lfname)); - sprintf(tbuf,"%s%s",data_dir,rname); - strcpy(lfname, tbuf); - //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 = (unsigned char *)aCallocA(lentry.declen+1024, 1); - if (buf2==NULL) { - printf("file read memory allocate error : declen\n"); - goto errret; - } - fread(buf2,1,lentry.declen,in); - 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 (grfio_reads)\n", fname); - //goto errret; - aFree(buf2); - return NULL; - } - } - } - if (entry!=NULL && entry->gentry>0) { // Archive[GRF] File Read - buf = (unsigned char *) aCallocA(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 (grfio_reads)\n",gfname); - //goto errret; - aFree(buf); - return NULL; - } - fseek(in,entry->srcpos,0); - fread(buf,1,entry->srclen_aligned,in); - fclose(in); - buf2 = (unsigned char *)aCallocA(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); - } - aFree(buf); - } - if (size!=NULL && entry!=NULL) - *size = entry->declen; - return buf2; -errret: - if (buf!=NULL) aFree(buf); - if (buf2!=NULL) aFree(buf2); - if (in!=NULL) fclose(in); - return NULL; -} - -/*========================================== - * Grfio : Resource file read - *------------------------------------------ - */ -void* grfio_read(char *fname) -{ - return grfio_reads(fname,NULL); -} - -/*========================================== - * Resource filename decode - *------------------------------------------ - */ -static 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 (char*)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; - char *fname; - unsigned char *grf_filelist; - - fp = fopen(gfname,"rb"); - if(fp==NULL) { - sprintf(tmp_output,"GRF Data File not found: '"CL_WHITE"%s"CL_RESET"'.\n",gfname); - ShowWarning(tmp_output); - return 1; // 1:not found error - } - - fseek(fp,0,2); // SEEK_END - grf_size = ftell(fp); - fseek(fp,0,0); // SEEK_SET - fread(grf_header,1,0x2e,fp); - if(strcmp((const char *) 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 = (unsigned char *) aCallocA(list_size, 1); - if(grf_filelist==NULL){ - fclose(fp); - printf("out of memory : grf_filelist\n"); - return 3; // 3:memory alloc error - } - fread(grf_filelist,1,list_size,fp); - 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); - aFree(grf_filelist); - exit(1); - } - srclen=0; - if((period_ptr=strrchr(fname,'.'))!=NULL){ - for(lop=0;lop<4;lop++) { - if(strcmpi(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; - } - aFree(grf_filelist); - - } else if (grf_version==0x02) { //****** Grf version 02xx ****** - unsigned char eheader[8]; - unsigned char *rBuf; - uLongf rSize,eSize; - - fread(eheader,1,8,fp); - 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 = (unsigned char *)aCallocA( 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 = (unsigned char *)aCallocA( eSize , 1); // Get a Extend Size - if (grf_filelist==NULL) { - aFree(rBuf); - fclose(fp); - printf("out of memory : grf extract entry table buffer\n"); - return 3; - } - fread(rBuf,1,rSize,fp); - fclose(fp); - decode_zip(grf_filelist,&eSize,rBuf,rSize); // Decode function - list_size = eSize; - aFree(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 = (char*)(grf_filelist+ofs); - if (strlen(fname)>sizeof(aentry.fn)-1) { - printf("grf : file name too long : %s\n",fname); - aFree(grf_filelist); - exit(1); - } - //ofs2 = ofs+strlen((char*)(grf_filelist+ofs))+1; - ofs2 = ofs+strlen(fname)+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; - } - aFree(grf_filelist); - - } 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; - char *buf,*ptr; - char w1[256],w2[256],src[256],dst[256]; - FILELIST *entry; - - buf = (char*)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++; - } - aFree(buf); - filelist_adjust(); // Unnecessary area release of filelist -} - -/*========================================== - * Grfio : Resource add - *------------------------------------------ - */ -#define GENTRY_ADDS 16 // The number increment of gentry_table entries - -int grfio_add(char *fname) -{ - int len,result; - char *buf; - - if (gentry_entrys>=GENTRY_LIMIT) { - printf("gentrys limit : grfio_add\n"); - exit(1); - } - -// sprintf(tmp_output,"Reading GRF File: '%s'.\n",fname); -// ShowStatus(tmp_output); - - if (gentry_entrys>=gentry_maxentry) { - char **new_gentry = (char**)aRealloc( - (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 = (char*)aCallocA(len+1, 1); - if (buf==NULL) { - printf("out of memory : gentry\n"); - exit(1); - } - strcpy( buf, fname ); - gentry_table[gentry_entrys++] = buf; - - result = grfio_entryread(fname,gentry_entrys-1); - - if (result==0) { - // Resource check - grfio_resourcecheck(); - } - - return result; -} - -/*========================================== - * Grfio : Finalize - *------------------------------------------ - */ -void grfio_final(void) -{ - int lop; - - if (filelist!=NULL) aFree(filelist); - filelist = NULL; - filelist_entrys = filelist_maxentry = 0; - - if (gentry_table!=NULL) { - for(lop=0;lop<gentry_entrys;lop++) { - if (gentry_table[lop]!=NULL) { - aFree(gentry_table[lop]); - } - } - aFree(gentry_table); - } - gentry_table = NULL; - gentry_entrys = gentry_maxentry = 0; - -#ifdef _WIN32 - #ifndef LOCALZLIB - DLL_CLOSE(zlib_dll); - zlib_inflateInit_ = NULL; - zlib_inflate = NULL; - zlib_inflateEnd = NULL; - #endif -#endif - -} - -/*========================================== - * Grfio : Initialize - *------------------------------------------ - */ -void grfio_init(char *fname) -{ - FILE *data_conf; - char line[1024], w1[1024], w2[1024]; - int result = 0, result2 = 0, result3 = 0, result4 = 0; - -#ifdef _WIN32 - #ifndef LOCALZLIB - if(!zlib_dll) { - zlib_dll = DLL_OPEN ("zlib.dll"); - DLL_SYM (zlib_inflateInit_, zlib_dll, "inflateInit_"); - DLL_SYM (zlib_inflate, zlib_dll, "inflate"); - DLL_SYM (zlib_inflateEnd, zlib_dll, "inflateEnd"); - DLL_SYM (zlib_deflateInit_, zlib_dll, "deflateInit_"); - DLL_SYM (zlib_deflate, zlib_dll, "deflate"); - DLL_SYM (zlib_deflateEnd, zlib_dll, "deflateEnd"); - if(zlib_dll == NULL) { - MessageBox(NULL,"Can't load zlib.dll","grfio.c",MB_OK); - exit(1); - } - } - #endif -#endif - - data_conf = fopen(fname, "r"); - - // 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); - sprintf(tmp_output,"Done reading '"CL_WHITE"%s"CL_RESET"'.\n",fname); - ShowStatus(tmp_output); - } // 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 (strcmp(data_dir, "") == 0) // Id data_dir doesn't exist - result4 = 1; // Data directory -/* - if (result != 0 && result2 != 0 && result3 != 0 && result4 != 0) { - printf("not grf file readed exit!!\n"); - exit(1); // It ends, if a resource cannot read one. - }*/ -} diff --git a/src/common/grfio.h b/src/common/grfio.h deleted file mode 100644 index 3fa257e2f..000000000 --- a/src/common/grfio.h +++ /dev/null @@ -1,19 +0,0 @@ -// $Id: grfio.h,v 1.1.1.1 2004/09/10 17:44:49 MagicalTux Exp $ -#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 - -int decode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen); -int encode_zip(unsigned char *dest, unsigned long* destLen, const unsigned char* source, unsigned long sourceLen); - -// 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_ diff --git a/src/common/lock.c b/src/common/lock.c deleted file mode 100644 index 0258cbd2c..000000000 --- a/src/common/lock.c +++ /dev/null @@ -1,55 +0,0 @@ - -#include <stdio.h> -#include <errno.h> -#include <string.h> -#ifndef WIN32 -#include <unistd.h> -#else -#include <windows.h> -#define F_OK 0x0 -#define R_OK 0x4 -#endif -#include "lock.h" -#include "showmsg.h" -#define exists(filename) (!access(filename, F_OK)) - -// 書き込みファイルの保護処理 -// (書き込みが終わるまで、旧ファイルを保管しておく) - -// 新しいファイルの書き込み開始 -FILE* lock_fopen (const char* filename, int *info) { - char newfile[512]; - FILE *fp; - int no = 0; - - // 安全なファイル名を得る(手抜き) - do { - sprintf(newfile, "%s_%04d.tmp", filename, ++no); - } while((fp = fopen(newfile,"r")) && (fclose(fp), no < 9999)); - *info = no; - return fopen(newfile,"w"); -} - -// 旧ファイルを削除&新ファイルをリネーム -int lock_fclose (FILE *fp, const char* filename, int *info) { - int ret = 1; - char newfile[512]; - char oldfile[512]; - if (fp != NULL) { - ret = fclose(fp); - sprintf(newfile, "%s_%04d.tmp", filename, *info); - sprintf(oldfile, "%s.bak", filename); // old backup file - - if (exists(oldfile)) remove(oldfile); // remove backup file if it already exists - rename (filename, oldfile); // backup our older data instead of deleting it - - // このタイミングで落ちると最悪。 - if ((ret = rename(newfile,filename)) != 0) { // rename our temporary file to its correct name - sprintf(tmp_output,"%s - '"CL_WHITE"%s"CL_RESET"'\n", strerror(errno), newfile); - ShowError(tmp_output); - } - } - - return ret; -} - diff --git a/src/common/lock.h b/src/common/lock.h deleted file mode 100644 index 795bf8860..000000000 --- a/src/common/lock.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _LOCK_H_ -#define _LOCK_H_ - -FILE* lock_fopen(const char* filename,int *info); -int lock_fclose(FILE *fp,const char* filename,int *info); - -#endif - diff --git a/src/common/malloc.c b/src/common/malloc.c deleted file mode 100644 index b81c25ed5..000000000 --- a/src/common/malloc.c +++ /dev/null @@ -1,548 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "malloc.h" - -#ifdef MEMWATCH -#include "memwatch.h" -#endif - -// 独自メモリマネージャを使用する場合、次のコメントを外してください。 -//#define USE_MEMMGR - -#if !defined(DMALLOC) && !defined(GCOLLECT) && !defined(BCHECK) && !defined(USE_MEMMGR) - -void* aMalloc_( size_t size, const char *file, int line, const char *func ) -{ - void *ret; - -// printf("%s:%d: in func %s: malloc %d\n",file,line,func,size); -#ifdef MEMWATCH - ret=mwMalloc(size,file,line); -#else - ret=malloc(size); -#endif - if(ret==NULL){ - printf("%s:%d: in func %s: malloc error out of memory!\n",file,line,func); - exit(1); - - } - return ret; -} -void* aCalloc_( size_t num, size_t size, const char *file, int line, const char *func ) -{ - void *ret; - -// printf("%s:%d: in func %s: calloc %d %d\n",file,line,func,num,size); -#ifdef MEMWATCH - ret=mwCalloc(num,size,file,line); -#else - ret=calloc(num,size); -#endif - if(ret==NULL){ - printf("%s:%d: in func %s: calloc error out of memory!\n",file,line,func); - exit(1); - - } - return ret; -} - -void* aRealloc_( void *p, size_t size, const char *file, int line, const char *func ) -{ - void *ret; - -// printf("%s:%d: in func %s: realloc %p %d\n",file,line,func,p,size); -#ifdef MEMWATCH - ret=mwRealloc(p,size,file,line); -#else - ret=realloc(p,size); -#endif - if(ret==NULL){ - printf("%s:%d: in func %s: realloc error out of memory!\n",file,line,func); - exit(1); - - } - return ret; -} - -char* aStrdup_( const void *p, const char *file, int line, const char *func ) -{ - char *ret; - - // printf("%s:%d: in func %s: strdup %p\n",file,line,func,p); -#ifdef MEMWATCH - ret=mwStrdup(p,file,line); -#else - ret= strdup((char *) p); -#endif - if(ret==NULL){ - printf("%s:%d: in func %s: strdup error out of memory!\n",file,line,func); - exit(1); - - } - return ret; -} - -void aFree_( void *p, const char *file, int line, const char *func ) -{ - // printf("%s:%d: in func %s: free %p\n",file,line,func,p); -#ifdef MEMWATCH - mwFree(p,file,line); -#else - free(p); -#endif -} - -#elif defined(GCOLLECT) - -void * _bcallocA(size_t size, size_t cnt) { - void *ret = aMallocA(size * cnt); - memset(ret, 0, size * cnt); - return ret; -} - -void * _bcalloc(size_t size, size_t cnt) { - void *ret = aMalloc(size * cnt); - memset(ret, 0, size * cnt); - return ret; -} - -char * _bstrdup(const char *chr) { - int len = strlen(chr); - char *ret = (char*)aMalloc(len + 1); - strcpy(ret, chr); - return ret; -} - -#elif defined(USE_MEMMGR) - -/* USE_MEMMGR */ - -/* - * メモリマネージャ - * malloc , free の処理を効率的に出来るようにしたもの。 - * 複雑な処理を行っているので、若干重くなるかもしれません。 - * - * データ構造など(説明下手ですいません^^; ) - * ・メモリを複数の「ブロック」に分けて、さらにブロックを複数の「ユニット」 - * に分けています。ユニットのサイズは、1ブロックの容量を複数個に均等配分 - * したものです。たとえば、1ユニット32KBの場合、ブロック1つは32Byteのユ - * ニットが、1024個集まって出来ていたり、64Byteのユニットが 512個集まって - * 出来ていたりします。(padding,unit_head を除く) - * - * ・ユニット同士はリンクリスト(block_prev,block_next) でつながり、同じサイ - * ズを持つユニット同士もリンクリスト(samesize_prev,samesize_nect) でつな - * がっています。それにより、不要となったメモリの再利用が効率的に行えます。 - */ - -/* ブロックに入るデータ量 */ -#define BLOCK_DATA_SIZE 80*1024 - -/* 一度に確保するブロックの数。 */ -#define BLOCK_ALLOC 32 - -/* ブロックのアライメント */ -#define BLOCK_ALIGNMENT 64 - -/* ブロック */ -struct block { - int block_no; /* ブロック番号 */ - struct block* block_prev; /* 前に確保した領域 */ - struct block* block_next; /* 次に確保した領域 */ - int samesize_no; /* 同じサイズの番号 */ - struct block* samesize_prev; /* 同じサイズの前の領域 */ - struct block* samesize_next; /* 同じサイズの次の領域 */ - int unit_size; /* ユニットのバイト数 0=未使用 */ - int unit_hash; /* ユニットのハッシュ */ - int unit_count; /* ユニットの数 */ - int unit_used; /* 使用済みユニット */ - char data[BLOCK_DATA_SIZE]; -}; - -struct unit_head { - struct block* block; - int size; - const char* file; - int line; -}; - -static struct block* block_first = NULL; -static struct block* block_last = NULL; -static struct block* block_unused = NULL; - -/* ユニットへのハッシュ。80KB/64Byte = 1280個 */ -static struct block* unit_first[BLOCK_DATA_SIZE/BLOCK_ALIGNMENT]; /* 最初 */ -static struct block* unit_unfill[BLOCK_DATA_SIZE/BLOCK_ALIGNMENT]; /* 埋まってない */ -static struct block* unit_last[BLOCK_DATA_SIZE/BLOCK_ALIGNMENT]; /* 最後 */ - -/* メモリを使い回せない領域用のデータ */ -struct unit_head_large { - struct unit_head_large* prev; - struct unit_head_large* next; - struct unit_head unit_head; -}; -static struct unit_head_large *unit_head_large_first = NULL; - -static struct block* block_malloc(void); -static void block_free(struct block* p); -static void memmgr_info(void); - -void* aMalloc_(size_t size, const char *file, int line, const char *func ) { - int i; - struct block *block; - int size_hash = (size+BLOCK_ALIGNMENT-1) / BLOCK_ALIGNMENT; - size = size_hash * BLOCK_ALIGNMENT; /* アライメントの倍数に切り上げ */ - - if(size == 0) { - return NULL; - } - - /* ブロック長を超える領域の確保には、malloc() を用いる */ - /* その際、unit_head.block に NULL を代入して区別する */ - if(size > BLOCK_DATA_SIZE - sizeof(struct unit_head)) { -#ifdef MEMWATCH - struct unit_head_large* p = (struct unit_head_large*)mwMalloc(sizeof(struct unit_head_large) + size,file,line); -#else - struct unit_head_large* p = (struct unit_head_large*)malloc(sizeof(struct unit_head_large) + size); -#endif - if(p != NULL) { - p->unit_head.block = NULL; - p->unit_head.size = size; - p->unit_head.file = file; - p->unit_head.line = line; - if(unit_head_large_first == NULL) { - unit_head_large_first = p; - p->next = NULL; - p->prev = NULL; - } else { - unit_head_large_first->prev = p; - p->prev = NULL; - p->next = unit_head_large_first; - unit_head_large_first = p; - } - return (char *)p + sizeof(struct unit_head_large); - } else { - printf("MEMMGR::memmgr_alloc failed.\n"); - exit(1); - } - } - - /* 同一サイズのブロックが確保されていない時、新たに確保する */ - if(unit_unfill[size_hash] == NULL) { - block = block_malloc(); - if(unit_first[size_hash] == NULL) { - /* 初回確保 */ - unit_first[size_hash] = block; - unit_last[size_hash] = block; - block->samesize_no = 0; - block->samesize_prev = NULL; - block->samesize_next = NULL; - } else { - /* 連結作業 */ - unit_last[size_hash]->samesize_next = block; - block->samesize_no = unit_last[size_hash]->samesize_no + 1; - block->samesize_prev = unit_last[size_hash]; - block->samesize_next = NULL; - unit_last[size_hash] = block; - } - unit_unfill[size_hash] = block; - block->unit_size = size + sizeof(struct unit_head); - block->unit_count = BLOCK_DATA_SIZE / block->unit_size; - block->unit_used = 0; - block->unit_hash = size_hash; - /* 未使用Flagを立てる */ - for(i=0;i<block->unit_count;i++) { - ((struct unit_head*)(&block->data[block->unit_size * i]))->block = NULL; - } - } - /* ユニット使用個数加算 */ - block = unit_unfill[size_hash]; - block->unit_used++; - - /* ユニット内を全て使い果たした */ - if(block->unit_count == block->unit_used) { - do { - unit_unfill[size_hash] = unit_unfill[size_hash]->samesize_next; - } while( - unit_unfill[size_hash] != NULL && - unit_unfill[size_hash]->unit_count == unit_unfill[size_hash]->unit_used - ); - } - - /* ブロックの中の空きユニット捜索 */ - for(i=0;i<block->unit_count;i++) { - struct unit_head *head = (struct unit_head*)(&block->data[block->unit_size * i]); - if(head->block == NULL) { - head->block = block; - head->size = size; - head->line = line; - head->file = file; - return (char *)head + sizeof(struct unit_head); - } - } - // ここに来てはいけない。 - printf("MEMMGR::memmgr_malloc() serious error.\n"); - memmgr_info(); - exit(1); - return NULL; -}; - -void* aCalloc_(size_t num, size_t size, const char *file, int line, const char *func ) { - void *p = aMalloc_(num * size,file,line,func); - memset(p,0,num * size); - return p; -} - -void* aRealloc_(void *memblock, size_t size, const char *file, int line, const char *func ) { - size_t old_size; - if(memblock == NULL) { - return aMalloc_(size,file,line,func); - } - - old_size = ((struct unit_head *)((char *)memblock - sizeof(struct unit_head)))->size; - if(old_size > size) { - // サイズ縮小 -> そのまま返す(手抜き) - return memblock; - } else { - // サイズ拡大 - void *p = aMalloc_(size,file,line,func); - if(p != NULL) { - memcpy(p,memblock,old_size); - } - aFree_(memblock,file,line,func); - return p; - } -} - -char* aStrdup_(const void *p, const char *file, int line, const char *func ) { - if(p == NULL) { - return NULL; - } else { - int len = strlen(p); - char *string = (char *)aMalloc_(len + 1,file,line,func); - memcpy(string,p,len+1); - return string; - } -} - -void aFree_(void *ptr, const char *file, int line, const char *func ) { - struct unit_head *head = (struct unit_head *)((char *)ptr - sizeof(struct unit_head)); - if(ptr == NULL) { - return; - } else if(head->block == NULL && head->size > BLOCK_DATA_SIZE - sizeof(struct unit_head)) { - /* malloc() で直に確保された領域 */ - struct unit_head_large *head_large = (struct unit_head_large *)((char *)ptr - sizeof(struct unit_head_large)); - if(head_large->prev) { - head_large->prev->next = head_large->next; - } else { - unit_head_large_first = head_large->next; - } - if(head_large->next) { - head_large->next->prev = head_large->prev; - } - free(head_large); - return; - } else { - /* ユニット解放 */ - struct block *block = head->block; - if(head->block == NULL) { - printf("memmgr: args of aFree is freed pointer %s line %d\n",file,line); - } else { - head->block = NULL; - if(--block->unit_used == 0) { - /* ブロックの解放 */ - if(unit_unfill[block->unit_hash] == block) { - /* 空きユニットに指定されている */ - do { - unit_unfill[block->unit_hash] = unit_unfill[block->unit_hash]->samesize_next; - } while( - unit_unfill[block->unit_hash] != NULL && - unit_unfill[block->unit_hash]->unit_count == unit_unfill[block->unit_hash]->unit_used - ); - } - if(block->samesize_prev == NULL && block->samesize_next == NULL) { - /* 独立ブロックの解放 */ - unit_first[block->unit_hash] = NULL; - unit_last[block->unit_hash] = NULL; - unit_unfill[block->unit_hash] = NULL; - } else if(block->samesize_prev == NULL) { - /* 先頭ブロックの解放 */ - unit_first[block->unit_hash] = block->samesize_next; - (block->samesize_next)->samesize_prev = NULL; - } else if(block->samesize_next == NULL) { - /* 末端ブロックの解放 */ - unit_last[block->unit_hash] = block->samesize_prev; - (block->samesize_prev)->samesize_next = NULL; - } else { - /* 中間ブロックの解放 */ - (block->samesize_next)->samesize_prev = block->samesize_prev; - (block->samesize_prev)->samesize_next = block->samesize_next; - } - block_free(block); - } else { - /* 空きユニットの再設定 */ - if( - unit_unfill[block->unit_hash] == NULL || - unit_unfill[block->unit_hash]->samesize_no > block->samesize_no - ) { - unit_unfill[block->unit_hash] = block; - } - } - } - } -} - -/* 現在の状況を表示する */ -static void memmgr_info(void) { - int i; - struct block *p; - printf("** Memory Maneger Information **\n"); - if(block_first == NULL) { - printf("Uninitialized.\n"); - return; - } - printf( - "Blocks: %04u , BlockSize: %06u Byte , Used: %08uKB\n", - block_last->block_no+1,sizeof(struct block), - (block_last->block_no+1) * sizeof(struct block) / 1024 - ); - p = block_first; - for(i=0;i<=block_last->block_no;i++) { - printf(" Block #%04u : ",p->block_no); - if(p->unit_size == 0) { - printf("unused.\n"); - } else { - printf( - "size: %05u byte. used: %04u/%04u prev:", - p->unit_size - sizeof(struct unit_head),p->unit_used,p->unit_count - ); - if(p->samesize_prev == NULL) { - printf("NULL"); - } else { - printf("%04u",(p->samesize_prev)->block_no); - } - printf(" next:"); - if(p->samesize_next == NULL) { - printf("NULL"); - } else { - printf("%04u",(p->samesize_next)->block_no); - } - printf("\n"); - } - p = p->block_next; - } -} - -/* ブロックを確保する */ -static struct block* block_malloc(void) { - if(block_unused != NULL) { - /* ブロック用の領域は確保済み */ - struct block* ret = block_unused; - do { - block_unused = block_unused->block_next; - } while(block_unused != NULL && block_unused->unit_size != 0); - return ret; - } else { - /* ブロック用の領域を新たに確保する */ - int i; - int block_no; - struct block* p = (struct block *)calloc(sizeof(struct block),BLOCK_ALLOC); - if(p == NULL) { - printf("MEMMGR::block_alloc failed.\n"); - exit(1); - } - if(block_first == NULL) { - /* 初回確保 */ - block_no = 0; - block_first = p; - } else { - block_no = block_last->block_no + 1; - block_last->block_next = p; - p->block_prev = block_last; - } - block_last = &p[BLOCK_ALLOC - 1]; - /* ブロックを連結させる */ - for(i=0;i<BLOCK_ALLOC;i++) { - if(i != 0) { - p[i].block_prev = &p[i-1]; - } - if(i != BLOCK_ALLOC -1) { - p[i].block_next = &p[i+1]; - } - p[i].block_no = block_no + i; - } - - /* 未使用ブロックへのポインタを更新 */ - block_unused = &p[1]; - p->unit_size = 1; - return p; - } -} - -static void block_free(struct block* p) { - /* free() せずに、未使用フラグを付けるだけ */ - p->unit_size = 0; - /* 未使用ポインターを更新する */ - if(block_unused == NULL) { - block_unused = p; - } else if(block_unused->block_no > p->block_no) { - block_unused = p; - } -} - -static char memmer_logfile[128]; - -static FILE* memmgr_log(void) { - FILE *fp = fopen(memmer_logfile,"w"); - if(!fp) { fp = stdout; } - fprintf(fp,"memmgr: memory leaks found\n"); - return fp; -} - -static void memmer_exit(void) { - FILE *fp = NULL; - int i; - int count = 0; - struct block *block = block_first; - struct unit_head_large *large = unit_head_large_first; - while(block) { - if(block->unit_size) { - if(!fp) { fp = memmgr_log(); } - for(i=0;i<block->unit_count;i++) { - struct unit_head *head = (struct unit_head*)(&block->data[block->unit_size * i]); - if(head->block != NULL) { - fprintf( - fp,"%04d : %s line %d size %d\n",++count, - head->file,head->line,head->size - ); - } - } - } - block = block->block_next; - } - while(large) { - if(!fp) { fp = memmgr_log(); } - fprintf( - fp,"%04d : %s line %d size %d\n",++count, - large->unit_head.file, - large->unit_head.line,large->unit_head.size - ); - large = large->next; - } - if(!fp) { - printf("memmgr: no memory leaks found.\n"); - } else { - printf("memmgr: memory leaks found.\n"); - fclose(fp); - } -} -#endif - -int do_init_memmgr(const char* file) { - #ifdef USE_MEMMGR - sprintf(memmer_logfile,"%s.log",file); - atexit(memmer_exit); - printf("memmgr: initialised: %s\n",memmer_logfile); - #endif - return 0; -} diff --git a/src/common/malloc.h b/src/common/malloc.h deleted file mode 100644 index c233adb8d..000000000 --- a/src/common/malloc.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef _MALLOC_H_ -#define _MALLOC_H_ - -#include <stdlib.h> - -#if defined(DMALLOC) - -# include "dmalloc.h" -# define aMalloc(size) \ - dmalloc_malloc(__FILE__, __LINE__, (size), DMALLOC_FUNC_MALLOC, 0, 0) -# define aMallocA(size) \ - dmalloc_malloc(__FILE__, __LINE__, (size), DMALLOC_FUNC_MALLOC, 0, 0) -# define aCallocA(count,size) \ - dmalloc_malloc(__FILE__, __LINE__, (count)*(size), DMALLOC_FUNC_CALLOC, 0, 0) -# define aCalloc(count,size) \ - dmalloc_malloc(__FILE__, __LINE__, (count)*(size), DMALLOC_FUNC_CALLOC, 0, 0) -# define aRealloc(ptr,size) \ - dmalloc_realloc(__FILE__, __LINE__, (ptr), (size), DMALLOC_FUNC_REALLOC, 0) -# define aFree(ptr) free(ptr) -# define aStrdup(ptr) strdup(ptr) - -#elif defined(GCOLLECT) - -# include "gc.h" -# define aMalloc(n) GC_MALLOC(n) -# define aMallocA(n) GC_MALLOC_ATOMIC(n) -# define aCallocA(m,n) _bcallocA(m,n) -# define aCalloc(m,n) _bcalloc(m,n) -# define aRealloc(p,n) GC_REALLOC(p,n) -# define aFree(n) GC_FREE(n) -# define aStrdup(n) _bstrdup(n) - - extern void * _bcalloc(size_t, size_t); - extern void * _bcallocA(size_t, size_t); - extern char * _bstrdup(const char *); - -#elif defined(BCHECK) - -# define aMalloc(n) malloc(n) -# define aMallocA(n) malloc(n) -# define aCalloc(m,n) calloc(m,n) -# define aCallocA(m,n) calloc(m,n) -# define aRealloc(p,n) realloc(p,n) -# define aFree(n) free(n) -# define aStrdup(n) strdup(n) - -#else - -#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 size, const char *file, int line, const char *func ); - void* aCalloc_( size_t num, size_t size, const char *file, int line, const char *func ); - void* aRealloc_( void *p, size_t size, const char *file, int line, const char *func ); - void aFree_( void *p, const char *file, int line, const char *func ); - char* aStrdup_( const void *p, const char *file, int line, const char *func ); - -# 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) do { aFree_(p,ALC_MARK); if(p != NULL) { p = NULL; } } while(0) - -#endif - -int do_init_memmgr(const char* file); - -#endif diff --git a/src/common/mmo.h b/src/common/mmo.h deleted file mode 100644 index 1602c5655..000000000 --- a/src/common/mmo.h +++ /dev/null @@ -1,353 +0,0 @@ -// $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 - -#ifndef _MMO_H_ -#define _MMO_H_ - -#include <time.h> -#include "utils.h" // _WIN32 - -#if ! defined(Assert) -#if defined(RELEASE) -#define Assert(EX) -#else -// extern "C" { -#include <assert.h> -// } -#if defined(_WIN32) -#include <crtdbg.h> -#endif -#define Assert(EX) assert(EX) -#endif -#endif /* ! defined(Assert) */ - -#ifdef CYGWIN -// txtやlogなどの書き出すファイルの改行コード -#define RETCODE "\r\n" // (CR/LF:Windows系) -#else -#define RETCODE "\n" // (LF:Unix系) -#endif - -#define RET RETCODE - -#define FIFOSIZE_SERVERLINK 128*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 650 -#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 16+10*6 // increased max guild members to accomodate for +6 increase for extension levels [Lupus] -#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 15 // increased max guild skills because of new skills [Sara-chan] -#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_PORTAL_MEMO 0 -#define MAX_PORTAL_MEMO 2 - -#define MAX_STATUS_TYPE 5 - -#define WEDDING_RING_M 2634 -#define WEDDING_RING_F 2635 - -#define CHAR_CONF_NAME "conf/char_athena.conf" - -struct item { - int id; - short nameid; - short amount; - unsigned short equip; - char identify; - char refine; - char attribute; - short card[4]; -}; - -struct point{ - char map[24]; - short x,y; -}; - -struct skill { - unsigned short id,lv,flag; -}; - -struct global_reg { - char str[32]; - int value; -}; - -struct s_pet { - int account_id; - int char_id; - int pet_id; - short class_; - short level; - short egg_id;//pet egg id - short equip;//pet equip name_id - short intimate;//pet friendly - short hungry;//pet hungry - char name[24]; - char rename_flag; - char incuvate; -}; - -struct mmo_charstatus { - int char_id; - int account_id; - int partner_id; - int father; - int mother; - int child; - - int base_exp,job_exp,zeny; - - short class_; - short status_point,skill_point; - int hp,max_hp,sp,max_sp; - short option,karma,manner; - short hair,hair_color,clothes_color; - int party_id,guild_id,pet_id; - - short weapon,shield; - short head_top,head_mid,head_bottom; - - char name[24]; - unsigned int base_level,job_level; - short str,agi,vit,int_,dex,luk; - unsigned char char_num,sex; - - unsigned long mapip; - unsigned int mapport; - - struct point last_point,save_point,memo_point[10]; - struct item inventory[MAX_INVENTORY],cart[MAX_CART]; - struct skill skill[MAX_SKILL]; - int global_reg_num; - struct global_reg global_reg[GLOBAL_REG_NUM]; - int account_reg_num; - struct global_reg account_reg[ACCOUNT_REG_NUM]; - int account_reg2_num; - struct global_reg account_reg2[ACCOUNT_REG2_NUM]; - - // Friends list vars - int friend_id[20]; - char friend_name[20][24]; -}; - -struct storage { - int dirty; - int account_id; - short storage_status; - short storage_amount; - struct item storage_[MAX_STORAGE]; -}; - -struct guild_storage { - int guild_id; - short storage_status; - short storage_amount; - struct item storage_[MAX_GUILD_STORAGE]; -}; - -struct map_session_data; - -struct gm_account { - int account_id; - int level; -}; - -struct party_member { - int account_id; - char name[24],map[24]; - int leader,online,lv; - struct map_session_data *sd; -}; - -struct party { - int party_id; - char name[24]; - int exp; - int item, itemc; - struct party_member member[MAX_PARTY]; -}; - -struct guild_member { - int account_id, char_id; - short hair,hair_color,gender,class_,lv; - int exp,exp_payper; - short online,position; - int rsv1,rsv2; - char name[24]; - struct map_session_data *sd; -}; - -struct guild_position { - char name[24]; - int mode; - int exp_mode; -}; - -struct guild_alliance { - int opposition; - int guild_id; - char name[24]; -}; - -struct guild_explusion { - char name[24]; - char mes[40]; - char acc[40]; - int account_id; - int rsv1,rsv2,rsv3; -}; - -struct guild_skill { - int id,lv; -}; - -struct guild { - int guild_id; - short guild_lv, connect_member, max_member, average_lv; - int exp,next_exp,skill_point,castle_id; - char name[24],master[24]; - struct guild_member member[MAX_GUILD]; - struct guild_position position[MAX_GUILDPOSITION]; - char mes1[60],mes2[120]; - int emblem_len,emblem_id; - char emblem_data[2048]; - struct guild_alliance alliance[MAX_GUILDALLIANCE]; - struct guild_explusion explusion[MAX_GUILDEXPLUSION]; - struct guild_skill skill[MAX_GUILDSKILL]; -}; - -struct guild_castle { - int castle_id; - char map_name[24]; - char castle_name[24]; - char castle_event[24]; - int guild_id; - int economy; - int defense; - int triggerE; - int triggerD; - int nextTime; - int payTime; - int createTime; - int visibleC; - int visibleG0; - int visibleG1; - int visibleG2; - int visibleG3; - int visibleG4; - int visibleG5; - int visibleG6; - int visibleG7; - int Ghp0; // added Guardian HP [Valaris] - int Ghp1; - int Ghp2; - int Ghp3; - int Ghp4; - int Ghp5; - int Ghp6; - int Ghp7; - int GID0; - int GID1; - int GID2; - int GID3; - int GID4; - int GID5; - int GID6; - int GID7; // end addition [Valaris] -}; -struct square { - int val1[5]; - int val2[5]; -}; - -enum { - GBI_EXP =1, // ギルドのEXP - GBI_GUILDLV =2, // ギルドのLv - GBI_SKILLPOINT =3, // ギルドのスキルポイント - GBI_SKILLLV =4, // ギルドスキルLv - - GMI_POSITION =0, // メンバーの役職変更 - GMI_EXP =1, // メンバーのEXP - -}; - -enum { - GD_SKILLBASE=10000, - GD_APPROVAL=10000, - GD_KAFRACONTACT=10001, - GD_GUARDIANRESEARCH=10002, - GD_CHARISMA=10003, - GD_GUARDUP=10003, - GD_EXTENSION=10004, - GD_GLORYGUILD=10005, - GD_LEADERSHIP=10006, - GD_GLORYWOUNDS=10007, - GD_SOULCOLD=10008, - GD_HAWKEYES=10009, - GD_BATTLEORDER=10010, - GD_REGENERATION=10011, - GD_RESTORE=10012, - GD_EMERGENCYCALL=10013, - GD_DEVELOPMENT=10014, -}; - -#ifndef __WIN32 - #ifndef strcmpi - #define strcmpi strcasecmp - #endif - #ifndef stricmp - #define stricmp strcasecmp - #endif - #ifndef strncmpi - #define strncmpi strncasecmp - #endif - #ifndef strnicmp - #define strnicmp strncasecmp - #endif -#else - #define snprintf _snprintf - #define vsnprintf _vsnprintf - #ifndef strncmpi - #define strncmpi strnicmp - #endif -#endif - -#endif // _MMO_H_ diff --git a/src/common/nullpo.c b/src/common/nullpo.c deleted file mode 100644 index 5fbf5fc1d..000000000 --- a/src/common/nullpo.c +++ /dev/null @@ -1,90 +0,0 @@ -#include <stdio.h> -#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, ...) -{ - va_list ap; - - if (target != NULL) - return 0; - - va_start(ap, fmt); - nullpo_info_core(file, line, func, fmt, ap); - va_end(ap); - return 1; -} - -int nullpo_chk(const char *file, int line, const char *func, const void *target) -{ - if (target != NULL) - return 0; - - nullpo_info_core(file, line, func, NULL, NULL); - return 1; -} - - -/*====================================== - * nullpo情報出力(外部呼出し向けラッパ) - *-------------------------------------- - */ -void nullpo_info_f(const char *file, int line, const char *func, - const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - 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) - *-------------------------------------- - */ -static void nullpo_info_core(const char *file, int line, const char *func, - const char *fmt, va_list ap) -{ - if (file == NULL) - file = "??"; - - 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) - { - if (fmt[0] != '\0') - { - vprintf(fmt, ap); - - // 最後に改行したか確認 - if (fmt[strlen(fmt)-1] != '\n') - printf("\n"); - } - } - printf("--- end nullpo info ----------------------------------------\n"); - - // ここらでnullpoログをファイルに書き出せたら - // まとめて提出できるなと思っていたり。 -} diff --git a/src/common/nullpo.h b/src/common/nullpo.h deleted file mode 100644 index 0b9a9f7a5..000000000 --- a/src/common/nullpo.h +++ /dev/null @@ -1,233 +0,0 @@ -#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 _WIN32 -#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);} - -#define nullpo_retb(t) \ - if (nullpo_chk(NLP_MARK, (void *)(t))) {break;} - -// 可変引数マクロに関する条件コンパイル -#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);} - -#define nullpo_retb_f(t, fmt, ...) \ - if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), __VA_ARGS__)) {break;} - -#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);} - -#define nullpo_retb_f(t, fmt, args...) \ - if (nullpo_chk_f(NLP_MARK, (void *)(t), (fmt), ## args)) {break;} - -#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)){;} -#define nullpo_retb(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)){;} -#define nullpo_retb_f(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)){;} -#define nullpo_retb_f(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, 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, const void *target, - const char *fmt, ...) - __attribute__((format(printf,5,6))); - - -/*====================================== - * nullpo_info - * nullpo情報出力 - * [引数] - * file __FILE__ - * line __LINE__ - * func __func__ (関数名) - * これらには NLP_MARK を使うとよい - *-------------------------------------- - */ -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に渡される - * 備考や関係変数の書き出しなどに - *-------------------------------------- - */ -void nullpo_info_f(const char *file, int line, const char *func, - const char *fmt, ...) - __attribute__((format(printf,4,5))); - - -#endif diff --git a/src/common/showmsg.c b/src/common/showmsg.c deleted file mode 100644 index 24d51d2dc..000000000 --- a/src/common/showmsg.c +++ /dev/null @@ -1,140 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <stdarg.h> -#include "showmsg.h" - -char tmp_output[1024] = {"\0"}; - -// by MC Cameri -int _vShowMessage(enum msg_type flag, const char *string, va_list ap) -{ - // _ShowMessage MUST be used instead of printf as of 10/24/2004. - // Return: 0 = Successful, 1 = Failed. -// int ret = 0; - char prefix[40]; - - if (!string || strlen(string) <= 0) { - printf("Empty string passed to _ShowMessage().\n"); - return 1; - } - switch (flag) { - case MSG_NONE: // direct printf replacement - break; - case MSG_STATUS: //Bright Green (To inform about good things) - strcpy(prefix,CL_GREEN"[Status]"CL_RESET":"); - break; - case MSG_SQL: //Bright Violet (For dumping out anything related with SQL) - strcpy(prefix,CL_MAGENTA"[SQL]"CL_RESET":"); - break; - case MSG_INFORMATION: //Bright White (Variable information) - strcpy(prefix,CL_WHITE"[Info]"CL_RESET":"); - break; - case MSG_NOTICE: //Bright White (Less than a warning) - strcpy(prefix,CL_WHITE"[Notice]"CL_RESET":"); - break; - case MSG_WARNING: //Bright Yellow - strcpy(prefix,CL_YELLOW"[Warning]"CL_RESET":"); - break; - case MSG_DEBUG: //Bright Cyan, important stuff! - strcpy(prefix,CL_CYAN"[Debug]"CL_RESET":"); - break; - case MSG_ERROR: //Bright Red (Regular errors) - strcpy(prefix,CL_RED"[Error]"CL_RESET":"); - break; - case MSG_FATALERROR: //Bright Red (Fatal errors, abort(); if possible) - strcpy(prefix,CL_RED"[Fatal Error]"CL_RESET":"); - break; - default: - printf("In function _ShowMessage() -> Invalid flag passed.\n"); - return 1; - } - - if (!(flag == MSG_DEBUG && !SHOW_DEBUG_MSG)) { - if (flag != MSG_NONE) - printf ("%s ", prefix); - vprintf (string, ap); - fflush (stdout); - } - - va_end(ap); -/* - if ((core_config.debug_output_level > -1) && (flag >= core_config.debug_output_level)) { - FILE *fp; - fp=fopen(OUTPUT_MESSAGES_LOG,"a"); - if (fp == NULL) { - printf(CL_RED"[Error]"CL_RESET": Could not open '"CL_WHITE"%s"CL_RESET"', file not found.\n",OUTPUT_MESSAGES_LOG); - fflush(stdout); - return; - } - StripColor(output); - strcpy(output,"\r"); - fwrite(output,strlen(output),1,fp); - fclose(fp); - } -*/ - return 0; -} - -int _ShowMessage(enum msg_type flag, const char *string, ...) -{ - va_list ap; - - va_start(ap, string); - return _vShowMessage(flag, string, ap); -} - -// direct printf replacement -int ShowMessage(const char *string, ...) { - va_list ap; - - va_start(ap, string); - return _vShowMessage(MSG_NONE, string, ap); -} -int ShowStatus(const char *string, ...) { - va_list ap; - - va_start(ap, string); - return _vShowMessage(MSG_STATUS, string, ap); -} -int ShowSQL(const char *string, ...) { - va_list ap; - - va_start(ap, string); - return _vShowMessage(MSG_SQL, string, ap); -} -int ShowInfo(const char *string, ...) { - va_list ap; - - va_start(ap, string); - return _vShowMessage(MSG_INFORMATION, string, ap); -} -int ShowNotice(const char *string, ...) { - va_list ap; - - va_start(ap, string); - return _vShowMessage(MSG_NOTICE, string, ap); -} -int ShowWarning(const char *string, ...) { - va_list ap; - - va_start(ap, string); - return _vShowMessage(MSG_WARNING, string, ap); -} -int ShowDebug(const char *string, ...) { - va_list ap; - - va_start(ap, string); - return _vShowMessage(MSG_DEBUG, string, ap); -} -int ShowError(const char *string, ...) { - va_list ap; - - va_start(ap, string); - return _vShowMessage(MSG_ERROR, string, ap); -} -int ShowFatalError(const char *string, ...) { - va_list ap; - - va_start(ap, string); - return _vShowMessage(MSG_FATALERROR, string, ap); -} diff --git a/src/common/showmsg.h b/src/common/showmsg.h deleted file mode 100644 index b5f4d4bfd..000000000 --- a/src/common/showmsg.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef _SHOWMSG_H_ -#define _SHOWMSG_H_ - -//davidsiaw, 'lookee' here! -#define SHOW_DEBUG_MSG 1 - -#ifdef _WIN32 -#define CL_RESET "" -#define CL_NORMAL CL_RESET -#define CL_NONE CL_RESET -#define CL_WHITE "" -#define CL_GRAY "" -#define CL_RED "" -#define CL_GREEN "" -#define CL_YELLOW "" -#define CL_BLUE "" -#define CL_MAGENTA "" -#define CL_CYAN "" -#else -#define CL_RESET "\033[0;0m" -#define CL_NORMAL CL_RESET -#define CL_NONE CL_RESET -#define CL_WHITE "\033[1;29m" -#define CL_GRAY "\033[1;30m" -#define CL_RED "\033[1;31m" -#define CL_GREEN "\033[1;32m" -#define CL_YELLOW "\033[1;33m" -#define CL_BLUE "\033[1;34m" -#define CL_MAGENTA "\033[1;35m" -#define CL_CYAN "\033[1;36m" -#endif - -extern char tmp_output[1024]; - -enum msg_type { - MSG_NONE, - MSG_STATUS, - MSG_SQL, - MSG_INFORMATION, - MSG_NOTICE, - MSG_WARNING, - MSG_DEBUG, - MSG_ERROR, - MSG_FATALERROR -}; - -extern int ShowMessage(const char *, ...); -extern int ShowStatus(const char *, ...); -extern int ShowSQL(const char *, ...); -extern int ShowInfo(const char *, ...); -extern int ShowNotice(const char *, ...); -extern int ShowWarning(const char *, ...); -extern int ShowDebug(const char *, ...); -extern int ShowError(const char *, ...); -extern int ShowFatalError(const char *, ...); - -#endif diff --git a/src/common/socket.c b/src/common/socket.c deleted file mode 100644 index 64f660a11..000000000 --- a/src/common/socket.c +++ /dev/null @@ -1,1069 +0,0 @@ -// original : core.c 2003/02/26 18:03:12 Rev 1.7 - -#include <stdio.h> -#include <stdlib.h> -#include <sys/types.h> -#include <errno.h> - -#ifdef _WIN32 -#define WIN32_LEAN_AND_MEAN -#include <windows.h> -#include <winsock2.h> -#include <io.h> -typedef int socklen_t; -#else -#include <sys/socket.h> -#include <netinet/in.h> -#include <netinet/tcp.h> -#include <net/if.h> -#include <sys/time.h> -#include <unistd.h> -#include <sys/ioctl.h> - -#ifndef SIOCGIFCONF -#include <sys/sockio.h> // SIOCGIFCONF on Solaris, maybe others? [Shinomori] -#endif - -#endif - -#include <fcntl.h> -#include <string.h> - -#include "socket.h" -#include "../common/dll.h" -#include "../common/mmo.h" // [Valaris] thanks to fov -#include "../common/timer.h" -#include "../common/utils.h" - -#ifdef MEMWATCH -#include "memwatch.h" -#endif - -fd_set readfds; -int fd_max; -time_t tick_; -time_t stall_time_ = 60; -int ip_rules = 1; - -// #define UPNP - -#ifdef UPNP -#if defined(CYGWIN) || defined(_WIN32) -DLL upnp_dll; -int (*upnp_init)(); -int (*upnp_final)(); -int (*firewall_addport)(char *desc, int port); -int (*upnp_addport)(char *desc, char *ip, int port); -extern char *argp; - -int release_mappings = 1; -int close_ports = 1; -#else -#error This doesnt work with non-Windows yet -#endif -#endif - -int rfifo_size = 65536; -int wfifo_size = 65536; - -#ifndef TCP_FRAME_LEN -#define TCP_FRAME_LEN 1053 -#endif - -#define CONVIP(ip) ip&0xFF,(ip>>8)&0xFF,(ip>>16)&0xFF,ip>>24 - -struct socket_data *session[FD_SETSIZE]; - -static int null_parse(int fd); -static int (*default_func_parse)(int) = null_parse; - -static int null_console_parse(char *buf); -static int (*default_console_parse)(char*) = null_console_parse; -static int connect_check(unsigned int ip); - -/*====================================== - * CORE : Set function - *-------------------------------------- - */ -void set_defaultparse(int (*defaultparse)(int)) -{ - default_func_parse = defaultparse; -} - -void set_nonblocking(int fd, int yes) { - setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof yes); -} - -static void setsocketopts(int fd) -{ - int yes = 1; // reuse fix - - setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof yes); -#ifdef SO_REUSEPORT - setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&yes,sizeof yes); -#endif - set_nonblocking(fd, yes); - - setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *) &wfifo_size , sizeof(rfifo_size )); - setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *) &rfifo_size , sizeof(rfifo_size )); -} - -/*====================================== - * CORE : Socket Sub Function - *-------------------------------------- - */ - -static int 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 _WIN32 - 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 - -// printf (":::RECEIVE:::\n"); -// dump(session[fd]->rdata, len); printf ("\n"); - - //{ 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; - session[fd]->rdata_tick = tick_; - } else if(len<=0){ - // value of connection is not necessary the same -// printf("set eof : connection #%d\n", fd); - session[fd]->eof=1; - } - return 0; -} - -static int send_from_fifo(int fd) -{ - int len; - - //printf("send_from_fifo : %d\n",fd); - if(session[fd]->eof || session[fd]->wdata == 0) - return -1; - if (session[fd]->wdata_size == 0) - return 0; - -#ifdef _WIN32 - len=send(fd, session[fd]->wdata,session[fd]->wdata_size, 0); -#else - len=write(fd,session[fd]->wdata,session[fd]->wdata_size); -#endif - -// printf (":::SEND:::\n"); -// dump(session[fd]->wdata, len); printf ("\n"); - - //{ 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){ - memmove(session[fd]->wdata,session[fd]->wdata+len,session[fd]->wdata_size-len); - session[fd]->wdata_size-=len; - } else { - session[fd]->wdata_size=0; - } - } else if (errno != EAGAIN) { -// printf("set eof :%d\n",fd); - session[fd]->eof=1; - } - return 0; -} - -void flush_fifos() -{ - int i; - for(i=0;i<fd_max;i++) - if(session[i] != NULL && - session[i]->func_send == send_from_fifo) - send_from_fifo(i); -} - -static int 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) -{ - int fd; - struct sockaddr_in client_address; - int len; -#ifndef _WIN32 - int result; -#endif - - //printf("connect_client : %d\n",listen_fd); - - len=sizeof(client_address); - - fd = accept(listen_fd,(struct sockaddr*)&client_address,(socklen_t*)&len); - if(fd_max<=fd) fd_max=fd+1; - - setsocketopts(fd); - - if(fd==-1) { - perror("accept"); - return -1; - } else if (ip_rules && !connect_check(*(unsigned int*)(&client_address.sin_addr))) { - close(fd); - return -1; - } else - FD_SET(fd,&readfds); - -#ifdef _WIN32 - { - unsigned long val = 1; - ioctlsocket(fd, FIONBIO, &val); - } -#else - result = fcntl(fd, F_SETFL, O_NONBLOCK); -#endif - - CREATE(session[fd], struct socket_data, 1); - CREATE_A(session[fd]->rdata, unsigned char, rfifo_size); - CREATE_A(session[fd]->wdata, unsigned char, wfifo_size); - - session[fd]->max_rdata = rfifo_size; - session[fd]->max_wdata = wfifo_size; - session[fd]->func_recv = recv_to_fifo; - session[fd]->func_send = send_from_fifo; - session[fd]->func_parse = default_func_parse; - session[fd]->client_addr = client_address; - session[fd]->rdata_tick = tick_; - - //printf("new_session : %d %d\n",fd,session[fd]->eof); - return fd; -} - -int make_listen_port(int port) -{ - struct sockaddr_in server_address; - int fd; - int result; - - fd = socket( AF_INET, SOCK_STREAM, 0 ); - if(fd_max<=fd) fd_max=fd+1; - -#ifdef _WIN32 - { - unsigned long val = 1; - ioctlsocket(fd, FIONBIO, &val); - } -#else - result = fcntl(fd, F_SETFL, O_NONBLOCK); -#endif - - setsocketopts(fd); - - server_address.sin_family = AF_INET; - server_address.sin_addr.s_addr = htonl( INADDR_ANY ); - server_address.sin_port = htons((unsigned short)port); - - result = bind(fd, (struct sockaddr*)&server_address, sizeof(server_address)); - if( result == -1 ) { - perror("bind"); - exit(1); - } - result = listen( fd, 5 ); - if( result == -1 ) { /* error */ - perror("listen"); - exit(1); - } - - FD_SET(fd, &readfds ); - - 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; - - return fd; -} - -int make_listen_bind(long ip,int port) -{ - struct sockaddr_in server_address; - int fd; - int result; - - fd = socket( AF_INET, SOCK_STREAM, 0 ); - if(fd_max<=fd) fd_max=fd+1; - -#ifdef _WIN32 - { - unsigned long val = 1; - ioctlsocket(fd, FIONBIO, &val); - } -#else - result = fcntl(fd, F_SETFL, O_NONBLOCK); -#endif - - setsocketopts(fd); - - server_address.sin_family = AF_INET; - server_address.sin_addr.s_addr = ip; - server_address.sin_port = htons((unsigned short)port); - -#ifdef UPNP - if (upnp_dll) { - int localaddr = ntohl(addr_[0]); - unsigned char *natip = (unsigned char *)&localaddr; - char buf[16]; - sprintf(buf, "%d.%d.%d.%d", natip[0], natip[1], natip[2], natip[3]); - //printf("natip=%d.%d.%d.%d\n", natip[0], natip[1], natip[2], natip[3]); - if (firewall_addport(argp, port)) - printf ("Firewall port %d successfully opened\n", port); - if (natip[0] == 192 && natip[1] == 168) { - if (upnp_addport(argp, natip, port)) - printf ("Upnp mappings successfull\n"); - else printf ("Upnp mapping failed\n"); - } - } -#endif - - result = bind(fd, (struct sockaddr*)&server_address, sizeof(server_address)); - if( result == -1 ) { - perror("bind"); - exit(1); - } - result = listen( fd, 5 ); - if( result == -1 ) { /* error */ - perror("listen"); - exit(1); - } - - FD_SET(fd, &readfds ); - - CREATE(session[fd], struct socket_data, 1); - - if(session[fd]==NULL){ - printf("out of memory : make_listen_bind\n"); - exit(1); - } - memset(session[fd],0,sizeof(*session[fd])); - session[fd]->func_recv = connect_client; - - return fd; -} - -// Console Reciever [Wizputer] -int console_recieve(int i) { - int n; - char *buf; - - CREATE_A(buf, char , 64); - - memset(buf,0,sizeof(64)); - - n = read(0, buf , 64); - - if ( n < 0 ) - printf("Console input read error\n"); - else - session[0]->func_console(buf); - return 0; -} - -void set_defaultconsoleparse(int (*defaultparse)(char*)) -{ - default_console_parse = defaultparse; -} - -static int null_console_parse(char *buf) -{ - printf("null_console_parse : %s\n",buf); - return 0; -} - -// Console Input [Wizputer] -int start_console(void) { - FD_SET(0,&readfds); - - CREATE(session[0], struct socket_data, 1); - if(session[0]==NULL){ - printf("out of memory : start_console\n"); - exit(1); - } - - memset(session[0],0,sizeof(*session[0])); - - session[0]->func_recv = console_recieve; - session[0]->func_console = default_console_parse; - - return 0; -} - -int make_connection(long ip,int port) -{ - struct sockaddr_in server_address; - int fd; - int result; - - fd = socket( AF_INET, SOCK_STREAM, 0 ); - if(fd_max<=fd) - fd_max=fd+1; - - setsocketopts(fd); - - server_address.sin_family = AF_INET; - server_address.sin_addr.s_addr = ip; - server_address.sin_port = htons((unsigned short)port); - -#ifdef _WIN32 - { - unsigned long val = 1; - ioctlsocket(fd, FIONBIO, &val); - } -#else - result = fcntl(fd, F_SETFL, O_NONBLOCK); -#endif - - result = connect(fd, (struct sockaddr *)(&server_address),sizeof(struct sockaddr_in)); - - FD_SET(fd,&readfds); - - CREATE(session[fd], struct socket_data, 1); - CREATE_A(session[fd]->rdata, unsigned char, rfifo_size); - CREATE_A(session[fd]->wdata, unsigned char, wfifo_size); - - session[fd]->max_rdata = rfifo_size; - session[fd]->max_wdata = wfifo_size; - session[fd]->func_recv = recv_to_fifo; - session[fd]->func_send = send_from_fifo; - session[fd]->func_parse = default_func_parse; - session[fd]->rdata_tick = tick_; - - return fd; -} - -int delete_session(int fd) -{ - if(fd<=0 || fd>=FD_SETSIZE) - return -1; - FD_CLR(fd,&readfds); - if(session[fd]){ - if(session[fd]->rdata) - aFree(session[fd]->rdata); - if(session[fd]->wdata) - aFree(session[fd]->wdata); - if(session[fd]->session_data) - aFree(session[fd]->session_data); - aFree(session[fd]); - } - session[fd]=NULL; - //printf("delete_session:%d\n",fd); - return 0; -} - -int realloc_fifo(int fd,int rfifo_size,int wfifo_size) -{ - struct socket_data *s; - - if (fd <= 0) return 0; - s = session[fd]; - if( s->max_rdata != rfifo_size && s->rdata_size < rfifo_size){ - RECREATE(s->rdata, unsigned char, 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); - s->max_wdata = wfifo_size; - } - return 0; -} - -int WFIFOSET(int fd,int len) -{ - struct socket_data *s; - - if (fd <= 0) return 0; - s = session[fd]; - if (s == NULL || s->wdata == NULL) - return 0; - if( s->wdata_size+len+16384 > s->max_wdata ){ - unsigned char *sin_addr = (unsigned char *)&s->client_addr.sin_addr; - realloc_fifo(fd,s->max_rdata, s->max_wdata <<1 ); - printf("socket: %d (%d.%d.%d.%d) wdata expanded to %d bytes.\n",fd, sin_addr[0], sin_addr[1], sin_addr[2], sin_addr[3], 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); - if (s->wdata_size > (TCP_FRAME_LEN)) - send_from_fifo(fd); - return 0; -} - -int do_sendrecv(int next) -{ - fd_set rfd,wfd; - struct timeval timeout; - int ret,i; - - tick_ = time(0); - - memcpy(&rfd, &readfds, sizeof(rfd)); - - FD_ZERO(&wfd); - for(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) - FD_SET(i,&wfd); - } - 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(!session[i]) - continue; - if(FD_ISSET(i,&wfd)){ - //printf("write:%d\n",i); - if(session[i]->func_send) - session[i]->func_send(i); - } - if(FD_ISSET(i,&rfd)){ - //printf("read:%d\n",i); - if(session[i]->func_recv) - session[i]->func_recv(i); - } - } - return 0; -} - -int do_parsepacket(void) -{ - int i; - for(i=0;i<fd_max;i++){ - if(!session[i]) - continue; - if ((session[i]->rdata_tick != 0) && ((tick_ - session[i]->rdata_tick) > stall_time_)) - session[i]->eof = 1; - if(session[i]->rdata_size==0 && session[i]->eof==0) - continue; - if(session[i]->func_parse){ - session[i]->func_parse(i); - if(!session[i]) - continue; - } - RFIFOFLUSH(i); - } - return 0; -} - -/* DDoS 攻撃対策 */ - -enum { - ACO_DENY_ALLOW=0, - ACO_ALLOW_DENY, - ACO_MUTUAL_FAILTURE, -}; - -struct _access_control { - unsigned int ip; - unsigned int mask; -}; - -static struct _access_control *access_allow; -static struct _access_control *access_deny; -static int access_order=ACO_DENY_ALLOW; -static int access_allownum=0; -static int access_denynum=0; -static int access_debug=0; -static int ddos_count = 10; -static int ddos_interval = 3000; -static int ddos_autoreset = 600*1000; - -struct _connect_history { - struct _connect_history *next; - struct _connect_history *prev; - int status; - int count; - unsigned int ip; - unsigned int tick; -}; -static struct _connect_history *connect_history[0x10000]; -static int connect_check_(unsigned int ip); - -// 接続できるかどうかの確認 -// false : 接続OK -// true : 接続NG -static int connect_check(unsigned int ip) { - int result = connect_check_(ip); - if(access_debug) { - printf("connect_check: Connection from %d.%d.%d.%d %s\n", - CONVIP(ip),result ? "allowed." : "denied!"); - } - return result; -} - -static int connect_check_(unsigned int ip) { - struct _connect_history *hist = connect_history[ip & 0xFFFF]; - struct _connect_history *hist_new; - int i,is_allowip = 0,is_denyip = 0,connect_ok = 0; - - // allow , deny リストに入っているか確認 - for(i = 0;i < access_allownum; i++) { - if((ip & access_allow[i].mask) == (access_allow[i].ip & access_allow[i].mask)) { - if(access_debug) { - printf("connect_check: Found match from allow list:%d.%d.%d.%d IP:%d.%d.%d.%d Mask:%d.%d.%d.%d\n", - CONVIP(ip), - CONVIP(access_allow[i].ip), - CONVIP(access_allow[i].mask)); - } - is_allowip = 1; - break; - } - } - for(i = 0;i < access_denynum; i++) { - if((ip & access_deny[i].mask) == (access_deny[i].ip & access_deny[i].mask)) { - if(access_debug) { - printf("connect_check: Found match from deny list:%d.%d.%d.%d IP:%d.%d.%d.%d Mask:%d.%d.%d.%d\n", - CONVIP(ip), - CONVIP(access_deny[i].ip), - CONVIP(access_deny[i].mask)); - } - is_denyip = 1; - break; - } - } - // コネクト出来るかどうか確認 - // connect_ok - // 0 : 無条件に拒否 - // 1 : 田代砲チェックの結果次第 - // 2 : 無条件に許可 - switch(access_order) { - case ACO_DENY_ALLOW: - default: - if(is_allowip) { - connect_ok = 2; - } else if(is_denyip) { - connect_ok = 0; - } else { - connect_ok = 1; - } - break; - case ACO_ALLOW_DENY: - if(is_denyip) { - connect_ok = 0; - } else if(is_allowip) { - connect_ok = 2; - } else { - connect_ok = 1; - } - break; - case ACO_MUTUAL_FAILTURE: - if(is_allowip) { - connect_ok = 2; - } else { - connect_ok = 0; - } - break; - } - - // 接続履歴を調べる - while(hist) { - if(ip == hist->ip) { - // 同じIP発見 - if(hist->status) { - // ban フラグが立ってる - return (connect_ok == 2 ? 1 : 0); - } else if(DIFF_TICK(gettick(),hist->tick) < ddos_interval) { - // ddos_interval秒以内にリクエスト有り - hist->tick = gettick(); - if(hist->count++ >= ddos_count) { - // ddos 攻撃を検出 - hist->status = 1; - printf("connect_check: DDOS Attack detected from %d.%d.%d.%d!\n", - CONVIP(ip)); - return (connect_ok == 2 ? 1 : 0); - } else { - return connect_ok; - } - } else { - // ddos_interval秒以内にリクエスト無いのでタイマークリア - hist->tick = gettick(); - hist->count = 0; - return connect_ok; - } - } - hist = hist->next; - } - // IPリストに無いので新規作成 - hist_new = (struct _connect_history *) aCalloc(1,sizeof(struct _connect_history)); - hist_new->ip = ip; - hist_new->tick = gettick(); - if(connect_history[ip & 0xFFFF] != NULL) { - hist = connect_history[ip & 0xFFFF]; - hist->prev = hist_new; - hist_new->next = hist; - } - connect_history[ip & 0xFFFF] = hist_new; - return connect_ok; -} - -static int connect_check_clear(int tid,unsigned int tick,int id,int data) { - int i; - int clear = 0; - int list = 0; - struct _connect_history *hist , *hist2; - for(i = 0;i < 0x10000 ; i++) { - hist = connect_history[i]; - while(hist) { - if( - (DIFF_TICK(tick,hist->tick) > ddos_interval * 3 && !hist->status) || - (DIFF_TICK(tick,hist->tick) > ddos_autoreset && hist->status) - ) { - // clear data - hist2 = hist->next; - if(hist->prev) { - hist->prev->next = hist->next; - } else { - connect_history[i] = hist->next; - } - if(hist->next) { - hist->next->prev = hist->prev; - } - aFree(hist); - hist = hist2; - clear++; - } else { - hist = hist->next; - list++; - } - } - } - if(access_debug) { - printf("connect_check_clear: Cleared %d of %d from IP list.\n", clear, clear+list); - } - return list; -} - -// IPマスクチェック -int access_ipmask(const char *str,struct _access_control* acc) -{ - unsigned int mask=0,i=0,m,ip, a0,a1,a2,a3; - if( !strcmp(str,"all") ) { - ip = 0; - mask = 0; - } else { - if( sscanf(str,"%d.%d.%d.%d%n",&a0,&a1,&a2,&a3,&i)!=4 || i==0) { - printf("access_ipmask: Unknown format %s!\n",str); - return 0; - } - ip = (a3 << 24) | (a2 << 16) | (a1 << 8) | a0; - - if(sscanf(str+i,"/%d.%d.%d.%d",&a0,&a1,&a2,&a3)==4 ){ - mask = (a3 << 24) | (a2 << 16) | (a1 << 8) | a0; - } else if(sscanf(str+i,"/%d",&m) == 1) { - for(i=0;i<m;i++) { - mask = (mask >> 1) | 0x80000000; - } - mask = ntohl(mask); - } else { - mask = 0xFFFFFFFF; - } - } - if(access_debug) { - printf("access_ipmask: Loaded IP:%d.%d.%d.%d mask:%d.%d.%d.%d\n", - CONVIP(ip), CONVIP(mask)); - } - acc->ip = ip; - acc->mask = mask; - return 1; -} - -int socket_config_read(const char *cfgName) { - int i; - char line[1024],w1[1024],w2[1024]; - FILE *fp; - - fp=fopen(cfgName, "r"); - if(fp==NULL){ - printf("File not found: %s\n", cfgName); - return 1; - } - while(fgets(line,1020,fp)){ - if(line[0] == '/' && line[1] == '/') - continue; - i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2); - if(i!=2) - continue; - if(strcmpi(w1,"stall_time")==0){ - stall_time_ = atoi(w2); - } else if(strcmpi(w1,"enable_ip_rules")==0){ - if(strcmpi(w2,"yes")==0) - ip_rules = 1; - else if(strcmpi(w2,"no")==0) - ip_rules = 0; - else ip_rules = atoi(w2); - } else if(strcmpi(w1,"order")==0){ - access_order=atoi(w2); - if(strcmpi(w2,"deny,allow")==0) access_order=ACO_DENY_ALLOW; - if(strcmpi(w2,"allow,deny")==0) access_order=ACO_ALLOW_DENY; - if(strcmpi(w2,"mutual-failure")==0) access_order=ACO_MUTUAL_FAILTURE; - } else if(strcmpi(w1,"allow")==0){ - access_allow = (struct _access_control *) aRealloc(access_allow,(access_allownum+1)*sizeof(struct _access_control)); - if(access_ipmask(w2,&access_allow[access_allownum])) { - access_allownum++; - } - } else if(strcmpi(w1,"deny")==0){ - access_deny = (struct _access_control *) aRealloc(access_deny,(access_denynum+1)*sizeof(struct _access_control)); - if(access_ipmask(w2,&access_deny[access_denynum])) { - access_denynum++; - } - } else if(!strcmpi(w1,"ddos_interval")){ - ddos_interval = atoi(w2); - } else if(!strcmpi(w1,"ddos_count")){ - ddos_count = atoi(w2); - } else if(!strcmpi(w1,"ddos_autoreset")){ - ddos_autoreset = atoi(w2); - } else if(!strcmpi(w1,"debug")){ - if(strcmpi(w2,"yes")==0) - access_debug = 1; - else if(strcmpi(w2,"no")==0) - access_debug = 0; - else access_debug = atoi(w2); - #ifdef UPNP - } else if(!strcmpi(w1,"release_mappings")){ - if(strcmpi(w2,"yes")==0) - release_mappings = 1; - else if(strcmpi(w2,"no")==0) - release_mappings = 0; - else release_mappings = atoi(w2); - } else if(!strcmpi(w1,"close_ports")){ - if(strcmpi(w2,"yes")==0) - close_ports = 1; - else if(strcmpi(w2,"no")==0) - close_ports = 0; - else close_ports = atoi(w2); - #endif - } else if (strcmpi(w1, "import") == 0) - socket_config_read(w2); - } - fclose(fp); - return 0; -} - -int RFIFOSKIP(int fd,int len) -{ - struct socket_data *s; - - if (fd <= 0) return 0; - s = session[fd]; - - if (s->rdata_size-s->rdata_pos-len<0) { - fprintf(stderr,"too many skip\n"); - exit(1); - } - - s->rdata_pos = s->rdata_pos+len; - - return 0; -} - - -unsigned int addr_[16]; // ip addresses of local host (host byte order) -unsigned int naddr_ = 0; // # of ip addresses - -int Net_Init(void) -{ -#ifdef _WIN32 - char** a; - unsigned int i; - char fullhost[255]; - struct hostent* hent; - - /* Start up the windows networking */ - WSADATA wsaData; - - if ( WSAStartup(WINSOCK_VERSION, &wsaData) != 0 ) { - printf("SYSERR: WinSock not available!\n"); - exit(1); - } - - if(gethostname(fullhost, sizeof(fullhost)) == SOCKET_ERROR) { - printf("Ugg.. no hostname defined!\n"); - return 0; - } - - // XXX This should look up the local IP addresses in the registry - // instead of calling gethostbyname. However, the way IP addresses - // are stored in the registry is annoyingly complex, so I'll leave - // this as T.B.D. - hent = gethostbyname(fullhost); - if (hent == NULL) { - printf("Cannot resolve our own hostname to a IP address"); - return 0; - } - - a = hent->h_addr_list; - for(i = 0; a[i] != 0 && i < 16; ++i) { - unsigned long addr1 = ntohl(*(unsigned long*) a[i]); - addr_[i] = addr1; - } - naddr_ = i; -#else - int pos; - int fdes = socket(AF_INET, SOCK_STREAM, 0); - char buf[16 * sizeof(struct ifreq)]; - struct ifconf ic; - - // The ioctl call will fail with Invalid Argument if there are more - // interfaces than will fit in the buffer - ic.ifc_len = sizeof(buf); - ic.ifc_buf = buf; - if(ioctl(fdes, SIOCGIFCONF, &ic) == -1) { - printf("SIOCGIFCONF failed!\n"); - return 0; - } - - for(pos = 0; pos < ic.ifc_len;) - { - struct ifreq * ir = (struct ifreq *) (ic.ifc_buf + pos); - - struct sockaddr_in * a = (struct sockaddr_in *) &(ir->ifr_addr); - - if(a->sin_family == AF_INET) { - u_long ad = ntohl(a->sin_addr.s_addr); - if(ad != INADDR_LOOPBACK) { - addr_[naddr_ ++] = ad; - if(naddr_ == 16) - break; - } - } - -#if defined(_AIX) || defined(__APPLE__) - pos += ir->ifr_addr.sa_len; // For when we port athena to run on Mac's :) - pos += sizeof(ir->ifr_name); -#else - pos += sizeof(struct ifreq); -#endif - } - -#endif - - return(0); -} - -#ifdef UPNP -// not implemented yet ^^; -void do_init_upnp(void) -{ - int *_release_mappings; - int *_close_ports; - - upnp_dll = DLL_OPEN ("upnp.dll"); - if (!upnp_dll) { - printf ("Cannot open upnp.dll: %s\n", dlerror()); - return; - } - DLL_SYM (upnp_init, upnp_dll, "do_init"); - DLL_SYM (upnp_final, upnp_dll, "do_final"); - DLL_SYM (firewall_addport, upnp_dll, "Firewall_AddPort"); - DLL_SYM (upnp_addport, upnp_dll, "UPNP_AddPort"); - if (!upnp_init || !upnp_final || !firewall_addport || !upnp_addport) { - printf ("Cannot load symbol: %s\n", dlerror()); - DLL_CLOSE (upnp_dll); - upnp_dll = NULL; - return; - } - - DLL_SYM (_release_mappings, upnp_dll, "release_mappings"); - DLL_SYM (_close_ports, upnp_dll, "close_ports"); - if (release_mappings && _release_mappings) - *_release_mappings = release_mappings; - if (close_ports && _close_ports) - *_close_ports = close_ports; - - if (upnp_init() == 0) { - printf ("Error initialising upnp.dll, unloading...\n"); - DLL_CLOSE (upnp_dll); - upnp_dll = NULL; - } - return; -} -#endif - -void do_final_socket(void) -{ - int i; - struct _connect_history *hist , *hist2; - for(i=0; i<fd_max; i++) { - if(session[i]) { - delete_session(i); - } - } - for(i=0; i<0x10000; i++) { - hist = connect_history[i]; - while(hist) { - hist2 = hist->next; - aFree(hist); - hist = hist2; - } - } - if (access_allow) - aFree(access_allow); - if (access_deny) - aFree(access_deny); - - // session[0] のダミーデータを削除 - aFree(session[0]->rdata); - aFree(session[0]->wdata); - aFree(session[0]); - -#ifdef UPNP - if (upnp_dll) { - upnp_final(); - DLL_CLOSE(upnp_dll); - } -#endif -} - -void do_socket(void) -{ - char *SOCKET_CONF_FILENAME = "conf/packet_athena.conf"; - - FD_ZERO(&readfds); - - atexit(do_final_socket); - socket_config_read(SOCKET_CONF_FILENAME); - - // session[0] にダミーデータを確保する - CREATE(session[0], struct socket_data, 1); - CREATE_A(session[0]->rdata, unsigned char, rfifo_size); - CREATE_A(session[0]->wdata, unsigned char, wfifo_size); - session[0]->max_rdata = rfifo_size; - session[0]->max_wdata = wfifo_size; - - // とりあえず5分ごとに不要なデータを削除する - add_timer_interval(gettick()+1000,connect_check_clear,0,0,300*1000); - -#ifdef UPNP - do_init_upnp(); -#endif -} diff --git a/src/common/socket.h b/src/common/socket.h deleted file mode 100644 index 37d41203e..000000000 --- a/src/common/socket.h +++ /dev/null @@ -1,116 +0,0 @@ -// original : core.h 2003/03/14 11:55:25 Rev 1.4 - -#ifndef _SOCKET_H_ -#define _SOCKET_H_ - -#include <stdio.h> - -#ifdef __WIN32 -#include <winsock.h> -#else -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#endif -#include <time.h> -#include "malloc.h" - -extern time_t tick_; -extern time_t stall_time_; - -// define declaration - -#define RFIFOSPACE(fd) (session[fd]->max_rdata-session[fd]->rdata_size) -#define RFIFOP(fd,pos) (session[fd]->rdata+session[fd]->rdata_pos+(pos)) -// use function instead of macro. -#define RFIFOB(fd,pos) (*(unsigned char*)RFIFOP(fd,pos)) -#define RFIFOW(fd,pos) (*(unsigned short*)RFIFOP(fd,pos)) -#define RFIFOL(fd,pos) (*(unsigned int*)RFIFOP(fd,pos)) -#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 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 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*)WFIFOP(fd,pos)) -#define WFIFOW(fd,pos) (*(unsigned short*)WFIFOP(fd,pos)) -#define WFIFOL(fd,pos) (*(unsigned int*)WFIFOP(fd,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] */ - -// Struct declaration - -struct socket_data{ - int eof; - unsigned char *rdata,*wdata; - int max_rdata,max_wdata; - int rdata_size,wdata_size; - time_t rdata_tick; - int rdata_pos; - struct sockaddr_in client_addr; - int (*func_recv)(int); - int (*func_send)(int); - int (*func_parse)(int); - int (*func_console)(char*); - void* session_data; -}; - -// Data prototype declaration - -#ifdef _WIN32 - - #undef FD_SETSIZE - #define FD_SETSIZE 4096 - -#endif - -extern struct socket_data *session[FD_SETSIZE]; - -extern int rfifo_size,wfifo_size; -extern int fd_max; - -// Function prototype declaration - -int make_listen_port(int); -int make_listen_bind(long,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); -void do_socket(void); - -extern void flush_fifos(); -extern void set_nonblocking(int fd, int yes); - -int start_console(void); - -void set_defaultparse(int (*defaultparse)(int)); -void set_defaultconsoleparse(int (*defaultparse)(char*)); - -int Net_Init(void); - -extern unsigned int addr_[16]; // ip addresses of local host (host byte order) -extern unsigned int naddr_; // # of ip addresses - - -#endif // _SOCKET_H_ diff --git a/src/common/strlib.c b/src/common/strlib.c deleted file mode 100644 index 2b130e76d..000000000 --- a/src/common/strlib.c +++ /dev/null @@ -1,98 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "strlib.h" -#include "utils.h" -#include "malloc.h" - -//----------------------------------------------- -// string lib. -char* jstrescape (char* pt) { - //copy from here - char *ptr; - int i =0, j=0; - - //copy string to temporary - CREATE_A(ptr, char, J_MAX_MALLOC_SIZE); - strcpy(ptr,pt); - - while (ptr[i] != '\0') { - switch (ptr[i]) { - case '\'': - pt[j++] = '\\'; - pt[j++] = ptr[i++]; - break; - case '\\': - pt[j++] = '\\'; - pt[j++] = ptr[i++]; - break; - default: - pt[j++] = ptr[i++]; - } - } - pt[j++] = '\0'; - aFree (ptr); - return &pt[0]; -} - -char* jstrescapecpy (char* pt,char* spt) { - //copy from here - int i =0, j=0; - - while (spt[i] != '\0') { - switch (spt[i]) { - case '\'': - pt[j++] = '\\'; - pt[j++] = spt[i++]; - break; - case '\\': - pt[j++] = '\\'; - pt[j++] = spt[i++]; - break; - default: - pt[j++] = spt[i++]; - } - } - pt[j++] = '\0'; - return &pt[0]; -} -int jmemescapecpy (char* pt,char* spt, int size) { - //copy from here - int i =0, j=0; - - while (i < size) { - switch (spt[i]) { - case '\'': - pt[j++] = '\\'; - pt[j++] = spt[i++]; - break; - case '\\': - pt[j++] = '\\'; - pt[j++] = spt[i++]; - break; - default: - pt[j++] = spt[i++]; - } - } - // copy size is 0 ~ (j-1) - return j; -} - -//----------------------------------------------------- -// Function to suppress control characters in a string. -//----------------------------------------------------- -//int remove_control_chars(char *str) { -int remove_control_chars(unsigned char *str) { - int i; - int change = 0; - - for(i = 0; str[i]; i++) { - if (str[i] < 32) { - str[i] = '_'; - change = 1; - } - } - - return change; -} diff --git a/src/common/strlib.h b/src/common/strlib.h deleted file mode 100644 index 55920f823..000000000 --- a/src/common/strlib.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _J_STR_LIB_H_ -#define _J_STR_LIB_H_ -#define J_MAX_MALLOC_SIZE 65535 -// String function library. -// code by Jioh L. Jung (ziozzang@4wish.net) -// This code is under license "BSD" -char* jstrescape (char* pt); -char* jstrescapecpy (char* pt,char* spt); -int jmemescapecpy (char* pt,char* spt, int size); - -// custom functions -int remove_control_chars(unsigned char *); -#endif diff --git a/src/common/timer.c b/src/common/timer.c deleted file mode 100644 index 6a740d47a..000000000 --- a/src/common/timer.c +++ /dev/null @@ -1,315 +0,0 @@ -// $Id: timer.c,v 1.1.1.1 2004/09/10 17:44:49 Yor Exp $ -// original : core.c 2003/02/26 18:03:12 Rev 1.7 - -//#include <config.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/types.h> - -#ifdef __WIN32 -#define __USE_W32_SOCKETS -#include <windows.h> -#else -#include <sys/socket.h> -#include <sys/time.h> -#endif - -#include "timer.h" -#include "malloc.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_num = 0, timer_heap_max = 0; -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; - -#ifdef __WIN32 -/* Modified struct timezone to void - we pass NULL anyway */ -void gettimeofday(struct timeval *t, void *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; - - //CALLOC(tfl, struct timer_func_list, 1); - tfl = (struct timer_func_list*) aCalloc( sizeof(struct timer_func_list) , 1); - //MALLOC(tfl->name, char, strlen(name) + 1); - tfl->name = (char *) aMalloc( 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) { - struct timeval tval; - - gettimeofday(&tval, NULL); - gettick_count = 256; - - return gettick_cache = tval.tv_sec * 1000 + tval.tv_usec / 1000; -} - -unsigned int gettick(void) { - gettick_count--; - if (gettick_count < 0) - return gettick_nocache(); - - return gettick_cache; -} - -/*====================================== - * CORE : Timer Heap - *-------------------------------------- - */ -static void push_timer_heap(int index) { - int i, j; - int min, max, pivot; // for sorting - - // check number of element - if (timer_heap_num >= timer_heap_max) { - if (timer_heap_max == 0) { - timer_heap_max = 256; - //CALLOC(timer_heap, int, 256); - timer_heap = (int *) aCalloc( sizeof(int) , 256); - } else { - timer_heap_max += 256; - //REALLOC(timer_heap, int, timer_heap_max); - timer_heap = (int *) aRealloc( timer_heap, sizeof(int) * timer_heap_max); - memset(timer_heap + (timer_heap_max - 256), 0, sizeof(int) * 256); - } - } - - // do a sorting from higher to lower - j = timer_data[index].tick; // speed up - // with less than 4 values, it's speeder to use simple loop - if (timer_heap_num < 4) { - for(i = timer_heap_num; i > 0; i--) - if (j < timer_data[timer_heap[i - 1]].tick) - break; - else - timer_heap[i] = timer_heap[i - 1]; - timer_heap[i] = index; - // searching by dichotomie - } else { - // if lower actual item is higher than new - if (j < timer_data[timer_heap[timer_heap_num - 1]].tick) - timer_heap[timer_heap_num] = index; - else { - // searching position - min = 0; - max = timer_heap_num - 1; - while (min < max) { - pivot = (min + max) / 2; - if (j < timer_data[timer_heap[pivot]].tick) - min = pivot + 1; - else - max = pivot; - } - // move elements - do loop if there are a little number of elements to move - if (timer_heap_num - min < 5) { - for(i = timer_heap_num; i > min; i--) - timer_heap[i] = timer_heap[i - 1]; - // move elements - else use memmove (speeder for a lot of elements) - } else - memmove(&timer_heap[min + 1], &timer_heap[min], sizeof(int) * (timer_heap_num - min)); - // save new element - timer_heap[min] = index; - } - } - - timer_heap_num++; -} - -int add_timer(unsigned int tick,int (*func)(int,unsigned int,int,int),int id,int data) { - struct TimerData* td; - int i; - - if (free_timer_list_pos) { - do { - i = free_timer_list[--free_timer_list_pos]; - } while(i >= timer_data_num && free_timer_list_pos > 0); - } else - i = timer_data_num; - if (i >= timer_data_num) - for (i = timer_data_num; i < timer_data_max && timer_data[i].type; i++); - if (i >= timer_data_num && i >= timer_data_max) { - if (timer_data_max == 0) { - timer_data_max = 256; - //CALLOC(timer_data, struct TimerData, timer_data_max); - timer_data = (struct TimerData*) aCalloc( sizeof(struct TimerData) , timer_data_max); - } else { - timer_data_max += 256; - //REALLOC(timer_data, struct TimerData, timer_data_max); - timer_data = (struct TimerData *) aRealloc( timer_data, sizeof(struct TimerData) * timer_data_max); - memset(timer_data + (timer_data_max - 256), 0, sizeof(struct TimerData) * 256); - } - } - td = &timer_data[i]; - td->tick = tick; - td->func = func; - td->id = id; - td->data = data; - td->type = TIMER_ONCE_AUTODEL; - td->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) { - int tid; - - 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)) { - if (id <= 0 || id >= timer_data_num) { - printf("delete_timer error : no such timer %d\n", id); - return -1; - } - 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; - } - // そのうち消えるにまかせる - 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) { - return timer_data[tid].tick += tick; -} - -struct TimerData* get_timer(int tid) { - return &timer_data[tid]; -} - -int do_timer(unsigned int tick) { - int i, nextmin = 1000; - - while(timer_heap_num) { - i = timer_heap[timer_heap_num - 1]; // next shorter element - if (DIFF_TICK(timer_data[i].tick, tick) > 0) { - nextmin = DIFF_TICK(timer_data[i].tick, tick); - break; - } - if (timer_heap_num > 0) // suppress the actual element from the table - timer_heap_num--; - 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); - } else { - 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 & ~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; - //REALLOC(free_timer_list, int, free_timer_list_max); - free_timer_list = (int *) aRealloc(free_timer_list, sizeof(int) * free_timer_list_max); - memset(free_timer_list + (free_timer_list_max - 256), 0, 256 * sizeof(int)); - } - 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; - } - } - } - - if (nextmin < 10) - nextmin = 10; - - return nextmin; -} - -void timer_final() { - struct timer_func_list* tfl = tfl_root, *tfl2; - -// while (tfl) { -// tfl2 = tfl; -// aFree(tfl->name); -// aFree(tfl); -// tfl = tfl2->next; // access on already freed memory -// } - - while (tfl) { - tfl2 = tfl->next; // copy next pointer - aFree(tfl->name); // free structures - aFree(tfl); - tfl = tfl2; // use copied pointer for next cycle - } - - if (timer_data) aFree(timer_data); - if (timer_heap) aFree(timer_heap); - if (free_timer_list) aFree(free_timer_list); -} - diff --git a/src/common/timer.h b/src/common/timer.h deleted file mode 100644 index 81086cb70..000000000 --- a/src/common/timer.h +++ /dev/null @@ -1,55 +0,0 @@ -// original : core.h 2003/03/14 11:55:25 Rev 1.4 - -#ifndef _TIMER_H_ -#define _TIMER_H_ - -#ifdef __WIN32 -/* We need winsock lib to have timeval struct - windows is weirdo */ -#define __USE_W32_SOCKETS -#include <windows.h> -#endif - -#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))) - -// Struct declaration - -struct TimerData { - unsigned int tick; - int (*func)(int,unsigned int,int,int); - int id; - int data; - int type; - int interval; - int heap_pos; -}; - -// Function prototype declaration - -#ifdef __WIN32 -void gettimeofday(struct timeval *t, void *dummy); -#endif - -unsigned int gettick_nocache(void); -unsigned int 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)); - -int addtick_timer(int tid,unsigned int tick); -struct TimerData *get_timer(int tid); - -int do_timer(unsigned int tick); - -int add_timer_func_list(int (*)(int,unsigned int,int,int),char*); -char* search_timer_func_list(int (*)(int,unsigned int,int,int)); - -void timer_final(); - -#endif // _TIMER_H_ diff --git a/src/common/utils.c b/src/common/utils.c deleted file mode 100644 index 732b1d366..000000000 --- a/src/common/utils.c +++ /dev/null @@ -1,189 +0,0 @@ -#include <string.h> -#include "utils.h" -#include <stdio.h> -#include <stdarg.h> -#include <stdlib.h> -#include "malloc.h" -#include "mmo.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 _WIN32 -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 - -// Allocate a StringBuf [MouseJstr] -struct StringBuf * StringBuf_Malloc() -{ - struct StringBuf * ret = (struct StringBuf *) aMallocA(sizeof(struct StringBuf)); - StringBuf_Init(ret); - return ret; -} - -// Initialize a previously allocated StringBuf [MouseJstr] -void StringBuf_Init(struct StringBuf * sbuf) { - sbuf->max_ = 1024; - sbuf->ptr_ = sbuf->buf_ = (char *) aMallocA(sbuf->max_ + 1); -} - -// printf into a StringBuf, moving the pointer [MouseJstr] -int StringBuf_Printf(struct StringBuf *sbuf,const char *fmt,...) -{ - va_list ap; - int n, size, off; - - while (1) { - /* Try to print in the allocated space. */ - va_start(ap, fmt); - size = sbuf->max_ - (sbuf->ptr_ - sbuf->buf_); - n = vsnprintf (sbuf->ptr_, size, fmt, ap); - va_end(ap); - /* If that worked, return the length. */ - if (n > -1 && n < size) { - sbuf->ptr_ += n; - return sbuf->ptr_ - sbuf->buf_; - } - /* Else try again with more space. */ - sbuf->max_ *= 2; // twice the old size - off = sbuf->ptr_ - sbuf->buf_; - sbuf->buf_ = (char *) aRealloc(sbuf->buf_, sbuf->max_ + 1); - sbuf->ptr_ = sbuf->buf_ + off; - } -} - -// Append buf2 onto the end of buf1 [MouseJstr] -int StringBuf_Append(struct StringBuf *buf1,const struct StringBuf *buf2) -{ - int buf1_avail = buf1->max_ - (buf1->ptr_ - buf1->buf_); - int size2 = buf2->ptr_ - buf2->buf_; - - if (size2 >= buf1_avail) { - int off = buf1->ptr_ - buf1->buf_; - buf1->max_ += size2; - buf1->buf_ = (char *) aRealloc(buf1->buf_, buf1->max_ + 1); - buf1->ptr_ = buf1->buf_ + off; - } - - memcpy(buf1->ptr_, buf2->buf_, size2); - buf1->ptr_ += size2; - return buf1->ptr_ - buf1->buf_; -} - -// Destroy a StringBuf [MouseJstr] -void StringBuf_Destroy(struct StringBuf *sbuf) -{ - aFree(sbuf->buf_); - sbuf->ptr_ = sbuf->buf_ = 0; -} - -// Free a StringBuf returned by StringBuf_Malloc [MouseJstr] -void StringBuf_Free(struct StringBuf *sbuf) -{ - StringBuf_Destroy(sbuf); - aFree(sbuf); -} - -// Return the built string from the StringBuf [MouseJstr] -char * StringBuf_Value(struct StringBuf *sbuf) -{ - *sbuf->ptr_ = '\0'; - return sbuf->buf_; -} diff --git a/src/common/utils.h b/src/common/utils.h deleted file mode 100644 index 63c3f21ec..000000000 --- a/src/common/utils.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef COMMON_UTILS_H -#define COMMON_UTILS_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 _WIN32 - 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__); \ - if (!((result) = (type *) aCalloc ((number), sizeof(type)))) \ - { perror("SYSERR: malloc failure"); abort(); } } while(0) - -#define CREATE_A(result, type, number) do {\ - if ((number) * sizeof(type) <= 0) \ - printf("SYSERR: Zero bytes or less requested at %s:%d.\n", __FILE__, __LINE__); \ - if (!((result) = (type *) aCallocA ((number), sizeof(type)))) \ - { perror("SYSERR: malloc failure"); abort(); } } while(0) - -#define RECREATE(result,type,number) do {\ - if (!((result) = (type *) aRealloc ((result), sizeof(type) * (number))))\ - { printf("SYSERR: realloc failure"); abort(); } } while(0) - -struct StringBuf { - char *buf_; - char *ptr_; - unsigned int max_; -}; - -extern struct StringBuf * StringBuf_Malloc(); -extern void StringBuf_Init(struct StringBuf *); -extern int StringBuf_Printf(struct StringBuf *,const char *,...); -extern int StringBuf_Append(struct StringBuf *,const struct StringBuf *); -extern char * StringBuf_Value(struct StringBuf *); -extern void StringBuf_Destroy(struct StringBuf *); -extern void StringBuf_Free(struct StringBuf *); - -#endif diff --git a/src/common/version.h b/src/common/version.h deleted file mode 100644 index e33e2b305..000000000 --- a/src/common/version.h +++ /dev/null @@ -1,27 +0,0 @@ -// $Id: version.h,v 1.2 2004/09/22 09:49:06 PoW Exp $ -#ifndef _VERSION_H_ -#define _VERSION_H_ - -#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_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 - -// ATHENA_MOD_VERSIONはパッチ番号です。 -// これは無理に変えなくても気が向いたら変える程度の扱いで。 -// (毎回アップロードの度に変更するのも面倒と思われるし、そもそも -// この項目を参照する人がいるかどうかで疑問だから。) -// その程度の扱いなので、サーバーに問い合わせる側も、あくまで目安程度の扱いで -// あんまり信用しないこと。 -// 鯖snapshotの時や、大きな変更があった場合は設定してほしいです。 -// C言語の仕様上、最初に0を付けると8進数になるので間違えないで下さい。 -#define ATHENA_MOD_VERSION 1052 // mod version (patch No.) - -#endif |