From 1f2fc31bb6eda835dcb3824f6f740bcd0b66c6ea Mon Sep 17 00:00:00 2001 From: "yu.dongliang" <18588496441@163.com> Date: Sun, 23 Aug 2026 15:37:35 +0800 Subject: [PATCH] 1, support , , , , of musl libc, 2, add a test ../examples/setjmp.c for setjmp() function. --- examples/hello.c | 5 + examples/setjmp.c | 29 +++++ lex/scf_lex.c | 230 ++++++++++++++++++++++++++++------ parse/scf_dfa_expr.c | 1 + parse/scf_dfa_function.c | 15 ++- sysroot/include/bits/float.h | 20 +++ sysroot/include/bits/limits.h | 1 + sysroot/include/bits/setjmp.h | 1 + sysroot/include/ctype.h | 77 ++++++++++++ sysroot/include/float.h | 52 ++++++++ sysroot/include/limits.h | 166 ++++++++++++++++++++++++ sysroot/include/locale.h | 88 +++++++++++++ sysroot/include/setjmp.h | 49 ++++++++ 13 files changed, 698 insertions(+), 36 deletions(-) create mode 100644 examples/setjmp.c create mode 100644 sysroot/include/bits/float.h create mode 100644 sysroot/include/bits/limits.h create mode 100644 sysroot/include/bits/setjmp.h create mode 100644 sysroot/include/ctype.h create mode 100644 sysroot/include/float.h create mode 100644 sysroot/include/limits.h create mode 100644 sysroot/include/locale.h create mode 100644 sysroot/include/setjmp.h diff --git a/examples/hello.c b/examples/hello.c index 2ef76ee..6dd7ef7 100644 --- a/examples/hello.c +++ b/examples/hello.c @@ -8,6 +8,11 @@ #include #include #include +#include +#include +#include +#include +#include int main() { diff --git a/examples/setjmp.c b/examples/setjmp.c new file mode 100644 index 0000000..2132505 --- /dev/null +++ b/examples/setjmp.c @@ -0,0 +1,29 @@ +#include +#include + +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; +} diff --git a/lex/scf_lex.c b/lex/scf_lex.c index f8fb05a..d42f565 100644 --- a/lex/scf_lex.c +++ b/lex/scf_lex.c @@ -502,63 +502,223 @@ static int _lex_identity(scf_lex_t* lex, scf_lex_word_t** pword, scf_char_t* c0) 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; diff --git a/parse/scf_dfa_expr.c b/parse/scf_dfa_expr.c index d94499a..c323f14 100644 --- a/parse/scf_dfa_expr.c +++ b/parse/scf_dfa_expr.c @@ -1038,6 +1038,7 @@ static int _dfa_init_syntax_expr(scf_dfa_t* dfa) // 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); diff --git a/parse/scf_dfa_function.c b/parse/scf_dfa_function.c index 7adfffc..b6b2b42 100644 --- a/parse/scf_dfa_function.c +++ b/parse/scf_dfa_function.c @@ -311,7 +311,20 @@ int _function_add_arg(scf_dfa_t* dfa, dfa_data_t* d) } 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; diff --git a/sysroot/include/bits/float.h b/sysroot/include/bits/float.h new file mode 100644 index 0000000..4d8e786 --- /dev/null +++ b/sysroot/include/bits/float.h @@ -0,0 +1,20 @@ +#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 diff --git a/sysroot/include/bits/limits.h b/sysroot/include/bits/limits.h new file mode 100644 index 0000000..07743b6 --- /dev/null +++ b/sysroot/include/bits/limits.h @@ -0,0 +1 @@ +#define PAGESIZE 4096 diff --git a/sysroot/include/bits/setjmp.h b/sysroot/include/bits/setjmp.h new file mode 100644 index 0000000..63973a8 --- /dev/null +++ b/sysroot/include/bits/setjmp.h @@ -0,0 +1 @@ +typedef unsigned long __jmp_buf[8]; diff --git a/sysroot/include/ctype.h b/sysroot/include/ctype.h new file mode 100644 index 0000000..32bcef4 --- /dev/null +++ b/sysroot/include/ctype.h @@ -0,0 +1,77 @@ +#ifndef _CTYPE_H +#define _CTYPE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +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 + +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 diff --git a/sysroot/include/float.h b/sysroot/include/float.h new file mode 100644 index 0000000..713aadb --- /dev/null +++ b/sysroot/include/float.h @@ -0,0 +1,52 @@ +#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 + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sysroot/include/limits.h b/sysroot/include/limits.h new file mode 100644 index 0000000..53a27b9 --- /dev/null +++ b/sysroot/include/limits.h @@ -0,0 +1,166 @@ +#ifndef _LIMITS_H +#define _LIMITS_H + +#include + +#include /* __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 + +#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 diff --git a/sysroot/include/locale.h b/sysroot/include/locale.h new file mode 100644 index 0000000..7a25976 --- /dev/null +++ b/sysroot/include/locale.h @@ -0,0 +1,88 @@ +#ifndef _LOCALE_H +#define _LOCALE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#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 + +#define LC_GLOBAL_LOCALE ((locale_t)-1) + +#define LC_CTYPE_MASK (1< + +#include + +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 -- 2.25.1