/* * Copyright © 2005 Atheme Development Group * Rights to this code are documented in doc/pod/license.pod. * * String functions. */ static char const rcsid[] = "$Id"; #include #include "atheme.h" void assign (char *dst, char const *src, size_t maxlen) { if (!src) src = ""; size_t len = strlen (src); if (len >= maxlen - 1) { if (maxlen <= 4) { memset (dst, '.', maxlen - 1); dst [maxlen - 1] = 0; } else { memcpy (dst, src, maxlen - 4); memcpy (dst + maxlen - 4, "...", 4); } } else memcpy (dst, src, len + 1); } #ifndef HAVE_STRLCAT /* These functions are taken from Linux. */ size_t strlcat (char *dest, char const *src, size_t count) { size_t dsize = strlen (dest); size_t len = strlen (src); size_t res = dsize + len; dest += dsize; count -= dsize; if (len >= count) len = count - 1; memcpy (dest, src, len); dest[len] = 0; return res; } #endif #ifndef HAVE_STRLCPY size_t strlcpy (char *dest, char const *src, size_t size) { size_t ret = strlen (src); if (size) { size_t len = (ret >= size) ? size - 1 : ret; memcpy (dest, src, len); dest[len] = '\0'; } return ret; } #endif /* removes unwanted chars from a line */ char const * strip (char *line) { char *c = 0; if (line) { if ((c = strchr (line, '\n'))) *c = '\0'; if ((c = strchr (line, '\r'))) *c = '\0'; if ((c = strchr (line, '\1'))) *c = '\0'; } return c; } int string::append (char c) { if (size - pos <= 1) { size_t new_size = std::max (size * 2, pos + 9); size = new_size; m_rep = new char[new_size]; } m_rep[pos] = c; m_rep[++pos] = '\0'; return size; } int string::append_nonul (char c) { if (size - pos <= 1) { size_t new_size = std::max (size * 2, pos + 9); size = new_size; m_rep = new char[new_size]; } m_rep[pos++] = c; return size; } int string::append (char const *src, size_t size) { if (this->size - pos <= size) { size_t new_size = std::max (this->size * 2, pos + size + 8); this->size = new_size; m_rep = new char[new_size]; } memcpy (m_rep + pos, src, size); pos += size; m_rep[pos] = '\0'; return size; } int string::append_nonul (char const *src, size_t size) { if (this->size - pos <= size) { size_t new_size = std::max (this->size * 2, pos + size + 8); this->size = new_size; m_rep = new char[new_size]; } memcpy (m_rep + pos, src, size); pos += size; return size; } int string::append_unguarded (char c) { m_rep[pos] = c; m_rep[++pos] = '\0'; return size; } int string::append_unguarded_nonul (char c) { m_rep[pos++] = c; return size; } int string::append_unguarded (char const *src, size_t size) { memcpy (m_rep + pos, src, size); pos += size; m_rep[pos] = '\0'; return size; } int string::append_unguarded_nonul (char const *src, size_t size) { memcpy (m_rep + pos, src, size); pos += size; return size; }