diff --git a/qse/include/qse/cmn/Makefile.am b/qse/include/qse/cmn/Makefile.am index cde8cbb9..552c3f5e 100644 --- a/qse/include/qse/cmn/Makefile.am +++ b/qse/include/qse/cmn/Makefile.am @@ -2,6 +2,7 @@ pkgincludedir = $(includedir)/qse/cmn pkginclude_HEADERS = \ alg.h \ + arr.h \ chr.h \ cp949.h \ cp950.h \ @@ -13,7 +14,6 @@ pkginclude_HEADERS = \ htb.h \ hton.h \ ipad.h \ - lda.h \ main.h \ map.h \ mb8.h \ diff --git a/qse/include/qse/cmn/Makefile.in b/qse/include/qse/cmn/Makefile.in index d33729e0..8a052461 100644 --- a/qse/include/qse/cmn/Makefile.in +++ b/qse/include/qse/cmn/Makefile.in @@ -122,8 +122,8 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac -am__pkginclude_HEADERS_DIST = alg.h chr.h cp949.h cp950.h dll.h env.h \ - fma.h fmt.h gdl.h htb.h hton.h ipad.h lda.h main.h map.h mb8.h \ +am__pkginclude_HEADERS_DIST = alg.h arr.h chr.h cp949.h cp950.h dll.h \ + env.h fma.h fmt.h gdl.h htb.h hton.h ipad.h main.h map.h mb8.h \ mbwc.h mem.h oht.h opt.h path.h pma.h rbt.h rex.h sll.h slmb.h \ str.h time.h tmr.h tre.h uni.h uri.h utf8.h xma.h Mmgr.hpp \ StdMmgr.hpp HeapMmgr.hpp Mmged.hpp ScopedPtr.hpp SharedPtr.hpp \ @@ -355,8 +355,8 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -pkginclude_HEADERS = alg.h chr.h cp949.h cp950.h dll.h env.h fma.h \ - fmt.h gdl.h htb.h hton.h ipad.h lda.h main.h map.h mb8.h \ +pkginclude_HEADERS = alg.h arr.h chr.h cp949.h cp950.h dll.h env.h \ + fma.h fmt.h gdl.h htb.h hton.h ipad.h main.h map.h mb8.h \ mbwc.h mem.h oht.h opt.h path.h pma.h rbt.h rex.h sll.h slmb.h \ str.h time.h tmr.h tre.h uni.h uri.h utf8.h xma.h \ $(am__append_1) diff --git a/qse/include/qse/cmn/lda.h b/qse/include/qse/cmn/arr.h similarity index 50% rename from qse/include/qse/cmn/lda.h rename to qse/include/qse/cmn/arr.h index c63cdf81..e62aa2c7 100644 --- a/qse/include/qse/cmn/lda.h +++ b/qse/include/qse/cmn/arr.h @@ -24,8 +24,8 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef _QSE_CMN_LDA_H_ -#define _QSE_CMN_LDA_H_ +#ifndef _QSE_CMN_ARR_H_ +#define _QSE_CMN_ARR_H_ #include #include @@ -35,60 +35,60 @@ * are added. */ -enum qse_lda_walk_t +enum qse_arr_walk_t { - QSE_LDA_WALK_STOP = 0, - QSE_LDA_WALK_FORWARD = 1, - QSE_LDA_WALK_BACKWARD = 2 + QSE_ARR_WALK_STOP = 0, + QSE_ARR_WALK_FORWARD = 1, + QSE_ARR_WALK_BACKWARD = 2 }; -typedef struct qse_lda_t qse_lda_t; -typedef struct qse_lda_slot_t qse_lda_slot_t; -typedef enum qse_lda_walk_t qse_lda_walk_t; +typedef struct qse_arr_t qse_arr_t; +typedef struct qse_arr_slot_t qse_arr_slot_t; +typedef enum qse_arr_walk_t qse_arr_walk_t; -#define QSE_LDA_COPIER_SIMPLE ((qse_lda_copier_t)1) -#define QSE_LDA_COPIER_INLINE ((qse_lda_copier_t)2) +#define QSE_ARR_COPIER_SIMPLE ((qse_arr_copier_t)1) +#define QSE_ARR_COPIER_INLINE ((qse_arr_copier_t)2) -#define QSE_LDA_NIL ((qse_size_t)-1) +#define QSE_ARR_NIL ((qse_size_t)-1) -#define QSE_LDA_SIZE(lda) (*(const qse_size_t*)&(lda)->size) -#define QSE_LDA_CAPA(lda) (*(const qse_size_t*)&(lda)->capa) +#define QSE_ARR_SIZE(arr) (*(const qse_size_t*)&(arr)->size) +#define QSE_ARR_CAPA(arr) (*(const qse_size_t*)&(arr)->capa) -#define QSE_LDA_SLOT(lda,index) ((lda)->slot[index]) -#define QSE_LDA_DPTL(lda,index) ((const qse_xptl_t*)&(lda)->slot[index]->val) -#define QSE_LDA_DPTR(lda,index) ((lda)->slot[index]->val.ptr) -#define QSE_LDA_DLEN(lda,index) ((lda)->slot[index]->val.len) +#define QSE_ARR_SLOT(arr,index) ((arr)->slot[index]) +#define QSE_ARR_DPTL(arr,index) ((const qse_xptl_t*)&(arr)->slot[index]->val) +#define QSE_ARR_DPTR(arr,index) ((arr)->slot[index]->val.ptr) +#define QSE_ARR_DLEN(arr,index) ((arr)->slot[index]->val.len) /** - * The qse_lda_copier_t type defines a callback function for slot construction. + * The qse_arr_copier_t type defines a callback function for slot construction. * A slot is contructed when a user adds data to an array. The user can * define how the data to add can be maintained in the array. A dynamic * array not specified with any copiers stores the data pointer and - * the data length into a slot. A special copier QSE_LDA_COPIER_INLINE copies + * the data length into a slot. A special copier QSE_ARR_COPIER_INLINE copies * the contents of the data a user provided into the slot. You can use the - * qse_lda_setcopier() function to change the copier. + * qse_arr_setcopier() function to change the copier. * * A copier should return the pointer to the copied data. If it fails to copy * data, it may return QSE_NULL. You need to set a proper freeer to free up * memory allocated for copy. */ -typedef void* (*qse_lda_copier_t) ( - qse_lda_t* lda /**< array */, +typedef void* (*qse_arr_copier_t) ( + qse_arr_t* arr /**< array */, void* dptr /**< pointer to data to copy */, qse_size_t dlen /**< length of data to copy */ ); /** - * The qse_lda_freeer_t type defines a slot destruction callback. + * The qse_arr_freeer_t type defines a slot destruction callback. */ -typedef void (*qse_lda_freeer_t) ( - qse_lda_t* lda /**< array */, +typedef void (*qse_arr_freeer_t) ( + qse_arr_t* arr /**< array */, void* dptr /**< pointer to data to free */, qse_size_t dlen /**< length of data to free */ ); /** - * The qse_lda_comper_t type defines a key comparator that is called when + * The qse_arr_comper_t type defines a key comparator that is called when * the arry needs to compare data. A linear dynamic array is created with a * default comparator that performs bitwise comparison. * @@ -97,8 +97,8 @@ typedef void (*qse_lda_freeer_t) ( * integer otherwise. * */ -typedef int (*qse_lda_comper_t) ( - qse_lda_t* lda /* array */, +typedef int (*qse_arr_comper_t) ( + qse_arr_t* arr /* array */, const void* dptr1 /* data pointer */, qse_size_t dlen1 /* data length */, const void* dptr2 /* data pointer */, @@ -106,53 +106,53 @@ typedef int (*qse_lda_comper_t) ( ); /** - * The qse_lda_keeper_t type defines a value keeper that is called when + * The qse_arr_keeper_t type defines a value keeper that is called when * a value is retained in the context that it should be destroyed because * it is identical to a new value. Two values are identical if their beginning * pointers and their lengths are equal. */ -typedef void (*qse_lda_keeper_t) ( - qse_lda_t* lda /**< array */, +typedef void (*qse_arr_keeper_t) ( + qse_arr_t* arr /**< array */, void* vptr /**< pointer to a value */, qse_size_t vlen /**< length of a value */ ); /** - * The qse_lda_sizer_t type defines an array size claculator that is called + * The qse_arr_sizer_t type defines an array size claculator that is called * when the array needs to be resized. */ -typedef qse_size_t (*qse_lda_sizer_t) ( - qse_lda_t* lda, /**< array */ +typedef qse_size_t (*qse_arr_sizer_t) ( + qse_arr_t* arr, /**< array */ qse_size_t hint /**< sizing hint */ ); -typedef qse_lda_walk_t (*qse_lda_walker_t) ( - qse_lda_t* lda /* array */, +typedef qse_arr_walk_t (*qse_arr_walker_t) ( + qse_arr_t* arr /* array */, qse_size_t index /* index to the visited slot */, void* ctx /* user-defined context */ ); /** - * The qse_lda_t type defines a linear dynamic array. + * The qse_arr_t type defines a linear dynamic array. */ -struct qse_lda_t +struct qse_arr_t { qse_mmgr_t* mmgr; - qse_lda_copier_t copier; /* data copier */ - qse_lda_freeer_t freeer; /* data freeer */ - qse_lda_comper_t comper; /* data comparator */ - qse_lda_keeper_t keeper; /* data keeper */ - qse_lda_sizer_t sizer; /* size calculator */ + qse_arr_copier_t copier; /* data copier */ + qse_arr_freeer_t freeer; /* data freeer */ + qse_arr_comper_t comper; /* data comparator */ + qse_arr_keeper_t keeper; /* data keeper */ + qse_arr_sizer_t sizer; /* size calculator */ qse_byte_t scale; /* scale factor */ qse_size_t size; /* number of items */ qse_size_t capa; /* capacity */ - qse_lda_slot_t** slot; + qse_arr_slot_t** slot; }; /** - * The qse_lda_slot_t type defines a linear dynamic array slot + * The qse_arr_slot_t type defines a linear dynamic array slot */ -struct qse_lda_slot_t +struct qse_arr_slot_t { qse_xptl_t val; }; @@ -162,270 +162,270 @@ extern "C" { #endif /** - * The qse_lda_open() function creates a linear dynamic array. + * The qse_arr_open() function creates a linear dynamic array. */ -QSE_EXPORT qse_lda_t* qse_lda_open ( +QSE_EXPORT qse_arr_t* qse_arr_open ( qse_mmgr_t* mmgr, /**< memory manager */ qse_size_t ext, /**< extension size in bytes */ qse_size_t capa /**< initial array capacity */ ); /** - * The qse_lda_close() function destroys a linear dynamic array. + * The qse_arr_close() function destroys a linear dynamic array. */ -QSE_EXPORT void qse_lda_close ( - qse_lda_t* lda /**< array */ +QSE_EXPORT void qse_arr_close ( + qse_arr_t* arr /**< array */ ); /** - * The qse_lda_init() function initializes a linear dynamic array. + * The qse_arr_init() function initializes a linear dynamic array. */ -QSE_EXPORT int qse_lda_init ( - qse_lda_t* lda, +QSE_EXPORT int qse_arr_init ( + qse_arr_t* arr, qse_mmgr_t* mmgr, qse_size_t capa ); /** - * The qse_lda_fini() function finalizes a linear dynamic array. + * The qse_arr_fini() function finalizes a linear dynamic array. */ -QSE_EXPORT void qse_lda_fini ( - qse_lda_t* lda /**< array */ +QSE_EXPORT void qse_arr_fini ( + qse_arr_t* arr /**< array */ ); -QSE_EXPORT qse_mmgr_t* qse_lda_getmmgr ( - qse_lda_t* lda +QSE_EXPORT qse_mmgr_t* qse_arr_getmmgr ( + qse_arr_t* arr ); -QSE_EXPORT void* qse_lda_getxtn ( - qse_lda_t* lda +QSE_EXPORT void* qse_arr_getxtn ( + qse_arr_t* arr ); /** - * The qse_lda_getscale() function returns the scale factor + * The qse_arr_getscale() function returns the scale factor */ -QSE_EXPORT int qse_lda_getscale ( - qse_lda_t* lda /**< array */ +QSE_EXPORT int qse_arr_getscale ( + qse_arr_t* arr /**< array */ ); /** - * The qse_lda_setscale() function sets the scale factor of the length + * The qse_arr_setscale() function sets the scale factor of the length * of a key and a value. A scale factor determines the actual length of - * a key and a value in bytes. A lda is created with a scale factor of 1. + * a key and a value in bytes. A arr is created with a scale factor of 1. * The scale factor should be larger than 0 and less than 256. - * It is a bad idea to change the scale factor when @a lda is not empty. + * It is a bad idea to change the scale factor when @a arr is not empty. */ -QSE_EXPORT void qse_lda_setscale ( - qse_lda_t* lda /**< array */, +QSE_EXPORT void qse_arr_setscale ( + qse_arr_t* arr /**< array */, int scale /**< scale factor */ ); -QSE_EXPORT qse_lda_copier_t qse_lda_getcopier ( - qse_lda_t* lda /* array */ +QSE_EXPORT qse_arr_copier_t qse_arr_getcopier ( + qse_arr_t* arr /* array */ ); /** - * The qse_lda_setcopier() specifies how to clone an element. The special - * copier #QSE_LDA_COPIER_INLINE copies the data inline to the internal slot. + * The qse_arr_setcopier() specifies how to clone an element. The special + * copier #QSE_ARR_COPIER_INLINE copies the data inline to the internal slot. * No freeer is invoked when the slot is freeed. You may set the copier to - * #QSE_LDA_COPIER_SIMPLE to perform no special operation when the data + * #QSE_ARR_COPIER_SIMPLE to perform no special operation when the data * pointer is stored. */ -QSE_EXPORT void qse_lda_setcopier ( - qse_lda_t* lda /** lda */, - qse_lda_copier_t copier /** element copier */ +QSE_EXPORT void qse_arr_setcopier ( + qse_arr_t* arr /** arr */, + qse_arr_copier_t copier /** element copier */ ); /** - * The qse_lda_getfreeer() function returns a custom element destroyer. + * The qse_arr_getfreeer() function returns a custom element destroyer. */ -QSE_EXPORT qse_lda_freeer_t qse_lda_getfreeer ( - qse_lda_t* lda /**< lda */ +QSE_EXPORT qse_arr_freeer_t qse_arr_getfreeer ( + qse_arr_t* arr /**< arr */ ); /** - * The qse_lda_setfreeer() function specifies how to destroy an element. + * The qse_arr_setfreeer() function specifies how to destroy an element. * The @a freeer is called when a slot containing the element is destroyed. */ -QSE_EXPORT void qse_lda_setfreeer ( - qse_lda_t* lda /**< lda */, - qse_lda_freeer_t freeer /**< element freeer */ +QSE_EXPORT void qse_arr_setfreeer ( + qse_arr_t* arr /**< arr */, + qse_arr_freeer_t freeer /**< element freeer */ ); -QSE_EXPORT qse_lda_comper_t qse_lda_getcomper ( - qse_lda_t* lda /**< lda */ +QSE_EXPORT qse_arr_comper_t qse_arr_getcomper ( + qse_arr_t* arr /**< arr */ ); /** - * The qse_lda_setcomper() function specifies how to compare two elements + * The qse_arr_setcomper() function specifies how to compare two elements * for equality test. The comparator @a comper must return 0 if two elements * compared are equal, or a non-zero number otherwise. */ -QSE_EXPORT void qse_lda_setcomper ( - qse_lda_t* lda /**< lda */, - qse_lda_comper_t comper /**< comparator */ +QSE_EXPORT void qse_arr_setcomper ( + qse_arr_t* arr /**< arr */, + qse_arr_comper_t comper /**< comparator */ ); -QSE_EXPORT qse_lda_keeper_t qse_lda_getkeeper ( - qse_lda_t* lda +QSE_EXPORT qse_arr_keeper_t qse_arr_getkeeper ( + qse_arr_t* arr ); -QSE_EXPORT void qse_lda_setkeeper ( - qse_lda_t* lda, - qse_lda_keeper_t keeper +QSE_EXPORT void qse_arr_setkeeper ( + qse_arr_t* arr, + qse_arr_keeper_t keeper ); -QSE_EXPORT qse_lda_sizer_t qse_lda_getsizer ( - qse_lda_t* lda +QSE_EXPORT qse_arr_sizer_t qse_arr_getsizer ( + qse_arr_t* arr ); -QSE_EXPORT void qse_lda_setsizer ( - qse_lda_t* lda, - qse_lda_sizer_t sizer +QSE_EXPORT void qse_arr_setsizer ( + qse_arr_t* arr, + qse_arr_sizer_t sizer ); -QSE_EXPORT qse_size_t qse_lda_getsize ( - qse_lda_t* lda +QSE_EXPORT qse_size_t qse_arr_getsize ( + qse_arr_t* arr ); -QSE_EXPORT qse_size_t qse_lda_getcapa ( - qse_lda_t* lda +QSE_EXPORT qse_size_t qse_arr_getcapa ( + qse_arr_t* arr ); -QSE_EXPORT qse_lda_t* qse_lda_setcapa ( - qse_lda_t* lda, +QSE_EXPORT qse_arr_t* qse_arr_setcapa ( + qse_arr_t* arr, qse_size_t capa ); -QSE_EXPORT qse_size_t qse_lda_search ( - qse_lda_t* lda, +QSE_EXPORT qse_size_t qse_arr_search ( + qse_arr_t* arr, qse_size_t pos, const void* dptr, qse_size_t dlen ); -QSE_EXPORT qse_size_t qse_lda_rsearch ( - qse_lda_t* lda, +QSE_EXPORT qse_size_t qse_arr_rsearch ( + qse_arr_t* arr, qse_size_t pos, const void* dptr, qse_size_t dlen ); -QSE_EXPORT qse_size_t qse_lda_upsert ( - qse_lda_t* lda, +QSE_EXPORT qse_size_t qse_arr_upsert ( + qse_arr_t* arr, qse_size_t index, void* dptr, qse_size_t dlen ); -QSE_EXPORT qse_size_t qse_lda_insert ( - qse_lda_t* lda, +QSE_EXPORT qse_size_t qse_arr_insert ( + qse_arr_t* arr, qse_size_t index, void* dptr, qse_size_t dlen ); -QSE_EXPORT qse_size_t qse_lda_update ( - qse_lda_t* lda, +QSE_EXPORT qse_size_t qse_arr_update ( + qse_arr_t* arr, qse_size_t pos, void* dptr, qse_size_t dlen ); /** - * The qse_lda_delete() function deletes the as many data as the count + * The qse_arr_delete() function deletes the as many data as the count * from the index. It returns the number of data deleted. */ -QSE_EXPORT qse_size_t qse_lda_delete ( - qse_lda_t* lda, +QSE_EXPORT qse_size_t qse_arr_delete ( + qse_arr_t* arr, qse_size_t index, qse_size_t count ); /** - * The qse_lda_uplete() function deletes data slot without compaction. + * The qse_arr_uplete() function deletes data slot without compaction. * It returns the number of data affected. */ -QSE_EXPORT qse_size_t qse_lda_uplete ( - qse_lda_t* lda, +QSE_EXPORT qse_size_t qse_arr_uplete ( + qse_arr_t* arr, qse_size_t index, qse_size_t count ); -QSE_EXPORT void qse_lda_clear ( - qse_lda_t* lda +QSE_EXPORT void qse_arr_clear ( + qse_arr_t* arr ); /** - * The qse_lda_walk() function calls the @a walker function for each + * The qse_arr_walk() function calls the @a walker function for each * element in the array beginning from the first. The @a walker function - * should return one of #QSE_LDA_WALK_FORWARD, #QSE_LDA_WALK_BACKWARD, - * #QSE_LDA_WALK_STOP. + * should return one of #QSE_ARR_WALK_FORWARD, #QSE_ARR_WALK_BACKWARD, + * #QSE_ARR_WALK_STOP. * @return number of calls to the @a walker fucntion made */ -QSE_EXPORT qse_size_t qse_lda_walk ( - qse_lda_t* lda, - qse_lda_walker_t walker, +QSE_EXPORT qse_size_t qse_arr_walk ( + qse_arr_t* arr, + qse_arr_walker_t walker, void* ctx ); /** - * The qse_lda_rwalk() function calls the @a walker function for each + * The qse_arr_rwalk() function calls the @a walker function for each * element in the array beginning from the last. The @a walker function - * should return one of #QSE_LDA_WALK_FORWARD, #QSE_LDA_WALK_BACKWARD, - * #QSE_LDA_WALK_STOP. + * should return one of #QSE_ARR_WALK_FORWARD, #QSE_ARR_WALK_BACKWARD, + * #QSE_ARR_WALK_STOP. * @return number of calls to the @a walker fucntion made */ -QSE_EXPORT qse_size_t qse_lda_rwalk ( - qse_lda_t* lda, - qse_lda_walker_t walker, +QSE_EXPORT qse_size_t qse_arr_rwalk ( + qse_arr_t* arr, + qse_arr_walker_t walker, void* ctx ); /** - * The qse_lda_pushstack() function appends data to the array. It is a utility + * The qse_arr_pushstack() function appends data to the array. It is a utility * function to allow stack-like operations over an array. To do so, you should * not play with other non-stack related functions. */ -QSE_EXPORT qse_size_t qse_lda_pushstack ( - qse_lda_t* lda, +QSE_EXPORT qse_size_t qse_arr_pushstack ( + qse_arr_t* arr, void* dptr, qse_size_t dlen ); /** - * The qse_lda_popstack() function deletes the last array data. It is a utility + * The qse_arr_popstack() function deletes the last array data. It is a utility * function to allow stack-like operations over an array. To do so, you should * not play with other non-stack related functions. - * @note You must not call this function if @a lda is empty. + * @note You must not call this function if @a arr is empty. */ -QSE_EXPORT void qse_lda_popstack ( - qse_lda_t* lda +QSE_EXPORT void qse_arr_popstack ( + qse_arr_t* arr ); /** - * The qse_lda_pushheap() function inserts data to an array while keeping the + * The qse_arr_pushheap() function inserts data to an array while keeping the * largest data at position 0. It is a utiltiy funtion to implement a binary * max-heap over an array. Inverse the comparator to implement a min-heap. * @return number of array elements * @note You must not mess up the array with other non-heap related functions * to keep the heap property. */ -QSE_EXPORT qse_size_t qse_lda_pushheap ( - qse_lda_t* lda, +QSE_EXPORT qse_size_t qse_arr_pushheap ( + qse_arr_t* arr, void* dptr, qse_size_t dlen ); /** - * The qse_lda_popheap() function deletes data at position 0 while keeping + * The qse_arr_popheap() function deletes data at position 0 while keeping * the largest data at positon 0. It is a utiltiy funtion to implement a binary * max-heap over an array. * @note You must not mess up the array with other non-heap related functions * to keep the heap property. */ -QSE_EXPORT void qse_lda_popheap ( - qse_lda_t* lda +QSE_EXPORT void qse_arr_popheap ( + qse_arr_t* arr ); #if defined(__cplusplus) diff --git a/qse/lib/awk/awk-prv.h b/qse/lib/awk/awk-prv.h index 6045f1c5..870e564f 100644 --- a/qse/lib/awk/awk-prv.h +++ b/qse/lib/awk/awk-prv.h @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include #include @@ -176,13 +176,13 @@ struct qse_awk_t qse_htb_t* named; /* global variables */ - qse_lda_t* gbls; + qse_arr_t* gbls; /* local variables */ - qse_lda_t* lcls; + qse_arr_t* lcls; /* parameters to a function */ - qse_lda_t* params; + qse_arr_t* params; /* maximum number of local variables */ qse_size_t nlcls_max; diff --git a/qse/lib/awk/awk.c b/qse/lib/awk/awk.c index 807e6d11..47ed7e00 100644 --- a/qse/lib/awk/awk.c +++ b/qse/lib/awk/awk.c @@ -194,9 +194,9 @@ int qse_awk_init (qse_awk_t* awk, qse_mmgr_t* mmgr, const qse_awk_prm_t* prm) awk->parse.funs = qse_htb_open (mmgr, QSE_SIZEOF(awk), 256, 70, QSE_SIZEOF(qse_char_t), 1); awk->parse.named = qse_htb_open (mmgr, QSE_SIZEOF(awk), 256, 70, QSE_SIZEOF(qse_char_t), 1); - awk->parse.gbls = qse_lda_open (mmgr, QSE_SIZEOF(awk), 128); - awk->parse.lcls = qse_lda_open (mmgr, QSE_SIZEOF(awk), 64); - awk->parse.params = qse_lda_open (mmgr, QSE_SIZEOF(awk), 32); + awk->parse.gbls = qse_arr_open (mmgr, QSE_SIZEOF(awk), 128); + awk->parse.lcls = qse_arr_open (mmgr, QSE_SIZEOF(awk), 64); + awk->parse.params = qse_arr_open (mmgr, QSE_SIZEOF(awk), 32); awk->fnc.sys = QSE_NULL; awk->fnc.user = qse_htb_open (mmgr, QSE_SIZEOF(awk), 512, 70, QSE_SIZEOF(qse_char_t), 1); @@ -225,16 +225,16 @@ int qse_awk_init (qse_awk_t* awk, qse_mmgr_t* mmgr, const qse_awk_prm_t* prm) qse_htb_setstyle (awk->parse.named, qse_gethtbstyle(QSE_HTB_STYLE_INLINE_KEY_COPIER)); *(qse_awk_t**)QSE_XTN(awk->parse.gbls) = awk; - qse_lda_setscale (awk->parse.gbls, QSE_SIZEOF(qse_char_t)); - qse_lda_setcopier (awk->parse.gbls, QSE_LDA_COPIER_INLINE); + qse_arr_setscale (awk->parse.gbls, QSE_SIZEOF(qse_char_t)); + qse_arr_setcopier (awk->parse.gbls, QSE_ARR_COPIER_INLINE); *(qse_awk_t**)QSE_XTN(awk->parse.lcls) = awk; - qse_lda_setscale (awk->parse.lcls, QSE_SIZEOF(qse_char_t)); - qse_lda_setcopier (awk->parse.lcls, QSE_LDA_COPIER_INLINE); + qse_arr_setscale (awk->parse.lcls, QSE_SIZEOF(qse_char_t)); + qse_arr_setcopier (awk->parse.lcls, QSE_ARR_COPIER_INLINE); *(qse_awk_t**)QSE_XTN(awk->parse.params) = awk; - qse_lda_setscale (awk->parse.params, QSE_SIZEOF(qse_char_t)); - qse_lda_setcopier (awk->parse.params, QSE_LDA_COPIER_INLINE); + qse_arr_setscale (awk->parse.params, QSE_SIZEOF(qse_char_t)); + qse_arr_setcopier (awk->parse.params, QSE_ARR_COPIER_INLINE); *(qse_awk_t**)QSE_XTN(awk->fnc.user) = awk; qse_htb_setstyle (awk->fnc.user, &fncusercbs); @@ -252,9 +252,9 @@ int qse_awk_init (qse_awk_t* awk, qse_mmgr_t* mmgr, const qse_awk_prm_t* prm) oops: if (awk->modtab) qse_rbt_close (awk->modtab); if (awk->fnc.user) qse_htb_close (awk->fnc.user); - if (awk->parse.params) qse_lda_close (awk->parse.params); - if (awk->parse.lcls) qse_lda_close (awk->parse.lcls); - if (awk->parse.gbls) qse_lda_close (awk->parse.gbls); + if (awk->parse.params) qse_arr_close (awk->parse.params); + if (awk->parse.lcls) qse_arr_close (awk->parse.lcls); + if (awk->parse.gbls) qse_arr_close (awk->parse.gbls); if (awk->parse.named) qse_htb_close (awk->parse.named); if (awk->parse.funs) qse_htb_close (awk->parse.funs); if (awk->tree.funs) qse_htb_close (awk->tree.funs); @@ -279,9 +279,9 @@ void qse_awk_fini (qse_awk_t* awk) qse_rbt_close (awk->modtab); qse_htb_close (awk->fnc.user); - qse_lda_close (awk->parse.params); - qse_lda_close (awk->parse.lcls); - qse_lda_close (awk->parse.gbls); + qse_arr_close (awk->parse.params); + qse_arr_close (awk->parse.lcls); + qse_arr_close (awk->parse.gbls); qse_htb_close (awk->parse.named); qse_htb_close (awk->parse.funs); @@ -329,14 +329,14 @@ void qse_awk_clear (qse_awk_t* awk) qse_rbt_walk (awk->modtab, unload_module, awk); qse_rbt_clear (awk->modtab); - QSE_ASSERT (QSE_LDA_SIZE(awk->parse.gbls) == awk->tree.ngbls); + QSE_ASSERT (QSE_ARR_SIZE(awk->parse.gbls) == awk->tree.ngbls); /* delete all non-builtin global variables */ - qse_lda_delete ( + qse_arr_delete ( awk->parse.gbls, awk->tree.ngbls_base, - QSE_LDA_SIZE(awk->parse.gbls) - awk->tree.ngbls_base); + QSE_ARR_SIZE(awk->parse.gbls) - awk->tree.ngbls_base); - qse_lda_clear (awk->parse.lcls); - qse_lda_clear (awk->parse.params); + qse_arr_clear (awk->parse.lcls); + qse_arr_clear (awk->parse.params); qse_htb_clear (awk->parse.named); qse_htb_clear (awk->parse.funs); diff --git a/qse/lib/awk/parse.c b/qse/lib/awk/parse.c index 044a982b..15d46415 100644 --- a/qse/lib/awk/parse.c +++ b/qse/lib/awk/parse.c @@ -523,10 +523,10 @@ static void unget_char (qse_awk_t* awk, const qse_awk_sio_lxc_t* c) const qse_char_t* qse_awk_getgblname ( qse_awk_t* awk, qse_size_t idx, qse_size_t* len) { - QSE_ASSERT (idx < QSE_LDA_SIZE(awk->parse.gbls)); + QSE_ASSERT (idx < QSE_ARR_SIZE(awk->parse.gbls)); - *len = QSE_LDA_DLEN(awk->parse.gbls,idx); - return QSE_LDA_DPTR(awk->parse.gbls,idx); + *len = QSE_ARR_DLEN(awk->parse.gbls,idx); + return QSE_ARR_DPTR(awk->parse.gbls,idx); } void qse_awk_getkwname (qse_awk_t* awk, qse_awk_kwid_t id, qse_cstr_t* s) @@ -604,7 +604,7 @@ static int parse (qse_awk_t* awk) } } - QSE_ASSERT (awk->tree.ngbls == QSE_LDA_SIZE(awk->parse.gbls)); + QSE_ASSERT (awk->tree.ngbls == QSE_ARR_SIZE(awk->parse.gbls)); ret = 0; oops: @@ -853,13 +853,13 @@ static int parse_progunit (qse_awk_t* awk) if (get_token(awk) <= -1) return -1; - QSE_ASSERT (awk->tree.ngbls == QSE_LDA_SIZE(awk->parse.gbls)); + QSE_ASSERT (awk->tree.ngbls == QSE_ARR_SIZE(awk->parse.gbls)); ngbls = awk->tree.ngbls; if (collect_globals (awk) == QSE_NULL) { - qse_lda_delete ( + qse_arr_delete ( awk->parse.gbls, ngbls, - QSE_LDA_SIZE(awk->parse.gbls) - ngbls); + QSE_ARR_SIZE(awk->parse.gbls) - ngbls); awk->tree.ngbls = ngbls; return -1; } @@ -1117,7 +1117,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) /* check if it conflicts with a named variable */ (qse_htb_search (awk->parse.named, name.ptr, name.len) != QSE_NULL && (rederr = QSE_AWK_EVARRED)) || /* check if it coincides to be a global variable name */ - (((g = find_global (awk, &name)) != QSE_LDA_NIL) && (rederr = QSE_AWK_EGBLRED))) + (((g = find_global (awk, &name)) != QSE_ARR_NIL) && (rederr = QSE_AWK_EGBLRED))) { qse_awk_seterror (awk, rederr, &name, &awk->tok.loc); return QSE_NULL; @@ -1155,7 +1155,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) } /* make sure that parameter table is empty */ - QSE_ASSERT (QSE_LDA_SIZE(awk->parse.params) == 0); + QSE_ASSERT (QSE_ARR_SIZE(awk->parse.params) == 0); /* read parameter list */ if (MATCH(awk,TOK_RPAREN)) @@ -1177,7 +1177,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) if (!MATCH(awk,TOK_IDENT)) { QSE_AWK_FREE (awk, name.ptr); - qse_lda_clear (awk->parse.params); + qse_arr_clear (awk->parse.params); SETERR_TOK (awk, QSE_AWK_EBADPAR); return QSE_NULL; } @@ -1197,10 +1197,10 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) * name or other parameters */ if (((awk->opt.trait & QSE_AWK_STRICTNAMING) && qse_strxncmp (pa, pal, name.ptr, name.len) == 0) || - qse_lda_search (awk->parse.params, 0, pa, pal) != QSE_LDA_NIL) + qse_arr_search (awk->parse.params, 0, pa, pal) != QSE_ARR_NIL) { QSE_AWK_FREE (awk, name.ptr); - qse_lda_clear (awk->parse.params); + qse_arr_clear (awk->parse.params); SETERR_ARG_LOC ( awk, QSE_AWK_EDUPPAR, pa, pal, &awk->tok.loc); @@ -1208,21 +1208,21 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) } /* push the parameter to the parameter list */ - if (QSE_LDA_SIZE(awk->parse.params) >= QSE_AWK_MAX_PARAMS) + if (QSE_ARR_SIZE(awk->parse.params) >= QSE_AWK_MAX_PARAMS) { QSE_AWK_FREE (awk, name.ptr); - qse_lda_clear (awk->parse.params); + qse_arr_clear (awk->parse.params); SETERR_LOC (awk, QSE_AWK_EPARTM, &awk->tok.loc); return QSE_NULL; } - if (qse_lda_insert ( + if (qse_arr_insert ( awk->parse.params, - QSE_LDA_SIZE(awk->parse.params), - pa, pal) == QSE_LDA_NIL) + QSE_ARR_SIZE(awk->parse.params), + pa, pal) == QSE_ARR_NIL) { QSE_AWK_FREE (awk, name.ptr); - qse_lda_clear (awk->parse.params); + qse_arr_clear (awk->parse.params); SETERR_LOC (awk, QSE_AWK_ENOMEM, &awk->tok.loc); return QSE_NULL; } @@ -1230,7 +1230,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) if (get_token (awk) <= -1) { QSE_AWK_FREE (awk, name.ptr); - qse_lda_clear (awk->parse.params); + qse_arr_clear (awk->parse.params); return QSE_NULL; } @@ -1239,7 +1239,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) if (!MATCH(awk,TOK_COMMA)) { QSE_AWK_FREE (awk, name.ptr); - qse_lda_clear (awk->parse.params); + qse_arr_clear (awk->parse.params); SETERR_TOK (awk, QSE_AWK_ECOMMA); return QSE_NULL; } @@ -1249,7 +1249,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) if (get_token(awk) <= -1) { QSE_AWK_FREE (awk, name.ptr); - qse_lda_clear (awk->parse.params); + qse_arr_clear (awk->parse.params); return QSE_NULL; } } @@ -1259,7 +1259,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) if (get_token(awk) <= -1) { QSE_AWK_FREE (awk, name.ptr); - qse_lda_clear (awk->parse.params); + qse_arr_clear (awk->parse.params); return QSE_NULL; } } @@ -1273,7 +1273,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) if (get_token(awk) <= -1) { QSE_AWK_FREE (awk, name.ptr); - qse_lda_clear (awk->parse.params); + qse_arr_clear (awk->parse.params); return QSE_NULL; } } @@ -1282,7 +1282,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) if (!MATCH(awk,TOK_LBRACE)) { QSE_AWK_FREE (awk, name.ptr); - qse_lda_clear (awk->parse.params); + qse_arr_clear (awk->parse.params); SETERR_TOK (awk, QSE_AWK_ELBRACE); return QSE_NULL; @@ -1290,7 +1290,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) if (get_token(awk) <= -1) { QSE_AWK_FREE (awk, name.ptr); - qse_lda_clear (awk->parse.params); + qse_arr_clear (awk->parse.params); return QSE_NULL; } @@ -1310,15 +1310,15 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) if (body == QSE_NULL) { QSE_AWK_FREE (awk, name.ptr); - qse_lda_clear (awk->parse.params); + qse_arr_clear (awk->parse.params); return QSE_NULL; } /* TODO: study furthur if the parameter names should be saved * for some reasons - might be needed for better deparsing output */ - nargs = QSE_LDA_SIZE(awk->parse.params); + nargs = QSE_ARR_SIZE(awk->parse.params); /* parameter names are not required anymore. clear them */ - qse_lda_clear (awk->parse.params); + qse_arr_clear (awk->parse.params); fun = (qse_awk_fun_t*) qse_awk_callocmem (awk, QSE_SIZEOF(*fun)); if (fun == QSE_NULL) @@ -1462,7 +1462,7 @@ static qse_awk_nde_t* parse_block ( qse_awk_nde_blk_t* block; qse_size_t nlcls, nlcls_max, tmp; - nlcls = QSE_LDA_SIZE(awk->parse.lcls); + nlcls = QSE_ARR_SIZE(awk->parse.lcls); nlcls_max = awk->parse.nlcls_max; /* local variable declarations */ @@ -1499,17 +1499,17 @@ static qse_awk_nde_t* parse_block ( /* @local ... */ if (get_token(awk) <= -1) { - qse_lda_delete ( + qse_arr_delete ( awk->parse.lcls, nlcls, - QSE_LDA_SIZE(awk->parse.lcls)-nlcls); + QSE_ARR_SIZE(awk->parse.lcls)-nlcls); return QSE_NULL; } if (collect_locals (awk, nlcls, istop) == QSE_NULL) { - qse_lda_delete ( + qse_arr_delete ( awk->parse.lcls, nlcls, - QSE_LDA_SIZE(awk->parse.lcls)-nlcls); + QSE_ARR_SIZE(awk->parse.lcls)-nlcls); return QSE_NULL; } } @@ -1530,9 +1530,9 @@ static qse_awk_nde_t* parse_block ( /* if EOF is met before the right brace, this is an error */ if (MATCH(awk,TOK_EOF)) { - qse_lda_delete ( + qse_arr_delete ( awk->parse.lcls, nlcls, - QSE_LDA_SIZE(awk->parse.lcls) - nlcls); + QSE_ARR_SIZE(awk->parse.lcls) - nlcls); if (head != QSE_NULL) qse_awk_clrpt (awk, head); SETERR_LOC (awk, QSE_AWK_EEOF, &awk->tok.loc); return QSE_NULL; @@ -1543,9 +1543,9 @@ static qse_awk_nde_t* parse_block ( { if (get_token(awk) <= -1) { - qse_lda_delete ( + qse_arr_delete ( awk->parse.lcls, nlcls, - QSE_LDA_SIZE(awk->parse.lcls)-nlcls); + QSE_ARR_SIZE(awk->parse.lcls)-nlcls); if (head != QSE_NULL) qse_awk_clrpt (awk, head); return QSE_NULL; } @@ -1583,9 +1583,9 @@ static qse_awk_nde_t* parse_block ( if (nde == QSE_NULL) { - qse_lda_delete ( + qse_arr_delete ( awk->parse.lcls, nlcls, - QSE_LDA_SIZE(awk->parse.lcls)-nlcls); + QSE_ARR_SIZE(awk->parse.lcls)-nlcls); if (head != QSE_NULL) qse_awk_clrpt (awk, head); return QSE_NULL; } @@ -1613,19 +1613,19 @@ static qse_awk_nde_t* parse_block ( block = (qse_awk_nde_blk_t*) qse_awk_callocmem (awk, QSE_SIZEOF(*block)); if (block == QSE_NULL) { - qse_lda_delete ( + qse_arr_delete ( awk->parse.lcls, nlcls, - QSE_LDA_SIZE(awk->parse.lcls)-nlcls); + QSE_ARR_SIZE(awk->parse.lcls)-nlcls); qse_awk_clrpt (awk, head); ADJERR_LOC (awk, xloc); return QSE_NULL; } - tmp = QSE_LDA_SIZE(awk->parse.lcls); + tmp = QSE_ARR_SIZE(awk->parse.lcls); if (tmp > awk->parse.nlcls_max) awk->parse.nlcls_max = tmp; /* remove all lcls to move it up to the top level */ - qse_lda_delete (awk->parse.lcls, nlcls, tmp - nlcls); + qse_arr_delete (awk->parse.lcls, nlcls, tmp - nlcls); /* adjust the number of lcls for a block without any statements */ /* if (head == QSE_NULL) tmp = 0; */ @@ -1687,12 +1687,12 @@ int qse_awk_initgbls (qse_awk_t* awk) { qse_size_t g; - g = qse_lda_insert ( + g = qse_arr_insert ( awk->parse.gbls, - QSE_LDA_SIZE(awk->parse.gbls), + QSE_ARR_SIZE(awk->parse.gbls), (qse_char_t*)gtab[id].name, gtab[id].namelen); - if (g == QSE_LDA_NIL) return -1; + if (g == QSE_ARR_NIL) return -1; QSE_ASSERT ((int)g == id); @@ -1716,11 +1716,11 @@ static void adjust_static_globals (qse_awk_t* awk) { if ((awk->opt.trait & gtab[id].trait) != gtab[id].trait) { - QSE_LDA_DLEN(awk->parse.gbls,id) = 0; + QSE_ARR_DLEN(awk->parse.gbls,id) = 0; } else { - QSE_LDA_DLEN(awk->parse.gbls,id) = gtab[id].namelen; + QSE_ARR_DLEN(awk->parse.gbls,id) = gtab[id].namelen; } } } @@ -1728,33 +1728,33 @@ static void adjust_static_globals (qse_awk_t* awk) static qse_size_t get_global (qse_awk_t* awk, const qse_cstr_t* name) { qse_size_t i; - qse_lda_t* gbls = awk->parse.gbls; + qse_arr_t* gbls = awk->parse.gbls; - for (i = QSE_LDA_SIZE(gbls); i > 0; ) + for (i = QSE_ARR_SIZE(gbls); i > 0; ) { i--; if (qse_strxncmp ( - QSE_LDA_DPTR(gbls,i), QSE_LDA_DLEN(gbls,i), + QSE_ARR_DPTR(gbls,i), QSE_ARR_DLEN(gbls,i), name->ptr, name->len) == 0) return i; } - return QSE_LDA_NIL; + return QSE_ARR_NIL; } static qse_size_t find_global (qse_awk_t* awk, const qse_cstr_t* name) { qse_size_t i; - qse_lda_t* gbls = awk->parse.gbls; + qse_arr_t* gbls = awk->parse.gbls; - for (i = 0; i < QSE_LDA_SIZE(gbls); i++) + for (i = 0; i < QSE_ARR_SIZE(gbls); i++) { if (qse_strxncmp ( - QSE_LDA_DPTR(gbls,i), QSE_LDA_DLEN(gbls,i), + QSE_ARR_DPTR(gbls,i), QSE_ARR_DLEN(gbls,i), name->ptr, name->len) == 0) return i; } - return QSE_LDA_NIL; + return QSE_ARR_NIL; } static int add_global ( @@ -1793,7 +1793,7 @@ static int add_global ( } /* check if it conflicts with other global variable names */ - if (find_global (awk, name) != QSE_LDA_NIL) + if (find_global (awk, name) != QSE_ARR_NIL) { SETERR_ARG_LOC (awk, QSE_AWK_EDUPGBL, name->ptr, name->len, xloc); return -1; @@ -1813,28 +1813,28 @@ static int add_global ( } #endif - ngbls = QSE_LDA_SIZE (awk->parse.gbls); + ngbls = QSE_ARR_SIZE (awk->parse.gbls); if (ngbls >= QSE_AWK_MAX_GBLS) { SETERR_LOC (awk, QSE_AWK_EGBLTM, xloc); return -1; } - if (qse_lda_insert (awk->parse.gbls, - QSE_LDA_SIZE(awk->parse.gbls), - (qse_char_t*)name->ptr, name->len) == QSE_LDA_NIL) + if (qse_arr_insert (awk->parse.gbls, + QSE_ARR_SIZE(awk->parse.gbls), + (qse_char_t*)name->ptr, name->len) == QSE_ARR_NIL) { SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return -1; } - QSE_ASSERT (ngbls == QSE_LDA_SIZE(awk->parse.gbls) - 1); + QSE_ASSERT (ngbls == QSE_ARR_SIZE(awk->parse.gbls) - 1); /* the disabled item is inserted normally but * the name length is reset to zero. */ - if (disabled) QSE_LDA_DLEN(awk->parse.gbls,ngbls) = 0; + if (disabled) QSE_ARR_DLEN(awk->parse.gbls,ngbls) = 0; - awk->tree.ngbls = QSE_LDA_SIZE (awk->parse.gbls); + awk->tree.ngbls = QSE_ARR_SIZE (awk->parse.gbls); QSE_ASSERT (ngbls == awk->tree.ngbls-1); /* return the id which is the index to the gbl table. */ @@ -1888,9 +1888,9 @@ int qse_awk_delgbl (qse_awk_t* awk, const qse_char_t* name) return -1; } - n = qse_lda_search (awk->parse.gbls, + n = qse_arr_search (awk->parse.gbls, QSE_AWK_NUM_STATIC_GBLS, ncs.ptr, ncs.len); - if (n == QSE_LDA_NIL) + if (n == QSE_ARR_NIL) { qse_awk_seterrnum (awk, QSE_AWK_ENOENT, &ncs); return -1; @@ -1905,7 +1905,7 @@ int qse_awk_delgbl (qse_awk_t* awk, const qse_char_t* name) awk->parse.gbls.buf[n].name.ptr[0] = QSE_T('\0'); awk->parse.gbls.buf[n].name.len = 0; */ - n = qse_lda_uplete (awk->parse.gbls, n, 1); + n = qse_arr_uplete (awk->parse.gbls, n, 1); QSE_ASSERT (n == 1); return 0; @@ -1919,9 +1919,9 @@ int qse_awk_findgbl (qse_awk_t* awk, const qse_char_t* name) ncs.ptr = (qse_char_t*)name; ncs.len = qse_strlen (name); - n = qse_lda_search (awk->parse.gbls, + n = qse_arr_search (awk->parse.gbls, QSE_AWK_NUM_STATIC_GBLS, ncs.ptr, ncs.len); - if (n == QSE_LDA_NIL) + if (n == QSE_ARR_NIL) { qse_awk_seterrnum (awk, QSE_AWK_ENOENT, &ncs); return -1; @@ -2023,9 +2023,9 @@ static qse_awk_t* collect_locals ( /* check if it conflicts with a parameter name. * the first level declaration is treated as the same * scope as the parameter list */ - n = qse_lda_search ( + n = qse_arr_search ( awk->parse.params, 0, lcl.ptr, lcl.len); - if (n != QSE_LDA_NIL) + if (n != QSE_ARR_NIL) { SETERR_ARG_LOC ( awk, QSE_AWK_EPARRED, @@ -2053,8 +2053,8 @@ static qse_awk_t* collect_locals ( } /* check if it conflicts with other local variable names */ - n = qse_lda_search (awk->parse.lcls, nlcls, lcl.ptr, lcl.len); - if (n != QSE_LDA_NIL) + n = qse_arr_search (awk->parse.lcls, nlcls, lcl.ptr, lcl.len); + if (n != QSE_ARR_NIL) { SETERR_ARG_LOC ( awk, QSE_AWK_EDUPLCL, @@ -2064,7 +2064,7 @@ static qse_awk_t* collect_locals ( /* check if it conflicts with global variable names */ n = find_global (awk, &lcl); - if (n != QSE_LDA_NIL) + if (n != QSE_ARR_NIL) { if (n < awk->tree.ngbls_base) { @@ -2077,16 +2077,16 @@ static qse_awk_t* collect_locals ( } } - if (QSE_LDA_SIZE(awk->parse.lcls) >= QSE_AWK_MAX_LCLS) + if (QSE_ARR_SIZE(awk->parse.lcls) >= QSE_AWK_MAX_LCLS) { SETERR_LOC (awk, QSE_AWK_ELCLTM, &awk->tok.loc); return QSE_NULL; } - if (qse_lda_insert ( + if (qse_arr_insert ( awk->parse.lcls, - QSE_LDA_SIZE(awk->parse.lcls), - lcl.ptr, lcl.len) == QSE_LDA_NIL) + QSE_ARR_SIZE(awk->parse.lcls), + lcl.ptr, lcl.len) == QSE_ARR_NIL) { SETERR_LOC (awk, QSE_AWK_ENOMEM, &awk->tok.loc); return QSE_NULL; @@ -4989,17 +4989,17 @@ static qse_awk_nde_t* parse_primary_ident_noseg ( { nde = parse_hashidx (awk, name, xloc); } - else if ((idxa = qse_lda_rsearch (awk->parse.lcls, QSE_LDA_SIZE(awk->parse.lcls), name->ptr, name->len)) != QSE_LDA_NIL) + else if ((idxa = qse_arr_rsearch (awk->parse.lcls, QSE_ARR_SIZE(awk->parse.lcls), name->ptr, name->len)) != QSE_ARR_NIL) { /* local variable */ nde = parse_variable (awk, xloc, QSE_AWK_NDE_LCL, name, idxa); } - else if ((idxa = qse_lda_search (awk->parse.params, 0, name->ptr, name->len)) != QSE_LDA_NIL) + else if ((idxa = qse_arr_search (awk->parse.params, 0, name->ptr, name->len)) != QSE_ARR_NIL) { /* parameter */ nde = parse_variable (awk, xloc, QSE_AWK_NDE_ARG, name, idxa); } - else if ((idxa = get_global (awk, name)) != QSE_LDA_NIL) + else if ((idxa = get_global (awk, name)) != QSE_ARR_NIL) { /* global variable */ nde = parse_variable (awk, xloc, QSE_AWK_NDE_GBL, name, idxa); @@ -5306,12 +5306,12 @@ static qse_awk_nde_t* parse_hashidx ( } /* search the local variable list */ - idxa = qse_lda_rsearch ( + idxa = qse_arr_rsearch ( awk->parse.lcls, - QSE_LDA_SIZE(awk->parse.lcls), + QSE_ARR_SIZE(awk->parse.lcls), name->ptr, name->len ); - if (idxa != QSE_LDA_NIL) + if (idxa != QSE_ARR_NIL) { nde->type = QSE_AWK_NDE_LCLIDX; nde->loc = *xloc; @@ -5325,8 +5325,8 @@ static qse_awk_nde_t* parse_hashidx ( } /* search the parameter name list */ - idxa = qse_lda_search (awk->parse.params, 0, name->ptr, name->len); - if (idxa != QSE_LDA_NIL) + idxa = qse_arr_search (awk->parse.params, 0, name->ptr, name->len); + if (idxa != QSE_ARR_NIL) { nde->type = QSE_AWK_NDE_ARGIDX; nde->loc = *xloc; @@ -5341,7 +5341,7 @@ static qse_awk_nde_t* parse_hashidx ( /* gets the global variable index */ idxa = get_global (awk, name); - if (idxa != QSE_LDA_NIL) + if (idxa != QSE_ARR_NIL) { nde->type = QSE_AWK_NDE_GBLIDX; nde->loc = *xloc; @@ -6394,8 +6394,8 @@ static int deparse (qse_awk_t* awk) /* use the actual name if no named variable * is allowed */ if (qse_awk_putsrcstrn (awk, - QSE_LDA_DPTR(awk->parse.gbls,i), - QSE_LDA_DLEN(awk->parse.gbls,i)) <= -1) + QSE_ARR_DPTR(awk->parse.gbls,i), + QSE_ARR_DLEN(awk->parse.gbls,i)) <= -1) { EXIT_DEPARSE (); } @@ -6419,8 +6419,8 @@ static int deparse (qse_awk_t* awk) if (!(awk->opt.trait & QSE_AWK_IMPLICIT)) { if (qse_awk_putsrcstrn (awk, - QSE_LDA_DPTR(awk->parse.gbls,i), - QSE_LDA_DLEN(awk->parse.gbls,i)) <= -1) + QSE_ARR_DPTR(awk->parse.gbls,i), + QSE_ARR_DLEN(awk->parse.gbls,i)) <= -1) { EXIT_DEPARSE (); } diff --git a/qse/lib/cmn/Makefile.am b/qse/lib/cmn/Makefile.am index 956a81df..390d635b 100644 --- a/qse/lib/cmn/Makefile.am +++ b/qse/lib/cmn/Makefile.am @@ -35,6 +35,7 @@ libqsecmn_la_SOURCES = \ alg-rand.c \ alg-search.c \ alg-sort.c \ + arr.c \ assert.c \ chr.c \ dll.c \ @@ -46,7 +47,6 @@ libqsecmn_la_SOURCES = \ fmt-out.c \ hton.c \ ipad.c \ - lda.c \ main.c \ mb8.c \ mbwc.c \ diff --git a/qse/lib/cmn/Makefile.in b/qse/lib/cmn/Makefile.in index 60f9bef2..486dddbd 100644 --- a/qse/lib/cmn/Makefile.in +++ b/qse/lib/cmn/Makefile.in @@ -133,8 +133,8 @@ am__DEPENDENCIES_1 = libqsecmn_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__libqsecmn_la_SOURCES_DIST = alg-base64.c alg-rand.c alg-search.c \ - alg-sort.c assert.c chr.c dll.c env.c gdl.c htb.c fma.c \ - fmt-intmax.c fmt-out.c hton.c ipad.c lda.c main.c mb8.c mbwc.c \ + alg-sort.c arr.c assert.c chr.c dll.c env.c gdl.c htb.c fma.c \ + fmt-intmax.c fmt-out.c hton.c ipad.c main.c mb8.c mbwc.c \ mbwc-str.c mem.c oht.c opt.c path-base.c path-canon.c \ path-core.c path-merge.c pma.c rbt.c rex.c sll.c slmb.c \ str-beg.c str-cat.c str-chr.c str-cnv.c str-cmp.c str-cpy.c \ @@ -148,8 +148,8 @@ am__libqsecmn_la_SOURCES_DIST = alg-base64.c alg-rand.c alg-search.c \ @ENABLE_BUNDLED_UNICODE_TRUE@am__objects_1 = uni.lo @ENABLE_XCMGRS_TRUE@am__objects_2 = cp949.lo cp950.lo am_libqsecmn_la_OBJECTS = alg-base64.lo alg-rand.lo alg-search.lo \ - alg-sort.lo assert.lo chr.lo dll.lo env.lo gdl.lo htb.lo \ - fma.lo fmt-intmax.lo fmt-out.lo hton.lo ipad.lo lda.lo main.lo \ + alg-sort.lo arr.lo assert.lo chr.lo dll.lo env.lo gdl.lo \ + htb.lo fma.lo fmt-intmax.lo fmt-out.lo hton.lo ipad.lo main.lo \ mb8.lo mbwc.lo mbwc-str.lo mem.lo oht.lo opt.lo path-base.lo \ path-canon.lo path-core.lo path-merge.lo pma.lo rbt.lo rex.lo \ sll.lo slmb.lo str-beg.lo str-cat.lo str-chr.lo str-cnv.lo \ @@ -467,18 +467,18 @@ noinst_HEADERS = \ uni-trait.h libqsecmn_la_SOURCES = alg-base64.c alg-rand.c alg-search.c alg-sort.c \ - assert.c chr.c dll.c env.c gdl.c htb.c fma.c fmt-intmax.c \ - fmt-out.c hton.c ipad.c lda.c main.c mb8.c mbwc.c mbwc-str.c \ - mem.c oht.c opt.c path-base.c path-canon.c path-core.c \ - path-merge.c pma.c rbt.c rex.c sll.c slmb.c str-beg.c \ - str-cat.c str-chr.c str-cnv.c str-cmp.c str-cpy.c str-del.c \ - str-dup.c str-dyn.c str-end.c str-excl.c str-fcpy.c str-fmt.c \ - str-fnmat.c str-incl.c str-join.c str-len.c str-pac.c \ - str-pbrk.c str-put.c str-rev.c str-rot.c str-set.c str-spl.c \ - str-spn.c str-str.c str-subst.c str-tok.c str-trm.c str-word.c \ - time.c tmr.c tre.c tre-ast.c tre-compile.c tre-match-bt.c \ - tre-match-pa.c tre-parse.c tre-stack.c uri.c utf8.c xma.c \ - $(am__append_1) $(am__append_2) + arr.c assert.c chr.c dll.c env.c gdl.c htb.c fma.c \ + fmt-intmax.c fmt-out.c hton.c ipad.c main.c mb8.c mbwc.c \ + mbwc-str.c mem.c oht.c opt.c path-base.c path-canon.c \ + path-core.c path-merge.c pma.c rbt.c rex.c sll.c slmb.c \ + str-beg.c str-cat.c str-chr.c str-cnv.c str-cmp.c str-cpy.c \ + str-del.c str-dup.c str-dyn.c str-end.c str-excl.c str-fcpy.c \ + str-fmt.c str-fnmat.c str-incl.c str-join.c str-len.c \ + str-pac.c str-pbrk.c str-put.c str-rev.c str-rot.c str-set.c \ + str-spl.c str-spn.c str-str.c str-subst.c str-tok.c str-trm.c \ + str-word.c time.c tmr.c tre.c tre-ast.c tre-compile.c \ + tre-match-bt.c tre-match-pa.c tre-parse.c tre-stack.c uri.c \ + utf8.c xma.c $(am__append_1) $(am__append_2) libqsecmn_la_LDFLAGS = -version-info 1:0:0 -no-undefined libqsecmn_la_LIBADD = $(SOCKET_LIBS) $(QUADMATH_LIBS) @ENABLE_CXX_TRUE@libqsecmnxx_la_SOURCES = \ @@ -578,6 +578,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alg-rand.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alg-search.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alg-sort.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assert.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cp949.Plo@am__quote@ @@ -591,7 +592,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/htb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipad.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lda.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mb8.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbwc-str.Plo@am__quote@ diff --git a/qse/lib/cmn/arr.c b/qse/lib/cmn/arr.c new file mode 100644 index 00000000..f4b0a324 --- /dev/null +++ b/qse/lib/cmn/arr.c @@ -0,0 +1,700 @@ +/* + * $Id$ + * + Copyright (c) 2006-2014 Chung, Hyung-Hwan. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include "mem-prv.h" + +#define arr_t qse_arr_t +#define slot_t qse_arr_slot_t +#define copier_t qse_arr_copier_t +#define freeer_t qse_arr_freeer_t +#define comper_t qse_arr_comper_t +#define sizer_t qse_arr_sizer_t +#define keeper_t qse_arr_keeper_t +#define walker_t qse_arr_walker_t + +#define mmgr_t qse_mmgr_t +#define size_t qse_size_t + +#define TOB(arr,len) ((len)*(arr)->scale) +#define DPTR(slot) ((slot)->val.ptr) +#define DLEN(slot) ((slot)->val.len) + +static int default_comparator (arr_t* arr, + const void* dptr1, size_t dlen1, + const void* dptr2, size_t dlen2) +{ + /* + if (dlen1 == dlen2) return QSE_MEMCMP (dptr1, dptr2, TOB(arr,dlen1)); + return 1; + */ + + size_t min = (dlen1 < dlen2)? dlen1: dlen2; + int n = QSE_MEMCMP (dptr1, dptr2, TOB(arr,min)); + if (n == 0 && dlen1 != dlen2) + { + n = (dlen1 > dlen2)? 1: -1; + } + + return n; +} + +static QSE_INLINE slot_t* alloc_slot (arr_t* arr, void* dptr, size_t dlen) +{ + slot_t* n; + + if (arr->copier == QSE_ARR_COPIER_SIMPLE) + { + n = QSE_MMGR_ALLOC (arr->mmgr, QSE_SIZEOF(slot_t)); + if (n == QSE_NULL) return QSE_NULL; + DPTR(n) = dptr; + } + else if (arr->copier == QSE_ARR_COPIER_INLINE) + { + n = QSE_MMGR_ALLOC (arr->mmgr, + QSE_SIZEOF(slot_t) + TOB(arr,dlen)); + if (n == QSE_NULL) return QSE_NULL; + + QSE_MEMCPY (n + 1, dptr, TOB(arr,dlen)); + DPTR(n) = n + 1; + } + else + { + n = QSE_MMGR_ALLOC (arr->mmgr, QSE_SIZEOF(slot_t)); + if (n == QSE_NULL) return QSE_NULL; + DPTR(n) = arr->copier (arr, dptr, dlen); + if (DPTR(n) == QSE_NULL) + { + QSE_MMGR_FREE (arr->mmgr, n); + return QSE_NULL; + } + } + + DLEN(n) = dlen; + + return n; +} + +arr_t* qse_arr_open (mmgr_t* mmgr, size_t xtnsize, size_t capa) +{ + arr_t* arr; + + arr = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(arr_t) + xtnsize); + if (arr == QSE_NULL) return QSE_NULL; + + if (qse_arr_init (arr, mmgr, capa) <= -1) + { + QSE_MMGR_FREE (mmgr, arr); + return QSE_NULL; + } + + QSE_MEMSET (QSE_XTN(arr), 0, xtnsize); + return arr; +} + +void qse_arr_close (arr_t* arr) +{ + qse_arr_fini (arr); + QSE_MMGR_FREE (arr->mmgr, arr); +} + +int qse_arr_init (arr_t* arr, mmgr_t* mmgr, size_t capa) +{ + QSE_MEMSET (arr, 0, QSE_SIZEOF(*arr)); + + arr->mmgr = mmgr; + arr->size = 0; + arr->capa = 0; + arr->slot = QSE_NULL; + arr->scale = 1; + + arr->copier = QSE_ARR_COPIER_SIMPLE; + arr->comper = default_comparator; + + return (qse_arr_setcapa (arr, capa) == QSE_NULL)? -1: 0; +} + +void qse_arr_fini (arr_t* arr) +{ + qse_arr_clear (arr); + + if (arr->slot != QSE_NULL) + { + QSE_MMGR_FREE (arr->mmgr, arr->slot); + arr->slot = QSE_NULL; + arr->capa = 0; + } +} + +qse_mmgr_t* qse_arr_getmmgr (qse_arr_t* arr) +{ + return arr->mmgr; +} + +void* qse_arr_getxtn (qse_arr_t* arr) +{ + return QSE_XTN (arr); +} + +int qse_arr_getscale (arr_t* arr) +{ + return arr->scale; +} + +void qse_arr_setscale (arr_t* arr, int scale) +{ + QSE_ASSERTX (scale > 0 && scale <= QSE_TYPE_MAX(qse_byte_t), + "The scale should be larger than 0 and less than or equal to the maximum value that the qse_byte_t type can hold"); + + if (scale <= 0) scale = 1; + if (scale > QSE_TYPE_MAX(qse_byte_t)) scale = QSE_TYPE_MAX(qse_byte_t); + + arr->scale = scale; +} + +copier_t qse_arr_getcopier (arr_t* arr) +{ + return arr->copier; +} + +void qse_arr_setcopier (arr_t* arr, copier_t copier) +{ + if (copier == QSE_NULL) copier = QSE_ARR_COPIER_SIMPLE; + arr->copier = copier; +} + +freeer_t qse_arr_getfreeer (arr_t* arr) +{ + return arr->freeer; +} + +void qse_arr_setfreeer (arr_t* arr, freeer_t freeer) +{ + arr->freeer = freeer; +} + +comper_t qse_arr_getcomper (arr_t* arr) +{ + return arr->comper; +} + +void qse_arr_setcomper (arr_t* arr, comper_t comper) +{ + if (comper == QSE_NULL) comper = default_comparator; + arr->comper = comper; +} + +keeper_t qse_arr_getkeeper (arr_t* arr) +{ + return arr->keeper; +} + +void qse_arr_setkeeper (arr_t* arr, keeper_t keeper) +{ + arr->keeper = keeper; +} + +sizer_t qse_arr_getsizer (arr_t* arr) +{ + return arr->sizer; +} + +void qse_arr_setsizer (arr_t* arr, sizer_t sizer) +{ + arr->sizer = sizer; +} + +size_t qse_arr_getsize (arr_t* arr) +{ + return arr->size; +} + +size_t qse_arr_getcapa (arr_t* arr) +{ + return arr->capa; +} + +arr_t* qse_arr_setcapa (arr_t* arr, size_t capa) +{ + void* tmp; + + if (capa == arr->capa) return arr; + + if (arr->size > capa) + { + /* to trigger freeers on the items truncated */ + qse_arr_delete (arr, capa, arr->size - capa); + QSE_ASSERT (arr->size <= capa); + } + + if (capa > 0) + { + if (arr->mmgr->realloc != QSE_NULL && arr->slot != QSE_NULL) + { + tmp = (slot_t**) QSE_MMGR_REALLOC ( + arr->mmgr, arr->slot, + QSE_SIZEOF(*arr->slot)*capa); + if (tmp == QSE_NULL) return QSE_NULL; + } + else + { + tmp = (slot_t**) QSE_MMGR_ALLOC ( + arr->mmgr, QSE_SIZEOF(*arr->slot)*capa); + if (tmp == QSE_NULL) return QSE_NULL; + + if (arr->slot != QSE_NULL) + { + size_t x; + x = (capa > arr->capa)? arr->capa: capa; + QSE_MEMCPY (tmp, arr->slot, + QSE_SIZEOF(*arr->slot)*x); + QSE_MMGR_FREE (arr->mmgr, arr->slot); + } + } + } + else + { + if (arr->slot != QSE_NULL) + { + qse_arr_clear (arr); + QSE_MMGR_FREE (arr->mmgr, arr->slot); + } + + tmp = QSE_NULL; + } + + arr->slot = tmp; + arr->capa = capa; + + return arr; +} + +size_t qse_arr_search (arr_t* arr, size_t pos, const void* dptr, size_t dlen) +{ + size_t i; + + for (i = pos; i < arr->size; i++) + { + if (arr->slot[i] == QSE_NULL) continue; + + if (arr->comper (arr, + DPTR(arr->slot[i]), DLEN(arr->slot[i]), + dptr, dlen) == 0) return i; + } + + return QSE_ARR_NIL; +} + +size_t qse_arr_rsearch (arr_t* arr, size_t pos, const void* dptr, size_t dlen) +{ + size_t i; + + if (arr->size > 0) + { + if (pos >= arr->size) pos = arr->size - 1; + + for (i = pos + 1; i-- > 0; ) + { + if (arr->slot[i] == QSE_NULL) continue; + + if (arr->comper (arr, + DPTR(arr->slot[i]), DLEN(arr->slot[i]), + dptr, dlen) == 0) return i; + } + } + + return QSE_ARR_NIL; +} + +size_t qse_arr_upsert (arr_t* arr, size_t pos, void* dptr, size_t dlen) +{ + if (pos < arr->size) return qse_arr_update (arr, pos, dptr, dlen); + return qse_arr_insert (arr, pos, dptr, dlen); +} + +size_t qse_arr_insert (arr_t* arr, size_t pos, void* dptr, size_t dlen) +{ + size_t i; + slot_t* slot; + + /* allocate the slot first */ + slot = alloc_slot (arr, dptr, dlen); + if (slot == QSE_NULL) return QSE_ARR_NIL; + + /* do resizeing if necessary. + * resizing is performed after slot allocation because that way, it + * doesn't modify arr on any errors */ + if (pos >= arr->capa || arr->size >= arr->capa) + { + size_t capa, mincapa; + + /* get the minimum capacity needed */ + mincapa = (pos >= arr->size)? (pos + 1): (arr->size + 1); + + if (arr->sizer) + { + capa = arr->sizer (arr, mincapa); + } + else + { + if (arr->capa <= 0) + { + QSE_ASSERT (arr->size <= 0); + capa = (pos < 16)? 16: (pos + 1); + } + else + { + size_t bound = (pos >= arr->size)? pos: arr->size; + do { capa = arr->capa * 2; } while (capa <= bound); + } + } + + do + { + if (qse_arr_setcapa(arr,capa) != QSE_NULL) break; + + if (capa <= mincapa) + { + if (arr->freeer) + arr->freeer (arr, DPTR(slot), DLEN(slot)); + QSE_MMGR_FREE (arr->mmgr, slot); + return QSE_ARR_NIL; + } + + capa--; /* let it retry after lowering the capacity */ + } + while (1); + } + + if (pos >= arr->capa || arr->size >= arr->capa) + { + /* the buffer is not still enough after resizing */ + if (arr->freeer) + arr->freeer (arr, DPTR(slot), DLEN(slot)); + QSE_MMGR_FREE (arr->mmgr, slot); + return QSE_ARR_NIL; + } + + /* fill in the gap with QSE_NULL */ + for (i = arr->size; i < pos; i++) arr->slot[i] = QSE_NULL; + + /* shift values to the next cell */ + for (i = arr->size; i > pos; i--) arr->slot[i] = arr->slot[i-1]; + + /* set the value */ + arr->slot[pos] = slot; + + if (pos > arr->size) arr->size = pos + 1; + else arr->size++; + + return pos; +} + +size_t qse_arr_update (arr_t* arr, size_t pos, void* dptr, size_t dlen) +{ + slot_t* c; + + if (pos >= arr->size) return QSE_ARR_NIL; + + c = arr->slot[pos]; + if (c == QSE_NULL) + { + /* no previous data */ + arr->slot[pos] = alloc_slot (arr, dptr, dlen); + if (arr->slot[pos] == QSE_NULL) return QSE_ARR_NIL; + } + else + { + if (dptr == DPTR(c) && dlen == DLEN(c)) + { + /* updated to the same data */ + if (arr->keeper) arr->keeper (arr, dptr, dlen); + } + else + { + /* updated to different data */ + slot_t* slot = alloc_slot (arr, dptr, dlen); + if (slot == QSE_NULL) return QSE_ARR_NIL; + + if (arr->freeer != QSE_NULL) + arr->freeer (arr, DPTR(c), DLEN(c)); + QSE_MMGR_FREE (arr->mmgr, c); + + arr->slot[pos] = slot; + } + } + + return pos; +} + +size_t qse_arr_delete (arr_t* arr, size_t index, size_t count) +{ + size_t i; + + if (index >= arr->size) return 0; + if (count > arr->size - index) count = arr->size - index; + + i = index; + + for (i = index; i < index + count; i++) + { + slot_t* c = arr->slot[i]; + + if (c != QSE_NULL) + { + if (arr->freeer != QSE_NULL) + arr->freeer (arr, DPTR(c), DLEN(c)); + QSE_MMGR_FREE (arr->mmgr, c); + + arr->slot[i] = QSE_NULL; + } + } + + for (i = index + count; i < arr->size; i++) + { + arr->slot[i-count] = arr->slot[i]; + } + arr->slot[arr->size-1] = QSE_NULL; + + arr->size -= count; + return count; +} + +size_t qse_arr_uplete (arr_t* arr, size_t index, size_t count) +{ + size_t i; + + if (index >= arr->size) return 0; + if (count > arr->size - index) count = arr->size - index; + + i = index; + + for (i = index; i < index + count; i++) + { + slot_t* c = arr->slot[i]; + + if (c != QSE_NULL) + { + if (arr->freeer != QSE_NULL) + arr->freeer (arr, DPTR(c), DLEN(c)); + QSE_MMGR_FREE (arr->mmgr, c); + + arr->slot[i] = QSE_NULL; + } + } + + return count; +} + +void qse_arr_clear (arr_t* arr) +{ + size_t i; + + for (i = 0; i < arr->size; i++) + { + slot_t* c = arr->slot[i]; + if (c != QSE_NULL) + { + if (arr->freeer) + arr->freeer (arr, DPTR(c), DLEN(c)); + QSE_MMGR_FREE (arr->mmgr, c); + arr->slot[i] = QSE_NULL; + } + } + + arr->size = 0; +} + +size_t qse_arr_walk (arr_t* arr, walker_t walker, void* ctx) +{ + qse_arr_walk_t w = QSE_ARR_WALK_FORWARD; + size_t i = 0, nwalks = 0; + + if (arr->size <= 0) return 0; + + while (1) + { + if (arr->slot[i] != QSE_NULL) + { + w = walker (arr, i, ctx); + nwalks++; + } + + if (w == QSE_ARR_WALK_STOP) break; + + if (w == QSE_ARR_WALK_FORWARD) + { + i++; + if (i >= arr->size) break; + } + if (w == QSE_ARR_WALK_BACKWARD) + { + if (i <= 0) break; + i--; + } + } + + return nwalks; +} + +size_t qse_arr_rwalk (arr_t* arr, walker_t walker, void* ctx) +{ + qse_arr_walk_t w = QSE_ARR_WALK_BACKWARD; + size_t i, nwalks = 0; + + if (arr->size <= 0) return 0; + i = arr->size - 1; + + while (1) + { + if (arr->slot[i] != QSE_NULL) + { + w = walker (arr, i, ctx); + nwalks++; + } + + if (w == QSE_ARR_WALK_STOP) break; + + if (w == QSE_ARR_WALK_FORWARD) + { + i++; + if (i >= arr->size) break; + } + if (w == QSE_ARR_WALK_BACKWARD) + { + if (i <= 0) break; + i--; + } + } + + return nwalks; +} + +size_t qse_arr_pushstack (arr_t* arr, void* dptr, size_t dlen) +{ + return qse_arr_insert (arr, arr->size, dptr, dlen); +} + +void qse_arr_popstack (arr_t* arr) +{ + QSE_ASSERT (arr->size > 0); + qse_arr_delete (arr, arr->size - 1, 1); +} + +#define HEAP_PARENT(x) (((x)-1) / 2) +#define HEAP_LEFT(x) ((x)*2 + 1) +#define HEAP_RIGHT(x) ((x)*2 + 2) + +size_t qse_arr_pushheap (arr_t* arr, void* dptr, size_t dlen) +{ + size_t cur, par; + int n; + + /* add a value to the bottom */ + cur = arr->size; + if (qse_arr_insert (arr, cur, dptr, dlen) == QSE_ARR_NIL) + return QSE_ARR_NIL; + + while (cur != 0) + { + slot_t* tmp; + + /* compare with the parent */ + par = HEAP_PARENT(cur); + n = arr->comper (arr, + DPTR(arr->slot[cur]), DLEN(arr->slot[cur]), + DPTR(arr->slot[par]), DLEN(arr->slot[par])); + if (n <= 0) break; /* ok */ + + /* swap the current with the parent */ + tmp = arr->slot[cur]; + arr->slot[cur] = arr->slot[par]; + arr->slot[par] = tmp; + + cur = par; + } + + return arr->size; +} + +void qse_arr_popheap (arr_t* arr) +{ + size_t cur, child; + slot_t* tmp; + + QSE_ASSERT (arr->size > 0); + + /* destroy the top */ + tmp = arr->slot[0]; + if (arr->freeer) arr->freeer (arr, DPTR(tmp), DLEN(tmp)); + QSE_MMGR_FREE (arr->mmgr, tmp); + + /* move the last item to the top position also shrink the size */ + arr->slot[0] = arr->slot[--arr->size]; + + if (arr->size <= 1) return; /* only 1 element. nothing further to do */ + + for (cur = 0; cur < arr->size; cur = child) + { + size_t left, right; + int n; + + left = HEAP_LEFT(cur); + right = HEAP_RIGHT(cur); + + if (left >= arr->size) + { + /* the left child does not exist. + * reached the bottom. abort exchange */ + break; + } + + if (right >= arr->size) + { + /* the right child does not exist. only the left */ + child = left; + } + else + { + /* get the larger child of the two */ + n = arr->comper (arr, + DPTR(arr->slot[left]), DLEN(arr->slot[left]), + DPTR(arr->slot[right]), DLEN(arr->slot[right])); + child = (n > 0)? left: right; + } + + /* compare the current one with the child */ + n = arr->comper (arr, + DPTR(arr->slot[cur]), DLEN(arr->slot[cur]), + DPTR(arr->slot[child]), DLEN(arr->slot[child])); + if (n > 0) break; /* current one is larger. stop exchange */ + + /* swap the current with the child */ + tmp = arr->slot[cur]; + arr->slot[cur] = arr->slot[child]; + arr->slot[child] = tmp; + } +} diff --git a/qse/lib/cmn/lda.c b/qse/lib/cmn/lda.c deleted file mode 100644 index 820de766..00000000 --- a/qse/lib/cmn/lda.c +++ /dev/null @@ -1,700 +0,0 @@ -/* - * $Id$ - * - Copyright (c) 2006-2014 Chung, Hyung-Hwan. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include "mem-prv.h" - -#define lda_t qse_lda_t -#define slot_t qse_lda_slot_t -#define copier_t qse_lda_copier_t -#define freeer_t qse_lda_freeer_t -#define comper_t qse_lda_comper_t -#define sizer_t qse_lda_sizer_t -#define keeper_t qse_lda_keeper_t -#define walker_t qse_lda_walker_t - -#define mmgr_t qse_mmgr_t -#define size_t qse_size_t - -#define TOB(lda,len) ((len)*(lda)->scale) -#define DPTR(slot) ((slot)->val.ptr) -#define DLEN(slot) ((slot)->val.len) - -static int default_comparator (lda_t* lda, - const void* dptr1, size_t dlen1, - const void* dptr2, size_t dlen2) -{ - /* - if (dlen1 == dlen2) return QSE_MEMCMP (dptr1, dptr2, TOB(lda,dlen1)); - return 1; - */ - - size_t min = (dlen1 < dlen2)? dlen1: dlen2; - int n = QSE_MEMCMP (dptr1, dptr2, TOB(lda,min)); - if (n == 0 && dlen1 != dlen2) - { - n = (dlen1 > dlen2)? 1: -1; - } - - return n; -} - -static QSE_INLINE slot_t* alloc_slot (lda_t* lda, void* dptr, size_t dlen) -{ - slot_t* n; - - if (lda->copier == QSE_LDA_COPIER_SIMPLE) - { - n = QSE_MMGR_ALLOC (lda->mmgr, QSE_SIZEOF(slot_t)); - if (n == QSE_NULL) return QSE_NULL; - DPTR(n) = dptr; - } - else if (lda->copier == QSE_LDA_COPIER_INLINE) - { - n = QSE_MMGR_ALLOC (lda->mmgr, - QSE_SIZEOF(slot_t) + TOB(lda,dlen)); - if (n == QSE_NULL) return QSE_NULL; - - QSE_MEMCPY (n + 1, dptr, TOB(lda,dlen)); - DPTR(n) = n + 1; - } - else - { - n = QSE_MMGR_ALLOC (lda->mmgr, QSE_SIZEOF(slot_t)); - if (n == QSE_NULL) return QSE_NULL; - DPTR(n) = lda->copier (lda, dptr, dlen); - if (DPTR(n) == QSE_NULL) - { - QSE_MMGR_FREE (lda->mmgr, n); - return QSE_NULL; - } - } - - DLEN(n) = dlen; - - return n; -} - -lda_t* qse_lda_open (mmgr_t* mmgr, size_t xtnsize, size_t capa) -{ - lda_t* lda; - - lda = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(lda_t) + xtnsize); - if (lda == QSE_NULL) return QSE_NULL; - - if (qse_lda_init (lda, mmgr, capa) <= -1) - { - QSE_MMGR_FREE (mmgr, lda); - return QSE_NULL; - } - - QSE_MEMSET (QSE_XTN(lda), 0, xtnsize); - return lda; -} - -void qse_lda_close (lda_t* lda) -{ - qse_lda_fini (lda); - QSE_MMGR_FREE (lda->mmgr, lda); -} - -int qse_lda_init (lda_t* lda, mmgr_t* mmgr, size_t capa) -{ - QSE_MEMSET (lda, 0, QSE_SIZEOF(*lda)); - - lda->mmgr = mmgr; - lda->size = 0; - lda->capa = 0; - lda->slot = QSE_NULL; - lda->scale = 1; - - lda->copier = QSE_LDA_COPIER_SIMPLE; - lda->comper = default_comparator; - - return (qse_lda_setcapa (lda, capa) == QSE_NULL)? -1: 0; -} - -void qse_lda_fini (lda_t* lda) -{ - qse_lda_clear (lda); - - if (lda->slot != QSE_NULL) - { - QSE_MMGR_FREE (lda->mmgr, lda->slot); - lda->slot = QSE_NULL; - lda->capa = 0; - } -} - -qse_mmgr_t* qse_lda_getmmgr (qse_lda_t* lda) -{ - return lda->mmgr; -} - -void* qse_lda_getxtn (qse_lda_t* lda) -{ - return QSE_XTN (lda); -} - -int qse_lda_getscale (lda_t* lda) -{ - return lda->scale; -} - -void qse_lda_setscale (lda_t* lda, int scale) -{ - QSE_ASSERTX (scale > 0 && scale <= QSE_TYPE_MAX(qse_byte_t), - "The scale should be larger than 0 and less than or equal to the maximum value that the qse_byte_t type can hold"); - - if (scale <= 0) scale = 1; - if (scale > QSE_TYPE_MAX(qse_byte_t)) scale = QSE_TYPE_MAX(qse_byte_t); - - lda->scale = scale; -} - -copier_t qse_lda_getcopier (lda_t* lda) -{ - return lda->copier; -} - -void qse_lda_setcopier (lda_t* lda, copier_t copier) -{ - if (copier == QSE_NULL) copier = QSE_LDA_COPIER_SIMPLE; - lda->copier = copier; -} - -freeer_t qse_lda_getfreeer (lda_t* lda) -{ - return lda->freeer; -} - -void qse_lda_setfreeer (lda_t* lda, freeer_t freeer) -{ - lda->freeer = freeer; -} - -comper_t qse_lda_getcomper (lda_t* lda) -{ - return lda->comper; -} - -void qse_lda_setcomper (lda_t* lda, comper_t comper) -{ - if (comper == QSE_NULL) comper = default_comparator; - lda->comper = comper; -} - -keeper_t qse_lda_getkeeper (lda_t* lda) -{ - return lda->keeper; -} - -void qse_lda_setkeeper (lda_t* lda, keeper_t keeper) -{ - lda->keeper = keeper; -} - -sizer_t qse_lda_getsizer (lda_t* lda) -{ - return lda->sizer; -} - -void qse_lda_setsizer (lda_t* lda, sizer_t sizer) -{ - lda->sizer = sizer; -} - -size_t qse_lda_getsize (lda_t* lda) -{ - return lda->size; -} - -size_t qse_lda_getcapa (lda_t* lda) -{ - return lda->capa; -} - -lda_t* qse_lda_setcapa (lda_t* lda, size_t capa) -{ - void* tmp; - - if (capa == lda->capa) return lda; - - if (lda->size > capa) - { - /* to trigger freeers on the items truncated */ - qse_lda_delete (lda, capa, lda->size - capa); - QSE_ASSERT (lda->size <= capa); - } - - if (capa > 0) - { - if (lda->mmgr->realloc != QSE_NULL && lda->slot != QSE_NULL) - { - tmp = (slot_t**) QSE_MMGR_REALLOC ( - lda->mmgr, lda->slot, - QSE_SIZEOF(*lda->slot)*capa); - if (tmp == QSE_NULL) return QSE_NULL; - } - else - { - tmp = (slot_t**) QSE_MMGR_ALLOC ( - lda->mmgr, QSE_SIZEOF(*lda->slot)*capa); - if (tmp == QSE_NULL) return QSE_NULL; - - if (lda->slot != QSE_NULL) - { - size_t x; - x = (capa > lda->capa)? lda->capa: capa; - QSE_MEMCPY (tmp, lda->slot, - QSE_SIZEOF(*lda->slot)*x); - QSE_MMGR_FREE (lda->mmgr, lda->slot); - } - } - } - else - { - if (lda->slot != QSE_NULL) - { - qse_lda_clear (lda); - QSE_MMGR_FREE (lda->mmgr, lda->slot); - } - - tmp = QSE_NULL; - } - - lda->slot = tmp; - lda->capa = capa; - - return lda; -} - -size_t qse_lda_search (lda_t* lda, size_t pos, const void* dptr, size_t dlen) -{ - size_t i; - - for (i = pos; i < lda->size; i++) - { - if (lda->slot[i] == QSE_NULL) continue; - - if (lda->comper (lda, - DPTR(lda->slot[i]), DLEN(lda->slot[i]), - dptr, dlen) == 0) return i; - } - - return QSE_LDA_NIL; -} - -size_t qse_lda_rsearch (lda_t* lda, size_t pos, const void* dptr, size_t dlen) -{ - size_t i; - - if (lda->size > 0) - { - if (pos >= lda->size) pos = lda->size - 1; - - for (i = pos + 1; i-- > 0; ) - { - if (lda->slot[i] == QSE_NULL) continue; - - if (lda->comper (lda, - DPTR(lda->slot[i]), DLEN(lda->slot[i]), - dptr, dlen) == 0) return i; - } - } - - return QSE_LDA_NIL; -} - -size_t qse_lda_upsert (lda_t* lda, size_t pos, void* dptr, size_t dlen) -{ - if (pos < lda->size) return qse_lda_update (lda, pos, dptr, dlen); - return qse_lda_insert (lda, pos, dptr, dlen); -} - -size_t qse_lda_insert (lda_t* lda, size_t pos, void* dptr, size_t dlen) -{ - size_t i; - slot_t* slot; - - /* allocate the slot first */ - slot = alloc_slot (lda, dptr, dlen); - if (slot == QSE_NULL) return QSE_LDA_NIL; - - /* do resizeing if necessary. - * resizing is performed after slot allocation because that way, it - * doesn't modify lda on any errors */ - if (pos >= lda->capa || lda->size >= lda->capa) - { - size_t capa, mincapa; - - /* get the minimum capacity needed */ - mincapa = (pos >= lda->size)? (pos + 1): (lda->size + 1); - - if (lda->sizer) - { - capa = lda->sizer (lda, mincapa); - } - else - { - if (lda->capa <= 0) - { - QSE_ASSERT (lda->size <= 0); - capa = (pos < 16)? 16: (pos + 1); - } - else - { - size_t bound = (pos >= lda->size)? pos: lda->size; - do { capa = lda->capa * 2; } while (capa <= bound); - } - } - - do - { - if (qse_lda_setcapa(lda,capa) != QSE_NULL) break; - - if (capa <= mincapa) - { - if (lda->freeer) - lda->freeer (lda, DPTR(slot), DLEN(slot)); - QSE_MMGR_FREE (lda->mmgr, slot); - return QSE_LDA_NIL; - } - - capa--; /* let it retry after lowering the capacity */ - } - while (1); - } - - if (pos >= lda->capa || lda->size >= lda->capa) - { - /* the buffer is not still enough after resizing */ - if (lda->freeer) - lda->freeer (lda, DPTR(slot), DLEN(slot)); - QSE_MMGR_FREE (lda->mmgr, slot); - return QSE_LDA_NIL; - } - - /* fill in the gap with QSE_NULL */ - for (i = lda->size; i < pos; i++) lda->slot[i] = QSE_NULL; - - /* shift values to the next cell */ - for (i = lda->size; i > pos; i--) lda->slot[i] = lda->slot[i-1]; - - /* set the value */ - lda->slot[pos] = slot; - - if (pos > lda->size) lda->size = pos + 1; - else lda->size++; - - return pos; -} - -size_t qse_lda_update (lda_t* lda, size_t pos, void* dptr, size_t dlen) -{ - slot_t* c; - - if (pos >= lda->size) return QSE_LDA_NIL; - - c = lda->slot[pos]; - if (c == QSE_NULL) - { - /* no previous data */ - lda->slot[pos] = alloc_slot (lda, dptr, dlen); - if (lda->slot[pos] == QSE_NULL) return QSE_LDA_NIL; - } - else - { - if (dptr == DPTR(c) && dlen == DLEN(c)) - { - /* updated to the same data */ - if (lda->keeper) lda->keeper (lda, dptr, dlen); - } - else - { - /* updated to different data */ - slot_t* slot = alloc_slot (lda, dptr, dlen); - if (slot == QSE_NULL) return QSE_LDA_NIL; - - if (lda->freeer != QSE_NULL) - lda->freeer (lda, DPTR(c), DLEN(c)); - QSE_MMGR_FREE (lda->mmgr, c); - - lda->slot[pos] = slot; - } - } - - return pos; -} - -size_t qse_lda_delete (lda_t* lda, size_t index, size_t count) -{ - size_t i; - - if (index >= lda->size) return 0; - if (count > lda->size - index) count = lda->size - index; - - i = index; - - for (i = index; i < index + count; i++) - { - slot_t* c = lda->slot[i]; - - if (c != QSE_NULL) - { - if (lda->freeer != QSE_NULL) - lda->freeer (lda, DPTR(c), DLEN(c)); - QSE_MMGR_FREE (lda->mmgr, c); - - lda->slot[i] = QSE_NULL; - } - } - - for (i = index + count; i < lda->size; i++) - { - lda->slot[i-count] = lda->slot[i]; - } - lda->slot[lda->size-1] = QSE_NULL; - - lda->size -= count; - return count; -} - -size_t qse_lda_uplete (lda_t* lda, size_t index, size_t count) -{ - size_t i; - - if (index >= lda->size) return 0; - if (count > lda->size - index) count = lda->size - index; - - i = index; - - for (i = index; i < index + count; i++) - { - slot_t* c = lda->slot[i]; - - if (c != QSE_NULL) - { - if (lda->freeer != QSE_NULL) - lda->freeer (lda, DPTR(c), DLEN(c)); - QSE_MMGR_FREE (lda->mmgr, c); - - lda->slot[i] = QSE_NULL; - } - } - - return count; -} - -void qse_lda_clear (lda_t* lda) -{ - size_t i; - - for (i = 0; i < lda->size; i++) - { - slot_t* c = lda->slot[i]; - if (c != QSE_NULL) - { - if (lda->freeer) - lda->freeer (lda, DPTR(c), DLEN(c)); - QSE_MMGR_FREE (lda->mmgr, c); - lda->slot[i] = QSE_NULL; - } - } - - lda->size = 0; -} - -size_t qse_lda_walk (lda_t* lda, walker_t walker, void* ctx) -{ - qse_lda_walk_t w = QSE_LDA_WALK_FORWARD; - size_t i = 0, nwalks = 0; - - if (lda->size <= 0) return 0; - - while (1) - { - if (lda->slot[i] != QSE_NULL) - { - w = walker (lda, i, ctx); - nwalks++; - } - - if (w == QSE_LDA_WALK_STOP) break; - - if (w == QSE_LDA_WALK_FORWARD) - { - i++; - if (i >= lda->size) break; - } - if (w == QSE_LDA_WALK_BACKWARD) - { - if (i <= 0) break; - i--; - } - } - - return nwalks; -} - -size_t qse_lda_rwalk (lda_t* lda, walker_t walker, void* ctx) -{ - qse_lda_walk_t w = QSE_LDA_WALK_BACKWARD; - size_t i, nwalks = 0; - - if (lda->size <= 0) return 0; - i = lda->size - 1; - - while (1) - { - if (lda->slot[i] != QSE_NULL) - { - w = walker (lda, i, ctx); - nwalks++; - } - - if (w == QSE_LDA_WALK_STOP) break; - - if (w == QSE_LDA_WALK_FORWARD) - { - i++; - if (i >= lda->size) break; - } - if (w == QSE_LDA_WALK_BACKWARD) - { - if (i <= 0) break; - i--; - } - } - - return nwalks; -} - -size_t qse_lda_pushstack (lda_t* lda, void* dptr, size_t dlen) -{ - return qse_lda_insert (lda, lda->size, dptr, dlen); -} - -void qse_lda_popstack (lda_t* lda) -{ - QSE_ASSERT (lda->size > 0); - qse_lda_delete (lda, lda->size - 1, 1); -} - -#define HEAP_PARENT(x) (((x)-1) / 2) -#define HEAP_LEFT(x) ((x)*2 + 1) -#define HEAP_RIGHT(x) ((x)*2 + 2) - -size_t qse_lda_pushheap (lda_t* lda, void* dptr, size_t dlen) -{ - size_t cur, par; - int n; - - /* add a value to the bottom */ - cur = lda->size; - if (qse_lda_insert (lda, cur, dptr, dlen) == QSE_LDA_NIL) - return QSE_LDA_NIL; - - while (cur != 0) - { - slot_t* tmp; - - /* compare with the parent */ - par = HEAP_PARENT(cur); - n = lda->comper (lda, - DPTR(lda->slot[cur]), DLEN(lda->slot[cur]), - DPTR(lda->slot[par]), DLEN(lda->slot[par])); - if (n <= 0) break; /* ok */ - - /* swap the current with the parent */ - tmp = lda->slot[cur]; - lda->slot[cur] = lda->slot[par]; - lda->slot[par] = tmp; - - cur = par; - } - - return lda->size; -} - -void qse_lda_popheap (lda_t* lda) -{ - size_t cur, child; - slot_t* tmp; - - QSE_ASSERT (lda->size > 0); - - /* destroy the top */ - tmp = lda->slot[0]; - if (lda->freeer) lda->freeer (lda, DPTR(tmp), DLEN(tmp)); - QSE_MMGR_FREE (lda->mmgr, tmp); - - /* move the last item to the top position also shrink the size */ - lda->slot[0] = lda->slot[--lda->size]; - - if (lda->size <= 1) return; /* only 1 element. nothing further to do */ - - for (cur = 0; cur < lda->size; cur = child) - { - size_t left, right; - int n; - - left = HEAP_LEFT(cur); - right = HEAP_RIGHT(cur); - - if (left >= lda->size) - { - /* the left child does not exist. - * reached the bottom. abort exchange */ - break; - } - - if (right >= lda->size) - { - /* the right child does not exist. only the left */ - child = left; - } - else - { - /* get the larger child of the two */ - n = lda->comper (lda, - DPTR(lda->slot[left]), DLEN(lda->slot[left]), - DPTR(lda->slot[right]), DLEN(lda->slot[right])); - child = (n > 0)? left: right; - } - - /* compare the current one with the child */ - n = lda->comper (lda, - DPTR(lda->slot[cur]), DLEN(lda->slot[cur]), - DPTR(lda->slot[child]), DLEN(lda->slot[child])); - if (n > 0) break; /* current one is larger. stop exchange */ - - /* swap the current with the child */ - tmp = lda->slot[cur]; - lda->slot[cur] = lda->slot[child]; - lda->slot[child] = tmp; - } -} diff --git a/qse/lib/cmn/rex.c b/qse/lib/cmn/rex.c index d8f060b2..3ea5ab21 100644 --- a/qse/lib/cmn/rex.c +++ b/qse/lib/cmn/rex.c @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include "mem-prv.h" #define OCC_MAX QSE_TYPE_MAX(qse_size_t) @@ -75,7 +75,7 @@ struct exec_t { int active; int pending; - qse_lda_t set[2]; /* candidate arrays */ + qse_arr_t set[2]; /* candidate arrays */ } cand; qse_size_t nmatches; @@ -1379,9 +1379,9 @@ static int addsimplecand ( cand.group = group; cand.mptr = mptr; - if (qse_lda_search ( + if (qse_arr_search ( &e->cand.set[e->cand.pending], - 0, &cand, 1) != QSE_LDA_NIL) + 0, &cand, 1) != QSE_ARR_NIL) { /* exclude any existing entries in the array. * see comp_cand() for the equality test used. @@ -1395,10 +1395,10 @@ static int addsimplecand ( return 0; } - if (qse_lda_insert ( + if (qse_arr_insert ( &e->cand.set[e->cand.pending], - QSE_LDA_SIZE(&e->cand.set[e->cand.pending]), - &cand, 1) == QSE_LDA_NIL) + QSE_ARR_SIZE(&e->cand.set[e->cand.pending]), + &cand, 1) == QSE_ARR_NIL) { e->rex->errnum = QSE_REX_ENOMEM; return -1; @@ -1704,11 +1704,11 @@ static int charset_matched (exec_t* e, qse_rex_node_t* node, qse_char_t c) return matched; } -static qse_lda_walk_t walk_cands_for_match ( - qse_lda_t* lda, qse_size_t index, void* ctx) +static qse_arr_walk_t walk_cands_for_match ( + qse_arr_t* arr, qse_size_t index, void* ctx) { exec_t* e = (exec_t*)ctx; - cand_t* cand = QSE_LDA_DPTR(lda,index); + cand_t* cand = QSE_ARR_DPTR(arr,index); qse_rex_node_t* node = cand->node; const qse_char_t* nmptr = QSE_NULL; @@ -1807,7 +1807,7 @@ static qse_lda_walk_t walk_cands_for_match ( if (cand->occ < node->occ.max && cand->group != QSE_NULL) { gx = dupgroupstack (e, cand->group); - if (gx == QSE_NULL) return QSE_LDA_WALK_STOP; + if (gx == QSE_NULL) return QSE_ARR_WALK_STOP; } else gx = cand->group; @@ -1816,7 +1816,7 @@ static qse_lda_walk_t walk_cands_for_match ( n = addcands (e, gx, node, node->next, nmptr); refdowngroupstack (gx, e->rex->mmgr); - if (n <= -1) return QSE_LDA_WALK_STOP; + if (n <= -1) return QSE_ARR_WALK_STOP; } if (cand->occ < node->occ.max) @@ -1828,11 +1828,11 @@ static qse_lda_walk_t walk_cands_for_match ( node, cand->occ + 1, nmptr); refdowngroupstack (cand->group, e->rex->mmgr); - if (n <= -1) return QSE_LDA_WALK_STOP; + if (n <= -1) return QSE_ARR_WALK_STOP; } } - return QSE_LDA_WALK_FORWARD; + return QSE_ARR_WALK_FORWARD; } static int exec (exec_t* e) @@ -1846,7 +1846,7 @@ static int exec (exec_t* e) e->cand.active = 1; /* empty the pending set to collect the initial candidates */ - qse_lda_clear (&e->cand.set[e->cand.pending]); + qse_arr_clear (&e->cand.set[e->cand.pending]); /* the first node must be the START node */ QSE_ASSERT (e->rex->code->id == QSE_REX_NODE_START); @@ -1874,7 +1874,7 @@ static int exec (exec_t* e) e->cand.pending = e->cand.active; e->cand.active = tmp; - ncands_active = QSE_LDA_SIZE(&e->cand.set[e->cand.active]); + ncands_active = QSE_ARR_SIZE(&e->cand.set[e->cand.active]); if (ncands_active <= 0) { /* we can't go on with no candidates in the @@ -1883,7 +1883,7 @@ static int exec (exec_t* e) } /* clear the pending set */ - qse_lda_clear (&e->cand.set[e->cand.pending]); + qse_arr_clear (&e->cand.set[e->cand.pending]); #ifdef XTRA_DEBUG { @@ -1891,7 +1891,7 @@ static int exec (exec_t* e) qse_printf (QSE_T("SET=")); for (i = 0; i < ncands_active; i++) { - cand_t* cand = QSE_LDA_DPTR(&e->cand.set[e->cand.active],i); + cand_t* cand = QSE_ARR_DPTR(&e->cand.set[e->cand.active],i); qse_rex_node_t* node = cand->node; if (node->id == QSE_REX_NODE_CHAR) @@ -1907,7 +1907,7 @@ static int exec (exec_t* e) } #endif - if (qse_lda_walk ( + if (qse_arr_walk ( &e->cand.set[e->cand.active], walk_cands_for_match, e) != ncands_active) { @@ -1932,13 +1932,13 @@ static int exec (exec_t* e) return (e->nmatches > 0)? 1: 0; } -static void refdowngroupstack_incand (qse_lda_t* lda, void* dptr, qse_size_t dlen) +static void refdowngroupstack_incand (qse_arr_t* arr, void* dptr, qse_size_t dlen) { QSE_ASSERT (dlen == 1); - refdowngroupstack (((cand_t*)dptr)->group, lda->mmgr); + refdowngroupstack (((cand_t*)dptr)->group, arr->mmgr); } -static int comp_cand (qse_lda_t* lda, +static int comp_cand (qse_arr_t* arr, const void* dptr1, qse_size_t dlen1, const void* dptr2, qse_size_t dlen2) { @@ -1953,37 +1953,37 @@ static int comp_cand (qse_lda_t* lda, static int init_exec_dds (exec_t* e, qse_mmgr_t* mmgr) { /* initializes dynamic data structures */ - if (qse_lda_init (&e->cand.set[0], mmgr, 100) <= -1) + if (qse_arr_init (&e->cand.set[0], mmgr, 100) <= -1) { e->rex->errnum = QSE_REX_ENOMEM; return -1; } - if (qse_lda_init (&e->cand.set[1], mmgr, 100) <= -1) + if (qse_arr_init (&e->cand.set[1], mmgr, 100) <= -1) { e->rex->errnum = QSE_REX_ENOMEM; - qse_lda_fini (&e->cand.set[0]); + qse_arr_fini (&e->cand.set[0]); return -1; } - qse_lda_setscale (&e->cand.set[0], QSE_SIZEOF(cand_t)); - qse_lda_setscale (&e->cand.set[1], QSE_SIZEOF(cand_t)); + qse_arr_setscale (&e->cand.set[0], QSE_SIZEOF(cand_t)); + qse_arr_setscale (&e->cand.set[1], QSE_SIZEOF(cand_t)); - qse_lda_setcopier (&e->cand.set[0], QSE_LDA_COPIER_INLINE); - qse_lda_setcopier (&e->cand.set[1], QSE_LDA_COPIER_INLINE); + qse_arr_setcopier (&e->cand.set[0], QSE_ARR_COPIER_INLINE); + qse_arr_setcopier (&e->cand.set[1], QSE_ARR_COPIER_INLINE); - qse_lda_setfreeer (&e->cand.set[0], refdowngroupstack_incand); - qse_lda_setfreeer (&e->cand.set[1], refdowngroupstack_incand); + qse_arr_setfreeer (&e->cand.set[0], refdowngroupstack_incand); + qse_arr_setfreeer (&e->cand.set[1], refdowngroupstack_incand); - qse_lda_setcomper (&e->cand.set[0], comp_cand); - qse_lda_setcomper (&e->cand.set[1], comp_cand); + qse_arr_setcomper (&e->cand.set[0], comp_cand); + qse_arr_setcomper (&e->cand.set[1], comp_cand); return 0; } static void fini_exec_dds (exec_t* e) { - qse_lda_fini (&e->cand.set[1]); - qse_lda_fini (&e->cand.set[0]); + qse_arr_fini (&e->cand.set[1]); + qse_arr_fini (&e->cand.set[0]); } int qse_rex_exec ( diff --git a/qse/lib/si/dir.c b/qse/lib/si/dir.c index 573b6dcc..60e8687f 100644 --- a/qse/lib/si/dir.c +++ b/qse/lib/si/dir.c @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include "../cmn/mem-prv.h" #if defined(_WIN32) @@ -74,7 +74,7 @@ struct qse_dir_t qse_wcs_t wbuf; qse_mbs_t mbuf; - qse_lda_t* stab; + qse_arr_t* stab; int status; #if defined(_WIN32) @@ -148,7 +148,7 @@ qse_dir_errnum_t qse_dir_geterrnum (qse_dir_t* dir) return dir->errnum; } -static int compare_dirent (qse_lda_t* lda, const void* dptr1, qse_size_t dlen1, const void* dptr2, qse_size_t dlen2) +static int compare_dirent (qse_arr_t* arr, const void* dptr1, qse_size_t dlen1, const void* dptr2, qse_size_t dlen2) { int n = QSE_MEMCMP (dptr1, dptr2, ((dlen1 < dlen2)? dlen1: dlen2)); if (n == 0 && dlen1 != dlen2) n = (dlen1 > dlen2)? 1: -1; @@ -190,19 +190,19 @@ int qse_dir_init (qse_dir_t* dir, qse_mmgr_t* mmgr, const qse_char_t* path, int if (dir->flags & QSE_DIR_SORT) { - dir->stab = qse_lda_open (dir->mmgr, 0, 128); + dir->stab = qse_arr_open (dir->mmgr, 0, 128); if (dir->stab == QSE_NULL) goto oops_3; - /*qse_lda_setscale (dir->stab, 1);*/ - qse_lda_setcopier (dir->stab, QSE_LDA_COPIER_INLINE); - qse_lda_setcomper (dir->stab, compare_dirent); + /*qse_arr_setscale (dir->stab, 1);*/ + qse_arr_setcopier (dir->stab, QSE_ARR_COPIER_INLINE); + qse_arr_setcomper (dir->stab, compare_dirent); if (read_ahead_and_sort (dir, path) <= -1) goto oops_4; } return n; oops_4: - qse_lda_close (dir->stab); + qse_arr_close (dir->stab); oops_3: close_dir_safely (dir); oops_2: @@ -249,7 +249,7 @@ void qse_dir_fini (qse_dir_t* dir) qse_mbs_fini (&dir->mbuf); qse_wcs_fini (&dir->wbuf); - if (dir->stab) qse_lda_close (dir->stab); + if (dir->stab) qse_arr_close (dir->stab); } static qse_mchar_t* wcs_to_mbuf (qse_dir_t* dir, const qse_wchar_t* wcs, qse_mbs_t* mbuf) @@ -607,7 +607,7 @@ int qse_dir_reset (qse_dir_t* dir, const qse_char_t* path) if (dir->flags & QSE_DIR_SORT) { - qse_lda_clear (dir->stab); + qse_arr_clear (dir->stab); if (read_ahead_and_sort (dir, path) <= -1) { dir->status |= STATUS_SORT_ERR; @@ -852,7 +852,7 @@ static int read_ahead_and_sort (qse_dir_t* dir, const qse_char_t* path) else size = (qse_wcslen(name) + 1) * QSE_SIZEOF(qse_wchar_t); - if (qse_lda_pushheap (dir->stab, name, size) == (qse_size_t)-1) + if (qse_arr_pushheap (dir->stab, name, size) == (qse_size_t)-1) { dir->errnum = QSE_DIR_ENOMEM; return -1; @@ -873,12 +873,12 @@ int qse_dir_read (qse_dir_t* dir, qse_dir_ent_t* ent) { if (dir->status & STATUS_SORT_ERR) return -1; - if (dir->status & STATUS_POPHEAP) qse_lda_popheap (dir->stab); + if (dir->status & STATUS_POPHEAP) qse_arr_popheap (dir->stab); else dir->status |= STATUS_POPHEAP; - if (QSE_LDA_SIZE(dir->stab) <= 0) return 0; /* no more entry */ + if (QSE_ARR_SIZE(dir->stab) <= 0) return 0; /* no more entry */ - ent->name = QSE_LDA_DPTR(dir->stab, 0); + ent->name = QSE_ARR_DPTR(dir->stab, 0); return 1; } else diff --git a/qse/samples/cmn/Makefile.am b/qse/samples/cmn/Makefile.am index 3720b9d3..fba43fb7 100644 --- a/qse/samples/cmn/Makefile.am +++ b/qse/samples/cmn/Makefile.am @@ -7,6 +7,7 @@ AM_CPPFLAGS = \ bin_PROGRAMS = \ + arr01 \ chr01 \ dll \ env01 \ @@ -15,7 +16,6 @@ bin_PROGRAMS = \ fmt02 \ htb01 \ ipad01 \ - lda \ main01 \ main02 \ mbwc01 \ @@ -51,7 +51,7 @@ fmt01_SOURCES = fmt01.c fmt02_SOURCES = fmt02.c htb01_SOURCES = htb01.c ipad01_SOURCES = ipad01.c -lda_SOURCES = lda.c +arr01_SOURCES = arr01.c main01_SOURCES = main01.c main02_SOURCES = main02.c mbwc01_SOURCES = mbwc01.c @@ -75,14 +75,14 @@ if ENABLE_CXX #rex02_CXXFLAGS = -I/usr/lib/wx/include/gtk2-unicode-release-2.8 -I/usr/include/wx-2.8 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -D__WXGTK__ -pthread #rex02_LDFLAGS = -pthread -Wl,-Bsymbolic-functions -lwx_gtk2ud_richtext-2.8 -lwx_gtk2ud_aui-2.8 -lwx_gtk2ud_xrc-2.8 -lwx_gtk2ud_qa-2.8 -lwx_gtk2ud_html-2.8 -lwx_gtk2ud_adv-2.8 -lwx_gtk2ud_core-2.8 -lwx_baseud_xml-2.8 -lwx_baseud_net-2.8 -lwx_baseud-2.8 -bin_PROGRAMS += arr01 arr02 bh01 bh02 hl01 htb02 rbt02 rbt03 sp01 sp02 str02 - -arr01_SOURCES = arr01.cpp -arr01_LDADD = $(LDADD) -lqsecmnxx +bin_PROGRAMS += arr02 arr03 bh01 bh02 hl01 htb02 rbt02 rbt03 sp01 sp02 str02 arr02_SOURCES = arr02.cpp arr02_LDADD = $(LDADD) -lqsecmnxx +arr03_SOURCES = arr03.cpp +arr03_LDADD = $(LDADD) -lqsecmnxx + bh01_SOURCES = bh01.cpp bh01_LDADD = $(LDADD) -lqsecmnxx diff --git a/qse/samples/cmn/Makefile.in b/qse/samples/cmn/Makefile.in index 255446be..c9dbe8db 100644 --- a/qse/samples/cmn/Makefile.in +++ b/qse/samples/cmn/Makefile.in @@ -78,20 +78,20 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -bin_PROGRAMS = chr01$(EXEEXT) dll$(EXEEXT) env01$(EXEEXT) fma$(EXEEXT) \ - fmt01$(EXEEXT) fmt02$(EXEEXT) htb01$(EXEEXT) ipad01$(EXEEXT) \ - lda$(EXEEXT) main01$(EXEEXT) main02$(EXEEXT) mbwc01$(EXEEXT) \ - mbwc02$(EXEEXT) oht$(EXEEXT) path01$(EXEEXT) pma$(EXEEXT) \ - rex01$(EXEEXT) rbt01$(EXEEXT) sll$(EXEEXT) slmb01$(EXEEXT) \ - str01$(EXEEXT) str02$(EXEEXT) time$(EXEEXT) tre01$(EXEEXT) \ - uri01$(EXEEXT) xma$(EXEEXT) $(am__EXEEXT_1) +bin_PROGRAMS = arr01$(EXEEXT) chr01$(EXEEXT) dll$(EXEEXT) \ + env01$(EXEEXT) fma$(EXEEXT) fmt01$(EXEEXT) fmt02$(EXEEXT) \ + htb01$(EXEEXT) ipad01$(EXEEXT) main01$(EXEEXT) main02$(EXEEXT) \ + mbwc01$(EXEEXT) mbwc02$(EXEEXT) oht$(EXEEXT) path01$(EXEEXT) \ + pma$(EXEEXT) rex01$(EXEEXT) rbt01$(EXEEXT) sll$(EXEEXT) \ + slmb01$(EXEEXT) str01$(EXEEXT) str02$(EXEEXT) time$(EXEEXT) \ + tre01$(EXEEXT) uri01$(EXEEXT) xma$(EXEEXT) $(am__EXEEXT_1) @WCHAR_TRUE@@WIN32_TRUE@am__append_1 = $(UNICOWS_LIBS) #bin_PROGRAMS += rex02 #rex02_SOURCES = rex02.cpp #rex02_CXXFLAGS = -I/usr/lib/wx/include/gtk2-unicode-release-2.8 -I/usr/include/wx-2.8 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -D__WXGTK__ -pthread #rex02_LDFLAGS = -pthread -Wl,-Bsymbolic-functions -lwx_gtk2ud_richtext-2.8 -lwx_gtk2ud_aui-2.8 -lwx_gtk2ud_xrc-2.8 -lwx_gtk2ud_qa-2.8 -lwx_gtk2ud_html-2.8 -lwx_gtk2ud_adv-2.8 -lwx_gtk2ud_core-2.8 -lwx_baseud_xml-2.8 -lwx_baseud_net-2.8 -lwx_baseud-2.8 -@ENABLE_CXX_TRUE@am__append_2 = arr01 arr02 bh01 bh02 hl01 htb02 rbt02 rbt03 sp01 sp02 str02 +@ENABLE_CXX_TRUE@am__append_2 = arr02 arr03 bh01 bh02 hl01 htb02 rbt02 rbt03 sp01 sp02 str02 subdir = samples/cmn DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/ac/depcomp @@ -110,19 +110,18 @@ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/qse/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = -@ENABLE_CXX_TRUE@am__EXEEXT_1 = arr01$(EXEEXT) arr02$(EXEEXT) \ +@ENABLE_CXX_TRUE@am__EXEEXT_1 = arr02$(EXEEXT) arr03$(EXEEXT) \ @ENABLE_CXX_TRUE@ bh01$(EXEEXT) bh02$(EXEEXT) hl01$(EXEEXT) \ @ENABLE_CXX_TRUE@ htb02$(EXEEXT) rbt02$(EXEEXT) rbt03$(EXEEXT) \ @ENABLE_CXX_TRUE@ sp01$(EXEEXT) sp02$(EXEEXT) str02$(EXEEXT) am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) -am__arr01_SOURCES_DIST = arr01.cpp -@ENABLE_CXX_TRUE@am_arr01_OBJECTS = arr01.$(OBJEXT) +am_arr01_OBJECTS = arr01.$(OBJEXT) arr01_OBJECTS = $(am_arr01_OBJECTS) +arr01_LDADD = $(LDADD) am__DEPENDENCIES_1 = @WCHAR_TRUE@@WIN32_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) -am__DEPENDENCIES_3 = $(am__DEPENDENCIES_2) -@ENABLE_CXX_TRUE@arr01_DEPENDENCIES = $(am__DEPENDENCIES_3) +arr01_DEPENDENCIES = $(am__DEPENDENCIES_2) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent @@ -130,7 +129,12 @@ am__v_lt_1 = am__arr02_SOURCES_DIST = arr02.cpp @ENABLE_CXX_TRUE@am_arr02_OBJECTS = arr02.$(OBJEXT) arr02_OBJECTS = $(am_arr02_OBJECTS) +am__DEPENDENCIES_3 = $(am__DEPENDENCIES_2) @ENABLE_CXX_TRUE@arr02_DEPENDENCIES = $(am__DEPENDENCIES_3) +am__arr03_SOURCES_DIST = arr03.cpp +@ENABLE_CXX_TRUE@am_arr03_OBJECTS = arr03.$(OBJEXT) +arr03_OBJECTS = $(am_arr03_OBJECTS) +@ENABLE_CXX_TRUE@arr03_DEPENDENCIES = $(am__DEPENDENCIES_3) am__bh01_SOURCES_DIST = bh01.cpp @ENABLE_CXX_TRUE@am_bh01_OBJECTS = bh01.$(OBJEXT) bh01_OBJECTS = $(am_bh01_OBJECTS) @@ -179,10 +183,6 @@ am_ipad01_OBJECTS = ipad01.$(OBJEXT) ipad01_OBJECTS = $(am_ipad01_OBJECTS) ipad01_LDADD = $(LDADD) ipad01_DEPENDENCIES = $(am__DEPENDENCIES_2) -am_lda_OBJECTS = lda.$(OBJEXT) -lda_OBJECTS = $(am_lda_OBJECTS) -lda_LDADD = $(LDADD) -lda_DEPENDENCIES = $(am__DEPENDENCIES_2) am_main01_OBJECTS = main01.$(OBJEXT) main01_OBJECTS = $(am_main01_OBJECTS) main01_LDADD = $(LDADD) @@ -319,11 +319,11 @@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = -SOURCES = $(arr01_SOURCES) $(arr02_SOURCES) $(bh01_SOURCES) \ - $(bh02_SOURCES) $(chr01_SOURCES) $(dll_SOURCES) \ - $(env01_SOURCES) $(fma_SOURCES) $(fmt01_SOURCES) \ - $(fmt02_SOURCES) $(hl01_SOURCES) $(htb01_SOURCES) \ - $(htb02_SOURCES) $(ipad01_SOURCES) $(lda_SOURCES) \ +SOURCES = $(arr01_SOURCES) $(arr02_SOURCES) $(arr03_SOURCES) \ + $(bh01_SOURCES) $(bh02_SOURCES) $(chr01_SOURCES) \ + $(dll_SOURCES) $(env01_SOURCES) $(fma_SOURCES) \ + $(fmt01_SOURCES) $(fmt02_SOURCES) $(hl01_SOURCES) \ + $(htb01_SOURCES) $(htb02_SOURCES) $(ipad01_SOURCES) \ $(main01_SOURCES) $(main02_SOURCES) $(mbwc01_SOURCES) \ $(mbwc02_SOURCES) $(oht_SOURCES) $(path01_SOURCES) \ $(pma_SOURCES) $(rbt01_SOURCES) $(rbt02_SOURCES) \ @@ -331,15 +331,15 @@ SOURCES = $(arr01_SOURCES) $(arr02_SOURCES) $(bh01_SOURCES) \ $(slmb01_SOURCES) $(sp01_SOURCES) $(sp02_SOURCES) \ $(str01_SOURCES) $(str02_SOURCES) $(time_SOURCES) \ $(tre01_SOURCES) uri01.c $(xma_SOURCES) -DIST_SOURCES = $(am__arr01_SOURCES_DIST) $(am__arr02_SOURCES_DIST) \ - $(am__bh01_SOURCES_DIST) $(am__bh02_SOURCES_DIST) \ - $(chr01_SOURCES) $(dll_SOURCES) $(env01_SOURCES) \ - $(fma_SOURCES) $(fmt01_SOURCES) $(fmt02_SOURCES) \ - $(am__hl01_SOURCES_DIST) $(htb01_SOURCES) \ - $(am__htb02_SOURCES_DIST) $(ipad01_SOURCES) $(lda_SOURCES) \ - $(main01_SOURCES) $(main02_SOURCES) $(mbwc01_SOURCES) \ - $(mbwc02_SOURCES) $(oht_SOURCES) $(path01_SOURCES) \ - $(pma_SOURCES) $(rbt01_SOURCES) $(am__rbt02_SOURCES_DIST) \ +DIST_SOURCES = $(arr01_SOURCES) $(am__arr02_SOURCES_DIST) \ + $(am__arr03_SOURCES_DIST) $(am__bh01_SOURCES_DIST) \ + $(am__bh02_SOURCES_DIST) $(chr01_SOURCES) $(dll_SOURCES) \ + $(env01_SOURCES) $(fma_SOURCES) $(fmt01_SOURCES) \ + $(fmt02_SOURCES) $(am__hl01_SOURCES_DIST) $(htb01_SOURCES) \ + $(am__htb02_SOURCES_DIST) $(ipad01_SOURCES) $(main01_SOURCES) \ + $(main02_SOURCES) $(mbwc01_SOURCES) $(mbwc02_SOURCES) \ + $(oht_SOURCES) $(path01_SOURCES) $(pma_SOURCES) \ + $(rbt01_SOURCES) $(am__rbt02_SOURCES_DIST) \ $(am__rbt03_SOURCES_DIST) $(rex01_SOURCES) $(sll_SOURCES) \ $(slmb01_SOURCES) $(am__sp01_SOURCES_DIST) \ $(am__sp02_SOURCES_DIST) $(str01_SOURCES) \ @@ -561,7 +561,7 @@ fmt01_SOURCES = fmt01.c fmt02_SOURCES = fmt02.c htb01_SOURCES = htb01.c ipad01_SOURCES = ipad01.c -lda_SOURCES = lda.c +arr01_SOURCES = arr01.c main01_SOURCES = main01.c main02_SOURCES = main02.c mbwc01_SOURCES = mbwc01.c @@ -577,10 +577,10 @@ str01_SOURCES = str01.c time_SOURCES = time.c tre01_SOURCES = tre01.c xma_SOURCES = xma.c -@ENABLE_CXX_TRUE@arr01_SOURCES = arr01.cpp -@ENABLE_CXX_TRUE@arr01_LDADD = $(LDADD) -lqsecmnxx @ENABLE_CXX_TRUE@arr02_SOURCES = arr02.cpp @ENABLE_CXX_TRUE@arr02_LDADD = $(LDADD) -lqsecmnxx +@ENABLE_CXX_TRUE@arr03_SOURCES = arr03.cpp +@ENABLE_CXX_TRUE@arr03_LDADD = $(LDADD) -lqsecmnxx @ENABLE_CXX_TRUE@bh01_SOURCES = bh01.cpp @ENABLE_CXX_TRUE@bh01_LDADD = $(LDADD) -lqsecmnxx @ENABLE_CXX_TRUE@bh02_SOURCES = bh02.cpp @@ -685,12 +685,16 @@ clean-binPROGRAMS: arr01$(EXEEXT): $(arr01_OBJECTS) $(arr01_DEPENDENCIES) $(EXTRA_arr01_DEPENDENCIES) @rm -f arr01$(EXEEXT) - $(AM_V_CXXLD)$(CXXLINK) $(arr01_OBJECTS) $(arr01_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(arr01_OBJECTS) $(arr01_LDADD) $(LIBS) arr02$(EXEEXT): $(arr02_OBJECTS) $(arr02_DEPENDENCIES) $(EXTRA_arr02_DEPENDENCIES) @rm -f arr02$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(arr02_OBJECTS) $(arr02_LDADD) $(LIBS) +arr03$(EXEEXT): $(arr03_OBJECTS) $(arr03_DEPENDENCIES) $(EXTRA_arr03_DEPENDENCIES) + @rm -f arr03$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(arr03_OBJECTS) $(arr03_LDADD) $(LIBS) + bh01$(EXEEXT): $(bh01_OBJECTS) $(bh01_DEPENDENCIES) $(EXTRA_bh01_DEPENDENCIES) @rm -f bh01$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(bh01_OBJECTS) $(bh01_LDADD) $(LIBS) @@ -739,10 +743,6 @@ ipad01$(EXEEXT): $(ipad01_OBJECTS) $(ipad01_DEPENDENCIES) $(EXTRA_ipad01_DEPENDE @rm -f ipad01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ipad01_OBJECTS) $(ipad01_LDADD) $(LIBS) -lda$(EXEEXT): $(lda_OBJECTS) $(lda_DEPENDENCIES) $(EXTRA_lda_DEPENDENCIES) - @rm -f lda$(EXEEXT) - $(AM_V_CCLD)$(LINK) $(lda_OBJECTS) $(lda_LDADD) $(LIBS) - main01$(EXEEXT): $(main01_OBJECTS) $(main01_DEPENDENCIES) $(EXTRA_main01_DEPENDENCIES) @rm -f main01$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main01_OBJECTS) $(main01_LDADD) $(LIBS) @@ -835,6 +835,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arr01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arr02.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arr03.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bh01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bh02.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chr01.Po@am__quote@ @@ -847,7 +848,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/htb01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/htb02.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipad01.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lda.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main01.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main02.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbwc01.Po@am__quote@ diff --git a/qse/samples/cmn/arr01.c b/qse/samples/cmn/arr01.c new file mode 100644 index 00000000..b6611d13 --- /dev/null +++ b/qse/samples/cmn/arr01.c @@ -0,0 +1,462 @@ +#include +#include +#include +#include +#include + + +#define R(f) \ + do { \ + qse_printf (QSE_T("== %s ==\n"), QSE_T(#f)); \ + if (f() == -1) return -1; \ + } while (0) + +void keeper1 (qse_arr_t* arr, void* dptr, qse_size_t dlen) +{ + qse_printf (QSE_T("[%.*s] has been kept\n"), (int)dlen, dptr); +} + +qse_arr_walk_t walker1 (qse_arr_t* arr, qse_size_t index, void* arg) +{ + qse_printf (QSE_T("%d => [%.*s]\n"), + index, (int)QSE_ARR_DLEN(arr,index), QSE_ARR_DPTR(arr,index)); + return QSE_ARR_WALK_FORWARD; +} +qse_arr_walk_t rwalker1 (qse_arr_t* arr, qse_size_t index, void* arg) +{ + qse_printf (QSE_T("%d => [%.*s]\n"), + index, (int)QSE_ARR_DLEN(arr,index), QSE_ARR_DPTR(arr,index)); + return QSE_ARR_WALK_BACKWARD; +} + +qse_arr_walk_t walker3 (qse_arr_t* arr, qse_size_t index, void* arg) +{ + qse_printf (QSE_T("%d => [%d]\n"), + index, *(int*)QSE_ARR_DPTR(arr,index)); + return QSE_ARR_WALK_FORWARD; +} + +static int test1 () +{ + qse_arr_t* s1; + qse_char_t* x[] = + { + QSE_T("this is so good"), + QSE_T("what the fuck"), + QSE_T("do you like it?"), + QSE_T("oopsy!") + }; + int i; + + s1 = qse_arr_open (QSE_MMGR_GETDFL(), 0, 0); + if (s1 == QSE_NULL) + { + qse_printf (QSE_T("cannot open a string\n")); + return -1; + } + + qse_arr_setcopier (s1, QSE_ARR_COPIER_INLINE); + qse_arr_setkeeper (s1, keeper1); + qse_arr_setscale (s1, QSE_SIZEOF(qse_char_t)); + + for (i = 0; i < QSE_COUNTOF(x); i++) + { + if (qse_arr_insert (s1, 0, x[i], qse_strlen(x[i])) == QSE_ARR_NIL) + { + qse_printf (QSE_T("failed to add at 0 => [%.*s]\n"), + (int)qse_strlen(x[i]), x[i]); + } + else + { + qse_printf (QSE_T("add at 0 => [%.*s]\n"), + (int)qse_strlen(x[i]), x[i]); + } + } + + if (qse_arr_update (s1, 0, QSE_ARR_DPTR(s1,0), QSE_ARR_DLEN(s1,0)) == QSE_ARR_NIL) + { + qse_printf (QSE_T("failed to update index 0 with [%.*s]\n"), (int)QSE_ARR_DLEN(s1,0), QSE_ARR_DPTR(s1,0)); + } + else + { + qse_printf (QSE_T("updated index 0 with [%.*s]\n"), (int)QSE_ARR_DLEN(s1,0), QSE_ARR_DPTR(s1,0)); + } + + if (qse_arr_update (s1, 0, QSE_ARR_DPTR(s1,1), QSE_ARR_DLEN(s1,1)) == QSE_ARR_NIL) + { + qse_printf (QSE_T("updated index 0 with [%.*s]\n"), (int)QSE_ARR_DLEN(s1,1), QSE_ARR_DPTR(s1,1)); + } + else + { + qse_printf (QSE_T("updated index 0 with [%.*s]\n"), (int)QSE_ARR_DLEN(s1,0), QSE_ARR_DPTR(s1,0)); + } + + for (i = 0; i < QSE_COUNTOF(x); i++) + { + if (qse_arr_insert (s1, 10, x[i], qse_strlen(x[i])) == QSE_ARR_NIL) + { + qse_printf (QSE_T("failed to add at 10 => [%.*s]\n"), + (int)qse_strlen(x[i]), x[i]); + } + else + { + qse_printf (QSE_T("add at 10 => [%.*s]\n"), + (int)qse_strlen(x[i]), x[i]); + } + } + + qse_printf (QSE_T("arr size => %lu\n"), QSE_ARR_SIZE(s1)); + qse_arr_walk (s1, walker1, QSE_NULL); + qse_printf (QSE_T("arr size => %lu\n"), QSE_ARR_SIZE(s1)); + qse_arr_rwalk (s1, rwalker1, QSE_NULL); + +qse_arr_setcapa (s1, 3); + + qse_arr_close (s1); + return 0; +} + +static int test2 () +{ + qse_arr_t* s1; + qse_arr_slot_t* p; + const qse_char_t* x[] = + { + QSE_T("this is so good"), + QSE_T("what the fuck"), + QSE_T("do you like it?"), + QSE_T("oopsy!"), + QSE_T("hello hello!"), + QSE_T("oopsy!") + }; + const qse_char_t* y[] = + { + QSE_T("tipsy!"), + QSE_T("oopsy!") + }; + int i, j; + + s1 = qse_arr_open (QSE_MMGR_GETDFL(), 0, 0); + if (s1 == QSE_NULL) + { + qse_printf (QSE_T("cannot open a string\n")); + return -1; + } + + qse_arr_setcopier (s1, QSE_ARR_COPIER_INLINE); + qse_arr_setscale (s1, QSE_SIZEOF(qse_char_t)); + + for (j = 0; j < 20; j++) + { + qse_size_t index; + for (i = 0; i < QSE_COUNTOF(x); i++) + { + if (qse_arr_insert (s1, (i + 1) * j - 1, x[i], qse_strlen(x[i])) == QSE_ARR_NIL) + { + + qse_printf (QSE_T("failed to add at %u => [%.*s]\n"), + (unsigned int)((i + 1) * j - 1), + (int)qse_strlen(x[i]), x[i]); + } + else + { + qse_printf (QSE_T("add at %u => [%.*s]\n"), + (unsigned int)((i + 1) * j - 1), + (int)qse_strlen(x[i]), x[i]); + } + } + + for (i = 0; i < QSE_ARR_SIZE(s1); i++) + { + if (QSE_ARR_SLOT(s1,i)) + { + qse_printf (QSE_T("[%d] %d => [%.*s]\n"), + j, i, (int)QSE_ARR_DLEN(s1,i), QSE_ARR_DPTR(s1,i)); + } + } + + + for (i = 0; i < QSE_COUNTOF(y); i++) + { + index = qse_arr_search (s1, 0, y[i], qse_strlen(y[i])); + if (index == QSE_ARR_NIL) + { + qse_printf (QSE_T("failed to find [%s]\n"), y[i]); + } + else + { + qse_printf (QSE_T("found [%.*s] at %lu\n"), + (int)QSE_ARR_DLEN(s1,index), QSE_ARR_DPTR(s1,index), (unsigned long)index); + } + + index = qse_arr_rsearch (s1, QSE_ARR_SIZE(s1), y[i], qse_strlen(y[i])); + if (index == QSE_ARR_NIL) + { + qse_printf (QSE_T("failed to find [%s]\n"), y[i]); + } + else + { + qse_printf (QSE_T("found [%.*s] at %lu\n"), + (int)QSE_ARR_DLEN(s1,index), QSE_ARR_DPTR(s1,index), (unsigned long)index); + } + } + + + qse_arr_clear (s1); + qse_printf (QSE_T("~~~~~~~~\n")); + } + + qse_arr_close (s1); + return 0; +} + +static int test3 () +{ + qse_arr_t* s1; + const qse_char_t* x[] = + { + QSE_T("this is so good"), + QSE_T("what the fuck"), + QSE_T("do you like it?"), + QSE_T("oopsy!") + }; + const qse_char_t* y = + QSE_T("We Accept MasterCard, VISA, JCB, Dinner & eCheck"); + int i, j; + + s1 = qse_arr_open (QSE_MMGR_GETDFL(), 0, 0); + if (s1 == QSE_NULL) + { + qse_printf (QSE_T("cannot open a string\n")); + return -1; + } + + qse_arr_setcopier (s1, QSE_ARR_COPIER_INLINE); + qse_arr_setscale (s1, QSE_SIZEOF(qse_char_t)); + + for (j = 0; j < 20; j++) + { + for (i = 0; i < QSE_COUNTOF(x); i++) + { + if (qse_arr_insert (s1, (i + 1) * j - 1, x[i], qse_strlen(x[i])) == QSE_ARR_NIL) + { + + qse_printf (QSE_T("failed to add at %u => [%.*s]\n"), + (unsigned int)((i + 1) * j - 1), + (int)qse_strlen(x[i]), x[i]); + } + else + { + qse_printf (QSE_T("add at %u => [%.*s]\n"), + (unsigned int)((i + 1) * j - 1), + (int)qse_strlen(x[i]), x[i]); + } + } + + + for (i = 2; i < 3; i++) + { + if (i < QSE_ARR_SIZE(s1)) + { + if (QSE_ARR_SLOT(s1,i)) + { + qse_printf (QSE_T("deleted at %d => [%.*s]\n"), + i, (int)QSE_ARR_DLEN(s1,i), QSE_ARR_DPTR(s1,i)); + } + + qse_arr_delete (s1, i, 1); + } + + if (i < QSE_ARR_SIZE(s1)) + { + if (qse_arr_update (s1, i, y, qse_strlen(y)) == QSE_ARR_NIL) + { + qse_printf (QSE_T("failed to update at %d => [%.*s]\n"), + i, (int)qse_strlen(y), y); + } + else + { + qse_printf (QSE_T("updated at %d => [%.*s]\n"), + i, (int)QSE_ARR_DLEN(s1,i), QSE_ARR_DPTR(s1,i)); + } + } + + } + + qse_printf (QSE_T("array size => %lu\n"), (unsigned long)QSE_ARR_SIZE(s1)); + + for (i = 0; i < QSE_ARR_SIZE(s1); i++) + { + if (QSE_ARR_SLOT(s1,i)) + { + qse_printf (QSE_T("[%d] %d => [%.*s]\n"), + j, i, (int)QSE_ARR_DLEN(s1,i), QSE_ARR_DPTR(s1,i)); + } + } + + { + qse_size_t count = qse_arr_uplete (s1, 3, 20); + qse_printf (QSE_T("upleted %lu items from index 3\n"), (unsigned long)count); + } + + qse_printf (QSE_T("array size => %lu\n"), (unsigned long)QSE_ARR_SIZE(s1)); + + for (i = 0; i < QSE_ARR_SIZE(s1); i++) + { + if (QSE_ARR_SLOT(s1,i)) + { + qse_printf (QSE_T("[%d] %d => [%.*s]\n"), + j, i, (int)QSE_ARR_DLEN(s1,i), QSE_ARR_DPTR(s1,i)); + } + } + + qse_arr_clear (s1); + qse_printf (QSE_T("~~~~~~~~\n")); + } + + qse_arr_close (s1); + return 0; +} + +qse_size_t sizer1 (qse_arr_t* arr, qse_size_t hint) +{ + return 2; +} + +static int test4 () +{ + int i; + qse_arr_t* s1; + const qse_char_t* x[] = + { + QSE_T("this is so good"), + QSE_T("what the fuck"), + QSE_T("do you like it?"), + QSE_T("oopsy!") + }; + + s1 = qse_arr_open (QSE_MMGR_GETDFL(), 0, 3); + if (s1 == QSE_NULL) + { + qse_printf (QSE_T("cannot open an array\n")); + return -1; + } + + qse_arr_setcopier (s1, QSE_ARR_COPIER_INLINE); + qse_arr_setsizer (s1, sizer1); + qse_arr_setscale (s1, QSE_SIZEOF(qse_char_t)); + + for (i = 0; i < QSE_COUNTOF(x); i++) + { + if (qse_arr_insert (s1, 0, x[i], qse_strlen(x[i])) == QSE_ARR_NIL) + { + qse_printf (QSE_T("failed to add at 0 => [%.*s]\n"), + (int)qse_strlen(x[i]), x[i]); + } + else + { + qse_printf (QSE_T("add at 0 => [%.*s]\n"), + (int)qse_strlen(x[i]), x[i]); + } + } + + qse_printf (QSE_T("arr size => %lu\n"), QSE_ARR_SIZE(s1)); + qse_arr_walk (s1, walker1, QSE_NULL); + qse_printf (QSE_T("arr size => %lu\n"), QSE_ARR_SIZE(s1)); + qse_arr_rwalk (s1, rwalker1, QSE_NULL); + + qse_arr_close (s1); + return 0; +} + + +qse_arr_comper_t default_comparator; + +static int inverse_comparator (qse_arr_t* arr, + const void* dptr1, size_t dlen1, + const void* dptr2, size_t dlen2) +{ + return -default_comparator (arr, dptr1, dlen1, dptr2, dlen2); +} + +static int test5 () +{ + qse_arr_t* s1; + int i, j; + + s1 = qse_arr_open (QSE_MMGR_GETDFL(), 0, 3); + if (s1 == QSE_NULL) + { + qse_printf (QSE_T("cannot open an array\n")); + return -1; + } + + qse_arr_setcopier (s1, QSE_ARR_COPIER_INLINE); + qse_arr_setscale (s1, QSE_SIZEOF(i)); + + /* inverse the comparator to implement min-heap */ + default_comparator = qse_arr_getcomper (s1); + qse_arr_setcomper (s1, inverse_comparator); + + for (i = 0; i < 25; i++) + { + j = rand () % 100; + qse_arr_pushheap (s1, &j, 1); + } + + qse_printf (QSE_T("arr size => %lu\n"), QSE_ARR_SIZE(s1)); + qse_arr_walk (s1, walker3, QSE_NULL); + + while (QSE_ARR_SIZE(s1) > 10 ) + { + qse_printf (QSE_T("top => %d\n"), *(int*)QSE_ARR_DPTR(s1,0)); + qse_arr_popheap (s1); + } + + for (i = 0; i < 25; i++) + { + j = rand () % 100; + qse_arr_pushheap (s1, &j, 1); + } + + qse_printf (QSE_T("arr size => %lu\n"), QSE_ARR_SIZE(s1)); + qse_arr_walk (s1, walker3, QSE_NULL); + + while (QSE_ARR_SIZE(s1)) + { + qse_printf (QSE_T("top => %d\n"), *(int*)QSE_ARR_DPTR(s1,0)); + qse_arr_popheap (s1); + } + + qse_arr_setcomper (s1, default_comparator); + for (i = 0; i < 25; i++) + { + j = rand () % 100; + qse_arr_pushheap (s1, &j, 1); + } + + qse_printf (QSE_T("arr size => %lu\n"), QSE_ARR_SIZE(s1)); + qse_arr_walk (s1, walker3, QSE_NULL); + + while (QSE_ARR_SIZE(s1)) + { + qse_printf (QSE_T("top => %d\n"), *(int*)QSE_ARR_DPTR(s1,0)); + qse_arr_popheap (s1); + } + + + qse_arr_close (s1); + return 0; +} + +int main () +{ + qse_openstdsios (); + R (test1); + R (test2); + R (test3); + R (test4); + R (test5); + qse_closestdsios (); + return 0; +} diff --git a/qse/samples/cmn/arr01.cpp b/qse/samples/cmn/arr01.cpp deleted file mode 100644 index e9fe031d..00000000 --- a/qse/samples/cmn/arr01.cpp +++ /dev/null @@ -1,148 +0,0 @@ -#include - -#include -#include -#include - -/* -typedef QSE::Array IntArray; - -struct IntClass -{ - IntClass (int x = 0): x (x) {} - int x; -}; - -struct IntClassComparator -{ - int operator() (const IntClass& v, int y) const - { - IntTable::DefaultComparator comp; - return comp (v.x, y); - } -}; - -*/ - -#if 1 -class PosStr: public QSE::MbString -{ -public: - PosStr (const char* str = ""): QSE::MbString(str), pos((qse_size_t)-1) {}; - - PosStr (const PosStr& ps): QSE::MbString (ps), pos(ps.pos) - { - } - - ~PosStr() - { - } - - - qse_size_t pos; -}; -#else - -class PosStr -{ -public: - PosStr (const char* str = "") - { - strcpy (buf, str); - } - - const char* getBuffer() const { return this->buf; } - const char* data() const { return this->buf; } - - char buf[512]; -}; -#endif - - -struct cstr_comparator -{ - int operator() (const char* v1, const QSE::MbString& v2) const - { - return strcmp (v1, v2.getBuffer()); - } -}; - - -typedef QSE::Array StrArray; - - -int main () -{ - //StrArray h (QSE_NULL, 100); - StrArray h (QSE_NULL, 15); - char buf[20]; - - for (int i = 0; i < 20; i++) - { - sprintf (buf, "hello %d", i); - PosStr x (buf); - h.insert (0, x); - } - -#if 0 - printf ("%s\n", h.get(3).getBuffer()); - h.remove (3, 5); - printf ("%s\n", h.get(3).getBuffer()); - h.remove (3, 5); - printf ("%s\n", h.get(3).getBuffer()); -#endif - printf ("--------------------\n"); - for (qse_size_t i = 0; i < h.getSize(); i++) - { - printf ("[%s] at [%lu]\n", h[i].getBuffer(), (unsigned long int)h.getIndex(h[i])); - } - printf ("--------------------\n"); - - StrArray h2 (h); - StrArray h3; - - h3 = h2; - h.clear (true); - printf ("--------------------\n"); - printf ("%d\n", (int)h.getSize()); - printf ("--------------------\n"); - for (qse_size_t i = 0; i < h2.getSize(); i++) - { - printf ("[%s] at [%lu]\n", h2[i].getBuffer(), (unsigned long int)h2.getIndex(h2[i])); - } - printf ("--------------------\n"); - - h3.insert (21, "this is a large string"); - printf ("%d %d\n", (int)h2.getSize(), (int)h3.getSize()); - printf ("--------------------\n"); - h3.insert (21, "mystery!"); - for (qse_size_t i = 0; i < h3.getSize(); i++) - { - printf ("[%s] at [%lu]\n", h3[i].getBuffer(), (unsigned long int)h3.getIndex(h3[i])); - } - - printf ("--------------------\n"); - h3.setCapacity (6); - h3.insert (6, "good?"); - h3.rotate (StrArray::ROTATE_RIGHT, h3.getSize() / 2); - printf ("[%s] [%s]\n", h3.getValueAt(5).getBuffer(), h3.getValueAt(6).getBuffer()); - printf ("%d\n", (int)h3.getSize()); - - printf ("--------------------\n"); - h3.insert (1, "bad?"); - for (qse_size_t i = 0; i < h3.getSize(); i++) - { - printf ("[%s] at [%lu]\n", h3[i].getBuffer(), (unsigned long int)h3.getIndex(h3[i])); - } - - printf ("--------------------\n"); - QSE::Array a; - a.insert (0, 10); - a.insert (0, 20); - a.insert (0, 30); - const int& t = a[2u]; - printf ("%lu\n", (unsigned long int)a.getIndex(t)); - - - return 0; -} diff --git a/qse/samples/cmn/arr02.cpp b/qse/samples/cmn/arr02.cpp index 50110689..e9fe031d 100644 --- a/qse/samples/cmn/arr02.cpp +++ b/qse/samples/cmn/arr02.cpp @@ -4,105 +4,145 @@ #include #include -class Julia +/* +typedef QSE::Array IntArray; + +struct IntClass { -public: - Julia (int q = 0): x(QSE_NULL) - { - this->x = new int (q); -printf ("constructor %d\n", q); - } - - Julia (const Julia& q): x(QSE_NULL) - { - this->x = new int (*q.x); -printf ("copy constructor %d\n", *q.x); - } - - -#if defined(QSE_CPP_ENABLE_CPP11_MOVE) - Julia (Julia&& q) - { -printf ("move constructor %d\n", *q.x); - this->x = q.x; - q.x = QSE_NULL; - - } -#endif - - ~Julia() - { - if (this->x) - { -printf ("deleting %p %d\n", this, *x); - delete this->x; - } - } - - Julia& operator= (const Julia& q) - { - if (this != &q) - { - if (this->x) { delete this->x; this->x = QSE_NULL; } - this->x = new int (*q.x); -printf ("operator= %d\n", *q.x); - } - - return *this; - } - -#if defined(QSE_CPP_ENABLE_CPP11_MOVE) - Julia& operator= (Julia&& q) - { - if (this != &q) - { - if (this->x) { delete this->x; this->x = QSE_NULL; } -printf ("move operator= %d\n", *q.x); - this->x = q.x; - q.x = QSE_NULL; - } - - return *this; - } -#endif - - int* x; + IntClass (int x = 0): x (x) {} + int x; }; -typedef QSE::Array JuliaArray; +struct IntClassComparator +{ + int operator() (const IntClass& v, int y) const + { + IntTable::DefaultComparator comp; + return comp (v.x, y); + } +}; + +*/ + +#if 1 +class PosStr: public QSE::MbString +{ +public: + PosStr (const char* str = ""): QSE::MbString(str), pos((qse_size_t)-1) {}; + + PosStr (const PosStr& ps): QSE::MbString (ps), pos(ps.pos) + { + } + + ~PosStr() + { + } + + + qse_size_t pos; +}; +#else + +class PosStr +{ +public: + PosStr (const char* str = "") + { + strcpy (buf, str); + } + + const char* getBuffer() const { return this->buf; } + const char* data() const { return this->buf; } + + char buf[512]; +}; +#endif + + +struct cstr_comparator +{ + int operator() (const char* v1, const QSE::MbString& v2) const + { + return strcmp (v1, v2.getBuffer()); + } +}; + + +typedef QSE::Array StrArray; + int main () { - JuliaArray a0; + //StrArray h (QSE_NULL, 100); + StrArray h (QSE_NULL, 15); + char buf[20]; - for (int i = 0; i < 256; i++) + for (int i = 0; i < 20; i++) { - a0.insert (0, Julia(i)); + sprintf (buf, "hello %d", i); + PosStr x (buf); + h.insert (0, x); } - a0.setCapacity (1024); - a0.insert (512, Julia (512)); - - a0.remove (2, 5); - - a0.update (5, Julia(9999)); -#if defined(QSE_CPP_ENABLE_CPP11_MOVE) - JuliaArray a1 ((JuliaArray&&)a0); -#else - JuliaArray a1 (a0); +#if 0 + printf ("%s\n", h.get(3).getBuffer()); + h.remove (3, 5); + printf ("%s\n", h.get(3).getBuffer()); + h.remove (3, 5); + printf ("%s\n", h.get(3).getBuffer()); #endif - printf ("OK: %d %d\n", (int)a0.getSize(), (int)a1.getSize()); + printf ("--------------------\n"); + for (qse_size_t i = 0; i < h.getSize(); i++) + { + printf ("[%s] at [%lu]\n", h[i].getBuffer(), (unsigned long int)h.getIndex(h[i])); + } + printf ("--------------------\n"); - - for (qse_size_t i = 0; i < a1.getSize(); i++) + StrArray h2 (h); + StrArray h3; + + h3 = h2; + h.clear (true); + printf ("--------------------\n"); + printf ("%d\n", (int)h.getSize()); + printf ("--------------------\n"); + for (qse_size_t i = 0; i < h2.getSize(); i++) { - printf ("ITEM: %d => %d\n", (int)i, *a1[i].x); + printf ("[%s] at [%lu]\n", h2[i].getBuffer(), (unsigned long int)h2.getIndex(h2[i])); } - printf ("----------------\n"); - a1.rotate (JuliaArray::ROTATE_LEFT, 2); - for (qse_size_t i = 0; i < a1.getSize(); i++) + printf ("--------------------\n"); + + h3.insert (21, "this is a large string"); + printf ("%d %d\n", (int)h2.getSize(), (int)h3.getSize()); + printf ("--------------------\n"); + h3.insert (21, "mystery!"); + for (qse_size_t i = 0; i < h3.getSize(); i++) { - printf ("ITEM: %d => %d\n", (int)i, *a1[i].x); + printf ("[%s] at [%lu]\n", h3[i].getBuffer(), (unsigned long int)h3.getIndex(h3[i])); } + + printf ("--------------------\n"); + h3.setCapacity (6); + h3.insert (6, "good?"); + h3.rotate (StrArray::ROTATE_RIGHT, h3.getSize() / 2); + printf ("[%s] [%s]\n", h3.getValueAt(5).getBuffer(), h3.getValueAt(6).getBuffer()); + printf ("%d\n", (int)h3.getSize()); + + printf ("--------------------\n"); + h3.insert (1, "bad?"); + for (qse_size_t i = 0; i < h3.getSize(); i++) + { + printf ("[%s] at [%lu]\n", h3[i].getBuffer(), (unsigned long int)h3.getIndex(h3[i])); + } + + printf ("--------------------\n"); + QSE::Array a; + a.insert (0, 10); + a.insert (0, 20); + a.insert (0, 30); + const int& t = a[2u]; + printf ("%lu\n", (unsigned long int)a.getIndex(t)); + + return 0; } diff --git a/qse/samples/cmn/arr03.cpp b/qse/samples/cmn/arr03.cpp new file mode 100644 index 00000000..50110689 --- /dev/null +++ b/qse/samples/cmn/arr03.cpp @@ -0,0 +1,108 @@ +#include + +#include +#include +#include + +class Julia +{ +public: + Julia (int q = 0): x(QSE_NULL) + { + this->x = new int (q); +printf ("constructor %d\n", q); + } + + Julia (const Julia& q): x(QSE_NULL) + { + this->x = new int (*q.x); +printf ("copy constructor %d\n", *q.x); + } + + +#if defined(QSE_CPP_ENABLE_CPP11_MOVE) + Julia (Julia&& q) + { +printf ("move constructor %d\n", *q.x); + this->x = q.x; + q.x = QSE_NULL; + + } +#endif + + ~Julia() + { + if (this->x) + { +printf ("deleting %p %d\n", this, *x); + delete this->x; + } + } + + Julia& operator= (const Julia& q) + { + if (this != &q) + { + if (this->x) { delete this->x; this->x = QSE_NULL; } + this->x = new int (*q.x); +printf ("operator= %d\n", *q.x); + } + + return *this; + } + +#if defined(QSE_CPP_ENABLE_CPP11_MOVE) + Julia& operator= (Julia&& q) + { + if (this != &q) + { + if (this->x) { delete this->x; this->x = QSE_NULL; } +printf ("move operator= %d\n", *q.x); + this->x = q.x; + q.x = QSE_NULL; + } + + return *this; + } +#endif + + int* x; +}; + +typedef QSE::Array JuliaArray; + +int main () +{ + JuliaArray a0; + + for (int i = 0; i < 256; i++) + { + a0.insert (0, Julia(i)); + } + + a0.setCapacity (1024); + a0.insert (512, Julia (512)); + + a0.remove (2, 5); + + a0.update (5, Julia(9999)); +#if defined(QSE_CPP_ENABLE_CPP11_MOVE) + JuliaArray a1 ((JuliaArray&&)a0); +#else + JuliaArray a1 (a0); +#endif + printf ("OK: %d %d\n", (int)a0.getSize(), (int)a1.getSize()); + + + for (qse_size_t i = 0; i < a1.getSize(); i++) + { + printf ("ITEM: %d => %d\n", (int)i, *a1[i].x); + } + printf ("----------------\n"); + a1.rotate (JuliaArray::ROTATE_LEFT, 2); + for (qse_size_t i = 0; i < a1.getSize(); i++) + { + printf ("ITEM: %d => %d\n", (int)i, *a1[i].x); + } + return 0; +} diff --git a/qse/samples/cmn/lda.c b/qse/samples/cmn/lda.c deleted file mode 100644 index 37fcce41..00000000 --- a/qse/samples/cmn/lda.c +++ /dev/null @@ -1,462 +0,0 @@ -#include -#include -#include -#include -#include - - -#define R(f) \ - do { \ - qse_printf (QSE_T("== %s ==\n"), QSE_T(#f)); \ - if (f() == -1) return -1; \ - } while (0) - -void keeper1 (qse_lda_t* lda, void* dptr, qse_size_t dlen) -{ - qse_printf (QSE_T("[%.*s] has been kept\n"), (int)dlen, dptr); -} - -qse_lda_walk_t walker1 (qse_lda_t* lda, qse_size_t index, void* arg) -{ - qse_printf (QSE_T("%d => [%.*s]\n"), - index, (int)QSE_LDA_DLEN(lda,index), QSE_LDA_DPTR(lda,index)); - return QSE_LDA_WALK_FORWARD; -} -qse_lda_walk_t rwalker1 (qse_lda_t* lda, qse_size_t index, void* arg) -{ - qse_printf (QSE_T("%d => [%.*s]\n"), - index, (int)QSE_LDA_DLEN(lda,index), QSE_LDA_DPTR(lda,index)); - return QSE_LDA_WALK_BACKWARD; -} - -qse_lda_walk_t walker3 (qse_lda_t* lda, qse_size_t index, void* arg) -{ - qse_printf (QSE_T("%d => [%d]\n"), - index, *(int*)QSE_LDA_DPTR(lda,index)); - return QSE_LDA_WALK_FORWARD; -} - -static int test1 () -{ - qse_lda_t* s1; - qse_char_t* x[] = - { - QSE_T("this is so good"), - QSE_T("what the fuck"), - QSE_T("do you like it?"), - QSE_T("oopsy!") - }; - int i; - - s1 = qse_lda_open (QSE_MMGR_GETDFL(), 0, 0); - if (s1 == QSE_NULL) - { - qse_printf (QSE_T("cannot open a string\n")); - return -1; - } - - qse_lda_setcopier (s1, QSE_LDA_COPIER_INLINE); - qse_lda_setkeeper (s1, keeper1); - qse_lda_setscale (s1, QSE_SIZEOF(qse_char_t)); - - for (i = 0; i < QSE_COUNTOF(x); i++) - { - if (qse_lda_insert (s1, 0, x[i], qse_strlen(x[i])) == QSE_LDA_NIL) - { - qse_printf (QSE_T("failed to add at 0 => [%.*s]\n"), - (int)qse_strlen(x[i]), x[i]); - } - else - { - qse_printf (QSE_T("add at 0 => [%.*s]\n"), - (int)qse_strlen(x[i]), x[i]); - } - } - - if (qse_lda_update (s1, 0, QSE_LDA_DPTR(s1,0), QSE_LDA_DLEN(s1,0)) == QSE_LDA_NIL) - { - qse_printf (QSE_T("failed to update index 0 with [%.*s]\n"), (int)QSE_LDA_DLEN(s1,0), QSE_LDA_DPTR(s1,0)); - } - else - { - qse_printf (QSE_T("updated index 0 with [%.*s]\n"), (int)QSE_LDA_DLEN(s1,0), QSE_LDA_DPTR(s1,0)); - } - - if (qse_lda_update (s1, 0, QSE_LDA_DPTR(s1,1), QSE_LDA_DLEN(s1,1)) == QSE_LDA_NIL) - { - qse_printf (QSE_T("updated index 0 with [%.*s]\n"), (int)QSE_LDA_DLEN(s1,1), QSE_LDA_DPTR(s1,1)); - } - else - { - qse_printf (QSE_T("updated index 0 with [%.*s]\n"), (int)QSE_LDA_DLEN(s1,0), QSE_LDA_DPTR(s1,0)); - } - - for (i = 0; i < QSE_COUNTOF(x); i++) - { - if (qse_lda_insert (s1, 10, x[i], qse_strlen(x[i])) == QSE_LDA_NIL) - { - qse_printf (QSE_T("failed to add at 10 => [%.*s]\n"), - (int)qse_strlen(x[i]), x[i]); - } - else - { - qse_printf (QSE_T("add at 10 => [%.*s]\n"), - (int)qse_strlen(x[i]), x[i]); - } - } - - qse_printf (QSE_T("lda size => %lu\n"), QSE_LDA_SIZE(s1)); - qse_lda_walk (s1, walker1, QSE_NULL); - qse_printf (QSE_T("lda size => %lu\n"), QSE_LDA_SIZE(s1)); - qse_lda_rwalk (s1, rwalker1, QSE_NULL); - -qse_lda_setcapa (s1, 3); - - qse_lda_close (s1); - return 0; -} - -static int test2 () -{ - qse_lda_t* s1; - qse_lda_slot_t* p; - const qse_char_t* x[] = - { - QSE_T("this is so good"), - QSE_T("what the fuck"), - QSE_T("do you like it?"), - QSE_T("oopsy!"), - QSE_T("hello hello!"), - QSE_T("oopsy!") - }; - const qse_char_t* y[] = - { - QSE_T("tipsy!"), - QSE_T("oopsy!") - }; - int i, j; - - s1 = qse_lda_open (QSE_MMGR_GETDFL(), 0, 0); - if (s1 == QSE_NULL) - { - qse_printf (QSE_T("cannot open a string\n")); - return -1; - } - - qse_lda_setcopier (s1, QSE_LDA_COPIER_INLINE); - qse_lda_setscale (s1, QSE_SIZEOF(qse_char_t)); - - for (j = 0; j < 20; j++) - { - qse_size_t index; - for (i = 0; i < QSE_COUNTOF(x); i++) - { - if (qse_lda_insert (s1, (i + 1) * j - 1, x[i], qse_strlen(x[i])) == QSE_LDA_NIL) - { - - qse_printf (QSE_T("failed to add at %u => [%.*s]\n"), - (unsigned int)((i + 1) * j - 1), - (int)qse_strlen(x[i]), x[i]); - } - else - { - qse_printf (QSE_T("add at %u => [%.*s]\n"), - (unsigned int)((i + 1) * j - 1), - (int)qse_strlen(x[i]), x[i]); - } - } - - for (i = 0; i < QSE_LDA_SIZE(s1); i++) - { - if (QSE_LDA_SLOT(s1,i)) - { - qse_printf (QSE_T("[%d] %d => [%.*s]\n"), - j, i, (int)QSE_LDA_DLEN(s1,i), QSE_LDA_DPTR(s1,i)); - } - } - - - for (i = 0; i < QSE_COUNTOF(y); i++) - { - index = qse_lda_search (s1, 0, y[i], qse_strlen(y[i])); - if (index == QSE_LDA_NIL) - { - qse_printf (QSE_T("failed to find [%s]\n"), y[i]); - } - else - { - qse_printf (QSE_T("found [%.*s] at %lu\n"), - (int)QSE_LDA_DLEN(s1,index), QSE_LDA_DPTR(s1,index), (unsigned long)index); - } - - index = qse_lda_rsearch (s1, QSE_LDA_SIZE(s1), y[i], qse_strlen(y[i])); - if (index == QSE_LDA_NIL) - { - qse_printf (QSE_T("failed to find [%s]\n"), y[i]); - } - else - { - qse_printf (QSE_T("found [%.*s] at %lu\n"), - (int)QSE_LDA_DLEN(s1,index), QSE_LDA_DPTR(s1,index), (unsigned long)index); - } - } - - - qse_lda_clear (s1); - qse_printf (QSE_T("~~~~~~~~\n")); - } - - qse_lda_close (s1); - return 0; -} - -static int test3 () -{ - qse_lda_t* s1; - const qse_char_t* x[] = - { - QSE_T("this is so good"), - QSE_T("what the fuck"), - QSE_T("do you like it?"), - QSE_T("oopsy!") - }; - const qse_char_t* y = - QSE_T("We Accept MasterCard, VISA, JCB, Dinner & eCheck"); - int i, j; - - s1 = qse_lda_open (QSE_MMGR_GETDFL(), 0, 0); - if (s1 == QSE_NULL) - { - qse_printf (QSE_T("cannot open a string\n")); - return -1; - } - - qse_lda_setcopier (s1, QSE_LDA_COPIER_INLINE); - qse_lda_setscale (s1, QSE_SIZEOF(qse_char_t)); - - for (j = 0; j < 20; j++) - { - for (i = 0; i < QSE_COUNTOF(x); i++) - { - if (qse_lda_insert (s1, (i + 1) * j - 1, x[i], qse_strlen(x[i])) == QSE_LDA_NIL) - { - - qse_printf (QSE_T("failed to add at %u => [%.*s]\n"), - (unsigned int)((i + 1) * j - 1), - (int)qse_strlen(x[i]), x[i]); - } - else - { - qse_printf (QSE_T("add at %u => [%.*s]\n"), - (unsigned int)((i + 1) * j - 1), - (int)qse_strlen(x[i]), x[i]); - } - } - - - for (i = 2; i < 3; i++) - { - if (i < QSE_LDA_SIZE(s1)) - { - if (QSE_LDA_SLOT(s1,i)) - { - qse_printf (QSE_T("deleted at %d => [%.*s]\n"), - i, (int)QSE_LDA_DLEN(s1,i), QSE_LDA_DPTR(s1,i)); - } - - qse_lda_delete (s1, i, 1); - } - - if (i < QSE_LDA_SIZE(s1)) - { - if (qse_lda_update (s1, i, y, qse_strlen(y)) == QSE_LDA_NIL) - { - qse_printf (QSE_T("failed to update at %d => [%.*s]\n"), - i, (int)qse_strlen(y), y); - } - else - { - qse_printf (QSE_T("updated at %d => [%.*s]\n"), - i, (int)QSE_LDA_DLEN(s1,i), QSE_LDA_DPTR(s1,i)); - } - } - - } - - qse_printf (QSE_T("array size => %lu\n"), (unsigned long)QSE_LDA_SIZE(s1)); - - for (i = 0; i < QSE_LDA_SIZE(s1); i++) - { - if (QSE_LDA_SLOT(s1,i)) - { - qse_printf (QSE_T("[%d] %d => [%.*s]\n"), - j, i, (int)QSE_LDA_DLEN(s1,i), QSE_LDA_DPTR(s1,i)); - } - } - - { - qse_size_t count = qse_lda_uplete (s1, 3, 20); - qse_printf (QSE_T("upleted %lu items from index 3\n"), (unsigned long)count); - } - - qse_printf (QSE_T("array size => %lu\n"), (unsigned long)QSE_LDA_SIZE(s1)); - - for (i = 0; i < QSE_LDA_SIZE(s1); i++) - { - if (QSE_LDA_SLOT(s1,i)) - { - qse_printf (QSE_T("[%d] %d => [%.*s]\n"), - j, i, (int)QSE_LDA_DLEN(s1,i), QSE_LDA_DPTR(s1,i)); - } - } - - qse_lda_clear (s1); - qse_printf (QSE_T("~~~~~~~~\n")); - } - - qse_lda_close (s1); - return 0; -} - -qse_size_t sizer1 (qse_lda_t* lda, qse_size_t hint) -{ - return 2; -} - -static int test4 () -{ - int i; - qse_lda_t* s1; - const qse_char_t* x[] = - { - QSE_T("this is so good"), - QSE_T("what the fuck"), - QSE_T("do you like it?"), - QSE_T("oopsy!") - }; - - s1 = qse_lda_open (QSE_MMGR_GETDFL(), 0, 3); - if (s1 == QSE_NULL) - { - qse_printf (QSE_T("cannot open an array\n")); - return -1; - } - - qse_lda_setcopier (s1, QSE_LDA_COPIER_INLINE); - qse_lda_setsizer (s1, sizer1); - qse_lda_setscale (s1, QSE_SIZEOF(qse_char_t)); - - for (i = 0; i < QSE_COUNTOF(x); i++) - { - if (qse_lda_insert (s1, 0, x[i], qse_strlen(x[i])) == QSE_LDA_NIL) - { - qse_printf (QSE_T("failed to add at 0 => [%.*s]\n"), - (int)qse_strlen(x[i]), x[i]); - } - else - { - qse_printf (QSE_T("add at 0 => [%.*s]\n"), - (int)qse_strlen(x[i]), x[i]); - } - } - - qse_printf (QSE_T("lda size => %lu\n"), QSE_LDA_SIZE(s1)); - qse_lda_walk (s1, walker1, QSE_NULL); - qse_printf (QSE_T("lda size => %lu\n"), QSE_LDA_SIZE(s1)); - qse_lda_rwalk (s1, rwalker1, QSE_NULL); - - qse_lda_close (s1); - return 0; -} - - -qse_lda_comper_t default_comparator; - -static int inverse_comparator (qse_lda_t* lda, - const void* dptr1, size_t dlen1, - const void* dptr2, size_t dlen2) -{ - return -default_comparator (lda, dptr1, dlen1, dptr2, dlen2); -} - -static int test5 () -{ - qse_lda_t* s1; - int i, j; - - s1 = qse_lda_open (QSE_MMGR_GETDFL(), 0, 3); - if (s1 == QSE_NULL) - { - qse_printf (QSE_T("cannot open an array\n")); - return -1; - } - - qse_lda_setcopier (s1, QSE_LDA_COPIER_INLINE); - qse_lda_setscale (s1, QSE_SIZEOF(i)); - - /* inverse the comparator to implement min-heap */ - default_comparator = qse_lda_getcomper (s1); - qse_lda_setcomper (s1, inverse_comparator); - - for (i = 0; i < 25; i++) - { - j = rand () % 100; - qse_lda_pushheap (s1, &j, 1); - } - - qse_printf (QSE_T("lda size => %lu\n"), QSE_LDA_SIZE(s1)); - qse_lda_walk (s1, walker3, QSE_NULL); - - while (QSE_LDA_SIZE(s1) > 10 ) - { - qse_printf (QSE_T("top => %d\n"), *(int*)QSE_LDA_DPTR(s1,0)); - qse_lda_popheap (s1); - } - - for (i = 0; i < 25; i++) - { - j = rand () % 100; - qse_lda_pushheap (s1, &j, 1); - } - - qse_printf (QSE_T("lda size => %lu\n"), QSE_LDA_SIZE(s1)); - qse_lda_walk (s1, walker3, QSE_NULL); - - while (QSE_LDA_SIZE(s1)) - { - qse_printf (QSE_T("top => %d\n"), *(int*)QSE_LDA_DPTR(s1,0)); - qse_lda_popheap (s1); - } - - qse_lda_setcomper (s1, default_comparator); - for (i = 0; i < 25; i++) - { - j = rand () % 100; - qse_lda_pushheap (s1, &j, 1); - } - - qse_printf (QSE_T("lda size => %lu\n"), QSE_LDA_SIZE(s1)); - qse_lda_walk (s1, walker3, QSE_NULL); - - while (QSE_LDA_SIZE(s1)) - { - qse_printf (QSE_T("top => %d\n"), *(int*)QSE_LDA_DPTR(s1,0)); - qse_lda_popheap (s1); - } - - - qse_lda_close (s1); - return 0; -} - -int main () -{ - qse_openstdsios (); - R (test1); - R (test2); - R (test3); - R (test4); - R (test5); - qse_closestdsios (); - return 0; -}