Convert-Binary-C
view release on metacpan or search on metacpan
cbc/sourcify.c view on Meta::CPAN
/*===== DEFINES ==============================================================*/
#define T_ALREADY_DUMPED T_USER_FLAG_1
#define F_NEWLINE 0x00000001
#define F_KEYWORD 0x00000002
#define F_DONT_EXPAND 0x00000004
#define F_PRAGMA_PACK_POP 0x00000008
#define SRC_INDENT \
STMT_START { \
if (level > 0) \
add_indent(aTHX_ s, level); \
} STMT_END
#define CHECK_SET_KEYWORD \
STMT_START { \
if (pSS->flags & F_KEYWORD) \
sv_catpvn(s, " ", 1); \
else \
SRC_INDENT; \
pSS->flags &= ~F_NEWLINE; \
pSS->flags |= F_KEYWORD; \
} STMT_END
#define SvGROW_early(s, granularity) \
STMT_START { \
if (SvCUR(s) + ((granularity)/2) > SvLEN(s)) \
SvGROW(s, SvCUR(s) + (granularity)); \
} STMT_END
#define SVG_STRUCT 512
#define SVG_ENUM 512
/*===== TYPEDEFS =============================================================*/
typedef struct {
U32 flags;
unsigned pack;
} SourcifyState;
/*===== STATIC FUNCTION PROTOTYPES ===========================================*/
static void check_define_type(pTHX_ SourcifyConfig *pSC, SV *str, TypeSpec *pTS);
static void add_type_spec_string_rec(pTHX_ SourcifyConfig *pSC, SV *str, SV *s,
TypeSpec *pTS, int level, SourcifyState *pSS);
static void add_enum_spec_string_rec(pTHX_ SourcifyConfig *pSC, SV *s,
EnumSpecifier *pES, int level, SourcifyState *pSS);
static void add_struct_spec_string_rec(pTHX_ SourcifyConfig *pSC, SV *str, SV *s,
Struct *pStruct, int level, SourcifyState *pSS);
static void add_typedef_list_decl_string(pTHX_ SV *str, TypedefList *pTDL);
static void add_typedef_list_spec_string(pTHX_ SourcifyConfig *pSC, SV *str, TypedefList *pTDL);
static void add_enum_spec_string(pTHX_ SourcifyConfig *pSC, SV *str, EnumSpecifier *pES);
static void add_struct_spec_string(pTHX_ SourcifyConfig *pSC, SV *str, Struct *pStruct);
static void pp_macro_callback(const CMacroInfo *pmi);
static void add_preprocessor_definitions(pTHX_ CParseInfo *pCPI, SV *str);
/*===== EXTERNAL VARIABLES ===================================================*/
/*===== GLOBAL VARIABLES =====================================================*/
/*===== STATIC VARIABLES =====================================================*/
/*===== STATIC FUNCTIONS =====================================================*/
/*******************************************************************************
*
* ROUTINE: check_define_type
*
* WRITTEN BY: Marcus Holland-Moritz ON: Oct 2002
* CHANGED BY: ON:
*
********************************************************************************
*
* DESCRIPTION:
*
* ARGUMENTS:
*
* RETURNS:
*
*******************************************************************************/
static void check_define_type(pTHX_ SourcifyConfig *pSC, SV *str, TypeSpec *pTS)
{
u_32 flags = pTS->tflags;
CT_DEBUG(MAIN, (XSCLASS "::check_define_type( pTS=(tflags=0x%08lX, ptr=%p) )",
(unsigned long) pTS->tflags, pTS->ptr));
if (flags & T_TYPE)
{
Typedef *pTypedef= (Typedef *) pTS->ptr;
while (!pTypedef->pDecl->pointer_flag && pTypedef->pType->tflags & T_TYPE)
pTypedef = (Typedef *) pTypedef->pType->ptr;
if (pTypedef->pDecl->pointer_flag)
return;
pTS = pTypedef->pType;
flags = pTS->tflags;
}
if (flags & T_ENUM)
{
EnumSpecifier *pES = (EnumSpecifier *) pTS->ptr;
if (pES && (pES->tflags & T_ALREADY_DUMPED) == 0)
add_enum_spec_string(aTHX_ pSC, str, pES);
}
else if (flags & T_COMPOUND)
{
Struct *pStruct = (Struct *) pTS->ptr;
cbc/sourcify.c view on Meta::CPAN
* DESCRIPTION:
*
* ARGUMENTS:
*
* RETURNS:
*
*******************************************************************************/
static void add_struct_spec_string(pTHX_ SourcifyConfig *pSC, SV *str, Struct *pStruct)
{
SV *s = newSVpvn("", 0);
SourcifyState ss;
CT_DEBUG(MAIN, (XSCLASS "::add_struct_spec_string( pStruct=%p )", pStruct));
ss.flags = 0;
ss.pack = 0;
add_struct_spec_string_rec(aTHX_ pSC, str, s, pStruct, 0, &ss);
sv_catpvn(s, ";\n", 2);
if (ss.flags & F_PRAGMA_PACK_POP)
sv_catpvn(s, "#pragma pack(pop)\n", 18);
sv_catsv(str, s);
SvREFCNT_dec(s);
}
/*******************************************************************************
*
* ROUTINE: pp_macro_callback
*
* WRITTEN BY: Marcus Holland-Moritz ON: Feb 2006
* CHANGED BY: ON:
*
********************************************************************************
*
* DESCRIPTION:
*
* ARGUMENTS:
*
* RETURNS:
*
*******************************************************************************/
#define SvGROWexp(s, amount) \
BEGIN_STMT { \
if (SvCUR(s) + pmi->definition_len + 10 >= SvLEN(s)) \
SvGROW(s, 2*SvLEN(s)); \
} END_STMT
struct macro_cb_arg
{
#ifdef PERL_IMPLICIT_CONTEXT
void *interp;
#endif
SV *string;
};
static void pp_macro_callback(const CMacroInfo *pmi)
{
struct macro_cb_arg *a = pmi->arg;
SV *s = a->string;
dTHXa(a->interp);
if (SvCUR(s) + pmi->definition_len + 10 >= SvLEN(s))
SvGROW(s, 2*SvLEN(s));
sv_catpvn(s, "#define ", 8);
sv_catpvn(s, pmi->definition, pmi->definition_len);
sv_catpvn(s, "\n", 1);
}
/*******************************************************************************
*
* ROUTINE: add_preprocessor_definitions
*
* WRITTEN BY: Marcus Holland-Moritz ON: Feb 2006
* CHANGED BY: ON:
*
********************************************************************************
*
* DESCRIPTION:
*
* ARGUMENTS:
*
* RETURNS:
*
*******************************************************************************/
static void add_preprocessor_definitions(pTHX_ CParseInfo *pCPI, SV *str)
{
struct macro_cb_arg a;
SV *s = newSVpvn("", 0);
#ifdef PERL_IMPLICIT_CONTEXT
a.interp = aTHX;
#endif
a.string = s;
SvGROW(s, 512);
macro_iterate_defs(pCPI, pp_macro_callback, &a, CMIF_WITH_DEFINITION |
CMIF_NO_PREDEFINED);
if (SvCUR(s) > 0)
{
sv_catpv(str, "/* preprocessor defines */\n\n");
sv_catsv(str, s);
sv_catpvn(str, "\n", 1);
}
SvREFCNT_dec(s);
}
/*******************************************************************************
*
* ROUTINE: get_sourcify_config_option
*
* WRITTEN BY: Marcus Holland-Moritz ON: Aug 2003
( run in 0.833 second using v1.01-cache-2.11-cpan-d7a12ab2c7f )