Blame parts/inc/strlfuncs

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_strlcat
Packit 7d6a7d
my_strlcpy
Packit 7d6a7d
Packit 7d6a7d
=implementation
Packit 7d6a7d
Packit 7d6a7d
#if !defined(my_strlcat)
Packit 7d6a7d
#if { NEED my_strlcat }
Packit 7d6a7d
Packit 7d6a7d
Size_t
Packit 7d6a7d
my_strlcat(char *dst, const char *src, Size_t size)
Packit 7d6a7d
{
Packit 7d6a7d
    Size_t used, length, copy;
Packit 7d6a7d
Packit 7d6a7d
    used = strlen(dst);
Packit 7d6a7d
    length = strlen(src);
Packit 7d6a7d
    if (size > 0 && used < size - 1) {
Packit 7d6a7d
        copy = (length >= size - used) ? size - used - 1 : length;
Packit 7d6a7d
        memcpy(dst + used, src, copy);
Packit 7d6a7d
        dst[used + copy] = '\0';
Packit 7d6a7d
    }
Packit 7d6a7d
    return used + length;
Packit 7d6a7d
}
Packit 7d6a7d
#endif
Packit 7d6a7d
#endif
Packit 7d6a7d
Packit 7d6a7d
#if !defined(my_strlcpy)
Packit 7d6a7d
#if { NEED my_strlcpy }
Packit 7d6a7d
Packit 7d6a7d
Size_t
Packit 7d6a7d
my_strlcpy(char *dst, const char *src, Size_t size)
Packit 7d6a7d
{
Packit 7d6a7d
    Size_t length, copy;
Packit 7d6a7d
Packit 7d6a7d
    length = strlen(src);
Packit 7d6a7d
    if (size > 0) {
Packit 7d6a7d
        copy = (length >= size) ? size - 1 : length;
Packit 7d6a7d
        memcpy(dst, src, copy);
Packit 7d6a7d
        dst[copy] = '\0';
Packit 7d6a7d
    }
Packit 7d6a7d
    return length;
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
#endif
Packit 7d6a7d
#endif
Packit 7d6a7d
Packit 7d6a7d
=xsinit
Packit 7d6a7d
Packit 7d6a7d
#define NEED_my_strlcat
Packit 7d6a7d
#define NEED_my_strlcpy
Packit 7d6a7d
Packit 7d6a7d
=xsubs
Packit 7d6a7d
Packit 7d6a7d
void
Packit 7d6a7d
my_strlfunc()
Packit 7d6a7d
        PREINIT:
Packit 7d6a7d
                char buf[8];
Packit 7d6a7d
                int len;
Packit 7d6a7d
        PPCODE:
Packit 7d6a7d
                len = my_strlcpy(buf, "foo", sizeof(buf));
Packit 7d6a7d
                mXPUSHi(len);
Packit 7d6a7d
                mXPUSHs(newSVpv(buf, 0));
Packit 7d6a7d
                len = my_strlcat(buf, "bar", sizeof(buf));
Packit 7d6a7d
                mXPUSHi(len);
Packit 7d6a7d
                mXPUSHs(newSVpv(buf, 0));
Packit 7d6a7d
                len = my_strlcat(buf, "baz", sizeof(buf));
Packit 7d6a7d
                mXPUSHi(len);
Packit 7d6a7d
                mXPUSHs(newSVpv(buf, 0));
Packit 7d6a7d
                len = my_strlcpy(buf, "1234567890", sizeof(buf));
Packit 7d6a7d
                mXPUSHi(len);
Packit 7d6a7d
                mXPUSHs(newSVpv(buf, 0));
Packit 7d6a7d
                len = my_strlcpy(buf, "1234", sizeof(buf));
Packit 7d6a7d
                mXPUSHi(len);
Packit 7d6a7d
                mXPUSHs(newSVpv(buf, 0));
Packit 7d6a7d
                len = my_strlcat(buf, "567890123456", sizeof(buf));
Packit 7d6a7d
                mXPUSHi(len);
Packit 7d6a7d
                mXPUSHs(newSVpv(buf, 0));
Packit 7d6a7d
                XSRETURN(12);
Packit 7d6a7d
Packit 7d6a7d
=tests plan => 13
Packit 7d6a7d
Packit 7d6a7d
my @e = (3, 'foo',
Packit 7d6a7d
         6, 'foobar',
Packit 7d6a7d
         9, 'foobarb',
Packit 7d6a7d
         10, '1234567',
Packit 7d6a7d
         4, '1234',
Packit 7d6a7d
         16, '1234567',
Packit 7d6a7d
        );
Packit 7d6a7d
my @r = Devel::PPPort::my_strlfunc();
Packit 7d6a7d
Packit 7d6a7d
ok(@e == @r);
Packit 7d6a7d
Packit 7d6a7d
for (0 .. $#e) {
Packit 7d6a7d
  ok($r[$_], $e[$_]);
Packit 7d6a7d
}