added a primitive dictionary file loader. needs more work
This commit is contained in:
@ -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; \
|
||||
|
@ -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
|
||||
);
|
||||
|
||||
|
Reference in New Issue
Block a user