mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-02-02 10:00:38 +01:00
Refactor.
This commit is contained in:
parent
eade8d3d63
commit
eee0e0cb68
@ -35,6 +35,7 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "classes/fb_string.h"
|
||||
#include "classes/MetaName.h"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
@ -44,6 +45,59 @@ extern "C"
|
||||
|
||||
namespace Firebird {
|
||||
|
||||
struct DecFloatConstant
|
||||
{
|
||||
const char* name;
|
||||
USHORT val;
|
||||
|
||||
static const DecFloatConstant* getByText(const MetaName& text, const DecFloatConstant* constants, unsigned offset)
|
||||
{
|
||||
NoCaseString name(text.c_str(), text.length());
|
||||
|
||||
for (const DecFloatConstant* dfConst = constants; dfConst->name; ++dfConst)
|
||||
{
|
||||
if (name == &dfConst->name[offset])
|
||||
return dfConst;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
//#define FB_DECLOAT_CONST(x) { STRINGIZE(x), x }
|
||||
#define FB_DECLOAT_CONST(x) { #x, x }
|
||||
|
||||
const DecFloatConstant FB_DEC_RoundModes[] = {
|
||||
FB_DECLOAT_CONST(DEC_ROUND_CEILING),
|
||||
FB_DECLOAT_CONST(DEC_ROUND_UP),
|
||||
FB_DECLOAT_CONST(DEC_ROUND_HALF_UP),
|
||||
FB_DECLOAT_CONST(DEC_ROUND_HALF_EVEN),
|
||||
FB_DECLOAT_CONST(DEC_ROUND_HALF_DOWN),
|
||||
FB_DECLOAT_CONST(DEC_ROUND_DOWN),
|
||||
FB_DECLOAT_CONST(DEC_ROUND_FLOOR),
|
||||
{ "DEC_ROUND_REROUND", DEC_ROUND_05UP },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
//DEC_ROUND_
|
||||
//0123456789
|
||||
const unsigned FB_DEC_RMODE_OFFSET = 10;
|
||||
|
||||
const DecFloatConstant FB_DEC_IeeeTraps[] = {
|
||||
FB_DECLOAT_CONST(DEC_IEEE_754_Division_by_zero),
|
||||
FB_DECLOAT_CONST(DEC_IEEE_754_Inexact),
|
||||
FB_DECLOAT_CONST(DEC_IEEE_754_Invalid_operation),
|
||||
FB_DECLOAT_CONST(DEC_IEEE_754_Overflow),
|
||||
FB_DECLOAT_CONST(DEC_IEEE_754_Underflow),
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
//DEC_IEEE_754_
|
||||
//0123456789012
|
||||
const unsigned FB_DEC_TRAPS_OFFSET = 13;
|
||||
|
||||
#undef FB_DECLOAT_CONST
|
||||
|
||||
static const USHORT FB_DEC_Errors =
|
||||
DEC_IEEE_754_Division_by_zero |
|
||||
DEC_IEEE_754_Invalid_operation |
|
||||
@ -52,8 +106,9 @@ static const USHORT FB_DEC_Errors =
|
||||
struct DecimalStatus
|
||||
{
|
||||
DecimalStatus(USHORT exc)
|
||||
: decExtFlag(exc), roundingMode(DEC_ROUND_HALF_UP)
|
||||
{ }
|
||||
: decExtFlag(exc),
|
||||
roundingMode(DEC_ROUND_HALF_UP)
|
||||
{}
|
||||
|
||||
static const DecimalStatus DEFAULT;
|
||||
|
||||
@ -62,13 +117,26 @@ struct DecimalStatus
|
||||
|
||||
struct DecimalBinding
|
||||
{
|
||||
enum Bind
|
||||
{
|
||||
DEC_NATIVE,
|
||||
DEC_TEXT,
|
||||
DEC_DOUBLE,
|
||||
DEC_NUMERIC
|
||||
};
|
||||
|
||||
DecimalBinding()
|
||||
: bind(DEC_NATIVE), numScale(0)
|
||||
{ }
|
||||
: bind(DEC_NATIVE),
|
||||
numScale(0)
|
||||
{}
|
||||
|
||||
DecimalBinding(Bind aBind, SCHAR aNumScale = 0)
|
||||
: bind(aBind),
|
||||
numScale(aNumScale)
|
||||
{}
|
||||
|
||||
static const DecimalBinding DEFAULT;
|
||||
|
||||
enum Bind { DEC_NATIVE, DEC_TEXT, DEC_DOUBLE, DEC_NUMERIC };
|
||||
static const SCHAR MAX_SCALE = 18;
|
||||
|
||||
Bind bind;
|
||||
SCHAR numScale;
|
||||
|
@ -8315,73 +8315,11 @@ void SetRoleNode::execute(thread_db* tdbb, dsql_req* request, jrd_tra** /*traHan
|
||||
//--------------------
|
||||
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
struct TextCode
|
||||
{
|
||||
const char* name;
|
||||
USHORT val;
|
||||
};
|
||||
|
||||
//#define FB_TEXTCODE(x) { STRINGIZE(x), x }
|
||||
#define FB_TEXTCODE(x) { #x, x }
|
||||
|
||||
const TextCode roundModes[] = {
|
||||
FB_TEXTCODE(DEC_ROUND_CEILING),
|
||||
FB_TEXTCODE(DEC_ROUND_UP),
|
||||
FB_TEXTCODE(DEC_ROUND_HALF_UP),
|
||||
FB_TEXTCODE(DEC_ROUND_HALF_EVEN),
|
||||
FB_TEXTCODE(DEC_ROUND_HALF_DOWN),
|
||||
FB_TEXTCODE(DEC_ROUND_DOWN),
|
||||
FB_TEXTCODE(DEC_ROUND_FLOOR),
|
||||
{ "DEC_ROUND_REROUND", DEC_ROUND_05UP },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
//DEC_ROUND_
|
||||
//0123456789
|
||||
const unsigned FB_RMODE_OFFSET = 10;
|
||||
|
||||
const TextCode ieeeTraps[] = {
|
||||
FB_TEXTCODE(DEC_IEEE_754_Division_by_zero),
|
||||
FB_TEXTCODE(DEC_IEEE_754_Inexact),
|
||||
FB_TEXTCODE(DEC_IEEE_754_Invalid_operation),
|
||||
FB_TEXTCODE(DEC_IEEE_754_Overflow),
|
||||
FB_TEXTCODE(DEC_IEEE_754_Underflow),
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
//DEC_IEEE_754_
|
||||
//0123456789012
|
||||
const unsigned FB_TRAPS_OFFSET = 13;
|
||||
|
||||
#undef FB_TEXTCODE
|
||||
|
||||
const TextCode* getCodeByText(const MetaName& text, const TextCode* textCode, unsigned offset)
|
||||
{
|
||||
NoCaseString name(text.c_str(), text.length());
|
||||
|
||||
for (const TextCode* tc = textCode; tc->name; ++tc)
|
||||
{
|
||||
if (name == &tc->name[offset])
|
||||
return tc;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
//--------------------
|
||||
|
||||
|
||||
SetDecFloatRoundNode::SetDecFloatRoundNode(MemoryPool& pool, Firebird::MetaName* name)
|
||||
: SessionManagementNode(pool)
|
||||
{
|
||||
fb_assert(name);
|
||||
const TextCode* mode = getCodeByText(*name, roundModes, FB_RMODE_OFFSET);
|
||||
const DecFloatConstant* mode = DecFloatConstant::getByText(*name, FB_DEC_RoundModes, FB_DEC_RMODE_OFFSET);
|
||||
if (!mode)
|
||||
(Arg::Gds(isc_decfloat_round) << *name).raise();
|
||||
rndMode = mode->val;
|
||||
@ -8401,7 +8339,7 @@ void SetDecFloatRoundNode::execute(thread_db* tdbb, dsql_req* /*request*/, jrd_t
|
||||
void SetDecFloatTrapsNode::trap(Firebird::MetaName* name)
|
||||
{
|
||||
fb_assert(name);
|
||||
const TextCode* trap = getCodeByText(*name, ieeeTraps, FB_TRAPS_OFFSET);
|
||||
const DecFloatConstant* trap = DecFloatConstant::getByText(*name, FB_DEC_IeeeTraps, FB_DEC_TRAPS_OFFSET);
|
||||
if (!trap)
|
||||
(Arg::Gds(isc_decfloat_trap) << *name).raise();
|
||||
traps |= trap->val;
|
||||
|
@ -5300,7 +5300,7 @@ decfloat_scale_clause($setDecFloatBindNode)
|
||||
: // nothing
|
||||
| ',' signed_long_integer
|
||||
{
|
||||
if ($2 > 18 || $2 < 0)
|
||||
if ($2 > DecimalBinding::MAX_SCALE || $2 < 0)
|
||||
yyabandon(YYPOSNARG(2), -842, isc_scale_nogt); // Scale must be between 0 and precision
|
||||
$setDecFloatBindNode->bind.numScale = -$2;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user