#include /* isdigit(3) */ #include /* errno */ #include /* fprintf(3), stderr, NULL */ #include /* srand(3), strtol(3) */ #include /* time(3) */ #if !defined EX_SOFTWARE || !defined EX_USAGE # include #endif static char *program_name = "roll"; int main(int argc, char *argv[]){ char *argv0; char *argvc; char *ep; int r; /* rolls */ int s; /* sides */ argv0 = argv[0]; if(argc < 2){ fprintf(stderr, "Usage: %s [dice...]\n" "\tDice should be formatted [rolls]d[sides]," " e.g. 1d3, 5d6...\n", argv0 == NULL ? program_name : argv0 ); return EX_USAGE; } srand(time(NULL)); while(--argc > 0){ argvc = *++argv; /* Parse out [rolls]d[sides] */ if(**argv >= 0x80 || !isdigit(**argv)) goto error; errno = 0; r = strtol(*argv, &ep, 10); if(errno != 0) goto range; if(*(*argv = ep) != 'd' || **argv >= 0x80 || !isdigit(*(++*argv))) goto error; s = strtol(*argv, &ep, 10); if(errno != 0) goto range; if(*ep != '\0') goto error; while(r --> 0) fprintf(stdout, "%d\n", rand() % s + 1); } return EX_OK; error: fprintf(stderr, "%s: %s: Improperly formatted die" " (should be [rolls]d[sides]).\n", argv0, argvc ); return EX_USAGE; range: fprintf(stderr, "%s: %s: Number out of working range for this program.\n", argv0, argvc ); return EX_SOFTWARE; }