X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl.h;h=c9d359c8f5f0e0bc19a56dbb1e299dd18bcb98fc;hb=b5b9f165df214cd14506c7e79b598983b710c986;hp=8655111f0bc910734fdd4769745cb50ecad27bea;hpb=53305cf15fa20bba9e66475dfc049c6ed9d96c55;p=p5sagit%2Fp5-mst-13.2.git diff --git a/perl.h b/perl.h index 8655111..c9d359c 100644 --- a/perl.h +++ b/perl.h @@ -62,7 +62,7 @@ #ifdef PERL_IMPLICIT_CONTEXT # ifdef USE_5005THREADS struct perl_thread; -# define pTHX register struct perl_thread *thr +# define pTHX register struct perl_thread *thr PERL_UNUSED_DECL # define aTHX thr # define dTHR dNOOP /* only backward compatibility */ # define dTHXa(a) pTHX = (struct perl_thread*)a @@ -70,7 +70,7 @@ struct perl_thread; # ifndef MULTIPLICITY # define MULTIPLICITY # endif -# define pTHX register PerlInterpreter *my_perl +# define pTHX register PerlInterpreter *my_perl PERL_UNUSED_DECL # define aTHX my_perl # define dTHXa(a) pTHX = (PerlInterpreter*)a # endif @@ -413,11 +413,11 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # include #endif -#if defined(HAS_SYSCALL) && !defined(HAS_SYSCALL_PROTO) +#if defined(HAS_SYSCALL) && !defined(HAS_SYSCALL_PROTO) && !defined(PERL_MICRO) int syscall(int, ...); #endif -#if defined(HAS_USLEEP) && !defined(HAS_USLEEP_PROTO) +#if defined(HAS_USLEEP) && !defined(HAS_USLEEP_PROTO) && !defined(PERL_MICRO) int usleep(unsigned int); #endif @@ -425,7 +425,10 @@ int usleep(unsigned int); # define MYSWAP #endif -#if !defined(PERL_FOR_X2P) && !defined(WIN32) +/* Cannot include embed.h here on Win32 as win32.h has not + yet been included and defines some config variables e.g. HAVE_INTERP_INTERN + */ +#if !defined(PERL_FOR_X2P) && !(defined(WIN32)||defined(VMS)) # include "embed.h" #endif @@ -800,7 +803,7 @@ int sockatmark(int); * in the face of half-implementations.) */ -#ifdef I_SYSMODE +#if defined(I_SYSMODE) && !defined(PERL_MICRO) #include #endif @@ -1282,7 +1285,7 @@ typedef NVTYPE NV; # define Perl_fp_class_zero(x) (Perl_fp_class(x)==FP_CLASS_NZERO||Perl_fp_class(x)==FP_CLASS_PZERO) #endif -#if !defined(Perl_fp_class) && defined(HAS_FP_CLASS) +#if !defined(Perl_fp_class) && defined(HAS_FP_CLASS) && !defined(PERL_MICRO) # include # if !defined(FP_SNAN) && defined(I_FP_CLASS) # include @@ -1357,6 +1360,10 @@ typedef NVTYPE NV; # endif #endif +#ifdef UNDER_CE +int isnan(double d); +#endif + #ifndef Perl_isinf # ifdef HAS_ISINF # define Perl_isinf(x) isinf((NV)x) @@ -1632,6 +1639,8 @@ typedef struct mgvtbl MGVTBL; typedef union any ANY; typedef struct ptr_tbl_ent PTR_TBL_ENT_t; typedef struct ptr_tbl PTR_TBL_t; +typedef struct clone_params CLONE_PARAMS; + #include "handy.h" @@ -1735,7 +1744,7 @@ typedef struct ptr_tbl PTR_TBL_t; # endif #endif -#if defined(OS2) +#if defined(OS2) || defined(MACOS_TRADITIONAL) # include "iperlsys.h" #endif @@ -1752,6 +1761,7 @@ typedef struct ptr_tbl PTR_TBL_t; #else # if defined(VMS) # include "vmsish.h" +# include "embed.h" # else # if defined(PLAN9) # include "./plan9/plan9ish.h" @@ -1813,6 +1823,10 @@ typedef struct ptr_tbl PTR_TBL_t; # define PERL_SYS_INIT3(argvp,argcp,envp) PERL_SYS_INIT(argvp,argcp) #endif +#ifndef PERL_WRITE_MSG_TO_CONSOLE +# define PERL_WRITE_MSG_TO_CONSOLE(io, msg, len) PerlIO_write(io, msg, len) +#endif + #ifndef MAXPATHLEN # ifdef PATH_MAX # ifdef _POSIX_PATH_MAX @@ -1884,7 +1898,7 @@ typedef pthread_key_t perl_key; #endif /* NETWARE */ #endif /* USE_5005THREADS || USE_ITHREADS */ -#ifdef WIN32 +#if defined(WIN32) # include "win32.h" #endif @@ -2020,6 +2034,14 @@ typedef pthread_key_t perl_key; # endif #endif +#ifndef Nullformat +# ifdef CHECK_FORMAT +# define Nullformat "%s","" +# else +# define Nullformat Nullch +# endif +#endif + /* Some unistd.h's give a prototype for pause() even though HAS_PAUSE ends up undefined. This causes the #define below to be rejected by the compiler. Sigh. @@ -2077,7 +2099,7 @@ typedef I32 (*filter_t) (pTHX_ int, SV *, int); #define FILTER_DATA(idx) (AvARRAY(PL_rsfp_filters)[idx]) #define FILTER_ISREADER(idx) (idx >= AvFILLp(PL_rsfp_filters)) -#if !defined(OS2) +#if !defined(OS2) && !defined(MACOS_TRADITIONAL) # include "iperlsys.h" #endif #include "regexp.h" @@ -2304,30 +2326,50 @@ Gid_t getegid (void); #define DEBUG_TOP_FLAG 0x80000000 /* XXX what's this for ??? */ +# define DEBUG_p_TEST_ (PL_debug & DEBUG_p_FLAG) +# define DEBUG_s_TEST_ (PL_debug & DEBUG_s_FLAG) +# define DEBUG_l_TEST_ (PL_debug & DEBUG_l_FLAG) +# define DEBUG_t_TEST_ (PL_debug & DEBUG_t_FLAG) +# define DEBUG_o_TEST_ (PL_debug & DEBUG_o_FLAG) +# define DEBUG_c_TEST_ (PL_debug & DEBUG_c_FLAG) +# define DEBUG_P_TEST_ (PL_debug & DEBUG_P_FLAG) +# define DEBUG_m_TEST_ (PL_debug & DEBUG_m_FLAG) +# define DEBUG_f_TEST_ (PL_debug & DEBUG_f_FLAG) +# define DEBUG_r_TEST_ (PL_debug & DEBUG_r_FLAG) +# define DEBUG_x_TEST_ (PL_debug & DEBUG_x_FLAG) +# define DEBUG_u_TEST_ (PL_debug & DEBUG_u_FLAG) +# define DEBUG_L_TEST_ (PL_debug & DEBUG_L_FLAG) +# define DEBUG_H_TEST_ (PL_debug & DEBUG_H_FLAG) +# define DEBUG_X_TEST_ (PL_debug & DEBUG_X_FLAG) +# define DEBUG_D_TEST_ (PL_debug & DEBUG_D_FLAG) +# define DEBUG_S_TEST_ (PL_debug & DEBUG_S_FLAG) +# define DEBUG_T_TEST_ (PL_debug & DEBUG_T_FLAG) +# define DEBUG_R_TEST_ (PL_debug & DEBUG_R_FLAG) + #ifdef DEBUGGING # undef YYDEBUG # define YYDEBUG 1 -# define DEBUG_p_TEST (PL_debug & DEBUG_p_FLAG) -# define DEBUG_s_TEST (PL_debug & DEBUG_s_FLAG) -# define DEBUG_l_TEST (PL_debug & DEBUG_l_FLAG) -# define DEBUG_t_TEST (PL_debug & DEBUG_t_FLAG) -# define DEBUG_o_TEST (PL_debug & DEBUG_o_FLAG) -# define DEBUG_c_TEST (PL_debug & DEBUG_c_FLAG) -# define DEBUG_P_TEST (PL_debug & DEBUG_P_FLAG) -# define DEBUG_m_TEST (PL_debug & DEBUG_m_FLAG) -# define DEBUG_f_TEST (PL_debug & DEBUG_f_FLAG) -# define DEBUG_r_TEST (PL_debug & DEBUG_r_FLAG) -# define DEBUG_x_TEST (PL_debug & DEBUG_x_FLAG) -# define DEBUG_u_TEST (PL_debug & DEBUG_u_FLAG) -# define DEBUG_L_TEST (PL_debug & DEBUG_L_FLAG) -# define DEBUG_H_TEST (PL_debug & DEBUG_H_FLAG) -# define DEBUG_X_TEST (PL_debug & DEBUG_X_FLAG) -# define DEBUG_D_TEST (PL_debug & DEBUG_D_FLAG) -# define DEBUG_S_TEST (PL_debug & DEBUG_S_FLAG) -# define DEBUG_T_TEST (PL_debug & DEBUG_T_FLAG) -# define DEBUG_R_TEST (PL_debug & DEBUG_R_FLAG) +# define DEBUG_p_TEST DEBUG_p_TEST_ +# define DEBUG_s_TEST DEBUG_s_TEST_ +# define DEBUG_l_TEST DEBUG_l_TEST_ +# define DEBUG_t_TEST DEBUG_t_TEST_ +# define DEBUG_o_TEST DEBUG_o_TEST_ +# define DEBUG_c_TEST DEBUG_c_TEST_ +# define DEBUG_P_TEST DEBUG_P_TEST_ +# define DEBUG_m_TEST DEBUG_m_TEST_ +# define DEBUG_f_TEST DEBUG_f_TEST_ +# define DEBUG_r_TEST DEBUG_r_TEST_ +# define DEBUG_x_TEST DEBUG_x_TEST_ +# define DEBUG_u_TEST DEBUG_u_TEST_ +# define DEBUG_L_TEST DEBUG_L_TEST_ +# define DEBUG_H_TEST DEBUG_H_TEST_ +# define DEBUG_X_TEST DEBUG_X_TEST_ +# define DEBUG_D_TEST DEBUG_D_TEST_ +# define DEBUG_S_TEST DEBUG_S_TEST_ +# define DEBUG_T_TEST DEBUG_T_TEST_ +# define DEBUG_R_TEST DEBUG_R_TEST_ # define DEB(a) a # define DEBUG(a) if (PL_debug) a @@ -2415,7 +2457,7 @@ Gid_t getegid (void); #endif /* DEBUGGING */ -/* These constants should be used in preference to to raw characters +/* These constants should be used in preference to raw characters * when using magic. Note that some perl guts still assume * certain character properties of these constants, namely that * isUPPER() and toLOWER() may do useful mappings. @@ -3038,7 +3080,6 @@ enum { /* pass one of these to get_vtbl */ #define HINT_STRICT_REFS 0x00000002 #define HINT_LOCALE 0x00000004 #define HINT_BYTES 0x00000008 -#define HINT_BYTES 0x00000008 /* #define HINT_notused10 0x00000010 */ /* Note: 20,40,80 used for NATIVE_HINTS */ @@ -3059,12 +3100,28 @@ enum { /* pass one of these to get_vtbl */ #define HINT_FILETEST_ACCESS 0x00400000 #define HINT_UTF8 0x00800000 -/* Various states of an input record separator SV (rs, nrs) */ +#define HINT_SORT_SORT_BITS 0x000000FF /* allow 256 different ones */ +#define HINT_SORT_QUICKSORT 0x00000001 +#define HINT_SORT_MERGESORT 0x00000002 +#define HINT_SORT_STABLE 0x00000100 /* sort styles (currently one) */ + +/* Various states of the input record separator SV (rs) */ #define RsSNARF(sv) (! SvOK(sv)) #define RsSIMPLE(sv) (SvOK(sv) && (! SvPOK(sv) || SvCUR(sv))) #define RsPARA(sv) (SvPOK(sv) && ! SvCUR(sv)) #define RsRECORD(sv) (SvROK(sv) && (SvIV(SvRV(sv)) > 0)) +/* A struct for keeping various DEBUGGING related stuff, + * neatly packed. Currently only scratch variables for + * constructing debug output are included. Needed always, + * not just when DEBUGGING, though, because of the re extension. c*/ +struct perl_debug_pad { + SV pad[3]; +}; + +#define PERL_DEBUG_PAD(i) &(PL_debug_pad.pad[i]) +#define PERL_DEBUG_PAD_ZERO(i) (sv_setpvn(PERL_DEBUG_PAD(i), "", 0), PERL_DEBUG_PAD(i)) + /* Enable variables which are pointers to functions */ typedef void (CPERLscope(*peep_t))(pTHX_ OP* o); typedef regexp*(CPERLscope(*regcomp_t)) (pTHX_ char* exp, char* xend, PMOP* pm); @@ -3215,6 +3272,7 @@ END_EXTERN_C #endif #if defined(WIN32) +/* Now all the config stuff is setup we can include embed.h */ # include "embed.h" #endif @@ -3758,6 +3816,83 @@ typedef struct am_table_short AMTS; # endif #endif +/* + * Boilerplate macros for initializing and accessing interpreter-local + * data from C. All statics in extensions should be reworked to use + * this, if you want to make the extension thread-safe. See ext/re/re.xs + * for an example of the use of these macros. + * + * Code that uses these macros is responsible for the following: + * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts" + * 2. Declare a typedef named my_cxt_t that is a structure that contains + * all the data that needs to be interpreter-local. + * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t. + * 4. Use the MY_CXT_INIT macro such that it is called exactly once + * (typically put in the BOOT: section). + * 5. Use the members of the my_cxt_t structure everywhere as + * MY_CXT.member. + * 6. Use the dMY_CXT macro (a declaration) in all the functions that + * access MY_CXT. + */ + +#if defined(PERL_IMPLICIT_CONTEXT) + +/* This must appear in all extensions that define a my_cxt_t structure, + * right after the definition (i.e. at file scope). The non-threads + * case below uses it to declare the data as static. */ +#define START_MY_CXT + +/* Fetches the SV that keeps the per-interpreter data. */ +#define dMY_CXT_SV \ + SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \ + sizeof(MY_CXT_KEY)-1, TRUE) + +/* This declaration should be used within all functions that use the + * interpreter-local data. */ +#define dMY_CXT \ + dMY_CXT_SV; \ + my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)) + +/* Creates and zeroes the per-interpreter data. + * (We allocate my_cxtp in a Perl SV so that it will be released when + * the interpreter goes away.) */ +#define MY_CXT_INIT \ + dMY_CXT_SV; \ + /* newSV() allocates one more than needed */ \ + my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ + Zero(my_cxtp, 1, my_cxt_t); \ + sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) + +/* This macro must be used to access members of the my_cxt_t structure. + * e.g. MYCXT.some_data */ +#define MY_CXT (*my_cxtp) + +/* Judicious use of these macros can reduce the number of times dMY_CXT + * is used. Use is similar to pTHX, aTHX etc. */ +#define pMY_CXT my_cxt_t *my_cxtp +#define pMY_CXT_ pMY_CXT, +#define _pMY_CXT ,pMY_CXT +#define aMY_CXT my_cxtp +#define aMY_CXT_ aMY_CXT, +#define _aMY_CXT ,aMY_CXT + +#else /* USE_ITHREADS */ + +#define START_MY_CXT static my_cxt_t my_cxt; +#define dMY_CXT_SV dNOOP +#define dMY_CXT dNOOP +#define MY_CXT_INIT NOOP +#define MY_CXT my_cxt + +#define pMY_CXT void +#define pMY_CXT_ +#define _pMY_CXT +#define aMY_CXT +#define aMY_CXT_ +#define _aMY_CXT + +#endif /* !defined(USE_ITHREADS) */ + #ifdef I_FCNTL # include #endif @@ -3852,6 +3987,7 @@ int flock(int fd, int op); /* Input flags: */ #define PERL_SCAN_ALLOW_UNDERSCORES 0x01 /* grok_??? accept _ in numbers */ +#define PERL_SCAN_DISALLOW_PREFIX 0x02 /* grok_??? reject 0x in hex etc */ /* Output flags: */ #define PERL_SCAN_GREATER_THAN_UV_MAX 0x02 /* should this merge with above? */ @@ -3863,6 +3999,30 @@ extern void moncontrol(int); #define PERL_GPROF_MONCONTROL(x) #endif +#ifdef UNDER_CE +#include "wince.h" +#endif + +/* ISO 6429 NEL - C1 control NExt Line */ +/* See http://www.unicode.org/unicode/reports/tr13/ */ +#ifdef EBCDIC /* In EBCDIC NEL is just an alias for LF */ +# if '^' == 95 /* CP 1047: MVS OpenEdition - OS/390 - z/OS */ +# define NEXT_LINE_CHAR 0x15 +# else /* CDRA */ +# define NEXT_LINE_CHAR 0x25 +# endif +#else +# define NEXT_LINE_CHAR 0x85 +#endif + +/* The UTF-8 bytes of the Unicode LS and PS, U+2028 and U+2029 */ +#define UNICODE_LINE_SEPA_0 0xE2 +#define UNICODE_LINE_SEPA_1 0x80 +#define UNICODE_LINE_SEPA_2 0xA8 +#define UNICODE_PARA_SEPA_0 0xE2 +#define UNICODE_PARA_SEPA_1 0x80 +#define UNICODE_PARA_SEPA_2 0xA9 + /* and finally... */ #define PERL_PATCHLEVEL_H_IMPLICIT #include "patchlevel.h" @@ -3872,9 +4032,6 @@ extern void moncontrol(int); NV_PRESERVES_UV - HAS_ICONV - I_ICONV - HAS_MKSTEMP HAS_MKSTEMPS HAS_MKDTEMP @@ -3908,11 +4065,10 @@ extern void moncontrol(int); HAS_STRUCT_CMSGHDR HAS_NL_LANGINFO + + HAS_DIRFD so that Configure picks them up. */ -#ifdef UNDER_CE -#include "wince.h" -#endif - #endif /* Include guard */ +