xstring.cc
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
3  *
4  * Squid software is distributed under GPLv2+ license and includes
5  * contributions from numerous individuals and organizations.
6  * Please see the COPYING and CONTRIBUTORS files for details.
7  */
8 
9 #include "squid.h"
10 #include "compat/xalloc.h"
11 #include "compat/xstring.h"
12 
13 #include <cerrno>
14 
15 char *
16 xstrdup(const char *s)
17 {
18  if (!s) {
19  if (failure_notify) {
20  (*failure_notify) ("xstrdup: tried to dup a nullptr!\n");
21  } else {
22  errno = EINVAL;
23  perror("xstrdup: tried to dup a nullptr!");
24  }
25  exit(1);
26  }
27 
28  /* copy string, including terminating character */
29  size_t sz = strlen(s) + 1;
30  char *p = static_cast<char *>(xmalloc(sz));
31  memcpy(p, s, sz);
32 
33  return p;
34 }
35 
36 char *
37 xstrncpy(char *dst, const char *src, size_t n)
38 {
39  char *r = dst;
40 
41  if (!n || !dst)
42  return dst;
43 
44  if (src)
45  while (--n != 0 && *src != '\0') {
46  *dst = *src;
47  ++dst;
48  ++src;
49  }
50 
51  *dst = '\0';
52  return r;
53 }
54 
55 char *
56 xstrndup(const char *s, size_t n)
57 {
58  if (!s) {
59  errno = EINVAL;
60  if (failure_notify) {
61  (*failure_notify) ("xstrndup: tried to dup a nullptr!\n");
62  } else {
63  perror("xstrndup: tried to dup a nullptr!");
64  }
65  exit(1);
66  }
67 
68  size_t sz = strlen(s) + 1;
69  // size_t is unsigned, as mandated by c99 and c++ standards.
70  if (sz > n)
71  sz = n;
72 
73  char *p = xstrncpy(static_cast<char *>(xmalloc(sz)), s, sz);
74  return p;
75 }
76 
void(* failure_notify)(const char *)
Definition: compat.cc:12
#define xmalloc
char * xstrncpy(char *dst, const char *src, size_t n)
Definition: xstring.cc:37
char * xstrndup(const char *s, size_t n)
Definition: xstring.cc:56
char * xstrdup(const char *s)
Definition: xstring.cc:16

 

Introduction

Documentation

Support

Miscellaneous