Convert-Binary-C

 view release on metacpan or  search on metacpan

cbc/dimension.c  view on Meta::CPAN

*******************************************************************************/

static void dimtag_fini(pTHX_ DimensionTag *dim)
{
  assert(dim != NULL);

  switch (dim->type)
  {
    case DTT_MEMBER:
      assert(dim->u.member != NULL);
      Safefree(dim->u.member);
      break;

    case DTT_HOOK:
      assert(dim->u.hook != NULL);
      single_hook_delete(dim->u.hook);
      break;

    default:
      break;
  }
}

/*******************************************************************************
*
*   ROUTINE: validate_member_expression
*
*   WRITTEN BY: Marcus Holland-Moritz             ON: Mar 2006
*   CHANGED BY:                                   ON:
*
********************************************************************************
*
* DESCRIPTION:
*
*   ARGUMENTS:
*
*     RETURNS:
*
*******************************************************************************/

static void validate_member_expression(pTHX_ const MemberInfo *pmi,
                                             const char *member, const char *type)
{
  MemberInfo mi, mi2;
  const char *failed_type;

  assert(pmi != NULL);
  assert(member != NULL);

  if (pmi->parent == NULL)
  {
    Perl_croak(aTHX_ "Cannot use member expression '%s' as Dimension tag"
                     " for '%s' when not within a compound type", member, type);
  }

  mi.type.ptr = pmi->parent;
  mi.type.tflags = ((Struct *) pmi->parent)->tflags;
  mi.pDecl = NULL;
  mi.level = 0;

  (void) get_member(aTHX_ &mi, member, &mi2, CBC_GM_ACCEPT_DOTLESS_MEMBER |
                                             CBC_GM_REJECT_OUT_OF_BOUNDS_INDEX |
                                             CBC_GM_REJECT_OFFSET);

  failed_type = check_allowed_types_string(&mi2, ALLOW_BASIC_TYPES);

  if (failed_type)
  {
    Perl_croak(aTHX_ "Cannot use %s in member '%s' to determine a dimension for '%s'",
                     failed_type, member, type);
  }

  if (mi2.offset + (int)mi2.size > pmi->offset)
  {
    const char *where;

    if (mi2.offset == pmi->offset)
      where = "located at same offset as"; 
    else if (mi2.offset < pmi->offset)
      where = "overlapping with";
    else
      where = "located behind";

    Perl_croak(aTHX_ "Cannot use member '%s' %s '%s' in layout"
                     " to determine a dimension", member, where, type);
  }
}

/*******************************************************************************
*
*   ROUTINE: sv_to_dimension
*
*   WRITTEN BY: Marcus Holland-Moritz             ON: Mar 2006
*   CHANGED BY:                                   ON:
*
********************************************************************************
*
* DESCRIPTION:
*
*   ARGUMENTS:
*
*     RETURNS:
*
*******************************************************************************/

static long sv_to_dimension(pTHX_ SV *sv, const char *member)
{
  SV *warning;
  const char *value = NULL;

  assert(sv != NULL);

  SvGETMAGIC(sv);

  if (SvOK(sv) && !SvROK(sv))
  {
    if (looks_like_number(sv))
    {
      return SvIV(sv);
    }

    value = SvPV_nolen(sv);
  }



( run in 0.547 second using v1.01-cache-2.11-cpan-e1769b4cff6 )