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