1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
################################################################################
#
# $Project: /Convert-Binary-C $
# $Author: mhx $
# $Date: 2009/03/15 04:10:44 +0100 $
# $Revision: 9 $
# $Source: /xsubs/def.xs $
#
################################################################################
#
# Copyright (c) 2002-2009 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
|