diff --git a/hio/lib/Makefile.am b/hio/lib/Makefile.am index 26f19db..c55d6d5 100644 --- a/hio/lib/Makefile.am +++ b/hio/lib/Makefile.am @@ -13,6 +13,10 @@ EXTRA_DIST = \ utl-str.c.m4 \ utl-str.m4 +BUILT_SOURCES = \ + hio-utl.h \ + utl-str.c + ################################################## # MAIN LIBRARY ################################################## @@ -140,10 +144,9 @@ install-data-hook: uninstall-hook: @rm -f "$(DESTDIR)$(includedir)/hio-cfg.h" -$(srcdir)/hio-utl.h: utl-str.m4 hio-utl.h.m4 +hio-utl.h: utl-str.m4 hio-utl.h.m4 m4 -I$(srcdir) $(srcdir)/hio-utl.h.m4 > $(srcdir)/hio-utl.h -# do NOT put $(srcdir) before utl-str.c utl-str.c: utl-str.m4 utl-str.c.m4 m4 -I$(srcdir) $(srcdir)/utl-str.c.m4 > $(srcdir)/utl-str.c diff --git a/hio/lib/Makefile.in b/hio/lib/Makefile.in index 286e664..e304ded 100644 --- a/hio/lib/Makefile.in +++ b/hio/lib/Makefile.in @@ -434,6 +434,10 @@ EXTRA_DIST = \ utl-str.c.m4 \ utl-str.m4 +BUILT_SOURCES = \ + hio-utl.h \ + utl-str.c + ################################################## # MAIN LIBRARY @@ -471,7 +475,7 @@ libhio_la_CFLAGS = $(CFLAGS_LIB_COMMON) $(am__append_3) libhio_la_LDFLAGS = $(LDFLAGS_LIB_COMMON) $(am__append_4) libhio_la_LIBADD = $(LIBADD_LIB_COMMON) $(SSL_LIBS) $(SOCKET_LIBS) \ $(SENDFILE_LIBS) $(am__append_5) $(am__append_6) -all: hio-cfg.h +all: $(BUILT_SOURCES) hio-cfg.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: @@ -1053,13 +1057,15 @@ distdir-am: $(DISTFILES) fi; \ done check-am: all-am -check: check-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) hio-cfg.h installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done -install: install-am +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am @@ -1089,6 +1095,7 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ @@ -1246,7 +1253,8 @@ ps-am: uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: all install-am install-data-am install-strip uninstall-am +.MAKE: all check install install-am install-data-am install-strip \ + uninstall-am .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \ @@ -1278,10 +1286,9 @@ install-data-hook: uninstall-hook: @rm -f "$(DESTDIR)$(includedir)/hio-cfg.h" -$(srcdir)/hio-utl.h: utl-str.m4 hio-utl.h.m4 +hio-utl.h: utl-str.m4 hio-utl.h.m4 m4 -I$(srcdir) $(srcdir)/hio-utl.h.m4 > $(srcdir)/hio-utl.h -# do NOT put $(srcdir) before utl-str.c utl-str.c: utl-str.m4 utl-str.c.m4 m4 -I$(srcdir) $(srcdir)/utl-str.c.m4 > $(srcdir)/utl-str.c diff --git a/hio/lib/hio-utl.h b/hio/lib/hio-utl.h index 37d299e..acc67b0 100644 --- a/hio/lib/hio-utl.h +++ b/hio/lib/hio-utl.h @@ -412,6 +412,18 @@ HIO_EXPORT hio_oow_t hio_copy_bchars_to_bcstr_unlimited ( hio_oow_t len ); +HIO_EXPORT hio_oow_t hio_copy_ucstr_to_uchars ( + hio_uch_t* dst, + hio_oow_t dlen, + const hio_uch_t* src +); + +HIO_EXPORT hio_oow_t hio_copy_bcstr_to_bchars ( + hio_bch_t* dst, + hio_oow_t dlen, + const hio_bch_t* src +); + HIO_EXPORT hio_oow_t hio_copy_ucstr ( hio_uch_t* dst, hio_oow_t len, @@ -647,6 +659,17 @@ HIO_EXPORT hio_oow_t hio_byte_to_bcstr ( hio_bch_t fill ); +#define HIO_BYTE_TO_UCSTR_RADIXMASK (0xFF) +#define HIO_BYTE_TO_UCSTR_LOWERCASE (1 << 8) + +HIO_EXPORT hio_oow_t hio_byte_to_ucstr ( + hio_uint8_t byte, + hio_uch_t* buf, + hio_oow_t size, + int flagged_radix, + hio_uch_t fill +); + /* ------------------------------------------------------------------------- */ #define HIO_CHARS_TO_INT_MAKE_OPTION(e,ltrim,rtrim,base) (((!!(e)) << 0) | ((!!(ltrim)) << 2) | ((!!(rtrim)) << 3) | ((base) << 8)) #define HIO_CHARS_TO_INT_GET_OPTION_E(option) ((option) & 1) diff --git a/hio/lib/hio-utl.h.m4 b/hio/lib/hio-utl.h.m4 index 3f880d8..c12eaaa 100644 --- a/hio/lib/hio-utl.h.m4 +++ b/hio/lib/hio-utl.h.m4 @@ -413,6 +413,18 @@ HIO_EXPORT hio_oow_t hio_copy_bchars_to_bcstr_unlimited ( hio_oow_t len ); +HIO_EXPORT hio_oow_t hio_copy_ucstr_to_uchars ( + hio_uch_t* dst, + hio_oow_t dlen, + const hio_uch_t* src +); + +HIO_EXPORT hio_oow_t hio_copy_bcstr_to_bchars ( + hio_bch_t* dst, + hio_oow_t dlen, + const hio_bch_t* src +); + HIO_EXPORT hio_oow_t hio_copy_ucstr ( hio_uch_t* dst, hio_oow_t len, @@ -648,6 +660,17 @@ HIO_EXPORT hio_oow_t hio_byte_to_bcstr ( hio_bch_t fill ); +#define HIO_BYTE_TO_UCSTR_RADIXMASK (0xFF) +#define HIO_BYTE_TO_UCSTR_LOWERCASE (1 << 8) + +HIO_EXPORT hio_oow_t hio_byte_to_ucstr ( + hio_uint8_t byte, + hio_uch_t* buf, + hio_oow_t size, + int flagged_radix, + hio_uch_t fill +); + /* ------------------------------------------------------------------------- */ #define HIO_CHARS_TO_INT_MAKE_OPTION(e,ltrim,rtrim,base) (((!!(e)) << 0) | ((!!(ltrim)) << 2) | ((!!(rtrim)) << 3) | ((base) << 8)) #define HIO_CHARS_TO_INT_GET_OPTION_E(option) ((option) & 1) diff --git a/hio/lib/utl-str.c b/hio/lib/utl-str.c index 39dc6e8..9af25e5 100644 --- a/hio/lib/utl-str.c +++ b/hio/lib/utl-str.c @@ -417,6 +417,38 @@ hio_oow_t hio_copy_bchars_to_bcstr_unlimited (hio_bch_t* dst, const hio_bch_t* s return i; } +hio_oow_t hio_copy_ucstr_to_uchars (hio_uch_t* dst, hio_oow_t len, const hio_uch_t* src) +{ + /* no null termination */ + hio_uch_t* p, * p2; + + p = dst; p2 = dst + len - 1; + + while (p < p2) + { + if (*src == '\0') break; + *p++ = *src++; + } + + return p - dst; +} + +hio_oow_t hio_copy_bcstr_to_bchars (hio_bch_t* dst, hio_oow_t len, const hio_bch_t* src) +{ + /* no null termination */ + hio_bch_t* p, * p2; + + p = dst; p2 = dst + len - 1; + + while (p < p2) + { + if (*src == '\0') break; + *p++ = *src++; + } + + return p - dst; +} + hio_oow_t hio_copy_ucstr (hio_uch_t* dst, hio_oow_t len, const hio_uch_t* src) { hio_uch_t* p, * p2; @@ -431,7 +463,7 @@ hio_oow_t hio_copy_ucstr (hio_uch_t* dst, hio_oow_t len, const hio_uch_t* src) if (len > 0) *p = '\0'; return p - dst; -} +} hio_oow_t hio_copy_bcstr (hio_bch_t* dst, hio_oow_t len, const hio_bch_t* src) { @@ -447,7 +479,7 @@ hio_oow_t hio_copy_bcstr (hio_bch_t* dst, hio_oow_t len, const hio_bch_t* src) if (len > 0) *p = '\0'; return p - dst; -} +} hio_oow_t hio_copy_ucstr_unlimited (hio_uch_t* dst, const hio_uch_t* src) { diff --git a/hio/lib/utl-str.c.m4 b/hio/lib/utl-str.c.m4 index 361a519..679485b 100644 --- a/hio/lib/utl-str.c.m4 +++ b/hio/lib/utl-str.c.m4 @@ -63,6 +63,9 @@ dnl -- fn_copy_chars_to_cstr_unlimited(hio_copy_uchars_to_ucstr_unlimited, hio_uch_t) fn_copy_chars_to_cstr_unlimited(hio_copy_bchars_to_bcstr_unlimited, hio_bch_t) dnl -- +fn_copy_cstr_to_chars(hio_copy_ucstr_to_uchars, hio_uch_t) +fn_copy_cstr_to_chars(hio_copy_bcstr_to_bchars, hio_bch_t) +dnl -- fn_copy_cstr(hio_copy_ucstr, hio_uch_t) fn_copy_cstr(hio_copy_bcstr, hio_bch_t) dnl -- diff --git a/hio/lib/utl-str.m4 b/hio/lib/utl-str.m4 index da17d50..44e32f6 100644 --- a/hio/lib/utl-str.m4 +++ b/hio/lib/utl-str.m4 @@ -221,6 +221,25 @@ hio_oow_t _fn_name_ (_char_type_* dst, const _char_type_* src, hio_oow_t len) popdef([[_fn_name_]])popdef([[_char_type_]])dnl ]])dnl dnl --------------------------------------------------------------------------- +define([[fn_copy_cstr_to_chars]], [[pushdef([[_fn_name_]], $1)pushdef([[_char_type_]], $2)dnl +hio_oow_t _fn_name_ (_char_type_* dst, hio_oow_t len, const _char_type_* src) +{ + /* no null termination */ + _char_type_* p, * p2; + + p = dst; p2 = dst + len - 1; + + while (p < p2) + { + if (*src == '\0') break; + *p++ = *src++; + } + + return p - dst; +} +popdef([[_fn_name_]])popdef([[_char_type_]])dnl +]])dnl +dnl --------------------------------------------------------------------------- define([[fn_copy_cstr]], [[pushdef([[_fn_name_]], $1)pushdef([[_char_type_]], $2)dnl hio_oow_t _fn_name_ (_char_type_* dst, hio_oow_t len, const _char_type_* src) { @@ -236,7 +255,7 @@ hio_oow_t _fn_name_ (_char_type_* dst, hio_oow_t len, const _char_type_* src) if (len > 0) *p = '\0'; return p - dst; -} +} popdef([[_fn_name_]])popdef([[_char_type_]])dnl ]])dnl dnl --------------------------------------------------------------------------- diff --git a/hio/lib/utl.c b/hio/lib/utl.c index b438d8a..3bc24cc 100644 --- a/hio/lib/utl.c +++ b/hio/lib/utl.c @@ -180,6 +180,40 @@ const hio_uch_t* hio_find_ucstr_word_in_ucstr (const hio_uch_t* str, const hio_u /* ========================================================================= */ +hio_oow_t hio_byte_to_ucstr (hio_oob_t byte, hio_uch_t* buf, hio_oow_t size, int flagged_radix, hio_uch_t fill) +{ + hio_uch_t tmp[(HIO_SIZEOF(hio_oob_t) * HIO_BITS_PER_BYTE)]; + hio_uch_t* p = tmp, * bp = buf, * be = buf + size - 1; + int radix; + hio_uch_t radix_char; + + radix = (flagged_radix & HIO_BYTE_TO_UCSTR_RADIXMASK); + radix_char = (flagged_radix & HIO_BYTE_TO_UCSTR_LOWERCASE)? 'a': 'A'; + if (radix < 2 || radix > 36 || size <= 0) return 0; + + do + { + hio_uint8_t digit = byte % radix; + if (digit < 10) *p++ = digit + '0'; + else *p++ = digit + radix_char - 10; + byte /= radix; + } + while (byte > 0); + + if (fill != '\0') + { + while (size - 1 > p - tmp) + { + *bp++ = fill; + size--; + } + } + + while (p > tmp && bp < be) *bp++ = *--p; + *bp = '\0'; + return bp - buf; +} + hio_oow_t hio_byte_to_bcstr (hio_uint8_t byte, hio_bch_t* buf, hio_oow_t size, int flagged_radix, hio_bch_t fill) { hio_bch_t tmp[(HIO_SIZEOF(hio_uint8_t) * HIO_BITS_PER_BYTE)];