juegos

Juegos de terminal de Pancho: Catan (TUI, GUI, web, servidor, PicoCalc), ajedrez, calculadora y minijuegos
git clone https://git.lu3dhn.xyz/juegos.git
Log | Files | Refs

expr.h (4696B)


      1 /* expr.h - la expresion que se edita, como secuencia de tokens con plantillas.
      2  *
      3  * Una plantilla 2D (fraccion, raiz, potencia, log con base, valor absoluto,
      4  * fraccion mixta) se guarda como: TOKEN campo1 SEP campo2 ... END. Cada hueco
      5  * entre tokens es una posicion valida del cursor, asi que las flechas recorren la
      6  * estructura como en la Casio. T_POW no tiene base propia: se aplica a lo que
      7  * tiene a la izquierda. */
      8 #ifndef EXPR_H
      9 #define EXPR_H
     10 #include <stdint.h>
     11 #include <stdbool.h>
     12 
     13 #define EXPR_MAX 240
     14 
     15 enum Tok {
     16     T_SEP = 1, T_END,
     17     /* plantillas. T_FRACL y T_POWL son las que se arman tipeando ("1/2", "2^3"): al
     18      * tipear + - × ÷ ) al final del denominador o del exponente el cursor sale solo.
     19      * Las "de casilla" (□/□, x^□) no: se sale con la flecha, como en la Casio. */
     20     T_FRAC, T_FRACL, T_SQRT, T_ROOT, T_POW, T_POWL, T_LOGB, T_ABS, T_MIXED,
     21     /* analisis: ∫ (desde, hasta, f), d/dx (f, en), Σ y Π (desde, hasta, f); la variable es X */
     22     T_INTEG, T_DERIV, T_SUM, T_PROD,
     23     T_TPL_LAST = T_PROD,
     24     /* 0x20..0x7e: caracteres (digitos, '.', '+', '-', '(', ')', ',', letras sueltas...) */
     25     T_MUL = 0x80, T_DIV, T_NEG_UNUSED, T_PI, T_E, T_ANS, T_RAN, T_E10, T_INV, T_DEGS,
     26     T_NPR, T_NCR, T_EQ_UNUSED, T_PREANS, T_MIN, T_SEC,   /* ′ ″: solo para mostrar °′″ */
     27     T_ANGLE,                      /* ∠ (forma polar) */
     28     T_MAT, T_MATANS = T_MAT + 4,  /* MatA..MatD, MatAns */
     29     T_VCT, T_VCTANS = T_VCT + 4,  /* VctA..VctD, VctAns */
     30     T_VAR = 0xA0,                 /* + VAR_A..VAR_Y */
     31     T_FN = 0xB0                   /* + FN_*: funcion con su "(" (hasta 0xFF) */
     32 };
     33 
     34 enum { VAR_A, VAR_B, VAR_C, VAR_D, VAR_E, VAR_F, VAR_M, VAR_X, VAR_Y, NVARS };
     35 extern const char VAR_NAMES[NVARS + 1];   /* "ABCDEFMXY" */
     36 
     37 enum Fn {
     38     FN_SIN, FN_COS, FN_TAN, FN_ASIN, FN_ACOS, FN_ATAN,
     39     FN_SINH, FN_COSH, FN_TANH, FN_ASINH, FN_ACOSH, FN_ATANH,
     40     FN_LN, FN_LOG, FN_INT, FN_INTG, FN_RND, FN_GCD, FN_LCM, FN_POL, FN_REC,
     41     FN_NOT, FN_NEG, FN_XHAT, FN_YHAT,
     42     FN_NPD, FN_NCD, FN_INVN, FN_BPD, FN_BCD, FN_PPD, FN_PCD,
     43     FN_ARG, FN_CONJ, FN_RE, FN_IM,
     44     FN_DET, FN_TRN, FN_IDEN, FN_DOT, FN_CROSS, FN_VANG, FN_UNITV,
     45     FN_COUNT
     46 };
     47 typedef struct { const char *name; const char *shown; uint8_t args; } FnInfo;
     48 extern const FnInfo FN_INFO[FN_COUNT];
     49 
     50 typedef struct {
     51     uint8_t t[EXPR_MAX];
     52     int n, cur;
     53 } Expr;
     54 
     55 static inline bool tok_is_tpl(int t) { return t >= T_FRAC && t <= T_TPL_LAST; }
     56 static inline bool tok_is_frac(int t) { return t == T_FRAC || t == T_FRACL; }
     57 static inline bool tok_is_pow(int t) { return t == T_POW || t == T_POWL; }
     58 int  tpl_fields(int t);                 /* cantidad de campos de una plantilla */
     59 
     60 void ex_clear(Expr *e);
     61 bool ex_empty(const Expr *e);
     62 /* Mueve el cursor un hueco (con vuelta al otro extremo, como la Casio). */
     63 void ex_left(Expr *e);
     64 void ex_right(Expr *e);
     65 void ex_home(Expr *e);
     66 void ex_end(Expr *e);
     67 
     68 /* Edicion. Devuelven falso si no hay lugar. */
     69 bool ex_insert(Expr *e, int tok);       /* un token comun (letras: convierte pi, ans, nombres+"(") */
     70 bool ex_insert_raw(Expr *e, int tok);   /* tal cual, sin conversiones */
     71 bool ex_template(Expr *e, int tpl);     /* plantilla vacia, el cursor queda en el primer campo */
     72 bool ex_slash(Expr *e);                 /* "/": la fraccion toma lo de la izquierda, o vacia */
     73 bool ex_power(Expr *e);                 /* "^": abre el exponente */
     74 bool ex_power_n(Expr *e, int n);        /* x^n con el exponente ya puesto (x², x³) */
     75 bool ex_root_n(Expr *e, int n);         /* raiz con el indice puesto (∛) */
     76 void ex_backspace(Expr *e);
     77 void ex_tidy(Expr *e);                  /* saca parentesis que sobran en fracciones/potencias tipeadas */
     78 void ex_delete(Expr *e);
     79 bool ex_insert_expr(Expr *e, const Expr *src);   /* pega otra expresion en el cursor */
     80 
     81 /* Busca la plantilla que contiene la posicion pos: devuelve el indice del token
     82  * de plantilla (o -1 si esta en el nivel de afuera) y el numero de campo. */
     83 int  ex_container(const Expr *e, int pos, int *field);
     84 int  ex_match_end(const Expr *e, int tpl_index);       /* indice del END de esa plantilla */
     85 int  ex_match_start(const Expr *e, int end_index);     /* indice del token de plantilla */
     86 int  ex_atom_start(const Expr *e, int pos);            /* inicio del "atomo" a la izquierda, o pos */
     87 
     88 /* Texto ASCII ida y vuelta: \f{1}{3}, \r{2}, \n{3}{8}, ^{2}, \l{2}{8}, \a{x}, \m{1}{1}{2},
     89  * \pi \e \ans \ran \E (x10^) \inv \vA (variable), * (×), : (÷), \P \C, sin( ... */
     90 int  expr_to_text(const Expr *e, char *buf, int n);
     91 bool expr_from_text(Expr *e, const char *s);
     92 bool ex_type_text(Expr *e, const char *s);      /* inserta texto en el cursor */
     93 
     94 #endif