new arg.h version by frign
This commit is contained in:
		
							
								
								
									
										3
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								LICENSE
									
									
									
									
									
								
							@@ -1,6 +1,7 @@
 | 
				
			|||||||
ISC License
 | 
					ISC License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright (C) 2016-2017 Aaron Marcher
 | 
					Copyright (C) 2016-2017 Aaron Marcher <me@drkhsh.at>
 | 
				
			||||||
 | 
					Copyright (C) 2017 Laslo Hunhold <dev@frign.de>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Permission to use, copy, modify, and/or distribute this software for any purpose
 | 
					Permission to use, copy, modify, and/or distribute this software for any purpose
 | 
				
			||||||
with or without fee is hereby granted, provided that the above copyright notice
 | 
					with or without fee is hereby granted, provided that the above copyright notice
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										69
									
								
								arg.h
									
									
									
									
									
								
							
							
						
						
									
										69
									
								
								arg.h
									
									
									
									
									
								
							@@ -1,55 +1,34 @@
 | 
				
			|||||||
/*
 | 
					/* See LICENSE file for copyright and license details. */
 | 
				
			||||||
 * Copy me if you can.
 | 
					 | 
				
			||||||
 * by 20h
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef __ARG_H__
 | 
					#ifndef ARG_H
 | 
				
			||||||
#define __ARG_H__
 | 
					#define ARG_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern char *argv0;
 | 
					extern char *argv0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define USED(x)		((void)(x))
 | 
					/* int main(int argc, char *argv[]) */
 | 
				
			||||||
 | 
					#define ARGBEGIN for (argv0 = *argv, *argv ? (argc--, argv++) : ((void *)0);      \
 | 
				
			||||||
/* use main(int argc, char *argv[]) */
 | 
					                      *argv && (*argv)[0] == '-' && (*argv)[1]; argc--, argv++) { \
 | 
				
			||||||
#define ARGBEGIN	for (argv0 = *argv, argv++, argc--;\
 | 
					                 	int i_, argused_;                                         \
 | 
				
			||||||
					argv[0] && argv[0][1]\
 | 
					                 	if ((*argv)[1] == '-' && !(*argv)[2]) {                   \
 | 
				
			||||||
					&& argv[0][0] == '-';\
 | 
					                 		argc--, argv++;                                   \
 | 
				
			||||||
					argc--, argv++) {\
 | 
					 | 
				
			||||||
				char _argc;\
 | 
					 | 
				
			||||||
				char **_argv;\
 | 
					 | 
				
			||||||
				int brk;\
 | 
					 | 
				
			||||||
				if (argv[0][1] == '-' && argv[0][2] == '\0') {\
 | 
					 | 
				
			||||||
					argv++;\
 | 
					 | 
				
			||||||
					argc--;\
 | 
					 | 
				
			||||||
                 		break;                                            \
 | 
					                 		break;                                            \
 | 
				
			||||||
                 	}                                                         \
 | 
					                 	}                                                         \
 | 
				
			||||||
				for (brk = 0, argv[0]++, _argv = argv;\
 | 
					                 	for (i_ = 1, argused_ = 0; (*argv)[i_]; i_++) {           \
 | 
				
			||||||
						argv[0][0] && !brk;\
 | 
					                 		switch((*argv)[i_])
 | 
				
			||||||
						argv[0]++) {\
 | 
					#define ARGEND   		if (argused_) {                                   \
 | 
				
			||||||
					if (_argv != argv)\
 | 
					                 			if ((*argv)[i_ + 1]) {                    \
 | 
				
			||||||
 | 
					                 				break;                            \
 | 
				
			||||||
 | 
					                 			} else {                                  \
 | 
				
			||||||
 | 
					                 				argc--, argv++;                   \
 | 
				
			||||||
                 				break;                            \
 | 
					                 				break;                            \
 | 
				
			||||||
					_argc = argv[0][0];\
 | 
					 | 
				
			||||||
					switch (_argc)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define ARGEND			}\
 | 
					 | 
				
			||||||
				USED(_argc);\
 | 
					 | 
				
			||||||
                 			}                                         \
 | 
					                 			}                                         \
 | 
				
			||||||
			USED(argv);\
 | 
					                 		}                                                 \
 | 
				
			||||||
			USED(argc);
 | 
					                 	}                                                         \
 | 
				
			||||||
 | 
					                 }
 | 
				
			||||||
#define ARGC()		_argc
 | 
					#define ARGC()   ((*argv)[i_])
 | 
				
			||||||
 | 
					#define ARGF_(x) (((*argv)[i_ + 1]) ? (argused_ = 1, &((*argv)[i_ + 1])) :        \
 | 
				
			||||||
#define EARGF(x)	((argv[0][1] == '\0' && argv[1] == NULL)?\
 | 
					                  (*(argv + 1))     ? (argused_ = 1, *(argv + 1))        : (x))
 | 
				
			||||||
				((x), abort(), (char *)0) :\
 | 
					#define EARGF(x) ARGF_(((x), exit(1), (char *)0))
 | 
				
			||||||
				(brk = 1, (argv[0][1] != '\0')?\
 | 
					#define ARGF()   ARGF_((char *)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])))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user