added missing functions and macros.

documented more functions
This commit is contained in:
hyung-hwan 2010-09-08 06:29:25 +00:00
parent 95e975f514
commit 70bf0fceaf
14 changed files with 282 additions and 230 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $Id: chr.h 323 2010-04-05 12:50:01Z hyunghwan.chung $ * $Id: chr.h 356 2010-09-07 12:29:25Z hyunghwan.chung $
* *
Copyright 2006-2009 Chung, Hyung-Hwan. Copyright 2006-2009 Chung, Hyung-Hwan.
This file is part of QSE. This file is part of QSE.
@ -24,10 +24,8 @@
#include <qse/types.h> #include <qse/types.h>
#include <qse/macros.h> #include <qse/macros.h>
/****t* Common/qse_ccls_id_t /**
* NAME * The qse_ccls_id_t type defines character class types.
* qse_ccls_id_t - define character class types
* SYNOPSIS
*/ */
enum qse_ccls_id_t enum qse_ccls_id_t
{ {
@ -44,7 +42,6 @@ enum qse_ccls_id_t
QSE_CCLS_PUNCT QSE_CCLS_PUNCT
}; };
typedef enum qse_ccls_id_t qse_ccls_id_t; typedef enum qse_ccls_id_t qse_ccls_id_t;
/******/
#ifdef USE_STDC #ifdef USE_STDC
# if defined(QSE_CHAR_IS_MCHAR) # if defined(QSE_CHAR_IS_MCHAR)

View File

@ -1,5 +1,5 @@
/* /*
* $Id: dll.h 354 2010-09-03 12:50:08Z hyunghwan.chung $ * $Id: dll.h 356 2010-09-07 12:29:25Z hyunghwan.chung $
* *
Copyright 2006-2009 Chung, Hyung-Hwan. Copyright 2006-2009 Chung, Hyung-Hwan.
This file is part of QSE. This file is part of QSE.
@ -109,7 +109,7 @@
#define QSE_DLL_HEAD(dll) QSE_GDL_HEAD(&(dll)->gdl) #define QSE_DLL_HEAD(dll) QSE_GDL_HEAD(&(dll)->gdl)
#define QSE_DLL_TAIL(dll) QSE_GDL_TAIL(&(dll)->gdl) #define QSE_DLL_TAIL(dll) QSE_GDL_TAIL(&(dll)->gdl)
#define QSE_DLL_SIZE(dll) ((dll)->size) #define QSE_DLL_SIZE(dll) ((const qse_size_t)(dll)->size)
/** /**
* The QSE_DLL_ADDHEAD macro add a member node @a x to the head of * The QSE_DLL_ADDHEAD macro add a member node @a x to the head of
@ -219,11 +219,10 @@ struct qse_dll_t
#define QSE_DLL_COPIER_SIMPLE ((qse_dll_copier_t)1) #define QSE_DLL_COPIER_SIMPLE ((qse_dll_copier_t)1)
#define QSE_DLL_COPIER_INLINE ((qse_dll_copier_t)2) #define QSE_DLL_COPIER_INLINE ((qse_dll_copier_t)2)
#define QSE_DLL_SCALE(dll) ((dll)->scale) #define QSE_DLL_SCALE(dll) ((const int)(dll)->scale)
#define QSE_DLL_DPTR(node) ((node)->dptr) #define QSE_DLL_DPTR(node) ((node)->dptr)
#define QSE_DLL_DLEN(node) ((node)->dlen) #define QSE_DLL_DLEN(node) ((node)->dlen)
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -323,6 +322,21 @@ qse_dll_freeer_t qse_dll_getfreeer (
qse_dll_t* dll /**< doubly linked list */ qse_dll_t* dll /**< doubly linked list */
); );
/**
* The qse_dll_getcomper() function returns the data comparator.
*/
qse_dll_comper_t qse_dll_getcomper (
qse_dll_t* dll /**< doubly linked list */
);
/**
* The qse_dll_setcomper() function changes the data comparator
*/
void qse_dll_setcomper (
qse_dll_t* dll, /**< doubly linked list */
qse_dll_comper_t comper /**< comparator */
);
/** /**
* The qse_dll_getsize() function returns the number of the data nodes held * The qse_dll_getsize() function returns the number of the data nodes held
* in a doubly linked list. * in a doubly linked list.

View File

@ -1,5 +1,5 @@
/* /*
* $Id: htb.h 355 2010-09-07 10:57:43Z hyunghwan.chung $ * $Id: htb.h 356 2010-09-07 12:29:25Z hyunghwan.chung $
* *
Copyright 2006-2009 Chung, Hyung-Hwan. Copyright 2006-2009 Chung, Hyung-Hwan.
This file is part of QSE. This file is part of QSE.
@ -158,7 +158,6 @@ struct qse_htb_t
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 */
qse_byte_t filler0;
qse_size_t size; qse_size_t size;
qse_size_t capa; qse_size_t capa;
@ -173,26 +172,17 @@ struct qse_htb_t
/** /**
* The QSE_HTB_SIZE() macro returns the number of pairs in a hash table. * The QSE_HTB_SIZE() macro returns the number of pairs in a hash table.
*/ */
#define QSE_HTB_SIZE(m) ((m)->size) #define QSE_HTB_SIZE(m) ((const qse_size_t)(m)->size)
/** /**
* The QSE_HTB_CAPA() macro returns the maximum number of pairs that can be * The QSE_HTB_CAPA() macro returns the maximum number of pairs that can be
* stored in a hash table without further reorganization. * stored in a hash table without further reorganization.
*/ */
#define QSE_HTB_CAPA(m) ((m)->capa) #define QSE_HTB_CAPA(m) ((const qse_size_t)(m)->capa)
#define QSE_HTB_KCOPIER(m) ((m)->copier[QSE_HTB_KEY]) #define QSE_HTB_FACTOR(m) ((const int)(m)->factor)
#define QSE_HTB_VCOPIER(m) ((m)->copier[QSE_HTB_VAL]) #define QSE_HTB_KSCALE(m) ((const int)(m)->scale[QSE_HTB_KEY])
#define QSE_HTB_KFREEER(m) ((m)->freeer[QSE_HTB_KEY]) #define QSE_HTB_VSCALE(m) ((const int)(m)->scale[QSE_HTB_VAL])
#define QSE_HTB_VFREEER(m) ((m)->freeer[QSE_HTB_VAL])
#define QSE_HTB_HASHER(m) ((m)->hasher)
#define QSE_HTB_COMPER(m) ((m)->comper)
#define QSE_HTB_KEEPER(m) ((m)->keeper)
#define QSE_HTB_SIZER(m) ((m)->sizer)
#define QSE_HTB_FACTOR(m) ((m)->factor)
#define QSE_HTB_KSCALE(m) ((m)->scale[QSE_HTB_KEY])
#define QSE_HTB_VSCALE(m) ((m)->scale[QSE_HTB_VAL])
#define QSE_HTB_KPTR(p) ((p)->kptr) #define QSE_HTB_KPTR(p) ((p)->kptr)
#define QSE_HTB_KLEN(p) ((p)->klen) #define QSE_HTB_KLEN(p) ((p)->klen)
@ -364,7 +354,7 @@ void qse_htb_setsizer (
); );
/** /**
* The qse_htb_search() function searches hash table to find a pair with a * The qse_htb_search() function searches a hash table to find a pair with a
* matching key. It returns the pointer to the pair found. If it fails * matching key. It returns the pointer to the pair found. If it fails
* to find one, it returns QSE_NULL. * to find one, it returns QSE_NULL.
* @return pointer to the pair with a maching key, * @return pointer to the pair with a maching key,
@ -377,7 +367,7 @@ qse_htb_pair_t* qse_htb_search (
); );
/** /**
* The qse_htb_upsert() function searches hash table for the pair with a * The qse_htb_upsert() function searches a hash table for the pair with a
* matching key. If one is found, it updates the pair. Otherwise, it inserts * matching key. If one is found, it updates the pair. Otherwise, it inserts
* a new pair with the key and value given. It returns the pointer to the * a new pair with the key and value given. It returns the pointer to the
* pair updated or inserted. * pair updated or inserted.

View File

@ -1,5 +1,5 @@
/* /*
* $Id: lda.h 341 2010-08-04 07:25:48Z hyunghwan.chung $ * $Id: lda.h 356 2010-09-07 12:29:25Z hyunghwan.chung $
* *
Copyright 2006-2009 Chung, Hyung-Hwan. Copyright 2006-2009 Chung, Hyung-Hwan.
This file is part of QSE. This file is part of QSE.
@ -45,19 +45,13 @@ typedef enum qse_lda_walk_t qse_lda_walk_t;
#define QSE_LDA_NIL ((qse_size_t)-1) #define QSE_LDA_NIL ((qse_size_t)-1)
#define QSE_LDA_SIZE(lda) ((lda)->size) #define QSE_LDA_SIZE(lda) ((const qse_size_t)(lda)->size)
#define QSE_LDA_CAPA(lda) ((lda)->capa) #define QSE_LDA_CAPA(lda) ((const qse_size_t)(lda)->capa)
#define QSE_LDA_NODE(lda,index) ((lda)->node[index]) #define QSE_LDA_NODE(lda,index) ((lda)->node[index])
#define QSE_LDA_DPTR(lda,index) ((lda)->node[index]->dptr) #define QSE_LDA_DPTR(lda,index) ((lda)->node[index]->dptr)
#define QSE_LDA_DLEN(lda,index) ((lda)->node[index]->dlen) #define QSE_LDA_DLEN(lda,index) ((lda)->node[index]->dlen)
#define QSE_LDA_COPIER(lda) ((lda)->copier)
#define QSE_LDA_FREEER(lda) ((lda)->freeer)
#define QSE_LDA_COMPER(lda) ((lda)->comper)
#define QSE_LDA_KEEPER(lda) ((lda)->keeper)
#define QSE_LDA_SIZER(lda) ((lda)->sizer)
/** /**
* The qse_lda_copier_t type defines a callback function for node construction. * The qse_lda_copier_t type defines a callback function for node construction.
* A node is contructed when a user adds data to a list. The user can * A node is contructed when a user adds data to a list. The user can

View File

@ -18,17 +18,46 @@
License along with QSE. If not, see <http://www.gnu.org/licenses/>. License along with QSE. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef _QSE_OHT_T_
#define _QSE_OHT_T_
/** @file /** @file
* This file provides the open-addressed hash table for fixed-size data. * This file provides the open-addressed hash table for fixed-size data.
*/ */
#ifndef _QSE_OHT_T_
#define _QSE_OHT_T_
#include <qse/types.h> #include <qse/types.h>
#include <qse/macros.h> #include <qse/macros.h>
#define QSE_OHT_INVALID_INDEX ((qse_size_t)-1) /**
* The #QSE_OHT_NIL macro represents an invalid index.
*/
#define QSE_OHT_NIL ((qse_size_t)-1)
/**
* The #QSE_OHT_SIZE macro returns the number of items.
*/
#define QSE_OHT_SIZE(oht) ((const qse_size_t)(oht)->size)
/**
* The #QSE_OHT_CAPA macro returns the capacity of a table.
*/
#define QSE_OHT_CAPA(oht) ((const qse_size_t)(oht)->capa.hard)
/**
* The #QSE_OHT_LIMIT macro returns the maximum number of items.
* It is equal to or less than the capacity.
*/
#define QSE_OHT_LIMIT(oht) ((const qse_size_t)(oht)->capa.soft)
/**
* The #QSE_OHT_SCALE macro returns the size of an item in bytes.
*/
#define QSE_OHT_SCALE(oht) ((const int)(oht)->scale)
/**
* The #qse_oht_mark_t type defines enumerations values to indicate
* the slot status.
*/
enum qse_oht_mark_t enum qse_oht_mark_t
{ {
QSE_OHT_EMPTY = 0, QSE_OHT_EMPTY = 0,
@ -37,6 +66,9 @@ enum qse_oht_mark_t
}; };
typedef enum qse_oht_mark_t qse_oht_mark_t; typedef enum qse_oht_mark_t qse_oht_mark_t;
/**
* The #qse_oht_walk_t type defines walking directions.
*/
enum qse_oht_walk_t enum qse_oht_walk_t
{ {
QSE_OHT_WALK_STOP = 0, QSE_OHT_WALK_STOP = 0,
@ -47,7 +79,15 @@ typedef enum qse_oht_walk_t qse_oht_walk_t;
typedef struct qse_oht_t qse_oht_t; typedef struct qse_oht_t qse_oht_t;
/** /**
* The qse_oht_comper_t type defines a key comparator that is called when * The #qse_oht_hasher_t type defines a data hasher function.
*/
typedef qse_size_t (*qse_oht_hasher_t) (
qse_oht_t* oht,
const void* data
);
/**
* The #qse_oht_comper_t type defines a key comparator that is called when
* the list needs to compare data. The comparator must return 0 if the data * the list needs to compare data. The comparator must return 0 if the data
* are the same and a non-zero integer otherwise. * are the same and a non-zero integer otherwise.
*/ */
@ -57,28 +97,30 @@ typedef int (*qse_oht_comper_t) (
const void* data2 /**< data pointer */ const void* data2 /**< data pointer */
); );
/**
* The #qse_oht_copier_t type defines a data copier function.
*/
typedef void (*qse_oht_copier_t) ( typedef void (*qse_oht_copier_t) (
qse_oht_t* oht, qse_oht_t* oht,
void* dst, void* dst,
const void* src const void* src
); );
typedef qse_size_t (*qse_oht_hasher_t) ( /**
qse_oht_t* oht, * The #qse_oht_t type defines an open-address hash table for fixed-size data.
const void* data * Unlike #qse_rbt_t or #qse_htb_t, it does not separate a key from a value.
); */
struct qse_oht_t struct qse_oht_t
{ {
QSE_DEFINE_COMMON_FIELDS(oht) QSE_DEFINE_COMMON_FIELDS(oht)
int scale;
struct struct
{ {
qse_size_t hard; qse_size_t hard;
qse_size_t soft; qse_size_t soft;
} capa; } capa;
qse_size_t size; qse_size_t size;
qse_size_t scale;
qse_oht_hasher_t hasher; qse_oht_hasher_t hasher;
qse_oht_comper_t comper; qse_oht_comper_t comper;
@ -88,6 +130,10 @@ struct qse_oht_t
void* data; void* data;
}; };
/**
* The #qse_oht_walker_t function defines a callback function
* for qse_oht_walk().
*/
typedef qse_oht_walk_t (*qse_oht_walker_t) ( typedef qse_oht_walk_t (*qse_oht_walker_t) (
qse_oht_t* oht, qse_oht_t* oht,
void* data, void* data,
@ -100,90 +146,157 @@ extern "C" {
QSE_DEFINE_COMMON_FUNCTIONS (oht) QSE_DEFINE_COMMON_FUNCTIONS (oht)
/**
* The qse_oht_open() function creates an open-addressed hash table.
*/
qse_oht_t* qse_oht_open ( qse_oht_t* qse_oht_open (
qse_mmgr_t* mmgr, qse_mmgr_t* mmgr,
qse_size_t xtnsize, qse_size_t xtnsize,
qse_size_t scale, int scale,
qse_size_t capa, qse_size_t capa,
qse_size_t limit qse_size_t limit
); );
/**
* The qse_oht_close() function destroys an open-addressed hash table.
*/
void qse_oht_close ( void qse_oht_close (
qse_oht_t* oht qse_oht_t* oht /**< open-addressed hash table */
); );
/**
* The qse_oht_open() function initializes a statically declared
* open-addressed hash table.
*/
qse_oht_t* qse_oht_init ( qse_oht_t* qse_oht_init (
qse_oht_t* oht, qse_oht_t* oht,
qse_mmgr_t* mmgr, qse_mmgr_t* mmgr,
qse_size_t scale, int scale,
qse_size_t capa, qse_size_t capa,
qse_size_t limit qse_size_t limit
); );
/**
* The qse_oht_close() function finalizes an open-addressed hash table.
*/
void qse_oht_fini ( void qse_oht_fini (
qse_oht_t* oht qse_oht_t* oht /**< open-addressed hash table */
); );
/**
* The qse_oht_getcomper() function returns the data hasher.
*/
qse_oht_hasher_t qse_oht_gethasher ( qse_oht_hasher_t qse_oht_gethasher (
qse_oht_t* oht qse_oht_t* oht /**< open-addressed hash table */
); );
/**
* The qse_oht_setcomper() function changes the data hasher
*/
void qse_oht_sethasher ( void qse_oht_sethasher (
qse_oht_t* oht, qse_oht_t* oht, /**< open-addressed hash table */
qse_oht_hasher_t hahser qse_oht_hasher_t hasher /**< hasher */
); );
/**
* The qse_oht_getcomper() function returns the data comparator.
*/
qse_oht_comper_t qse_oht_getcomper ( qse_oht_comper_t qse_oht_getcomper (
qse_oht_t* oht qse_oht_t* oht /**< open-addressed hash table */
); );
/**
* The qse_oht_setcomper() function changes the data comparator
*/
void qse_oht_setcomper ( void qse_oht_setcomper (
qse_oht_t* oht, qse_oht_t* oht, /**< open-addressed hash table */
qse_oht_comper_t hahser qse_oht_comper_t comper /**< comparator */
); );
/**
* The qse_oht_getcomper() function returns the data copier.
*/
qse_oht_copier_t qse_oht_getcopier ( qse_oht_copier_t qse_oht_getcopier (
qse_oht_t* oht qse_oht_t* oht /**< open-addressed hash table */
); );
/**
* The qse_oht_setcomper() function changes the data copier.
*/
void qse_oht_setcopier ( void qse_oht_setcopier (
qse_oht_t* oht, qse_oht_t* oht, /**< open-addressed hash table */
qse_oht_copier_t hahser qse_oht_copier_t copier /**< copier */
); );
/**
* The qse_oht_search() function searches a hash table to find a
* matching datum. It returns the index to the slot of an internal array
* where the matching datum is found.
* @return slot index if a match if found,
* #QSE_OHT_NIL if no match is found.
*/
qse_size_t qse_oht_search ( qse_size_t qse_oht_search (
qse_oht_t* oht, qse_oht_t* oht, /**< open-addressed hash table */
void* data void* data /**< data pointer */
); );
/**
* The qse_oht_insert() function inserts a new datum. It fails if it finds
* an existing datum.
* @return slot index where the new datum is inserted on success,
* #QSE_OHT_NIL on failure.
*/
qse_size_t qse_oht_insert ( qse_size_t qse_oht_insert (
qse_oht_t* oht, qse_oht_t* oht, /**< open-addressed hash table */
const void* data const void* data /**< data pointer */
); );
/**
* The qse_oht_upsert() function inserts a new datum if it finds no matching
* datum or updates an exsting datum if finds a matching datum.
* @return slot index where the datum is inserted or updated.
*/
qse_size_t qse_oht_upsert ( qse_size_t qse_oht_upsert (
qse_oht_t* oht, qse_oht_t* oht, /**< open-addressed hash table */
const void* data const void* data /**< data pointer */
); );
/**
* The qse_oht_update() function updates an existing datum. It fails if it finds
* no existing datum.
* @return slot index where an existing datum is updated on success,
* #QSE_OHT_NIL on failure.
*/
qse_size_t qse_oht_update ( qse_size_t qse_oht_update (
qse_oht_t* oht, qse_oht_t* oht, /**< open-addressed hash table */
const void* data const void* data /**< data pointer */
); );
/**
* The qse_oht_delete() function deletes an existing datum. It fails if it finds
* no existing datum.
* @return slot index where an existing datum is deleted on success,
* #QSE_OHT_NIL on failure.
*/
qse_size_t qse_oht_delete ( qse_size_t qse_oht_delete (
qse_oht_t* oht, qse_oht_t* oht, /**< open-addressed hash table */
const void* data const void* data /**< data pointer */
); );
/**
* The qse_oht_clear() functions deletes all data items.
*/
void qse_oht_clear ( void qse_oht_clear (
qse_oht_t* oht qse_oht_t* oht /**< open-addressed hash table */
); );
/**
* The qse_oht_walk() function executes the callback function @a walker for
* each valid data item.
*/
void qse_oht_walk ( void qse_oht_walk (
qse_oht_t* oht, /**< open-addressed hash table */ qse_oht_t* oht, /**< open-addressed hash table */
qse_oht_walker_t walker, /**< walker function */ qse_oht_walker_t walker, /**< callback function */
void* ctx /**< context */ void* ctx /**< context */
); );

View File

@ -143,8 +143,6 @@ struct qse_rbt_t
qse_rbt_keeper_t keeper; /**< value keeper */ qse_rbt_keeper_t keeper; /**< value keeper */
qse_byte_t scale[2]; /**< length scale */ qse_byte_t scale[2]; /**< length scale */
qse_byte_t factor; /**< load factor */
qse_byte_t filler0;
qse_rbt_pair_t nil; /**< internal nil node */ qse_rbt_pair_t nil; /**< internal nil node */
@ -167,18 +165,9 @@ struct qse_rbt_t
/** /**
* The QSE_RBT_SIZE() macro returns the number of pairs in red-black tree. * The QSE_RBT_SIZE() macro returns the number of pairs in red-black tree.
*/ */
#define QSE_RBT_SIZE(m) ((m)->size) #define QSE_RBT_SIZE(m) ((const qse_size_t)(m)->size)
#define QSE_RBT_KSCALE(m) ((const int)(m)->scale[QSE_RBT_KEY])
#define QSE_RBT_KCOPIER(m) ((m)->copier[QSE_RBT_KEY]) #define QSE_RBT_VSCALE(m) ((const int)(m)->scale[QSE_RBT_VAL])
#define QSE_RBT_VCOPIER(m) ((m)->copier[QSE_RBT_VAL])
#define QSE_RBT_KFREEER(m) ((m)->freeer[QSE_RBT_KEY])
#define QSE_RBT_VFREEER(m) ((m)->freeer[QSE_RBT_VAL])
#define QSE_RBT_COMPER(m) ((m)->comper)
#define QSE_RBT_KEEPER(m) ((m)->keeper)
#define QSE_RBT_FACTOR(m) ((m)->factor)
#define QSE_RBT_KSCALE(m) ((m)->scale[QSE_RBT_KEY])
#define QSE_RBT_VSCALE(m) ((m)->scale[QSE_RBT_VAL])
#define QSE_RBT_KPTR(p) ((p)->kptr) #define QSE_RBT_KPTR(p) ((p)->kptr)
#define QSE_RBT_KLEN(p) ((p)->klen) #define QSE_RBT_KLEN(p) ((p)->klen)

View File

@ -1,5 +1,5 @@
/* /*
* $Id: sll.h 355 2010-09-07 10:57:43Z hyunghwan.chung $ * $Id: sll.h 356 2010-09-07 12:29:25Z hyunghwan.chung $
* *
Copyright 2006-2009 Chung, Hyung-Hwan. Copyright 2006-2009 Chung, Hyung-Hwan.
This file is part of QSE. This file is part of QSE.
@ -131,14 +131,10 @@ struct qse_sll_node_t
#define QSE_SLL_COPIER_SIMPLE ((qse_sll_copier_t)1) #define QSE_SLL_COPIER_SIMPLE ((qse_sll_copier_t)1)
#define QSE_SLL_COPIER_INLINE ((qse_sll_copier_t)2) #define QSE_SLL_COPIER_INLINE ((qse_sll_copier_t)2)
#define QSE_SLL_COPIER(sll) ((sll)->copier)
#define QSE_SLL_FREEER(sll) ((sll)->freeer)
#define QSE_SLL_COMPER(sll) ((sll)->comper)
#define QSE_SLL_HEAD(sll) ((sll)->head) #define QSE_SLL_HEAD(sll) ((sll)->head)
#define QSE_SLL_TAIL(sll) ((sll)->tail) #define QSE_SLL_TAIL(sll) ((sll)->tail)
#define QSE_SLL_SIZE(sll) ((sll)->size) #define QSE_SLL_SIZE(sll) ((const qse_size_t)(sll)->size)
#define QSE_SLL_SCALE(sll) ((sll)->scale) #define QSE_SLL_SCALE(sll) ((const int)(sll)->scale)
/** /**
* The QSE_SLL_DPTR macro gets the data pointer in a node. * The QSE_SLL_DPTR macro gets the data pointer in a node.
@ -278,7 +274,7 @@ qse_sll_comper_t qse_sll_getcomper (
* The qse_sll_setcomper() function changes the data comparator * The qse_sll_setcomper() function changes the data comparator
*/ */
void qse_sll_setcomper ( void qse_sll_setcomper (
qse_sll_t* sll /**< singly linked list */, qse_sll_t* sll, /**< singly linked list */
qse_sll_comper_t comper /**< comparator */ qse_sll_comper_t comper /**< comparator */
); );

View File

@ -1,5 +1,5 @@
/* /*
* $Id: str.h 354 2010-09-03 12:50:08Z hyunghwan.chung $ * $Id: str.h 356 2010-09-07 12:29:25Z hyunghwan.chung $
* *
Copyright 2006-2009 Chung, Hyung-Hwan. Copyright 2006-2009 Chung, Hyung-Hwan.
This file is part of QSE. This file is part of QSE.
@ -32,11 +32,10 @@
* *
*/ */
#define QSE_STR_LEN(s) ((s)->len) /**< string length */ #define QSE_STR_LEN(s) ((const qse_size_t)(s)->len) /**< string length */
#define QSE_STR_PTR(s) ((s)->ptr) /**< string/buffer pointer */ #define QSE_STR_PTR(s) ((qse_char_t* const)(s)->ptr) /**< string/buffer pointer */
#define QSE_STR_CAPA(s) ((s)->capa) /**< buffer capacity */ #define QSE_STR_CAPA(s) ((qse_size_t)(s)->capa) /**< buffer capacity */
#define QSE_STR_CHAR(s,idx) ((s)->ptr[idx]) /**< character at given position */ #define QSE_STR_CHAR(s,idx) ((s)->ptr[idx]) /**< character at given position */
#define QSE_STR_SIZER(s) ((s)->sizer) /**< buffer resizer function */
typedef struct qse_str_t qse_str_t; typedef struct qse_str_t qse_str_t;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: time.h 287 2009-09-15 10:01:02Z hyunghwan.chung $ * $Id: time.h 356 2010-09-07 12:29:25Z hyunghwan.chung $
* *
Copyright 2006-2009 Chung, Hyung-Hwan. Copyright 2006-2009 Chung, Hyung-Hwan.
This file is part of QSE. This file is part of QSE.
@ -21,6 +21,10 @@
#ifndef _QSE_CMN_TIME_H_ #ifndef _QSE_CMN_TIME_H_
#define _QSE_CMN_TIME_H_ #define _QSE_CMN_TIME_H_
/** @file
* This file provides time manipulation functions.
*/
#include <qse/types.h> #include <qse/types.h>
#include <qse/macros.h> #include <qse/macros.h>
@ -78,20 +82,15 @@ struct qse_btime_t
extern "C" { extern "C" {
#endif #endif
/****f* Common/qse_gettime /**
* NAME * The qse_gettime() function gets the current time.
* qse_gettime - get the current time
* SYNPOSIS
*/ */
int qse_gettime ( int qse_gettime (
qse_ntime_t* nt qse_ntime_t* nt
); );
/******/
/****f* Common/qse_settime /**
* NAME * The qse_settime() function sets the current time.
* qse_settime - set the current time
* SYNOPSIS
*/ */
int qse_settime ( int qse_settime (
qse_ntime_t nt qse_ntime_t nt
@ -114,7 +113,6 @@ int qse_localtime (
qse_ntime_t nt, qse_ntime_t nt,
qse_btime_t* bt qse_btime_t* bt
); );
/******/
/** /**
* The qse_timegm() converts broken-down time to numeric time. It is the * The qse_timegm() converts broken-down time to numeric time. It is the
@ -125,7 +123,6 @@ int qse_timegm (
const qse_btime_t* bt, const qse_btime_t* bt,
qse_ntime_t* nt qse_ntime_t* nt
); );
/******/
/** /**
* The qse_timelocal() converts broken-down time to numeric time. It is the * The qse_timelocal() converts broken-down time to numeric time. It is the
@ -135,13 +132,9 @@ int qse_timelcoal (
const qse_btime_t* bt, const qse_btime_t* bt,
qse_ntime_t* nt qse_ntime_t* nt
); );
/******/
/****f* Common/qse_strftime /**
* NAME * The qse_strftime() functions formats time.
* qse_strftime - format time
*
* SYNOPSIS
*/ */
qse_size_t qse_strftime ( qse_size_t qse_strftime (
qse_char_t* buf, qse_char_t* buf,
@ -149,7 +142,6 @@ qse_size_t qse_strftime (
const qse_char_t* fmt, const qse_char_t* fmt,
qse_btime_t* bt qse_btime_t* bt
); );
/******/
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -1,5 +1,5 @@
/* /*
* $Id: tio.h 291 2009-09-21 13:28:18Z hyunghwan.chung $ * $Id: tio.h 356 2010-09-07 12:29:25Z hyunghwan.chung $
* *
Copyright 2006-2009 Chung, Hyung-Hwan. Copyright 2006-2009 Chung, Hyung-Hwan.
This file is part of QSE. This file is part of QSE.
@ -21,11 +21,15 @@
#ifndef _QSE_CMN_TIO_H_ #ifndef _QSE_CMN_TIO_H_
#define _QSE_CMN_TIO_H_ #define _QSE_CMN_TIO_H_
/** @file
* This file provides an interface to a text stream processor.
*/
#include <qse/types.h> #include <qse/types.h>
#include <qse/macros.h> #include <qse/macros.h>
#include <qse/cmn/str.h> #include <qse/cmn/str.h>
enum qse_tio_err_t enum qse_tio_errnum_t
{ {
QSE_TIO_ENOERR = 0, QSE_TIO_ENOERR = 0,
QSE_TIO_ENOMEM, /* out of memory */ QSE_TIO_ENOMEM, /* out of memory */
@ -43,7 +47,7 @@ enum qse_tio_err_t
QSE_TIO_EOUTCL /* output function failed to close */ QSE_TIO_EOUTCL /* output function failed to close */
}; };
typedef enum qse_tio_err_t qse_tio_err_t; typedef enum qse_tio_errnum_t qse_tio_errnum_t;
enum enum
{ {
@ -62,7 +66,7 @@ enum
QSE_TIO_IO_DATA QSE_TIO_IO_DATA
}; };
#define QSE_TIO_ERRNUM(tio) ((tio)->errnum) #define QSE_TIO_ERRNUM(tio) ((const qse_tio_errnum_t)(tio)->errnum)
typedef struct qse_tio_t qse_tio_t; typedef struct qse_tio_t qse_tio_t;
@ -84,7 +88,7 @@ typedef qse_ssize_t (*qse_tio_io_t) (
struct qse_tio_t struct qse_tio_t
{ {
QSE_DEFINE_COMMON_FIELDS (tio) QSE_DEFINE_COMMON_FIELDS (tio)
qse_tio_err_t errnum; qse_tio_errnum_t errnum;
/* io functions */ /* io functions */
qse_tio_io_t input_func; qse_tio_io_t input_func;
@ -123,150 +127,107 @@ int qse_tio_close (
qse_tio_t* tio qse_tio_t* tio
); );
/****f* Common/qse_tio_init /**
* NAME * The qse_tio_init() function initialize a statically declared
* qse_tio_init - initialize an text IO processor * text stream processor.
* SYNOPSIS
*/ */
qse_tio_t* qse_tio_init ( qse_tio_t* qse_tio_init (
qse_tio_t* tip, qse_tio_t* tip,
qse_mmgr_t* mmgr qse_mmgr_t* mmgr
); );
/******/
/****f* Common/qse_tio_fini /**
* NAME * The qse_tio_fini() function finalizes a text stream processor
* qse_tio_fini - finalize an text IO processor
* SYNOPSIS
*/ */
int qse_tio_fini ( int qse_tio_fini (
qse_tio_t* tio qse_tio_t* tio
); );
/******/
/****f* Common/qse_tio_geterrnum /**
* NAME * The qse_tio_geterrnum() function return an error code.
* qse_tio_geterrnum - get an error code
*
* SYNOPSIS
*/ */
qse_tio_err_t qse_tio_geterrnum ( qse_tio_errnum_t qse_tio_geterrnum (
qse_tio_t* tio qse_tio_t* tio
); );
/******/
/****f* Common/qse_tio_geterrmsg /**
* NAME * The qse_tio_geterrmsg() function translates an error code to a string.
* qse_tio_geterrmsg - translate an error code to a string * @return pointer to a constant string describing the last error occurred.
* RETURN
* A pointer to a constant string describing the last error occurred.
*/ */
const qse_char_t* qse_tio_geterrmsg ( const qse_char_t* qse_tio_geterrmsg (
qse_tio_t* tio qse_tio_t* tio
); );
/******/
/****f* Common/qse_tio_attachin /**
* NAME * The qse_tio_attachin() function attachs an input handler .
* qse_tio_attachin - attaches an input handler * @return 0 on success, -1 on failure
* RETURN
* 0 on success, -1 on failure
* SYNOPSIS
*/ */
int qse_tio_attachin ( int qse_tio_attachin (
qse_tio_t* tio, qse_tio_t* tio,
qse_tio_io_t input, qse_tio_io_t input,
void* arg void* arg
); );
/******/
/****f* Common/qse_tio_detachin /**
* NAME * The qse_tio_detachin() function detaches an input handler .
* qse_tio_detachin - detach an input handler * @return 0 on success, -1 on failure
* RETURN
* 0 on success, -1 on failure
* SYNOPSIS
*/ */
int qse_tio_detachin ( int qse_tio_detachin (
qse_tio_t* tio qse_tio_t* tio
); );
/******/
/****f* Common/qse_tio_attachout /**
* NAME * The qse_tio_attachout() function attaches an output handler.
* qse_tio_attachout - attaches an output handler * @return 0 on success, -1 on failure
* RETURN
* 0 on success, -1 on failure
* SYNOPSIS
*/ */
int qse_tio_attachout ( int qse_tio_attachout (
qse_tio_t* tio, qse_tio_t* tio,
qse_tio_io_t output, qse_tio_io_t output,
void* arg void* arg
); );
/******/
/****f* Common/qse_tio_detachout /**
* NAME * The qse_tio_detachout() function detaches an output handler .
* qse_tio_detachout - detaches an output handler * @return 0 on success, -1 on failure
* RETURN
* 0 on success, -1 on failure
* SYNOPSIS
*/ */
int qse_tio_detachout ( int qse_tio_detachout (
qse_tio_t* tio qse_tio_t* tio
); );
/******/
/****f* Common/qse_tio_flush /**
* NAME * The qse_tio_flush() function flushes the output buffer. It returns the
* qse_tio_flush - flush the output buffer * number of bytes written on success, -1 on failure.
* RETURNS
* The qse_tio_flush() function return the number of bytes written on
* success, -1 on failure.
* SYNOPSIS
*/ */
qse_ssize_t qse_tio_flush ( qse_ssize_t qse_tio_flush (
qse_tio_t* tio qse_tio_t* tio
); );
/******/
/****f* Common/qse_tio_purge /**
* NAME * The qse_tio_purge() function empties input and output buffers.
* qse_tio_purge - empty input and output buffers
* SYNOPSIS
*/ */
void qse_tio_purge ( void qse_tio_purge (
qse_tio_t* tio qse_tio_t* tio
); );
/******/
/****f* Common/qse_tio_read /**
* NAME * The qse_tio_read() functio reads text.
* qse_tio_read - read text
* SYNOPSIS
*/ */
qse_ssize_t qse_tio_read ( qse_ssize_t qse_tio_read (
qse_tio_t* tio, qse_tio_t* tio,
qse_char_t* buf, qse_char_t* buf,
qse_size_t size qse_size_t size
); );
/******/
/****f* Common/qse_tio_write /**
* NAME * The qse_tio_write() function writes text.
* qse_tio_write - write text
* DESCRIPTION
* If the size paramenter is (qse_size_t)-1, the function treats the data * If the size paramenter is (qse_size_t)-1, the function treats the data
* parameter as a pointer to a null-terminated string. * parameter as a pointer to a null-terminated string.
* SYNOPSIS
*/ */
qse_ssize_t qse_tio_write ( qse_ssize_t qse_tio_write (
qse_tio_t* tio, qse_tio_t* tio,
const qse_char_t* data, const qse_char_t* data,
qse_size_t size qse_size_t size
); );
/******/
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -1,5 +1,5 @@
/* /*
* $Id: rio.c 312 2009-12-10 13:03:54Z hyunghwan.chung $ * $Id: rio.c 356 2010-09-07 12:29:25Z hyunghwan.chung $
* *
Copyright 2006-2009 Chung, Hyung-Hwan. Copyright 2006-2009 Chung, Hyung-Hwan.
This file is part of QSE. This file is part of QSE.
@ -299,7 +299,8 @@ int qse_awk_rtx_readio (
QSE_STR_PTR(buf) + QSE_STR_LEN(buf) == QSE_STR_PTR(buf) + QSE_STR_LEN(buf) ==
match.ptr + match.len); match.ptr + match.len);
QSE_STR_LEN(buf) -= match.len; /*QSE_STR_LEN(buf) -= match.len;*/
buf->len -= match.len;
break; break;
} }
} }
@ -322,7 +323,8 @@ int qse_awk_rtx_readio (
if (pc == QSE_T('\r') && if (pc == QSE_T('\r') &&
QSE_STR_LEN(buf) > 0) QSE_STR_LEN(buf) > 0)
{ {
QSE_STR_LEN(buf) -= 1; /*QSE_STR_LEN(buf) -= 1;*/
buf->len -= 1;
} }
break; break;
} }
@ -335,7 +337,8 @@ int qse_awk_rtx_readio (
if (pc == QSE_T('\r') && if (pc == QSE_T('\r') &&
QSE_STR_LEN(buf) > 0) QSE_STR_LEN(buf) > 0)
{ {
QSE_STR_LEN(buf) -= 1; /*QSE_STR_LEN(buf) -= 1;*/
buf->len -= 1;
} }
} }
@ -353,7 +356,8 @@ int qse_awk_rtx_readio (
/* when a blank line is encountered, /* when a blank line is encountered,
* it needs to snip off the line * it needs to snip off the line
* terminator of the previous line */ * terminator of the previous line */
QSE_STR_LEN(buf) -= 1; /*QSE_STR_LEN(buf) -= 1;*/
buf->len -= 1;
break; break;
} }
} }
@ -394,7 +398,8 @@ int qse_awk_rtx_readio (
QSE_STR_PTR(buf) + QSE_STR_LEN(buf) == QSE_STR_PTR(buf) + QSE_STR_LEN(buf) ==
match.ptr + match.len); match.ptr + match.len);
QSE_STR_LEN(buf) -= match.len; /*QSE_STR_LEN(buf) -= match.len;*/
buf->len -= match.len;
p->in.pos--; /* unread the character in c */ p->in.pos--; /* unread the character in c */
break; break;
} }

View File

@ -44,7 +44,7 @@ static QSE_INLINE_ALWAYS void default_copier (
qse_oht_t* qse_oht_open ( qse_oht_t* qse_oht_open (
qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_mmgr_t* mmgr, qse_size_t xtnsize,
qse_size_t scale, qse_size_t capa, qse_size_t limit) int scale, qse_size_t capa, qse_size_t limit)
{ {
qse_oht_t* oht; qse_oht_t* oht;
@ -78,12 +78,12 @@ void qse_oht_close (qse_oht_t* oht)
qse_oht_t* qse_oht_init ( qse_oht_t* qse_oht_init (
qse_oht_t* oht, qse_mmgr_t* mmgr, qse_oht_t* oht, qse_mmgr_t* mmgr,
qse_size_t scale, qse_size_t capa, qse_size_t limit) int scale, qse_size_t capa, qse_size_t limit)
{ {
qse_size_t i; qse_size_t i;
if (scale <= 0) scale = 1; if (scale <= 0) scale = 1;
if (capa >= QSE_OHT_INVALID_INDEX - 1) capa = QSE_OHT_INVALID_INDEX - 1; if (capa >= QSE_OHT_NIL - 1) capa = QSE_OHT_NIL - 1;
if (limit > capa || limit <= 0) limit = capa; if (limit > capa || limit <= 0) limit = capa;
QSE_MEMSET (oht, 0, QSE_SIZEOF(*oht)); QSE_MEMSET (oht, 0, QSE_SIZEOF(*oht));
@ -165,13 +165,13 @@ static QSE_INLINE qse_size_t search (
} }
} }
return QSE_OHT_INVALID_INDEX; return QSE_OHT_NIL;
} }
qse_size_t qse_oht_search (qse_oht_t* oht, void* data) qse_size_t qse_oht_search (qse_oht_t* oht, void* data)
{ {
qse_size_t i = search (oht, data, HASH_DATA(oht,data)); qse_size_t i = search (oht, data, HASH_DATA(oht,data));
if (i != QSE_OHT_INVALID_INDEX && data) if (i != QSE_OHT_NIL && data)
COPY_DATA (oht, data, DATA_PTR(oht,i)); COPY_DATA (oht, data, DATA_PTR(oht,i));
return i; return i;
} }
@ -179,7 +179,7 @@ qse_size_t qse_oht_search (qse_oht_t* oht, void* data)
qse_size_t qse_oht_update (qse_oht_t* oht, const void* data) qse_size_t qse_oht_update (qse_oht_t* oht, const void* data)
{ {
qse_size_t i = search (oht, data, HASH_DATA(oht,data)); qse_size_t i = search (oht, data, HASH_DATA(oht,data));
if (i != QSE_OHT_INVALID_INDEX) if (i != QSE_OHT_NIL)
COPY_DATA (oht, DATA_PTR(oht,i), data); COPY_DATA (oht, DATA_PTR(oht,i), data);
return i; return i;
} }
@ -190,14 +190,14 @@ qse_size_t qse_oht_upsert (qse_oht_t* oht, const void* data)
/* find the existing item */ /* find the existing item */
i = search (oht, data, hash); i = search (oht, data, hash);
if (i != QSE_OHT_INVALID_INDEX) if (i != QSE_OHT_NIL)
{ {
COPY_DATA (oht, DATA_PTR(oht,i), data); COPY_DATA (oht, DATA_PTR(oht,i), data);
return i; return i;
} }
/* check if there is a free slot to insert data into */ /* check if there is a free slot to insert data into */
if (oht->size >= oht->capa.soft) return QSE_OHT_INVALID_INDEX; if (oht->size >= oht->capa.soft) return QSE_OHT_NIL;
/* get the unoccupied slot and insert the data into it. /* get the unoccupied slot and insert the data into it.
* iterate at most 'the number of items (oht->size)' times + 1. */ * iterate at most 'the number of items (oht->size)' times + 1. */
@ -213,7 +213,7 @@ qse_size_t qse_oht_upsert (qse_oht_t* oht, const void* data)
} }
} }
return QSE_OHT_INVALID_INDEX; return QSE_OHT_NIL;
} }
qse_size_t qse_oht_insert (qse_oht_t* oht, const void* data) qse_size_t qse_oht_insert (qse_oht_t* oht, const void* data)
@ -221,13 +221,13 @@ qse_size_t qse_oht_insert (qse_oht_t* oht, const void* data)
qse_size_t i, hash; qse_size_t i, hash;
/* check if there is a free slot to insert data into */ /* check if there is a free slot to insert data into */
if (oht->size >= oht->capa.soft) return QSE_OHT_INVALID_INDEX; if (oht->size >= oht->capa.soft) return QSE_OHT_NIL;
hash = HASH_DATA (oht, data); hash = HASH_DATA (oht, data);
/* check if the item already exits */ /* check if the item already exits */
i = search (oht, data, hash); i = search (oht, data, hash);
if (i != QSE_OHT_INVALID_INDEX) return QSE_OHT_INVALID_INDEX; if (i != QSE_OHT_NIL) return QSE_OHT_NIL;
/* get the unoccupied slot and insert the data into it. /* get the unoccupied slot and insert the data into it.
* iterate at most 'the number of items (oht->size)' times + 1. */ * iterate at most 'the number of items (oht->size)' times + 1. */
@ -243,7 +243,7 @@ qse_size_t qse_oht_insert (qse_oht_t* oht, const void* data)
} }
} }
return QSE_OHT_INVALID_INDEX; return QSE_OHT_NIL;
} }
qse_size_t qse_oht_delete (qse_oht_t* oht, const void* data) qse_size_t qse_oht_delete (qse_oht_t* oht, const void* data)
@ -251,10 +251,10 @@ qse_size_t qse_oht_delete (qse_oht_t* oht, const void* data)
#if 0 #if 0
qse_size_t index; qse_size_t index;
if (oht->size <= 0) return QSE_OHT_INVALID_INDEX; if (oht->size <= 0) return QSE_OHT_NIL;
index = search (oht, data, HASH_DATA(oht,data)); index = search (oht, data, HASH_DATA(oht,data));
if (index != QSE_OHT_INVALID_INDEX) if (index != QSE_OHT_NIL)
{ {
oht->mark[index] = QSE_OHT_DELETED; oht->mark[index] = QSE_OHT_DELETED;
oht->size--; oht->size--;
@ -266,11 +266,11 @@ qse_size_t qse_oht_delete (qse_oht_t* oht, const void* data)
qse_size_t index, i, x, y, z; qse_size_t index, i, x, y, z;
/* check if the oht is empty. if so, do nothing */ /* check if the oht is empty. if so, do nothing */
if (oht->size <= 0) return QSE_OHT_INVALID_INDEX; if (oht->size <= 0) return QSE_OHT_NIL;
/* check if the item exists. otherwise, do nothing. */ /* check if the item exists. otherwise, do nothing. */
index = search (oht, data, HASH_DATA(oht,data)); index = search (oht, data, HASH_DATA(oht,data));
if (index == QSE_OHT_INVALID_INDEX) return QSE_OHT_INVALID_INDEX; if (index == QSE_OHT_NIL) return QSE_OHT_NIL;
/* compact the cluster */ /* compact the cluster */
for (i = 0, x = index, y = index; i < oht->size; i++) for (i = 0, x = index, y = index; i < oht->size; i++)

View File

@ -1,5 +1,5 @@
/* /*
* $Id: tio.c 348 2010-08-26 06:26:28Z hyunghwan.chung $ * $Id: tio.c 356 2010-09-07 12:29:25Z hyunghwan.chung $
* *
Copyright 2006-2009 Chung, Hyung-Hwan. Copyright 2006-2009 Chung, Hyung-Hwan.
This file is part of QSE. This file is part of QSE.
@ -89,7 +89,7 @@ int qse_tio_fini (qse_tio_t* tio)
return 0; return 0;
} }
qse_tio_err_t qse_tio_geterrnum (qse_tio_t* tio) qse_tio_errnum_t qse_tio_geterrnum (qse_tio_t* tio)
{ {
return tio->errnum; return tio->errnum;
} }

View File

@ -31,13 +31,13 @@ static qse_oht_walk_t walk2 (qse_oht_t* oht, void* data, void* ctx)
return QSE_OHT_WALK_FORWARD; return QSE_OHT_WALK_FORWARD;
} }
static qse_size_t hash (qse_oht_t* oht, void* data) static qse_size_t hash (qse_oht_t* oht, const void* data)
{ {
item_t* item = (item_t*)data; item_t* item = (item_t*)data;
return item->a; return item->a + 123445;
} }
static int comp (qse_oht_t* oht, void* data1, void* data2) static int comp (qse_oht_t* oht, const void* data1, const void* data2)
{ {
return ((item_t*)data1)->a != ((item_t*)data2)->a; return ((item_t*)data1)->a != ((item_t*)data2)->a;
} }
@ -73,6 +73,7 @@ static int test1 ()
x, (unsigned long)qse_oht_search (oht, &x)); x, (unsigned long)qse_oht_search (oht, &x));
qse_printf (QSE_T("total %lu items\n"), (unsigned long)QSE_OHT_SIZE(oht));
qse_oht_walk (oht, walk1, QSE_NULL); qse_oht_walk (oht, walk1, QSE_NULL);
qse_oht_close (oht); qse_oht_close (oht);
return 0; return 0;
@ -83,7 +84,7 @@ static int test2 ()
item_t x; item_t x;
qse_oht_t* oht; qse_oht_t* oht;
oht = qse_oht_open (QSE_NULL, 0, QSE_SIZEOF(x), 10, 5); oht = qse_oht_open (QSE_NULL, 0, QSE_SIZEOF(x), 10, 10);
if (oht == QSE_NULL) if (oht == QSE_NULL)
{ {
qse_printf (QSE_T("failed to open a table\n")); qse_printf (QSE_T("failed to open a table\n"));
@ -114,6 +115,7 @@ static int test2 ()
x.a, (unsigned long)qse_oht_search (oht, &x)); x.a, (unsigned long)qse_oht_search (oht, &x));
qse_printf (QSE_T("total %lu items\n"), (unsigned long)QSE_OHT_SIZE(oht));
qse_oht_walk (oht, walk2, QSE_NULL); qse_oht_walk (oht, walk2, QSE_NULL);
qse_oht_close (oht); qse_oht_close (oht);
return 0; return 0;