|
@@ -47,7 +47,6 @@ extern int getdtablesize (void);
|
|
|
* repeats and moving to a table-based implementation, we generate 283
|
|
|
* bytes on i386 (-Os -fomit-frame-pointer).
|
|
|
*/
|
|
|
-#ifndef _UCLIBC_GENERATE_SYSCONF_MAIN
|
|
|
|
|
|
#ifdef _UCLIBC_GENERATE_SYSCONF_ARCH
|
|
|
|
|
@@ -900,164 +899,3 @@ long int __sysconf(int name)
|
|
|
}
|
|
|
weak_alias(__sysconf, sysconf);
|
|
|
|
|
|
-#endif
|
|
|
-
|
|
|
-#ifdef _UCLIBC_GENERATE_SYSCONF_MAIN
|
|
|
-
|
|
|
-static long int ret_vals[_UCLIBC_SYSCONF_NUM_VALID_ARGS];
|
|
|
-
|
|
|
-static const char *type_str[] = {
|
|
|
- "char", "short", "int", "long"
|
|
|
-};
|
|
|
-
|
|
|
-static const char *type_fmt[] = { " %4ld", " %6ld", " %8ld", " %8ld" };
|
|
|
-static const int type_mod[] = { 13, 9, 6, 6 };
|
|
|
-
|
|
|
-static int find_or_add_in_table(int index, long int val, int *table,
|
|
|
- int *num_in_table, int add_flag)
|
|
|
-{
|
|
|
- int i;
|
|
|
-
|
|
|
- for (i=0 ; i<*num_in_table ; i++) {
|
|
|
- if (ret_vals[table[i]] == val) {
|
|
|
- return i;
|
|
|
- }
|
|
|
- }
|
|
|
- if (add_flag) {
|
|
|
- table[(*num_in_table)++] = index;
|
|
|
- return i;
|
|
|
- } else {
|
|
|
- return -1;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-int main(void)
|
|
|
-{
|
|
|
- long int r;
|
|
|
- int type_table[5][_UCLIBC_SYSCONF_NUM_VALID_ARGS];
|
|
|
- int ret_type[_UCLIBC_SYSCONF_NUM_VALID_ARGS];
|
|
|
- int num_type[5];
|
|
|
- int i, j, k, code;
|
|
|
-
|
|
|
- for (i=0 ; i<5 ; i++) {
|
|
|
- num_type[i] = 0;
|
|
|
- }
|
|
|
-
|
|
|
- for (i=0; i<_UCLIBC_SYSCONF_NUM_VALID_ARGS ; i++) {
|
|
|
- __set_errno(0);
|
|
|
- r = ret_vals[i] = sysconf(i);
|
|
|
- switch(errno) {
|
|
|
- case EINVAL:
|
|
|
- fprintf(stderr,"sysconf.c is broken! case %d missing!\n", i);
|
|
|
- return EXIT_FAILURE;
|
|
|
- case EISNAM:
|
|
|
- find_or_add_in_table(i,r,type_table[4],num_type+4,1);
|
|
|
- ret_type[i] = 4;
|
|
|
- break;
|
|
|
- case ENOSYS:
|
|
|
-
|
|
|
- fprintf(stderr,"gen_sysconf advisory --"
|
|
|
- "case %d defaults to -1\n", i);
|
|
|
-
|
|
|
- case 0:
|
|
|
- if ((r>=CHAR_MIN) && (r<=CHAR_MAX)) {
|
|
|
- ret_type[i] = 0;
|
|
|
- find_or_add_in_table(i,r,type_table[0],num_type+0,1);
|
|
|
- } else if ((r>=SHRT_MIN) && (r<=SHRT_MAX)) {
|
|
|
- ret_type[i] = 1;
|
|
|
- find_or_add_in_table(i,r,type_table[1],num_type+1,1);
|
|
|
- } else if ((r>=INT_MIN) && (r<=INT_MAX)) {
|
|
|
- ret_type[i] = 2;
|
|
|
- find_or_add_in_table(i,r,type_table[2],num_type+2,1);
|
|
|
- } else {
|
|
|
- ret_type[i] = 3;
|
|
|
- find_or_add_in_table(i,r,type_table[3],num_type+3,1);
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- fprintf(stderr,"sysconf.c is broken! errno = %d!\n", errno);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- printf("#include <errno.h>\n#include <unistd.h>\n#include <limits.h>\n\n");
|
|
|
-
|
|
|
- printf("static const unsigned char index[%d] = {",
|
|
|
- _UCLIBC_SYSCONF_NUM_VALID_ARGS);
|
|
|
- for (i=0 ; i<_UCLIBC_SYSCONF_NUM_VALID_ARGS ; i++) {
|
|
|
- if (i) printf(",");
|
|
|
- if (i%15 == 0) printf("\n");
|
|
|
- code = 0;
|
|
|
- for (j=0 ; j<4 ; j++) {
|
|
|
- k = find_or_add_in_table(i,ret_vals[i],type_table[j],num_type+j,0);
|
|
|
- if (k>=0) {
|
|
|
- code += k;
|
|
|
- break;
|
|
|
- }
|
|
|
- code += num_type[j];
|
|
|
- }
|
|
|
- printf(" %3d", code);
|
|
|
- }
|
|
|
- printf("\n};\n\n");
|
|
|
-
|
|
|
- for (j=0 ; j < 4 ; j++) {
|
|
|
- if (num_type[j]) {
|
|
|
- printf("static const %s %s_vals[%d] = {",
|
|
|
- type_str[j], type_str[j], num_type[j]);
|
|
|
- for (i = 0 ; i<num_type[j] ; i++) {
|
|
|
- if (i) printf(",");
|
|
|
- if (i%13 == 0) printf("\n");
|
|
|
- if (ret_vals[type_table[j][i]] == INT_MIN) {
|
|
|
- printf("%12s","INT_MIN");
|
|
|
- } else {
|
|
|
- printf(type_fmt[j], ret_vals[type_table[j][i]]);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- printf("\n};\n\n");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- printf("long int sysconf(int name)\n{\n\tint i;\n\n"
|
|
|
- "\tif ((name < 0) || (name >= %d)) {\n"
|
|
|
- "\t\terrno=EINVAL;\n"
|
|
|
- "\t\treturn -1;\n"
|
|
|
- "\t}\n\n", _UCLIBC_SYSCONF_NUM_VALID_ARGS);
|
|
|
-
|
|
|
- printf("\ti = index[name];\n\n");
|
|
|
- k = 0;
|
|
|
- for (i=0 ; i<4 ; i++) {
|
|
|
- if (num_type[i]) {
|
|
|
- if (k>0) {
|
|
|
- printf("\ti -= %d;\n", k);
|
|
|
- }
|
|
|
- printf("\tif (i < %d) {\n"
|
|
|
- "\t\treturn %s_vals[i];\n"
|
|
|
- "\t}\n\n",
|
|
|
- num_type[i], type_str[i]);
|
|
|
- k = num_type[i];
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (num_type[4]) {
|
|
|
- if (k>0) {
|
|
|
- printf("\ti -= %d;\n", k);
|
|
|
- }
|
|
|
- printf("\tswitch(i) {\n");
|
|
|
- for (i = 0 ; i<num_type[4] ; i++) {
|
|
|
- printf("\t\tcase %d:\n"
|
|
|
- "\t\t\treturn %s;\n",
|
|
|
- i, (const char *)ret_vals[type_table[4][i]]);
|
|
|
- }
|
|
|
- printf("\t}\n\n");
|
|
|
- }
|
|
|
-
|
|
|
- printf("\treturn -1;\n"
|
|
|
- "}\n");
|
|
|
-
|
|
|
-
|
|
|
- return EXIT_SUCCESS;
|
|
|
-}
|
|
|
-
|
|
|
-#endif
|