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