]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - cddl/contrib/dtracetoolkit/Misc/guess.d
Copy head (r256279) to stable/10 as part of the 10.0-RELEASE cycle.
[FreeBSD/stable/10.git] / cddl / contrib / dtracetoolkit / Misc / guess.d
1 #!/usr/sbin/dtrace -wqs
2 /*
3  * guess.d - guessing game in D (DTrace)
4  *
5  * $Id: guess.d 32 2007-09-15 05:08:49Z brendan $
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 }