fixed bugs in ase_lda_t & replaced ase_awk_tab_t with ase_lda_t
This commit is contained in:
		| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: awk.c 391 2008-09-27 09:51:23Z baconevi $  | ||||
|  * $Id: awk.c 415 2008-10-10 11:16:31Z baconevi $  | ||||
|  * | ||||
|  * {License} | ||||
|  */ | ||||
| @ -61,19 +61,11 @@ ase_awk_t* ase_awk_open (ase_mmgr_t* mmgr, ase_size_t ext) | ||||
| 	ASE_MEMSET (awk, 0, ASE_SIZEOF(ase_awk_t) + ext); | ||||
| 	awk->mmgr = mmgr; | ||||
|  | ||||
| 	if (ase_str_init (&awk->token.name, mmgr, 128) == ASE_NULL)  | ||||
| 	{ | ||||
| 		ASE_AWK_FREE (awk, awk); | ||||
| 		return ASE_NULL;	 | ||||
| 	} | ||||
| 	awk->token.name = ase_str_open (mmgr, 0, 128); | ||||
| 	if (awk->token.name == ASE_NULL) goto oops; | ||||
|  | ||||
| 	awk->wtab = ase_map_open (mmgr, ASE_SIZEOF(awk), 512, 70); | ||||
| 	if (awk->wtab == ASE_NULL) | ||||
| 	{ | ||||
| 		ase_str_close (&awk->token.name); | ||||
| 		ASE_AWK_FREE (awk, awk); | ||||
| 		return ASE_NULL;	 | ||||
| 	} | ||||
| 	if (awk->wtab == ASE_NULL) goto oops; | ||||
| 	*(ase_awk_t**)ASE_MAP_EXTENSION(awk->wtab) = awk; | ||||
| 	ase_map_setcopier (awk->wtab, ASE_MAP_KEY, ASE_MAP_COPIER_INLINE); | ||||
| 	ase_map_setcopier (awk->wtab, ASE_MAP_VAL, ASE_MAP_COPIER_INLINE); | ||||
| @ -81,13 +73,7 @@ ase_awk_t* ase_awk_open (ase_mmgr_t* mmgr, ase_size_t ext) | ||||
| 	ase_map_setscale (awk->wtab, ASE_MAP_VAL, ASE_SIZEOF(ase_char_t)); | ||||
|  | ||||
| 	awk->rwtab = ase_map_open (mmgr, ASE_SIZEOF(awk), 512, 70); | ||||
| 	if (awk->rwtab == ASE_NULL) | ||||
| 	{ | ||||
| 		ase_map_close (awk->wtab); | ||||
| 		ase_str_fini (&awk->token.name); | ||||
| 		ASE_AWK_FREE (awk, awk); | ||||
| 		return ASE_NULL;	 | ||||
| 	} | ||||
| 	if (awk->rwtab == ASE_NULL) goto oops; | ||||
| 	*(ase_awk_t**)ASE_MAP_EXTENSION(awk->rwtab) = awk; | ||||
| 	ase_map_setcopier (awk->rwtab, ASE_MAP_KEY, ASE_MAP_COPIER_INLINE); | ||||
| 	ase_map_setcopier (awk->rwtab, ASE_MAP_VAL, ASE_MAP_COPIER_INLINE); | ||||
| @ -96,88 +82,45 @@ ase_awk_t* ase_awk_open (ase_mmgr_t* mmgr, ase_size_t ext) | ||||
|  | ||||
| 	/* TODO: initial map size?? */ | ||||
| 	awk->tree.afns = ase_map_open (mmgr, ASE_SIZEOF(awk), 512, 70); | ||||
| 	if (awk->tree.afns == ASE_NULL)  | ||||
| 	{ | ||||
| 		ase_map_close (awk->rwtab); | ||||
| 		ase_map_close (awk->wtab); | ||||
| 		ase_str_fini (&awk->token.name); | ||||
| 		ASE_AWK_FREE (awk, awk); | ||||
| 		return ASE_NULL;	 | ||||
| 	} | ||||
| 	if (awk->tree.afns == ASE_NULL) goto oops; | ||||
| 	*(ase_awk_t**)ASE_MAP_EXTENSION(awk->tree.afns) = awk; | ||||
| 	ase_map_setcopier (awk->tree.afns, ASE_MAP_KEY, ASE_MAP_COPIER_INLINE); | ||||
| 	ase_map_setfreeer (awk->tree.afns, ASE_MAP_VAL, free_afn); | ||||
| 	ase_map_setscale (awk->tree.afns, ASE_MAP_KEY, ASE_SIZEOF(ase_char_t)); | ||||
|  | ||||
| 	awk->parse.afns = ase_map_open (mmgr, ASE_SIZEOF(awk), 256, 70); | ||||
| 	if (awk->parse.afns == ASE_NULL) | ||||
| 	{ | ||||
| 		ase_map_close (awk->tree.afns); | ||||
| 		ase_map_close (awk->rwtab); | ||||
| 		ase_map_close (awk->wtab); | ||||
| 		ase_str_fini (&awk->token.name); | ||||
| 		ASE_AWK_FREE (awk, awk); | ||||
| 		return ASE_NULL;	 | ||||
| 	} | ||||
| 	if (awk->parse.afns == ASE_NULL) goto oops; | ||||
| 	*(ase_awk_t**)ASE_MAP_EXTENSION(awk->parse.afns) = awk; | ||||
| 	ase_map_setcopier (awk->parse.afns, ASE_MAP_KEY, ASE_MAP_COPIER_INLINE); | ||||
| 	ase_map_setcopier (awk->parse.afns, ASE_MAP_VAL, ASE_MAP_COPIER_INLINE); | ||||
| 	ase_map_setscale (awk->parse.afns, ASE_MAP_KEY, ASE_SIZEOF(ase_char_t)); | ||||
|  | ||||
| 	awk->parse.named = ase_map_open (mmgr, ASE_SIZEOF(awk), 256, 70); | ||||
| 	if (awk->parse.named == ASE_NULL) | ||||
| 	{ | ||||
| 		ase_map_close (awk->parse.afns); | ||||
| 		ase_map_close (awk->tree.afns); | ||||
| 		ase_map_close (awk->rwtab); | ||||
| 		ase_map_close (awk->wtab); | ||||
| 		ase_str_fini (&awk->token.name); | ||||
| 		ASE_AWK_FREE (awk, awk); | ||||
| 		return ASE_NULL;	 | ||||
| 	} | ||||
| 	if (awk->parse.named == ASE_NULL) goto oops; | ||||
| 	*(ase_awk_t**)ASE_MAP_EXTENSION(awk->parse.named) = awk; | ||||
| 	ase_map_setcopier (awk->parse.named, ASE_MAP_KEY, ASE_MAP_COPIER_INLINE); | ||||
| 	ase_map_setcopier (awk->parse.named, ASE_MAP_VAL, ASE_MAP_COPIER_INLINE); | ||||
| 	ase_map_setscale (awk->parse.named, ASE_MAP_KEY, ASE_SIZEOF(ase_char_t)); | ||||
|  | ||||
| 	if (ase_awk_tab_open (&awk->parse.globals, awk) == ASE_NULL)  | ||||
| 	{ | ||||
| 		ase_map_close (awk->parse.named); | ||||
| 		ase_map_close (awk->parse.afns); | ||||
| 		ase_map_close (awk->tree.afns); | ||||
| 		ase_map_close (awk->rwtab); | ||||
| 		ase_map_close (awk->wtab); | ||||
| 		ase_str_fini (&awk->token.name); | ||||
| 		ASE_AWK_FREE (awk, awk); | ||||
| 		return ASE_NULL;	 | ||||
| 	} | ||||
| 	awk->parse.globals = ase_lda_open (mmgr, ASE_SIZEOF(awk), 128); | ||||
| 	awk->parse.locals = ase_lda_open (mmgr, ASE_SIZEOF(awk), 64); | ||||
| 	awk->parse.params = ase_lda_open (mmgr, ASE_SIZEOF(awk), 32); | ||||
|  | ||||
| 	if (ase_awk_tab_open (&awk->parse.locals, awk) == ASE_NULL)  | ||||
| 	{ | ||||
| 		ase_awk_tab_close (&awk->parse.globals); | ||||
| 		ase_map_close (awk->parse.named); | ||||
| 		ase_map_close (awk->parse.afns); | ||||
| 		ase_map_close (awk->tree.afns); | ||||
| 		ase_map_close (awk->rwtab); | ||||
| 		ase_map_close (awk->wtab); | ||||
| 		ase_str_fini (&awk->token.name); | ||||
| 		ASE_AWK_FREE (awk, awk); | ||||
| 		return ASE_NULL;	 | ||||
| 	} | ||||
| 	if (awk->parse.globals == ASE_NULL || | ||||
| 	    awk->parse.locals == ASE_NULL || | ||||
| 	    awk->parse.params == ASE_NULL) goto oops; | ||||
|  | ||||
| 	if (ase_awk_tab_open (&awk->parse.params, awk) == ASE_NULL)  | ||||
| 	{ | ||||
| 		ase_awk_tab_close (&awk->parse.locals); | ||||
| 		ase_awk_tab_close (&awk->parse.globals); | ||||
| 		ase_map_close (awk->parse.named); | ||||
| 		ase_map_close (awk->parse.afns); | ||||
| 		ase_map_close (awk->tree.afns); | ||||
| 		ase_map_close (awk->rwtab); | ||||
| 		ase_map_close (awk->wtab); | ||||
| 		ase_str_fini (&awk->token.name); | ||||
| 		ASE_AWK_FREE (awk, awk); | ||||
| 		return ASE_NULL;	 | ||||
| 	} | ||||
| 	*(ase_awk_t**)ASE_LDA_EXTENSION(awk->parse.globals) = awk; | ||||
| 	ase_lda_setcopier (awk->parse.globals, ASE_LDA_COPIER_INLINE); | ||||
| 	ase_lda_setscale (awk->parse.globals, ASE_SIZEOF(ase_char_t)); | ||||
|  | ||||
| 	*(ase_awk_t**)ASE_LDA_EXTENSION(awk->parse.locals) = awk; | ||||
| 	ase_lda_setcopier (awk->parse.locals, ASE_LDA_COPIER_INLINE); | ||||
| 	ase_lda_setscale (awk->parse.locals, ASE_SIZEOF(ase_char_t)); | ||||
|  | ||||
| 	*(ase_awk_t**)ASE_LDA_EXTENSION(awk->parse.params) = awk; | ||||
| 	ase_lda_setcopier (awk->parse.params, ASE_LDA_COPIER_INLINE); | ||||
| 	ase_lda_setscale (awk->parse.params, ASE_SIZEOF(ase_char_t)); | ||||
|  | ||||
| 	awk->option = 0; | ||||
| 	awk->errnum = ASE_AWK_ENOERR; | ||||
| @ -211,22 +154,8 @@ ase_awk_t* ase_awk_open (ase_mmgr_t* mmgr, ase_size_t ext) | ||||
| 	awk->src.shared.buf_len = 0; | ||||
|  | ||||
| 	awk->bfn.sys = ASE_NULL; | ||||
| 	/*awk->bfn.user = ASE_NULL;*/ | ||||
| 	awk->bfn.user = ase_map_open (mmgr, ASE_SIZEOF(awk), 512, 70); | ||||
| 	if (awk->bfn.user == ASE_NULL) | ||||
| 	{ | ||||
| 		ase_awk_tab_close (&awk->parse.params); | ||||
| 		ase_awk_tab_close (&awk->parse.locals); | ||||
| 		ase_awk_tab_close (&awk->parse.globals); | ||||
| 		ase_map_close (awk->parse.named); | ||||
| 		ase_map_close (awk->parse.afns); | ||||
| 		ase_map_close (awk->tree.afns); | ||||
| 		ase_map_close (awk->rwtab); | ||||
| 		ase_map_close (awk->wtab); | ||||
| 		ase_str_fini (&awk->token.name); | ||||
| 		ASE_AWK_FREE (awk, awk); | ||||
| 		return ASE_NULL;	 | ||||
| 	} | ||||
| 	if (awk->bfn.user == ASE_NULL) goto oops; | ||||
| 	*(ase_awk_t**)ASE_MAP_EXTENSION(awk->bfn.user) = awk; | ||||
| 	ase_map_setcopier (awk->bfn.user, ASE_MAP_KEY, ASE_MAP_COPIER_INLINE); | ||||
| 	ase_map_setfreeer (awk->bfn.user, ASE_MAP_VAL, free_bfn);  | ||||
| @ -245,23 +174,25 @@ ase_awk_t* ase_awk_open (ase_mmgr_t* mmgr, ase_size_t ext) | ||||
|  | ||||
| 	awk->assoc_data = ASE_NULL; | ||||
|  | ||||
| 	if (ase_awk_initglobals (awk) == -1) | ||||
| 	{ | ||||
| 		ase_map_close (awk->bfn.user); | ||||
| 		ase_awk_tab_close (&awk->parse.params); | ||||
| 		ase_awk_tab_close (&awk->parse.locals); | ||||
| 		ase_awk_tab_close (&awk->parse.globals); | ||||
| 		ase_map_close (awk->parse.named); | ||||
| 		ase_map_close (awk->parse.afns); | ||||
| 		ase_map_close (awk->tree.afns); | ||||
| 		ase_map_close (awk->rwtab); | ||||
| 		ase_map_close (awk->wtab); | ||||
| 		ase_str_fini (&awk->token.name); | ||||
| 		ASE_AWK_FREE (awk, awk); | ||||
| 		return ASE_NULL;	 | ||||
| 	} | ||||
| 	if (ase_awk_initglobals (awk) == -1) goto oops; | ||||
|  | ||||
| 	return awk; | ||||
|  | ||||
|  | ||||
| oops: | ||||
| 	if (awk->bfn.user) ase_map_close (awk->bfn.user); | ||||
| 	if (awk->parse.params) ase_lda_close (awk->parse.params); | ||||
| 	if (awk->parse.locals) ase_lda_close (awk->parse.locals); | ||||
| 	if (awk->parse.globals) ase_lda_close (awk->parse.globals); | ||||
| 	if (awk->parse.named) ase_map_close (awk->parse.named); | ||||
| 	if (awk->parse.afns) ase_map_close (awk->parse.afns); | ||||
| 	if (awk->tree.afns) ase_map_close (awk->tree.afns); | ||||
| 	if (awk->rwtab) ase_map_close (awk->rwtab); | ||||
| 	if (awk->wtab) ase_map_close (awk->wtab); | ||||
| 	if (awk->token.name) ase_str_close (awk->token.name); | ||||
| 	ASE_AWK_FREE (awk, awk); | ||||
|  | ||||
| 	return ASE_NULL; | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -273,9 +204,9 @@ int ase_awk_close (ase_awk_t* awk) | ||||
| 	/*ase_awk_clrbfn (awk);*/ | ||||
| 	ase_map_close (awk->bfn.user); | ||||
|  | ||||
| 	ase_awk_tab_close (&awk->parse.params); | ||||
| 	ase_awk_tab_close (&awk->parse.locals); | ||||
| 	ase_awk_tab_close (&awk->parse.globals); | ||||
| 	ase_lda_close (awk->parse.params); | ||||
| 	ase_lda_close (awk->parse.locals); | ||||
| 	ase_lda_close (awk->parse.globals); | ||||
| 	ase_map_close (awk->parse.named); | ||||
| 	ase_map_close (awk->parse.afns); | ||||
|  | ||||
| @ -283,7 +214,7 @@ int ase_awk_close (ase_awk_t* awk) | ||||
| 	ase_map_close (awk->rwtab); | ||||
| 	ase_map_close (awk->wtab); | ||||
|  | ||||
| 	ase_str_fini (&awk->token.name); | ||||
| 	ase_str_close (awk->token.name); | ||||
|  | ||||
| 	for (i = 0; i < ASE_COUNTOF(awk->errstr); i++) | ||||
| 	{ | ||||
| @ -312,14 +243,14 @@ int ase_awk_clear (ase_awk_t* awk) | ||||
| 	awk->src.shared.buf_pos = 0; | ||||
| 	awk->src.shared.buf_len = 0; | ||||
|  | ||||
| 	/*ase_awk_tab_clear (&awk->parse.globals);*/ | ||||
| 	ASE_ASSERT (awk->parse.globals.size == awk->tree.nglobals); | ||||
| 	ase_awk_tab_remove ( | ||||
| 		&awk->parse.globals, awk->tree.nbglobals,  | ||||
| 		awk->parse.globals.size - awk->tree.nbglobals); | ||||
| 	ASE_ASSERT (ASE_LDA_SIZE(awk->parse.globals) == awk->tree.nglobals); | ||||
| 	/* delete all non-builtin global variables */ | ||||
| 	ase_lda_delete ( | ||||
| 		awk->parse.globals, awk->tree.nbglobals,  | ||||
| 		ASE_LDA_SIZE(awk->parse.globals) - awk->tree.nbglobals); | ||||
|  | ||||
| 	ase_awk_tab_clear (&awk->parse.locals); | ||||
| 	ase_awk_tab_clear (&awk->parse.params); | ||||
| 	ase_lda_clear (awk->parse.locals); | ||||
| 	ase_lda_clear (awk->parse.params); | ||||
| 	ase_map_clear (awk->parse.named); | ||||
| 	ase_map_clear (awk->parse.afns); | ||||
|  | ||||
|  | ||||
| @ -11,6 +11,7 @@ | ||||
| #include "../cmn/chr.h" | ||||
| #include <ase/cmn/str.h> | ||||
| #include <ase/cmn/map.h> | ||||
| #include <ase/cmn/lda.h> | ||||
| #include <ase/cmn/rex.h> | ||||
|  | ||||
| typedef struct ase_awk_chain_t ase_awk_chain_t; | ||||
| @ -19,7 +20,6 @@ typedef struct ase_awk_tree_t ase_awk_tree_t; | ||||
| #include <ase/awk/awk.h> | ||||
| #include "tree.h" | ||||
| #include "func.h" | ||||
| #include "tab.h" | ||||
| #include "parse.h" | ||||
| #include "run.h" | ||||
| #include "extio.h" | ||||
| @ -130,13 +130,13 @@ struct ase_awk_t | ||||
| 		ase_map_t* named; | ||||
|  | ||||
| 		/* global variables */ | ||||
| 		ase_awk_tab_t globals; | ||||
| 		ase_lda_t* globals; | ||||
|  | ||||
| 		/* local variables */ | ||||
| 		ase_awk_tab_t locals; | ||||
| 		ase_lda_t* locals; | ||||
|  | ||||
| 		/* parameters to a function */ | ||||
| 		ase_awk_tab_t params; | ||||
| 		ase_lda_t* params; | ||||
|  | ||||
| 		/* maximum number of local variables */ | ||||
| 		ase_size_t nlocals_max; | ||||
| @ -182,7 +182,7 @@ struct ase_awk_t | ||||
| 		} prev; | ||||
|  | ||||
| 		int        type; | ||||
| 		ase_str_t  name; | ||||
| 		ase_str_t* name; | ||||
| 		ase_size_t line; | ||||
| 		ase_size_t column; | ||||
| 	} token; | ||||
|  | ||||
| @ -4,7 +4,7 @@ AUTOMAKE_OPTIONS = nostdinc | ||||
| AM_CPPFLAGS = -I$(top_srcdir)/include | ||||
|  | ||||
| lib_LTLIBRARIES = libaseawk.la | ||||
| libaseawk_la_SOURCES = awk.c err.c tree.c tab.c parse.c run.c rec.c val.c func.c misc.c extio.c std.c awk_i.h extio.h func.h misc.h parse.h run.h tab.h tree.h  | ||||
| libaseawk_la_SOURCES = awk.c err.c tree.c parse.c run.c rec.c val.c func.c misc.c extio.c std.c awk_i.h extio.h func.h misc.h parse.h run.h tree.h  | ||||
| libaseawk_la_LDFLAGS= -L../cmn -version-info 1:0:0 | ||||
| libaseawk_la_LIBADD= -lasecmn | ||||
|  | ||||
|  | ||||
| @ -63,7 +63,7 @@ am__libaseawk___la_SOURCES_DIST = Awk.cpp StdAwk.cpp | ||||
| libaseawk___la_OBJECTS = $(am_libaseawk___la_OBJECTS) | ||||
| @ENABLE_CXX_TRUE@am_libaseawk___la_rpath = -rpath $(libdir) | ||||
| libaseawk_la_DEPENDENCIES = | ||||
| am_libaseawk_la_OBJECTS = awk.lo err.lo tree.lo tab.lo parse.lo run.lo \ | ||||
| am_libaseawk_la_OBJECTS = awk.lo err.lo tree.lo parse.lo run.lo \ | ||||
| 	rec.lo val.lo func.lo misc.lo extio.lo std.lo | ||||
| libaseawk_la_OBJECTS = $(am_libaseawk_la_OBJECTS) | ||||
| DEFAULT_INCLUDES =  | ||||
| @ -210,7 +210,7 @@ target_alias = @target_alias@ | ||||
| AUTOMAKE_OPTIONS = nostdinc | ||||
| AM_CPPFLAGS = -I$(top_srcdir)/include | ||||
| lib_LTLIBRARIES = libaseawk.la $(am__append_1) | ||||
| libaseawk_la_SOURCES = awk.c err.c tree.c tab.c parse.c run.c rec.c val.c func.c misc.c extio.c std.c awk_i.h extio.h func.h misc.h parse.h run.h tab.h tree.h  | ||||
| libaseawk_la_SOURCES = awk.c err.c tree.c parse.c run.c rec.c val.c func.c misc.c extio.c std.c awk_i.h extio.h func.h misc.h parse.h run.h tree.h  | ||||
| libaseawk_la_LDFLAGS = -L../cmn -version-info 1:0:0 | ||||
| libaseawk_la_LIBADD = -lasecmn | ||||
| @ENABLE_CXX_TRUE@libaseawk___la_SOURCES = Awk.cpp StdAwk.cpp | ||||
| @ -298,7 +298,6 @@ distclean-compile: | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rec.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/std.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tab.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tree.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/val.Plo@am__quote@ | ||||
|  | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: parse.c 391 2008-09-27 09:51:23Z baconevi $ | ||||
|  * $Id: parse.c 415 2008-10-10 11:16:31Z baconevi $ | ||||
|  * | ||||
|  * {License} | ||||
|  */ | ||||
| @ -350,7 +350,7 @@ static global_t gtab[] = | ||||
|  | ||||
| #define ADD_TOKEN_CHAR(awk,c) \ | ||||
| 	do { \ | ||||
| 		if (ase_str_ccat(&(awk)->token.name,(c)) == (ase_size_t)-1) \ | ||||
| 		if (ase_str_ccat((awk)->token.name,(c)) == (ase_size_t)-1) \ | ||||
| 		{ \ | ||||
| 			ase_awk_seterror (awk, ASE_AWK_ENOMEM, (awk)->token.line, ASE_NULL, 0); \ | ||||
| 			return -1; \ | ||||
| @ -359,7 +359,7 @@ static global_t gtab[] = | ||||
|  | ||||
| #define ADD_TOKEN_STR(awk,s,l) \ | ||||
| 	do { \ | ||||
| 		if (ase_str_ncat(&(awk)->token.name,(s),(l)) == (ase_size_t)-1) \ | ||||
| 		if (ase_str_ncat((awk)->token.name,(s),(l)) == (ase_size_t)-1) \ | ||||
| 		{ \ | ||||
| 			ase_awk_seterror (awk, ASE_AWK_ENOMEM, (awk)->token.line, ASE_NULL, 0); \ | ||||
| 			return -1; \ | ||||
| @ -375,8 +375,8 @@ static global_t gtab[] = | ||||
| #define SETERRTOK(awk,code) \ | ||||
| 	do { \ | ||||
| 		ase_cstr_t errarg; \ | ||||
| 		errarg.len = ASE_STR_LEN(&(awk)->token.name); \ | ||||
| 		errarg.ptr = ASE_STR_PTR(&(awk)->token.name); \ | ||||
| 		errarg.len = ASE_STR_LEN((awk)->token.name); \ | ||||
| 		errarg.ptr = ASE_STR_PTR((awk)->token.name); \ | ||||
| 		if (MATCH(awk,TOKEN_EOF)) \ | ||||
| 			ase_awk_seterror (awk, code, (awk)->token.prev.line, &errarg, 1); \ | ||||
| 		else \ | ||||
| @ -451,10 +451,10 @@ const ase_char_t* ase_awk_getglobalname ( | ||||
| 	return gtab[idx].name; | ||||
| 	*/ | ||||
|  | ||||
| 	ASE_ASSERT (idx < ase_awk_tab_getsize(&awk->parse.globals)); | ||||
| 	ASE_ASSERT (idx < ASE_LDA_SIZE(&awk->parse.globals)); | ||||
|  | ||||
| 	*len = awk->parse.globals.buf[idx].name.len; | ||||
| 	return awk->parse.globals.buf[idx].name.ptr; | ||||
| 	*len = ASE_LDA_DLEN(awk->parse.globals,idx); | ||||
| 	return ASE_LDA_DPTR(awk->parse.globals,idx); | ||||
| } | ||||
|  | ||||
| ase_cstr_t* ase_awk_getkw (ase_awk_t* awk, int id, ase_cstr_t* s) | ||||
| @ -616,13 +616,13 @@ static ase_awk_t* parse_progunit (ase_awk_t* awk) | ||||
|  | ||||
| 		if (get_token(awk) == -1) return ASE_NULL; | ||||
|  | ||||
| 		ASE_ASSERT (awk->tree.nglobals == ase_awk_tab_getsize(&awk->parse.globals)); | ||||
| 		ASE_ASSERT (awk->tree.nglobals == ASE_LDA_SIZE(&awk->parse.globals)); | ||||
| 		nglobals = awk->tree.nglobals; | ||||
| 		if (collect_globals (awk) == ASE_NULL)  | ||||
| 		{ | ||||
| 			ase_awk_tab_remove ( | ||||
| 				&awk->parse.globals, nglobals,  | ||||
| 				ase_awk_tab_getsize(&awk->parse.globals) - nglobals); | ||||
| 			ase_lda_delete ( | ||||
| 				awk->parse.globals, nglobals,  | ||||
| 				ASE_LDA_SIZE(awk->parse.globals) - nglobals); | ||||
| 			awk->tree.nglobals = nglobals; | ||||
| 			return ASE_NULL; | ||||
| 		} | ||||
| @ -838,8 +838,8 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk) | ||||
| 		return ASE_NULL; | ||||
| 	} | ||||
|  | ||||
| 	name = ASE_STR_PTR(&awk->token.name); | ||||
| 	name_len = ASE_STR_LEN(&awk->token.name); | ||||
| 	name = ASE_STR_PTR(awk->token.name); | ||||
| 	name_len = ASE_STR_LEN(awk->token.name); | ||||
|  | ||||
| 	/* check if it is a builtin function */ | ||||
| 	if (ase_awk_getbfn (awk, name, name_len) != ASE_NULL) | ||||
| @ -859,7 +859,7 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk) | ||||
|  | ||||
| 	/* check if it coincides to be a global variable name */ | ||||
| 	g = find_global (awk, name, name_len); | ||||
| 	if (g != (ase_size_t)-1)  | ||||
| 	if (g != ASE_LDA_INVALID) | ||||
| 	{ | ||||
| 		SETERRARG ( | ||||
| 			awk, ASE_AWK_EGBLRED, awk->token.line,  | ||||
| @ -900,7 +900,7 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk) | ||||
| 	} | ||||
|  | ||||
| 	/* make sure that parameter table is empty */ | ||||
| 	ASE_ASSERT (ase_awk_tab_getsize(&awk->parse.params) == 0); | ||||
| 	ASE_ASSERT (ASE_LDA_SIZE(&awk->parse.params) == 0); | ||||
|  | ||||
| 	/* read parameter list */ | ||||
| 	if (MATCH(awk,TOKEN_RPAREN))  | ||||
| @ -922,13 +922,13 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk) | ||||
| 			if (!MATCH(awk,TOKEN_IDENT))  | ||||
| 			{ | ||||
| 				ASE_AWK_FREE (awk, name_dup); | ||||
| 				ase_awk_tab_clear (&awk->parse.params); | ||||
| 				ase_lda_clear (awk->parse.params); | ||||
| 				SETERRTOK (awk, ASE_AWK_EBADPAR); | ||||
| 				return ASE_NULL; | ||||
| 			} | ||||
|  | ||||
| 			param = ASE_STR_PTR(&awk->token.name); | ||||
| 			param_len = ASE_STR_LEN(&awk->token.name); | ||||
| 			param = ASE_STR_PTR(awk->token.name); | ||||
| 			param_len = ASE_STR_LEN(awk->token.name); | ||||
|  | ||||
| 			/* NOTE: the following is not a conflict.  | ||||
| 			 *       so the parameter is not checked against | ||||
| @ -939,12 +939,11 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk) | ||||
| 			 */ | ||||
|  | ||||
| 			/* check if a parameter conflicts with other parameters */ | ||||
| 			if (ase_awk_tab_find ( | ||||
| 				&awk->parse.params,  | ||||
| 				0, param, param_len) != (ase_size_t)-1)  | ||||
| 			if (ase_lda_search (awk->parse.params,  | ||||
| 				0, param, param_len) != ASE_LDA_INVALID) | ||||
| 			{ | ||||
| 				ASE_AWK_FREE (awk, name_dup); | ||||
| 				ase_awk_tab_clear (&awk->parse.params); | ||||
| 				ase_lda_clear (awk->parse.params); | ||||
|  | ||||
| 				SETERRARG ( | ||||
| 					awk, ASE_AWK_EDUPPAR, awk->token.line, | ||||
| @ -954,22 +953,22 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk) | ||||
| 			} | ||||
|  | ||||
| 			/* push the parameter to the parameter list */ | ||||
| 			if (ase_awk_tab_getsize ( | ||||
| 				&awk->parse.params) >= ASE_AWK_MAX_PARAMS) | ||||
| 			if (ASE_LDA_SIZE(awk->parse.params) >= ASE_AWK_MAX_PARAMS) | ||||
| 			{ | ||||
| 				ASE_AWK_FREE (awk, name_dup); | ||||
| 				ase_awk_tab_clear (&awk->parse.params); | ||||
| 				ase_lda_clear (awk->parse.params); | ||||
|  | ||||
| 				SETERRTOK (awk, ASE_AWK_EPARTM); | ||||
| 				return ASE_NULL; | ||||
| 			} | ||||
|  | ||||
| 			if (ase_awk_tab_add ( | ||||
| 				&awk->parse.params,  | ||||
| 				param, param_len) == (ase_size_t)-1)  | ||||
| 			if (ase_lda_insert ( | ||||
| 				awk->parse.params,  | ||||
| 				ASE_LDA_SIZE(awk->parse.params),  | ||||
| 				param, param_len) == ASE_LDA_INVALID) | ||||
| 			{ | ||||
| 				ASE_AWK_FREE (awk, name_dup); | ||||
| 				ase_awk_tab_clear (&awk->parse.params); | ||||
| 				ase_lda_clear (awk->parse.params); | ||||
|  | ||||
| 				SETERRLIN (awk, ASE_AWK_ENOMEM, awk->token.line); | ||||
| 				return ASE_NULL; | ||||
| @ -978,7 +977,7 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk) | ||||
| 			if (get_token (awk) == -1)  | ||||
| 			{ | ||||
| 				ASE_AWK_FREE (awk, name_dup); | ||||
| 				ase_awk_tab_clear (&awk->parse.params); | ||||
| 				ase_lda_clear (awk->parse.params); | ||||
| 				return ASE_NULL; | ||||
| 			}	 | ||||
|  | ||||
| @ -987,7 +986,7 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk) | ||||
| 			if (!MATCH(awk,TOKEN_COMMA))  | ||||
| 			{ | ||||
| 				ASE_AWK_FREE (awk, name_dup); | ||||
| 				ase_awk_tab_clear (&awk->parse.params); | ||||
| 				ase_lda_clear (awk->parse.params); | ||||
|  | ||||
| 				SETERRTOK (awk, ASE_AWK_ECOMMA); | ||||
| 				return ASE_NULL; | ||||
| @ -996,7 +995,7 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk) | ||||
| 			if (get_token(awk) == -1)  | ||||
| 			{ | ||||
| 				ASE_AWK_FREE (awk, name_dup); | ||||
| 				ase_awk_tab_clear (&awk->parse.params); | ||||
| 				ase_lda_clear (awk->parse.params); | ||||
| 				return ASE_NULL; | ||||
| 			} | ||||
| 		} | ||||
| @ -1004,7 +1003,7 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk) | ||||
| 		if (get_token(awk) == -1)  | ||||
| 		{ | ||||
| 			ASE_AWK_FREE (awk, name_dup); | ||||
| 			ase_awk_tab_clear (&awk->parse.params); | ||||
| 			ase_lda_clear (awk->parse.params); | ||||
| 			return ASE_NULL; | ||||
| 		} | ||||
| 	} | ||||
| @ -1018,7 +1017,7 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk) | ||||
| 		if (get_token(awk) == -1)  | ||||
| 		{ | ||||
| 			ASE_AWK_FREE (awk, name_dup); | ||||
| 			ase_awk_tab_clear (&awk->parse.params); | ||||
| 			ase_lda_clear (awk->parse.params); | ||||
| 			return ASE_NULL; | ||||
| 		} | ||||
| 	} | ||||
| @ -1027,7 +1026,7 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk) | ||||
| 	if (!MATCH(awk,TOKEN_LBRACE))  | ||||
| 	{ | ||||
| 		ASE_AWK_FREE (awk, name_dup); | ||||
| 		ase_awk_tab_clear (&awk->parse.params); | ||||
| 		ase_lda_clear (awk->parse.params); | ||||
|  | ||||
| 		SETERRTOK (awk, ASE_AWK_ELBRACE); | ||||
| 		return ASE_NULL; | ||||
| @ -1035,7 +1034,7 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk) | ||||
| 	if (get_token(awk) == -1)  | ||||
| 	{ | ||||
| 		ASE_AWK_FREE (awk, name_dup); | ||||
| 		ase_awk_tab_clear (&awk->parse.params); | ||||
| 		ase_lda_clear (awk->parse.params); | ||||
| 		return ASE_NULL;  | ||||
| 	} | ||||
|  | ||||
| @ -1054,15 +1053,15 @@ static ase_awk_nde_t* parse_function (ase_awk_t* awk) | ||||
| 	if (body == ASE_NULL)  | ||||
| 	{ | ||||
| 		ASE_AWK_FREE (awk, name_dup); | ||||
| 		ase_awk_tab_clear (&awk->parse.params); | ||||
| 		ase_lda_clear (awk->parse.params); | ||||
| 		return ASE_NULL; | ||||
| 	} | ||||
|  | ||||
| 	/* TODO: study furthur if the parameter names should be saved  | ||||
| 	 *       for some reasons - might be needed for deparsing output */ | ||||
| 	nargs = ase_awk_tab_getsize (&awk->parse.params); | ||||
| 	nargs = ASE_LDA_SIZE(awk->parse.params); | ||||
| 	/* parameter names are not required anymore. clear them */ | ||||
| 	ase_awk_tab_clear (&awk->parse.params); | ||||
| 	ase_lda_clear (awk->parse.params); | ||||
|  | ||||
| 	afn = (ase_awk_afn_t*) ASE_AWK_ALLOC (awk, ASE_SIZEOF(ase_awk_afn_t)); | ||||
| 	if (afn == ASE_NULL)  | ||||
| @ -1204,7 +1203,7 @@ static ase_awk_nde_t* parse_block ( | ||||
| 	ase_awk_nde_blk_t* block; | ||||
| 	ase_size_t nlocals, nlocals_max, tmp; | ||||
|  | ||||
| 	nlocals = ase_awk_tab_getsize(&awk->parse.locals); | ||||
| 	nlocals = ASE_LDA_SIZE(awk->parse.locals); | ||||
| 	nlocals_max = awk->parse.nlocals_max; | ||||
|  | ||||
| 	/* local variable declarations */ | ||||
| @ -1216,17 +1215,17 @@ static ase_awk_nde_t* parse_block ( | ||||
|  | ||||
| 			if (get_token(awk) == -1)  | ||||
| 			{ | ||||
| 				ase_awk_tab_remove ( | ||||
| 					&awk->parse.locals, nlocals,  | ||||
| 					ase_awk_tab_getsize(&awk->parse.locals) - nlocals); | ||||
| 				ase_lda_delete ( | ||||
| 					awk->parse.locals, nlocals,  | ||||
| 					ASE_LDA_SIZE(awk->parse.locals)-nlocals); | ||||
| 				return ASE_NULL; | ||||
| 			} | ||||
|  | ||||
| 			if (collect_locals (awk, nlocals, istop) == ASE_NULL) | ||||
| 			{ | ||||
| 				ase_awk_tab_remove ( | ||||
| 					&awk->parse.locals, nlocals,  | ||||
| 					ase_awk_tab_getsize(&awk->parse.locals) - nlocals); | ||||
| 				ase_lda_delete ( | ||||
| 					awk->parse.locals, nlocals,  | ||||
| 					ASE_LDA_SIZE(awk->parse.locals)-nlocals); | ||||
| 				return ASE_NULL; | ||||
| 			} | ||||
| 		} | ||||
| @ -1246,9 +1245,9 @@ static ase_awk_nde_t* parse_block ( | ||||
| 		/* if EOF is met before the right brace, this is an error */ | ||||
| 		if (MATCH(awk,TOKEN_EOF))  | ||||
| 		{ | ||||
| 			ase_awk_tab_remove ( | ||||
| 				&awk->parse.locals, nlocals,  | ||||
| 				ase_awk_tab_getsize(&awk->parse.locals) - nlocals); | ||||
| 			ase_lda_delete ( | ||||
| 				awk->parse.locals, nlocals,  | ||||
| 				ASE_LDA_SIZE(awk->parse.locals) - nlocals); | ||||
| 			if (head != ASE_NULL) ase_awk_clrpt (awk, head); | ||||
|  | ||||
| 			SETERRLIN (awk, ASE_AWK_EENDSRC, awk->token.prev.line); | ||||
| @ -1260,9 +1259,9 @@ static ase_awk_nde_t* parse_block ( | ||||
| 		{ | ||||
| 			if (get_token(awk) == -1)  | ||||
| 			{ | ||||
| 				ase_awk_tab_remove ( | ||||
| 					&awk->parse.locals, nlocals,  | ||||
| 					ase_awk_tab_getsize(&awk->parse.locals)-nlocals); | ||||
| 				ase_lda_delete ( | ||||
| 					awk->parse.locals, nlocals,  | ||||
| 					ASE_LDA_SIZE(awk->parse.locals)-nlocals); | ||||
| 				if (head != ASE_NULL) ase_awk_clrpt (awk, head); | ||||
| 				return ASE_NULL;  | ||||
| 			} | ||||
| @ -1274,9 +1273,9 @@ static ase_awk_nde_t* parse_block ( | ||||
| 		nde = parse_statement (awk, awk->token.line); | ||||
| 		if (nde == ASE_NULL)  | ||||
| 		{ | ||||
| 			ase_awk_tab_remove ( | ||||
| 				&awk->parse.locals, nlocals,  | ||||
| 				ase_awk_tab_getsize(&awk->parse.locals)-nlocals); | ||||
| 			ase_lda_delete ( | ||||
| 				awk->parse.locals, nlocals,  | ||||
| 				ASE_LDA_SIZE(awk->parse.locals)-nlocals); | ||||
| 			if (head != ASE_NULL) ase_awk_clrpt (awk, head); | ||||
| 			return ASE_NULL; | ||||
| 		} | ||||
| @ -1304,20 +1303,20 @@ static ase_awk_nde_t* parse_block ( | ||||
| 		ASE_AWK_ALLOC (awk, ASE_SIZEOF(ase_awk_nde_blk_t)); | ||||
| 	if (block == ASE_NULL)  | ||||
| 	{ | ||||
| 		ase_awk_tab_remove ( | ||||
| 			&awk->parse.locals, nlocals,  | ||||
| 			ase_awk_tab_getsize(&awk->parse.locals)-nlocals); | ||||
| 		ase_lda_delete ( | ||||
| 			awk->parse.locals, nlocals,  | ||||
| 			ASE_LDA_SIZE(awk->parse.locals)-nlocals); | ||||
| 		ase_awk_clrpt (awk, head); | ||||
|  | ||||
| 		SETERRLIN (awk, ASE_AWK_ENOMEM, line); | ||||
| 		return ASE_NULL; | ||||
| 	} | ||||
|  | ||||
| 	tmp = ase_awk_tab_getsize(&awk->parse.locals); | ||||
| 	tmp = ASE_LDA_SIZE(awk->parse.locals); | ||||
| 	if (tmp > awk->parse.nlocals_max) awk->parse.nlocals_max = tmp; | ||||
|  | ||||
| 	/* remove all locals to move it up to the top level */ | ||||
| 	ase_awk_tab_remove (&awk->parse.locals, nlocals, tmp - nlocals); | ||||
| 	ase_lda_delete (awk->parse.locals, nlocals, tmp - nlocals); | ||||
|  | ||||
| 	/* adjust the number of locals for a block without any statements */ | ||||
| 	/* if (head == ASE_NULL) tmp = 0; */ | ||||
| @ -1381,9 +1380,12 @@ int ase_awk_initglobals (ase_awk_t* awk) | ||||
| 	{ | ||||
| 		ase_size_t g; | ||||
|  | ||||
| 		g = ase_awk_tab_add (&awk->parse.globals,  | ||||
| 			gtab[id].name, gtab[id].name_len); | ||||
| 		if (g == (ase_size_t)-1) return -1; | ||||
| 		g = ase_lda_insert ( | ||||
| 			awk->parse.globals, | ||||
| 			ASE_LDA_SIZE(awk->parse.globals), | ||||
| 			(ase_char_t*)gtab[id].name, | ||||
| 			gtab[id].name_len); | ||||
| 		if (g == ASE_LDA_INVALID) return -1; | ||||
|  | ||||
| 		ASE_ASSERT ((int)g == id); | ||||
|  | ||||
| @ -1408,34 +1410,13 @@ static void adjust_static_globals (ase_awk_t* awk) | ||||
| 		if (gtab[id].valid != 0 &&  | ||||
| 		    (awk->option & gtab[id].valid) != gtab[id].valid) | ||||
| 		{ | ||||
| 			awk->parse.globals.buf[id].name.len = 0; | ||||
| 			/*awk->parse.globals.buf[id].name.len = 0;*/ | ||||
| 			ASE_LDA_DLEN(awk->parse.globals,id) = 0; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			awk->parse.globals.buf[id].name.len = gtab[id].name_len; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static void trans_global ( | ||||
| 	ase_size_t index, ase_cstr_t* word, void* arg) | ||||
| { | ||||
| 	ase_awk_tab_t* tab = (ase_awk_tab_t*)arg; | ||||
| 	ase_awk_t* awk = tab->awk; | ||||
|  | ||||
| 	/* | ||||
| 	if (index >= ASE_AWK_MIN_GLOBAL_ID &&  | ||||
| 	    index <= ASE_AWK_MAX_GLOBAL_ID) | ||||
| 	*/ | ||||
| 	if (index < awk->tree.nbglobals) | ||||
| 	{ | ||||
| 		ase_map_pair_t* pair; | ||||
|  | ||||
| 		pair = ase_map_search (awk->wtab, word->ptr, word->len); | ||||
| 		if (pair != ASE_NULL) | ||||
| 		{ | ||||
| 			word->ptr = ((ase_cstr_t*)(pair->vptr))->ptr; | ||||
| 			word->len = ((ase_cstr_t*)(pair->vptr))->len; | ||||
| 			/*awk->parse.globals.buf[id].name.len = gtab[id].name_len;*/ | ||||
| 			ASE_LDA_DLEN(awk->parse.globals,id) = gtab[id].name_len; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -1443,17 +1424,76 @@ static void trans_global ( | ||||
| static ase_size_t get_global ( | ||||
| 	ase_awk_t* awk, const ase_char_t* name, ase_size_t len) | ||||
| { | ||||
| 	return ase_awk_tab_rrfindx ( | ||||
| 		&awk->parse.globals, 0, name, len,  | ||||
| 		trans_global, &awk->parse.globals); | ||||
| 	ase_size_t i; | ||||
|  | ||||
| 	/* return ase_lda_rsearch ( | ||||
| 		awk->parse.globals, ASE_LDA_SIZE(awk->parse.globals), | ||||
| 		name, len); */ | ||||
|  | ||||
| 	if (ASE_LDA_SIZE(awk->parse.globals) > 0) | ||||
| 	{ | ||||
| 		for (i = ASE_LDA_SIZE(awk->parse.globals); i-- > 0; )  | ||||
| 		{ | ||||
| 			if (ASE_LDA_NODE(awk->parse.globals,i)) | ||||
| 			{ | ||||
| 				ase_cstr_t tmp; | ||||
|  | ||||
| 				tmp.ptr = ASE_LDA_DPTR(awk->parse.globals,i); | ||||
| 				tmp.len = ASE_LDA_DLEN(awk->parse.globals,i); | ||||
|  | ||||
| 				if (i < awk->tree.nbglobals) | ||||
| 				{ | ||||
| 					ase_map_pair_t* pair; | ||||
|  | ||||
| 					pair = ase_map_search (awk->wtab, tmp.ptr, tmp.len); | ||||
| 					if (pair != ASE_NULL) | ||||
| 					{ | ||||
| 						tmp.ptr = ((ase_cstr_t*)(pair->vptr))->ptr; | ||||
| 						tmp.len = ((ase_cstr_t*)(pair->vptr))->len; | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 				if (ase_strxncmp(tmp.ptr, tmp.len, name, len) == 0) return i; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return ASE_LDA_INVALID; | ||||
| } | ||||
|  | ||||
| static ase_size_t find_global ( | ||||
| 	ase_awk_t* awk, const ase_char_t* name, ase_size_t len) | ||||
| { | ||||
| 	return ase_awk_tab_findx ( | ||||
| 		&awk->parse.globals, 0, name, len, | ||||
| 		trans_global, &awk->parse.globals); | ||||
| 	ase_size_t i; | ||||
|  | ||||
| 	/* return ase_lda_search (awk->parse.globals, 0, name, len); */ | ||||
|  | ||||
| 	for (i = 0; i < ASE_LDA_SIZE(awk->parse.globals); i++)  | ||||
| 	{ | ||||
| 		if (ASE_LDA_NODE(awk->parse.globals,i)) | ||||
| 		{ | ||||
| 			ase_cstr_t tmp; | ||||
|  | ||||
| 			tmp.ptr = ASE_LDA_DPTR(awk->parse.globals,i); | ||||
| 			tmp.len = ASE_LDA_DLEN(awk->parse.globals,i); | ||||
|  | ||||
| 			if (i < awk->tree.nbglobals) | ||||
| 			{ | ||||
| 				ase_map_pair_t* pair; | ||||
|  | ||||
| 				pair = ase_map_search (awk->wtab, tmp.ptr, tmp.len); | ||||
| 				if (pair != ASE_NULL) | ||||
| 				{ | ||||
| 					tmp.ptr = ((ase_cstr_t*)(pair->vptr))->ptr; | ||||
| 					tmp.len = ((ase_cstr_t*)(pair->vptr))->len; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			if (ase_strxncmp(tmp.ptr, tmp.len, name, len) == 0) return i; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return ASE_LDA_INVALID; | ||||
| } | ||||
|  | ||||
| static int add_global ( | ||||
| @ -1498,30 +1538,34 @@ static int add_global ( | ||||
| 	#endif | ||||
|  | ||||
| 	/* check if it conflicts with other global variable names */ | ||||
| 	if (find_global (awk, name, len) != (ase_size_t)-1) | ||||
| 	if (find_global (awk, name, len) != ASE_LDA_INVALID) | ||||
| 	{  | ||||
| 		SETERRARG (awk, ASE_AWK_EDUPGBL, line, name, len); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	nglobals = ase_awk_tab_getsize (&awk->parse.globals); | ||||
| 	nglobals = ASE_LDA_SIZE (awk->parse.globals); | ||||
| 	if (nglobals >= ASE_AWK_MAX_GLOBALS) | ||||
| 	{ | ||||
| 		SETERRLIN (awk, ASE_AWK_EGBLTM, line); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	if (ase_awk_tab_add (&awk->parse.globals, name, len) == (ase_size_t)-1)  | ||||
| 	if (ase_lda_insert (awk->parse.globals,  | ||||
| 		ASE_LDA_SIZE(awk->parse.globals),  | ||||
| 		(ase_char_t*)name, len) == ASE_LDA_INVALID) | ||||
| 	{ | ||||
| 		SETERRLIN (awk, ASE_AWK_ENOMEM, line); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	ASE_ASSERT (nglobals == ASE_LDA_SIZE(awk->parse.globals) - 1); | ||||
|  | ||||
| 	/* the disabled item is inserted normally but  | ||||
| 	 * the name length is reset to zero. */ | ||||
| 	if (disabled) awk->parse.globals.buf[nglobals].name.len = 0; | ||||
| 	if (disabled) ASE_LDA_DLEN(awk->parse.globals,nglobals) = 0; | ||||
|  | ||||
| 	awk->tree.nglobals = ase_awk_tab_getsize (&awk->parse.globals); | ||||
| 	awk->tree.nglobals = ASE_LDA_SIZE (awk->parse.globals); | ||||
| 	ASE_ASSERT (nglobals == awk->tree.nglobals-1); | ||||
|  | ||||
| 	/* return the id which is the index to the global table. */ | ||||
| @ -1569,9 +1613,9 @@ int ase_awk_delglobal ( | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	n = ase_awk_tab_find (&awk->parse.globals,  | ||||
| 	n = ase_lda_search (awk->parse.globals,  | ||||
| 		ASE_AWK_NUM_STATIC_GLOBALS, name, len); | ||||
| 	if (n == (ase_size_t)-1)  | ||||
| 	if (n == ASE_LDA_INVALID) | ||||
| 	{ | ||||
| 		SETERRARG (awk, ASE_AWK_ENOENT, 0, name, len); | ||||
| 		return -1; | ||||
| @ -1582,8 +1626,12 @@ int ase_awk_delglobal ( | ||||
| 	 * if ase_awk_addglobal is called with the same name | ||||
| 	 * again, the entry will be appended again.  | ||||
| 	 * never call this funciton unless it is really required. */ | ||||
| 	awk->parse.globals.buf[n].name.ptr[0] = ASE_T('\0');; | ||||
| 	/* | ||||
| 	awk->parse.globals.buf[n].name.ptr[0] = ASE_T('\0'); | ||||
| 	awk->parse.globals.buf[n].name.len = 0; | ||||
| 	*/ | ||||
| 	n = ase_lda_uplete (awk->parse.globals, n, 1); | ||||
| 	ASE_ASSERT (n == 1); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
| @ -1600,8 +1648,8 @@ static ase_awk_t* collect_globals (ase_awk_t* awk) | ||||
|  | ||||
| 		if (add_global ( | ||||
| 			awk, | ||||
| 			ASE_STR_PTR(&awk->token.name), | ||||
| 			ASE_STR_LEN(&awk->token.name), | ||||
| 			ASE_STR_PTR(awk->token.name), | ||||
| 			ASE_STR_LEN(awk->token.name), | ||||
| 			awk->token.line, 0) == -1) return ASE_NULL; | ||||
|  | ||||
| 		if (get_token(awk) == -1) return ASE_NULL; | ||||
| @ -1637,8 +1685,8 @@ static ase_awk_t* collect_locals ( | ||||
| 			return ASE_NULL; | ||||
| 		} | ||||
|  | ||||
| 		local.ptr = ASE_STR_PTR(&awk->token.name); | ||||
| 		local.len = ASE_STR_LEN(&awk->token.name); | ||||
| 		local.ptr = ASE_STR_PTR(awk->token.name); | ||||
| 		local.len = ASE_STR_LEN(awk->token.name); | ||||
|  | ||||
| 		#if 0 | ||||
| 		if (awk->option & ASE_AWK_UNIQUEFN)  | ||||
| @ -1689,8 +1737,8 @@ static ase_awk_t* collect_locals ( | ||||
| 		if (istop) | ||||
| 		{ | ||||
| 			/* check if it conflicts with a paremeter name */ | ||||
| 			n = ase_awk_tab_find (&awk->parse.params, 0, local.ptr, local.len); | ||||
| 			if (n != (ase_size_t)-1) | ||||
| 			n = ase_lda_search (awk->parse.params, 0, local.ptr, local.len); | ||||
| 			if (n != ASE_LDA_INVALID) | ||||
| 			{ | ||||
| 				SETERRARG ( | ||||
| 					awk, ASE_AWK_EPARRED, awk->token.line, | ||||
| @ -1700,11 +1748,11 @@ static ase_awk_t* collect_locals ( | ||||
| 		} | ||||
|  | ||||
| 		/* check if it conflicts with other local variable names */ | ||||
| 		n = ase_awk_tab_find ( | ||||
| 			&awk->parse.locals,  | ||||
| 		n = ase_lda_search ( | ||||
| 			awk->parse.locals,  | ||||
| 			nlocals, /*((awk->option&ASE_AWK_SHADING)? nlocals:0)*/ | ||||
| 			local.ptr, local.len); | ||||
| 		if (n != (ase_size_t)-1) | ||||
| 		if (n != ASE_LDA_INVALID) | ||||
| 		{ | ||||
| 			SETERRARG ( | ||||
| 				awk, ASE_AWK_EDUPLCL, awk->token.line,  | ||||
| @ -1714,7 +1762,7 @@ static ase_awk_t* collect_locals ( | ||||
|  | ||||
| 		/* check if it conflicts with global variable names */ | ||||
| 		n = find_global (awk, local.ptr, local.len); | ||||
| 		if (n != (ase_size_t)-1) | ||||
| 		if (n != ASE_LDA_INVALID) | ||||
| 		{ | ||||
|  			if (n < awk->tree.nbglobals) | ||||
| 			{ | ||||
| @ -1737,14 +1785,16 @@ static ase_awk_t* collect_locals ( | ||||
| 			#endif | ||||
| 		} | ||||
|  | ||||
| 		if (ase_awk_tab_getsize(&awk->parse.locals) >= ASE_AWK_MAX_LOCALS) | ||||
| 		if (ASE_LDA_SIZE(awk->parse.locals) >= ASE_AWK_MAX_LOCALS) | ||||
| 		{ | ||||
| 			SETERRLIN (awk, ASE_AWK_ELCLTM, awk->token.line); | ||||
| 			return ASE_NULL; | ||||
| 		} | ||||
|  | ||||
| 		if (ase_awk_tab_add ( | ||||
| 			&awk->parse.locals, local.ptr, local.len) == (ase_size_t)-1)  | ||||
| 		if (ase_lda_insert ( | ||||
| 			awk->parse.locals, | ||||
| 			ASE_LDA_SIZE(awk->parse.locals), | ||||
| 			local.ptr, local.len) == ASE_LDA_INVALID) | ||||
| 		{ | ||||
| 			SETERRLIN (awk, ASE_AWK_ENOMEM, awk->token.line); | ||||
| 			return ASE_NULL; | ||||
| @ -2757,21 +2807,21 @@ static ase_awk_nde_t* parse_primary (ase_awk_t* awk, ase_size_t line) | ||||
| 		nde->line = line; | ||||
| 		nde->next = ASE_NULL; | ||||
| 		nde->val = ase_awk_strxtolong (awk,  | ||||
| 			ASE_STR_PTR(&awk->token.name),  | ||||
| 			ASE_STR_LEN(&awk->token.name), 0, ASE_NULL); | ||||
| 			ASE_STR_PTR(awk->token.name),  | ||||
| 			ASE_STR_LEN(awk->token.name), 0, ASE_NULL); | ||||
| 		nde->str = ASE_AWK_STRXDUP (awk, | ||||
| 			ASE_STR_PTR(&awk->token.name), | ||||
| 			ASE_STR_LEN(&awk->token.name)); | ||||
| 			ASE_STR_PTR(awk->token.name), | ||||
| 			ASE_STR_LEN(awk->token.name)); | ||||
| 		if (nde->str == ASE_NULL) | ||||
| 		{ | ||||
| 			ASE_AWK_FREE (awk, nde); | ||||
| 			return ASE_NULL;			 | ||||
| 		} | ||||
| 		nde->len = ASE_STR_LEN(&awk->token.name); | ||||
| 		nde->len = ASE_STR_LEN(awk->token.name); | ||||
|  | ||||
| 		ASE_ASSERT ( | ||||
| 			ASE_STR_LEN(&awk->token.name) == | ||||
| 			ase_strlen(ASE_STR_PTR(&awk->token.name))); | ||||
| 			ASE_STR_LEN(awk->token.name) == | ||||
| 			ase_strlen(ASE_STR_PTR(awk->token.name))); | ||||
|  | ||||
| 		if (get_token(awk) == -1)  | ||||
| 		{ | ||||
| @ -2798,21 +2848,21 @@ static ase_awk_nde_t* parse_primary (ase_awk_t* awk, ase_size_t line) | ||||
| 		nde->line = line; | ||||
| 		nde->next = ASE_NULL; | ||||
| 		nde->val = ase_awk_strxtoreal (awk,  | ||||
| 			ASE_STR_PTR(&awk->token.name),  | ||||
| 			ASE_STR_LEN(&awk->token.name), ASE_NULL); | ||||
| 			ASE_STR_PTR(awk->token.name),  | ||||
| 			ASE_STR_LEN(awk->token.name), ASE_NULL); | ||||
| 		nde->str = ASE_AWK_STRXDUP (awk, | ||||
| 			ASE_STR_PTR(&awk->token.name), | ||||
| 			ASE_STR_LEN(&awk->token.name)); | ||||
| 			ASE_STR_PTR(awk->token.name), | ||||
| 			ASE_STR_LEN(awk->token.name)); | ||||
| 		if (nde->str == ASE_NULL) | ||||
| 		{ | ||||
| 			ASE_AWK_FREE (awk, nde); | ||||
| 			return ASE_NULL;			 | ||||
| 		} | ||||
| 		nde->len = ASE_STR_LEN(&awk->token.name); | ||||
| 		nde->len = ASE_STR_LEN(awk->token.name); | ||||
|  | ||||
| 		ASE_ASSERT ( | ||||
| 			ASE_STR_LEN(&awk->token.name) == | ||||
| 			ase_strlen(ASE_STR_PTR(&awk->token.name))); | ||||
| 			ASE_STR_LEN(awk->token.name) == | ||||
| 			ase_strlen(ASE_STR_PTR(awk->token.name))); | ||||
|  | ||||
| 		if (get_token(awk) == -1)  | ||||
| 		{ | ||||
| @ -2838,9 +2888,9 @@ static ase_awk_nde_t* parse_primary (ase_awk_t* awk, ase_size_t line) | ||||
| 		nde->type = ASE_AWK_NDE_STR; | ||||
| 		nde->line = line; | ||||
| 		nde->next = ASE_NULL; | ||||
| 		nde->len = ASE_STR_LEN(&awk->token.name); | ||||
| 		nde->len = ASE_STR_LEN(awk->token.name); | ||||
| 		nde->buf = ASE_AWK_STRXDUP (awk, | ||||
| 			ASE_STR_PTR(&awk->token.name), nde->len); | ||||
| 			ASE_STR_PTR(awk->token.name), nde->len); | ||||
| 		if (nde->buf == ASE_NULL)  | ||||
| 		{ | ||||
| 			ASE_AWK_FREE (awk, nde); | ||||
| @ -2866,7 +2916,7 @@ static ase_awk_nde_t* parse_primary (ase_awk_t* awk, ase_size_t line) | ||||
| 		 * of the context-sensitivity of the slash symbol */ | ||||
| 		SET_TOKEN_TYPE (awk, TOKEN_REX); | ||||
|  | ||||
| 		ase_str_clear (&awk->token.name); | ||||
| 		ase_str_clear (awk->token.name); | ||||
| 		if (get_rexstr (awk) == -1) return ASE_NULL; | ||||
| 		ASE_ASSERT (MATCH(awk,TOKEN_REX)); | ||||
|  | ||||
| @ -2882,10 +2932,10 @@ static ase_awk_nde_t* parse_primary (ase_awk_t* awk, ase_size_t line) | ||||
| 		nde->line = line; | ||||
| 		nde->next = ASE_NULL; | ||||
|  | ||||
| 		nde->len = ASE_STR_LEN(&awk->token.name); | ||||
| 		nde->len = ASE_STR_LEN(awk->token.name); | ||||
| 		nde->buf = ASE_AWK_STRXDUP (awk, | ||||
| 			ASE_STR_PTR(&awk->token.name), | ||||
| 			ASE_STR_LEN(&awk->token.name)); | ||||
| 			ASE_STR_PTR(awk->token.name), | ||||
| 			ASE_STR_LEN(awk->token.name)); | ||||
| 		if (nde->buf == ASE_NULL) | ||||
| 		{ | ||||
| 			ASE_AWK_FREE (awk, nde); | ||||
| @ -2894,8 +2944,8 @@ static ase_awk_nde_t* parse_primary (ase_awk_t* awk, ase_size_t line) | ||||
| 		} | ||||
|  | ||||
| 		nde->code = ASE_AWK_BUILDREX (awk, | ||||
| 			ASE_STR_PTR(&awk->token.name),  | ||||
| 			ASE_STR_LEN(&awk->token.name),  | ||||
| 			ASE_STR_PTR(awk->token.name),  | ||||
| 			ASE_STR_LEN(awk->token.name),  | ||||
| 			&errnum); | ||||
| 		if (nde->code == ASE_NULL) | ||||
| 		{ | ||||
| @ -3108,14 +3158,14 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line) | ||||
| 	ASE_ASSERT (MATCH(awk,TOKEN_IDENT)); | ||||
|  | ||||
| 	name_dup = ASE_AWK_STRXDUP (awk, | ||||
| 		ASE_STR_PTR(&awk->token.name), | ||||
| 		ASE_STR_LEN(&awk->token.name)); | ||||
| 		ASE_STR_PTR(awk->token.name), | ||||
| 		ASE_STR_LEN(awk->token.name)); | ||||
| 	if (name_dup == ASE_NULL)  | ||||
| 	{ | ||||
| 		SETERRLIN (awk, ASE_AWK_ENOMEM, line); | ||||
| 		return ASE_NULL; | ||||
| 	} | ||||
| 	name_len = ASE_STR_LEN(&awk->token.name); | ||||
| 	name_len = ASE_STR_LEN(awk->token.name); | ||||
|  | ||||
| 	if (get_token(awk) == -1)  | ||||
| 	{ | ||||
| @ -3151,8 +3201,7 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line) | ||||
| 		if (nde == ASE_NULL) ASE_AWK_FREE (awk, name_dup); | ||||
| 		return (ase_awk_nde_t*)nde; | ||||
| 	} | ||||
| 	else if ((idxa = ase_awk_tab_rrfind ( | ||||
| 		&awk->parse.locals, 0, name_dup, name_len)) != (ase_size_t)-1) | ||||
| 	else if ((idxa = ase_lda_rsearch (awk->parse.locals, ASE_LDA_SIZE(awk->parse.locals), name_dup, name_len)) != ASE_LDA_INVALID) | ||||
| 	{ | ||||
| 		/* local variable */ | ||||
|  | ||||
| @ -3186,8 +3235,7 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line) | ||||
|  | ||||
| 		return (ase_awk_nde_t*)nde; | ||||
| 	} | ||||
| 	else if ((idxa = ase_awk_tab_find ( | ||||
| 		&awk->parse.params, 0, name_dup, name_len)) != (ase_size_t)-1) | ||||
| 	else if ((idxa = ase_lda_search (awk->parse.params, 0, name_dup, name_len)) != ASE_LDA_INVALID) | ||||
| 	{ | ||||
| 		/* parameter */ | ||||
|  | ||||
| @ -3221,8 +3269,7 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line) | ||||
|  | ||||
| 		return (ase_awk_nde_t*)nde; | ||||
| 	} | ||||
| 	else if ((idxa = get_global ( | ||||
| 		awk, name_dup, name_len)) != (ase_size_t)-1) | ||||
| 	else if ((idxa = get_global (awk, name_dup, name_len)) != ASE_LDA_INVALID) | ||||
| 	{ | ||||
| 		/* global variable */ | ||||
|  | ||||
| @ -3428,8 +3475,8 @@ static ase_awk_nde_t* parse_hashidx ( | ||||
| 	} | ||||
|  | ||||
| 	/* search the local variable list */ | ||||
| 	idxa = ase_awk_tab_rrfind(&awk->parse.locals, 0, name, name_len); | ||||
| 	if (idxa != (ase_size_t)-1)  | ||||
| 	idxa = ase_lda_rsearch (awk->parse.locals, ASE_LDA_SIZE(awk->parse.locals), name, name_len); | ||||
| 	if (idxa != ASE_LDA_INVALID) | ||||
| 	{ | ||||
| 		nde->type = ASE_AWK_NDE_LOCALIDX; | ||||
| 		nde->line = line; | ||||
| @ -3444,8 +3491,8 @@ static ase_awk_nde_t* parse_hashidx ( | ||||
| 	} | ||||
|  | ||||
| 	/* search the parameter name list */ | ||||
| 	idxa = ase_awk_tab_find (&awk->parse.params, 0, name, name_len); | ||||
| 	if (idxa != (ase_size_t)-1)  | ||||
| 	idxa = ase_lda_search (awk->parse.params, 0, name, name_len); | ||||
| 	if (idxa != ASE_LDA_INVALID) | ||||
| 	{ | ||||
| 		nde->type = ASE_AWK_NDE_ARGIDX; | ||||
| 		nde->line = line; | ||||
| @ -3461,7 +3508,7 @@ static ase_awk_nde_t* parse_hashidx ( | ||||
|  | ||||
| 	/* gets the global variable index */ | ||||
| 	idxa = get_global (awk, name, name_len); | ||||
| 	if (idxa != (ase_size_t)-1)  | ||||
| 	if (idxa != ASE_LDA_INVALID) | ||||
| 	{ | ||||
| 		nde->type = ASE_AWK_NDE_GLOBALIDX; | ||||
| 		nde->line = line; | ||||
| @ -4530,7 +4577,7 @@ static int get_token (ase_awk_t* awk) | ||||
| 	}  | ||||
| 	while (n == 1); | ||||
|  | ||||
| 	ase_str_clear (&awk->token.name); | ||||
| 	ase_str_clear (awk->token.name); | ||||
| 	awk->token.line = awk->src.lex.line; | ||||
| 	awk->token.column = awk->src.lex.column; | ||||
|  | ||||
| @ -4592,8 +4639,8 @@ static int get_token (ase_awk_t* awk) | ||||
| 		       c == ASE_T('_') || ASE_AWK_ISDIGIT(awk,c)); | ||||
|  | ||||
| 		type = classify_ident (awk,  | ||||
| 			ASE_STR_PTR(&awk->token.name),  | ||||
| 			ASE_STR_LEN(&awk->token.name)); | ||||
| 			ASE_STR_PTR(awk->token.name),  | ||||
| 			ASE_STR_LEN(awk->token.name)); | ||||
| 		SET_TOKEN_TYPE (awk, type); | ||||
| 	} | ||||
| 	else if (c == ASE_T('\"'))  | ||||
| @ -4932,7 +4979,7 @@ static int get_number (ase_awk_t* awk) | ||||
| { | ||||
| 	ase_cint_t c; | ||||
|  | ||||
| 	ASE_ASSERT (ASE_STR_LEN(&awk->token.name) == 0); | ||||
| 	ASE_ASSERT (ASE_STR_LEN(awk->token.name) == 0); | ||||
| 	SET_TOKEN_TYPE (awk, TOKEN_INT); | ||||
|  | ||||
| 	c = awk->src.lex.curc; | ||||
| @ -5542,8 +5589,8 @@ static int deparse (ase_awk_t* awk) | ||||
| 				/* use the actual name if no named variable  | ||||
| 				 * is allowed */ | ||||
| 				if (ase_awk_putsrcstrx (awk,  | ||||
| 					awk->parse.globals.buf[i].name.ptr,  | ||||
| 					awk->parse.globals.buf[i].name.len) == -1) | ||||
| 					ASE_LDA_DPTR(awk->parse.globals,i), | ||||
| 					ASE_LDA_DLEN(awk->parse.globals,i)) == -1) | ||||
| 				{ | ||||
| 					EXIT_DEPARSE (); | ||||
| 				} | ||||
| @ -5567,8 +5614,8 @@ static int deparse (ase_awk_t* awk) | ||||
| 		    !(awk->option & ASE_AWK_IMPLICIT)) | ||||
| 		{ | ||||
| 			if (ase_awk_putsrcstrx (awk,  | ||||
| 				awk->parse.globals.buf[i].name.ptr,  | ||||
| 				awk->parse.globals.buf[i].name.len) == -1) | ||||
| 				ASE_LDA_DPTR(awk->parse.globals,i), | ||||
| 				ASE_LDA_DLEN(awk->parse.globals,i)) == -1) | ||||
| 			{ | ||||
| 				EXIT_DEPARSE (); | ||||
| 			} | ||||
|  | ||||
| @ -1,317 +0,0 @@ | ||||
| /* | ||||
|  * $Id: tab.c 337 2008-08-20 09:17:25Z baconevi $ | ||||
|  * | ||||
|  * {License} | ||||
|  */ | ||||
|  | ||||
| #include "awk.h" | ||||
|  | ||||
| ase_awk_tab_t* ase_awk_tab_open (ase_awk_tab_t* tab, ase_awk_t* awk) | ||||
| { | ||||
| 	if (tab == ASE_NULL)  | ||||
| 	{ | ||||
| 		tab = (ase_awk_tab_t*) ASE_AWK_ALLOC ( | ||||
| 			awk, ASE_SIZEOF(ase_awk_tab_t)); | ||||
| 		if (tab == ASE_NULL) return ASE_NULL; | ||||
| 		tab->__dynamic = ASE_TRUE; | ||||
| 	} | ||||
| 	else tab->__dynamic = ASE_FALSE; | ||||
|  | ||||
| 	tab->awk = awk; | ||||
| 	tab->buf = ASE_NULL; | ||||
| 	tab->size = 0; | ||||
| 	tab->capa = 0; | ||||
|  | ||||
| 	return tab; | ||||
| } | ||||
|  | ||||
| void ase_awk_tab_close (ase_awk_tab_t* tab) | ||||
| { | ||||
| 	ase_awk_tab_clear (tab); | ||||
| 	if (tab->buf != ASE_NULL)  | ||||
| 	{ | ||||
| 		ASE_AWK_FREE (tab->awk, tab->buf); | ||||
| 		tab->buf = ASE_NULL; | ||||
| 		tab->capa = 0; | ||||
| 	} | ||||
|  | ||||
| 	if (tab->__dynamic) ASE_AWK_FREE (tab->awk, tab); | ||||
| } | ||||
|  | ||||
| ase_size_t ase_awk_tab_getsize (ase_awk_tab_t* tab) | ||||
| { | ||||
| 	return tab->size; | ||||
| } | ||||
|  | ||||
| ase_size_t ase_awk_tab_getcapa (ase_awk_tab_t* tab) | ||||
| { | ||||
| 	return tab->capa; | ||||
| } | ||||
|  | ||||
| ase_awk_tab_t* ase_awk_tab_setcapa (ase_awk_tab_t* tab, ase_size_t capa) | ||||
| { | ||||
| 	void* tmp; | ||||
|  | ||||
| 	if (tab->size > capa)  | ||||
| 	{ | ||||
| 		ase_awk_tab_remove (tab, capa, tab->size - capa); | ||||
| 		ASE_ASSERT (tab->size <= capa); | ||||
| 	} | ||||
|  | ||||
| 	if (capa > 0)  | ||||
| 	{ | ||||
| 		if (tab->awk->mmgr->realloc != ASE_NULL) | ||||
| 		{ | ||||
| 			tmp = ASE_AWK_REALLOC (tab->awk,  | ||||
| 				tab->buf, ASE_SIZEOF(*tab->buf) * capa); | ||||
| 			if (tmp == ASE_NULL) return ASE_NULL; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			tmp = ASE_AWK_ALLOC ( | ||||
| 				tab->awk, ASE_SIZEOF(*tab->buf) * capa); | ||||
| 			if (tmp == ASE_NULL) return ASE_NULL; | ||||
| 			if (tab->buf != ASE_NULL)  | ||||
| 			{ | ||||
| 				ase_size_t x; | ||||
| 				x = (capa > tab->capa)? tab->capa: capa; | ||||
| 				ASE_MEMCPY ( | ||||
| 					tmp, tab->buf,  | ||||
| 					ASE_SIZEOF(*tab->buf) * x); | ||||
| 				ASE_AWK_FREE (tab->awk, tab->buf); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	else  | ||||
| 	{ | ||||
| 		if (tab->buf != ASE_NULL) ASE_AWK_FREE (tab->awk, tab->buf); | ||||
| 		tmp = ASE_NULL; | ||||
| 	} | ||||
|  | ||||
| 	tab->buf = tmp; | ||||
| 	tab->capa = capa; | ||||
| 	 | ||||
| 	return tab; | ||||
| } | ||||
|  | ||||
| void ase_awk_tab_clear (ase_awk_tab_t* tab) | ||||
| { | ||||
| 	ase_size_t i; | ||||
|  | ||||
| 	for (i = 0; i < tab->size; i++)  | ||||
| 	{ | ||||
| 		ASE_AWK_FREE (tab->awk, tab->buf[i].name.ptr); | ||||
| 		tab->buf[i].name.ptr = ASE_NULL; | ||||
| 		tab->buf[i].name.len = 0; | ||||
| 	} | ||||
|  | ||||
| 	tab->size = 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| ase_size_t ase_awk_tab_insert ( | ||||
| 	ase_awk_tab_t* tab, ase_size_t index,  | ||||
| 	const ase_char_t* str, ase_size_t len) | ||||
| { | ||||
| 	ase_size_t i; | ||||
| 	ase_char_t* dup; | ||||
|  | ||||
| 	dup = ASE_AWK_STRXDUP (tab->awk, str, len); | ||||
| 	if (dup == ASE_NULL) return (ase_size_t)-1; | ||||
|  | ||||
| 	if (index >= tab->capa)  | ||||
| 	{ | ||||
| 		ase_size_t capa; | ||||
|  | ||||
| 		if (tab->capa <= 0) capa = (index + 1); | ||||
| 		else  | ||||
| 		{ | ||||
| 			do { capa = tab->capa * 2; } while (index >= capa); | ||||
| 		} | ||||
|  | ||||
| 		if (ase_awk_tab_setcapa(tab,capa) == ASE_NULL)  | ||||
| 		{ | ||||
| 			ASE_AWK_FREE (tab->awk, dup); | ||||
| 			return (ase_size_t)-1; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	for (i = tab->size; i > index; i--) tab->buf[i] = tab->buf[i-1]; | ||||
| 	tab->buf[index].name.ptr = dup; | ||||
| 	tab->buf[index].name.len = len; | ||||
|  | ||||
| 	if (index > tab->size) tab->size = index + 1; | ||||
| 	else tab->size++; | ||||
|  | ||||
| 	return index; | ||||
| } | ||||
|  | ||||
| ase_size_t ase_awk_tab_remove ( | ||||
| 	ase_awk_tab_t* tab, ase_size_t index, ase_size_t count) | ||||
| { | ||||
| 	ase_size_t i, j, k; | ||||
|  | ||||
| 	if (index >= tab->size) return 0; | ||||
| 	if (count > tab->size - index) count = tab->size - index; | ||||
|  | ||||
| 	i = index; | ||||
| 	j = index + count; | ||||
| 	k = index + count; | ||||
|  | ||||
| 	while (i < k)  | ||||
| 	{ | ||||
| 		ASE_AWK_FREE (tab->awk, tab->buf[i].name.ptr);	 | ||||
|  | ||||
| 		if (j >= tab->size)  | ||||
| 		{ | ||||
| 			tab->buf[i].name.ptr = ASE_NULL; | ||||
| 			tab->buf[i].name.len = 0;  | ||||
| 			i++; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			tab->buf[i].name.ptr = tab->buf[j].name.ptr; | ||||
| 			tab->buf[i].name.len = tab->buf[j].name.len; | ||||
| 			i++; j++;		 | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	tab->size -= count; | ||||
| 	return count; | ||||
| } | ||||
|  | ||||
| ase_size_t ase_awk_tab_add ( | ||||
| 	ase_awk_tab_t* tab, const ase_char_t* str, ase_size_t len) | ||||
| { | ||||
| 	return ase_awk_tab_insert (tab, tab->size, str, len); | ||||
| } | ||||
|  | ||||
| ase_size_t ase_awk_tab_adduniq ( | ||||
| 	ase_awk_tab_t* tab, const ase_char_t* str, ase_size_t len) | ||||
| { | ||||
| 	ase_size_t i; | ||||
| 	i = ase_awk_tab_find (tab, 0, str, len); | ||||
| 	if (i != (ase_size_t)-1) return i; /* found. return the current index */ | ||||
|  | ||||
| 	/* insert a new entry */ | ||||
| 	return ase_awk_tab_insert (tab, tab->size, str, len); | ||||
| } | ||||
|  | ||||
| ase_size_t ase_awk_tab_find ( | ||||
| 	ase_awk_tab_t* tab, ase_size_t index,  | ||||
| 	const ase_char_t* str, ase_size_t len) | ||||
| { | ||||
| 	ase_size_t i; | ||||
|  | ||||
| 	for (i = index; i < tab->size; i++)  | ||||
| 	{ | ||||
| 		if (ase_strxncmp ( | ||||
| 			tab->buf[i].name.ptr, tab->buf[i].name.len,  | ||||
| 			str, len) == 0) return i; | ||||
| 	} | ||||
|  | ||||
| 	return (ase_size_t)-1; | ||||
| } | ||||
|  | ||||
| ase_size_t ase_awk_tab_rfind ( | ||||
| 	ase_awk_tab_t* tab, ase_size_t index,  | ||||
| 	const ase_char_t* str, ase_size_t len) | ||||
| { | ||||
| 	ase_size_t i; | ||||
|  | ||||
| 	if (index >= tab->size) return (ase_size_t)-1; | ||||
|  | ||||
| 	for (i = index + 1; i-- > 0; )  | ||||
| 	{ | ||||
| 		if (ase_strxncmp ( | ||||
| 			tab->buf[i].name.ptr, tab->buf[i].name.len,  | ||||
| 			str, len) == 0) return i; | ||||
| 	} | ||||
|  | ||||
| 	return (ase_size_t)-1; | ||||
| } | ||||
|  | ||||
| ase_size_t ase_awk_tab_rrfind ( | ||||
| 	ase_awk_tab_t* tab, ase_size_t index, | ||||
| 	const ase_char_t* str, ase_size_t len) | ||||
| { | ||||
| 	ase_size_t i; | ||||
|  | ||||
| 	if (index >= tab->size) return (ase_size_t)-1; | ||||
|  | ||||
| 	for (i = tab->size - index; i-- > 0; )  | ||||
| 	{ | ||||
| 		if (ase_strxncmp ( | ||||
| 			tab->buf[i].name.ptr, tab->buf[i].name.len,  | ||||
| 			str, len) == 0) return i; | ||||
| 	} | ||||
|  | ||||
| 	return (ase_size_t)-1; | ||||
| } | ||||
|  | ||||
| ase_size_t ase_awk_tab_findx ( | ||||
| 	ase_awk_tab_t* tab, ase_size_t index,  | ||||
| 	const ase_char_t* str, ase_size_t len, | ||||
| 	void(*transform)(ase_size_t, ase_cstr_t*,void*), void* arg) | ||||
| { | ||||
| 	ase_size_t i; | ||||
|  | ||||
| 	for (i = index; i < tab->size; i++)  | ||||
| 	{ | ||||
| 		ase_cstr_t x; | ||||
|  | ||||
| 		x.ptr = tab->buf[i].name.ptr; | ||||
| 		x.len = tab->buf[i].name.len; | ||||
|  | ||||
| 		transform (i, &x, arg); | ||||
| 		if (ase_strxncmp (x.ptr, x.len, str, len) == 0) return i; | ||||
| 	} | ||||
|  | ||||
| 	return (ase_size_t)-1; | ||||
| } | ||||
|  | ||||
| ase_size_t ase_awk_tab_rfindx ( | ||||
| 	ase_awk_tab_t* tab, ase_size_t index,  | ||||
| 	const ase_char_t* str, ase_size_t len, | ||||
| 	void(*transform)(ase_size_t, ase_cstr_t*,void*), void* arg) | ||||
| { | ||||
| 	ase_size_t i; | ||||
|  | ||||
| 	if (index >= tab->size) return (ase_size_t)-1; | ||||
|  | ||||
| 	for (i = index + 1; i-- > 0; )  | ||||
| 	{ | ||||
| 		ase_cstr_t x; | ||||
|  | ||||
| 		x.ptr = tab->buf[i].name.ptr; | ||||
| 		x.len = tab->buf[i].name.len; | ||||
|  | ||||
| 		transform (i, &x, arg); | ||||
| 		if (ase_strxncmp (x.ptr, x.len, str, len) == 0) return i; | ||||
| 	} | ||||
|  | ||||
| 	return (ase_size_t)-1; | ||||
| } | ||||
|  | ||||
| ase_size_t ase_awk_tab_rrfindx ( | ||||
| 	ase_awk_tab_t* tab, ase_size_t index, | ||||
| 	const ase_char_t* str, ase_size_t len,  | ||||
| 	void(*transform)(ase_size_t, ase_cstr_t*,void*), void* arg) | ||||
| { | ||||
| 	ase_size_t i; | ||||
|  | ||||
| 	if (index >= tab->size) return (ase_size_t)-1; | ||||
|  | ||||
| 	for (i = tab->size - index; i-- > 0; )  | ||||
| 	{ | ||||
| 		ase_cstr_t x; | ||||
|  | ||||
| 		x.ptr = tab->buf[i].name.ptr; | ||||
| 		x.len = tab->buf[i].name.len; | ||||
|  | ||||
| 		transform (i, &x, arg); | ||||
| 		if (ase_strxncmp (x.ptr, x.len, str, len) == 0) return i; | ||||
| 	} | ||||
|  | ||||
| 	return (ase_size_t)-1; | ||||
| } | ||||
| @ -1,87 +0,0 @@ | ||||
| /* | ||||
|  * $Id: tab.h 363 2008-09-04 10:58:08Z baconevi $ | ||||
|  * | ||||
|  * {License} | ||||
|  */ | ||||
|  | ||||
| #ifndef _ASE_LIB_AWK_TAB_H_ | ||||
| #define _ASE_LIB_AWK_TAB_H_ | ||||
|  | ||||
| #ifndef _ASE_AWK_AWK_H_ | ||||
| #error Never include this file directly. Include <ase/awk/awk.h> instead | ||||
| #endif | ||||
|  | ||||
| /* TODO: you have to turn this into a hash table. | ||||
| 	 as of now, this is an arrayed table. */ | ||||
|  | ||||
| typedef struct ase_awk_tab_t ase_awk_tab_t; | ||||
|  | ||||
| struct ase_awk_tab_t | ||||
| { | ||||
| 	struct | ||||
| 	{ | ||||
| 		struct | ||||
| 		{ | ||||
| 			ase_char_t* ptr; | ||||
| 			ase_size_t  len; | ||||
| 		} name; | ||||
| 	}* buf; | ||||
| 	ase_size_t size; | ||||
| 	ase_size_t capa; | ||||
| 	ase_awk_t* awk; | ||||
| 	ase_bool_t __dynamic;	 | ||||
| }; | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| ase_awk_tab_t* ase_awk_tab_open (ase_awk_tab_t* tab, ase_awk_t* awk); | ||||
| void ase_awk_tab_close (ase_awk_tab_t* tab); | ||||
|  | ||||
| ase_size_t ase_awk_tab_getsize (ase_awk_tab_t* tab); | ||||
| ase_size_t ase_awk_tab_getcapa (ase_awk_tab_t* tab); | ||||
| ase_awk_tab_t* ase_awk_tab_setcapa (ase_awk_tab_t* tab, ase_size_t capa); | ||||
|  | ||||
| void ase_awk_tab_clear (ase_awk_tab_t* tab); | ||||
|  | ||||
| ase_size_t ase_awk_tab_insert ( | ||||
| 	ase_awk_tab_t* tab, ase_size_t index,  | ||||
| 	const ase_char_t* str, ase_size_t len); | ||||
|  | ||||
| ase_size_t ase_awk_tab_remove ( | ||||
| 	ase_awk_tab_t* tab, ase_size_t index, ase_size_t count); | ||||
|  | ||||
| ase_size_t ase_awk_tab_add ( | ||||
| 	ase_awk_tab_t* tab, const ase_char_t* str, ase_size_t len); | ||||
| ase_size_t ase_awk_tab_adduniq ( | ||||
| 	ase_awk_tab_t* tab, const ase_char_t* str, ase_size_t len); | ||||
|  | ||||
| ase_size_t ase_awk_tab_find ( | ||||
| 	ase_awk_tab_t* tab, ase_size_t index, | ||||
| 	const ase_char_t* str, ase_size_t len); | ||||
| ase_size_t ase_awk_tab_rfind ( | ||||
| 	ase_awk_tab_t* tab, ase_size_t index, | ||||
| 	const ase_char_t* str, ase_size_t len); | ||||
| ase_size_t ase_awk_tab_rrfind ( | ||||
| 	ase_awk_tab_t* tab, ase_size_t index, | ||||
| 	const ase_char_t* str, ase_size_t len); | ||||
|  | ||||
| ase_size_t ase_awk_tab_findx ( | ||||
| 	ase_awk_tab_t* tab, ase_size_t index, | ||||
| 	const ase_char_t* str, ase_size_t len,  | ||||
| 	void(*transform)(ase_size_t, ase_cstr_t*,void*), void* arg); | ||||
| ase_size_t ase_awk_tab_rfindx ( | ||||
| 	ase_awk_tab_t* tab, ase_size_t index, | ||||
| 	const ase_char_t* str, ase_size_t len,  | ||||
| 	void(*transform)(ase_size_t, ase_cstr_t*,void*), void* arg); | ||||
| ase_size_t ase_awk_tab_rrfindx ( | ||||
| 	ase_awk_tab_t* tab, ase_size_t index, | ||||
| 	const ase_char_t* str, ase_size_t len,  | ||||
| 	void(*transform)(ase_size_t, ase_cstr_t*,void*), void* arg); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
| @ -272,6 +272,8 @@ size_t ase_lda_search (lda_t* lda, size_t pos, const void* dptr, size_t dlen) | ||||
|  | ||||
| 	for (i = pos; i < lda->size; i++)  | ||||
| 	{ | ||||
| 		if (lda->node[i] == ASE_NULL) continue; | ||||
|  | ||||
| 		if (lda->comper (lda,  | ||||
| 			DPTR(lda->node[i]), DLEN(lda->node[i]), | ||||
| 			dptr, dlen) == 0) return i; | ||||
| @ -284,29 +286,18 @@ size_t ase_lda_rsearch (lda_t* lda, size_t pos, const void* dptr, size_t dlen) | ||||
| { | ||||
| 	size_t i; | ||||
|  | ||||
| 	if (pos >= lda->size) return INVALID; | ||||
|  | ||||
| 	for (i = pos + 1; i-- > 0; )  | ||||
| 	if (lda->size > 0) | ||||
| 	{ | ||||
| 		if (lda->comper (lda,  | ||||
| 			DPTR(lda->node[i]), DLEN(lda->node[i]), | ||||
| 			dptr, dlen) == 0) return i; | ||||
| 	} | ||||
| 		if (pos >= lda->size) pos = lda->size - 1; | ||||
|  | ||||
| 	return INVALID; | ||||
| } | ||||
| 		for (i = pos + 1; i-- > 0; )  | ||||
| 		{ | ||||
| 			if (lda->node[i] == ASE_NULL) continue; | ||||
|  | ||||
| size_t ase_lda_rrsearch (lda_t* lda, size_t pos, const void* dptr, size_t dlen) | ||||
| { | ||||
| 	size_t i; | ||||
|  | ||||
| 	if (pos >= lda->size) return INVALID; | ||||
|  | ||||
| 	for (i = lda->size - pos; i-- > 0; )  | ||||
| 	{ | ||||
| 		if (lda->comper (lda,  | ||||
| 			DPTR(lda->node[i]), DLEN(lda->node[i]), | ||||
| 			dptr, dlen) == 0) return i; | ||||
| 			if (lda->comper (lda,  | ||||
| 				DPTR(lda->node[i]), DLEN(lda->node[i]), | ||||
| 				dptr, dlen) == 0) return i; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return INVALID; | ||||
| @ -456,6 +447,32 @@ size_t ase_lda_delete (lda_t* lda, size_t index, size_t count) | ||||
| 	return count; | ||||
| } | ||||
|  | ||||
| size_t ase_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++) | ||||
| 	{ | ||||
| 		node_t* c = lda->node[i]; | ||||
|  | ||||
| 		if (c != ASE_NULL) | ||||
| 		{ | ||||
| 			if (lda->freeer != ASE_NULL) | ||||
| 				lda->freeer (lda, DPTR(c), DLEN(c)); | ||||
| 			ASE_MMGR_FREE (lda->mmgr, c); | ||||
|  | ||||
| 			lda->node[i] = ASE_NULL; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return count; | ||||
| } | ||||
|  | ||||
| void ase_lda_clear (lda_t* lda) | ||||
| { | ||||
| 	size_t i; | ||||
| @ -475,139 +492,6 @@ void ase_lda_clear (lda_t* lda) | ||||
| 	lda->size = 0; | ||||
| } | ||||
|  | ||||
| size_t ase_lda_add ( | ||||
| 	lda_t* lda, ase_char_t* str, size_t len) | ||||
| { | ||||
| 	return ase_lda_insert (lda, lda->size, str, len); | ||||
| } | ||||
|  | ||||
| size_t ase_lda_adduniq ( | ||||
| 	lda_t* lda, ase_char_t* str, size_t len) | ||||
| { | ||||
| 	size_t i; | ||||
| 	i = ase_lda_search (lda, 0, str, len); | ||||
| 	if (i != INVALID) return i; /* found. return the current index */ | ||||
|  | ||||
| 	/* insert a new entry */ | ||||
| 	return ase_lda_insert (lda, lda->size, str, len); | ||||
| } | ||||
|  | ||||
| #if 0 | ||||
| size_t ase_lda_find (lda_t* lda, size_t index, const ase_char_t* str, size_t len) | ||||
| { | ||||
| 	size_t i; | ||||
|  | ||||
| 	for (i = index; i < lda->size; i++)  | ||||
| 	{ | ||||
| 		if (ase_strxncmp ( | ||||
| 			lda->node[i].name.ptr, lda->node[i].name.len,  | ||||
| 			str, len) == 0) return i; | ||||
| 	} | ||||
|  | ||||
| 	return INVALID; | ||||
| } | ||||
|  | ||||
| size_t ase_lda_rfind (lda_t* lda, size_t index, const ase_char_t* str, size_t len) | ||||
| { | ||||
| 	size_t i; | ||||
|  | ||||
| 	if (index >= lda->size) return INVALID; | ||||
|  | ||||
| 	for (i = index + 1; i-- > 0; )  | ||||
| 	{ | ||||
| 		if (ase_strxncmp ( | ||||
| 			lda->node[i].name.ptr, lda->node[i].name.len,  | ||||
| 			str, len) == 0) return i; | ||||
| 	} | ||||
|  | ||||
| 	return INVALID; | ||||
| } | ||||
|  | ||||
| size_t ase_lda_rrfind (lda_t* lda, size_t index, const ase_char_t* str, size_t len) | ||||
| { | ||||
| 	size_t i; | ||||
|  | ||||
| 	if (index >= lda->size) return INVALID; | ||||
|  | ||||
| 	for (i = lda->size - index; i-- > 0; )  | ||||
| 	{ | ||||
| 		if (ase_strxncmp ( | ||||
| 			lda->node[i].name.ptr, lda->node[i].name.len,  | ||||
| 			str, len) == 0) return i; | ||||
| 	} | ||||
|  | ||||
| 	return INVALID; | ||||
| } | ||||
|  | ||||
| size_t ase_lda_findx ( | ||||
| 	lda_t* lda, size_t index,  | ||||
| 	const ase_char_t* str, size_t len, | ||||
| 	void(*transform)(size_t, ase_cstr_t*,void*), void* arg) | ||||
| { | ||||
| 	size_t i; | ||||
|  | ||||
| 	for (i = index; i < lda->size; i++)  | ||||
| 	{ | ||||
| 		ase_cstr_t x; | ||||
|  | ||||
| 		x.ptr = lda->node[i].name.ptr; | ||||
| 		x.len = lda->node[i].name.len; | ||||
|  | ||||
| 		transform (i, &x, arg); | ||||
| 		if (ase_strxncmp (x.ptr, x.len, str, len) == 0) return i; | ||||
| 	} | ||||
|  | ||||
| 	return INVALID; | ||||
| } | ||||
|  | ||||
| size_t ase_lda_rfindx ( | ||||
| 	lda_t* lda, size_t index,  | ||||
| 	const ase_char_t* str, size_t len, | ||||
| 	void(*transform)(size_t, ase_cstr_t*,void*), void* arg) | ||||
| { | ||||
| 	size_t i; | ||||
|  | ||||
| 	if (index >= lda->size) return INVALID; | ||||
|  | ||||
| 	for (i = index + 1; i-- > 0; )  | ||||
| 	{ | ||||
| 		ase_cstr_t x; | ||||
|  | ||||
| 		x.ptr = lda->node[i].name.ptr; | ||||
| 		x.len = lda->node[i].name.len; | ||||
|  | ||||
| 		transform (i, &x, arg); | ||||
| 		if (ase_strxncmp (x.ptr, x.len, str, len) == 0) return i; | ||||
| 	} | ||||
|  | ||||
| 	return INVALID; | ||||
| } | ||||
|  | ||||
| size_t ase_lda_rrfindx ( | ||||
| 	lda_t* lda, size_t index, | ||||
| 	const ase_char_t* str, size_t len,  | ||||
| 	void(*transform)(size_t, ase_cstr_t*,void*), void* arg) | ||||
| { | ||||
| 	size_t i; | ||||
|  | ||||
| 	if (index >= lda->size) return INVALID; | ||||
|  | ||||
| 	for (i = lda->size - index; i-- > 0; )  | ||||
| 	{ | ||||
| 		ase_cstr_t x; | ||||
|  | ||||
| 		x.ptr = lda->node[i].name.ptr; | ||||
| 		x.len = lda->node[i].name.len; | ||||
|  | ||||
| 		transform (i, &x, arg); | ||||
| 		if (ase_strxncmp (x.ptr, x.len, str, len) == 0) return i; | ||||
| 	} | ||||
|  | ||||
| 	return INVALID; | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| void* ase_lda_copysimple (lda_t* lda, void* dptr, size_t dlen) | ||||
| { | ||||
| 	return dptr; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user