Advertisement
avp210159

fcalc.h

Feb 1st, 2016
295
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.56 KB | None | 0 0
  1. // avp 2016 (for ru.stackoverflow.com)
  2. #ifndef _FCALC_H
  3. #define _FCALC_H
  4.  
  5. // fcalc.c http://pastebin.com/nnQN8zcX
  6.  
  7. #ifdef __cplusplus
  8. typedef double (*function)(...);
  9. #else
  10. typedef double (*function)();
  11. #endif
  12.  
  13. // лексема, заполняется calc_getlex()
  14. struct calc_lexem {
  15.   double v; // прочитанное число для type == 'N'
  16.   int type, /* тип лексемы (операция): + - * / ( )
  17.                M унарный минус
  18.                P унарный плюс
  19.            N число
  20.            S имя переменной, присваивание
  21.                V имя переменной, число
  22.            F имя переменной, вызов функции
  23.                , разделитель аргументов функции
  24.         */
  25.     pos, // индекс начала лексемы в строке
  26.     len; // количество символов в лексеме (имени переменной, числе)
  27. };
  28.  
  29. // указатели на таблицы переменных и функций пользователя
  30. typedef struct u_item *Symtab;
  31.  
  32. // inout структура для вычисляемого выражения
  33. struct calc {
  34.   double result; // результат
  35.   struct calc_lexem curlex; /* последняя прочитанная лексема
  36.                    может использоваться для печати ошибки */
  37.   Symtab *varlist, /* переменные, которые могут использоваться в выражении
  38.               новые переменные, определяемые оператором присваивания
  39.               данного выражения, создаются в этой таблице */
  40.     *funlist;      /* функции, определяемые пользователем
  41.               sin, asin, cos, acos, tan, atan, fabs, round, cell,
  42.               floor, trunc, sqrt, cbrt, pow, exp, log, log2 и
  43.               log10 уже определены в калькуляторе */
  44.   int  rc;         // код возврата (OK == 0 иначе, код ошибки)
  45. };
  46.  
  47. // коды возврата calc()
  48. #define CALC_OK         0
  49. #define CALC_OUT_OF_MEM 1
  50. #define CALC_NO_OP      2  // нет операции меэду парой операндов
  51. #define CALC_NO_VAL     3  // вместо операнда найдена операция (или `)`)
  52. #define CALC_NO_RP      4  // лишняя '(' (найдена в стеке по EOF)
  53. #define CALC_NO_LP      5  // лишняя  ')' (в стеке нет '(' для ')')
  54. #define CALC_ERR_OP     6  // неизвестная операция в expr() (internal error)
  55. #define CALC_NO_NUMS    7  // для операции не хватает операндов
  56. #define CALC_NUMS_ERR   8  // в стеке остались операнды  (internal error)
  57. #define CALC_OPRS_ERR   9  // в стеке остались операции  (internal error)
  58. #define CALC_ERR_INPUT  10 // прочли неизвестный символ (graph ...)
  59. #define CALC_NO_FRP     11 // нет `)` для функции ('F' найдена в стеке по EOF)
  60. #define CALC_NO_INPUT   12 // в строке нет выражения
  61. #define CALC_ERR_CODE   13 // неверный код возврата для получения текста ошибки
  62. #define CALC_EOD        14 // EOF (NULL вместо str)
  63. #define CALC_ARGS_ERR   15 // слишком много аргументов в вызове функции
  64. #define CALC_ASSG_ERR   16 // присваивание в середине выражения
  65. #define CALC_COMMA_ERR  17 // `,` вне списка аргументов функции
  66. #define CALC_NO_VAR     18 // неизвестная переменная
  67. #define CALC_NO_FUNC    19 // функция не найдена
  68. #define CALC_ERR_PRTY   20 // неправильный приоритет операции (internal error)
  69.  
  70. extern
  71. #ifdef __cplusplus
  72. "C" {
  73. #endif
  74.   // калькулятор, вычисляет арифметическое выражение в str
  75.   int calc (const char *str, double *pres, struct calc *ctx);
  76.   // возвращает текст по коду возврата calc()
  77.   const char *calc_strerr (int code);
  78.   // создает переменную или меняет значение существующей
  79.   double *calc_set_var (Symtab **p, const char *name, int len, double v);
  80.   // доступ к значению существующей переменной
  81.   double *calc_get_var (Symtab **p, const char *name, int len);
  82.   // добавляет функцию или меняет указатель на нее
  83.   function *calc_set_func (Symtab **p, const char *name, function f);
  84.   // доступ к указателю на функцию
  85.   function *calc_get_func (Symtab **p, const char *name, int len);
  86.   // удаляет из таблицы переменную или функцию
  87.   int calc_delsymb (Symtab **p, const char *name);
  88.   // для отладки (или любопытным) печатает таблицу переменных/функций
  89.   // pri_content = 0 -- только статистика, 1 -- печать имен, 2 -- и значений
  90.   int calc_pristat (Symtab *t, int pri_content);
  91.   // удаляет всю таблицу переменных/функций
  92.   void calc_destroy_symtab (Symtab **p);
  93.   // удаляет таблицу предопределенных функций внутри calc()
  94.   void calc_free();
  95.  
  96. #ifdef __cplusplus
  97. }
  98. #endif
  99.  
  100. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement