enhanced cmd/http/httpd.c to load host/location-specific configuration data

This commit is contained in:
hyung-hwan 2013-03-11 16:34:41 +00:00
parent 357aec132a
commit 847a08c455
22 changed files with 596 additions and 821 deletions

View File

@ -595,8 +595,8 @@ static int comparg (int argc, qse_char_t* argv[], struct arg_t* arg)
goto oops; goto oops;
} }
qse_htb_setmancbs (gvm, qse_htb_setstyle (gvm,
qse_gethtbmancbs(QSE_HTB_MANCBS_INLINE_VALUE_COPIER) qse_gethtbstyle(QSE_HTB_STYLE_INLINE_VALUE_COPIER)
); );
while ((c = qse_getopt (argc, argv, &opt)) != QSE_CHAR_EOF) while ((c = qse_getopt (argc, argv, &opt)) != QSE_CHAR_EOF)

File diff suppressed because it is too large Load Diff

View File

@ -49,7 +49,7 @@
* int i; * int i;
* *
* s1 = qse_htb_open (QSE_MMGR_GETDFL(), 0, 30, 75, 1, 1); // error handling skipped * s1 = qse_htb_open (QSE_MMGR_GETDFL(), 0, 30, 75, 1, 1); // error handling skipped
* qse_htb_setmancbs (s1, qse_gethtbmancbs(QSE_HTB_MANCBS_INLINE_COPIERS)); * qse_htb_setstyle (s1, qse_gethtbstyle(QSE_HTB_STYLE_INLINE_COPIERS));
* *
* for (i = 0; i < 20; i++) * for (i = 0; i < 20; i++)
* { * {
@ -202,9 +202,9 @@ struct qse_htb_pair_t
qse_htb_pair_t* next; qse_htb_pair_t* next;
}; };
typedef struct qse_htb_mancbs_t qse_htb_mancbs_t; typedef struct qse_htb_style_t qse_htb_style_t;
struct qse_htb_mancbs_t struct qse_htb_style_t
{ {
qse_htb_copier_t copier[2]; qse_htb_copier_t copier[2];
qse_htb_freeer_t freeer[2]; qse_htb_freeer_t freeer[2];
@ -215,22 +215,22 @@ struct qse_htb_mancbs_t
}; };
/** /**
* The qse_htb_mancbs_kind_t type defines the type of predefined * The qse_htb_style_kind_t type defines the type of predefined
* callback set for pair manipulation. * callback set for pair manipulation.
*/ */
enum qse_htb_mancbs_kind_t enum qse_htb_style_kind_t
{ {
/** store the key and the value pointer */ /** store the key and the value pointer */
QSE_HTB_MANCBS_DEFAULT, QSE_HTB_STYLE_DEFAULT,
/** copy both key and value into the pair */ /** copy both key and value into the pair */
QSE_HTB_MANCBS_INLINE_COPIERS, QSE_HTB_STYLE_INLINE_COPIERS,
/** copy the key into the pair but store the value pointer */ /** copy the key into the pair but store the value pointer */
QSE_HTB_MANCBS_INLINE_KEY_COPIER, QSE_HTB_STYLE_INLINE_KEY_COPIER,
/** copy the value into the pair but store the key pointer */ /** copy the value into the pair but store the key pointer */
QSE_HTB_MANCBS_INLINE_VALUE_COPIER QSE_HTB_STYLE_INLINE_VALUE_COPIER
}; };
typedef enum qse_htb_mancbs_kind_t qse_htb_mancbs_kind_t; typedef enum qse_htb_style_kind_t qse_htb_style_kind_t;
/** /**
* The qse_htb_t type defines a hash table. * The qse_htb_t type defines a hash table.
@ -239,7 +239,7 @@ struct qse_htb_t
{ {
qse_mmgr_t* mmgr; qse_mmgr_t* mmgr;
const qse_htb_mancbs_t* mancbs; const qse_htb_style_t* style;
qse_byte_t scale[2]; /**< length scale */ qse_byte_t scale[2]; /**< length scale */
qse_byte_t factor; /**< load factor in percentage */ qse_byte_t factor; /**< load factor in percentage */
@ -300,11 +300,11 @@ extern "C" {
#endif #endif
/** /**
* The qse_gethtbmancbs() functions returns a predefined callback set for * The qse_gethtbstyle() functions returns a predefined callback set for
* pair manipulation. * pair manipulation.
*/ */
QSE_EXPORT const qse_htb_mancbs_t* qse_gethtbmancbs ( QSE_EXPORT const qse_htb_style_t* qse_gethtbstyle (
qse_htb_mancbs_kind_t kind qse_htb_style_kind_t kind
); );
/** /**
@ -364,19 +364,22 @@ QSE_EXPORT void* qse_htb_getxtn (
); );
/** /**
* The qse_htb_getmancbs() function gets manipulation callback function set. * The qse_htb_getstyle() function gets manipulation callback function set.
*/ */
QSE_EXPORT const qse_htb_mancbs_t* qse_htb_getmancbs ( QSE_EXPORT const qse_htb_style_t* qse_htb_getstyle (
const qse_htb_t* htb /**< hash table */ const qse_htb_t* htb /**< hash table */
); );
/** /**
* The qse_htb_setmancbs() function sets internal manipulation callback * The qse_htb_setstyle() function sets internal manipulation callback
* functions for data construction, destruction, resizing, hashing, etc. * functions for data construction, destruction, resizing, hashing, etc.
* The callback structure pointed to by \a style must outlive the hash
* table pointed to by \a htb as the hash table doesn't copy the contents
* of the structure.
*/ */
QSE_EXPORT void qse_htb_setmancbs ( QSE_EXPORT void qse_htb_setstyle (
qse_htb_t* htb, /**< hash table */ qse_htb_t* htb, /**< hash table */
const qse_htb_mancbs_t* mancbs /**< callback function set */ const qse_htb_style_t* style /**< callback function set */
); );
/** /**
@ -533,7 +536,7 @@ QSE_EXPORT qse_htb_pair_t* qse_htb_update (
* QSE_MMGR_GETDFL(), 0, 10, 70, * QSE_MMGR_GETDFL(), 0, 10, 70,
* QSE_SIZEOF(qse_char_t), QSE_SIZEOF(qse_char_t) * QSE_SIZEOF(qse_char_t), QSE_SIZEOF(qse_char_t)
* ); // note error check is skipped * ); // note error check is skipped
* qse_htb_setmancbs (s1, &mancbs1); * qse_htb_setstyle (s1, &style1);
* *
* for (i = 0; i < QSE_COUNTOF(vals); i++) * for (i = 0; i < QSE_COUNTOF(vals); i++)
* { * {

View File

@ -29,19 +29,19 @@
#if defined(QSE_MAP_AS_HTB) #if defined(QSE_MAP_AS_HTB)
# include <qse/cmn/htb.h> # include <qse/cmn/htb.h>
# define QSE_MAP_MANCBS_DEFAULT QSE_HTB_MANCBS_DEFAULT # define QSE_MAP_STYLE_DEFAULT QSE_HTB_STYLE_DEFAULT
# define QSE_MAP_MANCBS_INLINE_COPIERS QSE_HTB_MANCBS_INLINE_COPIERS # define QSE_MAP_STYLE_INLINE_COPIERS QSE_HTB_STYLE_INLINE_COPIERS
# define QSE_MAP_MANCBS_INLINE_KEY_COPIER QSE_HTB_MANCBS_INLINE_KEY_COPIER # define QSE_MAP_STYLE_INLINE_KEY_COPIER QSE_HTB_STYLE_INLINE_KEY_COPIER
# define QSE_MAP_MANCBS_INLINE_VALUE_COPIER QSE_HTB_MANCBS_INLINE_VALUE_COPIER # define QSE_MAP_STYLE_INLINE_VALUE_COPIER QSE_HTB_STYLE_INLINE_VALUE_COPIER
# define qse_getmapmancbs(kind) qse_gethtbmancbs(kind) # define qse_getmapstyle(kind) qse_gethtbstyle(kind)
# define qse_map_open(mmgr,ext,capa,factor,ks,vs) qse_htb_open(mmgr,ext,capa,factor,ks,vs) # define qse_map_open(mmgr,ext,capa,factor,ks,vs) qse_htb_open(mmgr,ext,capa,factor,ks,vs)
# define qse_map_close(map) qse_htb_close(map) # define qse_map_close(map) qse_htb_close(map)
# define qse_map_init(map,mmgr,capa,factor,ks,vs) qse_htb_init(map,mmgr,capa,factor,ks,vs) # define qse_map_init(map,mmgr,capa,factor,ks,vs) qse_htb_init(map,mmgr,capa,factor,ks,vs)
# define qse_map_fini(map) qse_htb_fini(map) # define qse_map_fini(map) qse_htb_fini(map)
# define qse_map_getsize(map) qse_htb_getsize(map) # define qse_map_getsize(map) qse_htb_getsize(map)
# define qse_map_getcapa(map) qse_htb_getcapa(map) # define qse_map_getcapa(map) qse_htb_getcapa(map)
# define qse_map_getmancbs(map) qse_htb_getmancbs(map) # define qse_map_getstyle(map) qse_htb_getstyle(map)
# define qse_map_setmancbs(map,cbs) qse_htb_setmancbs(map,cbs) # define qse_map_setstyle(map,cbs) qse_htb_setstyle(map,cbs)
# define qse_map_search(map,kptr,klen) qse_htb_search(map,kptr,klen) # define qse_map_search(map,kptr,klen) qse_htb_search(map,kptr,klen)
# define qse_map_upsert(map,kptr,klen,vptr,vlen) qse_htb_upsert(map,kptr,klen,vptr,vlen) # define qse_map_upsert(map,kptr,klen,vptr,vlen) qse_htb_upsert(map,kptr,klen,vptr,vlen)
# define qse_map_ensert(map,kptr,klen,vptr,vlen) qse_htb_ensert(map,kptr,klen,vptr,vlen) # define qse_map_ensert(map,kptr,klen,vptr,vlen) qse_htb_ensert(map,kptr,klen,vptr,vlen)
@ -59,7 +59,7 @@
# define qse_map_id_t qse_htb_id_t # define qse_map_id_t qse_htb_id_t
# define qse_map_t qse_htb_t # define qse_map_t qse_htb_t
# define qse_map_pair_t qse_htb_pair_t # define qse_map_pair_t qse_htb_pair_t
# define qse_map_mancbs_t qse_htb_mancbs_t # define qse_map_style_t qse_htb_style_t
# define qse_map_cbserter_t qse_htb_cbserter_t # define qse_map_cbserter_t qse_htb_cbserter_t
# define qse_map_walker_t qse_htb_walker_t # define qse_map_walker_t qse_htb_walker_t
# define QSE_MAP_COPIER_SIMPLE QSE_HTB_COPIER_SIMPLE # define QSE_MAP_COPIER_SIMPLE QSE_HTB_COPIER_SIMPLE
@ -87,19 +87,19 @@
# define QSE_MAP_VLEN(p) QSE_HTB_VLEN(p) # define QSE_MAP_VLEN(p) QSE_HTB_VLEN(p)
#elif defined(QSE_MAP_AS_RBT) #elif defined(QSE_MAP_AS_RBT)
# include <qse/cmn/rbt.h> # include <qse/cmn/rbt.h>
# define QSE_MAP_MANCBS_DEFAULT QSE_RBT_MANCBS_DEFAULT # define QSE_MAP_STYLE_DEFAULT QSE_RBT_STYLE_DEFAULT
# define QSE_MAP_MANCBS_INLINE_COPIERS QSE_RBT_MANCBS_INLINE_COPIERS # define QSE_MAP_STYLE_INLINE_COPIERS QSE_RBT_STYLE_INLINE_COPIERS
# define QSE_MAP_MANCBS_INLINE_KEY_COPIER QSE_RBT_MANCBS_INLINE_KEY_COPIER # define QSE_MAP_STYLE_INLINE_KEY_COPIER QSE_RBT_STYLE_INLINE_KEY_COPIER
# define QSE_MAP_MANCBS_INLINE_VALUE_COPIER QSE_RBT_MANCBS_INLINE_VALUE_COPIER # define QSE_MAP_STYLE_INLINE_VALUE_COPIER QSE_RBT_STYLE_INLINE_VALUE_COPIER
# define qse_getmapmancbs(kind) qse_getrbtmancbs(kind) # define qse_getmapstyle(kind) qse_getrbtstyle(kind)
# define qse_map_open(mmgr,ext,capa,factor,ks,vs) qse_rbt_open(mmgr,ext,ks,vs) # define qse_map_open(mmgr,ext,capa,factor,ks,vs) qse_rbt_open(mmgr,ext,ks,vs)
# define qse_map_close(map) qse_rbt_close(map) # define qse_map_close(map) qse_rbt_close(map)
# define qse_map_init(map,mmgr,capa,factor,ks,vs) qse_rbt_init(map,mmgr,ks,vs) # define qse_map_init(map,mmgr,capa,factor,ks,vs) qse_rbt_init(map,mmgr,ks,vs)
# define qse_map_fini(map) qse_rbt_fini(map) # define qse_map_fini(map) qse_rbt_fini(map)
# define qse_map_getsize(map) qse_rbt_getsize(map) # define qse_map_getsize(map) qse_rbt_getsize(map)
# define qse_map_getcapa(map) qse_rbt_getsize(map) # define qse_map_getcapa(map) qse_rbt_getsize(map)
# define qse_map_getmancbs(map) qse_rbt_getmancbs(map) # define qse_map_getstyle(map) qse_rbt_getstyle(map)
# define qse_map_setmancbs(map,cbs) qse_rbt_setmancbs(map,cbs) # define qse_map_setstyle(map,cbs) qse_rbt_setstyle(map,cbs)
# define qse_map_search(map,kptr,klen) qse_rbt_search(map,kptr,klen) # define qse_map_search(map,kptr,klen) qse_rbt_search(map,kptr,klen)
# define qse_map_upsert(map,kptr,klen,vptr,vlen) qse_rbt_upsert(map,kptr,klen,vptr,vlen) # define qse_map_upsert(map,kptr,klen,vptr,vlen) qse_rbt_upsert(map,kptr,klen,vptr,vlen)
# define qse_map_ensert(map,kptr,klen,vptr,vlen) qse_rbt_ensert(map,kptr,klen,vptr,vlen) # define qse_map_ensert(map,kptr,klen,vptr,vlen) qse_rbt_ensert(map,kptr,klen,vptr,vlen)
@ -117,7 +117,7 @@
# define qse_map_id_t qse_rbt_id_t # define qse_map_id_t qse_rbt_id_t
# define qse_map_t qse_rbt_t # define qse_map_t qse_rbt_t
# define qse_map_pair_t qse_rbt_pair_t # define qse_map_pair_t qse_rbt_pair_t
# define qse_map_mancbs_t qse_rbt_mancbs_t # define qse_map_style_t qse_rbt_style_t
# define qse_map_cbserter_t qse_rbt_cbserter_t # define qse_map_cbserter_t qse_rbt_cbserter_t
# define qse_map_walker_t qse_rbt_walker_t # define qse_map_walker_t qse_rbt_walker_t
# define QSE_MAP_COPIER_SIMPLE QSE_RBT_COPIER_SIMPLE # define QSE_MAP_COPIER_SIMPLE QSE_RBT_COPIER_SIMPLE

View File

@ -49,7 +49,7 @@
* int i; * int i;
* *
* s1 = qse_rbt_open (QSE_MMGR_GETDFL(), 0, 1, 1); // error handling skipped * s1 = qse_rbt_open (QSE_MMGR_GETDFL(), 0, 1, 1); // error handling skipped
* qse_rbt_setmancbs (s1, qse_getrbtmancbs(QSE_RBT_MANCBS_INLINE_COPIERS)); * qse_rbt_setstyle (s1, qse_getrbtstyle(QSE_RBT_STYLE_INLINE_COPIERS));
* *
* for (i = 0; i < 20; i++) * for (i = 0; i < 20; i++)
* { * {
@ -183,13 +183,13 @@ struct qse_rbt_pair_t
qse_rbt_pair_t* child[2]; /* left and right */ qse_rbt_pair_t* child[2]; /* left and right */
}; };
typedef struct qse_rbt_mancbs_t qse_rbt_mancbs_t; typedef struct qse_rbt_style_t qse_rbt_style_t;
/** /**
* The qse_rbt_mancbs_t type defines callback function sets for key/value * The qse_rbt_style_t type defines callback function sets for key/value
* pair manipulation. * pair manipulation.
*/ */
struct qse_rbt_mancbs_t struct qse_rbt_style_t
{ {
qse_rbt_copier_t copier[2]; /**< key and value copier */ qse_rbt_copier_t copier[2]; /**< key and value copier */
qse_rbt_freeer_t freeer[2]; /**< key and value freeer */ qse_rbt_freeer_t freeer[2]; /**< key and value freeer */
@ -198,22 +198,22 @@ struct qse_rbt_mancbs_t
}; };
/** /**
* The qse_rbt_mancbs_kind_t type defines the type of predefined * The qse_rbt_style_kind_t type defines the type of predefined
* callback set for pair manipulation. * callback set for pair manipulation.
*/ */
enum qse_rbt_mancbs_kind_t enum qse_rbt_style_kind_t
{ {
/** store the key and the value pointer */ /** store the key and the value pointer */
QSE_RBT_MANCBS_DEFAULT, QSE_RBT_STYLE_DEFAULT,
/** copy both key and value into the pair */ /** copy both key and value into the pair */
QSE_RBT_MANCBS_INLINE_COPIERS, QSE_RBT_STYLE_INLINE_COPIERS,
/** copy the key into the pair but store the value pointer */ /** copy the key into the pair but store the value pointer */
QSE_RBT_MANCBS_INLINE_KEY_COPIER, QSE_RBT_STYLE_INLINE_KEY_COPIER,
/** copy the value into the pair but store the key pointer */ /** copy the value into the pair but store the key pointer */
QSE_RBT_MANCBS_INLINE_VALUE_COPIER QSE_RBT_STYLE_INLINE_VALUE_COPIER
}; };
typedef enum qse_rbt_mancbs_kind_t qse_rbt_mancbs_kind_t; typedef enum qse_rbt_style_kind_t qse_rbt_style_kind_t;
/** /**
* The qse_rbt_t type defines a red-black tree. * The qse_rbt_t type defines a red-black tree.
@ -222,7 +222,7 @@ struct qse_rbt_t
{ {
qse_mmgr_t* mmgr; qse_mmgr_t* mmgr;
const qse_rbt_mancbs_t* mancbs; const qse_rbt_style_t* style;
qse_byte_t scale[2]; /**< length scale */ qse_byte_t scale[2]; /**< length scale */
@ -271,11 +271,11 @@ extern "C" {
#endif #endif
/** /**
* The qse_getrbtmancbs() functions returns a predefined callback set for * The qse_getrbtstyle() functions returns a predefined callback set for
* pair manipulation. * pair manipulation.
*/ */
QSE_EXPORT const qse_rbt_mancbs_t* qse_getrbtmancbs ( QSE_EXPORT const qse_rbt_style_t* qse_getrbtstyle (
qse_rbt_mancbs_kind_t kind qse_rbt_style_kind_t kind
); );
/** /**
@ -322,19 +322,22 @@ QSE_EXPORT void* qse_rbt_getxtn (
); );
/** /**
* The qse_rbt_getmancbs() function gets manipulation callback function set. * The qse_rbt_getstyle() function gets manipulation callback function set.
*/ */
QSE_EXPORT const qse_rbt_mancbs_t* qse_rbt_getmancbs ( QSE_EXPORT const qse_rbt_style_t* qse_rbt_getstyle (
const qse_rbt_t* rbt /**< red-black tree */ const qse_rbt_t* rbt /**< red-black tree */
); );
/** /**
* The qse_rbt_setmancbs() function sets internal manipulation callback * The qse_rbt_setstyle() function sets internal manipulation callback
* functions for data construction, destruction, comparison, etc. * functions for data construction, destruction, comparison, etc.
* The callback structure pointed to by \a style must outlive the tree
* pointed to by \a htb as the tree doesn't copy the contents of the
* structure.
*/ */
QSE_EXPORT void qse_rbt_setmancbs ( QSE_EXPORT void qse_rbt_setstyle (
qse_rbt_t* rbt, /**< red-black tree */ qse_rbt_t* rbt, /**< red-black tree */
const qse_rbt_mancbs_t* mancbs /**< callback function set */ const qse_rbt_style_t* style /**< callback function set */
); );
/** /**
@ -483,7 +486,7 @@ QSE_EXPORT qse_rbt_pair_t* qse_rbt_update (
* QSE_MMGR_GETDFL(), 0, * QSE_MMGR_GETDFL(), 0,
* QSE_SIZEOF(qse_char_t), QSE_SIZEOF(qse_char_t) * QSE_SIZEOF(qse_char_t), QSE_SIZEOF(qse_char_t)
* ); // note error check is skipped * ); // note error check is skipped
* qse_rbt_setmancbs (s1, &mancbs1); * qse_rbt_setstyle (s1, &style1);
* *
* for (i = 0; i < QSE_COUNTOF(vals); i++) * for (i = 0; i < QSE_COUNTOF(vals); i++)
* { * {

View File

@ -1542,12 +1542,12 @@ QSE_EXPORT qse_wchar_t* qse_wcsxnend (
); );
#if defined(QSE_CHAR_IS_MCHAR) #if defined(QSE_CHAR_IS_MCHAR)
# define qse_strend(str,sub) qse_mbsxend(str,sub) # define qse_strend(str,sub) qse_mbsend(str,sub)
# define qse_strxend(str,len,sub) qse_mbsxend(str,len,sub) # define qse_strxend(str,len,sub) qse_mbsxend(str,len,sub)
# define qse_strnend(str,sub,len) qse_mbsnend(str,sub,len) # define qse_strnend(str,sub,len) qse_mbsnend(str,sub,len)
# define qse_strxnend(str,len1,sub,len2) qse_mbsxnend(str,len1,sub,len2) # define qse_strxnend(str,len1,sub,len2) qse_mbsxnend(str,len1,sub,len2)
#else #else
# define qse_strend(str,sub) qse_wcsxend(str,sub) # define qse_strend(str,sub) qse_wcsend(str,sub)
# define qse_strxend(str,len,sub) qse_wcsxend(str,len,sub) # define qse_strxend(str,len,sub) qse_wcsxend(str,len,sub)
# define qse_strnend(str,sub,len) qse_wcsnend(str,sub,len) # define qse_strnend(str,sub,len) qse_wcsnend(str,sub,len)
# define qse_strxnend(str,len1,sub,len2) qse_wcsxnend(str,len1,sub,len2) # define qse_strxnend(str,len1,sub,len2) qse_wcsxnend(str,len1,sub,len2)

View File

@ -51,7 +51,11 @@ struct qse_httpd_serverstd_root_t
qse_httpd_serverstd_root_type_t type; qse_httpd_serverstd_root_type_t type;
union union
{ {
const qse_mchar_t* path; struct
{
const qse_mchar_t* val;
qse_size_t rpl; /* replacement length */
} path;
qse_nwad_t nwad; qse_nwad_t nwad;
} u; } u;
}; };
@ -94,6 +98,8 @@ struct qse_httpd_serverstd_ssl_t
enum qse_httpd_serverstd_query_code_t enum qse_httpd_serverstd_query_code_t
{ {
QSE_HTTPD_SERVERSTD_SSL, /* qse_httpd_serverstd_ssl_t */
QSE_HTTPD_SERVERSTD_NAME, /* const qse_mchar_t* */ QSE_HTTPD_SERVERSTD_NAME, /* const qse_mchar_t* */
QSE_HTTPD_SERVERSTD_ROOT, /* qse_httpd_serverstd_root_t */ QSE_HTTPD_SERVERSTD_ROOT, /* qse_httpd_serverstd_root_t */
QSE_HTTPD_SERVERSTD_REALM, /* qse_httpd_serverstd_realm_t */ QSE_HTTPD_SERVERSTD_REALM, /* qse_httpd_serverstd_realm_t */
@ -105,9 +111,8 @@ enum qse_httpd_serverstd_query_code_t
QSE_HTTPD_SERVERSTD_CGI, /* qse_httpd_serverstd_cgi_t */ QSE_HTTPD_SERVERSTD_CGI, /* qse_httpd_serverstd_cgi_t */
QSE_HTTPD_SERVERSTD_MIME, /* const qse_mchar_t* */ QSE_HTTPD_SERVERSTD_MIME, /* const qse_mchar_t* */
QSE_HTTPD_SERVERSTD_DIRACC, /* int (http error code) */ QSE_HTTPD_SERVERSTD_DIRACC, /* int (http error code) */
QSE_HTTPD_SERVERSTD_FILEACC, /* int (http error code) */ QSE_HTTPD_SERVERSTD_FILEACC /* int (http error code) */
QSE_HTTPD_SERVERSTD_SSL /* qse_httpd_serverstd_ssl_t */
}; };
typedef enum qse_httpd_serverstd_query_code_t qse_httpd_serverstd_query_code_t; typedef enum qse_httpd_serverstd_query_code_t qse_httpd_serverstd_query_code_t;

View File

@ -1141,7 +1141,7 @@ int Awk::open ()
*(Awk**)QSE_XTN(functionMap) = this; *(Awk**)QSE_XTN(functionMap) = this;
static qse_htb_mancbs_t mancbs = static qse_htb_style_t style =
{ {
{ {
QSE_HTB_COPIER_INLINE, QSE_HTB_COPIER_INLINE,
@ -1156,7 +1156,7 @@ int Awk::open ()
QSE_HTB_SIZER_DEFAULT, QSE_HTB_SIZER_DEFAULT,
QSE_HTB_HASHER_DEFAULT QSE_HTB_HASHER_DEFAULT
}; };
qse_htb_setmancbs (functionMap, &mancbs); qse_htb_setstyle (functionMap, &style);
return 0; return 0;
} }

View File

@ -206,8 +206,8 @@ StdAwk::Run* StdAwk::parse (Source& in, Source& out)
this->setError (QSE_AWK_ENOMEM); this->setError (QSE_AWK_ENOMEM);
return QSE_NULL; return QSE_NULL;
} }
qse_htb_setmancbs (&this->cmgrtab, qse_htb_setstyle (&this->cmgrtab,
qse_gethtbmancbs(QSE_HTB_MANCBS_INLINE_KEY_COPIER)); qse_gethtbstyle(QSE_HTB_STYLE_INLINE_KEY_COPIER));
this->cmgrtab_inited = true; this->cmgrtab_inited = true;
} }

View File

@ -74,7 +74,7 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_awk_prm_t* pr
{ {
qse_awk_t* awk; qse_awk_t* awk;
static qse_htb_mancbs_t treefuncbs = static qse_htb_style_t treefuncbs =
{ {
{ {
QSE_HTB_COPIER_INLINE, QSE_HTB_COPIER_INLINE,
@ -90,7 +90,7 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_awk_prm_t* pr
QSE_HTB_HASHER_DEFAULT QSE_HTB_HASHER_DEFAULT
}; };
static qse_htb_mancbs_t fncusercbs = static qse_htb_style_t fncusercbs =
{ {
{ {
QSE_HTB_COPIER_INLINE, QSE_HTB_COPIER_INLINE,
@ -156,8 +156,8 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_awk_prm_t* pr
); );
if (awk->sio_names == QSE_NULL) goto oops; if (awk->sio_names == QSE_NULL) goto oops;
*(qse_awk_t**)QSE_XTN(awk->sio_names) = awk; *(qse_awk_t**)QSE_XTN(awk->sio_names) = awk;
qse_htb_setmancbs (awk->sio_names, qse_htb_setstyle (awk->sio_names,
qse_gethtbmancbs(QSE_HTB_MANCBS_INLINE_KEY_COPIER) qse_gethtbstyle(QSE_HTB_STYLE_INLINE_KEY_COPIER)
); );
/* TODO: initial map size?? */ /* TODO: initial map size?? */
@ -166,15 +166,15 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_awk_prm_t* pr
); );
if (awk->tree.funs == QSE_NULL) goto oops; if (awk->tree.funs == QSE_NULL) goto oops;
*(qse_awk_t**)QSE_XTN(awk->tree.funs) = awk; *(qse_awk_t**)QSE_XTN(awk->tree.funs) = awk;
qse_htb_setmancbs (awk->tree.funs, &treefuncbs); qse_htb_setstyle (awk->tree.funs, &treefuncbs);
awk->parse.funs = qse_htb_open ( awk->parse.funs = qse_htb_open (
mmgr, QSE_SIZEOF(awk), 256, 70, QSE_SIZEOF(qse_char_t), 1 mmgr, QSE_SIZEOF(awk), 256, 70, QSE_SIZEOF(qse_char_t), 1
); );
if (awk->parse.funs == QSE_NULL) goto oops; if (awk->parse.funs == QSE_NULL) goto oops;
*(qse_awk_t**)QSE_XTN(awk->parse.funs) = awk; *(qse_awk_t**)QSE_XTN(awk->parse.funs) = awk;
qse_htb_setmancbs (awk->parse.funs, qse_htb_setstyle (awk->parse.funs,
qse_gethtbmancbs(QSE_HTB_MANCBS_INLINE_KEY_COPIER) qse_gethtbstyle(QSE_HTB_STYLE_INLINE_KEY_COPIER)
); );
awk->parse.named = qse_htb_open ( awk->parse.named = qse_htb_open (
@ -182,8 +182,8 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_awk_prm_t* pr
); );
if (awk->parse.named == QSE_NULL) goto oops; if (awk->parse.named == QSE_NULL) goto oops;
*(qse_awk_t**)QSE_XTN(awk->parse.named) = awk; *(qse_awk_t**)QSE_XTN(awk->parse.named) = awk;
qse_htb_setmancbs (awk->parse.named, qse_htb_setstyle (awk->parse.named,
qse_gethtbmancbs(QSE_HTB_MANCBS_INLINE_KEY_COPIER) qse_gethtbstyle(QSE_HTB_STYLE_INLINE_KEY_COPIER)
); );
awk->parse.gbls = qse_lda_open (mmgr, QSE_SIZEOF(awk), 128); awk->parse.gbls = qse_lda_open (mmgr, QSE_SIZEOF(awk), 128);
@ -234,13 +234,13 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_awk_prm_t* pr
); );
if (awk->fnc.user == QSE_NULL) goto oops; if (awk->fnc.user == QSE_NULL) goto oops;
*(qse_awk_t**)QSE_XTN(awk->fnc.user) = awk; *(qse_awk_t**)QSE_XTN(awk->fnc.user) = awk;
qse_htb_setmancbs (awk->fnc.user, &fncusercbs); qse_htb_setstyle (awk->fnc.user, &fncusercbs);
awk->modtab = qse_rbt_open (mmgr, 0, QSE_SIZEOF(qse_char_t), 1); awk->modtab = qse_rbt_open (mmgr, 0, QSE_SIZEOF(qse_char_t), 1);
if (awk->modtab == QSE_NULL) goto oops; if (awk->modtab == QSE_NULL) goto oops;
qse_rbt_setmancbs ( qse_rbt_setstyle (
awk->modtab, awk->modtab,
qse_getrbtmancbs(QSE_RBT_MANCBS_INLINE_COPIERS) qse_getrbtstyle(QSE_RBT_STYLE_INLINE_COPIERS)
); );
if (qse_awk_initgbls (awk) <= -1) goto oops; if (qse_awk_initgbls (awk) <= -1) goto oops;

View File

@ -595,7 +595,7 @@ int qse_awk_mod_dir (qse_awk_mod_t* mod, qse_awk_t* awk)
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL); qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
return -1; return -1;
} }
qse_rbt_setmancbs (rbt, qse_getrbtmancbs(QSE_RBT_MANCBS_INLINE_COPIERS)); qse_rbt_setstyle (rbt, qse_getrbtstyle(QSE_RBT_STYLE_INLINE_COPIERS));
mod->ctx = rbt; mod->ctx = rbt;
return 0; return 0;

View File

@ -1422,7 +1422,7 @@ int qse_awk_mod_uci (qse_awk_mod_t* mod, qse_awk_t* awk)
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL); qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
return -1; return -1;
} }
qse_rbt_setmancbs (rbt, qse_getrbtmancbs(QSE_RBT_MANCBS_INLINE_COPIERS)); qse_rbt_setstyle (rbt, qse_getrbtstyle(QSE_RBT_STYLE_INLINE_COPIERS));
mod->ctx = rbt; mod->ctx = rbt;
return 0; return 0;

View File

@ -894,7 +894,7 @@ static void same_namedval (qse_htb_t* map, void* dptr, qse_size_t dlen)
static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio) static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio)
{ {
static qse_htb_mancbs_t mancbs_for_named = static qse_htb_style_t style_for_named =
{ {
{ {
QSE_HTB_COPIER_INLINE, QSE_HTB_COPIER_INLINE,
@ -942,7 +942,7 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio)
rtx->named = qse_htb_open (MMGR(rtx), QSE_SIZEOF(rtx), 1024, 70, QSE_SIZEOF(qse_char_t), 1); rtx->named = qse_htb_open (MMGR(rtx), QSE_SIZEOF(rtx), 1024, 70, QSE_SIZEOF(qse_char_t), 1);
if (rtx->named == QSE_NULL) goto oops_5; if (rtx->named == QSE_NULL) goto oops_5;
*(qse_awk_rtx_t**)QSE_XTN(rtx->named) = rtx; *(qse_awk_rtx_t**)QSE_XTN(rtx->named) = rtx;
qse_htb_setmancbs (rtx->named, &mancbs_for_named); qse_htb_setstyle (rtx->named, &style_for_named);
rtx->format.tmp.ptr = (qse_char_t*) rtx->format.tmp.ptr = (qse_char_t*)
QSE_AWK_ALLOC (rtx->awk, 4096*QSE_SIZEOF(qse_char_t*)); QSE_AWK_ALLOC (rtx->awk, 4096*QSE_SIZEOF(qse_char_t*));

View File

@ -2095,8 +2095,8 @@ qse_awk_rtx_t* qse_awk_rtx_openstd (
qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL); qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL);
return QSE_NULL; return QSE_NULL;
} }
qse_htb_setmancbs (&rxtn->cmgrtab, qse_htb_setstyle (&rxtn->cmgrtab,
qse_gethtbmancbs(QSE_HTB_MANCBS_INLINE_COPIERS)); qse_gethtbstyle(QSE_HTB_STYLE_INLINE_COPIERS));
rxtn->cmgrtab_inited = 1; rxtn->cmgrtab_inited = 1;
} }

View File

@ -488,7 +488,7 @@ static void same_mapval (qse_htb_t* map, void* dptr, qse_size_t dlen)
qse_awk_val_t* qse_awk_rtx_makemapval (qse_awk_rtx_t* rtx) qse_awk_val_t* qse_awk_rtx_makemapval (qse_awk_rtx_t* rtx)
{ {
static qse_htb_mancbs_t mancbs = static qse_htb_style_t style =
{ {
/* the key is copied inline into a pair and is freed when the pair /* the key is copied inline into a pair and is freed when the pair
* is destroyed. not setting copier for a value means that the pointer * is destroyed. not setting copier for a value means that the pointer
@ -559,7 +559,7 @@ qse_awk_val_t* qse_awk_rtx_makemapval (qse_awk_rtx_t* rtx)
return QSE_NULL; return QSE_NULL;
} }
*(qse_awk_rtx_t**)QSE_XTN(val->map) = rtx; *(qse_awk_rtx_t**)QSE_XTN(val->map) = rtx;
qse_htb_setmancbs (val->map, &mancbs); qse_htb_setstyle (val->map, &style);
/* END CHECK */ /* END CHECK */
return (qse_awk_val_t*)val; return (qse_awk_val_t*)val;

View File

@ -32,8 +32,8 @@
#define sizer_t qse_htb_sizer_t #define sizer_t qse_htb_sizer_t
#define walker_t qse_htb_walker_t #define walker_t qse_htb_walker_t
#define cbserter_t qse_htb_cbserter_t #define cbserter_t qse_htb_cbserter_t
#define mancbs_t qse_htb_mancbs_t #define style_t qse_htb_style_t
#define mancbs_kind_t qse_htb_mancbs_kind_t #define style_kind_t qse_htb_style_kind_t
#define KPTR(p) QSE_HTB_KPTR(p) #define KPTR(p) QSE_HTB_KPTR(p)
#define KLEN(p) QSE_HTB_KLEN(p) #define KLEN(p) QSE_HTB_KLEN(p)
@ -53,10 +53,13 @@ QSE_INLINE pair_t* qse_htb_allocpair (
htb_t* htb, void* kptr, size_t klen, void* vptr, size_t vlen) htb_t* htb, void* kptr, size_t klen, void* vptr, size_t vlen)
{ {
pair_t* n; pair_t* n;
copier_t kcop = htb->mancbs->copier[QSE_HTB_KEY]; copier_t kcop, vcop;
copier_t vcop = htb->mancbs->copier[QSE_HTB_VAL]; size_t as;
size_t as = SIZEOF(pair_t); kcop = htb->style->copier[QSE_HTB_KEY];
vcop = htb->style->copier[QSE_HTB_VAL];
as = SIZEOF(pair_t);
if (kcop == QSE_HTB_COPIER_INLINE) as += KTOB(htb,klen); if (kcop == QSE_HTB_COPIER_INLINE) as += KTOB(htb,klen);
if (vcop == QSE_HTB_COPIER_INLINE) as += VTOB(htb,vlen); if (vcop == QSE_HTB_COPIER_INLINE) as += VTOB(htb,vlen);
@ -106,8 +109,8 @@ QSE_INLINE pair_t* qse_htb_allocpair (
VPTR(n) = vcop (htb, vptr, vlen); VPTR(n) = vcop (htb, vptr, vlen);
if (VPTR(n) != QSE_NULL) if (VPTR(n) != QSE_NULL)
{ {
if (htb->mancbs->freeer[QSE_HTB_KEY] != QSE_NULL) if (htb->style->freeer[QSE_HTB_KEY] != QSE_NULL)
htb->mancbs->freeer[QSE_HTB_KEY] (htb, KPTR(n), KLEN(n)); htb->style->freeer[QSE_HTB_KEY] (htb, KPTR(n), KLEN(n));
QSE_MMGR_FREE (htb->mmgr, n); QSE_MMGR_FREE (htb->mmgr, n);
return QSE_NULL; return QSE_NULL;
} }
@ -118,10 +121,10 @@ QSE_INLINE pair_t* qse_htb_allocpair (
QSE_INLINE void qse_htb_freepair (htb_t* htb, pair_t* pair) QSE_INLINE void qse_htb_freepair (htb_t* htb, pair_t* pair)
{ {
if (htb->mancbs->freeer[QSE_HTB_KEY] != QSE_NULL) if (htb->style->freeer[QSE_HTB_KEY] != QSE_NULL)
htb->mancbs->freeer[QSE_HTB_KEY] (htb, KPTR(pair), KLEN(pair)); htb->style->freeer[QSE_HTB_KEY] (htb, KPTR(pair), KLEN(pair));
if (htb->mancbs->freeer[QSE_HTB_VAL] != QSE_NULL) if (htb->style->freeer[QSE_HTB_VAL] != QSE_NULL)
htb->mancbs->freeer[QSE_HTB_VAL] (htb, VPTR(pair), VLEN(pair)); htb->style->freeer[QSE_HTB_VAL] (htb, VPTR(pair), VLEN(pair));
QSE_MMGR_FREE (htb->mmgr, pair); QSE_MMGR_FREE (htb->mmgr, pair);
} }
@ -133,14 +136,14 @@ static QSE_INLINE pair_t* change_pair_val (
/* if the old value and the new value are the same, /* if the old value and the new value are the same,
* it just calls the handler for this condition. * it just calls the handler for this condition.
* No value replacement occurs. */ * No value replacement occurs. */
if (htb->mancbs->keeper != QSE_NULL) if (htb->style->keeper != QSE_NULL)
{ {
htb->mancbs->keeper (htb, vptr, vlen); htb->style->keeper (htb, vptr, vlen);
} }
} }
else else
{ {
copier_t vcop = htb->mancbs->copier[QSE_HTB_VAL]; copier_t vcop = htb->style->copier[QSE_HTB_VAL];
void* ovptr = VPTR(pair); void* ovptr = VPTR(pair);
size_t ovlen = VLEN(pair); size_t ovlen = VLEN(pair);
@ -176,9 +179,9 @@ static QSE_INLINE pair_t* change_pair_val (
} }
/* free up the old value */ /* free up the old value */
if (htb->mancbs->freeer[QSE_HTB_VAL] != QSE_NULL) if (htb->style->freeer[QSE_HTB_VAL] != QSE_NULL)
{ {
htb->mancbs->freeer[QSE_HTB_VAL] (htb, ovptr, ovlen); htb->style->freeer[QSE_HTB_VAL] (htb, ovptr, ovlen);
} }
} }
@ -186,9 +189,9 @@ static QSE_INLINE pair_t* change_pair_val (
return pair; return pair;
} }
static mancbs_t mancbs[] = static style_t style[] =
{ {
/* == QSE_HTB_MANCBS_DEFAULT == */ /* == QSE_HTB_STYLE_DEFAULT == */
{ {
{ {
QSE_HTB_COPIER_DEFAULT, QSE_HTB_COPIER_DEFAULT,
@ -204,7 +207,7 @@ static mancbs_t mancbs[] =
QSE_HTB_HASHER_DEFAULT QSE_HTB_HASHER_DEFAULT
}, },
/* == QSE_HTB_MANCBS_INLINE_COPIERS == */ /* == QSE_HTB_STYLE_INLINE_COPIERS == */
{ {
{ {
QSE_HTB_COPIER_INLINE, QSE_HTB_COPIER_INLINE,
@ -220,7 +223,7 @@ static mancbs_t mancbs[] =
QSE_HTB_HASHER_DEFAULT QSE_HTB_HASHER_DEFAULT
}, },
/* == QSE_HTB_MANCBS_INLINE_KEY_COPIER == */ /* == QSE_HTB_STYLE_INLINE_KEY_COPIER == */
{ {
{ {
QSE_HTB_COPIER_INLINE, QSE_HTB_COPIER_INLINE,
@ -236,7 +239,7 @@ static mancbs_t mancbs[] =
QSE_HTB_HASHER_DEFAULT QSE_HTB_HASHER_DEFAULT
}, },
/* == QSE_HTB_MANCBS_INLINE_VALUE_COPIER == */ /* == QSE_HTB_STYLE_INLINE_VALUE_COPIER == */
{ {
{ {
QSE_HTB_COPIER_DEFAULT, QSE_HTB_COPIER_DEFAULT,
@ -253,9 +256,9 @@ static mancbs_t mancbs[] =
} }
}; };
const mancbs_t* qse_gethtbmancbs (mancbs_kind_t kind) const style_t* qse_gethtbstyle (style_kind_t kind)
{ {
return &mancbs[kind]; return &style[kind];
} }
htb_t* qse_htb_open ( htb_t* qse_htb_open (
@ -318,7 +321,7 @@ int qse_htb_init (
htb->threshold = htb->capa * htb->factor / 100; htb->threshold = htb->capa * htb->factor / 100;
if (htb->capa > 0 && htb->threshold <= 0) htb->threshold = 1; if (htb->capa > 0 && htb->threshold <= 0) htb->threshold = 1;
htb->mancbs = &mancbs[0]; htb->style = &style[0];
return 0; return 0;
} }
@ -338,15 +341,15 @@ void* qse_htb_getxtn (qse_htb_t* htb)
return QSE_XTN (htb); return QSE_XTN (htb);
} }
const mancbs_t* qse_htb_getmancbs (const htb_t* htb) const style_t* qse_htb_getstyle (const htb_t* htb)
{ {
return htb->mancbs; return htb->style;
} }
void qse_htb_setmancbs (htb_t* htb, const mancbs_t* mancbs) void qse_htb_setstyle (htb_t* htb, const style_t* style)
{ {
QSE_ASSERT (mancbs != QSE_NULL); QSE_ASSERT (style != QSE_NULL);
htb->mancbs = mancbs; htb->style = style;
} }
size_t qse_htb_getsize (const htb_t* htb) size_t qse_htb_getsize (const htb_t* htb)
@ -364,12 +367,12 @@ pair_t* qse_htb_search (const htb_t* htb, const void* kptr, size_t klen)
pair_t* pair; pair_t* pair;
size_t hc; size_t hc;
hc = htb->mancbs->hasher(htb,kptr,klen) % htb->capa; hc = htb->style->hasher(htb,kptr,klen) % htb->capa;
pair = htb->bucket[hc]; pair = htb->bucket[hc];
while (pair != QSE_NULL) while (pair != QSE_NULL)
{ {
if (htb->mancbs->comper (htb, KPTR(pair), KLEN(pair), kptr, klen) == 0) if (htb->style->comper (htb, KPTR(pair), KLEN(pair), kptr, klen) == 0)
{ {
return pair; return pair;
} }
@ -385,9 +388,9 @@ static QSE_INLINE_ALWAYS int reorganize (htb_t* htb)
size_t i, hc, new_capa; size_t i, hc, new_capa;
pair_t** new_buck; pair_t** new_buck;
if (htb->mancbs->sizer) if (htb->style->sizer)
{ {
new_capa = htb->mancbs->sizer (htb, htb->capa + 1); new_capa = htb->style->sizer (htb, htb->capa + 1);
/* if no change in capacity, return success /* if no change in capacity, return success
* without reorganization */ * without reorganization */
@ -423,7 +426,7 @@ static QSE_INLINE_ALWAYS int reorganize (htb_t* htb)
{ {
pair_t* next = NEXT(pair); pair_t* next = NEXT(pair);
hc = htb->mancbs->hasher (htb, hc = htb->style->hasher (htb,
KPTR(pair), KPTR(pair),
KLEN(pair)) % new_capa; KLEN(pair)) % new_capa;
@ -454,7 +457,7 @@ static pair_t* insert (
pair_t* pair, * p, * prev, * next; pair_t* pair, * p, * prev, * next;
size_t hc; size_t hc;
hc = htb->mancbs->hasher(htb,kptr,klen) % htb->capa; hc = htb->style->hasher(htb,kptr,klen) % htb->capa;
pair = htb->bucket[hc]; pair = htb->bucket[hc];
prev = QSE_NULL; prev = QSE_NULL;
@ -462,7 +465,7 @@ static pair_t* insert (
{ {
next = NEXT(pair); next = NEXT(pair);
if (htb->mancbs->comper (htb, KPTR(pair), KLEN(pair), kptr, klen) == 0) if (htb->style->comper (htb, KPTR(pair), KLEN(pair), kptr, klen) == 0)
{ {
/* found a pair with a matching key */ /* found a pair with a matching key */
switch (opt) switch (opt)
@ -509,7 +512,7 @@ static pair_t* insert (
* more bucket collision and performance penalty. */ * more bucket collision and performance penalty. */
if (reorganize(htb) == 0) if (reorganize(htb) == 0)
{ {
hc = htb->mancbs->hasher(htb,kptr,klen) % htb->capa; hc = htb->style->hasher(htb,kptr,klen) % htb->capa;
} }
} }
@ -556,7 +559,7 @@ pair_t* qse_htb_cbsert (
pair_t* pair, * p, * prev, * next; pair_t* pair, * p, * prev, * next;
size_t hc; size_t hc;
hc = htb->mancbs->hasher(htb,kptr,klen) % htb->capa; hc = htb->style->hasher(htb,kptr,klen) % htb->capa;
pair = htb->bucket[hc]; pair = htb->bucket[hc];
prev = QSE_NULL; prev = QSE_NULL;
@ -564,7 +567,7 @@ pair_t* qse_htb_cbsert (
{ {
next = NEXT(pair); next = NEXT(pair);
if (htb->mancbs->comper (htb, KPTR(pair), KLEN(pair), kptr, klen) == 0) if (htb->style->comper (htb, KPTR(pair), KLEN(pair), kptr, klen) == 0)
{ {
/* found a pair with a matching key */ /* found a pair with a matching key */
p = cbserter (htb, pair, kptr, klen, ctx); p = cbserter (htb, pair, kptr, klen, ctx);
@ -596,7 +599,7 @@ pair_t* qse_htb_cbsert (
* more bucket collision and performance penalty. */ * more bucket collision and performance penalty. */
if (reorganize(htb) == 0) if (reorganize(htb) == 0)
{ {
hc = htb->mancbs->hasher(htb,kptr,klen) % htb->capa; hc = htb->style->hasher(htb,kptr,klen) % htb->capa;
} }
} }
@ -617,13 +620,13 @@ int qse_htb_delete (htb_t* htb, const void* kptr, size_t klen)
pair_t* pair, * prev; pair_t* pair, * prev;
size_t hc; size_t hc;
hc = htb->mancbs->hasher(htb,kptr,klen) % htb->capa; hc = htb->style->hasher(htb,kptr,klen) % htb->capa;
pair = htb->bucket[hc]; pair = htb->bucket[hc];
prev = QSE_NULL; prev = QSE_NULL;
while (pair != QSE_NULL) while (pair != QSE_NULL)
{ {
if (htb->mancbs->comper (htb, KPTR(pair), KLEN(pair), kptr, klen) == 0) if (htb->style->comper (htb, KPTR(pair), KLEN(pair), kptr, klen) == 0)
{ {
if (prev == QSE_NULL) if (prev == QSE_NULL)
htb->bucket[hc] = NEXT(pair); htb->bucket[hc] = NEXT(pair);

View File

@ -30,8 +30,8 @@
#define keeper_t qse_rbt_keeper_t #define keeper_t qse_rbt_keeper_t
#define walker_t qse_rbt_walker_t #define walker_t qse_rbt_walker_t
#define cbserter_t qse_rbt_cbserter_t #define cbserter_t qse_rbt_cbserter_t
#define mancbs_t qse_rbt_mancbs_t #define style_t qse_rbt_style_t
#define mancbs_kind_t qse_rbt_mancbs_kind_t #define style_kind_t qse_rbt_style_kind_t
#define KPTR(p) QSE_RBT_KPTR(p) #define KPTR(p) QSE_RBT_KPTR(p)
#define KLEN(p) QSE_RBT_KLEN(p) #define KLEN(p) QSE_RBT_KLEN(p)
@ -64,8 +64,8 @@ QSE_INLINE pair_t* qse_rbt_allocpair (
{ {
pair_t* n; pair_t* n;
copier_t kcop = rbt->mancbs->copier[QSE_RBT_KEY]; copier_t kcop = rbt->style->copier[QSE_RBT_KEY];
copier_t vcop = rbt->mancbs->copier[QSE_RBT_VAL]; copier_t vcop = rbt->style->copier[QSE_RBT_VAL];
size_t as = SIZEOF(pair_t); size_t as = SIZEOF(pair_t);
if (kcop == QSE_RBT_COPIER_INLINE) as += KTOB(rbt,klen); if (kcop == QSE_RBT_COPIER_INLINE) as += KTOB(rbt,klen);
@ -116,8 +116,8 @@ QSE_INLINE pair_t* qse_rbt_allocpair (
VPTR(n) = vcop (rbt, vptr, vlen); VPTR(n) = vcop (rbt, vptr, vlen);
if (VPTR(n) != QSE_NULL) if (VPTR(n) != QSE_NULL)
{ {
if (rbt->mancbs->freeer[QSE_RBT_KEY] != QSE_NULL) if (rbt->style->freeer[QSE_RBT_KEY] != QSE_NULL)
rbt->mancbs->freeer[QSE_RBT_KEY] (rbt, KPTR(n), KLEN(n)); rbt->style->freeer[QSE_RBT_KEY] (rbt, KPTR(n), KLEN(n));
QSE_MMGR_FREE (rbt->mmgr, n); QSE_MMGR_FREE (rbt->mmgr, n);
return QSE_NULL; return QSE_NULL;
} }
@ -128,14 +128,14 @@ QSE_INLINE pair_t* qse_rbt_allocpair (
QSE_INLINE void qse_rbt_freepair (rbt_t* rbt, pair_t* pair) QSE_INLINE void qse_rbt_freepair (rbt_t* rbt, pair_t* pair)
{ {
if (rbt->mancbs->freeer[QSE_RBT_KEY] != QSE_NULL) if (rbt->style->freeer[QSE_RBT_KEY] != QSE_NULL)
rbt->mancbs->freeer[QSE_RBT_KEY] (rbt, KPTR(pair), KLEN(pair)); rbt->style->freeer[QSE_RBT_KEY] (rbt, KPTR(pair), KLEN(pair));
if (rbt->mancbs->freeer[QSE_RBT_VAL] != QSE_NULL) if (rbt->style->freeer[QSE_RBT_VAL] != QSE_NULL)
rbt->mancbs->freeer[QSE_RBT_VAL] (rbt, VPTR(pair), VLEN(pair)); rbt->style->freeer[QSE_RBT_VAL] (rbt, VPTR(pair), VLEN(pair));
QSE_MMGR_FREE (rbt->mmgr, pair); QSE_MMGR_FREE (rbt->mmgr, pair);
} }
static mancbs_t mancbs[] = static style_t style[] =
{ {
{ {
{ {
@ -190,9 +190,9 @@ static mancbs_t mancbs[] =
} }
}; };
const mancbs_t* qse_getrbtmancbs (mancbs_kind_t kind) const style_t* qse_getrbtstyle (style_kind_t kind)
{ {
return &mancbs[kind]; return &style[kind];
} }
rbt_t* qse_rbt_open (mmgr_t* mmgr, size_t xtnsize, int kscale, int vscale) rbt_t* qse_rbt_open (mmgr_t* mmgr, size_t xtnsize, int kscale, int vscale)
@ -228,7 +228,7 @@ int qse_rbt_init (rbt_t* rbt, mmgr_t* mmgr, int kscale, int vscale)
rbt->scale[QSE_RBT_VAL] = (vscale < 1)? 1: vscale; rbt->scale[QSE_RBT_VAL] = (vscale < 1)? 1: vscale;
rbt->size = 0; rbt->size = 0;
rbt->mancbs = &mancbs[0]; rbt->style = &style[0];
/* self-initializing nil */ /* self-initializing nil */
QSE_MEMSET(&rbt->xnil, 0, QSE_SIZEOF(rbt->xnil)); QSE_MEMSET(&rbt->xnil, 0, QSE_SIZEOF(rbt->xnil));
@ -257,15 +257,15 @@ void* qse_rbt_getxtn (qse_rbt_t* rbt)
return QSE_XTN (rbt); return QSE_XTN (rbt);
} }
const mancbs_t* qse_rbt_getmancbs (const rbt_t* rbt) const style_t* qse_rbt_getstyle (const rbt_t* rbt)
{ {
return rbt->mancbs; return rbt->style;
} }
void qse_rbt_setmancbs (rbt_t* rbt, const mancbs_t* mancbs) void qse_rbt_setstyle (rbt_t* rbt, const style_t* style)
{ {
QSE_ASSERT (mancbs != QSE_NULL); QSE_ASSERT (style != QSE_NULL);
rbt->mancbs = mancbs; rbt->style = style;
} }
size_t qse_rbt_getsize (const rbt_t* rbt) size_t qse_rbt_getsize (const rbt_t* rbt)
@ -279,7 +279,7 @@ pair_t* qse_rbt_search (const rbt_t* rbt, const void* kptr, size_t klen)
while (!IS_NIL(rbt,pair)) while (!IS_NIL(rbt,pair))
{ {
int n = rbt->mancbs->comper (rbt, kptr, klen, KPTR(pair), KLEN(pair)); int n = rbt->style->comper (rbt, kptr, klen, KPTR(pair), KLEN(pair));
if (n == 0) return pair; if (n == 0) return pair;
if (n > 0) pair = pair->right; if (n > 0) pair = pair->right;
@ -429,14 +429,14 @@ static pair_t* change_pair_val (
/* if the old value and the new value are the same, /* if the old value and the new value are the same,
* it just calls the handler for this condition. * it just calls the handler for this condition.
* No value replacement occurs. */ * No value replacement occurs. */
if (rbt->mancbs->keeper != QSE_NULL) if (rbt->style->keeper != QSE_NULL)
{ {
rbt->mancbs->keeper (rbt, vptr, vlen); rbt->style->keeper (rbt, vptr, vlen);
} }
} }
else else
{ {
copier_t vcop = rbt->mancbs->copier[QSE_RBT_VAL]; copier_t vcop = rbt->style->copier[QSE_RBT_VAL];
void* ovptr = VPTR(pair); void* ovptr = VPTR(pair);
size_t ovlen = VLEN(pair); size_t ovlen = VLEN(pair);
@ -495,9 +495,9 @@ static pair_t* change_pair_val (
} }
/* free up the old value */ /* free up the old value */
if (rbt->mancbs->freeer[QSE_RBT_VAL] != QSE_NULL) if (rbt->style->freeer[QSE_RBT_VAL] != QSE_NULL)
{ {
rbt->mancbs->freeer[QSE_RBT_VAL] (rbt, ovptr, ovlen); rbt->style->freeer[QSE_RBT_VAL] (rbt, ovptr, ovlen);
} }
} }
@ -513,7 +513,7 @@ static pair_t* insert (
while (!IS_NIL(rbt,x_cur)) while (!IS_NIL(rbt,x_cur))
{ {
int n = rbt->mancbs->comper (rbt, kptr, klen, KPTR(x_cur), KLEN(x_cur)); int n = rbt->style->comper (rbt, kptr, klen, KPTR(x_cur), KLEN(x_cur));
if (n == 0) if (n == 0)
{ {
switch (opt) switch (opt)
@ -552,7 +552,7 @@ static pair_t* insert (
else else
{ {
/* perform normal binary insert */ /* perform normal binary insert */
int n = rbt->mancbs->comper (rbt, kptr, klen, KPTR(x_par), KLEN(x_par)); int n = rbt->style->comper (rbt, kptr, klen, KPTR(x_par), KLEN(x_par));
if (n > 0) if (n > 0)
{ {
QSE_ASSERT (x_par->right == &rbt->xnil); QSE_ASSERT (x_par->right == &rbt->xnil);
@ -607,7 +607,7 @@ pair_t* qse_rbt_cbsert (
while (!IS_NIL(rbt,x_cur)) while (!IS_NIL(rbt,x_cur))
{ {
int n = rbt->mancbs->comper (rbt, kptr, klen, KPTR(x_cur), KLEN(x_cur)); int n = rbt->style->comper (rbt, kptr, klen, KPTR(x_cur), KLEN(x_cur));
if (n == 0) if (n == 0)
{ {
/* back up the contents of the current pair /* back up the contents of the current pair
@ -672,7 +672,7 @@ pair_t* qse_rbt_cbsert (
else else
{ {
/* perform normal binary insert */ /* perform normal binary insert */
int n = rbt->mancbs->comper (rbt, kptr, klen, KPTR(x_par), KLEN(x_par)); int n = rbt->style->comper (rbt, kptr, klen, KPTR(x_par), KLEN(x_par));
if (n > 0) if (n > 0)
{ {
QSE_ASSERT (x_par->right == &rbt->xnil); QSE_ASSERT (x_par->right == &rbt->xnil);

View File

@ -37,7 +37,7 @@ static void free_hdrval (qse_htb_t* htb, void* vptr, qse_size_t vlen)
int qse_htre_init (qse_htre_t* re, qse_mmgr_t* mmgr) int qse_htre_init (qse_htre_t* re, qse_mmgr_t* mmgr)
{ {
static qse_htb_mancbs_t mancbs = static qse_htb_style_t style =
{ {
{ {
QSE_HTB_COPIER_DEFAULT, QSE_HTB_COPIER_DEFAULT,
@ -59,8 +59,8 @@ int qse_htre_init (qse_htre_t* re, qse_mmgr_t* mmgr)
if (qse_htb_init (&re->hdrtab, mmgr, 60, 70, 1, 1) <= -1) return -1; if (qse_htb_init (&re->hdrtab, mmgr, 60, 70, 1, 1) <= -1) return -1;
if (qse_htb_init (&re->trailers, mmgr, 20, 70, 1, 1) <= -1) return -1; if (qse_htb_init (&re->trailers, mmgr, 20, 70, 1, 1) <= -1) return -1;
qse_htb_setmancbs (&re->hdrtab, &mancbs); qse_htb_setstyle (&re->hdrtab, &style);
qse_htb_setmancbs (&re->trailers, &mancbs); qse_htb_setstyle (&re->trailers, &style);
qse_mbs_init (&re->content, mmgr, 0); qse_mbs_init (&re->content, mmgr, 0);
#if 0 #if 0

View File

@ -399,7 +399,7 @@ static QSE_INLINE int task_main_dir (
dir = (task_dir_t*)task->ctx; dir = (task_dir_t*)task->ctx;
x = task; x = task;
if (qse_mbsend (dir->path.ptr, QSE_MT("/"))) if (qse_mbsend (dir->qpath.ptr, QSE_MT("/")))
{ {
if (httpd->opt.scb.dir.open (httpd, dir->path.ptr, &handle) <= -1) if (httpd->opt.scb.dir.open (httpd, dir->path.ptr, &handle) <= -1)
{ {

View File

@ -2209,8 +2209,11 @@ static qse_mchar_t* merge_paths (
qse_size_t idx = 0; qse_size_t idx = 0;
ta[idx++] = base; ta[idx++] = base;
if (path[0] != QSE_MT('\0'))
{
ta[idx++] = QSE_MT("/"); ta[idx++] = QSE_MT("/");
ta[idx++] = path; ta[idx++] = path;
}
ta[idx++] = QSE_NULL; ta[idx++] = QSE_NULL;
xpath = qse_mbsadup (ta, QSE_NULL, httpd->mmgr); xpath = qse_mbsadup (ta, QSE_NULL, httpd->mmgr);
if (xpath == QSE_NULL) if (xpath == QSE_NULL)
@ -2231,11 +2234,17 @@ static void merge_paths_to_buf (
* to hold the result. it doesn't duplicate the result */ * to hold the result. it doesn't duplicate the result */
qse_size_t len = 0; qse_size_t len = 0;
len += qse_mbscpy (&xpath[len], base); len += qse_mbscpy (&xpath[len], base);
len += qse_mbscpy (&xpath[len], QSE_MT("/"));
if (plen == (qse_size_t)-1) if (plen == (qse_size_t)-1)
{
len += qse_mbscpy (&xpath[len], QSE_MT("/"));
len += qse_mbscpy (&xpath[len], path); len += qse_mbscpy (&xpath[len], path);
else }
else if (plen > 0)
{
len += qse_mbscpy (&xpath[len], QSE_MT("/"));
len += qse_mbsncpy (&xpath[len], path, plen); len += qse_mbsncpy (&xpath[len], path, plen);
}
qse_canonmbspath (xpath, xpath, 0); qse_canonmbspath (xpath, xpath, 0);
} }
@ -2245,6 +2254,9 @@ struct rsrc_tmp_t
const qse_mchar_t* idxfile; const qse_mchar_t* idxfile;
qse_mchar_t* xpath; qse_mchar_t* xpath;
qse_size_t qpath_len;
const qse_mchar_t* qpath_rp;
qse_httpd_serverstd_root_t root; qse_httpd_serverstd_root_t root;
qse_httpd_serverstd_realm_t realm; qse_httpd_serverstd_realm_t realm;
qse_httpd_serverstd_auth_t auth; qse_httpd_serverstd_auth_t auth;
@ -2295,7 +2307,7 @@ static int attempt_cgi (
QSE_ASSERT (tmp->qpath[0] == QSE_T('/')); QSE_ASSERT (tmp->qpath[0] == QSE_T('/'));
ptr = tmp->qpath + 1; ptr = tmp->qpath_rp + 1;
while (*ptr != QSE_MT('\0')) while (*ptr != QSE_MT('\0'))
{ {
slash = qse_mbschr (ptr, QSE_MT('/')); slash = qse_mbschr (ptr, QSE_MT('/'));
@ -2309,8 +2321,9 @@ static int attempt_cgi (
/* a slash is found and the segment is not empty. /* a slash is found and the segment is not empty.
* *
* tmp->xpath should be large enough to hold the merge path made of * tmp->xpath should be large enough to hold the merge path made of
* the subsegments of the original query path and docroot. */ * the subsegments of the original query path and docroot.
merge_paths_to_buf (httpd, tmp->root.u.path, tmp->qpath, slash - tmp->qpath, tmp->xpath); */
merge_paths_to_buf (httpd, tmp->root.u.path.val, tmp->qpath_rp, slash - tmp->qpath_rp, tmp->xpath);
xpath_changed = 1; xpath_changed = 1;
stx = stat_file (httpd, tmp->xpath, &st, 0); stx = stat_file (httpd, tmp->xpath, &st, 0);
@ -2326,7 +2339,10 @@ static int attempt_cgi (
{ {
if (server_xtn->query (httpd, client->server, req, tmp->xpath, QSE_HTTPD_SERVERSTD_CGI, &cgi) >= 0 && cgi.cgi) if (server_xtn->query (httpd, client->server, req, tmp->xpath, QSE_HTTPD_SERVERSTD_CGI, &cgi) >= 0 && cgi.cgi)
{ {
script = qse_mbsxdup (tmp->qpath, slash - tmp->qpath , httpd->mmgr); /* the script name is composed of the orginal query path.
* the pointer held in 'slash' is valid for tmp->qpath as
* tmp->qpath_rp is at most the tail part of tmp->qpath. */
script = qse_mbsxdup (tmp->qpath, slash - tmp->qpath, httpd->mmgr);
suffix = qse_mbsdup (slash, httpd->mmgr); suffix = qse_mbsdup (slash, httpd->mmgr);
if (!script || !suffix) goto oops; if (!script || !suffix) goto oops;
@ -2351,8 +2367,8 @@ static int attempt_cgi (
} }
} }
/* restore the xpath because it has changed... */ /* restore xpath because it has changed... */
if (xpath_changed) merge_paths_to_buf (httpd, tmp->root.u.path, tmp->qpath, (qse_size_t)-1, tmp->xpath); if (xpath_changed) merge_paths_to_buf (httpd, tmp->root.u.path.val, tmp->qpath_rp, (qse_size_t)-1, tmp->xpath);
} }
return 0; /* not a cgi */ return 0; /* not a cgi */
@ -2363,7 +2379,7 @@ bingo:
target->u.cgi.path = tmp->xpath; target->u.cgi.path = tmp->xpath;
target->u.cgi.script = script; target->u.cgi.script = script;
target->u.cgi.suffix = suffix; target->u.cgi.suffix = suffix;
target->u.cgi.root = tmp->root.u.path; target->u.cgi.root = tmp->root.u.path.val;
target->u.cgi.shebang = shebang; target->u.cgi.shebang = shebang;
return 1; return 1;
@ -2387,6 +2403,7 @@ static int make_resource (
QSE_MEMSET (&tmp, 0, QSE_SIZEOF(tmp)); QSE_MEMSET (&tmp, 0, QSE_SIZEOF(tmp));
tmp.qpath = qse_htre_getqpath(req); tmp.qpath = qse_htre_getqpath(req);
tmp.qpath_len = qse_mbslen (tmp.qpath);
QSE_MEMSET (target, 0, QSE_SIZEOF(*target)); QSE_MEMSET (target, 0, QSE_SIZEOF(*target));
@ -2411,9 +2428,11 @@ static int make_resource (
return -1; return -1;
} }
/* default to the root directory. */ /* default to the root directory. */
if (!tmp.root.u.path) tmp.root.u.path = QSE_MT("/"); if (!tmp.root.u.path.val) tmp.root.u.path.val = QSE_MT("/");
tmp.qpath_rp = (tmp.root.u.path.rpl >= tmp.qpath_len)?
&tmp.qpath[tmp.qpath_len]: &tmp.qpath[tmp.root.u.path.rpl];
if (tmp.realm.authreq && tmp.realm.name) if (tmp.realm.authreq && tmp.realm.name)
{ {
@ -2458,7 +2477,7 @@ static int make_resource (
} }
auth_ok: auth_ok:
tmp.xpath = merge_paths (httpd, tmp.root.u.path, tmp.qpath); tmp.xpath = merge_paths (httpd, tmp.root.u.path.val, tmp.qpath_rp);
if (tmp.xpath == QSE_NULL) return -1; if (tmp.xpath == QSE_NULL) return -1;
stx = stat_file (httpd, tmp.xpath, &st, 0); stx = stat_file (httpd, tmp.xpath, &st, 0);
@ -2620,13 +2639,20 @@ static int query_server (
switch (code) switch (code)
{ {
case QSE_HTTPD_SERVERSTD_SSL:
/* you must specify the certificate and the key file to be able
* to use SSL */
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOENT);
return -1;
case QSE_HTTPD_SERVERSTD_NAME: case QSE_HTTPD_SERVERSTD_NAME:
*(const qse_mchar_t**)result = QSE_NULL; *(const qse_mchar_t**)result = QSE_NULL;
break; break;
case QSE_HTTPD_SERVERSTD_ROOT: case QSE_HTTPD_SERVERSTD_ROOT:
((qse_httpd_serverstd_root_t*)result)->type = QSE_HTTPD_SERVERSTD_ROOT_PATH; ((qse_httpd_serverstd_root_t*)result)->type = QSE_HTTPD_SERVERSTD_ROOT_PATH;
((qse_httpd_serverstd_root_t*)result)->u.path = QSE_NULL; ((qse_httpd_serverstd_root_t*)result)->u.path.val = QSE_NULL;
((qse_httpd_serverstd_root_t*)result)->u.path.rpl = 0;
break; break;
case QSE_HTTPD_SERVERSTD_REALM: case QSE_HTTPD_SERVERSTD_REALM:
@ -2685,12 +2711,6 @@ static int query_server (
case QSE_HTTPD_SERVERSTD_FILEACC: case QSE_HTTPD_SERVERSTD_FILEACC:
*(int*)result = 200; *(int*)result = 200;
return 0; return 0;
case QSE_HTTPD_SERVERSTD_SSL:
/* you must specify the certificate and the key file to be able
* to use SSL */
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOENT);
return -1;
} }
qse_httpd_seterrnum (httpd, QSE_HTTPD_EINVAL); qse_httpd_seterrnum (httpd, QSE_HTTPD_EINVAL);

View File

@ -97,9 +97,9 @@ int qse_sed_init (qse_sed_t* sed, qse_mmgr_t* mmgr)
if (qse_map_init (&sed->tmp.labs, mmgr, if (qse_map_init (&sed->tmp.labs, mmgr,
128, 70, QSE_SIZEOF(qse_char_t), 1) <= -1) goto oops_3; 128, 70, QSE_SIZEOF(qse_char_t), 1) <= -1) goto oops_3;
qse_map_setmancbs ( qse_map_setstyle (
&sed->tmp.labs, &sed->tmp.labs,
qse_getmapmancbs(QSE_MAP_MANCBS_INLINE_KEY_COPIER) qse_getmapstyle(QSE_MAP_STYLE_INLINE_KEY_COPIER)
); );
/* init_append (sed); */ /* init_append (sed); */
@ -3911,7 +3911,7 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_impl_t inf, qse_sed_io_impl_t outf)
qse_ssize_t n; qse_ssize_t n;
int ret = 0; int ret = 0;
static qse_map_mancbs_t mancbs = static qse_map_style_t style =
{ {
{ {
QSE_MAP_COPIER_INLINE, QSE_MAP_COPIER_INLINE,
@ -3955,7 +3955,7 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_impl_t inf, qse_sed_io_impl_t outf)
return -1; return -1;
} }
*(qse_sed_t**)QSE_XTN(&sed->e.out.files) = sed; *(qse_sed_t**)QSE_XTN(&sed->e.out.files) = sed;
qse_map_setmancbs (&sed->e.out.files, &mancbs); qse_map_setstyle (&sed->e.out.files, &style);
sed->e.in.fun = inf; sed->e.in.fun = inf;
sed->e.in.eof = 0; sed->e.in.eof = 0;

View File

@ -72,8 +72,8 @@ int qse_xli_init (qse_xli_t* xli, qse_mmgr_t* mmgr)
); );
if (xli->sio_names == QSE_NULL) goto oops; if (xli->sio_names == QSE_NULL) goto oops;
*(qse_xli_t**)QSE_XTN(xli->sio_names) = xli; *(qse_xli_t**)QSE_XTN(xli->sio_names) = xli;
qse_htb_setmancbs (xli->sio_names, qse_htb_setstyle (xli->sio_names,
qse_gethtbmancbs(QSE_HTB_MANCBS_INLINE_KEY_COPIER) qse_gethtbstyle(QSE_HTB_STYLE_INLINE_KEY_COPIER)
); );
xli->root.type = QSE_XLI_LIST; xli->root.type = QSE_XLI_LIST;
@ -433,9 +433,9 @@ static qse_xli_pair_t* find_pair_byindex (
qse_xli_pair_t* qse_xli_findpairbyname (qse_xli_t* xli, const qse_xli_list_t* list, const qse_char_t* name) qse_xli_pair_t* qse_xli_findpairbyname (qse_xli_t* xli, const qse_xli_list_t* list, const qse_char_t* name)
{ {
const qse_char_t* ptr; const qse_char_t* ptr;
qse_cstr_t seg; const qse_xli_list_t* curlist;
qse_xli_list_t* curlist;
qse_xli_pair_t* pair; qse_xli_pair_t* pair;
qse_cstr_t seg;
curlist = list? list: &xli->root; curlist = list? list: &xli->root;
@ -557,9 +557,9 @@ noent:
qse_size_t qse_xli_getnumpairsbyname (qse_xli_t* xli, const qse_xli_list_t* list, const qse_char_t* name) qse_size_t qse_xli_getnumpairsbyname (qse_xli_t* xli, const qse_xli_list_t* list, const qse_char_t* name)
{ {
const qse_char_t* ptr; const qse_char_t* ptr;
qse_cstr_t seg; const qse_xli_list_t* curlist;
qse_xli_list_t* curlist;
qse_xli_pair_t* pair; qse_xli_pair_t* pair;
qse_cstr_t seg;
curlist = list? list: &xli->root; curlist = list? list: &xli->root;
@ -679,7 +679,9 @@ qse_size_t qse_xli_getnumpairsbyname (qse_xli_t* xli, const qse_xli_list_t* list
curlist = (qse_xli_list_t*)pair->val; curlist = (qse_xli_list_t*)pair->val;
} }
return pair; /* this part must never be reached */
qse_xli_seterrnum (xli, QSE_XLI_EINTERN, QSE_NULL);
return 0;
inval: inval:
qse_xli_seterrnum (xli, QSE_XLI_EINVAL, QSE_NULL); qse_xli_seterrnum (xli, QSE_XLI_EINVAL, QSE_NULL);