New ACC version.

This commit is contained in:
Markus F.X.J. Oberhumer
2020-01-16 01:53:55 +01:00
parent e2f60adc95
commit 9172ae3d19
+85 -55
View File
@@ -27,7 +27,7 @@
#ifndef __ACC_H_INCLUDED #ifndef __ACC_H_INCLUDED
#define __ACC_H_INCLUDED 1 #define __ACC_H_INCLUDED 1
#define ACC_VERSION 20170301L #define ACC_VERSION 20200116L
#if defined(__CYGWIN32__) && !defined(__CYGWIN__) #if defined(__CYGWIN32__) && !defined(__CYGWIN__)
# define __CYGWIN__ __CYGWIN32__ # define __CYGWIN__ __CYGWIN32__
#endif #endif
@@ -52,6 +52,8 @@
# error "__cplusplus" # error "__cplusplus"
# elif (__cplusplus < 199711L) # elif (__cplusplus < 199711L)
# define ACC_LANG_CXX 1 # define ACC_LANG_CXX 1
# elif (__cplusplus >= 201402L)
# define ACC_LANG_CXX __cplusplus
# elif defined(_MSC_VER) && defined(_MSVC_LANG) && (_MSVC_LANG+0 >= 201402L) && 1 # elif defined(_MSC_VER) && defined(_MSVC_LANG) && (_MSVC_LANG+0 >= 201402L) && 1
# define ACC_LANG_CXX _MSVC_LANG # define ACC_LANG_CXX _MSVC_LANG
# else # else
@@ -66,6 +68,33 @@
# endif # endif
#endif #endif
#endif #endif
#if defined(ACC_CFG_ASSERT_LANG_ASSEMBLER) && (ACC_CFG_ASSERT_LANG_ASSEMBLER+0)
# if !(ACC_LANG_ASSEMBLER)
# error "ACC_CFG_ASSERT_LANG_ASSEMBLER"
# endif
# if (ACC_CFG_ASSERT_LANG_ASSEMBLER > 1) && (ACC_CFG_ASSERT_LANG_ASSEMBLER < ACC_LANG_ASSEMBLER)
# error "ACC_CFG_ASSERT_LANG_ASSEMBLER standard min version"
# endif
#endif
#if defined(ACC_CFG_ASSERT_LANG_C) && (ACC_CFG_ASSERT_LANG_C+0)
# if !(ACC_LANG_C)
# error "ACC_CFG_ASSERT_LANG_C"
# endif
# if (ACC_CFG_ASSERT_LANG_C > 1) && (ACC_CFG_ASSERT_LANG_C < ACC_LANG_C)
# error "ACC_CFG_ASSERT_LANG_C standard min version"
# endif
#endif
#if defined(ACC_CFG_ASSERT_LANG_CXX) && (ACC_CFG_ASSERT_LANG_CXX+0)
# if !(ACC_LANG_CXX)
# error "ACC_CFG_ASSERT_LANG_CXX"
# endif
# if !defined(__cplusplus)
# error "ACC_CFG_ASSERT_LANG_CXX __cplusplus"
# endif
# if (ACC_CFG_ASSERT_LANG_CXX > 1) && (ACC_CFG_ASSERT_LANG_CXX < ACC_LANG_CXX)
# error "ACC_CFG_ASSERT_LANG_CXX standard min version"
# endif
#endif
#if !defined(ACC_CFG_NO_DISABLE_WUNDEF) #if !defined(ACC_CFG_NO_DISABLE_WUNDEF)
#if defined(__ARMCC_VERSION) #if defined(__ARMCC_VERSION)
# pragma diag_suppress 193 # pragma diag_suppress 193
@@ -523,6 +552,9 @@
# if defined(_AIX) || defined(__AIX__) || defined(__aix__) # if defined(_AIX) || defined(__AIX__) || defined(__aix__)
# define ACC_OS_POSIX_AIX 1 # define ACC_OS_POSIX_AIX 1
# define ACC_INFO_OS_POSIX "aix" # define ACC_INFO_OS_POSIX "aix"
# elif defined(__DragonFly__)
# define ACC_OS_POSIX_DRAGONFLY 1
# define ACC_INFO_OS_POSIX "dragonfly"
# elif defined(__FreeBSD__) # elif defined(__FreeBSD__)
# define ACC_OS_POSIX_FREEBSD 1 # define ACC_OS_POSIX_FREEBSD 1
# define ACC_INFO_OS_POSIX "freebsd" # define ACC_INFO_OS_POSIX "freebsd"
@@ -965,6 +997,9 @@
#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICC8051__) #elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICC8051__)
# define ACC_ARCH_MCS51 1 # define ACC_ARCH_MCS51 1
# define ACC_INFO_ARCH "mcs51" # define ACC_INFO_ARCH "mcs51"
#elif defined(__microblaze__) || defined(__MICROBLAZE__)
# define ACC_ARCH_MICROBLAZE 1
# define ACC_INFO_ARCH "microblaze"
#elif defined(__mips__) || defined(__mips) || defined(_MIPS_ARCH) || defined(_M_MRX000) #elif defined(__mips__) || defined(__mips) || defined(_MIPS_ARCH) || defined(_M_MRX000)
# define ACC_ARCH_MIPS 1 # define ACC_ARCH_MIPS 1
# define ACC_INFO_ARCH "mips" # define ACC_INFO_ARCH "mips"
@@ -1563,7 +1598,7 @@ extern "C" {
#endif #endif
#if !defined(ACC_UNUSED_LABEL) #if !defined(ACC_UNUSED_LABEL)
# if (ACC_CC_CLANG >= 0x020800ul) # if (ACC_CC_CLANG >= 0x020800ul)
# define ACC_UNUSED_LABEL(l) (__acc_gnuc_extension__ ((void) ((const void *) &&l))) # define ACC_UNUSED_LABEL(l) (__acc_gnuc_extension__ ((void) ACC_STATIC_CAST(const void *, &&l)))
# elif (ACC_CC_ARMCC || ACC_CC_CLANG || ACC_CC_INTELC || ACC_CC_WATCOMC) # elif (ACC_CC_ARMCC || ACC_CC_CLANG || ACC_CC_INTELC || ACC_CC_WATCOMC)
# define ACC_UNUSED_LABEL(l) if __acc_cte(0) goto l # define ACC_UNUSED_LABEL(l) if __acc_cte(0) goto l
# else # else
@@ -2040,7 +2075,11 @@ extern "C" {
#endif #endif
#endif #endif
#if !defined(ACC_COMPILE_TIME_ASSERT_HEADER) #if !defined(ACC_COMPILE_TIME_ASSERT_HEADER)
# if (ACC_CC_AZTECC || ACC_CC_ZORTECHC) # if (ACC_LANG_CXX >= 201103L)
# define ACC_COMPILE_TIME_ASSERT_HEADER(e) static_assert(e, #e);
# elif (ACC_LANG_C >= 201112L)
# define ACC_COMPILE_TIME_ASSERT_HEADER(e) _Static_assert(e, #e);
# elif (ACC_CC_AZTECC || ACC_CC_ZORTECHC)
# define ACC_COMPILE_TIME_ASSERT_HEADER(e) ACC_EXTERN_C_BEGIN extern int __ACC_CTA_NAME(acc_cta__)[1-!(e)]; ACC_EXTERN_C_END # define ACC_COMPILE_TIME_ASSERT_HEADER(e) ACC_EXTERN_C_BEGIN extern int __ACC_CTA_NAME(acc_cta__)[1-!(e)]; ACC_EXTERN_C_END
# elif (ACC_CC_DMC || ACC_CC_SYMANTECC) # elif (ACC_CC_DMC || ACC_CC_SYMANTECC)
# define ACC_COMPILE_TIME_ASSERT_HEADER(e) ACC_EXTERN_C_BEGIN extern int __ACC_CTA_NAME(acc_cta__)[1u-2*!(e)]; ACC_EXTERN_C_END # define ACC_COMPILE_TIME_ASSERT_HEADER(e) ACC_EXTERN_C_BEGIN extern int __ACC_CTA_NAME(acc_cta__)[1u-2*!(e)]; ACC_EXTERN_C_END
@@ -2055,7 +2094,11 @@ extern "C" {
# endif # endif
#endif #endif
#if !defined(ACC_COMPILE_TIME_ASSERT) #if !defined(ACC_COMPILE_TIME_ASSERT)
# if (ACC_CC_AZTECC) # if (ACC_LANG_CXX >= 201103L)
# define ACC_COMPILE_TIME_ASSERT(e) {static_assert(e, #e);}
# elif (ACC_LANG_C >= 201112L)
# define ACC_COMPILE_TIME_ASSERT(e) {_Static_assert(e, #e);}
# elif (ACC_CC_AZTECC)
# define ACC_COMPILE_TIME_ASSERT(e) {typedef int __ACC_CTA_NAME(acc_cta_t__)[1-!(e)];} # define ACC_COMPILE_TIME_ASSERT(e) {typedef int __ACC_CTA_NAME(acc_cta_t__)[1-!(e)];}
# elif (ACC_CC_CLANG && (ACC_CC_CLANG >= 0x030000ul)) # elif (ACC_CC_CLANG && (ACC_CC_CLANG >= 0x030000ul))
# define ACC_COMPILE_TIME_ASSERT(e) {typedef int __ACC_CTA_NAME(acc_cta_t__)[1-2*!(e)] __attribute__((__unused__));} # define ACC_COMPILE_TIME_ASSERT(e) {typedef int __ACC_CTA_NAME(acc_cta_t__)[1-2*!(e)] __attribute__((__unused__));}
@@ -2378,7 +2421,9 @@ ACC_COMPILE_TIME_ASSERT_HEADER(ACC_SIZEOF_LONG == sizeof(long))
# define ACC_WORDSIZE 4 # define ACC_WORDSIZE 4
#elif (ACC_ARCH_Z80) #elif (ACC_ARCH_Z80)
# define ACC_WORDSIZE 1 # define ACC_WORDSIZE 1
#elif (ACC_SIZEOF_LONG == 8) && ((defined(__mips__) && defined(__R5900__)) || defined(__MIPS_PSX2__)) #elif (ACC_ARCH_MIPS) && (ACC_SIZEOF_LONG == 8) && (defined(__R5900) || defined(__MIPS_PSX2__))
# define ACC_WORDSIZE 8
#elif (ACC_ARCH_MIPS) && (ACC_SIZEOF_LONG == 4) && defined(__mips64) && defined(_MIPS_SIM) && defined(_ABIN32) && (_MIPS_SIM+0 == _ABIN32+0)
# define ACC_WORDSIZE 8 # define ACC_WORDSIZE 8
#elif (ACC_OS_OS400 || defined(__OS400__)) #elif (ACC_OS_OS400 || defined(__OS400__))
# define ACC_WORDSIZE 8 # define ACC_WORDSIZE 8
@@ -2780,6 +2825,7 @@ ACC_COMPILE_TIME_ASSERT_HEADER(ACC_SIZEOF_PTRDIFF_T == sizeof(ptrdiff_t))
# endif # endif
#elif (ACC_ARCH_RISCV) #elif (ACC_ARCH_RISCV)
# define ACC_OPT_AVOID_UINT_INDEX 1 # define ACC_OPT_AVOID_UINT_INDEX 1
# if 0
# ifndef ACC_OPT_UNALIGNED16 # ifndef ACC_OPT_UNALIGNED16
# define ACC_OPT_UNALIGNED16 1 # define ACC_OPT_UNALIGNED16 1
# endif # endif
@@ -2791,6 +2837,7 @@ ACC_COMPILE_TIME_ASSERT_HEADER(ACC_SIZEOF_PTRDIFF_T == sizeof(ptrdiff_t))
# define ACC_OPT_UNALIGNED64 1 # define ACC_OPT_UNALIGNED64 1
# endif # endif
# endif # endif
# endif
#elif (ACC_ARCH_S390) #elif (ACC_ARCH_S390)
# ifndef ACC_OPT_UNALIGNED16 # ifndef ACC_OPT_UNALIGNED16
# define ACC_OPT_UNALIGNED16 1 # define ACC_OPT_UNALIGNED16 1
@@ -3377,7 +3424,7 @@ ACC_COMPILE_TIME_ASSERT_HEADER(sizeof(acc_int_fast64_t) == sizeof(acc_uint_fast6
#if (ACC_OS_POSIX) #if (ACC_OS_POSIX)
# if (ACC_OS_POSIX_AIX) # if (ACC_OS_POSIX_AIX)
# define HAVE_SYS_RESOURCE_H 1 # define HAVE_SYS_RESOURCE_H 1
# elif (ACC_OS_POSIX_DARWIN || ACC_OS_POSIX_FREEBSD || ACC_OS_POSIX_NETBSD || ACC_OS_POSIX_OPENBSD) # elif (ACC_OS_POSIX_DARWIN || ACC_OS_POSIX_DRAGONFLY || ACC_OS_POSIX_FREEBSD || ACC_OS_POSIX_NETBSD || ACC_OS_POSIX_OPENBSD)
# define HAVE_STRINGS_H 1 # define HAVE_STRINGS_H 1
# undef HAVE_MALLOC_H # undef HAVE_MALLOC_H
# elif (ACC_OS_POSIX_HPUX || ACC_OS_POSIX_INTERIX) # elif (ACC_OS_POSIX_HPUX || ACC_OS_POSIX_INTERIX)
@@ -6679,35 +6726,31 @@ ACCLIB_PUBLIC(int, acc_dos_free) (void __far* p)
# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f) # define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)
#endif #endif
ACCLIB_PUBLIC(void, acc_getopt_init) (acc_getopt_p g, ACCLIB_PUBLIC(void, acc_getopt_init) (acc_getopt_p g,
int start_argc, int argc, char** argv) int start_argc, int argc, char **argv)
{ {
memset(g, 0, sizeof(*g)); memset(g, 0, sizeof(*g));
g->optind = start_argc; g->optind = start_argc;
g->argc = argc; g->argv = argv; g->argc = argc; g->argv = argv;
g->optopt = -1; g->optopt = -1;
} }
static int __ACCLIB_FUNCNAME(acc_getopt_rotate) (char** p, int first, int middle, int last) static int __ACCLIB_FUNCNAME(acc_getopt_rotate) (char **p, int first, int middle, int last)
{ {
int i = middle, n = middle - first; int i = middle, n = middle - first;
if (first >= middle || middle >= last) return 0; if (first >= middle || middle >= last) return 0;
for (;;) for (;;) {
{ char *t = p[first]; p[first++] = p[i]; p[i++] = t;
char* t = p[first]; p[first] = p[i]; p[i] = t; if (first == middle) {
if (++first == middle) if (i == last) break;
{
if (++i == last) break;
middle = i; middle = i;
} } else if (i == last)
else if (++i == last)
i = middle; i = middle;
} }
return n; return n;
} }
static int __ACCLIB_FUNCNAME(acc_getopt_perror) (acc_getopt_p g, int ret, const char* f, ...) static int __ACCLIB_FUNCNAME(acc_getopt_perror) (acc_getopt_p g, int ret, const char *f, ...)
{ {
if (g->opterr) if (g->opterr) {
{ #if defined(HAVE_STDARG_H) && (HAVE_STDARG_H)
#if (HAVE_STDARG_H)
struct { va_list ap; } s; struct { va_list ap; } s;
va_start(s.ap, f); va_start(s.ap, f);
g->opterr(g, f, &s); g->opterr(g, f, &s);
@@ -6720,16 +6763,15 @@ static int __ACCLIB_FUNCNAME(acc_getopt_perror) (acc_getopt_p g, int ret, const
return ret; return ret;
} }
ACCLIB_PUBLIC(int, acc_getopt) (acc_getopt_p g, ACCLIB_PUBLIC(int, acc_getopt) (acc_getopt_p g,
const char* shortopts, const char *shortopts,
const acc_getopt_longopt_p longopts, const acc_getopt_longopt_p longopts,
int* longind) int *longind)
{ {
#define pe __ACCLIB_FUNCNAME(acc_getopt_perror) #define pe __ACCLIB_FUNCNAME(acc_getopt_perror)
int ordering = ACC_GETOPT_PERMUTE; int ordering = ACC_GETOPT_PERMUTE;
int missing_arg_ret = g->bad_option; int missing_arg_ret = g->bad_option;
char* a; char *a;
if (shortopts) if (shortopts) {
{
if (*shortopts == '-' || *shortopts == '+') if (*shortopts == '-' || *shortopts == '+')
ordering = *shortopts++ == '-' ? ACC_GETOPT_RETURN_IN_ORDER : ACC_GETOPT_REQUIRE_ORDER; ordering = *shortopts++ == '-' ? ACC_GETOPT_RETURN_IN_ORDER : ACC_GETOPT_REQUIRE_ORDER;
if (*shortopts == ':') if (*shortopts == ':')
@@ -6746,20 +6788,17 @@ ACCLIB_PUBLIC(int, acc_getopt) (acc_getopt_p g,
goto acc_label_next_shortopt; goto acc_label_next_shortopt;
g->optind -= __ACCLIB_FUNCNAME(acc_getopt_rotate)(g->argv, g->pending_rotate_first, g->pending_rotate_middle, g->optind); g->optind -= __ACCLIB_FUNCNAME(acc_getopt_rotate)(g->argv, g->pending_rotate_first, g->pending_rotate_middle, g->optind);
g->pending_rotate_first = g->pending_rotate_middle = g->optind; g->pending_rotate_first = g->pending_rotate_middle = g->optind;
if (ordering == ACC_GETOPT_PERMUTE) if (ordering == ACC_GETOPT_PERMUTE) {
{
while (g->optind < g->argc && !(g->argv[g->optind][0] == '-' && g->argv[g->optind][1])) while (g->optind < g->argc && !(g->argv[g->optind][0] == '-' && g->argv[g->optind][1]))
++g->optind; ++g->optind;
g->pending_rotate_middle = g->optind; g->pending_rotate_middle = g->optind;
} }
if (g->optind >= g->argc) if (g->optind >= g->argc) {
{
g->optind = g->pending_rotate_first; g->optind = g->pending_rotate_first;
goto acc_label_eof; goto acc_label_eof;
} }
a = g->argv[g->optind]; a = g->argv[g->optind];
if (a[0] == '-' && a[1] == '-') if (a[0] == '-' && a[1] == '-') {
{
size_t l = 0; size_t l = 0;
const acc_getopt_longopt_p o; const acc_getopt_longopt_p o;
const acc_getopt_longopt_p o1 = NULL; const acc_getopt_longopt_p o1 = NULL;
@@ -6770,12 +6809,13 @@ ACCLIB_PUBLIC(int, acc_getopt) (acc_getopt_p g,
goto acc_label_eof; goto acc_label_eof;
for (a += 2; a[l] && a[l] != '=' && a[l] != '#'; ) for (a += 2; a[l] && a[l] != '=' && a[l] != '#'; )
++l; ++l;
for (o = longopts; l && o && o->name; ++o) for (o = longopts; l && o && o->name; ++o) {
{
if (strncmp(a, o->name, l) != 0) if (strncmp(a, o->name, l) != 0)
continue; continue;
if (!o->name[l]) if (!o->name[l])
goto acc_label_found_o; goto acc_label_found_o;
if ((o->has_arg & (ACC_GETOPT_EXACT_ARG | 0x80)) == (ACC_GETOPT_EXACT_ARG | 0x80))
continue;
need_exact |= o->has_arg & ACC_GETOPT_EXACT_ARG; need_exact |= o->has_arg & ACC_GETOPT_EXACT_ARG;
if (o1) o2 = o; if (o1) o2 = o;
else o1 = o; else o1 = o;
@@ -6787,8 +6827,7 @@ ACCLIB_PUBLIC(int, acc_getopt) (acc_getopt_p g,
o = o1; o = o1;
acc_label_found_o: acc_label_found_o:
a += l; a += l;
switch (o->has_arg & 0x2f) switch (o->has_arg & 0x2f) {
{
case ACC_GETOPT_OPTIONAL_ARG: case ACC_GETOPT_OPTIONAL_ARG:
if (a[0]) if (a[0])
g->optarg = a + 1; g->optarg = a + 1;
@@ -6798,7 +6837,7 @@ ACCLIB_PUBLIC(int, acc_getopt) (acc_getopt_p g,
g->optarg = a + 1; g->optarg = a + 1;
else if (g->optind < g->argc) else if (g->optind < g->argc)
g->optarg = g->argv[g->optind++]; g->optarg = g->argv[g->optind++];
if (!g->optarg) if (!g->optarg || (!g->optarg[0] && (o->has_arg & 0x40)))
return pe(g, missing_arg_ret, "option '--%s' requires an argument", o->name); return pe(g, missing_arg_ret, "option '--%s' requires an argument", o->name);
break; break;
case ACC_GETOPT_REQUIRED_ARG | 0x20: case ACC_GETOPT_REQUIRED_ARG | 0x20:
@@ -6814,43 +6853,35 @@ ACCLIB_PUBLIC(int, acc_getopt) (acc_getopt_p g,
} }
if (longind) if (longind)
*longind = (int) (o - longopts); *longind = (int) (o - longopts);
if (o->flag) if (o->flag) {
{
*o->flag = o->val; *o->flag = o->val;
return 0; return 0;
} }
return o->val; return o->val;
} }
if (a[0] == '-' && a[1]) if (a[0] == '-' && a[1]) {
{
unsigned char c; unsigned char c;
const char* s; const char *s;
acc_label_next_shortopt: acc_label_next_shortopt:
a = g->argv[g->optind] + ++g->shortpos; a = g->argv[g->optind] + ++g->shortpos;
c = (unsigned char) *a++; s = NULL; c = (unsigned char) *a++; s = NULL;
if (c != ':' && shortopts) if (c != ':' && shortopts)
s = strchr(shortopts, c); s = strchr(shortopts, c);
if (!s || s[1] != ':') if (!s || s[1] != ':') {
{
if (!a[0]) if (!a[0])
{ ++g->optind; g->shortpos = 0; } { ++g->optind; g->shortpos = 0; }
if (!s) if (!s) {
{
g->optopt = c; g->optopt = c;
return pe(g, g->bad_option, "invalid option '-%c'", c); return pe(g, g->bad_option, "invalid option '-%c'", c);
} }
} } else {
else
{
++g->optind; g->shortpos = 0; ++g->optind; g->shortpos = 0;
if (a[0]) if (a[0])
g->optarg = a; g->optarg = a;
else if (s[2] != ':') else if (s[2] != ':') {
{
if (g->optind < g->argc) if (g->optind < g->argc)
g->optarg = g->argv[g->optind++]; g->optarg = g->argv[g->optind++];
else else {
{
g->optopt = c; g->optopt = c;
return pe(g, missing_arg_ret, "option '-%c' requires an argument", c); return pe(g, missing_arg_ret, "option '-%c' requires an argument", c);
} }
@@ -6858,8 +6889,7 @@ ACCLIB_PUBLIC(int, acc_getopt) (acc_getopt_p g,
} }
return c; return c;
} }
if (ordering == ACC_GETOPT_RETURN_IN_ORDER) if (ordering == ACC_GETOPT_RETURN_IN_ORDER) {
{
++g->optind; ++g->optind;
g->optarg = a; g->optarg = a;
return 1; return 1;
@@ -7352,7 +7382,7 @@ static int acc_pclock_read_clock_gettime_t_libc(acc_pclock_handle_p h, acc_pcloc
if (clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts) != 0) if (clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts) != 0)
return -1; return -1;
c->tv_sec = ts.tv_sec; c->tv_sec = ts.tv_sec;
c->tv_nsec = (acc_uint32l_t) ts.tv_nsec; c->tv_nsec = ACC_STATIC_CAST(acc_uint32l_t, ts.tv_nsec);
ACC_UNUSED(h); return 0; ACC_UNUSED(h); return 0;
} }
#endif #endif