1, support <ctype.h>, <float.h>, <limits.h>, <locale.h>, <setjmp.h> of musl libc, master
authoryu.dongliang <18588496441@163.com>
Sun, 23 Aug 2026 07:37:35 +0000 (15:37 +0800)
committeryu.dongliang <18588496441@163.com>
Sun, 23 Aug 2026 07:38:51 +0000 (15:38 +0800)
2, add a test ../examples/setjmp.c for setjmp() function.

13 files changed:
examples/hello.c
examples/setjmp.c [new file with mode: 0644]
lex/scf_lex.c
parse/scf_dfa_expr.c
parse/scf_dfa_function.c
sysroot/include/bits/float.h [new file with mode: 0644]
sysroot/include/bits/limits.h [new file with mode: 0644]
sysroot/include/bits/setjmp.h [new file with mode: 0644]
sysroot/include/ctype.h [new file with mode: 0644]
sysroot/include/float.h [new file with mode: 0644]
sysroot/include/limits.h [new file with mode: 0644]
sysroot/include/locale.h [new file with mode: 0644]
sysroot/include/setjmp.h [new file with mode: 0644]

index 2ef76eec758f255a4346f8f82fee05131ea21eea..6dd7ef7b6963809bcfb8442c39d4e80b2bf5f7de 100644 (file)
@@ -8,6 +8,11 @@
 #include<stdint.h>
 #include<time.h>
 #include<math.h>
 #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()
 {
 
 int main()
 {
diff --git a/examples/setjmp.c b/examples/setjmp.c
new file mode 100644 (file)
index 0000000..2132505
--- /dev/null
@@ -0,0 +1,29 @@
+#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;
+}
index f8fb05a2e84125bfb8f4597d8cafe2f66a16ed2c..d42f565b56cc6818a0fb34341f17c31fd26863ab 100644 (file)
@@ -502,63 +502,223 @@ static int _lex_identity(scf_lex_t* lex, scf_lex_word_t** pword, scf_char_t* c0)
        return -1;
 }
 
        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
                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);
 
        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(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;
        }
 
 
        if (!w) {
                scf_string_free(s);
                return -1;
        }
 
+       w->data.i64 = num;
+
        w->text = s;
        *pword  = w;
        return 0;
        w->text = s;
        *pword  = w;
        return 0;
index d94499aedea3b8b0dae614f223cfef89ffff834e..c323f14a80523ffbd4905eccf6c609a393445ab4 100644 (file)
@@ -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);
        // 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);
        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);
index 7adfffc7cedab0e366781adff4b3b41059f2fb12..b6b2b42bda03ef550180ecc0b41d66461367c8f9 100644 (file)
@@ -311,7 +311,20 @@ int _function_add_arg(scf_dfa_t* dfa, dfa_data_t* d)
                }
 
                if (!d->current_var) {
                }
 
                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;
 
                        if (!arg)
                                return SCF_DFA_ERROR;
 
diff --git a/sysroot/include/bits/float.h b/sysroot/include/bits/float.h
new file mode 100644 (file)
index 0000000..4d8e786
--- /dev/null
@@ -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 (file)
index 0000000..07743b6
--- /dev/null
@@ -0,0 +1 @@
+#define PAGESIZE 4096
diff --git a/sysroot/include/bits/setjmp.h b/sysroot/include/bits/setjmp.h
new file mode 100644 (file)
index 0000000..63973a8
--- /dev/null
@@ -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 (file)
index 0000000..32bcef4
--- /dev/null
@@ -0,0 +1,77 @@
+#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
diff --git a/sysroot/include/float.h b/sysroot/include/float.h
new file mode 100644 (file)
index 0000000..713aadb
--- /dev/null
@@ -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 <bits/float.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/sysroot/include/limits.h b/sysroot/include/limits.h
new file mode 100644 (file)
index 0000000..53a27b9
--- /dev/null
@@ -0,0 +1,166 @@
+#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
diff --git a/sysroot/include/locale.h b/sysroot/include/locale.h
new file mode 100644 (file)
index 0000000..7a25976
--- /dev/null
@@ -0,0 +1,88 @@
+#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
diff --git a/sysroot/include/setjmp.h b/sysroot/include/setjmp.h
new file mode 100644 (file)
index 0000000..1976af2
--- /dev/null
@@ -0,0 +1,49 @@
+#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