File: string.cc

package info (click to toggle)
tardy 1.28-1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 5,732 kB
  • sloc: cpp: 16,173; sh: 3,862; makefile: 1,785; ansic: 1,248; awk: 272
file content (113 lines) | stat: -rw-r--r-- 3,237 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//
//      tardy - a tar post-processor
//      Copyright (C) 1993-1999, 2001, 2002, 2008, 2009, 2011 Peter Miller
//
//      This program is free software; you can redistribute it and/or modify
//      it under the terms of the GNU General Public License as published by
//      the Free Software Foundation; either version 3 of the License, or
//      (at your option) any later version.
//
//      This program is distributed in the hope that it will be useful,
//      but WITHOUT ANY WARRANTY; without even the implied warranty of
//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//      GNU General Public License for more details.
//
//      You should have received a copy of the GNU General Public License
//      along with this program. If not, see
//      <http://www.gnu.org/licenses/>.
//

#include <libtardy/ac/stddef.h>
#include <libtardy/ac/stdio.h>
#include <libtardy/ac/string.h>

#include <libtardy/main.h>


//
//  NAME
//      strerror - string for error number
//
//  SYNOPSIS
//      char *strerror(int errnum);
//
//  DESCRIPTION
//      The strerror function maps the error number in errnum to an error
//      message string.
//
//  RETURNS
//      The strerror function returns a pointer to the string, the contents of
//      which are implementation-defined.  The array pointed to shall not be
//      modified by the program, but may be overwritten by a subsequent call to
//      the strerror function.
//
//  CAVEAT
//      Unknown errors will be rendered in the form "Error %d", where %d will
//      be replaced by a decimal representation of the error number.
//

#ifndef HAVE_STRERROR

char *
strerror(in n)
{
    extern int sys_nerr;
    if (n < 1 || n > sys_nerr)
    {
        static char buffer[16];
        snprintf(buffer, sizeof(buffer), "Error %d", n);
        return buffer;
    }
    extern char *sys_errlist[];
    return sys_errlist[n];
}

#endif // HAVE_STRERROR
#ifndef HAVE_STRVERSCMP

int
strverscmp(const char *lhs, const char *rhs)
{
    return strcmp(lhs, rhs);
}

#endif // HAVE_STRVERSCMP
#ifndef HAVE_MEMMEM

void *
memmem(const void *haystack_v, size_t haystack_size, const void *needle_v,
    size_t needle_size)
{
    if (!haystack_size)
        return 0;
    if (!needle_size)
        return (void *)haystack_v;
    if (needle_size > haystack_size)
        return 0;
    if (needle_size == haystack_size)
    {
        if (0 == memcmp(haystack_v, needle_v, needle_size))
            return (void *)haystack_v;
        return 0;
    }
    const unsigned char *needle = (const unsigned char *)needle_v;
    if (needle_size == 1)
        return (void *)memchr(haystack_v, needle[0], haystack_size);
    const unsigned char *haystack = (const unsigned char *)haystack_v;
    const unsigned char *haystack_end =
        haystack + haystack_size - needle_size + 1;
    while (haystack < haystack_end)
    {
        const unsigned char *first =
            (const unsigned char *)
            memchr(haystack, needle[0], haystack_end - haystack);
        if (!first)
            break;
        if (0 == memcmp(first + 1, needle + 1, needle_size - 1))
            return (void *)first;
        haystack = first + 1;
    }
    return 0;
}

#endif // HAVE_MEMMEM