80 lines
1.4 KiB
C
80 lines
1.4 KiB
C
#include <ctype.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#ifndef DONT_USE_SYSTEM_SYSEXITS
|
|
# include <sysexits.h>
|
|
#else
|
|
# include "../include/sysexits.h"
|
|
#endif /* ifndef DONT_USE_SYSTEM_SYSEXITS */
|
|
|
|
#include <time.h>
|
|
|
|
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;
|
|
}
|