diff options
Diffstat (limited to 'src/nvim/iconv.h')
-rw-r--r-- | src/nvim/iconv.h | 54 |
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 |