/* c3
 * Copyright 2022,2023 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 s.h.in BITS=_BITS$ bits=_bits$ */
#include <assert.h>
#include <err.h>
#include <stdlib.h>
#include "integer.h"
#include "tag.h"
#include "tag_type.h"
#include "s_bits$.h"

s_bits$ * s_bits$_init_cast (s_bits$ *s, const s_tag *tag)
{
  switch (tag->type) {
  case TAG_BOOL:
    *s = tag->data.bool ? 1 : 0;
    return s;
  case TAG_CHARACTER:
    *s = (s_bits$) tag->data.character;
    return s;
  case TAG_F32:
    *s = (s_bits$) tag->data.f32;
    return s;
  case TAG_F64:
    *s = (s_bits$) tag->data.f64;
    return s;
  case TAG_INTEGER:
    *s = integer_to_s_bits$(&tag->data.integer);
    return s;
  case TAG_SW:
    *s = (s_bits$) tag->data.sw;
    return s;
  case TAG_S64:
    *s = (s_bits$) tag->data.s64;
    return s;
  case TAG_S32:
    *s = (s_bits$) tag->data.s32;
    return s;
  case TAG_S16:
    *s = (s_bits$) tag->data.s16;
    return s;
  case TAG_S8:
    *s = (s_bits$) tag->data.s8;
    return s;
  case TAG_U8:
    *s = (s_bits$) tag->data.u8;
    return s;
  case TAG_U16:
    *s = (s_bits$) tag->data.u16;
    return s;
  case TAG_U32:
    *s = (s_bits$) tag->data.u32;
    return s;
  case TAG_U64:
    *s = (s_bits$) tag->data.u64;
    return s;
  case TAG_UW:
    *s = (s_bits$) tag->data.uw;
    return s;
  default:
    break;
  }
  warnx("s_bits$_cast: cannot cast %s to s_bits$",
        tag_type_to_string(tag->type));
  assert(! "s_bits$_cast: cannot cast to s_bits$");
  return NULL;
}

s_bits$ * s_bits$_init_copy (s_bits$ *s, const s_bits$ *src)
{
  assert(src);
  assert(s);
  *s = *src;
  return s;
}

s_bits$ * s_bits$_random (s_bits$ *s)
{
  arc4random_buf(s, sizeof(s_bits$));
  return s;
}
