forked from KolibriOS/kolibrios
- Added simple function "getopt" in stdlib (tcc)
git-svn-id: svn://kolibrios.org@8380 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
fc647254c0
commit
99103794f2
Binary file not shown.
9
programs/develop/ktcc/trunk/libc/include/getopt.h
Normal file
9
programs/develop/ktcc/trunk/libc/include/getopt.h
Normal file
@ -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
|
63
programs/develop/ktcc/trunk/libc/stdlib/getopt.c
Normal file
63
programs/develop/ktcc/trunk/libc/stdlib/getopt.c
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
@ -14,6 +14,7 @@ all:
|
|||||||
../bin/kos32-tcc dir_example.c -lck -o dir_example.kex -I ../libc/include
|
../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/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 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:
|
clean:
|
||||||
rm *.kex
|
rm *.kex
|
||||||
|
@ -14,4 +14,5 @@
|
|||||||
../tcc dir_example.c -lck -o /tmp0/1/dir_example
|
../tcc dir_example.c -lck -o /tmp0/1/dir_example
|
||||||
../tcc net/tcpsrv_demo.c -lck -o /tmp0/1/tcpsrv_demo
|
../tcc net/tcpsrv_demo.c -lck -o /tmp0/1/tcpsrv_demo
|
||||||
../tcc net/nslookup.c -lck -lnetwork -o /tmp0/1/nslookup
|
../tcc net/nslookup.c -lck -lnetwork -o /tmp0/1/nslookup
|
||||||
|
../tcc getopt_ex.c -lck -o /tmp0/1/getopt_ex
|
||||||
exit
|
exit
|
||||||
|
38
programs/develop/ktcc/trunk/samples/getopt_ex.c
Normal file
38
programs/develop/ktcc/trunk/samples/getopt_ex.c
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user