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 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
|
||||
|
@ -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
|
||||
|
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