commit 7d95de1

Emilia Smólska  ·  2026-06-20 11:54:08 +0000 UTC
parent 6fff651
foo
4 files changed,  +41, -34
R dice.6
M dice.c
M mac.h
+2, -2
 1@@ -11,10 +11,10 @@ WCFLAGS=-Wall -Wextra -Wpedantic
 2 PREFIX=/usr/local
 3 BINDIR=${DESTDIR}${PREFIX}/bin
 4 MANDIR=${DESTDIR}${PREFIX}/man
 5-MAN1=${MANDIR}/man1
 6+MAN1=${MANDIR}/man6
 7 
 8 PROG=dice
 9-MAN=dice.1
10+MAN=dice.6
11 OBJS=dice.o
12 
13 all: ${PROG}
R dice.1 => dice.6
+16, -11
 1@@ -1,25 +1,31 @@
 2 .Dd $Mdocdate$
 3-.Dt DICE 1
 4+.Dt DICE 6
 5 .Os
 6 .Sh NAME
 7 .Nm dice
 8 .Nd dice roller and coin flipper
 9 .Sh SYNOPSIS
10 .Nm
11-.Op Fl csq
12-.Op Ar expr
13+.Fl C
14+.Op Fl q
15+.Nm
16+.Fl S
17+.Op Fl q
18+.Nm
19+.Op Fl q
20+.Ar expr
21 .Sh DESCRIPTION
22 The
23 .Nm
24 utility displays pseudorandom results of specified dice roll or coinflip
25 expressions. It accepts the following flags:
26 .Bl -tag -width Ds
27-.It Fl c
28+.It Fl C
29 Flip a coin, displaying
30 .Dq heads
31 or
32 .Dq tails .
33-.It Fl s
34+.It Fl S
35 Parse a line read from standard input instead of
36 .Ar expr .
37 .It Fl q
38@@ -27,13 +33,12 @@ Don't display
39 .Ar expr
40 followed by an equals sign before the result.
41 .El
42-If neither
43+.Pp
44+If
45 .Fl c
46-or
47-.Fl s
48-are specified,
49-.Ar expr
50-is a required argument.
51+is not specified, an expression in the form
52+.Em x Ns d Ns Em y
53+is parsed and randomly evaluated.
54 .Sh EXIT STATUS
55 .Ex -std
56 .Sh SEE ALSO
M dice.c
+22, -20
  1@@ -19,15 +19,15 @@ TYPE STRUCT DICE
  2 	CONST STRUCT DICE	*next;
  3 } DICE;
  4 
  5-STATIC STRING	argv0;
  6-STATIC BOOL	cflag,sflag,qflag;
  7+STATIC CONST STRING	argv0;
  8+STATIC BOOL	Cflag,Sflag,qflag;
  9 
 10 NORETURN STATIC VOID	usage();
 11-NORETURN STATIC VOID	error(STRING, ...);
 12+NORETURN STATIC VOID	error(CONST STRING, ...);
 13 STATIC VOID	initrand();
 14-STATIC VOID	initargv0(STRING);
 15-STATIC CONST DICE	*parsedice(STRING);
 16-STATIC STRING	getlin();
 17+STATIC VOID	fixargv0(CONST STRING);
 18+STATIC CONST DICE	*parsedice(CONST STRING);
 19+STATIC CONST STRING	getlin();
 20 STATIC INT	rolldice(CONST DICE *);
 21 STATIC VOID	coinflip();
 22 STATIC VOID	*xmalloc(SIZE);
 23@@ -35,18 +35,18 @@ STATIC VOID	*xmalloc(SIZE);
 24 INT
 25 main(INT argc, CHAR **argv)
 26 {
 27-	initargv0(argv[0]); initrand();
 28-	INT ch; WHILE (ch=getopt(argc,argv,"csq"))!=-1
 29+	fixargv0(argv[0]); initrand();
 30+	INT ch; WHILE (ch=getopt(argc,argv,"CSq"))!=-1
 31 	DO	SWITCH ch IN
 32-		CASE 'c':	cflag=TRUE; BREAK;
 33-		CASE 's':	sflag=TRUE; BREAK;
 34+		CASE 'C':	Cflag=TRUE; BREAK;
 35+		CASE 'S':	Sflag=TRUE; BREAK;
 36 		CASE 'q':	qflag=TRUE; BREAK;
 37 		OUT:	usage();
 38 		ENDSW;
 39 	OD; argc-=optind; argv+=optind;
 40-	IF cflag THEN coinflip(); RETURN 0 FI;
 41-	STRING e;
 42-	IF sflag THEN e=getlin() ELIF argc<1 THEN usage() ELSE e=argv[0] FI;
 43+	IF Cflag THEN coinflip(); RETURN 0 FI;
 44+	CONST STRING e;
 45+	IF Sflag THEN e=getlin() ELIF argc<1 THEN usage() ELSE e=argv[0] FI;
 46 	AUTO d=parsedice(e);
 47 	IF NOT qflag THEN printf("%s=",e) FI; printf("%d\n",rolldice(d));
 48 	RETURN 0;
 49@@ -61,12 +61,14 @@ initrand()
 50 NORETURN STATIC VOID
 51 usage()
 52 {
 53-	fprintf(STDERR,"usage: %s [-csq] [expr]\n",argv0);
 54+	fprintf(STDERR,
 55+		"usage:\t%1$s -C [-q]\n\t%1$s -S [-q]\n\t%1$s [-q] expr\n",
 56+		argv0);
 57 	exit(1);
 58 }
 59 
 60 NORETURN STATIC VOID
 61-error(STRING fmt, ...)
 62+error(CONST STRING fmt, ...)
 63 {
 64 	fprintf(STDERR,"%s: ",argv0);
 65 	VALIST	ap;
 66@@ -78,13 +80,13 @@ error(STRING fmt, ...)
 67 }
 68 
 69 STATIC VOID
 70-initargv0(STRING s)
 71+fixargv0(CONST STRING s)
 72 {
 73 	argv0=strrchr(s,'/'); IF NOT argv0 THEN argv0=s ELSE argv0++ FI;
 74 }
 75 
 76 STATIC CONST DICE *
 77-parsedice(STRING e)
 78+parsedice(CONST STRING e)
 79 {
 80 	CHAR *end;
 81 	DICE *p=xmalloc(SIZEOF(DICE));
 82@@ -102,10 +104,10 @@ parsedice(STRING e)
 83 	p->next=parsedice(e); RETURN p;
 84 }
 85 
 86-STATIC STRING
 87+STATIC CONST STRING
 88 getlin()
 89 {
 90-	CHAR *buf=xmalloc(80);
 91+	STRING buf=xmalloc(80);
 92 	IF NOT fgets(buf,80,STDIN) THEN buf[0]=0 FI;
 93 	buf[strcspn(buf,"\n")]=0;
 94 	RETURN buf;
 95@@ -114,7 +116,7 @@ getlin()
 96 STATIC INT
 97 rolldice(CONST DICE *dice)
 98 {
 99-	INT	res=0;
100+	INT res=0;
101 	FOR AUTO d=dice; d; d=d->next
102 	DO	FOR INT i=0; i<d->ndic; i++ DO res+=random()%d->nsid+1 OD;
103 	OD;
M mac.h
+1, -1
1@@ -36,7 +36,7 @@ typedef void	VOID;
2 typedef char	CHAR;
3 typedef bool	BOOL;
4 typedef size_t	SIZE;
5-typedef const char	*STRING;
6+#define STRING	char *
7 typedef va_list	VALIST;
8 
9 #define TRUE	true