unit Errors;

interface

const
////chybove hodnoty
  ERR_OK          =  0;
  ERR_OUT_OF_MEM  =  1;
  ERR_NUM_CONVERT =  2;
  ERR_FUNC_CONVERT = 3;
  ERR_WRITE_BEHIND_BUFFER = 4;
  ERR_READ_BEHIND_BUFFER  = 5;

 //neplatne znaky v retezci
  ERR_ILL_NUMBER   = 6;
  ERR_ILL_VAR      = 7;
  ERR_ILL_BINOP    = 8;
  ERR_ILL_LBRACKET = 9;
  ERR_ILL_RBRACKET =10;
  ERR_ILL_FUNCTION =11;
  ERR_ILL_MINUS    =12;
  ERR_ILL_LAST_CHAR=13;
  ERR_ILL_CHAR     =14;
  ERR_ILL_DEC_SEPAR=15;

 //chyby pri vypoctu
  ERR_ILL_POWER    =16;
  ERR_ZERO_DIV     =17;

 //ostatni chyby
  ERR_EXPR_NOT_LOADED = 18;
  ERR_BAD_BRACKETS    = 19;
  ERR_UNKNOWN         = 20;

 //chyby pri dosazovani do jednotlivych funkci (nedefinovane hodnoty fci)
  ERR_TAN_FVAL_UNDEF    =21;
  ERR_COT_FVAL_UNDEF    =22;
  ERR_ARCSIN_FVAL_UNDEF =22;
  ERR_ARCCOS_FVAL_UNDEF =23;
  ERR_COTH_FVAL_UNDEF   =24;
  ERR_ARCCOSH_FVAL_UNDEF=25;
  ERR_ARCTANH_FVAL_UNDEF=26;
  ERR_ARCCOTH_FVAL_UNDEF=27;

  ERR_LN_FVAL_UNDEF     =28;
  ERR_FACT_FVAL_UNDEF   =30;

  ERR_OVERFLOW          =40;

  ERR_STACK_TOP         =50;
  ERR_STACK_TOPPOP      =51;

//chyby pri aproximaci pomoci Newtonovy metody
  ERR_N_POINT_SGN_EQ      =100;
  ERR_N_POINT_D1_SGN_NEQ  =101;
  ERR_N_POINT_D2_SGN_NEQ  =102;

  ERR_N_UNKN_FIRST_POINT  =103;
  ERR_N_BIGGER_APROX_COUNT=104;

//chyby v mainu
  ERR_M_BORDERS_NOT_SET     =120;
  ERR_M_EPS_NOT_SET         =121;
  ERR_M_EXPR_NOT_SET        =122;


function  GetLastErrorCode: integer;
procedure  SetLastErrorCode(err: integer);
function  GetErrorName(ErrorCode: integer): string;

implementation

uses
  SysUtils;


var
  LastErrorCode: integer;//glob. prom obsahujici chybovy kod posledne provedene
                         //operace



function GetLastErrorCode:integer;
begin
  GetLastErrorCode:= LastErrorCode;
end;

procedure SetLastErrorCode(err: integer);
begin
  LastErrorCode:= err;
end;


function GetErrorName(ErrorCode: integer): string;
var
  strResult: string;
begin
  case ErrorCode of
    ERR_OK                  : strResult:= 'žádná chyba';
    ERR_OUT_OF_MEM          : strResult:= 'nedostatek paměti pro vytvoření'+
                                            ' dynamické proměnné';
    ERR_NUM_CONVERT         : strResult:= 'konverze čísla';
    ERR_FUNC_CONVERT        : strResult:= 'neznámá funkce';
    ERR_WRITE_BEHIND_BUFFER : strResult:= 'zápis za okrajem bufferu';
    ERR_READ_BEHIND_BUFFER  : strResult:= 'ctení za okrajem bufferu';

 //neplatne znaky v retezci
    ERR_ILL_NUMBER          : strResult:= 'neplatný znak : číslice';
    ERR_ILL_VAR             : strResult:= 'neplatný znak : proměnná';
    ERR_ILL_BINOP           : strResult:= 'neplatný znak : binární operátor';
    ERR_ILL_LBRACKET        : strResult:= 'neplatný znak : levá závorka';
    ERR_ILL_RBRACKET        : strResult:= 'neplatný znak : pravá závorka';
    ERR_ILL_FUNCTION        : strResult:= 'neplatný znak : funkce';
    ERR_ILL_MINUS           : strResult:= 'neplatný znak : mínus';
    ERR_ILL_LAST_CHAR       : strResult:= 'neplatný znak : poslední znak';
    ERR_ILL_CHAR            : strResult:= 'neplatný znak : neznámý znak';
    ERR_ILL_DEC_SEPAR       : strResult:=
                               Format('neplatný znak : desetinný oddělovač, '+
                                 'v tomto nastavení systému je des. ' +
                                 'oddělovač "%1s"', [DecimalSeparator]);

 //chyby pri vypoctu
 //(pri dosazovani do jednotlivych funkci (nedefinovane hodnoty fci))
    ERR_ILL_POWER
      : strResult:= 'výpočet: necelý exponent nad záporným základem';
    ERR_ZERO_DIV            : strResult:= 'výpočet: dělení nulou';
    ERR_TAN_FVAL_UNDEF
      : strResult:= 'výpočet: tan: dosazovaná hodn. není v def. oboru';
    ERR_ARCSIN_FVAL_UNDEF
      : strResult:= 'výpočet: arcsin: dosazovaná hodn. není v def. oboru';
    ERR_ARCCOS_FVAL_UNDEF
      : strResult:= 'výpočet: arccos: dosazovaná hodn. není v def. oboru';

    ERR_COTH_FVAL_UNDEF
      : strResult:= 'výpočet: coth: dosazovaná hodn. není v def. oboru';
    ERR_ARCCOSH_FVAL_UNDEF
      : strResult:= 'výpočet: arccosh: dosazovaná hodn. není v def. oboru';
    ERR_ARCTANH_FVAL_UNDEF
      : strResult:= 'výpočet: arctanh: dosazovaná hodn. není v def. oboru';
    ERR_ARCCOTH_FVAL_UNDEF
      : strResult:= 'výpočet: arccoth: dosazovaná hodn. není v def. oboru';

    ERR_LN_FVAL_UNDEF
      : strResult:= 'výpočet: ln: dosazovaná hodn. není v def. oboru';
    ERR_FACT_FVAL_UNDEF
      : strResult:= 'výpočet: fact: dosazovaná hodn. není v def. oboru';

 //ostatni chyby
    ERR_EXPR_NOT_LOADED     : strResult:= 'není nastaven výraz';
    ERR_BAD_BRACKETS        : strResult:= 'špatné pořadí nebo pozice závorek';
    ERR_UNKNOWN             : strResult:= 'neznámá chyba';

    ERR_OVERFLOW            : strResult:= 'výpočet: přetečení reálného čísla';

    ERR_STACK_TOP           : strResult:= 'čtení z prázdného zásobníku (TOP)';
    ERR_STACK_TOPPOP        : strResult:='čtení z prázdného zásobníku (TOPPOP)';

 //chyby pri aproximaci Newtonovo metodou

    ERR_N_POINT_SGN_EQ
      : strResult:= 'Newtonova metoda: funkční hodnoty nemají v krajních ' +
                       'bodech různá znaménka!';
    ERR_N_POINT_D1_SGN_NEQ
      : strResult:= 'Newtonova metoda: funkční hodnoty první derivace ' +
                       'nemají v krajních bodech stejná znaménka!';
    ERR_N_POINT_D2_SGN_NEQ
      : strResult:= 'Newtonova metoda: funkční hodnoty druhé derivace ' +
                       'nemají v krajních bodech stejná znaménka!';

    ERR_N_UNKN_FIRST_POINT
     : strResult:= 'Newtonova metoda: nepodařilo se určit počáteční aproximaci';
    ERR_N_BIGGER_APROX_COUNT
   : strResult:= 'Newtonova metoda: velikost pole výsledků nestačí pro výpočet';

  //chyby v mainu
    ERR_M_BORDERS_NOT_SET  : strResult:= 'musíte zadat okraje intervalu!';
    ERR_M_EPS_NOT_SET      : strResult:= 'musíte zadat přesnost!';
    ERR_M_EXPR_NOT_SET     : strResult:= 'musíte zadat výraz!';


  end;

  GetErrorName:= strResult;
end;


end.
