|
Packit |
7d6a7d |
################################################################################
|
|
Packit |
7d6a7d |
##
|
|
Packit |
7d6a7d |
## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
|
|
Packit |
7d6a7d |
## Version 2.x, Copyright (C) 2001, Paul Marquess.
|
|
Packit |
7d6a7d |
## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
|
|
Packit |
7d6a7d |
##
|
|
Packit |
7d6a7d |
## This program is free software; you can redistribute it and/or
|
|
Packit |
7d6a7d |
## modify it under the same terms as Perl itself.
|
|
Packit |
7d6a7d |
##
|
|
Packit |
7d6a7d |
################################################################################
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
=provides
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
my_snprintf
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
=implementation
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#if !defined(my_snprintf)
|
|
Packit |
7d6a7d |
#if { NEED my_snprintf }
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
int
|
|
Packit |
7d6a7d |
my_snprintf(char *buffer, const Size_t len, const char *format, ...)
|
|
Packit |
7d6a7d |
{
|
|
Packit |
7d6a7d |
dTHX;
|
|
Packit |
7d6a7d |
int retval;
|
|
Packit |
7d6a7d |
va_list ap;
|
|
Packit |
7d6a7d |
va_start(ap, format);
|
|
Packit |
7d6a7d |
#ifdef HAS_VSNPRINTF
|
|
Packit |
7d6a7d |
retval = vsnprintf(buffer, len, format, ap);
|
|
Packit |
7d6a7d |
#else
|
|
Packit |
7d6a7d |
retval = vsprintf(buffer, format, ap);
|
|
Packit |
7d6a7d |
#endif
|
|
Packit |
7d6a7d |
va_end(ap);
|
|
Packit |
7d6a7d |
if (retval < 0 || (len > 0 && (Size_t)retval >= len))
|
|
Packit |
7d6a7d |
Perl_croak(aTHX_ "panic: my_snprintf buffer overflow");
|
|
Packit |
7d6a7d |
return retval;
|
|
Packit |
7d6a7d |
}
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#endif
|
|
Packit |
7d6a7d |
#endif
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
=xsinit
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
#define NEED_my_snprintf
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
=xsubs
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
void
|
|
Packit |
7d6a7d |
my_snprintf()
|
|
Packit |
7d6a7d |
PREINIT:
|
|
Packit |
7d6a7d |
char buf[128];
|
|
Packit |
7d6a7d |
int len;
|
|
Packit |
7d6a7d |
PPCODE:
|
|
Packit |
7d6a7d |
len = my_snprintf(buf, sizeof buf, "foo%s%d", "bar", 42);
|
|
Packit |
7d6a7d |
mXPUSHi(len);
|
|
Packit |
7d6a7d |
mXPUSHs(newSVpv(buf, 0));
|
|
Packit |
7d6a7d |
XSRETURN(2);
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
=tests plan => 2
|
|
Packit |
7d6a7d |
|
|
Packit |
7d6a7d |
my($l, $s) = Devel::PPPort::my_snprintf();
|
|
Packit |
7d6a7d |
ok($l, 8);
|
|
Packit |
7d6a7d |
ok($s, "foobar42");
|