- Added simple function "getopt" in stdlib (tcc)

git-svn-id: svn://kolibrios.org@8380 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
superturbocat2001 2020-12-12 20:09:30 +00:00
parent fc647254c0
commit 99103794f2
6 changed files with 112 additions and 0 deletions

View 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

View 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;
}

View File

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

View File

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

View 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);
}