commit 7d95de1
Emilia Smólska
·
2026-06-20 11:54:08 +0000 UTC
parent 6fff651
foo
M
Makefile
+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