after literally HOURS of debugging, I got a working-ish expression…

This commit is contained in:
tg
2018-01-14 00:47:11 +00:00
parent 609f5c2256
commit 9691e330b9

22
sh.h
View File

@ -182,7 +182,7 @@
#endif #endif
#ifdef EXTERN #ifdef EXTERN
__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.854 2018/01/14 00:22:29 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/sh.h,v 1.855 2018/01/14 00:47:11 tg Exp $");
#endif #endif
#define MKSH_VERSION "R56 2017/10/17" #define MKSH_VERSION "R56 2017/10/17"
@ -1474,16 +1474,16 @@ EXTERN char ifs0;
extern unsigned int eek_ord; extern unsigned int eek_ord;
#define ORD(c) ((size_t)(c) > 0xFF ? eek_ord : \ #define ORD(c) ((size_t)(c) > 0xFF ? eek_ord : \
((unsigned int)(unsigned char)(c))) ((unsigned int)(unsigned char)(c)))
#define Oc(c,t) __builtin_types_compatible_p(__typeof__(c), t) #define ord(c) __builtin_choose_expr( \
#define ord(c) __builtin_choose_expr( \ __builtin_types_compatible_p(__typeof__(c), char) || \
Oc((c), unsigned char) || Oc((c), char), \ __builtin_types_compatible_p(__typeof__(c), unsigned char), \
((unsigned int)(unsigned char)(c)), ({ \ ((unsigned int)(unsigned char)(c)), ({ \
size_t ord_c = (c); \ size_t ord_c = (c); \
\ \
if (ord_c > 0xFF) \ if (ord_c > (size_t)0xFFU) \
internal_errorf("%s:%d:ord(%zu)", \ internal_errorf("%s:%d:ord(%zu)", \
__FILE__, __LINE__, ord_c); \ __FILE__, __LINE__, ord_c); \
((unsigned int)(unsigned char)(c)); \ ((unsigned int)(unsigned char)(ord_c)); \
})) }))
#else #else
#define ord(c) ((unsigned int)(unsigned char)(c)) #define ord(c) ((unsigned int)(unsigned char)(c))