Last active
July 24, 2018 08:21
-
-
Save vurtun/0b2f2c533dacbccfe077d7fff7066903 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#if 0 | |
static void | |
usage(const char *app) | |
{ | |
panic("\n" | |
"usage: %s [options]\n" | |
"\n" | |
" options:\n" | |
"\n" | |
" -v, Vebose information\n" | |
" -p <port> Server port\n" | |
" -i <ip> Server ip-address\n" | |
" -h, print this help messages\n" | |
"\n", | |
app | |
); | |
} | |
int main(int argc, char **args) | |
{ | |
const char *app_name; | |
ARG_BEGIN(app_name, argc, argv){ | |
case 'v': verbose = true; break; | |
case 'i': ip = arg_str(argv, usage(app_name)); break; | |
case 'p': port = arg_ushort(arg(argv), 10); break; | |
case 'h': default: usage(app_name); break; | |
} ARG_END; | |
return 0; | |
} | |
#endif | |
#define ARG_BEGIN(argv0, argc, argv) \ | |
for (argv0 = *argv, argv++, argc--; argv[0] && argv[0][1] && argv[0][0] == '-'; argc--, argv++) {\ | |
char argc_, **argv_; int brk_;\ | |
if (argv[0][1] == '-' && argv[0][2] == '\0')\ | |
{argv++; argc--; break;}\ | |
for (brk_ = 0, argv[0]++, argv_ = argv; argv[0][0] && !brk_; argv[0]++) {\ | |
if (argv_ != argv) break;\ | |
argc_ = argv[0][0];\ | |
switch (argc_) | |
#define ARG_END }} | |
#define ARGC() argc_ | |
#define arg(argv) (brk_ = 1, argv[0]) | |
#define arg_str(argv, x) ((argv[0][1] == '\0' && argv[1] == 0)?\ | |
((x), (char *)0) : (brk_ = 1, (argv[0][1] != '\0') ?\ | |
(&argv[0][1]) : (argc--, argv++, argv[0]))) | |
#include <string.h> | |
#include <limits.h> | |
static inline void | |
panic(const char *fmt, ...) | |
{ | |
va_list args; | |
fflush(stdout); | |
va_start(args, fmt); | |
vfprintf(stderr, fmt, args); | |
va_end(args); | |
exit(EXIT_FAILURE); | |
} | |
static inline long | |
arg_slong(const char *s, int base) | |
{ | |
char *ep = 0; | |
long n = strtol(s, &ep, base); | |
if (*ep != '\0' || ep == s) | |
panic("Invalid number: %s\n", s); | |
return n; | |
} | |
static inline int | |
arg_sint(const char *s, int base) | |
{ | |
long n = arg_slong(s, base); | |
if (n < INT_MIN || n > INT_MAX) | |
panic("Number: %d is out of range\n", n); | |
return(int)n; | |
} | |
static inline unsigned | |
arg_uint(const char *s, int base) | |
{ | |
long n = arg_slong(s, base); | |
if (n < 0 || n > UINT_MAX) | |
panic("Number: %d is out of range\n", n); | |
return (unsigned)n; | |
} | |
static inline unsigned short | |
arg_ushort(const char *s, int base) | |
{ | |
char *ep = 0; | |
long n = arg_slong(s, base); | |
if (n < 0 || n > USHRT_MAX) | |
panic("Number: %d is out of range\n", n); | |
return (unsigned short)n; | |
} | |
static inline double | |
arg_real(const char *s) | |
{ | |
char *end; | |
double d = strtod(s, &end); | |
if (end == s || *end != '\0') | |
panic("Invalid number: %s\n", s); | |
return d; | |
} | |
static inline int | |
arg_enum(const char *s, const char **opt, int n) | |
{ | |
for (int i = 0; i < n; i++) | |
if (strcmp(opt[i], s) == 0) | |
return i; | |
panic("Invalid enum: %s\n", s); | |
return -1; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment