diff options
| author | frosty <gabriel@bwaaa.monster> | 2026-03-05 04:50:32 +0000 |
|---|---|---|
| committer | frosty <gabriel@bwaaa.monster> | 2026-03-05 04:50:32 +0000 |
| commit | 24cec7a35072ac50e1fe902a925e69330866dbca (patch) | |
| tree | f60bb7c38b0b952e074f9b8f8d1cef758d7f8ec8 /src/Infobox/Calculator.c | |
| parent | 5ed5a6ecc749e8b557ea62f04a444e203f4e48f6 (diff) | |
| download | omnisearch-24cec7a35072ac50e1fe902a925e69330866dbca.tar.gz | |
Diffstat (limited to 'src/Infobox/Calculator.c')
| -rw-r--r-- | src/Infobox/Calculator.c | 168 |
1 files changed, 84 insertions, 84 deletions
diff --git a/src/Infobox/Calculator.c b/src/Infobox/Calculator.c index b80ce21..22563f7 100644 --- a/src/Infobox/Calculator.c +++ b/src/Infobox/Calculator.c @@ -8,108 +8,108 @@ static char logic_log[4096]; typedef struct { - const char *buffer; - int pos; + const char *buffer; + int pos; } Parser; static double parse_expression(Parser *p); static void skip_ws(Parser *p) { - while (p->buffer[p->pos] == ' ') p->pos++; + while (p->buffer[p->pos] == ' ') p->pos++; } static double parse_factor(Parser *p) { - skip_ws(p); - if (p->buffer[p->pos] == '-') { - p->pos++; - return -parse_factor(p); - } - if (p->buffer[p->pos] == '(') { - p->pos++; - double res = parse_expression(p); - if (p->buffer[p->pos] == ')') p->pos++; - return res; - } - char *endptr; - double val = strtod(&p->buffer[p->pos], &endptr); - p->pos = (int)(endptr - p->buffer); - return val; + skip_ws(p); + if (p->buffer[p->pos] == '-') { + p->pos++; + return -parse_factor(p); + } + if (p->buffer[p->pos] == '(') { + p->pos++; + double res = parse_expression(p); + if (p->buffer[p->pos] == ')') p->pos++; + return res; + } + char *endptr; + double val = strtod(&p->buffer[p->pos], &endptr); + p->pos = (int)(endptr - p->buffer); + return val; } static double parse_term(Parser *p) { - double left = parse_factor(p); - while (1) { - skip_ws(p); - char op = p->buffer[p->pos]; - if (op == '*' || op == '/') { - p->pos++; - double right = parse_factor(p); - double old = left; - left = (op == '*') ? left * right : left / right; - - char step[256]; - - snprintf(step, sizeof(step), "<div>%g %c %g = <b>%g</b></div>", old, op, - right, left); - strncat(logic_log, step, sizeof(logic_log) - strlen(logic_log) - 1); - } else - break; - } - return left; + double left = parse_factor(p); + while (1) { + skip_ws(p); + char op = p->buffer[p->pos]; + if (op == '*' || op == '/') { + p->pos++; + double right = parse_factor(p); + double old = left; + left = (op == '*') ? left * right : left / right; + + char step[256]; + + snprintf(step, sizeof(step), "<div>%g %c %g = <b>%g</b></div>", old, op, + right, left); + strncat(logic_log, step, sizeof(logic_log) - strlen(logic_log) - 1); + } else + break; + } + return left; } static double parse_expression(Parser *p) { - double left = parse_term(p); - while (1) { - skip_ws(p); - char op = p->buffer[p->pos]; - if (op == '+' || op == '-') { - p->pos++; - double right = parse_term(p); - double old = left; - left = (op == '+') ? left + right : left - right; - - char step[256]; - - snprintf(step, sizeof(step), "<div>%g %c %g = <b>%g</b></div>", old, op, - right, left); - strncat(logic_log, step, sizeof(logic_log) - strlen(logic_log) - 1); - } else - break; - } - return left; + double left = parse_term(p); + while (1) { + skip_ws(p); + char op = p->buffer[p->pos]; + if (op == '+' || op == '-') { + p->pos++; + double right = parse_term(p); + double old = left; + left = (op == '+') ? left + right : left - right; + + char step[256]; + + snprintf(step, sizeof(step), "<div>%g %c %g = <b>%g</b></div>", old, op, + right, left); + strncat(logic_log, step, sizeof(logic_log) - strlen(logic_log) - 1); + } else + break; + } + return left; } double evaluate(const char *expr) { - logic_log[0] = '\0'; - if (!expr || strlen(expr) == 0) return 0.0; - Parser p = {expr, 0}; - return parse_expression(&p); + logic_log[0] = '\0'; + if (!expr || strlen(expr) == 0) return 0.0; + Parser p = {expr, 0}; + return parse_expression(&p); } InfoBox fetch_calc_data(char *math_input) { - InfoBox info = {NULL, NULL, NULL, NULL}; - if (!math_input) return info; - - double result = evaluate(math_input); - - char html_output[5120]; - snprintf(html_output, sizeof(html_output), - "<div class='calc-container' style='line-height: 1.6;'>" - "%s" - "<div style='margin-top: 8px; border-top: 1px solid #eee; " - "padding-top: 8px; font-size: 1.2em;'>" - "<b>%g</b>" - "</div>" - "</div>", - strlen(logic_log) > 0 ? logic_log : "<div>Constant value</div>", - result); - - info.title = strdup("Calculation"); - info.extract = strdup(html_output); - info.thumbnail_url = - strdup("/static/calculation.svg"); - info.url = strdup("#"); - - return info; + InfoBox info = {NULL, NULL, NULL, NULL}; + if (!math_input) return info; + + double result = evaluate(math_input); + + char html_output[5120]; + snprintf(html_output, sizeof(html_output), + "<div class='calc-container' style='line-height: 1.6;'>" + "%s" + "<div style='margin-top: 8px; border-top: 1px solid #eee; " + "padding-top: 8px; font-size: 1.2em;'>" + "<b>%g</b>" + "</div>" + "</div>", + strlen(logic_log) > 0 ? logic_log : "<div>Constant value</div>", + result); + + info.title = strdup("Calculation"); + info.extract = strdup(html_output); + info.thumbnail_url = + strdup("/static/calculation.svg"); + info.url = strdup("#"); + + return info; } |
