squall/storm/Big.cpp

153 lines
3.7 KiB
C++
Raw Normal View History

#include "storm/Big.hpp"
#include "storm/big/BigData.hpp"
#include "storm/big/Ops.hpp"
#include "storm/Memory.hpp"
#include <cstring>
void STORMAPI SBigAdd(BigData* a, BigData* b, BigData* c) {
2023-01-29 22:12:59 -06:00
Add(a->Primary(), b->Primary(), c->Primary());
}
void STORMAPI SBigAnd(BigData* a, BigData* b, BigData* c) {
2024-11-15 00:57:52 -08:00
And(a->Primary(), b->Primary(), c->Primary());
}
void STORMAPI SBigBitLen(BigData* num, uint32_t* len) {
2023-02-01 22:54:33 -06:00
auto& buffer = num->Primary();
buffer.Trim();
auto index = buffer.Count() - 1;
auto high = buffer[index];
uint32_t bitIndex;
for (bitIndex = 31; bitIndex > 0; bitIndex--) {
if (((1 << bitIndex) & high)) {
break;
}
}
*len = (index * 32) + bitIndex + 1;
}
int32_t STORMAPI SBigCompare(BigData* a, BigData* b) {
2023-02-01 22:16:58 -06:00
return Compare(a->Primary(), b->Primary());
}
void STORMAPI SBigCopy(BigData* a, BigData* b) {
2024-11-15 01:20:08 -08:00
a->m_primary = b->m_primary;
}
void STORMAPI SBigDec(BigData* a, BigData* b) {
2024-11-15 03:22:16 -08:00
Sub(a->m_primary, b->m_primary, 1);
}
void STORMAPI SBigDel(BigData* num) {
2023-01-29 20:14:01 -06:00
delete num;
}
void STORMAPI SBigDiv(BigData* a, BigData* b, BigData* c) {
2024-11-15 07:52:35 -08:00
uint32_t allocCount = 0;
2024-11-17 02:10:24 -08:00
BigBuffer& buf = a->Stack().Alloc(&allocCount);
2024-11-15 07:52:35 -08:00
Div(a->Primary(), buf, b->Primary(), c->Primary(), a->Stack());
a->Stack().Free(allocCount);
}
void STORMAPI SBigFromBinary(BigData* num, const void* data, uint32_t bytes) {
2023-01-29 20:37:09 -06:00
FromBinary(num->Primary(), data, bytes);
}
void STORMAPI SBigFromStr(BigData* num, const char *str) {
2024-11-15 03:50:22 -08:00
FromStr(num->Primary(), str);
}
void STORMAPI SBigFromUnsigned(BigData* num, uint32_t val) {
FromUnsigned(num->Primary(), val);
}
void STORMAPI SBigInc(BigData* a, BigData* b) {
2024-11-15 04:00:22 -08:00
Add(a->Primary(), b->Primary(), 1);
}
int32_t STORMAPI SBigIsEven(BigData* a) {
2024-11-15 08:27:03 -08:00
return IsEven(a->Primary());
}
int32_t STORMAPI SBigIsOdd(BigData* a) {
2024-11-15 08:31:27 -08:00
return IsOdd(a->Primary());
}
int32_t STORMAPI SBigIsOne(BigData* a) {
2024-11-15 08:35:42 -08:00
return IsOne(a->Primary());
}
int32_t STORMAPI SBigIsZero(BigData* a) {
2024-11-15 08:38:56 -08:00
return IsZero(a->Primary());
}
void STORMAPI SBigMod(BigData* a, BigData* b, BigData* c) {
2023-02-04 14:03:45 -06:00
uint32_t allocCount = 0;
auto& scratch = a->Stack().Alloc(&allocCount);
Div(scratch, a->Primary(), b->Primary(), c->Primary(), a->Stack());
a->Stack().Free(allocCount);
}
void STORMAPI SBigMul(BigData* a, BigData* b, BigData* c) {
Mul(a->Primary(), b->Primary(), c->Primary(), a->Stack());
}
void STORMAPI SBigNew(BigData** num) {
*num = STORM_NEW(BigData);
}
void STORMAPI SBigNot(BigData* a, BigData* b) {
2024-11-15 09:01:26 -08:00
Not(a->Primary(), b->Primary());
}
void STORMAPI SBigOr(BigData* a, BigData* b, BigData* c) {
2024-11-15 09:26:28 -08:00
Or(a->Primary(), b->Primary(), c->Primary());
}
void STORMAPI SBigPowMod(BigData* a, BigData* b, BigData* c, BigData* d) {
2023-02-05 16:36:38 -06:00
PowMod(a->Primary(), b->Primary(), c->Primary(), d->Primary(), a->Stack());
}
void STORMAPI SBigShl(BigData* a, BigData* b, uint32_t shift) {
2023-02-03 16:20:07 -06:00
Shl(a->Primary(), b->Primary(), shift);
}
void STORMAPI SBigShr(BigData* a, BigData* b, uint32_t shift) {
2023-02-03 14:50:34 -06:00
Shr(a->Primary(), b->Primary(), shift);
}
void STORMAPI SBigSquare(BigData* a, BigData* b) {
2023-02-03 08:15:06 -06:00
Square(a->Primary(), b->Primary(), a->Stack());
}
void STORMAPI SBigSub(BigData* a, BigData* b, BigData* c) {
2023-02-01 21:29:16 -06:00
Sub(a->Primary(), b->Primary(), c->Primary());
}
void STORMAPI SBigToBinaryBuffer(BigData* num, uint8_t* data, uint32_t maxBytes, uint32_t* bytes) {
auto& output = num->Output();
ToBinary(output, num->Primary());
uint32_t n = output.Count() < maxBytes ? output.Count() : maxBytes;
memcpy(data, output.Ptr(), n);
if (bytes) {
*bytes = n;
}
}
2024-11-17 03:28:44 -08:00
void STORMAPI SBigToUnsigned(BigData* num, uint32_t* val) {
2024-11-17 04:02:44 -08:00
ToUnsigned(val, num->Primary());
}
void STORMAPI SBigXor(BigData* a, BigData* b, BigData* c) {
2024-11-17 03:28:44 -08:00
Xor(a->Primary(), b->Primary(), c->Primary());
}