added a primitive dictionary file loader. needs more work

This commit is contained in:
2017-12-13 08:21:13 +00:00
parent f9970ef086
commit 61483e294a
6 changed files with 731 additions and 1010 deletions

View File

@ -170,6 +170,7 @@ typedef qse_wchar_t* (*qse_wcssubst_t) (
#define QSE_STRTONUM(value,nptr,endptr,base) do {\
int __ston_f = 0, __ston_v; \
const qse_char_t* __ston_ptr = nptr; \
int __ston_base = base; \
for (;;) { \
qse_char_t __ston_c = *__ston_ptr; \
if (__ston_c == QSE_T(' ') || \
@ -178,8 +179,15 @@ typedef qse_wchar_t* (*qse_wcssubst_t) (
else if (__ston_c == QSE_T('+')) { __ston_ptr++; } \
break; \
} \
for (value = 0; (__ston_v = QSE_CHARTONUM(*__ston_ptr, base)) < base; __ston_ptr++) { \
value = value * base + __ston_v; \
if (base == 0) { \
if (*__ston_ptr == QSE_T('0')) { \
if (*(__ston_ptr + 1) == QSE_T('x') || *(__ston_ptr + 1) == QSE_T('X')) { __ston_base = 16; __ston_ptr += 2; } \
else { __ston_base = 8; __ston_ptr++; } \
} \
else __ston_base = 10; \
} \
for (value = 0; (__ston_v = QSE_CHARTONUM(*__ston_ptr, __ston_base)) < __ston_base; __ston_ptr++) { \
value = value * __ston_base + __ston_v; \
} \
if (endptr) *((const qse_char_t**)endptr) = __ston_ptr; \
if (__ston_f > 0) value *= -1; \
@ -190,7 +198,7 @@ typedef qse_wchar_t* (*qse_wcssubst_t) (
int __ston_f = 0, __ston_v; \
const qse_char_t* __ston_ptr = nptr; \
const qse_char_t* __ston_end = __ston_ptr + len; \
value = 0; \
int __ston_base = base; \
while (__ston_ptr < __ston_end) { \
qse_char_t __ston_c = *__ston_ptr; \
if (__ston_c == QSE_T(' ') || __ston_c == QSE_T('\t')) { \
@ -200,9 +208,15 @@ typedef qse_wchar_t* (*qse_wcssubst_t) (
else if (__ston_c == QSE_T('+')) { __ston_ptr++; } \
break; \
} \
for (value = 0; __ston_ptr < __ston_end && \
(__ston_v = QSE_CHARTONUM(*__ston_ptr, base)) != base; __ston_ptr++) { \
value = value * base + __ston_v; \
if (base == 0) { \
if (__ston_ptr < __ston_end && *__ston_ptr == QSE_T('0')) { \
if ((__ston_ptr < __ston_end - 1) && (*(__ston_ptr + 1) == QSE_T('x') || *(__ston_ptr + 1) == QSE_T('X'))) { __ston_base = 16; __ston_ptr += 2; } \
else { __ston_base = 8; __ston_ptr++; } \
} \
else __ston_base = 10; \
} \
for (value = 0; __ston_ptr < __ston_end && (__ston_v = QSE_CHARTONUM(*__ston_ptr, __ston_base)) != __ston_base; __ston_ptr++) { \
value = value * __ston_base + __ston_v; \
} \
if (endptr) *((const qse_char_t**)endptr) = __ston_ptr; \
if (__ston_f > 0) value *= -1; \
@ -218,6 +232,7 @@ typedef qse_wchar_t* (*qse_wcssubst_t) (
#define QSE_MBSTONUM(value,nptr,endptr,base) do {\
int __ston_f = 0, __ston_v; \
const qse_mchar_t* __ston_ptr = nptr; \
int __ston_base = base; \
for (;;) { \
qse_mchar_t __ston_c = *__ston_ptr; \
if (__ston_c == QSE_MT(' ') || \
@ -226,8 +241,15 @@ typedef qse_wchar_t* (*qse_wcssubst_t) (
else if (__ston_c == QSE_MT('+')) { __ston_ptr++; } \
break; \
} \
for (value = 0; (__ston_v = QSE_MCHARTONUM(*__ston_ptr, base)) < base; __ston_ptr++) { \
value = value * base + __ston_v; \
if (base == 0) { \
if (*__ston_ptr == QSE_MT('0')) { \
if (*(__ston_ptr + 1) == QSE_MT('x') || *(__ston_ptr + 1) == QSE_MT('X')) { __ston_base = 16; __ston_ptr += 2; } \
else { __ston_base = 8; __ston_ptr++; } \
} \
else __ston_base = 10; \
} \
for (value = 0; (__ston_v = QSE_MCHARTONUM(*__ston_ptr, __ston_base)) < __ston_base; __ston_ptr++) { \
value = value * __ston_base + __ston_v; \
} \
if (endptr) *((const qse_mchar_t**)endptr) = __ston_ptr; \
if (__ston_f > 0) value *= -1; \
@ -238,7 +260,7 @@ typedef qse_wchar_t* (*qse_wcssubst_t) (
int __ston_f = 0, __ston_v; \
const qse_mchar_t* __ston_ptr = nptr; \
const qse_mchar_t* __ston_end = __ston_ptr + len; \
value = 0; \
int __ston_base = base; \
while (__ston_ptr < __ston_end) { \
qse_mchar_t __ston_c = *__ston_ptr; \
if (__ston_c == QSE_MT(' ') || __ston_c == QSE_MT('\t')) { \
@ -248,9 +270,15 @@ typedef qse_wchar_t* (*qse_wcssubst_t) (
else if (__ston_c == QSE_MT('+')) { __ston_ptr++; } \
break; \
} \
for (value = 0; __ston_ptr < __ston_end && \
(__ston_v = QSE_MCHARTONUM(*__ston_ptr, base)) != base; __ston_ptr++) { \
value = value * base + __ston_v; \
if (base == 0) { \
if (__ston_ptr < __ston_end && *__ston_ptr == QSE_MT('0')) { \
if ((__ston_ptr < __ston_end - 1) && (*(__ston_ptr + 1) == QSE_MT('x') || *(__ston_ptr + 1) == QSE_MT('X'))) { __ston_base = 16; __ston_ptr += 2; } \
else { __ston_base = 8; __ston_ptr++; } \
} \
else __ston_base = 10; \
} \
for (value = 0; __ston_ptr < __ston_end && (__ston_v = QSE_MCHARTONUM(*__ston_ptr, __ston_base)) != __ston_base; __ston_ptr++) { \
value = value * __ston_base + __ston_v; \
} \
if (endptr) *((const qse_mchar_t**)endptr) = __ston_ptr; \
if (__ston_f > 0) value *= -1; \
@ -266,6 +294,7 @@ typedef qse_wchar_t* (*qse_wcssubst_t) (
#define QSE_WCSTONUM(value,nptr,endptr,base) do {\
int __ston_f = 0, __ston_v; \
const qse_wchar_t* __ston_ptr = nptr; \
int __ston_base = base; \
for (;;) { \
qse_wchar_t __ston_c = *__ston_ptr; \
if (__ston_c == QSE_WT(' ') || \
@ -274,8 +303,15 @@ typedef qse_wchar_t* (*qse_wcssubst_t) (
else if (__ston_c == QSE_WT('+')) { __ston_ptr++; } \
break; \
} \
for (value = 0; (__ston_v = QSE_WCHARTONUM(*__ston_ptr, base)) < base; __ston_ptr++) { \
value = value * base + __ston_v; \
if (base == 0) { \
if (*__ston_ptr == QSE_WT('0')) { \
if (*(__ston_ptr + 1) == QSE_WT('x') || *(__ston_ptr + 1) == QSE_WT('X')) { __ston_base = 16; __ston_ptr += 2; } \
else { __ston_base = 8; __ston_ptr++; } \
} \
else __ston_base = 10; \
} \
for (value = 0; (__ston_v = QSE_WCHARTONUM(*__ston_ptr, __ston_base)) < __ston_base; __ston_ptr++) { \
value = value * __ston_base + __ston_v; \
} \
if (endptr) *((const qse_wchar_t**)endptr) = __ston_ptr; \
if (__ston_f > 0) value *= -1; \
@ -286,7 +322,7 @@ typedef qse_wchar_t* (*qse_wcssubst_t) (
int __ston_f = 0, __ston_v; \
const qse_wchar_t* __ston_ptr = nptr; \
const qse_wchar_t* __ston_end = __ston_ptr + len; \
value = 0; \
int __ston_base = base; \
while (__ston_ptr < __ston_end) { \
qse_wchar_t __ston_c = *__ston_ptr; \
if (__ston_c == QSE_WT(' ') || __ston_c == QSE_WT('\t')) { \
@ -296,9 +332,15 @@ typedef qse_wchar_t* (*qse_wcssubst_t) (
else if (__ston_c == QSE_WT('+')) { __ston_ptr++; } \
break; \
} \
for (value = 0; __ston_ptr < __ston_end && \
(__ston_v = QSE_WCHARTONUM(*__ston_ptr, base)) != base; __ston_ptr++) { \
value = value * base + __ston_v; \
if (base == 0) { \
if (__ston_ptr < __ston_end && *__ston_ptr == QSE_WT('0')) { \
if ((__ston_ptr < __ston_end - 1) && (*(__ston_ptr + 1) == QSE_WT('x') || *(__ston_ptr + 1) == QSE_WT('X'))) { __ston_base = 16; __ston_ptr += 2; } \
else { __ston_base = 8; __ston_ptr++; } \
} \
else __ston_base = 10; \
} \
for (value = 0; __ston_ptr < __ston_end && (__ston_v = QSE_WCHARTONUM(*__ston_ptr, __ston_base)) != __ston_base; __ston_ptr++) { \
value = value * __ston_base + __ston_v; \
} \
if (endptr) *((const qse_wchar_t**)endptr) = __ston_ptr; \
if (__ston_f > 0) value *= -1; \

View File

@ -30,6 +30,33 @@
#include <qse/types.h>
#include <qse/macros.h>
enum qse_raddic_opt_t
{
QSE_RADDIC_TRAIT
};
typedef enum qse_raddic_opt_t qse_raddic_opt_t;
enum qse_raddic_trait_t
{
QSE_RADDIC_ALLOW_CONST_WITHOUT_ATTR = (1 << 0)
};
typedef enum qse_raddic_trait_t qse_raddic_trait_t;
enum qse_raddic_errnum_t
{
QSE_RADDIC_ENOERR,
QSE_RADDIC_EOTHER,
QSE_RADDIC_ENOIMPL,
QSE_RADDIC_ESYSERR,
QSE_RADDIC_EINTERN,
QSE_RADDIC_ENOMEM,
QSE_RADDIC_EINVAL,
QSE_RADDIC_ENOENT,
QSE_RADDIC_EEXIST,
QSE_RADDIC_ESYNERR
};
typedef enum qse_raddic_errnum_t qse_raddic_errnum_t;
#define QSE_RADDIC_ATTR_TYPE_STRING 0
#define QSE_RADDIC_ATTR_TYPE_INTEGER 1
#define QSE_RADDIC_ATTR_TYPE_IPADDR 2
@ -66,7 +93,7 @@ typedef struct qse_raddic_attr_flags_t qse_raddic_attr_flags_t;
typedef struct qse_raddic_attr_t qse_raddic_attr_t;
struct qse_raddic_attr_t
{
int attr;
qse_uint32_t attr;
int type;
int vendor;
qse_raddic_attr_flags_t flags;
@ -77,7 +104,7 @@ struct qse_raddic_attr_t
typedef struct qse_raddic_const_t qse_raddic_const_t;
struct qse_raddic_const_t
{
int attr; /* vendor + attribute-value */
qse_uint32_t attr; /* vendor + attribute-value */
int value;
qse_raddic_const_t* nextc;
qse_char_t name[1];
@ -96,9 +123,9 @@ struct qse_raddic_vendor_t
typedef struct qse_raddic_t qse_raddic_t;
#define QSE_RADDIC_ATTR_MAKE(vendor,value) ((((vendor) & 0xFFFF) << 8) | (value))
#define QSE_RADDIC_ATTR_VENDOR(attr) (((attr) >> 8) & 0xFFFF)
#define QSE_RADDIC_ATTR_VALUE(attr) ((attr) & 0xFF)
#define QSE_RADDIC_ATTR_MAKE(vendor,value) ((((vendor) & 0xFFFFu) << 16) | (value))
#define QSE_RADDIC_ATTR_VENDOR(attr) (((attr) >> 16) & 0xFFFFu)
#define QSE_RADDIC_ATTR_VALUE(attr) ((attr) & 0xFFFFu)
#if defined(__cplusplus)
extern "C" {
@ -113,6 +140,47 @@ QSE_EXPORT void qse_raddic_close (
qse_raddic_t* dic
);
QSE_EXPORT int qse_raddic_getopt (
qse_raddic_t* raddic,
qse_raddic_opt_t id,
void* value
);
QSE_EXPORT int qse_raddic_setopt (
qse_raddic_t* raddic,
qse_raddic_opt_t id,
const void* value
);
QSE_EXPORT qse_raddic_errnum_t qse_raddic_geterrnum (
qse_raddic_t* dic
);
QSE_EXPORT const qse_char_t* qse_raddic_geterrmsg (
qse_raddic_t* dic
);
QSE_EXPORT void qse_raddic_seterrnum (
qse_raddic_t* dic,
qse_raddic_errnum_t errnum
);
QSE_EXPORT void qse_raddic_seterrfmt (
qse_raddic_t* dic,
qse_raddic_errnum_t errnum,
const qse_char_t* fmt,
...
);
QSE_EXPORT void qse_raddic_clear (
qse_raddic_t* dic
);
QSE_EXPORT int qse_raddic_load (
qse_raddic_t* dic,
const qse_char_t* path
);
QSE_EXPORT qse_raddic_vendor_t* qse_raddic_findvendorbyname (
qse_raddic_t* dic,
const qse_char_t* name
@ -149,7 +217,7 @@ QSE_EXPORT qse_raddic_attr_t* qse_raddic_findattrbyname (
QSE_EXPORT qse_raddic_attr_t* qse_raddic_findattrbyvalue (
qse_raddic_t* dic,
int attr
qse_uint32_t attr
);
QSE_EXPORT qse_raddic_attr_t* qse_raddic_addattr (
@ -172,16 +240,15 @@ QSE_EXPORT int qse_raddic_deleteattrbyvalue (
);
QSE_EXPORT qse_raddic_const_t* qse_raddic_findconstbyname (
qse_raddic_t* dic,
int attr,
qse_uint32_t attr,
const qse_char_t* name
);
QSE_EXPORT qse_raddic_const_t* qse_raddic_findconstbyvalue (
qse_raddic_t* dic,
int attr,
qse_uint32_t attr,
int value
);
@ -194,13 +261,13 @@ QSE_EXPORT qse_raddic_const_t* qse_raddic_addconst (
QSE_EXPORT int qse_raddic_deleteconstbyname (
qse_raddic_t* dic,
int attr,
qse_uint32_t attr,
const qse_char_t* name
);
QSE_EXPORT int qse_raddic_deleteconstbyvalue (
qse_raddic_t* dic,
int attr,
qse_uint32_t attr,
int value
);