added hcl_dupucstr(), hcl_dupbcstr()
This commit is contained in:
parent
9f89bd7c1b
commit
68ad99eca7
20
lib/hcl.h
20
lib/hcl.h
@ -2542,6 +2542,9 @@ HCL_EXPORT int hcl_convutobcstr (
|
||||
# define hcl_dupbtooocstrwithheadroom(hcl,hrb,bcs,oocslen) hcl_dupbtoucstrwithheadroom(hcl,hrb,bcs,oocslen)
|
||||
# define hcl_dupootobcstr(hcl,oocs,bcslen) hcl_duputobcstr(hcl,oocs,bcslen)
|
||||
# define hcl_dupbtooocstr(hcl,bcs,oocslen) hcl_dupbtoucstr(hcl,bcs,oocslen)
|
||||
|
||||
# define hcl_dupootoucstr(hcl,oocs,ucslen) hcl_dupucstr(hcl,oocs,ucslen)
|
||||
# define hcl_duputooocstr(hcl,ucs,oocslen) hcl_dupucstr(hcl,ucs,oocslen)
|
||||
#else
|
||||
# define hcl_dupootoucharswithheadroom(hcl,hrb,oocs,oocslen,ucslen) hcl_dupbtoucharswithheadroom(hcl,hrb,oocs,oocslen,ucslen)
|
||||
# define hcl_duputooocharswithheadroom(hcl,hrb,ucs,ucslen,oocslen) hcl_duputobcharswithheadroom(hcl,hrb,ucs,ucslen,oocslen)
|
||||
@ -2552,6 +2555,9 @@ HCL_EXPORT int hcl_convutobcstr (
|
||||
# define hcl_duputooocstrwithheadroom(hcl,hrb,ucs,oocslen) hcl_duputobcstrwithheadroom(hcl,hrb,ucs,oocslen)
|
||||
# define hcl_dupootoucstr(hcl,oocs,ucslen) hcl_dupbtoucstr(hcl,oocs,ucslen)
|
||||
# define hcl_duputooocstr(hcl,ucs,oocslen) hcl_duputobcstr(hcl,ucs,oocslen)
|
||||
|
||||
# define hcl_dupootobcstr(hcl,oocs,bcslen) hcl_dupbcstr(hcl,oocs,bcslen)
|
||||
# define hcl_dupbtooocstr(hcl,bcs,oocslen) hcl_dupbcstr(hcl,bcs,oocslen)
|
||||
#endif
|
||||
|
||||
|
||||
@ -2615,8 +2621,10 @@ HCL_EXPORT hcl_bch_t* hcl_duputobcstr (
|
||||
|
||||
#if defined(HCL_OOCH_IS_UCH)
|
||||
# define hcl_dupoochars(hcl,oocs,oocslen) hcl_dupuchars(hcl,oocs,oocslen)
|
||||
# define hcl_dupoocstr(hcl,oocs,oocslen) hcl_dupucstr(hcl,oocs,oocslen)
|
||||
#else
|
||||
# define hcl_dupoochars(hcl,oocs,oocslen) hcl_dupbchars(hcl,oocs,oocslen)
|
||||
# define hcl_dupoocstr(hcl,oocs,oocslen) hcl_dupbcstr(hcl,oocs,oocslen)
|
||||
#endif
|
||||
|
||||
HCL_EXPORT hcl_uch_t* hcl_dupuchars (
|
||||
@ -2631,6 +2639,18 @@ HCL_EXPORT hcl_bch_t* hcl_dupbchars (
|
||||
hcl_oow_t bcslen
|
||||
);
|
||||
|
||||
HCL_EXPORT hcl_uch_t* hcl_dupucstr (
|
||||
hcl_t* hcl,
|
||||
const hcl_uch_t* ucs,
|
||||
hcl_oow_t* ucslen
|
||||
);
|
||||
|
||||
HCL_EXPORT hcl_bch_t* hcl_dupbcstr (
|
||||
hcl_t* hcl,
|
||||
const hcl_bch_t* bcs,
|
||||
hcl_oow_t* bcslen
|
||||
);
|
||||
|
||||
/* =========================================================================
|
||||
* ASSERTION SUPPORT
|
||||
* ========================================================================= */
|
||||
|
80
lib/std.c
80
lib/std.c
@ -71,9 +71,22 @@
|
||||
# include <time.h>
|
||||
# include <fcntl.h>
|
||||
# include <io.h>
|
||||
|
||||
# include <errno.h>
|
||||
|
||||
# include <types.h> /* some types for socket.h */
|
||||
# include <sys/socket.h> /* for socketpair */
|
||||
# include <sys/time.h>
|
||||
# include <sys/ioctl.h> /* FIONBIO */
|
||||
# include <nerrno.h> /* for SOCEXXX error codes */
|
||||
|
||||
# define BSD_SELECT
|
||||
# if defined(TCPV40HDRS)
|
||||
# include <sys/select.h>
|
||||
# else
|
||||
# include <unistd.h>
|
||||
# endif
|
||||
|
||||
# define USE_SELECT
|
||||
/* fake XPOLLXXX values */
|
||||
# define XPOLLIN (1 << 0)
|
||||
# define XPOLLOUT (1 << 1)
|
||||
@ -252,6 +265,13 @@
|
||||
# define MUTEX_UNLOCK(x)
|
||||
#endif
|
||||
|
||||
#if defined(USE_SELECT)
|
||||
struct select_fd_t
|
||||
{
|
||||
int fd;
|
||||
int events;
|
||||
};
|
||||
#endif
|
||||
|
||||
typedef struct xtn_t xtn_t;
|
||||
struct xtn_t
|
||||
@ -548,8 +568,9 @@ static void log_write (hcl_t* hcl, hcl_bitmask_t mask, const hcl_ooch_t* msg, hc
|
||||
tmp = localtime(&now);
|
||||
#endif
|
||||
|
||||
#if defined(__BORLANDC__)
|
||||
/* the borland compiler doesn't handle %z properly - it showed 00 all the time */
|
||||
#if defined(__BORLANDC__) || defined(__IBMC__)
|
||||
/* the borland compiler doesn't handle %z properly - it showed 00 all the time.
|
||||
* the visualage compiler 3.0 doesn't support %z */
|
||||
tslen = strftime(ts, sizeof(ts), "%Y-%m-%d %H:%M:%S %Z ", tmp);
|
||||
#else
|
||||
tslen = strftime(ts, sizeof(ts), "%Y-%m-%d %H:%M:%S %z ", tmp);
|
||||
@ -758,6 +779,19 @@ static hcl_errnum_t os2err_to_errnum (APIRET errcode)
|
||||
return HCL_ESYSERR;
|
||||
}
|
||||
}
|
||||
static hcl_errnum_t os2sockerr_to_errnum (int errcode)
|
||||
{
|
||||
switch (errcode)
|
||||
{
|
||||
case SOCEPERM: return HCL_EPERM;
|
||||
case SOCENOENT: return HCL_ENOENT;
|
||||
case SOCEINTR: return HCL_EINTR;
|
||||
case SOCEACCES: return HCL_EACCES;
|
||||
case SOCEINVAL: return HCL_EINVAL;
|
||||
case SOCENOMEM: return HCL_ESYSMEM;
|
||||
case SOCEPIPE: return HCL_EPIPE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(macintosh)
|
||||
@ -789,6 +823,13 @@ static hcl_errnum_t _syserrstrb (hcl_t* hcl, int syserr_type, int syserr_code, h
|
||||
{
|
||||
switch (syserr_type)
|
||||
{
|
||||
case 2:
|
||||
#if defined(__OS2__)
|
||||
if (buf) hcl_copy_bcstr (buf, len, sock_strerror(syserr_code));
|
||||
return os2sockerr_to_errnum(syserr_code);
|
||||
#endif
|
||||
/* fall thru for other platforms */
|
||||
|
||||
case 1:
|
||||
#if defined(_WIN32)
|
||||
if (buf)
|
||||
@ -804,12 +845,17 @@ static hcl_errnum_t _syserrstrb (hcl_t* hcl, int syserr_type, int syserr_code, h
|
||||
return winerr_to_errnum(syserr_code);
|
||||
#elif defined(__OS2__)
|
||||
/* TODO: convert code to string */
|
||||
if (buf) hcl_copy_bcstr (buf, len, "system error");
|
||||
if (buf)
|
||||
{
|
||||
char tmp[64];
|
||||
sprintf (tmp, "system error %d\n", (int)syserr_code);
|
||||
hcl_copy_bcstr (buf, len, tmp);
|
||||
}
|
||||
return os2err_to_errnum(syserr_code);
|
||||
#elif defined(macintosh)
|
||||
/* TODO: convert code to string */
|
||||
if (buf) hcl_copy_bcstr (buf, len, "system error");
|
||||
return os2err_to_errnum(syserr_code);
|
||||
return macerr_to_errnum(syserr_code);
|
||||
#else
|
||||
/* in other systems, errno is still the native system error code.
|
||||
* fall thru */
|
||||
@ -2127,8 +2173,13 @@ static void vm_muxwait (hcl_t* hcl, const hcl_ntime_t* dur, hcl_vmprim_muxwait_c
|
||||
|
||||
if (n <= -1)
|
||||
{
|
||||
#if defined(__OS2__)
|
||||
hcl_seterrwithsyserr (hcl, 2, sock_errno());
|
||||
HCL_DEBUG2 (hcl, "Warning: multiplexer wait failure - %d, %js\n", sock_errno(), hcl_geterrmsg(hcl));
|
||||
#else
|
||||
hcl_seterrwithsyserr (hcl, 0, errno);
|
||||
HCL_DEBUG2 (hcl, "Warning: multiplexer wait failure - %d, %js\n", errno, hcl_geterrmsg(hcl));
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -2704,12 +2755,16 @@ static void cb_opt_set (hcl_t* hcl, hcl_option_t id, const void* value)
|
||||
|
||||
static int open_pipes (hcl_t* hcl, int p[2])
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
u_long flags;
|
||||
#else
|
||||
int flags;
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32)
|
||||
if (_pipe(p, 256, _O_BINARY | _O_NOINHERIT) == -1)
|
||||
#elif defined(__OS2__)
|
||||
if (_pipe(p, 256, 10) == -1)
|
||||
if (socketpair(AF_LOCAL, SOCK_STREAM, 0, p) == -1)
|
||||
#elif defined(HAVE_PIPE2) && defined(O_CLOEXEC) && defined(O_NONBLOCK)
|
||||
if (pipe2(p, O_CLOEXEC | O_NONBLOCK) == -1)
|
||||
#else
|
||||
@ -2720,7 +2775,15 @@ static int open_pipes (hcl_t* hcl, int p[2])
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if defined(HAVE_PIPE2) && defined(O_CLOEXEC) && defined(O_NONBLOCK)
|
||||
#if defined(_WIN32)
|
||||
flags = 1;
|
||||
ioctl (p[0], FIONBIO, &flags);
|
||||
ioctl (p[1], FIONBIO, &flags);
|
||||
#elif defined(__OS2__)
|
||||
flags = 1; /* don't block */
|
||||
ioctl (p[0], FIONBIO, &flags, HCL_SIZEOF(flags));
|
||||
ioctl (p[1], FIONBIO, &flags, HCL_SIZEOF(flags));
|
||||
#elif defined(HAVE_PIPE2) && defined(O_CLOEXEC) && defined(O_NONBLOCK)
|
||||
/* do nothing */
|
||||
#else
|
||||
#if defined(FD_CLOEXEC)
|
||||
@ -2745,6 +2808,9 @@ static void close_pipes (hcl_t* hcl, int p[2])
|
||||
#if defined(_WIN32)
|
||||
_close (p[0]);
|
||||
_close (p[1]);
|
||||
#elif defined(__OS2__)
|
||||
soclose (p[0]);
|
||||
soclose (p[1]);
|
||||
#else
|
||||
close (p[0]);
|
||||
close (p[1]);
|
||||
|
26
lib/utl.c
26
lib/utl.c
@ -984,6 +984,32 @@ hcl_bch_t* hcl_dupbchars (hcl_t* hcl, const hcl_bch_t* bcs, hcl_oow_t bcslen)
|
||||
return ptr;
|
||||
}
|
||||
|
||||
hcl_uch_t* hcl_dupucstr (hcl_t* hcl, const hcl_uch_t* ucs, hcl_oow_t* ucslen)
|
||||
{
|
||||
hcl_oow_t len;
|
||||
hcl_uch_t* ptr;
|
||||
|
||||
len = hcl_count_ucstr(ucs);
|
||||
ptr = hcl_dupuchars(hcl, ucs, len);
|
||||
if (HCL_UNLIKELY(!ptr)) return HCL_NULL;
|
||||
|
||||
if (ucslen) *ucslen = len;
|
||||
return ptr;
|
||||
}
|
||||
|
||||
hcl_bch_t* hcl_dupbcstr (hcl_t* hcl, const hcl_bch_t* bcs, hcl_oow_t* bcslen)
|
||||
{
|
||||
hcl_oow_t len;
|
||||
hcl_bch_t* ptr;
|
||||
|
||||
len = hcl_count_bcstr(bcs);
|
||||
ptr = hcl_dupbchars(hcl, bcs, len);
|
||||
if (HCL_UNLIKELY(!ptr)) return HCL_NULL;
|
||||
|
||||
if (bcslen) *bcslen = len;
|
||||
return ptr;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
void hcl_add_ntime (hcl_ntime_t* z, const hcl_ntime_t* x, const hcl_ntime_t* y)
|
||||
|
Loading…
Reference in New Issue
Block a user