Edit

kc3-lang/kc3/libkc3/buf_inspect_u64.c

Branch :

  • libkc3/buf_inspect_u64.c
  • /* kc3
     * Copyright from 2022 to 2026 kmx.io <contact@kmx.io>
     *
     * Permission is hereby granted to use this software granted the above
     * copyright notice and this permission paragraph are included in all
     * copies and substantial portions of this software.
     *
     * THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
     * PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
     * AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
     * THIS SOFTWARE.
     */
    /* Gen from buf_inspect_u.c.in BITS=64 bits=64 */
    #include <string.h>
    #include "alloc.h"
    #include "buf.h"
    #include "buf_inspect.h"
    #include "buf_save.h"
    #include "cast.h"
    #include "kc3_main.h"
    #include "str.h"
    #include "sym.h"
    
    sw buf_inspect_u64 (s_buf *buf, u64 x)
    {
      sw r;
      sw result = 0;
      if (g_buf_inspect_type != &g_sym_U64 &&
          cast_needed_u64(x)) {
        if ((r = buf_inspect_paren_sym(buf, &g_sym_U64)) < 0)
          return r;
        result += r;
        if ((r = buf_write_1(buf, " ")) < 0)
          return r;
        result += r;
      }
      if ((r = buf_inspect_u64_base(buf, &g_kc3_base_decimal,
                                        x)) < 0)
        return r;
      result += r;
      return result;
    }
    
    sw buf_inspect_u64_base (s_buf *buf, const s_str *base, u64 x)
    {
      character *c;
      u8 digit;
      sw i;
      sw r;
      sw result = 0;
      uw radix;
      s_buf_save save;
      sw size;
      character zero;
      u64 u;
      if (x == 0) {
        if (str_character(base, 0, &zero) < 0)
          return -1;
        return buf_write_character_utf8(buf, zero);
      }
      u = x;
      size = buf_inspect_u64_base_digits(base, u);
      c = alloc(size * sizeof(character));
      buf_save_init(buf, &save);
      radix = base->size;
      i = 0;
      while (u > 0) {
        digit = u % radix;
        u /= radix;
        if (str_character(base, digit, c + i) < 0) {
          r = -1;
          goto restore;
        }
        i++;
      }
      while (i--) {
        if ((r = buf_write_character_utf8(buf, c[i])) < 0)
          goto restore;
        result += r;
      }
      r = result;
      goto clean;
     restore:
      buf_save_restore_wpos(buf, &save);
     clean:
      alloc_free(c);
      buf_save_clean(buf, &save);
      return r;
    }
    
    u8 buf_inspect_u64_base_digits (const s_str *base,
                                        u64 x)
    {
      uw radix;
      u8 size = 0;
      u64 u;
      u = x;
      if (u == 0)
        return 1;
      radix = base->size;
      while (u > 0) {
        u /= radix;
        size++;
      }
      return size;
    }
    
    sw buf_inspect_u64_base_size (s_pretty *pretty, const s_str *base,
                                      u64 x)
    {
      character *c;
      u8 digit;
      sw i;
      sw r;
      sw result = 0;
      uw radix;
      sw size;
      character zero;
      u64 u;
      u = x;
      if (u == 0) {
        if (str_character(base, 0, &zero) < 0)
          return -1;
        return buf_write_character_utf8_size(pretty, zero);
      }
      size = buf_inspect_u64_base_digits(base, u);
      c = alloc(size * sizeof(character));
      radix = base->size;
      i = 0;
      while (u > 0) {
        digit = u % radix;
        u /= radix;
        if (str_character(base, digit, c + i) < 0) {
          r = -1;
          goto restore;
        }
        i++;
      }
      while (i--) {
        if ((r = buf_write_character_utf8_size(pretty, c[i])) < 0)
          goto restore;
        result += r;
      }
      r = result;
      goto clean;
     restore:
     clean:
      alloc_free(c);
      return r;
    }
    
    sw buf_inspect_u64_size (s_pretty *pretty, u64 x)
    {
      sw r;
      sw result = 0;
      if (g_buf_inspect_type != &g_sym_U64 &&
          cast_needed_u64(x)) {
        if ((r = buf_inspect_paren_sym_size(pretty, &g_sym_U64)) < 0)
          return r;
        result += r;
        result += strlen(" ");
      }
      if ((r = buf_inspect_u64_base_size(pretty, &g_kc3_base_decimal,
                                             x)) < 0)
        return r;
      result += r;
      return result;
    }