2, add a test ../examples/setjmp.c for setjmp() function.
#include<stdint.h>
#include<time.h>
#include<math.h>
+#include<float.h>
+#include<limits.h>
+#include<ctype.h>
+#include<locale.h>
+#include<setjmp.h>
int main()
{
--- /dev/null
+#include<stdio.h>
+#include<setjmp.h>
+
+jmp_buf env;
+
+void level_2()
+{
+ printf("Level 2: Error occurred. Jumping...\n");
+ longjmp(env, 1);
+}
+
+void level_1()
+{
+ printf("Level 1: Calling Level 2...\n");
+ level_2();
+ printf("Level 1: This will NOT print.\n");
+}
+
+int main()
+{
+ if (setjmp(env) == 0) {
+ printf("Main: Start normal flow.\n");
+ level_1();
+ printf("Main: End normal flow.\n");
+ } else {
+ printf("Main: Caught jump. Handle error.\n");
+ }
+ return 0;
+}
return -1;
}
-static int _lex_char(scf_lex_t* lex, scf_lex_word_t** pword, scf_string_t* s, scf_char_t* c0)
+static int _lex_char_base8(scf_lex_t* lex, scf_string_t* s, int* num)
{
- scf_lex_word_t* w = NULL;
- scf_char_t* c1 = _lex_pop_char(lex);
- scf_char_t* c2 = _lex_pop_char(lex);
- scf_char_t* c3;
+ int tmp = -1;
+ int n = 0;
+ int v = 0;
- int pos = lex->pos;
+ while (1) {
+ scf_char_t* c = _lex_pop_char(lex);
+ if (!c)
+ return -ENOMEM;
- if ('\\' == c1->c) {
- c3 = _lex_pop_char(lex);
+ tmp = c->c;
- if ('\'' == c3->c) {
- if (!s)
- s = scf_string_cstr_len(c0->utf8, 1);
- else
- scf_string_cat_cstr_len(s, c0->utf8, 1);
+ int ret = scf_string_cat_cstr_len(s, c->utf8, c->len);
- scf_string_cat_cstr_len(s, c1->utf8, 1);
- scf_string_cat_cstr_len(s, c2->utf8, c2->len);
- scf_string_cat_cstr_len(s, c3->utf8, 1);
+ lex->pos += c->len;
+ free(c);
+ c = NULL;
- w = scf_lex_word_alloc(lex->file, lex->nb_lines, pos, SCF_LEX_WORD_CONST_CHAR);
+ if (ret < 0)
+ return ret;
- w->data.i64 = _find_escape_char(c2->c);
- lex->pos += c2->len + 3;
- } else
- scf_loge("const char lost 2nd ' in file: %s, line: %d\n", lex->file->data, lex->nb_lines);
+ if (tmp < '0' || tmp > '7')
+ break;
- free(c3);
- c3 = NULL;
+ v = (v << 3) + tmp - '0';
+ n++;
+ }
- } else if ('\'' == c2->c) {
- if (!s)
- s = scf_string_cstr_len(c0->utf8, 1);
+ if (tmp < 0) {
+ scf_loge("%s:%d:%d, un-expected char '%d' found\n", lex->file->data, lex->nb_lines, lex->pos, tmp);
+ return tmp;
+ }
+
+ switch (tmp) {
+ case '8':
+ case '9':
+ scf_loge("%s:%d:%d, un-expected char '%c' found\n", lex->file->data, lex->nb_lines, lex->pos, tmp);
+ return -1;
+ break;
+
+ case '\'':
+ if (n > 3) {
+ scf_loge("%s:%d:%d, const base8 char should NOT more than 3 bits, real '%d bits'.\n",
+ lex->file->data, lex->nb_lines, lex->pos, n);
+ return -1;
+ }
+ break;
+
+ default:
+ if (n > 1) {
+ scf_loge("%s:%d:%d, un-expected char '%c' found\n", lex->file->data, lex->nb_lines, lex->pos, tmp);
+ return -1;
+ }
+ break;
+ };
+
+ *num = v;
+ return tmp;
+}
+
+static int _lex_char_base16(scf_lex_t* lex, scf_string_t* s, int* num)
+{
+ int tmp = -1;
+ int n = 0;
+ int v = 0;
+
+ while (1) {
+ scf_char_t* c = _lex_pop_char(lex);
+ if (!c)
+ return -ENOMEM;
+
+ tmp = c->c;
+
+ int ret = scf_string_cat_cstr_len(s, c->utf8, c->len);
+
+ lex->pos += c->len;
+ free(c);
+ c = NULL;
+ if (ret < 0)
+ return ret;
+
+ if (tmp >= '0' && tmp <= '9')
+ tmp -= '0';
+
+ else if (tmp >= 'a' && tmp <= 'f')
+ tmp += 10 - 'a';
+
+ else if (tmp >= 'A' && tmp <= 'F')
+ tmp += 10 - 'A';
else
- scf_string_cat_cstr_len(s, c0->utf8, 1);
+ break;
- scf_string_cat_cstr_len(s, c1->utf8, c1->len);
- scf_string_cat_cstr_len(s, c2->utf8, 1);
+ v = (v << 4) + tmp;
+ }
- w = scf_lex_word_alloc(lex->file, lex->nb_lines, pos, SCF_LEX_WORD_CONST_CHAR);
+ if (tmp < 0) {
+ scf_loge("%s:%d:%d, un-expected char '%d' found\n", lex->file->data, lex->nb_lines, lex->pos, tmp);
+ return tmp;
+ }
- w->data.i64 = c1->c;
- lex->pos += c1->len + 2;
- } else
- scf_loge("const char lost 2nd ' in file: %s, line: %d\n", lex->file->data, lex->nb_lines);
+ if ('\'' != tmp) {
+ scf_loge("%s:%d:%d, const char lost right '\n", lex->file->data, lex->nb_lines, lex->pos);
+ return -1;
+ }
+
+ *num = v;
+ return tmp;
+}
+
+static int _lex_char(scf_lex_t* lex, scf_lex_word_t** pword, scf_string_t* s, scf_char_t* c0)
+{
+ scf_lex_word_t* w = NULL;
+ scf_char_t* c1;
+ scf_char_t* c2;
+
+ int pos = lex->pos;
+ int ret = 0;
+
+ if (!s)
+ s = scf_string_cstr_len(c0->utf8, 1);
+ else
+ ret = scf_string_cat_cstr_len(s, c0->utf8, 1);
+ lex->pos++;
free(c0);
+ c0 = NULL;
+
+ if (!s)
+ return -ENOMEM;
+ else if (ret < 0) {
+ scf_string_free(s);
+ return ret;
+ }
+
+ c1 = _lex_pop_char(lex);
+ if (!c1) {
+ scf_string_free(s);
+ return -ENOMEM;
+ }
+
+ int num = 0;
+ int tmp = c1->c;
+
+ ret = scf_string_cat_cstr_len(s, c1->utf8, c1->len);
+
+ lex->pos += c1->len;
free(c1);
- free(c2);
+ c1 = NULL;
+
+ if (ret < 0) {
+ scf_string_free(s);
+ return ret;
+ }
+
+ if ('\\' == tmp) {
+ ret = _lex_char_base8(lex, s, &num);
+ if (ret < 0) {
+ scf_string_free(s);
+ return ret;
+ }
+
+ switch (ret) {
+ case 'x': // base 16 const char
+ num = 0;
+ ret = _lex_char_base16(lex, s, &num);
+ if (ret < 0) {
+ scf_string_free(s);
+ return ret;
+ }
+ break;
+
+ case '\'': // base 8 const char
+ break;
+
+ default: // other char
+ num = _find_escape_char(ret);
+ break;
+ };
+
+ tmp = ret;
+ } else
+ num = tmp;
+
+ if ('\'' != tmp) {
+ c2 = _lex_pop_char(lex);
+ if (!c2) {
+ scf_string_free(s);
+ return -ENOMEM;
+ }
+
+ tmp = c2->c;
+
+ ret = scf_string_cat_cstr_len(s, c2->utf8, c2->len);
+
+ lex->pos += c2->len;
+ free(c2);
+ c2 = NULL;
+
+ if (ret < 0) {
+ scf_string_free(s);
+ return ret;
+ }
+ }
+
+ if ('\'' == tmp)
+ w = scf_lex_word_alloc(lex->file, lex->nb_lines, pos, SCF_LEX_WORD_CONST_CHAR);
+ else
+ scf_loge("%s:%d:%d, const char lost right '\n", lex->file->data, lex->nb_lines, lex->pos);
if (!w) {
scf_string_free(s);
return -1;
}
+ w->data.i64 = num;
+
w->text = s;
*pword = w;
return 0;
// sizeof()
scf_dfa_node_add_child(expr, _sizeof);
scf_dfa_node_add_child(sizeof_rp, rp);
+ scf_dfa_node_add_child(sizeof_rp, rs);
scf_dfa_node_add_child(sizeof_rp, binary_op);
scf_dfa_node_add_child(sizeof_rp, comma);
scf_dfa_node_add_child(sizeof_rp, semicolon);
}
if (!d->current_var) {
- arg = SCF_VAR_ALLOC_BY_TYPE(w, t->type, t->const_flag, t->nb_pointers, t->func_ptr);
+
+ int const_flag = t->const_flag;
+ int nb_pointers = t->nb_pointers;
+ void* func_ptr = t->func_ptr;
+
+ if (t->type_def) {
+ const_flag |= t->type_def->const_flag;
+ nb_pointers += t->type_def->nb_pointers + t->type_def->nb_dimentions;
+
+ if (!func_ptr)
+ func_ptr = t->type_def->func_ptr;
+ }
+
+ arg = SCF_VAR_ALLOC_BY_TYPE(w, t->type, const_flag, nb_pointers, func_ptr);
if (!arg)
return SCF_DFA_ERROR;
--- /dev/null
+#ifdef __FLT_EVAL_METHOD__
+#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
+#else
+#define FLT_EVAL_METHOD 0
+#endif
+
+#define LDBL_TRUE_MIN 3.6451995318824746025e-4951L
+#define LDBL_MIN 3.3621031431120935063e-4932L
+#define LDBL_MAX 1.1897314953572317650e+4932L
+#define LDBL_EPSILON 1.0842021724855044340e-19L
+
+#define LDBL_MANT_DIG 64
+#define LDBL_MIN_EXP (-16381)
+#define LDBL_MAX_EXP 16384
+
+#define LDBL_DIG 18
+#define LDBL_MIN_10_EXP (-4931)
+#define LDBL_MAX_10_EXP 4932
+
+#define DECIMAL_DIG 21
--- /dev/null
+#define PAGESIZE 4096
--- /dev/null
+typedef unsigned long __jmp_buf[8];
--- /dev/null
+#ifndef _CTYPE_H
+#define _CTYPE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+int isalnum(int);
+int isalpha(int);
+int isblank(int);
+int iscntrl(int);
+int isdigit(int);
+int isgraph(int);
+int islower(int);
+int isprint(int);
+int ispunct(int);
+int isspace(int);
+int isupper(int);
+int isxdigit(int);
+int tolower(int);
+int toupper(int);
+
+#ifndef __cplusplus
+static __inline int __isspace(int _c)
+{
+ return _c == ' ' || (unsigned)_c-'\t' < 5;
+}
+
+#define isalpha(a) (0 ? isalpha(a) : (((unsigned)(a)|32)-'a') < 26)
+#define isdigit(a) (0 ? isdigit(a) : ((unsigned)(a)-'0') < 10)
+#define islower(a) (0 ? islower(a) : ((unsigned)(a)-'a') < 26)
+#define isupper(a) (0 ? isupper(a) : ((unsigned)(a)-'A') < 26)
+#define isprint(a) (0 ? isprint(a) : ((unsigned)(a)-0x20) < 0x5f)
+#define isgraph(a) (0 ? isgraph(a) : ((unsigned)(a)-0x21) < 0x5e)
+#define isspace(a) __isspace(a)
+#endif
+
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+
+#define __NEED_locale_t
+#include <bits/alltypes.h>
+
+int isalnum_l(int, locale_t);
+int isalpha_l(int, locale_t);
+int isblank_l(int, locale_t);
+int iscntrl_l(int, locale_t);
+int isdigit_l(int, locale_t);
+int isgraph_l(int, locale_t);
+int islower_l(int, locale_t);
+int isprint_l(int, locale_t);
+int ispunct_l(int, locale_t);
+int isspace_l(int, locale_t);
+int isupper_l(int, locale_t);
+int isxdigit_l(int, locale_t);
+int tolower_l(int, locale_t);
+int toupper_l(int, locale_t);
+
+int isascii(int);
+int toascii(int);
+#define _tolower(a) ((a)|0x20)
+#define _toupper(a) ((a)&0x5f)
+#ifndef __cplusplus
+#define isascii(a) (0 ? isascii(a) : (unsigned)(a) < 128)
+#endif
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+#ifndef _FLOAT_H
+#define _FLOAT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int __flt_rounds(void);
+#define FLT_ROUNDS (__flt_rounds())
+
+#define FLT_RADIX 2
+
+#define FLT_TRUE_MIN 1.40129846432481707092e-45F
+#define FLT_MIN 1.17549435082228750797e-38F
+#define FLT_MAX 3.40282346638528859812e+38F
+#define FLT_EPSILON 1.1920928955078125e-07F
+
+#define FLT_MANT_DIG 24
+#define FLT_MIN_EXP (-125)
+#define FLT_MAX_EXP 128
+#define FLT_HAS_SUBNORM 1
+
+#define FLT_DIG 6
+#define FLT_DECIMAL_DIG 9
+#define FLT_MIN_10_EXP (-37)
+#define FLT_MAX_10_EXP 38
+
+#define DBL_TRUE_MIN 4.94065645841246544177e-324
+#define DBL_MIN 2.22507385850720138309e-308
+#define DBL_MAX 1.79769313486231570815e+308
+#define DBL_EPSILON 2.22044604925031308085e-16
+
+#define DBL_MANT_DIG 53
+#define DBL_MIN_EXP (-1021)
+#define DBL_MAX_EXP 1024
+#define DBL_HAS_SUBNORM 1
+
+#define DBL_DIG 15
+#define DBL_DECIMAL_DIG 17
+#define DBL_MIN_10_EXP (-307)
+#define DBL_MAX_10_EXP 308
+
+#define LDBL_HAS_SUBNORM 1
+#define LDBL_DECIMAL_DIG DECIMAL_DIG
+
+#include <bits/float.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+#ifndef _LIMITS_H
+#define _LIMITS_H
+
+#include <features.h>
+
+#include <bits/alltypes.h> /* __LONG_MAX */
+
+/* Support signed or unsigned plain-char */
+
+#if '\xff' > 0
+#define CHAR_MIN 0
+#define CHAR_MAX 255
+#else
+#define CHAR_MIN (-128)
+#define CHAR_MAX 127
+#endif
+
+#define CHAR_BIT 8
+#define SCHAR_MIN (-128)
+#define SCHAR_MAX 127
+#define UCHAR_MAX 255
+#define SHRT_MIN (-1-0x7fff)
+#define SHRT_MAX 0x7fff
+#define USHRT_MAX 0xffff
+#define INT_MIN (-1-0x7fffffff)
+#define INT_MAX 0x7fffffff
+#define UINT_MAX 0xffffffffU
+#define LONG_MIN (-LONG_MAX-1)
+#define LONG_MAX __LONG_MAX
+#define ULONG_MAX (2UL*LONG_MAX+1)
+#define LLONG_MIN (-LLONG_MAX-1)
+#define LLONG_MAX 0x7fffffffffffffffLL
+#define ULLONG_MAX (2ULL*LLONG_MAX+1)
+
+#define MB_LEN_MAX 4
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#include <bits/limits.h>
+
+#define PIPE_BUF 4096
+#define FILESIZEBITS 64
+#ifndef NAME_MAX
+#define NAME_MAX 255
+#endif
+#define PATH_MAX 4096
+#define NGROUPS_MAX 32
+#define ARG_MAX 131072
+#define IOV_MAX 1024
+#define SYMLOOP_MAX 40
+#define WORD_BIT 32
+#define SSIZE_MAX LONG_MAX
+#define TZNAME_MAX 6
+#define TTY_NAME_MAX 32
+#define HOST_NAME_MAX 255
+
+#if LONG_MAX == 0x7fffffffL
+#define LONG_BIT 32
+#else
+#define LONG_BIT 64
+#endif
+
+/* Implementation choices... */
+
+#define PTHREAD_KEYS_MAX 128
+#define PTHREAD_STACK_MIN 2048
+#define PTHREAD_DESTRUCTOR_ITERATIONS 4
+#define SEM_VALUE_MAX 0x7fffffff
+#define SEM_NSEMS_MAX 256
+#define DELAYTIMER_MAX 0x7fffffff
+#define MQ_PRIO_MAX 32768
+#define LOGIN_NAME_MAX 256
+
+/* Arbitrary numbers... */
+
+#define BC_BASE_MAX 99
+#define BC_DIM_MAX 2048
+#define BC_SCALE_MAX 99
+#define BC_STRING_MAX 1000
+#define CHARCLASS_NAME_MAX 14
+#define COLL_WEIGHTS_MAX 2
+#define EXPR_NEST_MAX 32
+#define LINE_MAX 4096
+#define RE_DUP_MAX 255
+
+#define NL_ARGMAX 9
+#define NL_MSGMAX 32767
+#define NL_SETMAX 255
+#define NL_TEXTMAX 2048
+
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) || defined(_XOPEN_SOURCE)
+
+#ifdef PAGESIZE
+#define PAGE_SIZE PAGESIZE
+#endif
+#define NZERO 20
+#define NL_LANGMAX 32
+
+#endif
+
+#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) \
+ || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE+0 < 700)
+
+#define NL_NMAX 16
+
+#endif
+
+/* POSIX/SUS requirements follow. These numbers come directly
+ * from SUS and have nothing to do with the host system. */
+
+#define _POSIX_AIO_LISTIO_MAX 2
+#define _POSIX_AIO_MAX 1
+#define _POSIX_ARG_MAX 4096
+#define _POSIX_CHILD_MAX 25
+#define _POSIX_CLOCKRES_MIN 20000000
+#define _POSIX_DELAYTIMER_MAX 32
+#define _POSIX_HOST_NAME_MAX 255
+#define _POSIX_LINK_MAX 8
+#define _POSIX_LOGIN_NAME_MAX 9
+#define _POSIX_MAX_CANON 255
+#define _POSIX_MAX_INPUT 255
+#define _POSIX_MQ_OPEN_MAX 8
+#define _POSIX_MQ_PRIO_MAX 32
+#define _POSIX_NAME_MAX 14
+#define _POSIX_NGROUPS_MAX 8
+#define _POSIX_OPEN_MAX 20
+#define _POSIX_PATH_MAX 256
+#define _POSIX_PIPE_BUF 512
+#define _POSIX_RE_DUP_MAX 255
+#define _POSIX_RTSIG_MAX 8
+#define _POSIX_SEM_NSEMS_MAX 256
+#define _POSIX_SEM_VALUE_MAX 32767
+#define _POSIX_SIGQUEUE_MAX 32
+#define _POSIX_SSIZE_MAX 32767
+#define _POSIX_STREAM_MAX 8
+#define _POSIX_SS_REPL_MAX 4
+#define _POSIX_SYMLINK_MAX 255
+#define _POSIX_SYMLOOP_MAX 8
+#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4
+#define _POSIX_THREAD_KEYS_MAX 128
+#define _POSIX_THREAD_THREADS_MAX 64
+#define _POSIX_TIMER_MAX 32
+#define _POSIX_TRACE_EVENT_NAME_MAX 30
+#define _POSIX_TRACE_NAME_MAX 8
+#define _POSIX_TRACE_SYS_MAX 8
+#define _POSIX_TRACE_USER_EVENT_MAX 32
+#define _POSIX_TTY_NAME_MAX 9
+#define _POSIX_TZNAME_MAX 6
+#define _POSIX2_BC_BASE_MAX 99
+#define _POSIX2_BC_DIM_MAX 2048
+#define _POSIX2_BC_SCALE_MAX 99
+#define _POSIX2_BC_STRING_MAX 1000
+#define _POSIX2_CHARCLASS_NAME_MAX 14
+#define _POSIX2_COLL_WEIGHTS_MAX 2
+#define _POSIX2_EXPR_NEST_MAX 32
+#define _POSIX2_LINE_MAX 2048
+#define _POSIX2_RE_DUP_MAX 255
+
+#define _XOPEN_IOV_MAX 16
+#define _XOPEN_NAME_MAX 255
+#define _XOPEN_PATH_MAX 1024
+
+#endif
--- /dev/null
+#ifndef _LOCALE_H
+#define _LOCALE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#if __cplusplus >= 201103L
+#define NULL nullptr
+#elif defined(__cplusplus)
+#define NULL 0L
+#else
+//#define NULL ((void*)0)
+#endif
+
+#define LC_CTYPE 0
+#define LC_NUMERIC 1
+#define LC_TIME 2
+#define LC_COLLATE 3
+#define LC_MONETARY 4
+#define LC_MESSAGES 5
+#define LC_ALL 6
+
+struct lconv {
+ char *decimal_point;
+ char *thousands_sep;
+ char *grouping;
+
+ char *int_curr_symbol;
+ char *currency_symbol;
+ char *mon_decimal_point;
+ char *mon_thousands_sep;
+ char *mon_grouping;
+ char *positive_sign;
+ char *negative_sign;
+ char int_frac_digits;
+ char frac_digits;
+ char p_cs_precedes;
+ char p_sep_by_space;
+ char n_cs_precedes;
+ char n_sep_by_space;
+ char p_sign_posn;
+ char n_sign_posn;
+ char int_p_cs_precedes;
+ char int_p_sep_by_space;
+ char int_n_cs_precedes;
+ char int_n_sep_by_space;
+ char int_p_sign_posn;
+ char int_n_sign_posn;
+};
+
+
+char *setlocale (int, const char *);
+struct lconv *localeconv(void);
+
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+
+#define __NEED_locale_t
+
+#include <bits/alltypes.h>
+
+#define LC_GLOBAL_LOCALE ((locale_t)-1)
+
+#define LC_CTYPE_MASK (1<<LC_CTYPE)
+#define LC_NUMERIC_MASK (1<<LC_NUMERIC)
+#define LC_TIME_MASK (1<<LC_TIME)
+#define LC_COLLATE_MASK (1<<LC_COLLATE)
+#define LC_MONETARY_MASK (1<<LC_MONETARY)
+#define LC_MESSAGES_MASK (1<<LC_MESSAGES)
+#define LC_ALL_MASK 0x7fffffff
+
+locale_t duplocale(locale_t);
+void freelocale(locale_t);
+locale_t newlocale(int, const char *, locale_t);
+locale_t uselocale(locale_t);
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+#ifndef _SETJMP_H
+#define _SETJMP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <features.h>
+
+#include <bits/setjmp.h>
+
+typedef struct __jmp_buf_tag {
+ __jmp_buf __jb;
+ unsigned long __fl;
+ unsigned long __ss[128/sizeof(long)];
+} jmp_buf[1];
+
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)
+#define __setjmp_attr __attribute__((__returns_twice__))
+#else
+#define __setjmp_attr
+#endif
+
+#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+typedef jmp_buf sigjmp_buf;
+int sigsetjmp (sigjmp_buf, int) __setjmp_attr;
+_Noreturn void siglongjmp (sigjmp_buf, int);
+#endif
+
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+ || defined(_BSD_SOURCE)
+int _setjmp (jmp_buf) __setjmp_attr;
+_Noreturn void _longjmp (jmp_buf, int);
+#endif
+
+int setjmp (jmp_buf) __setjmp_attr;
+_Noreturn void longjmp (jmp_buf, int);
+
+#define setjmp setjmp
+
+#undef __setjmp_attr
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif