dice_rand versteht jetzt auch klammern.

This commit is contained in:
Enno Rehling 2005-12-11 14:10:11 +00:00
parent 9be2d7b33d
commit 8daf1c86f3
1 changed files with 20 additions and 10 deletions

View File

@ -41,14 +41,10 @@ dice(int count, int value)
return d; return d;
} }
/** Parses a string of the form "2d6+8" static int
* Kann nur simple Strings der Form "xdy[+-]z" parsen! term_eval(const char **sptr)
* Schöner wäre eine flexibele Routine, die z.B. auch Sachen wie 2d6+3d4-1
* parsen kann. */
int
dice_rand(const char *s)
{ {
const char *c = s; const char *c = *sptr;
int m = 0, d = 0, k = 0, term = 1, multi = 1; int m = 0, d = 0, k = 0, term = 1, multi = 1;
int state = 1; int state = 1;
@ -56,7 +52,7 @@ dice_rand(const char *s)
if (isdigit((int)*c)) { if (isdigit((int)*c)) {
k = k*10+(*c-'0'); k = k*10+(*c-'0');
} }
else if (*c=='+' || *c=='-' || *c==0 || *c=='*') { else if (*c=='+' || *c=='-' || *c==0 || *c=='*' || *c==')' || *c=='(') {
if (state==1) /* konstante k addieren */ if (state==1) /* konstante k addieren */
m+=k*multi; m+=k*multi;
else if (state==2) { /* dDk */ else if (state==2) { /* dDk */
@ -72,15 +68,29 @@ dice_rand(const char *s)
k = d = 0; k = d = 0;
state = 1; state = 1;
multi = (*c=='-')?-1:1; multi = (*c=='-')?-1:1;
if (*c=='(') {
++c;
k = term_eval(&c);
}
else if (*c==0 || *c==')') {
break;
}
} else if (*c=='d' || *c=='D') { } else if (*c=='d' || *c=='D') {
if (k==0) k = 1; /* d9 == 1d9 */ if (k==0) k = 1; /* d9 == 1d9 */
assert(state==1 || !"dice_rand: illegal token"); assert(state==1 || !"dice_rand: illegal token");
d = k; d = k;
k = 0; k = 0;
state=2; state=2;
} else assert(!"dice_rand: illegal token"); }
if (*c==0) break;
c++; c++;
} }
*sptr = c;
return m*term; return m*term;
} }
int
dice_rand(const char *s)
{
return term_eval(&s);
}