forked from github/server
dice_rand versteht jetzt auch klammern.
This commit is contained in:
parent
9be2d7b33d
commit
8daf1c86f3
|
@ -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);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue