renamed qse_lda_t to qse_arr_t
This commit is contained in:
parent
dfdc6ae045
commit
7f24950536
@ -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 \
|
||||
|
@ -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)
|
||||
|
@ -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 <qse/types.h>
|
||||
#include <qse/macros.h>
|
||||
@ -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)
|
@ -31,7 +31,7 @@
|
||||
#include <qse/cmn/chr.h>
|
||||
#include <qse/cmn/str.h>
|
||||
#include <qse/cmn/htb.h>
|
||||
#include <qse/cmn/lda.h>
|
||||
#include <qse/cmn/arr.h>
|
||||
#include <qse/cmn/rex.h>
|
||||
#include <qse/cmn/rbt.h>
|
||||
|
||||
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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 ();
|
||||
}
|
||||
|
@ -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 \
|
||||
|
@ -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@
|
||||
|
700
qse/lib/cmn/arr.c
Normal file
700
qse/lib/cmn/arr.c
Normal file
@ -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 <qse/cmn/arr.h>
|
||||
#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;
|
||||
}
|
||||
}
|
@ -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 <qse/cmn/lda.h>
|
||||
#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;
|
||||
}
|
||||
}
|
@ -27,7 +27,7 @@
|
||||
#include <qse/cmn/rex.h>
|
||||
#include <qse/cmn/chr.h>
|
||||
#include <qse/cmn/str.h>
|
||||
#include <qse/cmn/lda.h>
|
||||
#include <qse/cmn/arr.h>
|
||||
#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 (
|
||||
|
@ -28,7 +28,7 @@
|
||||
#include <qse/cmn/str.h>
|
||||
#include <qse/cmn/mbwc.h>
|
||||
#include <qse/cmn/path.h>
|
||||
#include <qse/cmn/lda.h>
|
||||
#include <qse/cmn/arr.h>
|
||||
#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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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@
|
||||
|
462
qse/samples/cmn/arr01.c
Normal file
462
qse/samples/cmn/arr01.c
Normal file
@ -0,0 +1,462 @@
|
||||
#include <qse/cmn/mem.h>
|
||||
#include <qse/cmn/str.h>
|
||||
#include <qse/cmn/arr.h>
|
||||
#include <qse/si/sio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
#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;
|
||||
}
|
@ -1,148 +0,0 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <qse/cmn/Array.hpp>
|
||||
#include <qse/cmn/String.hpp>
|
||||
|
||||
/*
|
||||
typedef QSE::Array<int,int> 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<PosStr> 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<int> 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;
|
||||
}
|
@ -4,105 +4,145 @@
|
||||
#include <qse/cmn/Array.hpp>
|
||||
#include <qse/cmn/String.hpp>
|
||||
|
||||
class Julia
|
||||
/*
|
||||
typedef QSE::Array<int,int> 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<Julia> 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<PosStr> 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<int> 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;
|
||||
}
|
||||
|
108
qse/samples/cmn/arr03.cpp
Normal file
108
qse/samples/cmn/arr03.cpp
Normal file
@ -0,0 +1,108 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <qse/cmn/Array.hpp>
|
||||
#include <qse/cmn/String.hpp>
|
||||
|
||||
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<Julia> 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;
|
||||
}
|
@ -1,462 +0,0 @@
|
||||
#include <qse/cmn/mem.h>
|
||||
#include <qse/cmn/str.h>
|
||||
#include <qse/cmn/lda.h>
|
||||
#include <qse/si/sio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
#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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user