diff --git a/lib/bigint.c b/lib/bigint.c index f860df4..44ba090 100644 --- a/lib/bigint.c +++ b/lib/bigint.c @@ -40,7 +40,8 @@ #define IS_SIGN_DIFF(x,y) (((x) ^ (y)) < 0) /* digit character array */ -static char _digitc[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +static char _digitc_upper[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +static char _digitc_lower[] = "0123456789abcdefghijklmnopqrstuvwxyz"; /* exponent table */ static hcl_uint8_t _exp_tab[] = @@ -3761,6 +3762,19 @@ oops_einval: static hcl_oow_t oow_to_text (hcl_t* hcl, hcl_oow_t w, int radix, hcl_ooch_t* buf) { hcl_ooch_t* ptr; + const char* _digitc; + + if (radix < 0) + { + + _digitc = _digitc_lower; + radix = -radix; + } + else + { + _digitc = _digitc_upper; + } + HCL_ASSERT (hcl, radix >= 2 && radix <= 36); ptr = buf; @@ -3955,6 +3969,18 @@ hcl_oop_t hcl_inttostr (hcl_t* hcl, hcl_oop_t num, int radix, int ngc) hcl_ooch_t* xbuf = HCL_NULL; hcl_oow_t xlen = 0, seglen, reqcapa; + const char* _digitc; + int orgradix = radix; + + if (radix < 0) + { + _digitc = _digitc_lower; + radix = -radix; + } + else + { + _digitc = _digitc_upper; + } HCL_ASSERT (hcl, radix >= 2 && radix <= 36); if (!hcl_isint(hcl,num)) goto oops_einval; @@ -3980,7 +4006,7 @@ hcl_oop_t hcl_inttostr (hcl_t* hcl, hcl_oop_t num, int radix, int ngc) xbuf = hcl->inttostr.xbuf.ptr; } - xlen = oow_to_text(hcl, w, radix, xbuf); + xlen = oow_to_text(hcl, w, orgradix, xbuf); if (v < 0) xbuf[xlen++] = '-'; reverse_string (xbuf, xlen); @@ -4144,7 +4170,7 @@ hcl_oop_t hcl_inttostr (hcl_t* hcl, hcl_oop_t num, int radix, int ngc) #else # error UNSUPPORTED LIW BIT SIZE #endif - seglen = oow_to_text (hcl, w, radix, &xbuf[xlen]); + seglen = oow_to_text (hcl, w, orgradix, &xbuf[xlen]); xlen += seglen; if (r == a) break; /* reached the last block */ diff --git a/lib/hcl-prv.h b/lib/hcl-prv.h index 88429b8..589010d 100644 --- a/lib/hcl-prv.h +++ b/lib/hcl-prv.h @@ -1063,6 +1063,10 @@ int hcl_outfmtobj ( hcl_outbfmt_t outbfmt ); +int hcl_printfmt ( + hcl_t* hcl, + hcl_ooi_t nargs +); #if defined(__cplusplus) } diff --git a/lib/ignite.c b/lib/ignite.c deleted file mode 100644 index 6d4abc7..0000000 --- a/lib/ignite.c +++ /dev/null @@ -1,28 +0,0 @@ -/* - * $Id$ - * - Copyright (c) 2016-2018 Chung, Hyung-Hwan. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "hcl-prv.h" - diff --git a/lib/logfmt.c b/lib/logfmt.c index a23ae7e..8ce2b0c 100644 --- a/lib/logfmt.c +++ b/lib/logfmt.c @@ -724,6 +724,9 @@ void hcl_seterrufmtv (hcl_t* hcl, hcl_errnum_t errnum, const hcl_uch_t* fmt, va_ * -------------------------------------------------------------------------- */ #if 1 + + +#if 0 static int put_formatted_chars (hcl_t* hcl, int mask, const hcl_ooch_t ch, hcl_oow_t len) { /* TODO: better error handling, buffering. @@ -766,12 +769,12 @@ static int put_formatted_string (hcl_t* hcl, int mask, const hcl_ooch_t* ptr, hc if (n == 0) return 0; /* eof. stop printing */ return 1; /* success */ } - +#endif #define PRINT_OOCH(c,n) do { \ if (n > 0) { \ int xx; \ - if ((xx = put_formatted_chars(hcl, data->mask, c, n)) <= -1) goto oops; \ + if ((xx = put_prch(hcl, data->mask, c, n)) <= -1) goto oops; \ if (xx == 0) goto done; \ data->count += n; \ } \ @@ -780,7 +783,7 @@ static int put_formatted_string (hcl_t* hcl, int mask, const hcl_ooch_t* ptr, hc #define PRINT_OOCS(ptr,len) do { \ if (len > 0) { \ int xx; \ - if ((xx = put_formatted_string(hcl, data->mask, ptr, len)) <= -1) goto oops; \ + if ((xx = put_prcs(hcl, data->mask, ptr, len)) <= -1) goto oops; \ if (xx == 0) goto done; \ data->count += len; \ } \ @@ -789,8 +792,9 @@ static int put_formatted_string (hcl_t* hcl, int mask, const hcl_ooch_t* ptr, hc static HCL_INLINE int print_formatted (hcl_t* hcl, hcl_ooi_t nargs, hcl_fmtout_t* data) { hcl_oop_char_t fmtoop; + hcl_ooch_t* fmt, * fmtend; + const hcl_ooch_t* checkpoint, * percent; - //hcl_bch_t nbuf[MAXNBUF], bch; int n, base, neg, sign; hcl_ooi_t tmp, width, precision; hcl_ooch_t ch, padc, ooch; @@ -798,9 +802,6 @@ static HCL_INLINE int print_formatted (hcl_t* hcl, hcl_ooi_t nargs, hcl_fmtout_t hcl_uintmax_t num = 0; int stop = 0; - hcl_ooch_t* fmt, * fmtend; - const hcl_ooch_t* checkpoint, * percent; - hcl_oop_t arg; hcl_ooi_t argidx = 0; @@ -833,7 +834,6 @@ static HCL_INLINE int print_formatted (hcl_t* hcl, hcl_ooi_t nargs, hcl_fmtout_t neg = 0; sign = 0; lm_flag = 0; lm_dflag = 0; flagc = 0; - //sprintn = sprintn_lower; reswitch: switch (ch = *fmt++) @@ -963,10 +963,11 @@ reswitch: base = 10; goto number; case 'X': - //sprintn = sprintn_upper; /* TODO: handle this */ - case 'x': base = 16; goto number; + case 'x': + base = -16; + goto number; case 'b': base = 2; goto number; @@ -979,7 +980,6 @@ reswitch: /* zeropad must not take effect for 'c' */ if (flagc & FLAGC_ZEROPAD) padc = ' '; - //bch = HCL_SIZEOF(hcl_bch_t) < HCL_SIZEOF(int)? va_arg(ap, int): va_arg(ap, hcl_bch_t); arg = HCL_STACK_GETARG(hcl, nargs, argidx); argidx++; if (!HCL_OOP_IS_CHAR(arg)) { @@ -1038,7 +1038,7 @@ reswitch: arg = HCL_STACK_GETARG(hcl, nargs, argidx); argidx++; if (HCL_OOP_IS_CHAR(arg)) arg = HCL_SMOOI_TO_OOP(HCL_OOP_TO_CHAR(arg)); - + if (!hcl_inttostr(hcl, arg, base, -1)) { hcl_seterrbfmt (hcl, HCL_EINVAL, "not a valid number - %O", arg); @@ -1116,7 +1116,7 @@ reswitch: PRINT_OOCH (padc, width); } - //while (*nbufp) PRINT_OOCH (*nbufp--, 1); /* output actual digits */ + /*while (*nbufp) PRINT_OOCH (*nbufp--, 1);*/ /* output actual digits */ PRINT_OOCS (nsptr, nslen); if ((flagc & FLAGC_LEFTADJ) && width > 0 && (width -= tmp) > 0) @@ -1158,10 +1158,11 @@ oops: return -1; } -int hcl_print_formatted (hcl_t* hcl, hcl_ooi_t nargs) +int hcl_printfmt (hcl_t* hcl, hcl_ooi_t nargs) { hcl_fmtout_t fo; HCL_MEMSET (&fo, 0, HCL_SIZEOF(fo)); - return print_formatted (hcl, nargs, &fo); + return print_formatted(hcl, nargs, &fo); } + #endif diff --git a/lib/prim.c b/lib/prim.c index 5228350..17caf2d 100644 --- a/lib/prim.c +++ b/lib/prim.c @@ -394,7 +394,7 @@ static hcl_pfrc_t pf_printf (hcl_t* hcl, hcl_mod_t* mod, hcl_ooi_t nargs) return HCL_PF_SUCCESS; } - if (hcl_print_formatted(hcl, nargs) <= -1) + if (hcl_printfmt(hcl, nargs) <= -1) { HCL_STACK_SETRETTOERRNUM (hcl, nargs); }