0ce86bba15
Roughly 700 LOC (half of the old quark on the Hiltjo branch) in size, this rewrite supports partial content and other good stuff that will make it fun again to use quark for simple static purposes. The error checking is rigorous and strict and it will report proper error codes back to the client whenever there was a problem or the request was invalid in some way. A cool feature is the support for listening on a UNIX-domain socket, which will in the long run allow us to solve problems with virtual hosts and other things in separate programs. But until then, this should be robust enough for most use-cases. This resets quark's version to 0, but this was no problem as there haven't been any quark releases yet. Feedback is appreciated.
65 lines
1.3 KiB
C
65 lines
1.3 KiB
C
/*
|
|
* Copy me if you can.
|
|
* by 20h
|
|
*/
|
|
|
|
#ifndef ARG_H__
|
|
#define ARG_H__
|
|
|
|
extern char *argv0;
|
|
|
|
/* use main(int argc, char *argv[]) */
|
|
#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\
|
|
argv[0] && argv[0][0] == '-'\
|
|
&& argv[0][1];\
|
|
argc--, argv++) {\
|
|
char argc_;\
|
|
char **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_)
|
|
|
|
/* Handles obsolete -NUM syntax */
|
|
#define ARGNUM case '0':\
|
|
case '1':\
|
|
case '2':\
|
|
case '3':\
|
|
case '4':\
|
|
case '5':\
|
|
case '6':\
|
|
case '7':\
|
|
case '8':\
|
|
case '9'
|
|
|
|
#define ARGEND }\
|
|
}
|
|
|
|
#define ARGC() argc_
|
|
|
|
#define ARGNUMF() (brk_ = 1, estrtonum(argv[0], 0, INT_MAX))
|
|
|
|
#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\
|
|
((x), abort(), (char *)0) :\
|
|
(brk_ = 1, (argv[0][1] != '\0')?\
|
|
(&argv[0][1]) :\
|
|
(argc--, argv++, argv[0])))
|
|
|
|
#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\
|
|
(char *)0 :\
|
|
(brk_ = 1, (argv[0][1] != '\0')?\
|
|
(&argv[0][1]) :\
|
|
(argc--, argv++, argv[0])))
|
|
|
|
#define LNGARG() &argv[0][0]
|
|
|
|
#endif
|