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 17inline string scorefile = "highscores_d"; 18 19dtrace:::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 30syscall::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 39syscall::read:entry 40/state == 2 && ppid == $pid && arg0 == 3/ 41{ 42 self->inguess = 1; 43 self->buf = arg1; 44} 45 46syscall::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 55syscall::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 70syscall::read:return 71/self->inguess/ 72{ 73 self->inguess = 0; 74} 75 76/* Play game */ 77syscall::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 87syscall::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 99syscall::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 */ 107syscall::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