guess.d revision 1.1.1.1 1 #!/usr/sbin/dtrace -wqs
2 /*
3 * guess.d - guessing game in D (DTrace)
4 *
5 * $Id: guess.d,v 1.1.1.1 2015/09/30 22:01:07 christos Exp $
6 *
7 * USAGE: guess.d
8 *
9 * SEE: http://www.brendangregg.com/guessinggame.html
10 *
11 * This is written to demonstrate this language versus the same program
12 * written in other languages.
13 *
14 * 11-May-2005 Brendan Gregg Created this.
15 */
16
17 inline string scorefile = "highscores_d";
18
19 dtrace:::BEGIN
20 {
21 printf("guess.d - Guess a number between 1 and 100\n\n");
22 num = 1;
23 state = 1;
24
25 /* Generate random number */
26 answer = (rand() % 100) + 1;
27 answer = answer > 0 ? answer : - answer;
28 }
29
30 syscall::write:entry
31 /state == 1 && pid == $pid/
32 {
33 state = 2;
34 printf("Enter guess %d: ", num);
35 system("read guess");
36 pos = 0;
37 }
38
39 syscall::read:entry
40 /state == 2 && ppid == $pid && arg0 == 3/
41 {
42 self->inguess = 1;
43 self->buf = arg1;
44 }
45
46 syscall::read:return
47 /self->inguess/
48 {
49 key = copyin(self->buf, arg0);
50 keys[pos] = *(char *)key;
51 self->buf = 0;
52 pos++;
53 }
54
55 syscall::read:return
56 /self->inguess && keys[pos-1] == '\n'/
57 {
58 pos -= 2;
59 fac = 1;
60 guess = fac * (keys[pos] - '0');
61 pos--;
62 fac *= 10;
63 guess = pos >= 0 ? guess + fac * (keys[pos] - '0') : guess;
64 pos--;
65 fac *= 10;
66 guess = pos >= 0 ? guess + fac * (keys[pos] - '0') : guess;
67 self->doneguess = 1;
68 }
69
70 syscall::read:return
71 /self->inguess/
72 {
73 self->inguess = 0;
74 }
75
76 /* Play game */
77 syscall::read:return
78 /self->doneguess && guess == answer/
79 {
80 printf("Correct! That took %d guesses.\n\n", num);
81 self->doneguess = 0;
82 state = 3;
83 printf("Please enter your name: ");
84 system("/usr/bin/read name");
85 }
86
87 syscall::read:return
88 /self->doneguess && guess != answer/
89 {
90 num++;
91
92 printf("%s...\n", guess < answer ? "Higher" : "Lower");
93
94 printf("Enter guess %d: ", num);
95 system("read line");
96 pos = 0;
97 }
98
99 syscall::read:entry
100 /state == 3 && curthread->t_procp->p_parent->p_ppid == $pid && arg0 == 0/
101 {
102 self->inname = 1;
103 self->buf = arg1;
104 }
105
106 /* Save high score */
107 syscall::read:return
108 /self->inname/
109 {
110 self->inname = 0;
111 name = stringof(copyin(self->buf, arg0 - 1));
112 system("echo %s %d >> %s", name, num, scorefile);
113
114 /* Print high scores */
115 printf("\nPrevious high scores,\n");
116 system("cat %s", scorefile);
117 exit(0);
118 }
119