This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
8890db118ceab1237c88bb29c4bdf60a6224ee2f
[perl5.git] / ext / Devel / PPPort / parts / inc / snprintf
1 ################################################################################
2 ##
3 ##  $Revision: 1 $
4 ##  $Author: mhx $
5 ##  $Date: 2006/05/18 23:12:23 +0200 $
6 ##
7 ################################################################################
8 ##
9 ##  Version 3.x, Copyright (C) 2004-2006, Marcus Holland-Moritz.
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 my_snprintf
21
22 =implementation
23
24 #if !defined(my_snprintf)
25 #if { NEED my_snprintf }
26
27 int
28 my_snprintf(char *buffer, const Size_t len, const char *format, ...)
29 {
30     dTHX;
31     int retval;
32     va_list ap;
33     va_start(ap, format);
34 #ifdef HAS_VSNPRINTF
35     retval = vsnprintf(buffer, len, format, ap);
36 #else
37     retval = vsprintf(buffer, format, ap);
38 #endif
39     va_end(ap);
40     if (retval >= (int)len)
41         Perl_croak(aTHX_ "panic: my_snprintf buffer overflow");
42     return retval;
43 }
44
45 #endif
46 #endif
47
48 =xsinit
49
50 #define NEED_my_snprintf
51
52 =xsubs
53
54 void
55 my_snprintf()
56         PREINIT:
57                 char buf[128];
58                 int len;
59         PPCODE:
60                 len = my_snprintf(buf, sizeof buf, "foo%s%d", "bar", 42);
61                 XPUSHs(newSViv(len));
62                 XPUSHs(newSVpv(buf, 0));
63                 XSRETURN(2);
64
65 =tests plan => 2
66
67 my($l, $s) = Devel::PPPort::my_snprintf();
68 ok($l, 8);
69 ok($s, "foobar42");
70