diff --git a/programs/develop/ktcc/trunk/bin/lib/libck.a b/programs/develop/ktcc/trunk/bin/lib/libck.a index 15bd4554f8..390dc8cb25 100644 Binary files a/programs/develop/ktcc/trunk/bin/lib/libck.a and b/programs/develop/ktcc/trunk/bin/lib/libck.a differ diff --git a/programs/develop/ktcc/trunk/libc/include/getopt.h b/programs/develop/ktcc/trunk/libc/include/getopt.h new file mode 100644 index 0000000000..d41eaa0568 --- /dev/null +++ b/programs/develop/ktcc/trunk/libc/include/getopt.h @@ -0,0 +1,9 @@ +#ifndef GETOPT_H +#define GETOPT_H + +extern int optind, opterr; +extern char *optarg; + +int getopt(int argc, char *argv[], char *optstring); + +#endif diff --git a/programs/develop/ktcc/trunk/libc/stdlib/getopt.c b/programs/develop/ktcc/trunk/libc/stdlib/getopt.c new file mode 100644 index 0000000000..6286d05032 --- /dev/null +++ b/programs/develop/ktcc/trunk/libc/stdlib/getopt.c @@ -0,0 +1,63 @@ +#include +#include +#include + +char *optarg = NULL; // global argument pointer +int optind = 0; // global argv index + +int getopt(int argc, char *argv[], char *optstring) { + static char *next = NULL; + char c; + char *cp = NULL; + + if (optind == 0) + next = NULL; + + optarg = NULL; + + if (next == NULL || *next == '\0') { + if (optind == 0) + optind++; + + if (optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0') { + optarg = NULL; + if (optind < argc) + optarg = argv[optind]; + return EOF; + } + + if (strncmp(argv[optind], "--", 2) == 0) { + optind++; + optarg = NULL; + if (optind < argc) + optarg = argv[optind]; + return EOF; + } + + next = argv[optind]; + next++; // skip past - + optind++; + } + + c = *next++; + cp = strchr(optstring, c); + + if (cp == NULL || c == ':') + return '?'; + + cp++; + if (*cp == ':') { + if (*next != '\0') { + optarg = next; + next = NULL; + } + else if (optind < argc) { + optarg = argv[optind]; + optind++; + } + else { + return '?'; + } + } + return c; +} diff --git a/programs/develop/ktcc/trunk/samples/Makefile b/programs/develop/ktcc/trunk/samples/Makefile index 1fea672d73..3dce03ceb1 100755 --- a/programs/develop/ktcc/trunk/samples/Makefile +++ b/programs/develop/ktcc/trunk/samples/Makefile @@ -14,6 +14,7 @@ all: ../bin/kos32-tcc dir_example.c -lck -o dir_example.kex -I ../libc/include ../bin/kos32-tcc net/tcpsrv_demo.c -lck -o net/tcpsrv_demo.kex -I ../libc/include ../bin/kos32-tcc net/nslookup.c -lck -lnetwork -o net/nslookup.kex -I ../libc/include + ../bin/kos32-tcc getopt_ex.c -lck -o getopt_ex -I ../libc/include clean: rm *.kex diff --git a/programs/develop/ktcc/trunk/samples/build_all.sh b/programs/develop/ktcc/trunk/samples/build_all.sh index 3a2ab0cd26..02ac8a07d5 100644 --- a/programs/develop/ktcc/trunk/samples/build_all.sh +++ b/programs/develop/ktcc/trunk/samples/build_all.sh @@ -14,4 +14,5 @@ ../tcc dir_example.c -lck -o /tmp0/1/dir_example ../tcc net/tcpsrv_demo.c -lck -o /tmp0/1/tcpsrv_demo ../tcc net/nslookup.c -lck -lnetwork -o /tmp0/1/nslookup +../tcc getopt_ex.c -lck -o /tmp0/1/getopt_ex exit diff --git a/programs/develop/ktcc/trunk/samples/getopt_ex.c b/programs/develop/ktcc/trunk/samples/getopt_ex.c new file mode 100644 index 0000000000..98b9cc1db8 --- /dev/null +++ b/programs/develop/ktcc/trunk/samples/getopt_ex.c @@ -0,0 +1,38 @@ +#include +#include +#include + +void main(int argc, char *argv[]) { + int c; + if(argc<2) + { + puts("Usage: getopt_ex [options]\n"); + puts("-a Show 'Option a'"); + puts("-B Show 'Option B'"); + puts("-n [num] Show 'num'"); + } + while ((c = getopt(argc, argv, "aBn:")) != EOF) { + switch (c) { + case 'a': + puts("Option 'a'"); + break; + + case 'B': + puts("Option 'B'"); + break; + + case 'n': + printf("Option n: value=%d\n", atoi(optarg)); + break; + + case '?': + printf("ERROR: illegal option %s\n", argv[optind-1]); + exit(0); + + default: + printf("WARNING: no handler for option %c\n", c); + exit(0); + } + } + exit(0); + }