1################################################################################ 2## 3## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz. 4## Version 2.x, Copyright (C) 2001, Paul Marquess. 5## Version 1.x, Copyright (C) 1999, Kenneth Albanowski. 6## 7## This program is free software; you can redistribute it and/or 8## modify it under the same terms as Perl itself. 9## 10################################################################################ 11 12=provides 13 14my_snprintf 15 16=implementation 17 18#if !defined(my_snprintf) 19#if { NEED my_snprintf } 20 21int 22my_snprintf(char *buffer, const Size_t len, const char *format, ...) 23{ 24 dTHX; 25 int retval; 26 va_list ap; 27 va_start(ap, format); 28#ifdef HAS_VSNPRINTF 29 retval = vsnprintf(buffer, len, format, ap); 30#else 31 retval = vsprintf(buffer, format, ap); 32#endif 33 va_end(ap); 34 if (retval < 0 || (len > 0 && (Size_t)retval >= len)) 35 Perl_croak(aTHX_ "panic: my_snprintf buffer overflow"); 36 return retval; 37} 38 39#endif 40#endif 41 42=xsinit 43 44#define NEED_my_snprintf 45 46=xsubs 47 48void 49my_snprintf() 50 PREINIT: 51 char buf[128]; 52 int len; 53 PPCODE: 54 len = my_snprintf(buf, sizeof buf, "foo%s%d", "bar", 42); 55 mXPUSHi(len); 56 mXPUSHs(newSVpv(buf, 0)); 57 XSRETURN(2); 58 59=tests plan => 2 60 61my($l, $s) = Devel::PPPort::my_snprintf(); 62is($l, 8); 63is($s, "foobar42"); 64