added hak_makesymbolwithuchars()/hak_makesymbolwithbchars()/hak_makestringwithuchars()/hak_makestirngwithbchars()
fixed some fpc code related to character type configured
This commit is contained in:
10
lib/err.c
10
lib/err.c
@ -279,7 +279,7 @@ void hak_geterrbinf (hak_t* hak, hak_errbinf_t* errinf)
|
||||
#if defined(HAK_OOCH_IS_BCH)
|
||||
errinf->num = hak->errnum;
|
||||
errinf->loc = hak->errloc;
|
||||
hak_copy_oocstr(errinf->msg, HAK_COUNTOF(errinf->msg), (hak->errmsg[0] == '\0'? hak_errnum_to_errstr(hak->errnum): hak->errmsg));
|
||||
hak_copy_oocstr(errinf->msg, HAK_COUNTOF(errinf->msg), (hak->errmsg.buf[0] == '\0'? hak_errnum_to_errstr(hak->errnum): hak->errmsg.buf));
|
||||
#else
|
||||
const hak_ooch_t* msg;
|
||||
hak_oow_t wcslen, mbslen;
|
||||
@ -313,12 +313,12 @@ void hak_geterruinf (hak_t* hak, hak_erruinf_t* errinf)
|
||||
if (!hak->errloc.file) errinf->loc.file = HAK_NULL;
|
||||
else
|
||||
{
|
||||
wcslen = HAK_COUNTOF(hak->xerrlocfile);
|
||||
hak_conv_bcstr_to_ucstr_with_cmgr(hak->errloc.file, &mbslen, hak->xerrlocfile, &wcslen, hak->_cmgr, 1);
|
||||
errinf->loc.file = hak->xerrlocfile; /* this can be truncated and is transient */
|
||||
wcslen = HAK_COUNTOF(hak->errmsg.xerrlocfile);
|
||||
hak_conv_bcstr_to_ucstr_with_cmgr(hak->errloc.file, &mbslen, hak->errmsg.xerrlocfile, &wcslen, hak->_cmgr, 1);
|
||||
errinf->loc.file = hak->errmsg.xerrlocfile; /* this can be truncated and is transient */
|
||||
}
|
||||
|
||||
msg = (hak->errmsg[0] == '\0')? hak_errnum_to_errstr(hak->errnum): hak->errmsg;
|
||||
msg = (hak->errmsg.buf[0] == '\0')? hak_errnum_to_errstr(hak->errnum): hak->errmsg.buf;
|
||||
wcslen = HAK_COUNTOF(errinf->msg);
|
||||
hak_conv_bcstr_to_ucstr_with_cmgr(msg, &mbslen, errinf->msg, &wcslen, hak->_cmgr, 1);
|
||||
#else
|
||||
|
10
lib/exec.c
10
lib/exec.c
@ -2660,7 +2660,7 @@ static HAK_INLINE int exec_syscmd (hak_t* hak, hak_ooi_t nargs)
|
||||
if (HAK_LIKELY(argv))
|
||||
{
|
||||
argv[0] = cmd;
|
||||
HAK_DEBUG1 (hak, "NARG %d\n", (int)nargs);
|
||||
//HAK_DEBUG1 (hak, "NARG %d\n", (int)nargs);
|
||||
for (i = 0; i < nargs;)
|
||||
{
|
||||
hak_oop_t ta = HAK_STACK_GETARG(hak, nargs, i);
|
||||
@ -2669,17 +2669,21 @@ HAK_DEBUG1 (hak, "NARG %d\n", (int)nargs);
|
||||
{
|
||||
/* TODO: rewrite this part */
|
||||
hak_bch_t tmp[64];
|
||||
snprintf (tmp, sizeof(tmp), "%ld", (long int)HAK_OOP_TO_SMOOI(ta));
|
||||
snprintf(tmp, sizeof(tmp), "%ld", (long int)HAK_OOP_TO_SMOOI(ta));
|
||||
argv[++i] = hak_dupbchars(hak, tmp, strlen(tmp));
|
||||
}
|
||||
else
|
||||
{
|
||||
#if defined(HAK_OOCH_IS_UCH)
|
||||
argv[++i] = hak_dupootobchars(hak, HAK_OBJ_GET_CHAR_SLOT(ta), HAK_OBJ_GET_SIZE(ta), HAK_NULL);
|
||||
#else
|
||||
argv[++i] = hak_dupoochars(hak, HAK_OBJ_GET_CHAR_SLOT(ta), HAK_OBJ_GET_SIZE(ta));
|
||||
#endif
|
||||
}
|
||||
/*HAK_DEBUG2 (hak, "ARG %d -> %hs\n", (int)i - 1, argv[i]);*/
|
||||
}
|
||||
argv[nargs + 1] = HAK_NULL;
|
||||
execvp (xcmd, argv);
|
||||
execvp(xcmd, argv);
|
||||
}
|
||||
|
||||
if (cmd) hak_freemem(hak, cmd);
|
||||
|
@ -1599,11 +1599,23 @@ hak_oop_t hak_makesymbolwithbcstr (
|
||||
const hak_bch_t* ptr
|
||||
);
|
||||
|
||||
hak_oop_t hak_makesymbolwithbchars (
|
||||
hak_t* hak,
|
||||
const hak_bch_t* ptr,
|
||||
hak_oow_t len
|
||||
);
|
||||
|
||||
hak_oop_t hak_makesymbolwithucstr (
|
||||
hak_t* hak,
|
||||
const hak_uch_t* ptr
|
||||
);
|
||||
|
||||
hak_oop_t hak_makesymbolwithuchars (
|
||||
hak_t* hak,
|
||||
const hak_uch_t* ptr,
|
||||
hak_oow_t len
|
||||
);
|
||||
|
||||
hak_oop_t hak_findsymbol (
|
||||
hak_t* hak,
|
||||
const hak_ooch_t* ptr,
|
||||
|
21
lib/hak.h
21
lib/hak.h
@ -213,7 +213,6 @@ typedef enum hak_synerrnum_t hak_synerrnum_t;
|
||||
*/
|
||||
struct hak_errbinf_t
|
||||
{
|
||||
hak_oow_t _instsize;
|
||||
hak_errnum_t num; /**< error number */
|
||||
hak_bch_t msg[HAK_ERRMSG_CAPA]; /**< error message */
|
||||
hak_bloc_t loc; /**< error location */
|
||||
@ -222,7 +221,6 @@ typedef struct hak_errbinf_t hak_errbinf_t;
|
||||
|
||||
struct hak_erruinf_t
|
||||
{
|
||||
hak_oow_t _instsize;
|
||||
hak_errnum_t num; /**< error number */
|
||||
hak_uch_t msg[HAK_ERRMSG_CAPA]; /**< error message */
|
||||
hak_uloc_t loc; /**< error location */
|
||||
@ -2972,6 +2970,18 @@ HAK_EXPORT hak_oop_t hak_makestring (
|
||||
hak_oow_t len
|
||||
);
|
||||
|
||||
HAK_EXPORT hak_oop_t hak_makestringwithuchars (
|
||||
hak_t* hak,
|
||||
const hak_uch_t* ptr,
|
||||
hak_oow_t len
|
||||
);
|
||||
|
||||
HAK_EXPORT hak_oop_t hak_makestringwithbchars (
|
||||
hak_t* hak,
|
||||
const hak_bch_t* ptr,
|
||||
hak_oow_t len
|
||||
);
|
||||
|
||||
HAK_EXPORT hak_oop_t hak_makefpdec (
|
||||
hak_t* hak,
|
||||
hak_oop_t value,
|
||||
@ -3312,8 +3322,9 @@ HAK_EXPORT int hak_convutobcstr (
|
||||
# define hak_dupootobcstr(hak,oocs,bcslen) hak_duputobcstr(hak,oocs,bcslen)
|
||||
# define hak_dupbtooocstr(hak,bcs,oocslen) hak_dupbtoucstr(hak,bcs,oocslen)
|
||||
|
||||
# define hak_dupootoucstr(hak,oocs,ucslen) hak_dupucstr(hak,oocs,ucslen)
|
||||
# define hak_duputooocstr(hak,ucs,oocslen) hak_dupucstr(hak,ucs,oocslen)
|
||||
# define hak_dupootoucstr(hak,oocs,ucslen) hak_dupucstr(hak,oocs,ucslen)
|
||||
# define hak_duputooocstr(hak,ucs,oocslen) hak_dupucstr(hak,ucs,oocslen)
|
||||
|
||||
#else
|
||||
# define hak_dupootoucharswithheadroom(hak,hrb,oocs,oocslen,ucslen) hak_dupbtoucharswithheadroom(hak,hrb,oocs,oocslen,ucslen)
|
||||
# define hak_duputooocharswithheadroom(hak,hrb,ucs,ucslen,oocslen) hak_duputobcharswithheadroom(hak,hrb,ucs,ucslen,oocslen)
|
||||
@ -3393,7 +3404,7 @@ HAK_EXPORT hak_bch_t* hak_duputobcstr (
|
||||
# define hak_dupoocstr(hak,oocs,oocslen) hak_dupucstr(hak,oocs,oocslen)
|
||||
#else
|
||||
# define hak_dupoochars(hak,oocs,oocslen) hak_dupbchars(hak,oocs,oocslen)
|
||||
# define hak_dupoocstr(hak,oocs,oocslen) hak_dupbcstr(hak,oocs,oocslen)
|
||||
# define hak_dupoocstr(hak,oocs,oocslen) hak_dupbcstr(hak,oocs,oocslen)
|
||||
#endif
|
||||
|
||||
HAK_EXPORT hak_uch_t* hak_dupuchars (
|
||||
|
60
lib/obj.c
60
lib/obj.c
@ -438,6 +438,66 @@ hak_oop_t hak_makestring (hak_t* hak, const hak_ooch_t* ptr, hak_oow_t len)
|
||||
return v;
|
||||
}
|
||||
|
||||
hak_oop_t hak_makestringwithuchars (hak_t* hak, const hak_uch_t* ptr, hak_oow_t len)
|
||||
{
|
||||
/* you must provide the payload when calling this variant. it can't figure out
|
||||
* the actual number of hak_ooch_t characters */
|
||||
if (!ptr)
|
||||
{
|
||||
hak_seterrbfmt(hak, HAK_EINVAL,
|
||||
"unable to instantiate %O - null payload", hak->c_string->name);
|
||||
return HAK_NULL;
|
||||
}
|
||||
|
||||
#if defined(HAK_OOCH_IS_UCH)
|
||||
return hak_makestring(hak, ptr, len);
|
||||
#else
|
||||
hak_oow_t xlen;
|
||||
hak_ooch_t* xptr;
|
||||
|
||||
xptr = hak_duputooochars(hak, ptr, len, &xlen);
|
||||
if (HAK_UNLIKELY(!xptr))
|
||||
{
|
||||
const hak_ooch_t* orgmsg = hak_backuperrmsg(hak);
|
||||
hak_seterrbfmt(hak, HAK_ERRNUM(hak),
|
||||
"unable to instantiate %O - %js", hak->c_string->name, orgmsg);
|
||||
return HAK_NULL;
|
||||
}
|
||||
|
||||
return hak_makestring(hak, xptr, xlen);
|
||||
#endif
|
||||
}
|
||||
|
||||
hak_oop_t hak_makestringwithbchars (hak_t* hak, const hak_bch_t* ptr, hak_oow_t len)
|
||||
{
|
||||
/* you must provide the payload when calling this variant. it can't figure out
|
||||
* the actual number of hak_ooch_t characters */
|
||||
if (!ptr)
|
||||
{
|
||||
hak_seterrbfmt(hak, HAK_EINVAL,
|
||||
"unable to instantiate %O - null payload", hak->c_string->name);
|
||||
return HAK_NULL;
|
||||
}
|
||||
|
||||
#if defined(HAK_OOCH_IS_UCH)
|
||||
hak_oow_t xlen;
|
||||
hak_ooch_t* xptr;
|
||||
|
||||
xptr = hak_dupbtooochars(hak, ptr, len, &xlen);
|
||||
if (HAK_UNLIKELY(!xptr))
|
||||
{
|
||||
const hak_ooch_t* orgmsg = hak_backuperrmsg(hak);
|
||||
hak_seterrbfmt(hak, HAK_ERRNUM(hak),
|
||||
"unable to instantiate %O - %js", hak->c_string->name, orgmsg);
|
||||
return HAK_NULL;
|
||||
}
|
||||
|
||||
return hak_makestring(hak, xptr, xlen);
|
||||
#else
|
||||
return hak_makestring(hak, ptr, len);
|
||||
#endif
|
||||
}
|
||||
|
||||
hak_oop_t hak_makefpdec (hak_t* hak, hak_oop_t value, hak_ooi_t scale)
|
||||
{
|
||||
hak_oop_fpdec_t f;
|
||||
|
@ -173,7 +173,7 @@ static HAK_INLINE int print_single_char (hak_t* hak, hak_fmtout_t* fmtout, hak_o
|
||||
#if (HAK_SIZEOF_OOCH_T >= 4)
|
||||
if (chu >= 0x10000u)
|
||||
{
|
||||
if (hak_bfmt_out(fmtout, "\\U%08X", chu) <= -1) return -1;
|
||||
if (hak_bfmt_out(hak, fmtout, "\\U%08X", chu) <= -1) return -1;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
|
@ -3248,7 +3248,11 @@ static void* dlopen_pfmod (hak_t* hak, const hak_ooch_t* name, const hak_ooch_t*
|
||||
{
|
||||
xlen = dirlen;
|
||||
dlen = bufcapa;
|
||||
#if defined(HAK_OOCH_IS_UCH)
|
||||
if (hak_convootobchars(hak, dirptr, &xlen, bufptr, &dlen) <= -1) return HAK_NULL;
|
||||
#else
|
||||
dlen = hak_copy_bchars_to_bcstr(bufptr, bufcapa, dirptr, dirlen);
|
||||
#endif
|
||||
|
||||
if (dlen > 0 && bufptr[dlen - 1] != HAK_DFL_PATH_SEP)
|
||||
{
|
||||
|
36
lib/sym.c
36
lib/sym.c
@ -202,12 +202,29 @@ hak_oop_t hak_makesymbolwithbcstr (hak_t* hak, const hak_bch_t* ptr)
|
||||
#endif
|
||||
}
|
||||
|
||||
hak_oop_t hak_makesymbolwithbchars (hak_t* hak, const hak_bch_t* ptr, hak_oow_t len)
|
||||
{
|
||||
#if defined(HAK_OOCH_IS_UCH)
|
||||
hak_uch_t* ucsptr;
|
||||
hak_oow_t ucslen;
|
||||
hak_oop_t v;
|
||||
/* TODO: no duplication? */
|
||||
ucsptr = hak_dupbtouchars(hak, ptr, len, &ucslen);
|
||||
if (HAK_UNLIKELY(!ucsptr)) return HAK_NULL;
|
||||
v = hak_makesymbol(hak, ucsptr, ucslen);
|
||||
hak_freemem(hak, ucsptr);
|
||||
return v;
|
||||
#else
|
||||
return hak_makesymbol(hak, ptr, len);
|
||||
#endif
|
||||
}
|
||||
|
||||
hak_oop_t hak_makesymbolwithucstr (hak_t* hak, const hak_uch_t* ptr)
|
||||
{
|
||||
#if defined(HAK_OOCH_IS_UCH)
|
||||
return hak_makesymbol(hak, ptr, hak_count_ucstr(ptr));
|
||||
#else
|
||||
hak_uch_t* bcsptr;
|
||||
hak_bch_t* bcsptr;
|
||||
hak_oow_t bcslen;
|
||||
hak_oop_t v;
|
||||
/* TODO: no duplication? */
|
||||
@ -218,3 +235,20 @@ hak_oop_t hak_makesymbolwithucstr (hak_t* hak, const hak_uch_t* ptr)
|
||||
return v;
|
||||
#endif
|
||||
}
|
||||
|
||||
hak_oop_t hak_makesymbolwithuchars (hak_t* hak, const hak_uch_t* ptr, hak_oow_t len)
|
||||
{
|
||||
#if defined(HAK_OOCH_IS_UCH)
|
||||
return hak_makesymbol(hak, ptr, len);
|
||||
#else
|
||||
hak_bch_t* bcsptr;
|
||||
hak_oow_t bcslen;
|
||||
hak_oop_t v;
|
||||
/* TODO: no duplication? */
|
||||
bcsptr = hak_duputobchars(hak, ptr, len, &bcslen);
|
||||
if (HAK_UNLIKELY(!bcsptr)) return HAK_NULL;
|
||||
v = hak_makesymbol(hak, bcsptr, bcslen);
|
||||
hak_freemem(hak, bcsptr);
|
||||
return v;
|
||||
#endif
|
||||
}
|
||||
|
31
lib/xchg.c
31
lib/xchg.c
@ -375,22 +375,13 @@ int hak_unmarshalcode (hak_t* hak, hak_code_t* code, hak_xchg_reader_t rdr, void
|
||||
}
|
||||
nbytes = hak_leoowtoh(w);
|
||||
|
||||
if (b == HAK_XCHG_STRING_U)
|
||||
if (nchars > usym_buf_capa)
|
||||
{
|
||||
ns = hak_makestring(hak, HAK_NULL, nchars);
|
||||
if (HAK_UNLIKELY(!ns)) goto oops;
|
||||
ucsptr = HAK_OBJ_GET_CHAR_PTR(ns, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (nchars > usym_buf_capa)
|
||||
{
|
||||
usym_buf_capa = nchars * HAK_SIZEOF(usym_buf[0]);
|
||||
usym_buf = (hak_uch_t*)hak_allocmem(hak, usym_buf_capa);
|
||||
if (HAK_UNLIKELY(!usym_buf)) goto oops;
|
||||
}
|
||||
ucsptr = usym_buf;
|
||||
usym_buf_capa = nchars * HAK_SIZEOF(usym_buf[0]);
|
||||
usym_buf = (hak_uch_t*)hak_allocmem(hak, usym_buf_capa);
|
||||
if (HAK_UNLIKELY(!usym_buf)) goto oops;
|
||||
}
|
||||
ucsptr = usym_buf;
|
||||
|
||||
ucspos = 0;
|
||||
bcsres = 0;
|
||||
@ -420,14 +411,20 @@ int hak_unmarshalcode (hak_t* hak, hak_code_t* code, hak_xchg_reader_t rdr, void
|
||||
|
||||
HAK_ASSERT(hak, ucspos == nchars);
|
||||
|
||||
if (b != HAK_XCHG_STRING_U)
|
||||
if (b == HAK_XCHG_STRING_U)
|
||||
{
|
||||
ns = hak_makesymbol(hak, usym_buf, nchars);
|
||||
ns = hak_makestringwithuchars(hak, usym_buf, nchars);
|
||||
if (HAK_UNLIKELY(!ns)) goto oops;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* symlit or symbol */
|
||||
ns = hak_makesymbolwithuchars(hak, usym_buf, nchars);
|
||||
if (HAK_UNLIKELY(!ns)) goto oops;
|
||||
|
||||
if (b == HAK_XCHG_SYMBOL_U)
|
||||
{
|
||||
/* form a cons cell */
|
||||
/* form a cons cell */
|
||||
hak_oop_t nc;
|
||||
hak_pushvolat(hak, &ns);
|
||||
nc = hak_makecons(hak, ns, hak->_nil);
|
||||
|
Reference in New Issue
Block a user