enhanced qse_getnwifcfg() for linux.
added qse_mbshextobin(), qse_wcshextobin()
This commit is contained in:
		@ -686,7 +686,7 @@ static int comparg (int argc, qse_char_t* argv[], struct arg_t* arg)
 | 
			
		||||
 | 
			
		||||
			case QSE_T('m'):
 | 
			
		||||
			{
 | 
			
		||||
				arg->memlimit = qse_strtoulong (opt.arg);
 | 
			
		||||
				arg->memlimit = qse_strtoulong (opt.arg, 10);
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
@ -699,7 +699,7 @@ static int comparg (int argc, qse_char_t* argv[], struct arg_t* arg)
 | 
			
		||||
#if defined(QSE_BUILD_DEBUG)
 | 
			
		||||
			case QSE_T('X'):
 | 
			
		||||
			{
 | 
			
		||||
				arg->failmalloc = qse_strtoulong (opt.arg);
 | 
			
		||||
				arg->failmalloc = qse_strtoulong (opt.arg, 10);
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -1029,7 +1029,7 @@ static int get_boolean (const qse_xli_str_t* v)
 | 
			
		||||
static int get_integer (const qse_xli_str_t* v)
 | 
			
		||||
{
 | 
			
		||||
/* TODO: be more strict */
 | 
			
		||||
	return qse_strxtoi (v->ptr, v->len);
 | 
			
		||||
	return qse_strxtoi (v->ptr, v->len, 10);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int load_loccfg_basic (qse_httpd_t* httpd, qse_xli_t* xli, qse_xli_list_t* list, loccfg_t* cfg)
 | 
			
		||||
@ -1984,7 +1984,7 @@ static void set_limit (qse_httpd_t* httpd, const qse_char_t* name, int what)
 | 
			
		||||
				if (qse_strxcmp (str, len, QSE_T("unlimited")) == 0)
 | 
			
		||||
					lim.rlim_cur = RLIM_INFINITY;
 | 
			
		||||
				else
 | 
			
		||||
					lim.rlim_cur = qse_strtoui (((qse_xli_str_t*)pair->val)->ptr);
 | 
			
		||||
					lim.rlim_cur = qse_strtoui (((qse_xli_str_t*)pair->val)->ptr, 10);
 | 
			
		||||
				if (setrlimit (what, &lim) <= -1)
 | 
			
		||||
				{
 | 
			
		||||
					/* TODO: warning */
 | 
			
		||||
 | 
			
		||||
@ -934,7 +934,7 @@ static int httpd_main (int argc, qse_char_t* argv[])
 | 
			
		||||
	signal (SIGHUP, handle_signal);
 | 
			
		||||
	signal (SIGPIPE, SIG_IGN);
 | 
			
		||||
 | 
			
		||||
	if (init_ursd (&ursd, qse_strtoi(argv[2]), argv[1], argv[3]) <= -1) goto oops;
 | 
			
		||||
	if (init_ursd (&ursd, qse_strtoi(argv[2], 10), argv[1], argv[3]) <= -1) goto oops;
 | 
			
		||||
	ursd_inited = 1;
 | 
			
		||||
 | 
			
		||||
	while (!g_stop_requested)
 | 
			
		||||
 | 
			
		||||
@ -357,7 +357,7 @@ static int handle_args (int argc, qse_char_t* argv[])
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
			case QSE_T('m'):
 | 
			
		||||
				g_memlimit = qse_strtoulong (opt.arg);
 | 
			
		||||
				g_memlimit = qse_strtoulong (opt.arg, 10);
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case QSE_T('w'):
 | 
			
		||||
@ -366,7 +366,7 @@ static int handle_args (int argc, qse_char_t* argv[])
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_BUILD_DEBUG)
 | 
			
		||||
			case QSE_T('X'):
 | 
			
		||||
                    g_failmalloc = qse_strtoulong (opt.arg);
 | 
			
		||||
				g_failmalloc = qse_strtoulong (opt.arg, 10);
 | 
			
		||||
				break;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -375,8 +375,8 @@ static int handle_args (int argc, qse_char_t* argv[])
 | 
			
		||||
				if (qse_strcmp(opt.lngopt, QSE_T("version")) == 0)
 | 
			
		||||
				{
 | 
			
		||||
					print_version ();
 | 
			
		||||
                         goto done;
 | 
			
		||||
                    }
 | 
			
		||||
					goto done;
 | 
			
		||||
				}
 | 
			
		||||
				else if (qse_strcmp(opt.lngopt, QSE_T("script-encoding")) == 0)
 | 
			
		||||
				{
 | 
			
		||||
					g_script_cmgr = qse_findcmgr (opt.arg);
 | 
			
		||||
 | 
			
		||||
@ -271,12 +271,12 @@ static int handle_args (int argc, qse_char_t* argv[])
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case QSE_T('m'):
 | 
			
		||||
				g_memlimit = qse_strtoulong (opt.arg);
 | 
			
		||||
				g_memlimit = qse_strtoulong (opt.arg, 10);
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_BUILD_DEBUG)
 | 
			
		||||
			case QSE_T('X'):
 | 
			
		||||
				g_failmalloc = qse_strtoulong (opt.arg);
 | 
			
		||||
				g_failmalloc = qse_strtoulong (opt.arg, 10);
 | 
			
		||||
				break;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1896,79 +1896,251 @@ QSE_EXPORT qse_wchar_t* qse_wcsxrpbrk (
 | 
			
		||||
/* 
 | 
			
		||||
 * string conversion
 | 
			
		||||
 */
 | 
			
		||||
QSE_EXPORT int qse_strtoi (
 | 
			
		||||
	const qse_char_t* str
 | 
			
		||||
QSE_EXPORT int qse_mbstoi (
 | 
			
		||||
	const qse_mchar_t* str,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT long qse_strtol (
 | 
			
		||||
	const qse_char_t* str
 | 
			
		||||
QSE_EXPORT long qse_mbstol (
 | 
			
		||||
	const qse_mchar_t* str,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT unsigned int qse_strtoui (
 | 
			
		||||
	const qse_char_t* str
 | 
			
		||||
QSE_EXPORT unsigned int qse_mbstoui (
 | 
			
		||||
	const qse_mchar_t* str,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT unsigned long qse_strtoul (
 | 
			
		||||
	const qse_char_t* str
 | 
			
		||||
QSE_EXPORT unsigned long qse_mbstoul (
 | 
			
		||||
	const qse_mchar_t* str,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT int qse_strxtoi (
 | 
			
		||||
	const qse_char_t* str,
 | 
			
		||||
	qse_size_t        len
 | 
			
		||||
QSE_EXPORT int qse_mbsxtoi (
 | 
			
		||||
	const qse_mchar_t* str,
 | 
			
		||||
	qse_size_t        len,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT long qse_strxtol (
 | 
			
		||||
	const qse_char_t* str,
 | 
			
		||||
	qse_size_t        len
 | 
			
		||||
QSE_EXPORT long qse_mbsxtol (
 | 
			
		||||
	const qse_mchar_t* str,
 | 
			
		||||
	qse_size_t        len,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT unsigned int qse_strxtoui (
 | 
			
		||||
	const qse_char_t* str,
 | 
			
		||||
	qse_size_t        len
 | 
			
		||||
QSE_EXPORT unsigned int qse_mbsxtoui (
 | 
			
		||||
	const qse_mchar_t* str,
 | 
			
		||||
	qse_size_t        len,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT unsigned long qse_strxtoul (
 | 
			
		||||
	const qse_char_t* str,
 | 
			
		||||
	qse_size_t        len
 | 
			
		||||
QSE_EXPORT unsigned long qse_mbsxtoul (
 | 
			
		||||
	const qse_mchar_t* str,
 | 
			
		||||
	qse_size_t        len,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT qse_int_t qse_strtoint (
 | 
			
		||||
	const qse_char_t* str
 | 
			
		||||
QSE_EXPORT qse_int_t qse_mbstoint (
 | 
			
		||||
	const qse_mchar_t* str,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT qse_long_t qse_strtolong (
 | 
			
		||||
	const qse_char_t* str
 | 
			
		||||
QSE_EXPORT qse_long_t qse_mbstolong (
 | 
			
		||||
	const qse_mchar_t* str,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT qse_uint_t qse_strtouint (
 | 
			
		||||
	const qse_char_t* str
 | 
			
		||||
QSE_EXPORT qse_uint_t qse_mbstouint (
 | 
			
		||||
	const qse_mchar_t* str,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT qse_ulong_t qse_strtoulong (
 | 
			
		||||
	const qse_char_t* str
 | 
			
		||||
QSE_EXPORT qse_ulong_t qse_mbstoulong (
 | 
			
		||||
	const qse_mchar_t* str,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT qse_int_t qse_strxtoint (
 | 
			
		||||
	const qse_char_t* str, qse_size_t len
 | 
			
		||||
QSE_EXPORT qse_int_t qse_mbsxtoint (
 | 
			
		||||
	const qse_mchar_t* str, 
 | 
			
		||||
	qse_size_t        len,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT qse_long_t qse_strxtolong (
 | 
			
		||||
	const qse_char_t* str,
 | 
			
		||||
	qse_size_t        len
 | 
			
		||||
QSE_EXPORT qse_long_t qse_mbsxtolong (
 | 
			
		||||
	const qse_mchar_t* str,
 | 
			
		||||
	qse_size_t        len,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT qse_uint_t qse_strxtouint (
 | 
			
		||||
	const qse_char_t* str,
 | 
			
		||||
	qse_size_t        len
 | 
			
		||||
QSE_EXPORT qse_uint_t qse_mbsxtouint (
 | 
			
		||||
	const qse_mchar_t* str,
 | 
			
		||||
	qse_size_t        len,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT qse_ulong_t qse_strxtoulong (
 | 
			
		||||
	const qse_char_t* str,
 | 
			
		||||
	qse_size_t        len
 | 
			
		||||
QSE_EXPORT qse_ulong_t qse_mbsxtoulong (
 | 
			
		||||
	const qse_mchar_t* str,
 | 
			
		||||
	qse_size_t        len,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT int qse_wcstoi (
 | 
			
		||||
	const qse_wchar_t* str,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT long qse_wcstol (
 | 
			
		||||
	const qse_wchar_t* str,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT unsigned int qse_wcstoui (
 | 
			
		||||
	const qse_wchar_t* str,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT unsigned long qse_wcstoul (
 | 
			
		||||
	const qse_wchar_t* str,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT int qse_wcsxtoi (
 | 
			
		||||
	const qse_wchar_t* str,
 | 
			
		||||
	qse_size_t        len,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT long qse_wcsxtol (
 | 
			
		||||
	const qse_wchar_t* str,
 | 
			
		||||
	qse_size_t        len,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT unsigned int qse_wcsxtoui (
 | 
			
		||||
	const qse_wchar_t* str,
 | 
			
		||||
	qse_size_t        len,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT unsigned long qse_wcsxtoul (
 | 
			
		||||
	const qse_wchar_t* str,
 | 
			
		||||
	qse_size_t        len,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT qse_int_t qse_wcstoint (
 | 
			
		||||
	const qse_wchar_t* str,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT qse_long_t qse_wcstolong (
 | 
			
		||||
	const qse_wchar_t* str,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT qse_uint_t qse_wcstouint (
 | 
			
		||||
	const qse_wchar_t* str,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT qse_ulong_t qse_wcstoulong (
 | 
			
		||||
	const qse_wchar_t* str,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT qse_int_t qse_wcsxtoint (
 | 
			
		||||
	const qse_wchar_t* str, 
 | 
			
		||||
	qse_size_t        len,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT qse_long_t qse_wcsxtolong (
 | 
			
		||||
	const qse_wchar_t* str,
 | 
			
		||||
	qse_size_t        len,
 | 
			
		||||
	int               base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT qse_uint_t qse_wcsxtouint (
 | 
			
		||||
	const qse_wchar_t* str,
 | 
			
		||||
	qse_size_t         len,
 | 
			
		||||
	int                base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT qse_ulong_t qse_wcsxtoulong (
 | 
			
		||||
	const qse_wchar_t* str,
 | 
			
		||||
	qse_size_t         len,
 | 
			
		||||
	int                base
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_CHAR_IS_MCHAR)
 | 
			
		||||
 | 
			
		||||
#	define qse_strtoi(str,base) qse_mbstoi(str,base)
 | 
			
		||||
#	define qse_strtol(str,base) qse_mbstol(str,base)
 | 
			
		||||
#	define qse_strtoui(str,base) qse_mbstoui(str,base)
 | 
			
		||||
#	define qse_strtoul(str,base) qse_mbstoul(str,base)
 | 
			
		||||
 | 
			
		||||
#	define qse_strxtoi(str,len,base) qse_mbsxtoi(str,len,base)
 | 
			
		||||
#	define qse_strxtol(str,len,base) qse_mbsxtol(str,len,base)
 | 
			
		||||
#	define qse_strxtoui(str,len,base) qse_mbsxtoui(str,len,base)
 | 
			
		||||
#	define qse_strxtoul(str,len,base) qse_mbsxtoul(str,len,base)
 | 
			
		||||
 | 
			
		||||
#	define qse_strtoint(str,base) qse_mbstoint(str,base)
 | 
			
		||||
#	define qse_strtolong(str,base) qse_mbstolong(str,base)
 | 
			
		||||
#	define qse_strtouint(str,base) qse_mbstouint(str,base)
 | 
			
		||||
#	define qse_strtoulong(str,base) qse_mbstoulong(str,base)
 | 
			
		||||
 | 
			
		||||
#	define qse_strxtoint(str,len,base) qse_mbsxtoint(str,len,base)
 | 
			
		||||
#	define qse_strxtolong(str,len,base) qse_mbsxtolong(str,len,base)
 | 
			
		||||
#	define qse_strxtouint(str,len,base) qse_mbsxtouint(str,len,base)
 | 
			
		||||
#	define qse_strxtoulong(str,len,base) qse_mbsxtoulong(str,len,base)
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#	define qse_strtoi(str,base) qse_wcstoi(str,base)
 | 
			
		||||
#	define qse_strtol(str,base) qse_wcstol(str,base)
 | 
			
		||||
#	define qse_strtoui(str,base) qse_wcstoui(str,base)
 | 
			
		||||
#	define qse_strtoul(str,base) qse_wcstoul(str,base)
 | 
			
		||||
 | 
			
		||||
#	define qse_strxtoi(str,len,base) qse_wcsxtoi(str,len,base)
 | 
			
		||||
#	define qse_strxtol(str,len,base) qse_wcsxtol(str,len,base)
 | 
			
		||||
#	define qse_strxtoui(str,len,base) qse_wcsxtoui(str,len,base)
 | 
			
		||||
#	define qse_strxtoul(str,len,base) qse_wcsxtoul(str,len,base)
 | 
			
		||||
 | 
			
		||||
#	define qse_strtoint(str,base) qse_wcstoint(str,base)
 | 
			
		||||
#	define qse_strtolong(str,base) qse_wcstolong(str,base)
 | 
			
		||||
#	define qse_strtouint(str,base) qse_wcstouint(str,base)
 | 
			
		||||
#	define qse_strtoulong(str,base) qse_wcstoulong(str,base)
 | 
			
		||||
 | 
			
		||||
#	define qse_strxtoint(str,len,base) qse_wcsxtoint(str,len,base)
 | 
			
		||||
#	define qse_strxtolong(str,len,base) qse_wcsxtolong(str,len,base)
 | 
			
		||||
#	define qse_strxtouint(str,len,base) qse_wcsxtouint(str,len,base)
 | 
			
		||||
#	define qse_strxtoulong(str,len,base) qse_wcsxtoulong(str,len,base)
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT int qse_mbshextobin (
 | 
			
		||||
	const qse_mchar_t* hex,
 | 
			
		||||
	qse_size_t         hexlen,
 | 
			
		||||
	qse_uint8_t*       buf,
 | 
			
		||||
	qse_size_t         buflen
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT int qse_wcshextobin (
 | 
			
		||||
	const qse_wchar_t* hex,
 | 
			
		||||
	qse_size_t         hexlen,
 | 
			
		||||
	qse_uint8_t*       buf,
 | 
			
		||||
	qse_size_t         buflen
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
#if defined(QSE_CHAR_IS_MCHAR)
 | 
			
		||||
#	define qse_strhextobin(hex,hexlen,buf,buflen) qse_mbshextobin(hex,hexlen,buf,buflen)
 | 
			
		||||
#else
 | 
			
		||||
#	define qse_strhextobin(hex,hexlen,buf,buflen) qse_wcshextobin(hex,hexlen,buf,buflen)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
QSE_EXPORT qse_size_t qse_mbsdel (
 | 
			
		||||
	qse_mchar_t* str, 
 | 
			
		||||
	qse_size_t   pos,
 | 
			
		||||
 | 
			
		||||
@ -526,7 +526,7 @@ int qse_memcmp (const void* s1, const void* s2, qse_size_t n)
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void* qse_memchr (const void* s, int val, qse_size_t n)
 | 
			
		||||
void* qse_membyte (const void* s, int val, qse_size_t n)
 | 
			
		||||
{
 | 
			
		||||
	const qse_byte_t* x = (const qse_byte_t*)s;
 | 
			
		||||
 | 
			
		||||
@ -539,7 +539,7 @@ void* qse_memchr (const void* s, int val, qse_size_t n)
 | 
			
		||||
	return QSE_NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void* qse_memrchr (const void* s, int val, qse_size_t n)
 | 
			
		||||
void* qse_memrbyte (const void* s, int val, qse_size_t n)
 | 
			
		||||
{
 | 
			
		||||
	const qse_byte_t* x = (qse_byte_t*)s + n - 1;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -23,6 +23,8 @@
 | 
			
		||||
 | 
			
		||||
#include <qse/cmn/mem.h>
 | 
			
		||||
 | 
			
		||||
#define MINIMIZE_PLATFORM_DEPENDENCY
 | 
			
		||||
 | 
			
		||||
#ifdef MINIMIZE_PLATFORM_DEPENDENCY
 | 
			
		||||
#	define QSE_MEMCPY(dst,src,len)  qse_memcpy(dst,src,len)
 | 
			
		||||
#	define QSE_MEMMOVE(dst,src,len) qse_memmove(dst,src,len)
 | 
			
		||||
 | 
			
		||||
@ -21,6 +21,7 @@
 | 
			
		||||
#include <qse/cmn/nwif.h>
 | 
			
		||||
#include <qse/cmn/str.h>
 | 
			
		||||
#include <qse/cmn/mbwc.h>
 | 
			
		||||
#include <qse/cmn/sio.h>
 | 
			
		||||
#include "mem.h"
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
@ -286,24 +287,81 @@ void qse_freenwifcfg (qse_nwifcfg_t* cfg)
 | 
			
		||||
#if defined(__linux)
 | 
			
		||||
static void read_proc_net_if_inet6 (qse_nwifcfg_t* cfg, struct ifreq* ifr)
 | 
			
		||||
{
 | 
			
		||||
#if 0
 | 
			
		||||
	/*
 | 
			
		||||
     *
 | 
			
		||||
	 * # cat /proc/net/if_inet6
 | 
			
		||||
	 * 00000000000000000000000000000001 01 80 10 80 lo
 | 
			
		||||
	 * +------------------------------+ ++ ++ ++ ++ ++
 | 
			
		||||
	 * |                                |  |  |  |  |
 | 
			
		||||
	 * 1                                2  3  4  5  6
 | 
			
		||||
	 * 
 | 
			
		||||
	 * 1. IPv6 address displayed in 32 hexadecimal chars without colons as separator
 | 
			
		||||
	 * 2. Netlink device number (interface index) in hexadecimal (see “ip addr” , too)
 | 
			
		||||
	 * 3. Prefix length in hexadecimal
 | 
			
		||||
	 * 4. Scope value (see kernel source “ include/net/ipv6.h” and “net/ipv6/addrconf.c” for more)
 | 
			
		||||
	 * 5. Interface flags (see “include/linux/rtnetlink.h” and “net/ipv6/addrconf.c” for more)
 | 
			
		||||
	 * 6. Device name
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	qse_sio_t* sio;
 | 
			
		||||
	qse_mchar_t line[128];
 | 
			
		||||
	qse_mchar_t* ptr, * ptr2;
 | 
			
		||||
	qse_ssize_t len;
 | 
			
		||||
	qse_mcstr_t tok[6];
 | 
			
		||||
	int count, index;
 | 
			
		||||
 | 
			
		||||
	/* TODO */
 | 
			
		||||
 | 
			
		||||
	sio = qse_sio_open (QSE_MMGR_GETDFL(), 0, 
 | 
			
		||||
		QSE_T("proc/net/if_inet6"), QSE_SIO_IGNOREMBWCERR | QSE_SIO_READ); 
 | 
			
		||||
		QSE_T("/proc/net/if_inet6"), QSE_SIO_IGNOREMBWCERR | QSE_SIO_READ); 
 | 
			
		||||
	if (sio)
 | 
			
		||||
	{
 | 
			
		||||
		qse_ssize_t x;
 | 
			
		||||
		
 | 
			
		||||
		while (1)
 | 
			
		||||
		{
 | 
			
		||||
			x = qse_sio_getmbs (sio, line, QSE_COUNTOF(line));
 | 
			
		||||
			if (x == -1) break;
 | 
			
		||||
			len = qse_sio_getmbs (sio, line, QSE_COUNTOF(line));
 | 
			
		||||
			if (len <= 0) break;
 | 
			
		||||
 | 
			
		||||
			count = 0;
 | 
			
		||||
			ptr = line;
 | 
			
		||||
 | 
			
		||||
			while (ptr && count < 6)
 | 
			
		||||
			{
 | 
			
		||||
				ptr2 = qse_mbsxtok (ptr, len, QSE_MT(" \t"), &tok[count]);
 | 
			
		||||
 | 
			
		||||
				len -= ptr2 - ptr;
 | 
			
		||||
				ptr = ptr2;
 | 
			
		||||
				count++;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (count >= 6)
 | 
			
		||||
			{
 | 
			
		||||
				index = qse_mbsxtoi (tok[1].ptr, tok[1].len, 16);
 | 
			
		||||
				if (index == cfg->index)
 | 
			
		||||
				{
 | 
			
		||||
					int ti;
 | 
			
		||||
 | 
			
		||||
					if (qse_mbshextobin (tok[0].ptr, tok[0].len, cfg->addr.u.in6.addr.value, QSE_COUNTOF(cfg->addr.u.in6.addr.value)) <= -1) break;
 | 
			
		||||
 | 
			
		||||
					/* tok[3] is the scope type, not the actual scope. 
 | 
			
		||||
					 * i leave this code for reference only.
 | 
			
		||||
					cfg->addr.u.in6.scope = qse_mbsxtoi (tok[3].ptr, tok[3].len, 16); */
 | 
			
		||||
			
 | 
			
		||||
 | 
			
		||||
					cfg->addr.type = QSE_NWAD_IN6;
 | 
			
		||||
 | 
			
		||||
					ti = qse_mbsxtoi (tok[2].ptr, tok[0].len, 16);
 | 
			
		||||
					qse_prefixtoip6ad (ti, &cfg->mask.u.in6.addr);
 | 
			
		||||
 | 
			
		||||
					cfg->mask.type = QSE_NWAD_IN6;
 | 
			
		||||
					goto done;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	done:
 | 
			
		||||
		qse_sio_close (sio);
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -385,7 +443,7 @@ static int get_nwifcfg (int s, qse_nwifcfg_t* cfg, struct ifreq* ifr)
 | 
			
		||||
	qse_size_t ml, wl;
 | 
			
		||||
	
 | 
			
		||||
	#if defined(SIOCGIFINDEX)
 | 
			
		||||
	if (ioctl (s, SIOCGIFINDEX, ifr) <= -1) return -1;		
 | 
			
		||||
	if (ioctl (s, SIOCGIFINDEX, ifr) <= -1) return -1;
 | 
			
		||||
	#if defined(HAVE_STRUCT_IFREQ_IFR_IFINDEX)
 | 
			
		||||
	cfg->index = ifr->ifr_ifindex;
 | 
			
		||||
	#else
 | 
			
		||||
@ -497,12 +555,14 @@ static int get_nwifcfg (int s, qse_nwifcfg_t* cfg, struct ifreq* ifr)
 | 
			
		||||
#elif defined(SIOCGIFADDR)
 | 
			
		||||
 | 
			
		||||
	#if defined(SIOCGIFINDEX)
 | 
			
		||||
	if (ioctl (s, SIOCGIFINDEX, ifr) <= -1) return -1;		
 | 
			
		||||
	if (ioctl (s, SIOCGIFINDEX, ifr) <= -1) return -1;
 | 
			
		||||
 | 
			
		||||
	#if defined(HAVE_STRUCT_IFREQ_IFR_IFINDEX)
 | 
			
		||||
	cfg->index = ifr->ifr_ifindex;
 | 
			
		||||
	#else
 | 
			
		||||
	cfg->index = ifr->ifr_index;
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	#else
 | 
			
		||||
	cfg->index = 0;
 | 
			
		||||
	#endif
 | 
			
		||||
@ -537,13 +597,12 @@ static int get_nwifcfg (int s, qse_nwifcfg_t* cfg, struct ifreq* ifr)
 | 
			
		||||
		qse_skadtonwad (&ifr->ifr_addr, &cfg->mask);
 | 
			
		||||
 | 
			
		||||
	#if defined(__linux)
 | 
			
		||||
	if (cfg->addr.type == QSE_NWAD_NX && cfg->mask.type == QSE_NWAD_NX)
 | 
			
		||||
	if (cfg->addr.type == QSE_NWAD_NX && cfg->mask.type == QSE_NWAD_NX && cfg->type == QSE_NWIFCFG_IN6)
 | 
			
		||||
	{
 | 
			
		||||
		/* access /proc/net/if_inet6 */
 | 
			
		||||
		read_proc_net_if_inet6 (cfg, ifr);
 | 
			
		||||
	}
 | 
			
		||||
	#endif
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
	if ((cfg->flags & QSE_NWIFCFG_BCAST) &&
 | 
			
		||||
	    ioctl (s, SIOCGIFBRDADDR, ifr) >= 0)
 | 
			
		||||
 | 
			
		||||
@ -22,120 +22,241 @@
 | 
			
		||||
#include <qse/cmn/chr.h>
 | 
			
		||||
#include "mem.h"
 | 
			
		||||
 | 
			
		||||
int qse_strtoi (const qse_char_t* str)
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------
 | 
			
		||||
 * multi-byte string to number conversion 
 | 
			
		||||
 *---------------------------------------------------------------*/
 | 
			
		||||
int qse_mbstoi (const qse_mchar_t* mbs, int base)
 | 
			
		||||
{
 | 
			
		||||
	int v;
 | 
			
		||||
	QSE_STRTONUM (v, str, QSE_NULL, 10);
 | 
			
		||||
	QSE_MBSTONUM (v, mbs, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
long qse_strtol (const qse_char_t* str)
 | 
			
		||||
long qse_mbstol (const qse_mchar_t* mbs, int base)
 | 
			
		||||
{
 | 
			
		||||
	long v;
 | 
			
		||||
	QSE_STRTONUM (v, str, QSE_NULL, 10);
 | 
			
		||||
	QSE_MBSTONUM (v, mbs, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned int qse_strtoui (const qse_char_t* str)
 | 
			
		||||
unsigned int qse_mbstoui (const qse_mchar_t* mbs, int base)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int v;
 | 
			
		||||
	QSE_STRTONUM (v, str, QSE_NULL, 10);
 | 
			
		||||
	QSE_MBSTONUM (v, mbs, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned long qse_strtoul (const qse_char_t* str)
 | 
			
		||||
unsigned long qse_mbstoul (const qse_mchar_t* mbs, int base)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long v;
 | 
			
		||||
	QSE_STRTONUM (v, str, QSE_NULL, 10);
 | 
			
		||||
	QSE_MBSTONUM (v, mbs, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int qse_strxtoi (const qse_char_t* str, qse_size_t len)
 | 
			
		||||
int qse_mbsxtoi (const qse_mchar_t* mbs, qse_size_t len, int base)
 | 
			
		||||
{
 | 
			
		||||
	int v;
 | 
			
		||||
	QSE_STRXTONUM (v, str, len, QSE_NULL, 10);
 | 
			
		||||
	QSE_MBSXTONUM (v, mbs, len, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
long qse_strxtol (const qse_char_t* str, qse_size_t len)
 | 
			
		||||
long qse_mbsxtol (const qse_mchar_t* mbs, qse_size_t len, int base)
 | 
			
		||||
{
 | 
			
		||||
	long v;
 | 
			
		||||
	QSE_STRXTONUM (v, str, len, QSE_NULL, 10);
 | 
			
		||||
	QSE_MBSXTONUM (v, mbs, len, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned int qse_strxtoui (const qse_char_t* str, qse_size_t len)
 | 
			
		||||
unsigned int qse_mbsxtoui (const qse_mchar_t* mbs, qse_size_t len, int base)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int v;
 | 
			
		||||
	QSE_STRXTONUM (v, str, len, QSE_NULL, 10);
 | 
			
		||||
	QSE_MBSXTONUM (v, mbs, len, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned long qse_strxtoul (const qse_char_t* str, qse_size_t len)
 | 
			
		||||
unsigned long qse_mbsxtoul (const qse_mchar_t* mbs, qse_size_t len, int base)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long v;
 | 
			
		||||
	QSE_STRXTONUM (v, str, len, QSE_NULL, 10);
 | 
			
		||||
	QSE_MBSXTONUM (v, mbs, len, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
qse_int_t qse_strtoint (const qse_char_t* str)
 | 
			
		||||
qse_int_t qse_mbstoint (const qse_mchar_t* mbs, int base)
 | 
			
		||||
{
 | 
			
		||||
	qse_int_t v;
 | 
			
		||||
	QSE_STRTONUM (v, str, QSE_NULL, 10);
 | 
			
		||||
	QSE_MBSTONUM (v, mbs, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
qse_long_t qse_strtolong (const qse_char_t* str)
 | 
			
		||||
qse_long_t qse_mbstolong (const qse_mchar_t* mbs, int base)
 | 
			
		||||
{
 | 
			
		||||
	qse_long_t v;
 | 
			
		||||
	QSE_STRTONUM (v, str, QSE_NULL, 10);
 | 
			
		||||
	QSE_MBSTONUM (v, mbs, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
qse_uint_t qse_strtouint (const qse_char_t* str)
 | 
			
		||||
qse_uint_t qse_mbstouint (const qse_mchar_t* mbs, int base)
 | 
			
		||||
{
 | 
			
		||||
	qse_uint_t v;
 | 
			
		||||
	QSE_STRTONUM (v, str, QSE_NULL, 10);
 | 
			
		||||
	QSE_MBSTONUM (v, mbs, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
qse_ulong_t qse_strtoulong (const qse_char_t* str)
 | 
			
		||||
qse_ulong_t qse_mbstoulong (const qse_mchar_t* mbs, int base)
 | 
			
		||||
{
 | 
			
		||||
	qse_ulong_t v;
 | 
			
		||||
	QSE_STRTONUM (v, str, QSE_NULL, 10);
 | 
			
		||||
	QSE_MBSTONUM (v, mbs, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
qse_int_t qse_strxtoint (const qse_char_t* str, qse_size_t len)
 | 
			
		||||
qse_int_t qse_mbsxtoint (const qse_mchar_t* mbs, qse_size_t len, int base)
 | 
			
		||||
{
 | 
			
		||||
	qse_int_t v;
 | 
			
		||||
	QSE_STRXTONUM (v, str, len, QSE_NULL, 10);
 | 
			
		||||
	QSE_MBSXTONUM (v, mbs, len, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
qse_long_t qse_strxtolong (const qse_char_t* str, qse_size_t len)
 | 
			
		||||
qse_long_t qse_mbsxtolong (const qse_mchar_t* mbs, qse_size_t len, int base)
 | 
			
		||||
{
 | 
			
		||||
	qse_long_t v;
 | 
			
		||||
	QSE_STRXTONUM (v, str, len, QSE_NULL, 10);
 | 
			
		||||
	QSE_MBSXTONUM (v, mbs, len, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
qse_uint_t qse_strxtouint (const qse_char_t* str, qse_size_t len)
 | 
			
		||||
qse_uint_t qse_mbsxtouint (const qse_mchar_t* mbs, qse_size_t len, int base)
 | 
			
		||||
{
 | 
			
		||||
	qse_uint_t v;
 | 
			
		||||
	QSE_STRXTONUM (v, str, len, QSE_NULL, 10);
 | 
			
		||||
	QSE_MBSXTONUM (v, mbs, len, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
qse_ulong_t qse_strxtoulong (const qse_char_t* str, qse_size_t len)
 | 
			
		||||
qse_ulong_t qse_mbsxtoulong (const qse_mchar_t* mbs, qse_size_t len, int base)
 | 
			
		||||
{
 | 
			
		||||
	qse_ulong_t v;
 | 
			
		||||
	QSE_STRXTONUM (v, str, len, QSE_NULL, 10);
 | 
			
		||||
	QSE_MBSXTONUM (v, mbs, len, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* case conversion */
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------
 | 
			
		||||
 * wide string to number conversion 
 | 
			
		||||
 *---------------------------------------------------------------*/
 | 
			
		||||
int qse_wcstoi (const qse_wchar_t* wcs, int base)
 | 
			
		||||
{
 | 
			
		||||
	int v;
 | 
			
		||||
	QSE_WCSTONUM (v, wcs, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
long qse_wcstol (const qse_wchar_t* wcs, int base)
 | 
			
		||||
{
 | 
			
		||||
	long v;
 | 
			
		||||
	QSE_WCSTONUM (v, wcs, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned int qse_wcstoui (const qse_wchar_t* wcs, int base)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int v;
 | 
			
		||||
	QSE_WCSTONUM (v, wcs, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned long qse_wcstoul (const qse_wchar_t* wcs, int base)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long v;
 | 
			
		||||
	QSE_WCSTONUM (v, wcs, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int qse_wcsxtoi (const qse_wchar_t* wcs, qse_size_t len, int base)
 | 
			
		||||
{
 | 
			
		||||
	int v;
 | 
			
		||||
	QSE_WCSXTONUM (v, wcs, len, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
long qse_wcsxtol (const qse_wchar_t* wcs, qse_size_t len, int base)
 | 
			
		||||
{
 | 
			
		||||
	long v;
 | 
			
		||||
	QSE_WCSXTONUM (v, wcs, len, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned int qse_wcsxtoui (const qse_wchar_t* wcs, qse_size_t len, int base)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int v;
 | 
			
		||||
	QSE_WCSXTONUM (v, wcs, len, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned long qse_wcsxtoul (const qse_wchar_t* wcs, qse_size_t len, int base)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long v;
 | 
			
		||||
	QSE_WCSXTONUM (v, wcs, len, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
qse_int_t qse_wcstoint (const qse_wchar_t* wcs, int base)
 | 
			
		||||
{
 | 
			
		||||
	qse_int_t v;
 | 
			
		||||
	QSE_WCSTONUM (v, wcs, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
qse_long_t qse_wcstolong (const qse_wchar_t* wcs, int base)
 | 
			
		||||
{
 | 
			
		||||
	qse_long_t v;
 | 
			
		||||
	QSE_WCSTONUM (v, wcs, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
qse_uint_t qse_wcstouint (const qse_wchar_t* wcs, int base)
 | 
			
		||||
{
 | 
			
		||||
	qse_uint_t v;
 | 
			
		||||
	QSE_WCSTONUM (v, wcs, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
qse_ulong_t qse_wcstoulong (const qse_wchar_t* wcs, int base)
 | 
			
		||||
{
 | 
			
		||||
	qse_ulong_t v;
 | 
			
		||||
	QSE_WCSTONUM (v, wcs, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
qse_int_t qse_wcsxtoint (const qse_wchar_t* wcs, qse_size_t len, int base)
 | 
			
		||||
{
 | 
			
		||||
	qse_int_t v;
 | 
			
		||||
	QSE_WCSXTONUM (v, wcs, len, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
qse_long_t qse_wcsxtolong (const qse_wchar_t* wcs, qse_size_t len, int base)
 | 
			
		||||
{
 | 
			
		||||
	qse_long_t v;
 | 
			
		||||
	QSE_WCSXTONUM (v, wcs, len, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
qse_uint_t qse_wcsxtouint (const qse_wchar_t* wcs, qse_size_t len, int base)
 | 
			
		||||
{
 | 
			
		||||
	qse_uint_t v;
 | 
			
		||||
	QSE_WCSXTONUM (v, wcs, len, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
qse_ulong_t qse_wcsxtoulong (const qse_wchar_t* wcs, qse_size_t len, int base)
 | 
			
		||||
{
 | 
			
		||||
	qse_ulong_t v;
 | 
			
		||||
	QSE_WCSXTONUM (v, wcs, len, QSE_NULL, base);
 | 
			
		||||
	return v;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------
 | 
			
		||||
 * case conversion
 | 
			
		||||
 *---------------------------------------------------------------*/
 | 
			
		||||
qse_size_t qse_mbslwr (qse_mchar_t* str)
 | 
			
		||||
{
 | 
			
		||||
	qse_mchar_t* p = str;
 | 
			
		||||
@ -163,3 +284,76 @@ qse_size_t qse_wcsupr (qse_wchar_t* str)
 | 
			
		||||
	for (p = str; *p != QSE_WT('\0'); p++) *p = QSE_TOWUPPER (*p);
 | 
			
		||||
	return p - str;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*---------------------------------------------------------------
 | 
			
		||||
 * Hexadecimal string conversion
 | 
			
		||||
 *---------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
int qse_mbshextobin (const qse_mchar_t* hex, qse_size_t hexlen, qse_uint8_t* buf, qse_size_t buflen)
 | 
			
		||||
{
 | 
			
		||||
	const qse_mchar_t* end = hex + hexlen;
 | 
			
		||||
	qse_size_t bi = 0;
 | 
			
		||||
 | 
			
		||||
	while (hex < end && bi < buflen)
 | 
			
		||||
	{
 | 
			
		||||
		int v;
 | 
			
		||||
 | 
			
		||||
		if (*hex >= QSE_MT('0') && *hex <= QSE_MT('9')) v = *hex - QSE_MT('0');
 | 
			
		||||
		else if (*hex >= QSE_MT('a') && *hex <= QSE_MT('f')) v = *hex - QSE_MT('a') + 10;
 | 
			
		||||
		else if (*hex >= QSE_MT('A') && *hex <= QSE_MT('F')) v = *hex - QSE_MT('A') + 10;
 | 
			
		||||
		else return -1;
 | 
			
		||||
 | 
			
		||||
		buf[bi] = buf[bi] * 16 + v;
 | 
			
		||||
 | 
			
		||||
		hex++;
 | 
			
		||||
		if (hex >= end) return -1;
 | 
			
		||||
 | 
			
		||||
		if (*hex >= QSE_MT('0') && *hex <= QSE_MT('9')) v = *hex - QSE_MT('0');
 | 
			
		||||
		else if (*hex >= QSE_MT('a') && *hex <= QSE_MT('f')) v = *hex - QSE_MT('a') + 10;
 | 
			
		||||
		else if (*hex >= QSE_MT('A') && *hex <= QSE_MT('F')) v = *hex - QSE_MT('A') + 10;
 | 
			
		||||
		else return -1;
 | 
			
		||||
 | 
			
		||||
		buf[bi] = buf[bi] * 16 + v;
 | 
			
		||||
 | 
			
		||||
		hex++;
 | 
			
		||||
		bi++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int qse_wcshextobin (const qse_wchar_t* hex, qse_size_t hexlen, qse_uint8_t* buf, qse_size_t buflen)
 | 
			
		||||
{
 | 
			
		||||
	const qse_wchar_t* end = hex + hexlen;
 | 
			
		||||
	qse_size_t bi = 0;
 | 
			
		||||
 | 
			
		||||
	while (hex < end && bi < buflen)
 | 
			
		||||
	{
 | 
			
		||||
		int v;
 | 
			
		||||
 | 
			
		||||
		if (*hex >= QSE_WT('0') && *hex <= QSE_WT('9')) v = *hex - QSE_WT('0');
 | 
			
		||||
		else if (*hex >= QSE_WT('a') && *hex <= QSE_WT('f')) v = *hex - QSE_WT('a') + 10;
 | 
			
		||||
		else if (*hex >= QSE_WT('A') && *hex <= QSE_WT('F')) v = *hex - QSE_WT('A') + 10;
 | 
			
		||||
		else return -1;
 | 
			
		||||
 | 
			
		||||
		buf[bi] = buf[bi] * 16 + v;
 | 
			
		||||
 | 
			
		||||
		hex++;
 | 
			
		||||
		if (hex >= end) return -1;
 | 
			
		||||
 | 
			
		||||
		if (*hex >= QSE_WT('0') && *hex <= QSE_WT('9')) v = *hex - QSE_WT('0');
 | 
			
		||||
		else if (*hex >= QSE_WT('a') && *hex <= QSE_WT('f')) v = *hex - QSE_WT('a') + 10;
 | 
			
		||||
		else if (*hex >= QSE_WT('A') && *hex <= QSE_WT('F')) v = *hex - QSE_WT('A') + 10;
 | 
			
		||||
		else return -1;
 | 
			
		||||
 | 
			
		||||
		buf[bi] = buf[bi] * 16 + v;
 | 
			
		||||
 | 
			
		||||
		hex++;
 | 
			
		||||
		bi++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,7 @@
 | 
			
		||||
 | 
			
		||||
#include "awk00.h"
 | 
			
		||||
#include <qse/cmn/mbwc.h>
 | 
			
		||||
#include <qse/cmn/fmt.h>
 | 
			
		||||
 | 
			
		||||
#include <locale.h>
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
@ -20,7 +21,8 @@ void init_awk_sample_locale (void)
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		sprintf (locale, ".%u", (unsigned int)codepage);
 | 
			
		||||
		qse_fmtuintmaxtombs (locale, QSE_COUNTOF(locale),
 | 
			
		||||
			codepage, 10, -1, QSE_MT('\0'), QSE_MT("."));
 | 
			
		||||
		setlocale (LC_ALL, locale);
 | 
			
		||||
		qse_setdflcmgrbyid (QSE_CMGR_SLMB);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,10 @@
 | 
			
		||||
#include <qse/cmn/nwif.h>
 | 
			
		||||
#include <qse/cmn/mbwc.h>
 | 
			
		||||
#include <qse/cmn/main.h>
 | 
			
		||||
#include <qse/cmn/stdio.h>
 | 
			
		||||
#include <qse/cmn/mem.h>
 | 
			
		||||
#include <qse/cmn/str.h>
 | 
			
		||||
#include <qse/cmn/sio.h>
 | 
			
		||||
#include <qse/cmn/fmt.h>
 | 
			
		||||
 | 
			
		||||
#include <locale.h>
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
@ -66,6 +67,8 @@ static int test_main (int argc, qse_char_t* argv[])
 | 
			
		||||
 | 
			
		||||
int qse_main (int argc, qse_achar_t* argv[])
 | 
			
		||||
{
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
	char locale[100];
 | 
			
		||||
	UINT codepage = GetConsoleOutputCP();	
 | 
			
		||||
@ -76,14 +79,19 @@ int qse_main (int argc, qse_achar_t* argv[])
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
     	sprintf (locale, ".%u", (unsigned int)codepage);
 | 
			
		||||
     	setlocale (LC_ALL, locale);
 | 
			
		||||
		qse_fmtuintmaxtombs (locale, QSE_COUNTOF(locale),
 | 
			
		||||
			codepage, 10, -1, QSE_MT('\0'), QSE_MT("."));
 | 
			
		||||
		setlocale (LC_ALL, locale);
 | 
			
		||||
		qse_setdflcmgrbyid (QSE_CMGR_SLMB);
 | 
			
		||||
	}
 | 
			
		||||
#else
 | 
			
		||||
     setlocale (LC_ALL, "");
 | 
			
		||||
	setlocale (LC_ALL, "");
 | 
			
		||||
	qse_setdflcmgrbyid (QSE_CMGR_SLMB);
 | 
			
		||||
#endif
 | 
			
		||||
     return qse_runmain (argc, argv, test_main);
 | 
			
		||||
	qse_openstdsios ();
 | 
			
		||||
	ret =  qse_runmain (argc, argv, test_main);
 | 
			
		||||
	qse_closestdsios ();
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,10 @@
 | 
			
		||||
#include <qse/cmn/nwif.h>
 | 
			
		||||
#include <qse/cmn/mbwc.h>
 | 
			
		||||
#include <qse/cmn/main.h>
 | 
			
		||||
#include <qse/cmn/stdio.h>
 | 
			
		||||
#include <qse/cmn/sio.h>
 | 
			
		||||
#include <qse/cmn/mem.h>
 | 
			
		||||
#include <qse/cmn/str.h>
 | 
			
		||||
#include <qse/cmn/fmt.h>
 | 
			
		||||
 | 
			
		||||
#include <locale.h>
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
@ -78,6 +79,8 @@ static int test_main (int argc, qse_char_t* argv[])
 | 
			
		||||
 | 
			
		||||
int qse_main (int argc, qse_achar_t* argv[])
 | 
			
		||||
{
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
	char locale[100];
 | 
			
		||||
	UINT codepage = GetConsoleOutputCP();	
 | 
			
		||||
@ -88,14 +91,19 @@ int qse_main (int argc, qse_achar_t* argv[])
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
     	sprintf (locale, ".%u", (unsigned int)codepage);
 | 
			
		||||
     	setlocale (LC_ALL, locale);
 | 
			
		||||
		qse_fmtuintmaxtombs (locale, QSE_COUNTOF(locale),
 | 
			
		||||
			codepage, 10, -1, QSE_MT('\0'), QSE_MT("."));
 | 
			
		||||
		setlocale (LC_ALL, locale);
 | 
			
		||||
		qse_setdflcmgrbyid (QSE_CMGR_SLMB);
 | 
			
		||||
	}
 | 
			
		||||
#else
 | 
			
		||||
     setlocale (LC_ALL, "");
 | 
			
		||||
	setlocale (LC_ALL, "");
 | 
			
		||||
	qse_setdflcmgrbyid (QSE_CMGR_SLMB);
 | 
			
		||||
#endif
 | 
			
		||||
     return qse_runmain (argc, argv, test_main);
 | 
			
		||||
	qse_openstdsios ();
 | 
			
		||||
	ret = qse_runmain (argc, argv, test_main);
 | 
			
		||||
	qse_closestdsios ();
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,7 @@
 | 
			
		||||
 | 
			
		||||
#include "sed00.h"
 | 
			
		||||
#include <qse/cmn/mbwc.h>
 | 
			
		||||
#include <qse/cmn/fmt.h>
 | 
			
		||||
 | 
			
		||||
#include <locale.h>
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
@ -20,7 +21,8 @@ void init_sed_sample_locale (void)
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		sprintf (locale, ".%u", (unsigned int)codepage);
 | 
			
		||||
		qse_fmtuintmaxtombs (locale, QSE_COUNTOF(locale),
 | 
			
		||||
			codepage, 10, -1, QSE_MT('\0'), QSE_MT("."));
 | 
			
		||||
		setlocale (LC_ALL, locale);
 | 
			
		||||
		qse_setdflcmgrbyid (QSE_CMGR_SLMB);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user