a whole lot of size_t -> ssize_t.
[apps/madmutt.git] / charset.c
index 9bf63f8..0652ffc 100644 (file)
--- a/charset.c
+++ b/charset.c
 #include <errno.h>
 
 #include <lib-lib/mem.h>
+#include <lib-lib/ascii.h>
+#include <lib-lib/str.h>
+#include <lib-lib/macros.h>
 
 #include "mutt.h"
 #include "charset.h"
-#include "ascii.h"
 
-#include "lib/mem.h"
-#include "lib/intl.h"
-#include "lib/str.h"
 
 #ifndef EILSEQ
 # define EILSEQ EINVAL
 #endif
 
+int Charset_is_utf8 = 0;
+
 /* 
  * The following list has been created manually from the data under:
  * http://www.isi.edu/in-notes/iana/assignments/character-sets
@@ -194,26 +195,26 @@ void mutt_set_langinfo_charset (void)
   char buff[LONG_STRING];
   char buff2[LONG_STRING];
 
-  strfcpy (buff, nl_langinfo (CODESET), sizeof (buff));
+  m_strcpy(buff, sizeof(buff), nl_langinfo(CODESET));
   mutt_canonical_charset (buff2, sizeof (buff2), buff);
 
   /* finally, set $charset */
-  if (!(Charset = str_dup (buff2)))
-    Charset = str_dup ("iso-8859-1");
+  if (!(Charset = m_strdup(buff2)))
+    Charset = m_strdup("iso-8859-1");
 }
 
 #else
 
 void mutt_set_langinfo_charset (void)
 {
-  Charset = str_dup ("iso-8859-1");
+  Charset = m_strdup("iso-8859-1");
 }
 
 #endif
 
-void mutt_canonical_charset (char *dest, size_t dlen, const char *name)
+void mutt_canonical_charset (char *dest, ssize_t dlen, const char *name)
 {
-  size_t i;
+  ssize_t i;
   char *p;
   char scratch[LONG_STRING];
 
@@ -227,16 +228,16 @@ void mutt_canonical_charset (char *dest, size_t dlen, const char *name)
   else if (!ascii_strncasecmp (name, "iso8859-", 8))
     snprintf (scratch, sizeof (scratch), "iso_8859-%s", name + 8);
   else
-    strfcpy (scratch, NONULL (name), sizeof (scratch));
+    m_strcpy(scratch, sizeof(scratch), NONULL(name));
 
   for (i = 0; PreferredMIMENames[i].key; i++)
     if (!ascii_strcasecmp (scratch, PreferredMIMENames[i].key) ||
-        !str_casecmp (scratch, PreferredMIMENames[i].key)) {
-      strfcpy (dest, PreferredMIMENames[i].pref, dlen);
+        !m_strcasecmp(scratch, PreferredMIMENames[i].key)) {
+      m_strcpy(dest, dlen, PreferredMIMENames[i].pref);
       return;
     }
 
-  strfcpy (dest, scratch, dlen);
+  m_strcpy(dest, dlen, scratch);
 
   /* for cosmetics' sake, transform to lowercase. */
   for (p = dest; *p; p++)
@@ -296,19 +297,19 @@ iconv_t mutt_iconv_open (const char *tocode, const char *fromcode, int flags)
  * if you're supplying an outrepl, the target charset should be.
  */
 
-size_t mutt_iconv (iconv_t cd, const char **inbuf, size_t * inbytesleft,
-                   char **outbuf, size_t * outbytesleft,
+ssize_t mutt_iconv(iconv_t cd, const char **inbuf, ssize_t *inbytesleft,
+                   char **outbuf, ssize_t *outbytesleft,
                    const char **inrepls, const char *outrepl)
 {
-  size_t ret = 0, ret1;
+  ssize_t ret = 0, ret1;
   const char *ib = *inbuf;
-  size_t ibl = *inbytesleft;
+  ssize_t ibl = *inbytesleft;
   char *ob = *outbuf;
-  size_t obl = *outbytesleft;
+  ssize_t obl = *outbytesleft;
 
   for (;;) {
     ret1 = my_iconv(cd, &ib, &ibl, &ob, &obl);
-    if (ret1 != (size_t) - 1)
+    if (ret1 != -1)
       ret += ret1;
     if (ibl && obl && errno == EILSEQ) {
       if (inrepls) {
@@ -317,9 +318,9 @@ size_t mutt_iconv (iconv_t cd, const char **inbuf, size_t * inbytesleft,
 
         for (t = inrepls; *t; t++) {
           const char *ib1 = *t;
-          size_t ibl1 = str_len (*t);
+          ssize_t ibl1 = m_strlen(*t);
           char *ob1 = ob;
-          size_t obl1 = obl;
+          ssize_t obl1 = obl;
 
           my_iconv(cd, &ib1, &ibl1, &ob1, &obl1);
           if (!ibl1) {
@@ -337,7 +338,7 @@ size_t mutt_iconv (iconv_t cd, const char **inbuf, size_t * inbytesleft,
         outrepl = "?";
       my_iconv(cd, 0, 0, &ob, &obl);
       if (obl) {
-        int n = str_len (outrepl);
+        ssize_t n = m_strlen(outrepl);
 
         if (n > obl) {
           outrepl = "?";
@@ -377,7 +378,7 @@ int mutt_convert_string (char **ps, const char *from, const char *to,
     int len;
     const char *ib;
     char *buf, *ob;
-    size_t ibl, obl;
+    ssize_t ibl, obl;
     const char **inrepls = NULL;
     const char *outrepl = NULL;
 
@@ -388,7 +389,7 @@ int mutt_convert_string (char **ps, const char *from, const char *to,
     else
       outrepl = "?";
 
-    len = str_len (s);
+    len = m_strlen(s);
     ib = s, ibl = len + 1;
     obl = MB_LEN_MAX * ibl;
     ob = buf = xmalloc(obl + 1);
@@ -400,8 +401,6 @@ int mutt_convert_string (char **ps, const char *from, const char *to,
 
     p_delete(ps);
     *ps = buf;
-
-    str_adjust (ps);
     return 0;
   }
   else
@@ -422,7 +421,7 @@ struct fgetconv_s {
   char *p;
   char *ob;
   char *ib;
-  size_t ibl;
+  ssize_t ibl;
   const char **inrepls;
 };
 
@@ -449,16 +448,16 @@ FGETCONV *fgetconv_open (FILE * file, const char *from, const char *to,
     fc->inrepls = mutt_is_utf8 (to) ? repls : repls + 1;
   }
   else
-    fc = p_new(struct fgetconv_not, 1);
+    fc = p_new(struct fgetconv_s, 1);
   fc->file = file;
   fc->cd = cd;
   return (FGETCONV *) fc;
 }
 
-char *fgetconvs (char *buf, size_t l, FGETCONV * _fc)
+char *fgetconvs (char *buf, ssize_t l, FGETCONV * _fc)
 {
   int c;
-  size_t r;
+  ssize_t r;
 
   for (r = 0; r + 1 < l;) {
     if ((c = fgetconv (_fc)) == EOF)
@@ -491,7 +490,7 @@ int fgetconv (FGETCONV * _fc)
   /* Try to convert some more */
   fc->p = fc->ob = fc->bufo;
   if (fc->ibl) {
-    size_t obl = sizeof (fc->bufo);
+    ssize_t obl = ssizeof(fc->bufo);
 
     my_iconv(fc->cd, (const char **) &fc->ib, &fc->ibl, &fc->ob, &obl);
     if (fc->p < fc->ob)
@@ -515,7 +514,7 @@ int fgetconv (FGETCONV * _fc)
 
   /* Try harder this time to convert some */
   if (fc->ibl) {
-    size_t obl = sizeof (fc->bufo);
+    ssize_t obl = ssizeof(fc->bufo);
 
     mutt_iconv (fc->cd, (const char **) &fc->ib, &fc->ibl, &fc->ob,
                 &obl, fc->inrepls, 0);
@@ -543,41 +542,42 @@ const char *mutt_get_first_charset (const char *charset)
   const char *c, *c1;
 
   c = charset;
-  if (!str_len (c))
+  if (!m_strlen(c))
     return "us-ascii";
   if (!(c1 = strchr (c, ':')))
     return ((char*) charset);
-  strfcpy (fcharset, c, c1 - c + 1);
+  m_strcpy(fcharset, c1 - c + 1, c);
   return fcharset;
 }
 
-static size_t convert_string (const char *f, size_t flen,
+static ssize_t convert_string (const char *f, ssize_t flen,
                               const char *from, const char *to,
-                              char **t, size_t * tlen)
+                              char **t, ssize_t * tlen)
 {
   iconv_t cd;
   char *buf, *ob;
-  size_t obl, n;
+  ssize_t obl;
+  ssize_t n;
   int e;
 
   cd = mutt_iconv_open (to, from, 0);
   if (cd == (iconv_t) (-1))
-    return (size_t) (-1);
+    return -1;
   obl = 4 * flen + 1;
   ob = buf = xmalloc(obl);
   n = my_iconv(cd, &f, &flen, &ob, &obl);
-  if (n == (size_t) (-1) || my_iconv(cd, 0, 0, &ob, &obl) == (size_t) (-1)) {
+  if (n < 0 || my_iconv(cd, 0, 0, &ob, &obl) < 0) {
     e = errno;
     p_delete(&buf);
     iconv_close (cd);
     errno = e;
-    return (size_t) (-1);
+    return -1;
   }
   *ob = '\0';
 
   *tlen = ob - buf;
 
-  mem_realloc (&buf, ob - buf + 1);
+  p_realloc(&buf, ob - buf + 1);
   *t = buf;
   iconv_close (cd);
 
@@ -592,21 +592,21 @@ int mutt_convert_nonmime_string (char **ps)
     char *u = *ps;
     char *s = NULL;
     char *fromcode;
-    size_t m, n;
-    size_t ulen = str_len (*ps);
-    size_t slen;
+    ssize_t m, n;
+    ssize_t ulen = m_strlen(*ps);
+    ssize_t slen;
 
     if (!u || !*u)
       return 0;
 
     c1 = strchr (c, ':');
-    n = c1 ? c1 - c : str_len (c);
+    n = c1 ? c1 - c : m_strlen(c);
     if (!n)
       continue;
     fromcode = p_dupstr(c, n);
     m = convert_string (u, ulen, fromcode, Charset, &s, &slen);
     p_delete(&fromcode);
-    if (m != (size_t) (-1)) {
+    if (m != -1) {
       p_delete(ps);
       *ps = s;
       return 0;
@@ -614,3 +614,23 @@ int mutt_convert_nonmime_string (char **ps)
   }
   return -1;
 }
+
+void mutt_set_charset (char *charset)
+{
+    char buffer[STRING];
+
+    mutt_canonical_charset (buffer, sizeof (buffer), charset);
+
+    Charset_is_utf8 = 0;
+    if (!strcmp (buffer, "utf-8"))
+        Charset_is_utf8 = 1;
+
+#ifdef HAVE_BIND_TEXTDOMAIN_CODESET
+    bind_textdomain_codeset (PACKAGE, buffer);
+#endif
+}
+
+wchar_t replacement_char (void)
+{
+    return Charset_is_utf8 ? 0xfffd : '?';
+}