File: def.xs

package info (click to toggle)
libconvert-binary-c-perl 0.74-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 9,100 kB
  • ctags: 21,416
  • sloc: ansic: 63,666; perl: 18,582; yacc: 2,143; makefile: 44
file content (82 lines) | stat: -rw-r--r-- 2,155 bytes parent folder | download
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