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 */ 45extern HV *Sun_Solaris_Exacct_Catalog_stash; 46extern HV *Sun_Solaris_Exacct_File_stash; 47extern HV *Sun_Solaris_Exacct_Object_Item_stash; 48extern HV *Sun_Solaris_Exacct_Object_Group_stash; 49extern HV *Sun_Solaris_Exacct_Object__Array_stash; 50 51/* Populate the stash pointers, provided by Exacct.xs. */ 52extern 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 */ 59extern HV *IdValueHash; 60extern 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 */ 82typedef 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. */ 109extern SV *new_catalog(ea_catalog_t cat); 110 111/* Return the integer catalog value from the passed object or SV. */ 112extern ea_catalog_t catalog_value(SV *catalog); 113 114/* Fast way to make exacct objects, provided by Exacct.xs. */ 115extern SV *new_xs_ea_object(ea_object_t *obj); 116 117/* Deflate an xs_ea_object, provided by Exacct.xs. */ 118extern 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 */ 125typedef enum { other = 0, type, catlg, id } consttype_t; 126typedef struct { 127 const char *name; 128 const int len; 129 const consttype_t consttype; 130 const unsigned int value; 131} constval_t; 132extern void define_constants(const char *pkg, constval_t *dvp); 133 134#endif /* _EXACCT_COMMON_H */ 135