The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
################################################################################
#
# Copyright (c) 2002-2015 Marcus Holland-Moritz. All rights reserved.
# This program is free software; you can redistribute it and/or modify
# it under the same terms as Perl itself.
#
################################################################################


################################################################################
#
#   METHOD: def
#
#   WRITTEN BY: Marcus Holland-Moritz             ON: Mar 2002
#   CHANGED BY:                                   ON:
#
################################################################################

char *
CBC::def(type)
  const char *type

  PREINIT:
    CBC_METHOD(def);
    MemberInfo mi;
    const char *member = NULL;

  CODE:
    CT_DEBUG_METHOD1("'%s'", type);

    CHECK_VOID_CONTEXT;

    if (get_type_spec(THIS, type, &member, &mi.type) == 0)
      XSRETURN_UNDEF;

    if (mi.type.ptr == NULL)
      RETVAL = "basic";
    else
    {
      void *ptr = mi.type.ptr;
      switch (GET_CTYPE(ptr))
      {
        case TYP_TYPEDEF:
          RETVAL = is_typedef_defined((Typedef *) ptr) ? "typedef" : "";
          break;

        case TYP_STRUCT:
          if (((Struct *) ptr)->declarations)
            RETVAL = ((Struct *) ptr)->tflags & T_STRUCT ? "struct" : "union";
          else
            RETVAL = "";
          break;

        case TYP_ENUM:
          RETVAL = ((EnumSpecifier *) ptr)->enumerators ? "enum" : "";
          break;

        default:
          fatal("Invalid type (%d) in " XSCLASS "::%s( '%s' )",
                GET_CTYPE(ptr), method, type);
          break;
      }
      if (member && *member != '\0' && *RETVAL != '\0')
      {
        mi.pDecl = NULL;
        mi.level = 0;
        RETVAL = get_member(aTHX_ &mi, member, NULL, CBC_GM_DONT_CROAK | CBC_GM_NO_OFFSET_SIZE_CALC)
                 ? "member" : "";
      }
    }

  OUTPUT:
    RETVAL