aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/iconv.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/iconv.h')
-rw-r--r--src/nvim/iconv.h54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/nvim/iconv.h b/src/nvim/iconv.h
new file mode 100644
index 0000000000..4ac0d3fdd4
--- /dev/null
+++ b/src/nvim/iconv.h
@@ -0,0 +1,54 @@
+#ifndef NVIM_ICONV_H
+#define NVIM_ICONV_H
+
+// iconv can be linked at compile-time as well as loaded at runtime. In the
+// latter case, some function pointers need to be initialized after loading
+// the library (see `iconv_enabled()` in mbyte.c). These function pointers
+// are stored in globals.h. Since globals.h includes iconv.h to get the
+// definition of USE_ICONV, we can't include it from iconv.h. One way to
+// solve this conundrum would be perhaps to let cmake decide the value of
+// USE_ICONV, or to put the USE_ICONV definition in config.h.in directly. As
+// it stands, globals.h needs to be included alongside iconv.h.
+
+#ifdef HAVE_CONFIG_H
+# include "auto/config.h"
+#endif
+
+// Use iconv() when it's available, either by linking to the library at
+// compile time or by loading it at runtime.
+#if (defined(HAVE_ICONV_H) && defined(HAVE_ICONV)) || defined(DYNAMIC_ICONV)
+# define USE_ICONV
+#endif
+
+// If we don't have the actual iconv header files present but USE_ICONV was
+// defined, we provide a type shim (pull in errno.h and define iconv_t).
+// This enables us to still load and use iconv dynamically at runtime.
+#ifdef USE_ICONV
+# ifdef HAVE_ICONV_H
+# include <iconv.h>
+# else
+# include <errno.h>
+typedef void *iconv_t;
+# endif
+#endif
+
+// define some missing constants if necessary
+# ifdef USE_ICONV
+# ifndef EILSEQ
+# define EILSEQ 123
+# endif
+# ifdef DYNAMIC_ICONV
+// on win32 iconv.dll is dynamically loaded
+# define ICONV_ERRNO (*iconv_errno())
+# define ICONV_E2BIG 7
+# define ICONV_EINVAL 22
+# define ICONV_EILSEQ 42
+# else
+# define ICONV_ERRNO errno
+# define ICONV_E2BIG E2BIG
+# define ICONV_EINVAL EINVAL
+# define ICONV_EILSEQ EILSEQ
+# endif
+# endif
+
+#endif // NVIM_ICONV_H