ppport.h
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:15k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. /* ppport.h -- Perl/Pollution/Portability Version 2.0002 
  2.  *
  3.  * Automatically Created by Devel::PPPort on Fri Feb  6 15:58:25 2004 
  4.  *
  5.  * Do NOT edit this file directly! -- Edit PPPort.pm instead.
  6.  *
  7.  * Version 2.x, Copyright (C) 2001, Paul Marquess.
  8.  * Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
  9.  * This code may be used and distributed under the same license as any
  10.  * version of Perl.
  11.  * 
  12.  * This version of ppport.h is designed to support operation with Perl
  13.  * installations back to 5.004, and has been tested up to 5.8.0.
  14.  *
  15.  * If this version of ppport.h is failing during the compilation of this
  16.  * module, please check if a newer version of Devel::PPPort is available
  17.  * on CPAN before sending a bug report.
  18.  *
  19.  * If you are using the latest version of Devel::PPPort and it is failing
  20.  * during compilation of this module, please send a report to perlbug@perl.com
  21.  *
  22.  * Include all following information:
  23.  *
  24.  *  1. The complete output from running "perl -V"
  25.  *
  26.  *  2. This file.
  27.  *
  28.  *  3. The name & version of the module you were trying to build.
  29.  *
  30.  *  4. A full log of the build that failed.
  31.  *
  32.  *  5. Any other information that you think could be relevant.
  33.  *
  34.  *
  35.  * For the latest version of this code, please retreive the Devel::PPPort
  36.  * module from CPAN.
  37.  * 
  38.  */
  39. /*
  40.  * In order for a Perl extension module to be as portable as possible
  41.  * across differing versions of Perl itself, certain steps need to be taken.
  42.  * Including this header is the first major one, then using dTHR is all the
  43.  * appropriate places and using a PL_ prefix to refer to global Perl
  44.  * variables is the second.
  45.  *
  46.  */
  47. /* If you use one of a few functions that were not present in earlier
  48.  * versions of Perl, please add a define before the inclusion of ppport.h
  49.  * for a static include, or use the GLOBAL request in a single module to
  50.  * produce a global definition that can be referenced from the other
  51.  * modules.
  52.  * 
  53.  * Function:            Static define:           Extern define:
  54.  * newCONSTSUB()        NEED_newCONSTSUB         NEED_newCONSTSUB_GLOBAL
  55.  *
  56.  */
  57.  
  58. /* To verify whether ppport.h is needed for your module, and whether any
  59.  * special defines should be used, ppport.h can be run through Perl to check
  60.  * your source code. Simply say:
  61.  * 
  62.  *  perl -x ppport.h *.c *.h *.xs foo/bar*.c [etc]
  63.  * 
  64.  * The result will be a list of patches suggesting changes that should at
  65.  * least be acceptable, if not necessarily the most efficient solution, or a
  66.  * fix for all possible problems. It won't catch where dTHR is needed, and
  67.  * doesn't attempt to account for global macro or function definitions,
  68.  * nested includes, typemaps, etc.
  69.  * 
  70.  * In order to test for the need of dTHR, please try your module under a
  71.  * recent version of Perl that has threading compiled-in.
  72.  *
  73.  */ 
  74. /*
  75. #!/usr/bin/perl
  76. @ARGV = ("*.xs") if !@ARGV;
  77. %badmacros = %funcs = %macros = (); $replace = 0;
  78. foreach (<DATA>) {
  79. $funcs{$1} = 1 if /Provide:s+(S+)/;
  80. $macros{$1} = 1 if /^#s*defines+([a-zA-Z0-9_]+)/;
  81. $replace = $1 if /Replace:s+(d+)/;
  82. $badmacros{$2}=$1 if $replace and /^#s*defines+([a-zA-Z0-9_]+).*?s+([a-zA-Z0-9_]+)/;
  83. $badmacros{$1}=$2 if /Replace (S+) with (S+)/;
  84. }
  85. foreach $filename (map(glob($_),@ARGV)) {
  86. unless (open(IN, "<$filename")) {
  87. warn "Unable to read from $file: $!n";
  88. next;
  89. }
  90. print "Scanning $filename...n";
  91. $c = ""; while (<IN>) { $c .= $_; } close(IN);
  92. $need_include = 0; %add_func = (); $changes = 0;
  93. $has_include = ($c =~ /#.*include.*ppport/m);
  94. foreach $func (keys %funcs) {
  95. if ($c =~ /#.*define.*bNEED_$func(_GLOBAL)?b/m) {
  96. if ($c !~ /b$funcb/m) {
  97. print "If $func isn't needed, you don't need to request it.n" if
  98. $changes += ($c =~ s/^.*#.*define.*bNEED_$funcb.*n//m);
  99. } else {
  100. print "Uses $funcn";
  101. $need_include = 1;
  102. }
  103. } else {
  104. if ($c =~ /b$funcb/m) {
  105. $add_func{$func} =1 ;
  106. print "Uses $funcn";
  107. $need_include = 1;
  108. }
  109. }
  110. }
  111. if (not $need_include) {
  112. foreach $macro (keys %macros) {
  113. if ($c =~ /b$macrob/m) {
  114. print "Uses $macron";
  115. $need_include = 1;
  116. }
  117. }
  118. }
  119. foreach $badmacro (keys %badmacros) {
  120. if ($c =~ /b$badmacrob/m) {
  121. $changes += ($c =~ s/b$badmacrob/$badmacros{$badmacro}/gm);
  122. print "Uses $badmacros{$badmacro} (instead of $badmacro)n";
  123. $need_include = 1;
  124. }
  125. }
  126. if (scalar(keys %add_func) or $need_include != $has_include) {
  127. if (!$has_include) {
  128. $inc = join('',map("#define NEED_$_n", sort keys %add_func)).
  129.        "#include "ppport.h"n";
  130. $c = "$inc$c" unless $c =~ s/#.*include.*XSUB.*n/$&$inc/m;
  131. } elsif (keys %add_func) {
  132. $inc = join('',map("#define NEED_$_n", sort keys %add_func));
  133. $c = "$inc$c" unless $c =~ s/^.*#.*include.*ppport.*$/$inc$&/m;
  134. }
  135. if (!$need_include) {
  136. print "Doesn't seem to need ppport.h.n";
  137. $c =~ s/^.*#.*include.*ppport.*n//m;
  138. }
  139. $changes++;
  140. }
  141. if ($changes) {
  142. open(OUT,">/tmp/ppport.h.$$");
  143. print OUT $c;
  144. close(OUT);
  145. open(DIFF, "diff -u $filename /tmp/ppport.h.$$|");
  146. while (<DIFF>) { s!/tmp/ppport.h.$$!$filename.patched!; print STDOUT; }
  147. close(DIFF);
  148. unlink("/tmp/ppport.h.$$");
  149. } else {
  150. print "Looks OKn";
  151. }
  152. }
  153. __DATA__
  154. */
  155. #ifndef _P_P_PORTABILITY_H_
  156. #define _P_P_PORTABILITY_H_
  157. #ifndef PERL_REVISION
  158. #   ifndef __PATCHLEVEL_H_INCLUDED__
  159. #       include "patchlevel.h"
  160. #   endif
  161. #   ifndef PERL_REVISION
  162. # define PERL_REVISION (5)
  163.         /* Replace: 1 */
  164. #       define PERL_VERSION PATCHLEVEL
  165. #       define PERL_SUBVERSION SUBVERSION
  166.         /* Replace PERL_PATCHLEVEL with PERL_VERSION */
  167.         /* Replace: 0 */
  168. #   endif
  169. #endif
  170. #define PERL_BCDVERSION ((PERL_REVISION * 0x1000000L) + (PERL_VERSION * 0x1000L) + PERL_SUBVERSION)
  171. /* It is very unlikely that anyone will try to use this with Perl 6 
  172.    (or greater), but who knows.
  173.  */
  174. #if PERL_REVISION != 5
  175. # error ppport.h only works with Perl version 5
  176. #endif /* PERL_REVISION != 5 */
  177. #ifndef ERRSV
  178. # define ERRSV perl_get_sv("@",FALSE)
  179. #endif
  180. #if (PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5))
  181. /* Replace: 1 */
  182. # define PL_Sv Sv
  183. # define PL_compiling compiling
  184. # define PL_copline copline
  185. # define PL_curcop curcop
  186. # define PL_curstash curstash
  187. # define PL_defgv defgv
  188. # define PL_dirty dirty
  189. # define PL_dowarn dowarn
  190. # define PL_hints hints
  191. # define PL_na na
  192. # define PL_perldb perldb
  193. # define PL_rsfp_filters rsfp_filters
  194. # define PL_rsfpv rsfp
  195. # define PL_stdingv stdingv
  196. # define PL_sv_no sv_no
  197. # define PL_sv_undef sv_undef
  198. # define PL_sv_yes sv_yes
  199. /* Replace: 0 */
  200. #endif
  201. #ifdef HASATTRIBUTE
  202. #  if defined(__GNUC__) && defined(__cplusplus)
  203. #    define PERL_UNUSED_DECL
  204. #  else
  205. #    define PERL_UNUSED_DECL __attribute__((unused))
  206. #  endif
  207. #else
  208. #  define PERL_UNUSED_DECL
  209. #endif
  210. #ifndef dNOOP
  211. #  define NOOP (void)0
  212. #  define dNOOP extern int Perl___notused PERL_UNUSED_DECL
  213. #endif
  214. #ifndef dTHR
  215. #  define dTHR          dNOOP
  216. #endif
  217. #ifndef dTHX
  218. #  define dTHX          dNOOP
  219. #  define dTHXa(x)      dNOOP
  220. #  define dTHXoa(x)     dNOOP
  221. #endif
  222. #ifndef pTHX
  223. #    define pTHX void
  224. #    define pTHX_
  225. #    define aTHX
  226. #    define aTHX_
  227. #endif         
  228. /* IV could also be a quad (say, a long long), but Perls
  229.  * capable of those should have IVSIZE already. */
  230. #if !defined(IVSIZE) && defined(LONGSIZE)
  231. #   define IVSIZE LONGSIZE
  232. #endif
  233. #ifndef IVSIZE
  234. #   define IVSIZE 4 /* A bold guess, but the best we can make. */
  235. #endif
  236. #ifndef UVSIZE
  237. #   define UVSIZE IVSIZE
  238. #endif
  239. #ifndef NVTYPE
  240. #   if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
  241. #       define NVTYPE long double
  242. #   else
  243. #       define NVTYPE double
  244. #   endif
  245. typedef NVTYPE NV;
  246. #endif
  247. #ifndef INT2PTR
  248. #if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
  249. #  define PTRV                  UV
  250. #  define INT2PTR(any,d)        (any)(d)
  251. #else
  252. #  if PTRSIZE == LONGSIZE
  253. #    define PTRV                unsigned long
  254. #  else
  255. #    define PTRV                unsigned
  256. #  endif
  257. #  define INT2PTR(any,d)        (any)(PTRV)(d)
  258. #endif
  259. #define NUM2PTR(any,d)  (any)(PTRV)(d)
  260. #define PTR2IV(p)       INT2PTR(IV,p)
  261. #define PTR2UV(p)       INT2PTR(UV,p)
  262. #define PTR2NV(p)       NUM2PTR(NV,p)
  263. #if PTRSIZE == LONGSIZE
  264. #  define PTR2ul(p)     (unsigned long)(p)
  265. #else
  266. #  define PTR2ul(p)     INT2PTR(unsigned long,p)        
  267. #endif
  268. #endif /* !INT2PTR */
  269. #ifndef boolSV
  270. # define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no)
  271. #endif
  272. #ifndef gv_stashpvn
  273. # define gv_stashpvn(str,len,flags) gv_stashpv(str,flags)
  274. #endif
  275. #ifndef newSVpvn
  276. # define newSVpvn(data,len) ((len) ? newSVpv ((data), (len)) : newSVpv ("", 0))
  277. #endif
  278. #ifndef newRV_inc
  279. /* Replace: 1 */
  280. # define newRV_inc(sv) newRV(sv)
  281. /* Replace: 0 */
  282. #endif
  283. /* DEFSV appears first in 5.004_56 */
  284. #ifndef DEFSV
  285. #  define DEFSV GvSV(PL_defgv)
  286. #endif
  287. #ifndef SAVE_DEFSV
  288. #    define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv))
  289. #endif
  290. #ifndef newRV_noinc
  291. #  ifdef __GNUC__
  292. #    define newRV_noinc(sv)               
  293.       ({                                  
  294.           SV *nsv = (SV*)newRV(sv);       
  295.           SvREFCNT_dec(sv);               
  296.           nsv;                            
  297.       })
  298. #  else
  299. #    if defined(USE_THREADS)
  300. static SV * newRV_noinc (SV * sv)
  301. {
  302.           SV *nsv = (SV*)newRV(sv);       
  303.           SvREFCNT_dec(sv);               
  304.           return nsv;                     
  305. }
  306. #    else
  307. #      define newRV_noinc(sv)    
  308.         (PL_Sv=(SV*)newRV(sv), SvREFCNT_dec(sv), (SV*)PL_Sv)
  309. #    endif
  310. #  endif
  311. #endif
  312. /* Provide: newCONSTSUB */
  313. /* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */
  314. #if (PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION < 63))
  315. #if defined(NEED_newCONSTSUB)
  316. static
  317. #else
  318. extern void newCONSTSUB(HV * stash, char * name, SV *sv);
  319. #endif
  320. #if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL)
  321. void
  322. newCONSTSUB(stash,name,sv)
  323. HV *stash;
  324. char *name;
  325. SV *sv;
  326. {
  327. U32 oldhints = PL_hints;
  328. HV *old_cop_stash = PL_curcop->cop_stash;
  329. HV *old_curstash = PL_curstash;
  330. line_t oldline = PL_curcop->cop_line;
  331. PL_curcop->cop_line = PL_copline;
  332. PL_hints &= ~HINT_BLOCK_SCOPE;
  333. if (stash)
  334. PL_curstash = PL_curcop->cop_stash = stash;
  335. newSUB(
  336. #if (PERL_VERSION < 3) || ((PERL_VERSION == 3) && (PERL_SUBVERSION < 22))
  337.      /* before 5.003_22 */
  338. start_subparse(),
  339. #else
  340. #  if (PERL_VERSION == 3) && (PERL_SUBVERSION == 22)
  341.      /* 5.003_22 */
  342.       start_subparse(0),
  343. #  else
  344.      /* 5.003_23  onwards */
  345.       start_subparse(FALSE, 0),
  346. #  endif
  347. #endif
  348. newSVOP(OP_CONST, 0, newSVpv(name,0)),
  349. newSVOP(OP_CONST, 0, &PL_sv_no),   /* SvPV(&PL_sv_no) == "" -- GMB */
  350. newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
  351. );
  352. PL_hints = oldhints;
  353. PL_curcop->cop_stash = old_cop_stash;
  354. PL_curstash = old_curstash;
  355. PL_curcop->cop_line = oldline;
  356. }
  357. #endif
  358. #endif /* newCONSTSUB */
  359. #ifndef START_MY_CXT
  360. /*
  361.  * Boilerplate macros for initializing and accessing interpreter-local
  362.  * data from C.  All statics in extensions should be reworked to use
  363.  * this, if you want to make the extension thread-safe.  See ext/re/re.xs
  364.  * for an example of the use of these macros.
  365.  *
  366.  * Code that uses these macros is responsible for the following:
  367.  * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
  368.  * 2. Declare a typedef named my_cxt_t that is a structure that contains
  369.  *    all the data that needs to be interpreter-local.
  370.  * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
  371.  * 4. Use the MY_CXT_INIT macro such that it is called exactly once
  372.  *    (typically put in the BOOT: section).
  373.  * 5. Use the members of the my_cxt_t structure everywhere as
  374.  *    MY_CXT.member.
  375.  * 6. Use the dMY_CXT macro (a declaration) in all the functions that
  376.  *    access MY_CXT.
  377.  */
  378. #if defined(MULTIPLICITY) || defined(PERL_OBJECT) || 
  379.     defined(PERL_CAPI)    || defined(PERL_IMPLICIT_CONTEXT)
  380. /* This must appear in all extensions that define a my_cxt_t structure,
  381.  * right after the definition (i.e. at file scope).  The non-threads
  382.  * case below uses it to declare the data as static. */
  383. #define START_MY_CXT
  384. #if (PERL_VERSION < 4 || (PERL_VERSION == 4 && PERL_SUBVERSION < 68 ))
  385. /* Fetches the SV that keeps the per-interpreter data. */
  386. #define dMY_CXT_SV 
  387. SV *my_cxt_sv = perl_get_sv(MY_CXT_KEY, FALSE)
  388. #else /* >= perl5.004_68 */
  389. #define dMY_CXT_SV 
  390. SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY,
  391.   sizeof(MY_CXT_KEY)-1, TRUE)
  392. #endif /* < perl5.004_68 */
  393. /* This declaration should be used within all functions that use the
  394.  * interpreter-local data. */
  395. #define dMY_CXT
  396. dMY_CXT_SV;
  397. my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv))
  398. /* Creates and zeroes the per-interpreter data.
  399.  * (We allocate my_cxtp in a Perl SV so that it will be released when
  400.  * the interpreter goes away.) */
  401. #define MY_CXT_INIT 
  402. dMY_CXT_SV;
  403. /* newSV() allocates one more than needed */
  404. my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));
  405. Zero(my_cxtp, 1, my_cxt_t);
  406. sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
  407. /* This macro must be used to access members of the my_cxt_t structure.
  408.  * e.g. MYCXT.some_data */
  409. #define MY_CXT (*my_cxtp)
  410. /* Judicious use of these macros can reduce the number of times dMY_CXT
  411.  * is used.  Use is similar to pTHX, aTHX etc. */
  412. #define pMY_CXT my_cxt_t *my_cxtp
  413. #define pMY_CXT_ pMY_CXT,
  414. #define _pMY_CXT ,pMY_CXT
  415. #define aMY_CXT my_cxtp
  416. #define aMY_CXT_ aMY_CXT,
  417. #define _aMY_CXT ,aMY_CXT
  418. #else /* single interpreter */
  419. #define START_MY_CXT static my_cxt_t my_cxt;
  420. #define dMY_CXT_SV dNOOP
  421. #define dMY_CXT dNOOP
  422. #define MY_CXT_INIT NOOP
  423. #define MY_CXT my_cxt
  424. #define pMY_CXT void
  425. #define pMY_CXT_
  426. #define _pMY_CXT
  427. #define aMY_CXT
  428. #define aMY_CXT_
  429. #define _aMY_CXT
  430. #endif 
  431. #endif /* START_MY_CXT */
  432. #ifndef IVdf
  433. #  if IVSIZE == LONGSIZE
  434. #       define IVdf "ld"
  435. #       define UVuf "lu"
  436. #       define UVof "lo"
  437. #       define UVxf "lx"
  438. #       define UVXf "lX"
  439. #   else
  440. #       if IVSIZE == INTSIZE
  441. #           define IVdf "d"
  442. #           define UVuf "u"
  443. #           define UVof "o"
  444. #           define UVxf "x"
  445. #           define UVXf "X"
  446. #       endif
  447. #   endif
  448. #endif
  449. #ifndef NVef
  450. #   if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && 
  451. defined(PERL_PRIfldbl) /* Not very likely, but let's try anyway. */ 
  452. #       define NVef PERL_PRIeldbl
  453. #       define NVff PERL_PRIfldbl
  454. #       define NVgf PERL_PRIgldbl
  455. #   else
  456. #       define NVef "e"
  457. #       define NVff "f"
  458. #       define NVgf "g"
  459. #   endif
  460. #endif
  461. #ifndef AvFILLp /* Older perls (<=5.003) lack AvFILLp */
  462. #   define AvFILLp AvFILL
  463. #endif
  464. #ifdef SvPVbyte
  465. #   if PERL_REVISION == 5 && PERL_VERSION < 7
  466.        /* SvPVbyte does not work in perl-5.6.1, borrowed version for 5.7.3 */
  467. #       undef SvPVbyte
  468. #       define SvPVbyte(sv, lp) 
  469.           ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) 
  470.            ? ((lp = SvCUR(sv)), SvPVX(sv)) : my_sv_2pvbyte(aTHX_ sv, &lp))
  471.        static char *
  472.        my_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
  473.        {   
  474.            sv_utf8_downgrade(sv,0);
  475.            return SvPV(sv,*lp);
  476.        }
  477. #   endif
  478. #else
  479. #   define SvPVbyte SvPV
  480. #endif
  481. #ifndef SvPV_nolen
  482. #   define SvPV_nolen(sv) 
  483.         ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK 
  484.          ? SvPVX(sv) : sv_2pv_nolen(sv))
  485.     static char *
  486.     sv_2pv_nolen(pTHX_ register SV *sv)
  487.     {   
  488.         STRLEN n_a;
  489.         return sv_2pv(sv, &n_a);
  490.     }
  491. #endif
  492. #endif /* _P_P_PORTABILITY_H_ */
  493. /* End of File ppport.h */