forked from metin2/server
233 lines
3.5 KiB
C++
233 lines
3.5 KiB
C++
#include "stdafx.h"
|
|
|
|
static int global_time_gap = 0;
|
|
|
|
time_t get_global_time()
|
|
{
|
|
return time(0) + global_time_gap;
|
|
}
|
|
|
|
void set_global_time(time_t t)
|
|
{
|
|
global_time_gap = t - time(0);
|
|
|
|
char time_str_buf[32];
|
|
snprintf(time_str_buf, sizeof(time_str_buf), "%s", time_str(get_global_time()));
|
|
|
|
sys_log(0, "GLOBAL_TIME: %s time_gap %d", time_str_buf, global_time_gap);
|
|
}
|
|
|
|
size_t str_lower(const char * src, char * dest, size_t dest_size)
|
|
{
|
|
size_t len = 0;
|
|
|
|
if (!dest || dest_size == 0)
|
|
return len;
|
|
|
|
if (!src)
|
|
{
|
|
*dest = '\0';
|
|
return len;
|
|
}
|
|
|
|
// \0 자리 확보
|
|
--dest_size;
|
|
|
|
while (*src && len < dest_size)
|
|
{
|
|
*dest = LOWER(*src); // LOWER 매크로에서 ++나 --하면 안됨!!
|
|
|
|
++src;
|
|
++dest;
|
|
++len;
|
|
}
|
|
|
|
*dest = '\0';
|
|
return len;
|
|
}
|
|
|
|
void skip_spaces(const char **string)
|
|
{
|
|
for (; **string != '\0' && isspace(**string); ++(*string));
|
|
}
|
|
|
|
const char *one_argument(const char *argument, char *first_arg, size_t first_size)
|
|
{
|
|
bool mark = false;
|
|
size_t first_len = 0;
|
|
|
|
if (!argument || 0 == first_size)
|
|
{
|
|
sys_err("one_argument received a NULL pointer!");
|
|
*first_arg = '\0';
|
|
return NULL;
|
|
}
|
|
|
|
// \0 자리 확보
|
|
--first_size;
|
|
|
|
skip_spaces(&argument);
|
|
|
|
while (*argument && first_len < first_size)
|
|
{
|
|
if (*argument == '\"')
|
|
{
|
|
mark = !mark;
|
|
++argument;
|
|
continue;
|
|
}
|
|
|
|
if (!mark && isspace(*argument))
|
|
break;
|
|
|
|
*(first_arg++) = *argument;
|
|
++argument;
|
|
++first_len;
|
|
}
|
|
|
|
*first_arg = '\0';
|
|
|
|
skip_spaces(&argument);
|
|
return (argument);
|
|
}
|
|
|
|
const char *two_arguments(const char *argument, char *first_arg, size_t first_size, char *second_arg, size_t second_size)
|
|
{
|
|
return (one_argument(one_argument(argument, first_arg, first_size), second_arg, second_size));
|
|
}
|
|
|
|
const char *first_cmd(const char *argument, char *first_arg, size_t first_arg_size, size_t *first_arg_len_result)
|
|
{
|
|
size_t cur_len = 0;
|
|
skip_spaces(&argument);
|
|
|
|
// \0 자리 확보
|
|
first_arg_size -= 1;
|
|
|
|
while (*argument && !isspace(*argument) && cur_len < first_arg_size)
|
|
{
|
|
*(first_arg++) = LOWER(*argument);
|
|
++argument;
|
|
++cur_len;
|
|
}
|
|
|
|
*first_arg_len_result = cur_len;
|
|
*first_arg = '\0';
|
|
return (argument);
|
|
}
|
|
|
|
int CalculateDuration(int iSpd, int iDur)
|
|
{
|
|
int i = 100 - iSpd;
|
|
|
|
if (i > 0)
|
|
i = 100 + i;
|
|
else if (i < 0)
|
|
i = 10000 / (100 - i);
|
|
else
|
|
i = 100;
|
|
|
|
return iDur * i / 100;
|
|
}
|
|
|
|
int parse_time_str(const char* str)
|
|
{
|
|
int tmp = 0;
|
|
int secs = 0;
|
|
|
|
while (*str != 0)
|
|
{
|
|
switch (*str)
|
|
{
|
|
case 'm':
|
|
case 'M':
|
|
secs += tmp * 60;
|
|
tmp = 0;
|
|
break;
|
|
|
|
case 'h':
|
|
case 'H':
|
|
secs += tmp * 3600;
|
|
tmp = 0;
|
|
break;
|
|
|
|
case 'd':
|
|
case 'D':
|
|
secs += tmp * 86400;
|
|
tmp = 0;
|
|
break;
|
|
|
|
case '0':
|
|
case '1':
|
|
case '2':
|
|
case '3':
|
|
case '4':
|
|
case '5':
|
|
case '6':
|
|
case '7':
|
|
case '8':
|
|
case '9':
|
|
tmp *= 10;
|
|
tmp += (*str) - '0';
|
|
break;
|
|
|
|
case 's':
|
|
case 'S':
|
|
secs += tmp;
|
|
tmp = 0;
|
|
break;
|
|
default:
|
|
return -1;
|
|
}
|
|
++str;
|
|
}
|
|
|
|
return secs + tmp;
|
|
}
|
|
|
|
bool WildCaseCmp(const char *w, const char *s)
|
|
{
|
|
for (;;)
|
|
{
|
|
switch(*w)
|
|
{
|
|
case '*':
|
|
if ('\0' == w[1])
|
|
return true;
|
|
{
|
|
for (size_t i = 0; i <= strlen(s); ++i)
|
|
{
|
|
if (true == WildCaseCmp(w + 1, s + i))
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
|
|
case '?':
|
|
if ('\0' == *s)
|
|
return false;
|
|
|
|
++w;
|
|
++s;
|
|
break;
|
|
|
|
default:
|
|
if (*w != *s)
|
|
{
|
|
if (tolower(*w) != tolower(*s))
|
|
return false;
|
|
}
|
|
|
|
if ('\0' == *w)
|
|
return true;
|
|
|
|
++w;
|
|
++s;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|