1 /*
2 * Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
3 *
4 * Common includes and defines for Sun::Solaris::Exacct.
5 */
6
7 #ifndef _EXACCT_COMMON_H
8 #define _EXACCT_COMMON_H
9
10 /* Exacct related includes. */
11 #include <exacct.h>
12
13 /*
14 * On i386 Solaris defines SP, which conflicts with the perl definition of SP
15 * We don't need the Solaris one, so get rid of it to avoid warnings.
16 */
17 #undef SP
18
19 /* Perl XS includes. */
20 #include "EXTERN.h"
21 #include "perl.h"
22 #include "XSUB.h"
23
24 /* Root of the Exacct namespace. */
25 #define PKGBASE "Sun::Solaris::Exacct"
26
27 /* Debugging assertion macros. */
28 #ifdef EXACCT_DEBUG
29 #define PERL_ASSERT(EXPR) ((void)((EXPR) || \
30 (croak("%s(%d) assertion failed: %s", __FILE__, __LINE__, #EXPR), 0), \
31 0))
32 #define PERL_ASSERTMSG(EXPR, MSG) ((void)((EXPR) || \
33 (croak("%s(%d) %s", __FILE__ __LINE__, MSG), 0), 0))
34 #else
35 #define PERL_ASSERT(EXP) ((void)0)
36 #define PERL_ASSERTMSG(EXP, MSG) ((void)0)
37 #endif
38
39 /*
40 * Object stash pointers - caching these speeds up the creation and
41 * typechecking of perl objects by removing the need to do a hash lookup.
42 * The peculiar variable names are so that typemaps can generate the correct
43 * package name using the typemap '$Package' variable as the root of the name.
44 */
45 extern HV *Sun_Solaris_Exacct_Catalog_stash;
46 extern HV *Sun_Solaris_Exacct_File_stash;
47 extern HV *Sun_Solaris_Exacct_Object_Item_stash;
48 extern HV *Sun_Solaris_Exacct_Object_Group_stash;
49 extern HV *Sun_Solaris_Exacct_Object__Array_stash;
50
51 /* Populate the stash pointers, provided by Exacct.xs. */
52 extern void init_stashes(void);
53
54 /*
55 * Pointer to part of the hash tree built by define_catalog_constants in
56 * Catalog.xs. This is used by catalog_id_str() in Exacct.xs when mapping
57 * from a catalog to an id string.
58 */
59 extern HV *IdValueHash;
60 extern char *catalog_id_str(ea_catalog_t catalog);
61
62 /*
63 * Structure for holding an ::Exacct::Object. Different bits of this structure
64 * will be populated depending on the type of Object (Item or Group), and on
65 * how the Object was created (read from file or by the script).
66 *
67 * Simple Items
68 * Only the ea_obj part is populated, and that points to an ea_object_t
69 * that is used to hold the Item.
70 *
71 * Items containing embedded Objects
72 * If an Item of this type has been read from file and has not been accessed,
73 * just the ea_obj part will be populated. If the object has been accessed, or
74 * if it has been created from within the script, the perl_obj part will be
75 * populated.
76 *
77 * Groups
78 * If a Group has been read from file and has not been accessed, just the
79 * ea_obj part will be populated. If the object has been accessed, or if it has
80 * been created from within the script, the perl_obj part will be populated.
81 */
82 typedef struct {
83 ea_object_t *ea_obj; /* Underlying exacct object. */
84 SV *perl_obj; /* Underlying perl object. */
85 uchar_t flags; /* Object type and status. */
86 } xs_ea_object_t;
87
88 /* Macros for manipulating flag bits. */
89 #define TYPE_MASK 0x03
90 #define PLAIN_ITEM 0x00
91 #define EMBED_ITEM 0x01
92 #define GROUP 0x02
93
94 #define GET_TYPE_BITS(X) ((X)->flags & TYPE_MASK)
95 #define SET_TYPE_BITS(X, Y) ((X)->flags = (((X)->flags & ~TYPE_MASK) | Y)
96 #define SET_PLAIN_ITEM(X) (SET_TYPE_BITS(X, PLAIN_ITEM))
97 #define SET_EMBED_ITEM(X) (SET_TYPE_BITS(X, EMBED_ITEM))
98 #define SET_GROUP(X) (SET_TYPE_BITS(X, GROUP))
99 #define IS_ITEM(X) (GET_TYPE_BITS(X) < GROUP)
100 #define IS_PLAIN_ITEM(X) (GET_TYPE_BITS(X) == PLAIN_ITEM)
101 #define IS_EMBED_ITEM(X) (GET_TYPE_BITS(X) == EMBED_ITEM)
102 #define IS_GROUP(X) (GET_TYPE_BITS(X) == GROUP)
103
104 #define INIT_PLAIN_ITEM_FLAGS(X) ((X)->flags = PLAIN_ITEM)
105 #define INIT_EMBED_ITEM_FLAGS(X) ((X)->flags = EMBED_ITEM)
106 #define INIT_GROUP_FLAGS(X) ((X)->flags = GROUP)
107
108 /* Fast way to make catalog objects, provided by Exacct.xs. */
109 extern SV *new_catalog(ea_catalog_t cat);
110
111 /* Return the integer catalog value from the passed object or SV. */
112 extern ea_catalog_t catalog_value(SV *catalog);
113
114 /* Fast way to make exacct objects, provided by Exacct.xs. */
115 extern SV *new_xs_ea_object(ea_object_t *obj);
116
117 /* Deflate an xs_ea_object, provided by Exacct.xs. */
118 extern ea_object_t *deflate_xs_ea_object(SV *sv);
119
120 /*
121 * Structure and associated function for creating perl constants
122 * and populating @_Constants, used for constant lookup by the modules.
123 * See Exacct.xs for the definition of define_constants().
124 */
125 typedef enum { other = 0, type, catlg, id } consttype_t;
126 typedef struct {
127 const char *name;
128 const int len;
129 const consttype_t consttype;
130 const unsigned int value;
131 } constval_t;
132 extern void define_constants(const char *pkg, constval_t *dvp);
133
134 #endif /* _EXACCT_COMMON_H */