Revert "Upgrade to Devel::PPPort 3.19_02" - we're frozen. This will be great when...
[p5sagit/p5-mst-13.2.git] / cpan / Devel-PPPort / parts / inc / strlfuncs
CommitLineData
aef0a14c 1################################################################################
2##
3f0c6e0c 3## $Revision: 6 $
aef0a14c 4## $Author: mhx $
3f0c6e0c 5## $Date: 2009/01/18 14:10:52 +0100 $
aef0a14c 6##
7################################################################################
8##
3f0c6e0c 9## Version 3.x, Copyright (C) 2004-2009, Marcus Holland-Moritz.
aef0a14c 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
20my_strlcat
21my_strlcpy
22
23=implementation
24
25#if !defined(my_strlcat)
26#if { NEED my_strlcat }
27
28Size_t
29my_strlcat(char *dst, const char *src, Size_t size)
30{
31 Size_t used, length, copy;
32
33 used = strlen(dst);
34 length = strlen(src);
35 if (size > 0 && used < size - 1) {
36 copy = (length >= size - used) ? size - used - 1 : length;
37 memcpy(dst + used, src, copy);
38 dst[used + copy] = '\0';
39 }
40 return used + length;
41}
42#endif
43#endif
44
45#if !defined(my_strlcpy)
46#if { NEED my_strlcpy }
47
48Size_t
49my_strlcpy(char *dst, const char *src, Size_t size)
50{
51 Size_t length, copy;
52
53 length = strlen(src);
54 if (size > 0) {
55 copy = (length >= size) ? size - 1 : length;
56 memcpy(dst, src, copy);
57 dst[copy] = '\0';
58 }
59 return length;
60}
61
62#endif
63#endif
64
65=xsinit
66
67#define NEED_my_strlcat
68#define NEED_my_strlcpy
69
70=xsubs
71
72void
73my_strlfunc()
74 PREINIT:
75 char buf[8];
76 int len;
77 PPCODE:
78 len = my_strlcpy(buf, "foo", sizeof(buf));
c1a049cb 79 mXPUSHi(len);
80 mXPUSHs(newSVpv(buf, 0));
aef0a14c 81 len = my_strlcat(buf, "bar", sizeof(buf));
c1a049cb 82 mXPUSHi(len);
83 mXPUSHs(newSVpv(buf, 0));
aef0a14c 84 len = my_strlcat(buf, "baz", sizeof(buf));
c1a049cb 85 mXPUSHi(len);
86 mXPUSHs(newSVpv(buf, 0));
aef0a14c 87 len = my_strlcpy(buf, "1234567890", sizeof(buf));
c1a049cb 88 mXPUSHi(len);
89 mXPUSHs(newSVpv(buf, 0));
aef0a14c 90 len = my_strlcpy(buf, "1234", sizeof(buf));
c1a049cb 91 mXPUSHi(len);
92 mXPUSHs(newSVpv(buf, 0));
aef0a14c 93 len = my_strlcat(buf, "567890123456", sizeof(buf));
c1a049cb 94 mXPUSHi(len);
95 mXPUSHs(newSVpv(buf, 0));
aef0a14c 96 XSRETURN(12);
97
98=tests plan => 13
99
100my @e = (3, 'foo',
101 6, 'foobar',
102 9, 'foobarb',
103 10, '1234567',
104 4, '1234',
105 16, '1234567',
106 );
107my @r = Devel::PPPort::my_strlfunc();
108
109ok(@e == @r);
110
111for (0 .. $#e) {
112 ok($r[$_], $e[$_]);
113}
114