Skip to content

Instantly share code, notes, and snippets.

@vurtun
Last active July 24, 2018 08:21
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vurtun/0b2f2c533dacbccfe077d7fff7066903 to your computer and use it in GitHub Desktop.
Save vurtun/0b2f2c533dacbccfe077d7fff7066903 to your computer and use it in GitHub Desktop.
#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