Files
Michael Fabian 'Xaymar' Dirks 09be5488e1 runtime/lib: C++ify
2019-01-18 21:26:57 +01:00

213 lines
3.5 KiB
C++

#include "bbsys.hpp"
#include <time.h>
#define CHKPOS(x) \
if ((x) < 0) \
ThrowRuntimeException("parameter must be positive");
#define CHKOFF(x) \
if ((x) <= 0) \
ThrowRuntimeException("parameter must be greater than 0");
BBStr* bbString(BBStr* s, int n)
{
BBStr* t = new BBStr();
while (n-- > 0)
*t += *s;
delete s;
return t;
}
BBStr* bbLeft(BBStr* s, int n)
{
CHKPOS(n);
*s = s->substr(0, n);
return s;
}
BBStr* bbRight(BBStr* s, int n)
{
CHKPOS(n);
n = s->size() - n;
if (n < 0)
n = 0;
*s = s->substr(n);
return s;
}
BBStr* bbReplace(BBStr* s, BBStr* from, BBStr* to)
{
int n = 0, from_sz = from->size(), to_sz = to->size();
while (n < s->size() && (n = s->find(*from, n)) != std::string::npos) {
s->replace(n, from_sz, *to);
n += to_sz;
}
delete from;
delete to;
return s;
}
int bbInstr(BBStr* s, BBStr* t, int from)
{
CHKOFF(from);
--from;
int n = s->find(*t, from);
delete s;
delete t;
return n == std::string::npos ? 0 : n + 1;
}
BBStr* bbMid(BBStr* s, int o, int n)
{
CHKOFF(o);
--o;
if (o > s->size())
o = s->size();
if (n >= 0)
*s = s->substr(o, n);
else
*s = s->substr(o);
return s;
}
BBStr* bbUpper(BBStr* s)
{
for (int k = 0; k < s->size(); ++k)
(*s)[k] = toupper((*s)[k]);
return s;
}
BBStr* bbLower(BBStr* s)
{
for (int k = 0; k < s->size(); ++k)
(*s)[k] = tolower((*s)[k]);
return s;
}
BBStr* bbTrim(BBStr* s)
{
int n = 0, p = s->size();
while (n < s->size() && !isgraph((*s)[n]))
++n;
while (p > n && !isgraph((*s)[p - 1]))
--p;
*s = s->substr(n, p - n);
return s;
}
BBStr* bbLSet(BBStr* s, int n)
{
CHKPOS(n);
if (s->size() > n)
*s = s->substr(0, n);
else {
while (s->size() < n)
*s += ' ';
}
return s;
}
BBStr* bbRSet(BBStr* s, int n)
{
CHKPOS(n);
if (s->size() > n)
*s = s->substr(s->size() - n);
else {
while (s->size() < n)
*s = ' ' + *s;
}
return s;
}
BBStr* bbChr(int n)
{
BBStr* t = new BBStr();
*t += (char)n;
return t;
}
BBStr* bbHex(int n)
{
char buff[12];
for (int k = 7; k >= 0; n >>= 4, --k) {
int t = (n & 15) + '0';
buff[k] = t > '9' ? t += 'A' - '9' - 1 : t;
}
buff[8] = 0;
return new BBStr(buff);
}
BBStr* bbBin(int n)
{
char buff[36];
for (int k = 31; k >= 0; n >>= 1, --k) {
buff[k] = n & 1 ? '1' : '0';
}
buff[32] = 0;
return new BBStr(buff);
}
int bbAsc(BBStr* s)
{
int n = s->size() ? (*s)[0] & 255 : -1;
delete s;
return n;
}
int bbLen(BBStr* s)
{
int n = s->size();
delete s;
return n;
}
BBStr* bbCurrentDate()
{
time_t t;
time(&t);
char buff[256];
strftime(buff, 256, "%d %b %Y", localtime(&t));
return new BBStr(buff);
}
BBStr* bbCurrentTime()
{
time_t t;
time(&t);
char buff[256];
strftime(buff, 256, "%H:%M:%S", localtime(&t));
return new BBStr(buff);
}
bool string_create()
{
return true;
}
bool string_destroy()
{
return true;
}
void string_link(void (*rtSym)(const char*, void*))
{
rtSym("$String$string%repeat", bbString);
rtSym("$Left$string%count", bbLeft);
rtSym("$Right$string%count", bbRight);
rtSym("$Replace$string$from$to", bbReplace);
rtSym("%Instr$string$find%from=1", bbInstr);
rtSym("$Mid$string%start%count=-1", bbMid);
rtSym("$Upper$string", bbUpper);
rtSym("$Lower$string", bbLower);
rtSym("$Trim$string", bbTrim);
rtSym("$LSet$string%size", bbLSet);
rtSym("$RSet$string%size", bbRSet);
rtSym("$Chr%ascii", bbChr);
rtSym("%Asc$string", bbAsc);
rtSym("%Len$string", bbLen);
rtSym("$Hex%value", bbHex);
rtSym("$Bin%value", bbBin);
rtSym("$CurrentDate", bbCurrentDate);
rtSym("$CurrentTime", bbCurrentTime);
}