IO patches
simplify error handling use get and inject use wide support in OS be stricter in checkin streams and arguments
This commit is contained in:
@@ -19,9 +19,6 @@
|
||||
|
||||
#define ENCODING_H 1
|
||||
|
||||
|
||||
#include "Yap.h"
|
||||
|
||||
typedef enum {
|
||||
ENC_OCTET = 0, /// binary files
|
||||
ENC_ISO_LATIN1 = 1, /// US+West Europe
|
||||
@@ -33,12 +30,56 @@ typedef enum {
|
||||
ENC_ISO_UTF32_BE = 64, /// nobody
|
||||
ENC_ISO_UTF32_LE = 128, /// yes, nobody
|
||||
} encoding_t;
|
||||
/// read the initial encoding from the Operating System's environment;
|
||||
encoding_t Yap_InitialEncoding( void );
|
||||
|
||||
#if defined(__BIG_ENDIAN__)
|
||||
#define ENC_WCHAR ENC_ISO_UTF32_BE
|
||||
#else
|
||||
#define ENC_WCHAR ENC_ISO_UTF32_LE
|
||||
#endif
|
||||
|
||||
#ifdef YAP_H
|
||||
|
||||
/// read the current environment, as set by the user or as Initial
|
||||
encoding_t Yap_DefaultEncoding( void );
|
||||
void Yap_SetDefaultEncoding(encoding_t new_encoding);
|
||||
|
||||
#if HAVE_XLOCALE_H
|
||||
typedef enum {
|
||||
SEQ_ENC_OCTET, /// binary files
|
||||
SEQ_ENC_ISO_LATIN1, /// US+West Europe
|
||||
SEQ_ENC_ISO_ASCII , /// US only
|
||||
SEQ_ENC_ISO_ANSI , /// Who cares
|
||||
SEQ_ENC_ISO_UTF8 , /// Most everyone nowadays
|
||||
SEQ_ENC_UTF16_BE, /// People who made a mistake
|
||||
SEQ_ENC_UTF16_LE, /// People who made the same mistake
|
||||
v\ SEQ_ENC_ISO_UTF32_BE, /// nobody
|
||||
SEQ_ENC_ISO_UTF32_LE /// yes, nobody
|
||||
} seq_encoding_t;
|
||||
|
||||
/// convert from unary to binary representation.
|
||||
static inline seq_encoding_t seq_encoding(encoding_t inp) {
|
||||
#if HAVE__BUILTIN_FFSLL
|
||||
return __builtin_ffsll(inp);
|
||||
#elif HAVE_FFSLL
|
||||
return ffsll(inp);
|
||||
#else
|
||||
unsigned int out;
|
||||
// supports max 16 different encodings.
|
||||
if (inp==0)
|
||||
return 0L;
|
||||
// if (inp & ((CELL)0xffffL << 16)) {inp >>= 16; out += 16;}
|
||||
if (inp & ((CELL)0xffL << 8)) {inp >>= 8; out += 8;}
|
||||
if (inp & ((CELL)0xfL << 4)) {inp >>= 4; out += 4;}
|
||||
if (inp & ((CELL)0x3L << 2)) {inp >>= 2; out += 2;}
|
||||
if (inp & ((CELL)0x1 << 1)) out++;
|
||||
#endif
|
||||
return out;
|
||||
}
|
||||
|
||||
extern xlocale enc_locales[SEQ_ENC_ISO_UTF32_LE+1];
|
||||
#endif
|
||||
|
||||
|
||||
static inline const char *enc_name(encoding_t enc)
|
||||
{
|
||||
switch(enc)
|
||||
@@ -59,23 +100,24 @@ static inline
|
||||
encoding_t enc_id(char *s)
|
||||
{
|
||||
{
|
||||
if (!strcmp(s, "octet")) return ENC_OCTET;
|
||||
if (!strcmp(s, "iso_utf8")) return ENC_ISO_UTF8;
|
||||
if (!strcmp(s, "utf16_be")) return ENC_UTF16_BE;
|
||||
if (!strcmp(s, "utf16_le")) return ENC_UTF16_LE;
|
||||
if (!strcmp(s, "octet")) return ENC_OCTET;
|
||||
if (!strcmp(s, "iso_latin_1")) return ENC_ISO_LATIN1;
|
||||
if (!strcmp(s, "iso_ascii")) return ENC_ISO_ASCII;
|
||||
if (!strcmp(s, "iso_ansi")) return ENC_ISO_ANSI;
|
||||
if (!strcmp(s, "iso_utf8")) return ENC_ISO_UTF8;
|
||||
if (!strcmp(s, "utf16_be")) return ENC_UTF16_BE;
|
||||
if (!strcmp(s, "utf16_le")) return ENC_UTF16_LE;
|
||||
if (!strcmp(s, "utf32_be")) return ENC_ISO_UTF32_BE;
|
||||
if (!strcmp(s, "utf32_le")) return ENC_ISO_UTF32_LE;
|
||||
if (!strcmp(s, "default")) return Yap_DefaultEncoding();
|
||||
else {
|
||||
Yap_Error(DOMAIN_ERROR_OUT_OF_RANGE, 0, "bad encoding %s", s);
|
||||
Yap_Error(DOMAIN_ERROR_OUT_OF_RANGE, 0, "bad encoding %s", s);
|
||||
return ENC_OCTET;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user