|
|
|
@ -5,7 +5,7 @@
@@ -5,7 +5,7 @@
|
|
|
|
|
#include "expression.h" |
|
|
|
|
|
|
|
|
|
union expression* webdice_const(int64_t value){ |
|
|
|
|
union expression* aux = (union expression*) malloc(sizeof(union expression*)); |
|
|
|
|
union expression* aux = (union expression*) malloc(sizeof(union expression)); |
|
|
|
|
|
|
|
|
|
(*aux).constant.id = WEBDICE_CONST; |
|
|
|
|
(*aux).constant.value = value; |
|
|
|
@ -14,7 +14,7 @@ union expression* webdice_const(int64_t value){
@@ -14,7 +14,7 @@ union expression* webdice_const(int64_t value){
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
union expression* webdice_roll(int64_t count, int64_t roll){ |
|
|
|
|
union expression* aux = (union expression*) malloc(sizeof(union expression*)); |
|
|
|
|
union expression* aux = (union expression*) malloc(sizeof(union expression)); |
|
|
|
|
|
|
|
|
|
(*aux).roll.id = WEBDICE_ROLL; |
|
|
|
|
(*aux).roll.count = count; |
|
|
|
@ -24,7 +24,7 @@ union expression* webdice_roll(int64_t count, int64_t roll){
@@ -24,7 +24,7 @@ union expression* webdice_roll(int64_t count, int64_t roll){
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
union expression* webdice_binary(enum binary_type type, union expression* left, union expression* right){ |
|
|
|
|
union expression* aux = (union expression*) malloc(sizeof(union expression*)); |
|
|
|
|
union expression* aux = (union expression*) malloc(sizeof(union expression)); |
|
|
|
|
|
|
|
|
|
(*aux).binary.id = WEBDICE_BINARY; |
|
|
|
|
(*aux).binary.operation = type; |
|
|
|
@ -54,7 +54,7 @@ struct expression_result resolve(union expression* root){
@@ -54,7 +54,7 @@ struct expression_result resolve(union expression* root){
|
|
|
|
|
struct expression_result result,left,right; |
|
|
|
|
|
|
|
|
|
int i, j; |
|
|
|
|
int64_t *values; |
|
|
|
|
int64_t *values = NULL; |
|
|
|
|
int64_t total; |
|
|
|
|
long double size; |
|
|
|
|
int64_t length = 1; |
|
|
|
@ -75,21 +75,30 @@ struct expression_result resolve(union expression* root){
@@ -75,21 +75,30 @@ struct expression_result resolve(union expression* root){
|
|
|
|
|
length += (int64_t) size; |
|
|
|
|
result.min = (*root).roll.count; |
|
|
|
|
result.max = (*root).roll.count * (*root).roll.type; |
|
|
|
|
result.expected = (*root).roll.count * ((*root).roll.type + 1) / 2; |
|
|
|
|
result.expected = (*root).roll.count * ((*root).roll.type + 1.0) / 2.0; |
|
|
|
|
result.text = (char*) malloc(length * sizeof(char)); |
|
|
|
|
fprintf(stderr,"COUNT: %lld\n\n",(*root).roll.count); |
|
|
|
|
values = (int64_t*) malloc((*root).roll.count * sizeof(int64_t)); |
|
|
|
|
fprintf(stderr,"ALLOC'D %X\n\n",values); |
|
|
|
|
for (i = 0, j = (*root).roll.count, total = 0; i < (*root).roll.count; i++, j--){ |
|
|
|
|
values[i] = 1 + (rand() % (*root).roll.type); |
|
|
|
|
total += values[i]; |
|
|
|
|
if (i == 0){ |
|
|
|
|
if (i == 0 && j == 1){ |
|
|
|
|
sprintf(result.text,"<span title=\"%lldd%lld=%lld\">%lld</span>", (*root).roll.count, (*root).roll.type, values[i], total); |
|
|
|
|
}else if (i == 0){ |
|
|
|
|
sprintf(result.text,"<span title=\"%lldd%lld=%lld,", (*root).roll.count, (*root).roll.type, values[i]); |
|
|
|
|
}else if (j == 1){ |
|
|
|
|
sprintf(result.text,"%s%lld\">%lld</span>", result.text, values[i], total); |
|
|
|
|
sprintf(&(result.text[strlen(result.text)]),"%lld\">%lld</span>", values[i], total); |
|
|
|
|
}else{ |
|
|
|
|
sprintf(result.text,"%s%lld,", result.text, values[i]); |
|
|
|
|
sprintf(&(result.text[strlen(result.text)]),"%lld,", values[i]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
fprintf(stderr,"FREE'D %X\n\n",values); |
|
|
|
|
fprintf(stderr,"FREE'D %X\n\n",values); |
|
|
|
|
fprintf(stderr,"FREE'D %X\n\n",values); |
|
|
|
|
fflush(stderr); |
|
|
|
|
free(values); |
|
|
|
|
fprintf(stderr,"FREE'D %X\n\n",values); |
|
|
|
|
result.actual = total; |
|
|
|
|
break; |
|
|
|
|
case WEBDICE_BINARY: |
|
|
|
@ -148,3 +157,17 @@ struct expression_result resolve(union expression* root){
@@ -148,3 +157,17 @@ struct expression_result resolve(union expression* root){
|
|
|
|
|
} |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void free_expression(union expression* root){ |
|
|
|
|
switch((*root).id.id){ |
|
|
|
|
case WEBDICE_BINARY: |
|
|
|
|
free_expression((*root).binary.left); |
|
|
|
|
free_expression((*root).binary.right); |
|
|
|
|
case WEBDICE_CONST: |
|
|
|
|
case WEBDICE_ROLL: |
|
|
|
|
default: |
|
|
|
|
free(root); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|