From f3aa7ca0bc2ef7c286609e8f87d07cc2568093af Mon Sep 17 00:00:00 2001 From: frosty Date: Tue, 6 Jan 2026 23:46:24 -0500 Subject: rebase(d) --- src/Infobox/Calculator.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/Infobox/Calculator.c (limited to 'src/Infobox/Calculator.c') diff --git a/src/Infobox/Calculator.c b/src/Infobox/Calculator.c new file mode 100644 index 0000000..b80ce21 --- /dev/null +++ b/src/Infobox/Calculator.c @@ -0,0 +1,115 @@ +#include "Calculator.h" +#include +#include +#include +#include +#include + +static char logic_log[4096]; + +typedef struct { + 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++; +} + +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; +} + +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), "
%g %c %g = %g
", 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), "
%g %c %g = %g
", 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); +} + +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), + "
" + "%s" + "
" + "%g" + "
" + "
", + strlen(logic_log) > 0 ? logic_log : "
Constant value
", + result); + + info.title = strdup("Calculation"); + info.extract = strdup(html_output); + info.thumbnail_url = + strdup("/static/calculation.svg"); + info.url = strdup("#"); + + return info; +} -- cgit v1.2.3