X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib.c;h=4f1fee35ad93496eccf43d0b39aa16e1bb073f9f;hp=8f88c74a48cce9cc48fdbbc018f2b682c06add4c;hb=5945a5016adb82ec9a29c9f7741cea269484e608;hpb=c3e57678c8be193fc137854020f3a90887be97c9 diff --git a/lib.c b/lib.c index 8f88c74..4f1fee3 100644 --- a/lib.c +++ b/lib.c @@ -28,10 +28,76 @@ #include #include +#ifdef HAVE_SYSEXITS_H +#include +#else /* Make sure EX_OK is defined */ +#define EX_OK 0 +#endif + #include "lib.h" +#include "lib/mem.h" +#include "lib/str.h" +#include "lib/debug.h" + extern short Umask; +static struct sysexits +{ + int v; + const char *str; +} +sysexits_h[] = +{ +#ifdef EX_USAGE + { 0xff & EX_USAGE, "Bad usage." }, +#endif +#ifdef EX_DATAERR + { 0xff & EX_DATAERR, "Data format error." }, +#endif +#ifdef EX_NOINPUT + { 0xff & EX_NOINPUT, "Cannot open input." }, +#endif +#ifdef EX_NOUSER + { 0xff & EX_NOUSER, "User unknown." }, +#endif +#ifdef EX_NOHOST + { 0xff & EX_NOHOST, "Host unknown." }, +#endif +#ifdef EX_UNAVAILABLE + { 0xff & EX_UNAVAILABLE, "Service unavailable." }, +#endif +#ifdef EX_SOFTWARE + { 0xff & EX_SOFTWARE, "Internal error." }, +#endif +#ifdef EX_OSERR + { 0xff & EX_OSERR, "Operating system error." }, +#endif +#ifdef EX_OSFILE + { 0xff & EX_OSFILE, "System file missing." }, +#endif +#ifdef EX_CANTCREAT + { 0xff & EX_CANTCREAT, "Can't create output." }, +#endif +#ifdef EX_IOERR + { 0xff & EX_IOERR, "I/O error." }, +#endif +#ifdef EX_TEMPFAIL + { 0xff & EX_TEMPFAIL, "Deferred." }, +#endif +#ifdef EX_PROTOCOL + { 0xff & EX_PROTOCOL, "Remote protocol error." }, +#endif +#ifdef EX_NOPERM + { 0xff & EX_NOPERM, "Insufficient permission." }, +#endif +#ifdef EX_CONFIG + { 0xff & EX_NOPERM, "Local configuration error." }, +#endif + { S_ERR, "Exec error." }, + { -1, NULL} +}; + void mutt_nocurses_error (const char *fmt, ...) { va_list ap; @@ -42,84 +108,6 @@ 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; @@ -131,84 +119,6 @@ int safe_fclose (FILE ** f) 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; @@ -257,7 +167,7 @@ int mutt_copy_bytes (FILE * in, FILE * out, size_t size) 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; @@ -307,7 +217,7 @@ int safe_symlink (const char *oldpath, const char *newpath) char abs_oldpath[_POSIX_PATH_MAX]; if ((getcwd (abs_oldpath, sizeof abs_oldpath) == NULL) || - (strlen (abs_oldpath) + 1 + strlen (oldpath) + 1 > + (str_len (abs_oldpath) + 1 + str_len (oldpath) + 1 > sizeof abs_oldpath)) return -1; @@ -403,7 +313,7 @@ int safe_open (const char *path, int flags) /* 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); } @@ -487,13 +397,13 @@ char *mutt_read_line (char *s, size_t * size, FILE * fp, int *line) char *ch; if (!s) { - s = safe_malloc (STRING); + s = mem_malloc (STRING); *size = STRING; } FOREVER { if (fgets (s + offset, *size - offset, fp) == NULL) { - FREE (&s); + mem_free (&s); return NULL; } if ((ch = strchr (s + offset, '\n')) != NULL) { @@ -523,41 +433,12 @@ char *mutt_read_line (char *s, size_t * size, FILE * fp, int *line) /* There wasn't room for the line -- increase ``s'' */ offset = *size - 1; /* overwrite the terminating 0 */ *size += STRING; - safe_realloc (&s, *size); + mem_realloc (&s, *size); } } } } -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. */ @@ -593,78 +474,11 @@ size_t mutt_quote_filename (char *d, size_t l, const char *f) 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[str_len (dir) - 1] == '/')) fmt = "%s%s"; snprintf (d, l, fmt, dir, fname); @@ -680,3 +494,17 @@ const char *mutt_basename (const char *f) else return f; } + +const char * +mutt_strsysexit(int e) +{ + int i; + + for(i = 0; sysexits_h[i].str; i++) + { + if(e == sysexits_h[i].v) + break; + } + + return sysexits_h[i].str; +}