renamed qse_lda_t to qse_arr_t

This commit is contained in:
hyung-hwan 2016-09-23 14:53:51 +00:00
parent dfdc6ae045
commit 7f24950536
19 changed files with 1777 additions and 1777 deletions

View File

@ -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 \

View File

@ -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)

View File

@ -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)

View File

@ -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;

View File

@ -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);

View File

@ -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 ();
}

View File

@ -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 \

View File

@ -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
View 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;
}
}

View File

@ -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;
}
}

View File

@ -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 (

View File

@ -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

View File

@ -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

View File

@ -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
View 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;
}

View File

@ -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;
}

View File

@ -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
View 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;
}

View File

@ -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;
}