#include #include #include #ifndef DONT_USE_SYSTEM_SYSEXITS # include #else # include "../include/sysexits.h" #endif /* ifndef DONT_USE_SYSTEM_SYSEXITS */ #include static char *program_name = "roll"; /* change these to watch the world burn */ #define ROLLS_BASE 10 #define SIDES_BASE 10 int main(int argc, char *argv[]){ char *argv0; char *argvc; char *ep; extern int errno; 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(!isdigit(**argv)){ error: fprintf(stderr, "%s: %s: Improperly formatted die (should be" " [rolls]d[sides]).\n", argv0, argvc ); return EX_USAGE; } errno = 0; r = strtol(*argv, &ep, ROLLS_BASE); if(errno != 0){ range: fprintf(stderr, "%s: %s: Number out of working range for this" " program.\n", argv0, argvc ); return EX_SOFTWARE; } if(*(*argv = ep) != 'd' || !isdigit(*(++*argv))) goto error; s = strtol(*argv, &ep, SIDES_BASE); if(errno != 0) goto range; if(*ep != '\0') goto error; while(r --> 0) fprintf(stdout, "%d\n", rand() % s + 1); } return EX_OK; }