adding HAWK_MODLIBDIR
This commit is contained in:
		| @ -209,7 +209,7 @@ struct hawk_t | |||||||
| 	struct | 	struct | ||||||
| 	{ | 	{ | ||||||
| 		int trait; | 		int trait; | ||||||
| 		hawk_oocs_t mod[2]; | 		hawk_oocs_t mod[3]; | ||||||
| 		hawk_oocs_t incldirs; | 		hawk_oocs_t incldirs; | ||||||
|  |  | ||||||
| 		union | 		union | ||||||
|  | |||||||
| @ -461,6 +461,7 @@ int hawk_setopt (hawk_t* hawk, hawk_opt_t id, const void* value) | |||||||
| 			hawk->opt.trait = *(const int*)value; | 			hawk->opt.trait = *(const int*)value; | ||||||
| 			return 0; | 			return 0; | ||||||
|  |  | ||||||
|  | 		case HAWK_MODLIBDIR: | ||||||
| 		case HAWK_MODPREFIX: | 		case HAWK_MODPREFIX: | ||||||
| 		case HAWK_MODPOSTFIX: | 		case HAWK_MODPOSTFIX: | ||||||
| 		{ | 		{ | ||||||
| @ -469,7 +470,7 @@ int hawk_setopt (hawk_t* hawk, hawk_opt_t id, const void* value) | |||||||
|  |  | ||||||
| 			if (dup_str_opt(hawk, value, &tmp) <= -1) return -1; | 			if (dup_str_opt(hawk, value, &tmp) <= -1) return -1; | ||||||
|  |  | ||||||
| 			idx = id - HAWK_MODPREFIX; | 			idx = id - HAWK_MODLIBDIR; | ||||||
| 			if (hawk->opt.mod[idx].ptr) hawk_freemem (hawk, hawk->opt.mod[idx].ptr); | 			if (hawk->opt.mod[idx].ptr) hawk_freemem (hawk, hawk->opt.mod[idx].ptr); | ||||||
|  |  | ||||||
| 			hawk->opt.mod[idx] = tmp; | 			hawk->opt.mod[idx] = tmp; | ||||||
| @ -524,9 +525,10 @@ int hawk_getopt (hawk_t* hawk, hawk_opt_t id, void* value) | |||||||
| 			*(int*)value = hawk->opt.trait; | 			*(int*)value = hawk->opt.trait; | ||||||
| 			return 0; | 			return 0; | ||||||
|  |  | ||||||
|  | 		case HAWK_MODLIBDIR: | ||||||
| 		case HAWK_MODPREFIX: | 		case HAWK_MODPREFIX: | ||||||
| 		case HAWK_MODPOSTFIX: | 		case HAWK_MODPOSTFIX: | ||||||
| 			*(const hawk_ooch_t**)value = hawk->opt.mod[id - HAWK_MODPREFIX].ptr; | 			*(const hawk_ooch_t**)value = hawk->opt.mod[id - HAWK_MODLIBDIR].ptr; | ||||||
| 			return 0; | 			return 0; | ||||||
|  |  | ||||||
| 		case HAWK_INCLUDEDIRS: | 		case HAWK_INCLUDEDIRS: | ||||||
|  | |||||||
| @ -481,6 +481,7 @@ typedef struct hawk_mod_spec_t hawk_mod_spec_t; | |||||||
|  |  | ||||||
| struct hawk_mod_spec_t | struct hawk_mod_spec_t | ||||||
| { | { | ||||||
|  | 	const hawk_ooch_t* libdir; | ||||||
| 	const hawk_ooch_t* prefix; | 	const hawk_ooch_t* prefix; | ||||||
| 	const hawk_ooch_t* postfix; | 	const hawk_ooch_t* postfix; | ||||||
| 	const hawk_ooch_t* name; | 	const hawk_ooch_t* name; | ||||||
| @ -1143,6 +1144,7 @@ enum hawk_opt_t | |||||||
| 	/** trait option. 0 or bitwise-ORed of ::hawk_trait_t values */ | 	/** trait option. 0 or bitwise-ORed of ::hawk_trait_t values */ | ||||||
| 	HAWK_TRAIT,   | 	HAWK_TRAIT,   | ||||||
|  |  | ||||||
|  | 	HAWK_MODLIBDIR, | ||||||
| 	HAWK_MODPREFIX, | 	HAWK_MODPREFIX, | ||||||
| 	HAWK_MODPOSTFIX, | 	HAWK_MODPOSTFIX, | ||||||
|  |  | ||||||
|  | |||||||
| @ -26,6 +26,10 @@ | |||||||
|  |  | ||||||
| #include "hawk-prv.h" | #include "hawk-prv.h" | ||||||
|  |  | ||||||
|  | #if !defined(HAWK_DEFAULT_MODLIBDIR) | ||||||
|  | #	define HAWK_DEFAULT_MODLIBDIR "" | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #if !defined(HAWK_DEFAULT_MODPREFIX) | #if !defined(HAWK_DEFAULT_MODPREFIX) | ||||||
| #	if defined(_WIN32) | #	if defined(_WIN32) | ||||||
| #		define HAWK_DEFAULT_MODPREFIX "hawk-" | #		define HAWK_DEFAULT_MODPREFIX "hawk-" | ||||||
| @ -7336,33 +7340,51 @@ static hawk_mod_t* query_module (hawk_t* awk, const hawk_oocs_t segs[], int nseg | |||||||
| 			goto done; | 			goto done; | ||||||
| 		} | 		} | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | 		if (!awk->prm.modopen || !awk->prm.modgetsym || !awk->prm.modclose) | ||||||
|  | 		{ | ||||||
|  | 			hawk_seterrfmt (awk, HAWK_NULL, HAWK_EINVAL, HAWK_T("module callbacks not set properly")); | ||||||
|  | 			goto open_fail; | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		hawk_seterrnum (awk, HAWK_NULL, HAWK_ENOERR); | 		hawk_seterrnum (awk, HAWK_NULL, HAWK_ENOERR); | ||||||
|  |  | ||||||
| 		/* attempt to find an external module */ | 		/* attempt to find an external module */ | ||||||
| 		HAWK_MEMSET (&spec, 0, HAWK_SIZEOF(spec)); | 		HAWK_MEMSET (&spec, 0, HAWK_SIZEOF(spec)); | ||||||
| 		if (awk->opt.mod[0].len > 0) | 		if (awk->opt.mod[0].len > 0) | ||||||
| 			spec.prefix = awk->opt.mod[0].ptr; | 			spec.libdir = awk->opt.mod[0].ptr; | ||||||
| 		else spec.prefix = HAWK_T(HAWK_DEFAULT_MODPREFIX); | 		else | ||||||
|  | 			spec.libdir = HAWK_T(HAWK_DEFAULT_MODLIBDIR); | ||||||
|  |  | ||||||
| 		if (awk->opt.mod[1].len > 0) | 		if (awk->opt.mod[1].len > 0) | ||||||
| 			spec.postfix = awk->opt.mod[1].ptr; | 			spec.prefix = awk->opt.mod[1].ptr; | ||||||
|  | 		else spec.prefix = HAWK_T(HAWK_DEFAULT_MODPREFIX); | ||||||
|  |  | ||||||
|  | 		if (awk->opt.mod[2].len > 0) | ||||||
|  | 			spec.postfix = awk->opt.mod[2].ptr; | ||||||
| 		else spec.postfix = HAWK_T(HAWK_DEFAULT_MODPOSTFIX); | 		else spec.postfix = HAWK_T(HAWK_DEFAULT_MODPOSTFIX); | ||||||
|  |  | ||||||
| 		HAWK_MEMSET (&md, 0, HAWK_SIZEOF(md)); | 		HAWK_MEMSET (&md, 0, HAWK_SIZEOF(md)); | ||||||
| 		spec.name = segs[0].ptr; | 		spec.name = segs[0].ptr; | ||||||
| 		md.handle = HAWK_NULL; | 		do | ||||||
| 		if (awk->prm.modopen && awk->prm.modgetsym && awk->prm.modclose) |  | ||||||
| 		{ | 		{ | ||||||
| 			md.handle = awk->prm.modopen(awk, &spec); | 			hawk_ooch_t* colon; | ||||||
| 		} |  | ||||||
| 		else  |  | ||||||
| 		{ |  | ||||||
| 			hawk_seterrfmt (awk, HAWK_NULL, HAWK_EINVAL, HAWK_T("module callbacks not set properly")); |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if (md.handle == HAWK_NULL)  | 			colon = hawk_find_oochar_in_oocstr(spec.libdir, ':'); | ||||||
|  | 			if (colon) *colon = '\0'; | ||||||
|  |  | ||||||
|  | 			md.handle = awk->prm.modopen(awk, &spec); | ||||||
|  | 			if (!colon) break; | ||||||
|  |  | ||||||
|  | 			*colon = ':'; | ||||||
|  | 		} | ||||||
|  | 		while (!md.handle); | ||||||
|  |  | ||||||
|  | 		if (!md.handle) | ||||||
| 		{ | 		{ | ||||||
| 			const hawk_ooch_t* bem = hawk_backuperrmsg(awk); | 			const hawk_ooch_t* bem; | ||||||
|  | 		open_fail: | ||||||
|  | 			bem = hawk_backuperrmsg(awk); | ||||||
| 			hawk_seterrfmt (awk, HAWK_NULL, HAWK_ENOENT, HAWK_T("'%js%js%js' for module '%js' not found - %js"),  | 			hawk_seterrfmt (awk, HAWK_NULL, HAWK_ENOENT, HAWK_T("'%js%js%js' for module '%js' not found - %js"),  | ||||||
| 				(spec.prefix? spec.prefix: HAWK_T("")), spec.name, (spec.postfix? spec.postfix: HAWK_T("")), spec.name, bem); | 				(spec.prefix? spec.prefix: HAWK_T("")), spec.name, (spec.postfix? spec.postfix: HAWK_T("")), spec.name, bem); | ||||||
| 			return HAWK_NULL; | 			return HAWK_NULL; | ||||||
|  | |||||||
| @ -307,10 +307,19 @@ void* hawk_stdmodopen (hawk_t* awk, const hawk_mod_spec_t* spec) | |||||||
| 	void* h; | 	void* h; | ||||||
| 	lt_dladvise adv; | 	lt_dladvise adv; | ||||||
| 	hawk_bch_t* modpath; | 	hawk_bch_t* modpath; | ||||||
| 	const hawk_ooch_t* tmp[4]; | 	const hawk_ooch_t* tmp[6]; | ||||||
| 	int count; | 	int count; | ||||||
|  | 	static hawk_ooch_t ds[] = { '/', '\0' }; | ||||||
|  |  | ||||||
| 	count = 0; | 	count = 0; | ||||||
|  | 	if (spec->libdir)  | ||||||
|  | 	{ | ||||||
|  | 		hawk_oow_t len; | ||||||
|  |  | ||||||
|  | 		tmp[count++] = spec->libdir; | ||||||
|  | 		len = hawk_count_oocstr(spec->libdir); | ||||||
|  | 		if (len > 0 && spec->libdir[len - 1] != '/') tmp[count++] = ds; | ||||||
|  | 	} | ||||||
| 	if (spec->prefix) tmp[count++] = spec->prefix; | 	if (spec->prefix) tmp[count++] = spec->prefix; | ||||||
| 	tmp[count++] = spec->name; | 	tmp[count++] = spec->name; | ||||||
| 	if (spec->postfix) tmp[count++] = spec->postfix; | 	if (spec->postfix) tmp[count++] = spec->postfix; | ||||||
| @ -344,10 +353,22 @@ void* hawk_stdmodopen (hawk_t* awk, const hawk_mod_spec_t* spec) | |||||||
|  |  | ||||||
| 	HMODULE h; | 	HMODULE h; | ||||||
| 	hawk_ooch_t* modpath; | 	hawk_ooch_t* modpath; | ||||||
| 	const hawk_ooch_t* tmp[4]; | 	const hawk_ooch_t* tmp[6]; | ||||||
| 	int count; | 	int count; | ||||||
|  | 	static hawk_ooch_t ds[][2] = { { '\\', '\0' }, { '/', '\0' } } | ||||||
|  |                                        false 0              treu 1 | ||||||
| 	count = 0; | 	count = 0; | ||||||
|  | 	if (spec->libdir)  | ||||||
|  | 	{ | ||||||
|  | 		hawk_oow_t len; | ||||||
|  |  | ||||||
|  | 		tmp[count++] = spec->libdir; | ||||||
|  | 		len = hawk_count_oocstr(spec->libdir); | ||||||
|  | 		if (len > 0 && (spec->libdir[len - 1] != '/' && spec->libdir[len - 1] != '\\'))  | ||||||
|  | 		{ | ||||||
|  | 			tmp[count++] = ds[hawk_find_oochar_in_oocstr(spec->libdir, '/') != HAWK_NULL]; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| 	if (spec->prefix) tmp[count++] = spec->prefix; | 	if (spec->prefix) tmp[count++] = spec->prefix; | ||||||
| 	tmp[count++] = spec->name; | 	tmp[count++] = spec->name; | ||||||
| 	if (spec->postfix) tmp[count++] = spec->postfix; | 	if (spec->postfix) tmp[count++] = spec->postfix; | ||||||
| @ -368,12 +389,21 @@ void* hawk_stdmodopen (hawk_t* awk, const hawk_mod_spec_t* spec) | |||||||
|  |  | ||||||
| 	HMODULE h; | 	HMODULE h; | ||||||
| 	hawk_bch_t* modpath; | 	hawk_bch_t* modpath; | ||||||
| 	const hawk_ooch_t* tmp[4]; | 	const hawk_ooch_t* tmp[6]; | ||||||
| 	int count; | 	int count; | ||||||
| 	char errbuf[CCHMAXPATH]; | 	char errbuf[CCHMAXPATH]; | ||||||
| 	APIRET rc; | 	APIRET rc; | ||||||
|  | 	static hawk_ooch_t ds[] = { '\\', '\0' }; | ||||||
|  |  | ||||||
| 	count = 0; | 	count = 0; | ||||||
|  | 	if (spec->libdir)  | ||||||
|  | 	{ | ||||||
|  | 		hawk_oow_t len; | ||||||
|  |  | ||||||
|  | 		tmp[count++] = spec->libdir; | ||||||
|  | 		len = hawk_count_oocstr(spec->libdir); | ||||||
|  | 		if (len > 0 && spec->libdir[len - 1] != '\\') tmp[count++] = ds; | ||||||
|  | 	} | ||||||
| 	if (spec->prefix) tmp[count++] = spec->prefix; | 	if (spec->prefix) tmp[count++] = spec->prefix; | ||||||
| 	tmp[count++] = spec->name; | 	tmp[count++] = spec->name; | ||||||
| 	if (spec->postfix) tmp[count++] = spec->postfix; | 	if (spec->postfix) tmp[count++] = spec->postfix; | ||||||
| @ -407,10 +437,19 @@ void* hawk_stdmodopen (hawk_t* awk, const hawk_mod_spec_t* spec) | |||||||
| 	 * when building for DOS. */ | 	 * when building for DOS. */ | ||||||
| 	void* h; | 	void* h; | ||||||
| 	hawk_bch_t* modpath; | 	hawk_bch_t* modpath; | ||||||
| 	const hawk_ooch_t* tmp[4]; | 	const hawk_ooch_t* tmp[6]; | ||||||
| 	int count; | 	int count; | ||||||
|  | 	static hawk_ooch_t ds[] = { '\\', '\0' }; | ||||||
|  |  | ||||||
| 	count = 0; | 	count = 0; | ||||||
|  | 	if (spec->libdir)  | ||||||
|  | 	{ | ||||||
|  | 		hawk_oow_t len; | ||||||
|  |  | ||||||
|  | 		tmp[count++] = spec->libdir; | ||||||
|  | 		len = hawk_count_oocstr(spec->libdir); | ||||||
|  | 		if (len > 0 && spec->libdir[len - 1] != '/') tmp[count++] = ds; | ||||||
|  | 	} | ||||||
| 	if (spec->prefix) tmp[count++] = spec->prefix; | 	if (spec->prefix) tmp[count++] = spec->prefix; | ||||||
| 	tmp[count++] = spec->name; | 	tmp[count++] = spec->name; | ||||||
| 	if (spec->postfix) tmp[count++] = spec->postfix; | 	if (spec->postfix) tmp[count++] = spec->postfix; | ||||||
| @ -434,10 +473,19 @@ void* hawk_stdmodopen (hawk_t* awk, const hawk_mod_spec_t* spec) | |||||||
| #elif defined(USE_DLFCN) | #elif defined(USE_DLFCN) | ||||||
| 	void* h; | 	void* h; | ||||||
| 	hawk_bch_t* modpath; | 	hawk_bch_t* modpath; | ||||||
| 	const hawk_ooch_t* tmp[4]; | 	const hawk_ooch_t* tmp[6]; | ||||||
| 	int count; | 	int count; | ||||||
|  | 	static hawk_ooch_t ds[] = { '/', '\0' }; | ||||||
|  |  | ||||||
| 	count = 0; | 	count = 0; | ||||||
|  | 	if (spec->libdir)  | ||||||
|  | 	{ | ||||||
|  | 		hawk_oow_t len; | ||||||
|  |  | ||||||
|  | 		tmp[count++] = spec->libdir; | ||||||
|  | 		len = hawk_count_oocstr(spec->libdir); | ||||||
|  | 		if (len > 0 && spec->libdir[len - 1] != '/') tmp[count++] = ds; | ||||||
|  | 	} | ||||||
| 	if (spec->prefix) tmp[count++] = spec->prefix; | 	if (spec->prefix) tmp[count++] = spec->prefix; | ||||||
| 	tmp[count++] = spec->name; | 	tmp[count++] = spec->name; | ||||||
| 	if (spec->postfix) tmp[count++] = spec->postfix; | 	if (spec->postfix) tmp[count++] = spec->postfix; | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user