/*
+ * Copyright notice from original mutt:
* Copyright (C) 1996-2000 Michael R. Elkins <me@mutt.org>
* Copyright (C) 1999-2000 Thomas Roessler <roessler@does-not-exist.org>
- *
- * 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 2 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, write to the Free
- * Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111, USA.
+ *
+ * This file is part of mutt-ng, see http://www.muttng.org/.
+ * It's licensed under the GNU General Public License,
+ * please see the file GPL in the top level source directory.
*/
/*
#include "lib.h"
+#include "lib/mem.h"
+#include "lib/str.h"
+#include "lib/debug.h"
+
extern short Umask;
void mutt_nocurses_error (const char *fmt, ...)
fputc ('\n', stderr);
}
-void *safe_calloc (size_t nmemb, size_t size)
-{
- void *p;
-
- if (!nmemb || !size)
- return NULL;
-
- if (((size_t) - 1) / nmemb <= size) {
- mutt_error _("Integer overflow -- can't allocate memory!");
-
- sleep (1);
- mutt_exit (1);
- }
-
- if (!(p = calloc (nmemb, size))) {
- mutt_error _("Out of memory!");
-
- sleep (1);
- mutt_exit (1);
- }
- return p;
-}
-
-void *safe_malloc (size_t siz)
-{
- void *p;
-
- if (siz == 0)
- return 0;
- if ((p = (void *) malloc (siz)) == 0) { /* __MEM_CHECKED__ */
- mutt_error _("Out of memory!");
-
- sleep (1);
- mutt_exit (1);
- }
- return (p);
-}
-
-void safe_realloc (void *ptr, size_t siz)
-{
- void *r;
- void **p = (void **) ptr;
-
- if (siz == 0) {
- if (*p) {
- free (*p); /* __MEM_CHECKED__ */
- *p = NULL;
- }
- return;
- }
-
- if (*p)
- r = (void *) realloc (*p, siz); /* __MEM_CHECKED__ */
- else {
- /* realloc(NULL, nbytes) doesn't seem to work under SunOS 4.1.x --- __MEM_CHECKED__ */
- r = (void *) malloc (siz); /* __MEM_CHECKED__ */
- }
-
- if (!r) {
- mutt_error _("Out of memory!");
-
- sleep (1);
- mutt_exit (1);
- }
-
- *p = r;
-}
-
-void safe_free (void *ptr)
-{
- void **p = (void **) ptr;
-
- if (*p) {
- free (*p); /* __MEM_CHECKED__ */
- *p = 0;
- }
-}
-
int safe_fclose (FILE ** f)
{
int r = 0;
return r;
}
-char *safe_strdup (const char *s)
-{
- char *p;
- size_t l;
-
- if (!s || !*s)
- return 0;
- l = strlen (s) + 1;
- p = (char *) safe_malloc (l);
- memcpy (p, s, l);
- return (p);
-}
-
-char *safe_strcat (char *d, size_t l, const char *s)
-{
- char *p = d;
-
- if (!l)
- return d;
-
- l--; /* Space for the trailing '\0'. */
-
- for (; *d && l; l--)
- d++;
- for (; *s && l; l--)
- *d++ = *s++;
-
- *d = '\0';
-
- return p;
-}
-
-char *safe_strncat (char *d, size_t l, const char *s, size_t sl)
-{
- char *p = d;
-
- if (!l)
- return d;
-
- l--; /* Space for the trailing '\0'. */
-
- for (; *d && l; l--)
- d++;
- for (; *s && l && sl; l--, sl--)
- *d++ = *s++;
-
- *d = '\0';
-
- return p;
-}
-
-
-void mutt_str_replace (char **p, const char *s)
-{
- FREE (p);
- *p = safe_strdup (s);
-}
-
-void mutt_str_adjust (char **p)
-{
- if (!p || !*p)
- return;
- safe_realloc (p, strlen (*p) + 1);
-}
-
-/* convert all characters in the string to lowercase */
-char *mutt_strlower (char *s)
-{
- char *p = s;
-
- while (*p) {
- *p = tolower ((unsigned char) *p);
- p++;
- }
-
- return (s);
-}
-
void mutt_unlink (const char *s)
{
int fd;
if ((chunk = fread (buf, 1, chunk, in)) < 1)
break;
if (fwrite (buf, 1, chunk, out) != chunk) {
- /* dprint (1, (debugfile, "mutt_copy_bytes(): fwrite() returned short byte count\n")); */
+ debug_print (1, ("fwrite() returned short byte count\n"));
return (-1);
}
size -= chunk;
char abs_oldpath[_POSIX_PATH_MAX];
if ((getcwd (abs_oldpath, sizeof abs_oldpath) == NULL) ||
- (strlen (abs_oldpath) + 1 + strlen (oldpath) + 1 >
+ (mutt_strlen (abs_oldpath) + 1 + mutt_strlen (oldpath) + 1 >
sizeof abs_oldpath))
return -1;
/* make sure the file is not symlink */
if (lstat (path, &osb) < 0 || fstat (fd, &nsb) < 0 ||
compare_stat (&osb, &nsb) == -1) {
-/* dprint (1, (debugfile, "safe_open(): %s is a symlink!\n", path)); */
+ debug_print (1, ("%s is a symlink!\n", path));
close (fd);
return (-1);
}
}
}
-char *mutt_substrcpy (char *dest, const char *beg, const char *end,
- size_t destlen)
-{
- size_t len;
-
- len = end - beg;
- if (len > destlen - 1)
- len = destlen - 1;
- memcpy (dest, beg, len);
- dest[len] = 0;
- return dest;
-}
-
-char *mutt_substrdup (const char *begin, const char *end)
-{
- size_t len;
- char *p;
-
- if (end)
- len = end - begin;
- else
- len = strlen (begin);
-
- p = safe_malloc (len + 1);
- memcpy (p, begin, len);
- p[len] = 0;
- return p;
-}
-
/* prepare a file name to survive the shell's quoting rules.
* From the Unix programming FAQ by way of Liviu.
*/
return j;
}
-/* NULL-pointer aware string comparison functions */
-
-int mutt_strcmp (const char *a, const char *b)
-{
- return strcmp (NONULL (a), NONULL (b));
-}
-
-int mutt_strcasecmp (const char *a, const char *b)
-{
- return strcasecmp (NONULL (a), NONULL (b));
-}
-
-int mutt_strncmp (const char *a, const char *b, size_t l)
-{
- return strncmp (NONULL (a), NONULL (b), l);
-}
-
-int mutt_strncasecmp (const char *a, const char *b, size_t l)
-{
- return strncasecmp (NONULL (a), NONULL (b), l);
-}
-
-size_t mutt_strlen (const char *a)
-{
- return a ? strlen (a) : 0;
-}
-
-int mutt_strcoll (const char *a, const char *b)
-{
- return strcoll (NONULL (a), NONULL (b));
-}
-
-const char *mutt_stristr (const char *haystack, const char *needle)
-{
- const char *p, *q;
-
- if (!haystack)
- return NULL;
- if (!needle)
- return (haystack);
-
- while (*(p = haystack)) {
- for (q = needle;
- *p && *q &&
- tolower ((unsigned char) *p) == tolower ((unsigned char) *q);
- p++, q++);
- if (!*q)
- return (haystack);
- haystack++;
- }
- return NULL;
-}
-
-char *mutt_skip_whitespace (char *p)
-{
- SKIPWS (p);
- return p;
-}
-
-void mutt_remove_trailing_ws (char *s)
-{
- char *p;
-
- for (p = s + mutt_strlen (s) - 1; p >= s && ISSPACE (*p); p--)
- *p = 0;
-}
-
char *mutt_concat_path (char *d, const char *dir, const char *fname, size_t l)
{
const char *fmt = "%s/%s";
- if (!*fname || (*dir && dir[strlen (dir) - 1] == '/'))
+ if (!*fname || (*dir && dir[mutt_strlen (dir) - 1] == '/'))
fmt = "%s%s";
snprintf (d, l, fmt, dir, fname);