⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 const2perl.h

📁 source of perl for linux application,
💻 H
字号:
/* const2perl.h -- For converting C constants into Perl constant subs *	(usually via XS code but can just write Perl code to stdout). *//* #ifndef _INCLUDE_CONST2PERL_H * #define _INCLUDE_CONST2PERL_H 1 */#ifndef CONST2WRITE_PERL	/* Default is "const to .xs": */# define newconst( sName, sFmt, xValue, newSV )	\		newCONSTSUB( mHvStash, sName, newSV )# define noconst( const )	av_push( mAvExportFail, newSVpv(#const,0) )# define setuv(u)	do {				\	mpSvNew= newSViv(0); sv_setuv(mpSvNew,u);	\    } while( 0 )#else/* #ifdef __cplusplus * # undef printf * # undef fprintf * # undef stderr * # define stderr (&_iob[2]) * # undef iobuf * # undef malloc * #endif */# include <stdio.h>	/* Probably already included, but shouldn't hurt */# include <errno.h>	/* Possibly already included, but shouldn't hurt */# define newconst( sName, sFmt, xValue, newSV )	\		printf( "sub %s () { " sFmt " }\n", sName, xValue )# define noconst( const )	printf( "push @EXPORT_FAIL, '%s';\n", #const )# define setuv(u)	/* Nothing */# ifndef IVdf#  define IVdf "ld"# endif# ifndef UVuf#  define UVuf "lu"# endif# ifndef UVxf#  define UVxf "lX"# endif# ifndef NV_DIG#  define NV_DIG 15# endifstatic char *escquote( const char *sValue ){    Size_t lLen= 1+2*strlen(sValue);    char *sEscaped= (char *) malloc( lLen );    char *sNext= sEscaped;    if(  NULL == sEscaped  ) {	fprintf( stderr, "Can't allocate %"UVuf"-byte buffer (errno=%d)\n",	  U_V(lLen), _errno );	exit( 1 );    }    while(  '\0' != *sValue  ) {	switch(  *sValue  ) {	 case '\'':	 case '\\':	    *(sNext++)= '\\';	}	*(sNext++)= *(sValue++);    }    *sNext= *sValue;    return( sEscaped );}#endif#ifdef __cplusplusclass _const2perl { public:    char msBuf[64];	/* Must fit sprintf of longest NV */#ifndef CONST2WRITE_PERL    HV *mHvStash;    AV *mAvExportFail;    SV *mpSvNew;    _const2perl::_const2perl( char *sModName ) {	mHvStash= gv_stashpv( sModName, TRUE );	SV **pSv= hv_fetch( mHvStash, "EXPORT_FAIL", 11, TRUE );	GV *gv;	char *sVarName= (char *) malloc( 15+strlen(sModName) );	strcpy( sVarName, sModName );	strcat( sVarName, "::EXPORT_FAIL" );	gv= gv_fetchpv( sVarName, 1, SVt_PVAV );	mAvExportFail= GvAVn( gv );    }#else    _const2perl::_const2perl( char *sModName ) {	;	/* Nothing to do */    }#endif /* CONST2WRITE_PERL */    void mkconst( char *sName, unsigned long uValue ) {	setuv(uValue);	newconst( sName, "0x%"UVxf, uValue, mpSvNew );    }    void mkconst( char *sName, unsigned int uValue ) {	setuv(uValue);	newconst( sName, "0x%"UVxf, uValue, mpSvNew );    }    void mkconst( char *sName, unsigned short uValue ) {	setuv(uValue);	newconst( sName, "0x%"UVxf, uValue, mpSvNew );    }    void mkconst( char *sName, long iValue ) {	newconst( sName, "%"IVdf, iValue, newSViv(iValue) );    }    void mkconst( char *sName, int iValue ) {	newconst( sName, "%"IVdf, iValue, newSViv(iValue) );    }    void mkconst( char *sName, short iValue ) {	newconst( sName, "%"IVdf, iValue, newSViv(iValue) );    }    void mkconst( char *sName, double nValue ) {	newconst( sName, "%s",	  Gconvert(nValue,NV_DIG,0,msBuf), newSVnv(nValue) );    }    void mkconst( char *sName, char *sValue ) {	newconst( sName, "'%s'", escquote(sValue), newSVpv(sValue,0) );    }    void mkconst( char *sName, const void *pValue ) {	setuv((UV)pValue);	newconst( sName, "0x%"UVxf, (UV)(pValue), mpSvNew );    }/*#ifdef HAS_QUAD * HAS_QUAD only means pack/unpack deal with them, not that SVs can. *    void mkconst( char *sName, Quad_t *qValue ) { *	newconst( sName, "0x%"QVxf, qValue, newSVqv(qValue) ); *    } *#endif / * HAS_QUAD */};#define START_CONSTS( sModName )	_const2perl const2( sModName );#define const2perl( const )		const2.mkconst( #const, const )#else	/* __cplusplus */# ifndef CONST2WRITE_PERL#  define START_CONSTS( sModName )					\	    HV *mHvStash= gv_stashpv( sModName, TRUE );			\	    AV *mAvExportFail;						\	    SV *mpSvNew;						\	    { char *sVarName= malloc( 15+strlen(sModName) );		\	      GV *gv;							\		strcpy( sVarName, sModName );				\		strcat( sVarName, "::EXPORT_FAIL" );			\		gv= gv_fetchpv( sVarName, 1, SVt_PVAV );		\		mAvExportFail= GvAVn( gv );				\	    }# else#  define START_CONSTS( sModName )	/* Nothing */# endif#define const2perl( const )	do {	 				\	if(  const < 0  ) {						\	    newconst( #const, "%"IVdf, const, newSViv((IV)const) );	\	} else {							\	    setuv( (UV)const );						\	    newconst( #const, "0x%"UVxf, const, mpSvNew ); 		\	}								\    } while( 0 )#endif	/* __cplusplus *///Example use://#include <const2perl.h>//  {//    START_CONSTS( "Package::Name" )	/* No ";" *///#ifdef $const//    const2perl( $const );//#else//    noconst( $const );//#endif//  }// sub ? { my( $sConstName )= @_;//    return $sConstName;	# "#ifdef $sConstName"//    return FALSE;		# Same as above//    return "HAS_QUAD";	# "#ifdef HAS_QUAD"//    return "#if 5.04 <= VERSION";//    return "#if 0";//    return 1;		# No #ifdef/* #endif / * _INCLUDE_CONST2PERL_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -