8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-02-02 10:00:38 +01:00

Refactor.

This commit is contained in:
Adriano dos Santos Fernandes 2019-04-07 11:50:22 -03:00
parent eade8d3d63
commit eee0e0cb68
3 changed files with 77 additions and 71 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;
}