#include /* fprintf(3), stderr, NULL */ #include /* memset(3) */ #ifndef EX_USAGE # include #endif #include /* getopt(3) */ static char *program_name = "scrut"; #include "libfileis.h" struct { char c; int (*f)(char *p); } argsdict[] = { { 'b', f_blockspecial }, { 'c', f_charspecial }, { 'd', f_directory }, { 'e', f_exists }, { 'f', f_regular }, { 'g', f_gid }, { 'p', f_fifospecial }, { 'r', f_readable }, { 'x', f_executable }, { 'k', f_sticky }, { 'u', f_uid }, { 'w', f_writeable }, { 'L', f_symlink }, { 'S', f_socket }, { '\0', NULL } }; int main(int argc, char *argv[]){ char args[(sizeof argsdict) / (sizeof *argsdict) + 1]; int c; int (*f[(sizeof argsdict) / (sizeof *argsdict)])(char *p); size_t fi; size_t i; if(argc < 2) goto usage; for(i = 0; i < (sizeof argsdict) / (sizeof *argsdict); ++i) args[i] = argsdict[i].c; args[(sizeof argsdict) / (sizeof *argsdict)] = '\0'; fi = 0; while((c = getopt(argc, argv, args)) != -1) for(i = 0; i < (sizeof argsdict) / (sizeof *argsdict); ++i) if(argsdict[i].c == '\0') goto usage; else if(argsdict[i].c == c){ f[fi++] = argsdict[i].f; break; } if(optind == argc){ usage: fprintf(stderr, "Usage: %s (-bcdefghkprsuwxLS) [file...]\n", argv[0] == NULL ? program_name : argv[0]); return EX_USAGE; } argv += optind; do for(i = 0; i < fi; ++i) if(!f[i](*argv)) return 1; while(*++argv != NULL); return 0; }