Upgrade to Devel::PPPort 3.08_02
[p5sagit/p5-mst-13.2.git] / ext / Devel / PPPort / parts / inc / misc
CommitLineData
adfe19db 1################################################################################
2##
c07deaaf 3## $Revision: 36 $
adfe19db 4## $Author: mhx $
c07deaaf 5## $Date: 2006/05/22 00:51:01 +0200 $
adfe19db 6##
7################################################################################
8##
0d0f8426 9## Version 3.x, Copyright (C) 2004-2006, Marcus Holland-Moritz.
adfe19db 10## Version 2.x, Copyright (C) 2001, Paul Marquess.
11## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
12##
13## This program is free software; you can redistribute it and/or
14## modify it under the same terms as Perl itself.
15##
16################################################################################
17
18=provides
19
20__UNDEFINED__
21PERL_UNUSED_DECL
f2ab5a41 22PERL_UNUSED_ARG
23PERL_UNUSED_VAR
24PERL_UNUSED_CONTEXT
a745474a 25PERL_GCC_BRACE_GROUPS_FORBIDDEN
c07deaaf 26PERL_USE_GCC_BRACE_GROUPS
adfe19db 27NVTYPE
28INT2PTR
29PTRV
30NUM2PTR
31PTR2IV
32PTR2UV
33PTR2NV
34PTR2ul
a745474a 35START_EXTERN_C
36END_EXTERN_C
37EXTERN_C
38STMT_START
39STMT_END
0d0f8426 40XSRETURN
adfe19db 41/PL_\w+/
42
43=implementation
44
0d0f8426 45#if { VERSION <= 5.004_05 }
adfe19db 46/* Replace: 1 */
96ad942f 47# define PL_DBsingle DBsingle
48# define PL_DBsub DBsub
49# define PL_Sv Sv
50# define PL_compiling compiling
51# define PL_copline copline
52# define PL_curcop curcop
53# define PL_curstash curstash
54# define PL_debstash debstash
55# define PL_defgv defgv
56# define PL_diehook diehook
57# define PL_dirty dirty
58# define PL_dowarn dowarn
59# define PL_errgv errgv
60# define PL_hexdigit hexdigit
61# define PL_hints hints
62# define PL_na na
63# define PL_no_modify no_modify
64# define PL_perl_destruct_level perl_destruct_level
65# define PL_perldb perldb
66# define PL_ppaddr ppaddr
67# define PL_rsfp_filters rsfp_filters
68# define PL_rsfp rsfp
69# define PL_stack_base stack_base
70# define PL_stack_sp stack_sp
71# define PL_stdingv stdingv
72# define PL_sv_arenaroot sv_arenaroot
73# define PL_sv_no sv_no
74# define PL_sv_undef sv_undef
75# define PL_sv_yes sv_yes
76# define PL_tainted tainted
77# define PL_tainting tainting
adfe19db 78/* Replace: 0 */
79#endif
80
62093c1c 81#ifndef PERL_UNUSED_DECL
82# ifdef HASATTRIBUTE
83# if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
84# define PERL_UNUSED_DECL
85# else
86# define PERL_UNUSED_DECL __attribute__((unused))
87# endif
adfe19db 88# else
62093c1c 89# define PERL_UNUSED_DECL
adfe19db 90# endif
adfe19db 91#endif
92
f2ab5a41 93#ifndef PERL_UNUSED_ARG
94# if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */
95# include <note.h>
96# define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x))
97# else
98# define PERL_UNUSED_ARG(x) ((void)x)
99# endif
100#endif
101
102#ifndef PERL_UNUSED_VAR
103# define PERL_UNUSED_VAR(x) ((void)x)
104#endif
105
106#ifndef PERL_UNUSED_CONTEXT
107# ifdef USE_ITHREADS
108# define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl)
109# else
110# define PERL_UNUSED_CONTEXT
111# endif
112#endif
113
114__UNDEFINED__ NOOP /*EMPTY*/(void)0
115__UNDEFINED__ dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL
adfe19db 116
117#ifndef NVTYPE
118# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
119# define NVTYPE long double
120# else
121# define NVTYPE double
122# endif
123typedef NVTYPE NV;
124#endif
125
126#ifndef INT2PTR
127
128# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
129# define PTRV UV
130# define INT2PTR(any,d) (any)(d)
131# else
132# if PTRSIZE == LONGSIZE
133# define PTRV unsigned long
134# else
135# define PTRV unsigned
136# endif
137# define INT2PTR(any,d) (any)(PTRV)(d)
138# endif
139
140# define NUM2PTR(any,d) (any)(PTRV)(d)
141# define PTR2IV(p) INT2PTR(IV,p)
142# define PTR2UV(p) INT2PTR(UV,p)
143# define PTR2NV(p) NUM2PTR(NV,p)
144
145# if PTRSIZE == LONGSIZE
146# define PTR2ul(p) (unsigned long)(p)
147# else
4a582685 148# define PTR2ul(p) INT2PTR(unsigned long,p)
adfe19db 149# endif
150
151#endif /* !INT2PTR */
152
a745474a 153#undef START_EXTERN_C
154#undef END_EXTERN_C
155#undef EXTERN_C
156#ifdef __cplusplus
157# define START_EXTERN_C extern "C" {
158# define END_EXTERN_C }
159# define EXTERN_C extern "C"
160#else
161# define START_EXTERN_C
162# define END_EXTERN_C
163# define EXTERN_C extern
164#endif
165
c07deaaf 166#if defined(PERL_GCC_PEDANTIC)
167# ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
a745474a 168# define PERL_GCC_BRACE_GROUPS_FORBIDDEN
169# endif
170#endif
171
c07deaaf 172#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
173# ifndef PERL_USE_GCC_BRACE_GROUPS
174# define PERL_USE_GCC_BRACE_GROUPS
175# endif
176#endif
177
a745474a 178#undef STMT_START
179#undef STMT_END
c07deaaf 180#ifdef PERL_USE_GCC_BRACE_GROUPS
a745474a 181# define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */
182# define STMT_END )
183#else
184# if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
185# define STMT_START if (1)
186# define STMT_END else (void)0
187# else
188# define STMT_START do
189# define STMT_END while (0)
190# endif
191#endif
192
adfe19db 193__UNDEFINED__ boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no)
194
195/* DEFSV appears first in 5.004_56 */
196__UNDEFINED__ DEFSV GvSV(PL_defgv)
197__UNDEFINED__ SAVE_DEFSV SAVESPTR(GvSV(PL_defgv))
198
199/* Older perls (<=5.003) lack AvFILLp */
200__UNDEFINED__ AvFILLp AvFILL
201
202__UNDEFINED__ ERRSV get_sv("@",FALSE)
203
204__UNDEFINED__ newSVpvn(data,len) ((data) \
205 ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \
206 : newSV(0))
207
208/* Hint: gv_stashpvn
209 * This function's backport doesn't support the length parameter, but
210 * rather ignores it. Portability can only be ensured if the length
211 * parameter is used for speed reasons, but the length can always be
212 * correctly computed from the string argument.
213 */
214
215__UNDEFINED__ gv_stashpvn(str,len,create) gv_stashpv(str,create)
216
217/* Replace: 1 */
218__UNDEFINED__ get_cv perl_get_cv
219__UNDEFINED__ get_sv perl_get_sv
220__UNDEFINED__ get_av perl_get_av
221__UNDEFINED__ get_hv perl_get_hv
222/* Replace: 0 */
223
adfe19db 224__UNDEFINED__ dUNDERBAR dNOOP
225__UNDEFINED__ UNDERBAR DEFSV
226
227__UNDEFINED__ dAX I32 ax = MARK - PL_stack_base + 1
228__UNDEFINED__ dITEMS I32 items = SP - MARK
229
9132e1a3 230__UNDEFINED__ dXSTARG SV * targ = sv_newmortal()
231
0d0f8426 232__UNDEFINED__ dAXMARK I32 ax = POPMARK; \
233 register SV ** const mark = PL_stack_base + ax++
234
235
236__UNDEFINED__ XSprePUSH (sp = PL_stack_base + ax - 1)
237
238#if { VERSION < 5.005 }
239# undef XSRETURN
240# define XSRETURN(off) \
241 STMT_START { \
242 PL_stack_sp = PL_stack_base + ax + ((off) - 1); \
243 return; \
244 } STMT_END
245#endif
246
f2ab5a41 247__UNDEFINED__ PERL_ABS(x) ((x) < 0 ? -(x) : (x))
248
249__UNDEFINED__ dVAR dNOOP
250
251__UNDEFINED__ SVf "_"
252
9132e1a3 253=xsmisc
254
255XS(XS_Devel__PPPort_dXSTARG); /* prototype */
256XS(XS_Devel__PPPort_dXSTARG)
257{
258 dXSARGS;
259 dXSTARG;
2dd69576 260 IV iv;
9132e1a3 261 SP -= items;
2dd69576 262 iv = SvIV(ST(0)) + 1;
9132e1a3 263 PUSHi(iv);
264 XSRETURN(1);
265}
266
0d0f8426 267XS(XS_Devel__PPPort_dAXMARK); /* prototype */
268XS(XS_Devel__PPPort_dAXMARK)
269{
270 dSP;
271 dAXMARK;
272 dITEMS;
273 IV iv;
274 SP -= items;
275 iv = SvIV(ST(0)) - 1;
276 PUSHs(sv_2mortal(newSViv(iv)));
277 XSRETURN(1);
278}
279
9132e1a3 280=xsboot
281
282newXS("Devel::PPPort::dXSTARG", XS_Devel__PPPort_dXSTARG, file);
0d0f8426 283newXS("Devel::PPPort::dAXMARK", XS_Devel__PPPort_dAXMARK, file);
9132e1a3 284
adfe19db 285=xsubs
286
287int
288gv_stashpvn(name, create)
289 char *name
290 I32 create
291 CODE:
292 RETVAL = gv_stashpvn(name, strlen(name), create) != NULL;
293 OUTPUT:
294 RETVAL
295
296int
297get_sv(name, create)
298 char *name
299 I32 create
300 CODE:
301 RETVAL = get_sv(name, create) != NULL;
302 OUTPUT:
303 RETVAL
304
305int
306get_av(name, create)
307 char *name
308 I32 create
309 CODE:
310 RETVAL = get_av(name, create) != NULL;
311 OUTPUT:
312 RETVAL
313
314int
315get_hv(name, create)
316 char *name
317 I32 create
318 CODE:
319 RETVAL = get_hv(name, create) != NULL;
320 OUTPUT:
321 RETVAL
322
323int
324get_cv(name, create)
325 char *name
326 I32 create
327 CODE:
328 RETVAL = get_cv(name, create) != NULL;
329 OUTPUT:
330 RETVAL
331
332void
333newSVpvn()
334 PPCODE:
335 XPUSHs(newSVpvn("test", 4));
336 XPUSHs(newSVpvn("test", 2));
337 XPUSHs(newSVpvn("test", 0));
338 XPUSHs(newSVpvn(NULL, 2));
339 XPUSHs(newSVpvn(NULL, 0));
340 XSRETURN(5);
341
0d0f8426 342void
343xsreturn(two)
344 int two
345 PPCODE:
346 XPUSHs(newSVpvn("test1", 5));
347 if (two)
348 XPUSHs(newSVpvn("test2", 5));
349 if (two)
350 XSRETURN(2);
351 else
352 XSRETURN(1);
353
adfe19db 354SV *
355PL_sv_undef()
356 CODE:
357 RETVAL = newSVsv(&PL_sv_undef);
358 OUTPUT:
359 RETVAL
360
361SV *
362PL_sv_yes()
363 CODE:
364 RETVAL = newSVsv(&PL_sv_yes);
365 OUTPUT:
366 RETVAL
367
368SV *
369PL_sv_no()
370 CODE:
371 RETVAL = newSVsv(&PL_sv_no);
372 OUTPUT:
373 RETVAL
374
375int
376PL_na(string)
377 char *string
378 CODE:
379 PL_na = strlen(string);
380 RETVAL = PL_na;
381 OUTPUT:
382 RETVAL
383
384SV*
385boolSV(value)
386 int value
387 CODE:
388 RETVAL = newSVsv(boolSV(value));
389 OUTPUT:
390 RETVAL
391
392SV*
393DEFSV()
394 CODE:
395 RETVAL = newSVsv(DEFSV);
396 OUTPUT:
397 RETVAL
398
399int
400ERRSV()
401 CODE:
402 RETVAL = SvTRUE(ERRSV);
403 OUTPUT:
404 RETVAL
405
406SV*
407UNDERBAR()
408 CODE:
409 {
410 dUNDERBAR;
411 RETVAL = newSVsv(UNDERBAR);
412 }
413 OUTPUT:
414 RETVAL
415
0d0f8426 416void
417prepush()
418 CODE:
419 {
420 dXSTARG;
421 XSprePUSH;
422 PUSHi(42);
423 XSRETURN(1);
424 }
425
f2ab5a41 426int
427PERL_ABS(a)
428 int a
429
430void
431SVf(x)
432 SV *x
433 PPCODE:
434#if { VERSION >= 5.004 }
435 x = newSVpvf("[%"SVf"]", x);
436#endif
437 XPUSHs(x);
438 XSRETURN(1);
439
440=tests plan => 42
adfe19db 441
442use vars qw($my_sv @my_av %my_hv);
443
444my @s = &Devel::PPPort::newSVpvn();
445ok(@s == 5);
446ok($s[0], "test");
447ok($s[1], "te");
448ok($s[2], "");
449ok(!defined($s[3]));
450ok(!defined($s[4]));
451
452ok(!defined(&Devel::PPPort::PL_sv_undef()));
453ok(&Devel::PPPort::PL_sv_yes());
454ok(!&Devel::PPPort::PL_sv_no());
455ok(&Devel::PPPort::PL_na("abcd"), 4);
456
457ok(&Devel::PPPort::boolSV(1));
458ok(!&Devel::PPPort::boolSV(0));
459
460$_ = "Fred";
461ok(&Devel::PPPort::DEFSV(), "Fred");
462ok(&Devel::PPPort::UNDERBAR(), "Fred");
463
0d0f8426 464if ($] >= 5.009002) {
465 eval q{
466 my $_ = "Tony";
467 ok(&Devel::PPPort::DEFSV(), "Fred");
468 ok(&Devel::PPPort::UNDERBAR(), "Tony");
469 };
470}
471else {
472 ok(1);
473 ok(1);
474}
475
adfe19db 476eval { 1 };
477ok(!&Devel::PPPort::ERRSV());
478eval { cannot_call_this_one() };
479ok(&Devel::PPPort::ERRSV());
480
481ok(&Devel::PPPort::gv_stashpvn('Devel::PPPort', 0));
482ok(!&Devel::PPPort::gv_stashpvn('does::not::exist', 0));
483ok(&Devel::PPPort::gv_stashpvn('does::not::exist', 1));
484
485$my_sv = 1;
486ok(&Devel::PPPort::get_sv('my_sv', 0));
487ok(!&Devel::PPPort::get_sv('not_my_sv', 0));
488ok(&Devel::PPPort::get_sv('not_my_sv', 1));
489
490@my_av = (1);
491ok(&Devel::PPPort::get_av('my_av', 0));
492ok(!&Devel::PPPort::get_av('not_my_av', 0));
493ok(&Devel::PPPort::get_av('not_my_av', 1));
494
495%my_hv = (a=>1);
496ok(&Devel::PPPort::get_hv('my_hv', 0));
497ok(!&Devel::PPPort::get_hv('not_my_hv', 0));
498ok(&Devel::PPPort::get_hv('not_my_hv', 1));
499
500sub my_cv { 1 };
501ok(&Devel::PPPort::get_cv('my_cv', 0));
502ok(!&Devel::PPPort::get_cv('not_my_cv', 0));
503ok(&Devel::PPPort::get_cv('not_my_cv', 1));
504
9132e1a3 505ok(Devel::PPPort::dXSTARG(42), 43);
0d0f8426 506ok(Devel::PPPort::dAXMARK(4711), 4710);
507
508ok(Devel::PPPort::prepush(), 42);
9132e1a3 509
0d0f8426 510ok(join(':', Devel::PPPort::xsreturn(0)), 'test1');
511ok(join(':', Devel::PPPort::xsreturn(1)), 'test1:test2');
f2ab5a41 512
513ok(Devel::PPPort::PERL_ABS(42), 42);
514ok(Devel::PPPort::PERL_ABS(-13), 13);
515
516ok(Devel::PPPort::SVf(42), $] >= 5.004 ? '[42]' : '42');
517ok(Devel::PPPort::SVf('abc'), $] >= 5.004 ? '[abc]' : 'abc');
518