X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=source%2Fcore%2Ffunctions.cpp;h=8752a2e5d3bbbe75b51c24538b6de406d6fbfbe6;hb=af9c86ffb0e28d35ad94d99c5f77e41578c972b4;hp=14ba7fca5ffe5f6407e7a3b3fb6da3ac7d0c67cb;hpb=93366a0bda79e6fd6e7dad6316bfcf8cc82f5731;p=anna.git diff --git a/source/core/functions.cpp b/source/core/functions.cpp index 14ba7fc..8752a2e 100644 --- a/source/core/functions.cpp +++ b/source/core/functions.cpp @@ -30,6 +30,8 @@ #include #include +#include +#include using namespace anna; @@ -37,8 +39,11 @@ using namespace std; #define PAGE_WIDTH_LENGTH 80 -ExclusiveHash functions::st_stringExclusiveHash; -ExclusiveHash functions::st_string2intExclusiveHash; +static const std::string base64_chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + string functions::getVersion() throw() { static const int version = ANNA_VERSION; @@ -91,21 +96,15 @@ throw() { return string(aux); } -string functions::asString(const unsigned long number) -throw() { - return asString((U64)number); -} - string functions::asString(const S64 number) throw() { char aux [24]; - sprintf(aux, "%lld", number); - /*#ifdef __anna64__ + //sprintf(aux, "%lld", number); + #ifdef __anna64__ sprintf (aux, "%ld", number); #else sprintf (aux, "%lld", number); #endif - */ return string(aux); } @@ -119,14 +118,12 @@ throw() { string functions::asString(const U64 number) throw() { char aux [16]; - sprintf(aux, "%llu", number); - /* + //sprintf(aux, "%llu", number); #ifdef __anna64__ sprintf (aux, "%lu", number); #else sprintf (aux, "%llu", number); #endif - */ return string(aux); } @@ -154,7 +151,7 @@ const char* functions::asDateTime(const Second &second, char* result) throw() { struct tm* tt = localtime((time_t*) & second); sprintf( - result, "%02d/%02d/%4d %02d:%02d:%02d", + result, "%02u/%02u/%4u %02u:%02u:%02u", tt->tm_mday, tt->tm_mon + 1, tt->tm_year + 1900, tt->tm_hour, tt->tm_min, tt->tm_sec ); @@ -173,22 +170,15 @@ throw() { return string(aux); } -string functions::asHexString(const long number) -throw() { - return asHexString((S64)number); -} - string functions::asHexString(const S64 number) throw() { char aux [32]; - sprintf(aux, "0x%llx", number); - /* + //sprintf(aux, "0x%llx", number); #ifdef __anna64__ sprintf (aux, "0x%lx", number); #else sprintf (aux, "0x%llx", number); #endif - */ return string(aux); } @@ -249,7 +239,6 @@ throw(RuntimeException) { const char* src = hexString.data(); unsigned char hex; int aux; - int j = 0; for(int ii = 1, maxii = hexString.length(); ii < maxii; ii += 2) { if(isxdigit(aux = src [ii - 1]) == 0) @@ -320,14 +309,12 @@ throw(RuntimeException) { S64 functions::asInteger64(const char* str) throw() { S64 number = 0; - sscanf(str, "%lld", &number); - /* + //sscanf(str, "%lld", &number); #ifdef __anna64__ sscanf (str, "%ld", &number); #else sscanf (str, "%lld", &number); #endif - */ return number; } @@ -405,7 +392,7 @@ throw(RuntimeException) { */ int functions::log2(const unsigned int v) throw() { - static const char LogTable256[] = { + static const signed char LogTable256[] = { -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, @@ -426,8 +413,8 @@ throw() { int r = -1; // r will be lg(v) unsigned int t, tt; // temporaries - if(tt = v >> 16) { - r = (t = tt >> 8) ? 24 + LogTable256[t] : 16 + LogTable256[tt]; + if((tt = v >> 16)) { + r = ((t = tt >> 8)) ? 24 + LogTable256[t] : 16 + LogTable256[tt]; } else { r = (t = v >> 8) ? 8 + LogTable256[t] : LogTable256[v]; } @@ -723,7 +710,6 @@ std::string functions::getHostnameIP() throw() { std::string result = ""; struct hostent *he; struct in_addr **addr_list; - struct in_addr ipv4addr; char hostname[128]; gethostname(hostname, sizeof hostname); @@ -1492,17 +1478,17 @@ void functions::codeIsupNumber(const isup_number_t & isupNumber, bool calledOrCa bool filler = isupNumber.OddEven; bool hasDigits = (isupNumber.Digits.size() > 0); byte = filler ? 0x80 : 0x00; - byte = byte |= isupNumber.NatureOfAddress; + byte |= isupNumber.NatureOfAddress; target += byte; if(calledOrCalling) { byte = isupNumber.InternalNetworkNumber << 7; - byte = byte |= (isupNumber.NumberingPlan << 4); + byte |= (isupNumber.NumberingPlan << 4); } else { byte = isupNumber.NumberIncomplete << 7; - byte = byte |= (isupNumber.NumberingPlan << 4); - byte = byte |= (isupNumber.AddressPresentationRestricted << 2); - byte = byte |= isupNumber.Screening; + byte |= (isupNumber.NumberingPlan << 4); + byte |= (isupNumber.AddressPresentationRestricted << 2); + byte |= isupNumber.Screening; } target += byte; @@ -1541,3 +1527,105 @@ void functions::codeIsupNumber(const isup_number_t & isupNumber, bool calledOrCa memcpy(buffer, target.c_str(), length); } + +static inline bool is_base64(U8 c) { + return (isalnum(c) || (c == '+') || (c == '/')); +} + +std::string functions::encodeBase64(const U8* buf, unsigned int bufLen) { + std::string ret; + int i = 0; + int j = 0; + U8 char_array_3[3]; + U8 char_array_4[4]; + + while (bufLen--) { + char_array_3[i++] = *(buf++); + if (i == 3) { + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for(i = 0; (i <4) ; i++) + ret += base64_chars[char_array_4[i]]; + i = 0; + } + } + + if (i) + { + for(j = i; j < 3; j++) + char_array_3[j] = '\0'; + + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for (j = 0; (j < i + 1); j++) + ret += base64_chars[char_array_4[j]]; + + while((i++ < 3)) + ret += '='; + } + + return ret; +} + +std::string functions::decodeBase64(const std::string & encodedString) { + int in_len = encodedString.size(); + int i = 0; + int j = 0; + int in_ = 0; + U8 char_array_4[4], char_array_3[3]; + std::string ret; + + while (in_len-- && ( encodedString[in_] != '=') && is_base64(encodedString[in_])) { + char_array_4[i++] = encodedString[in_]; in_++; + if (i ==4) { + for (i = 0; i <4; i++) + char_array_4[i] = base64_chars.find(char_array_4[i]); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (i = 0; (i < 3); i++) + ret += char_array_3[i]; + i = 0; + } + } + + if (i) { + for (j = i; j <4; j++) + char_array_4[j] = 0; + + for (j = 0; j <4; j++) + char_array_4[j] = base64_chars.find(char_array_4[j]); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (j = 0; (j < i - 1); j++) ret += char_array_3[j]; + } + + return ret; +} + +bool functions::getContentFromFile(const std::string &pathfile, std::string &content) throw(anna::RuntimeException) { + + std::ifstream inFile(pathfile.c_str(), std::ifstream::in); + if(!inFile.good()) { + throw RuntimeException(anna::functions::asString("Unable to open file '%s'", pathfile.c_str()), ANNA_FILE_LOCATION); + } + + std::stringstream strStream; + strStream << inFile.rdbuf(); //read the file + content = strStream.str(); // holds the content of the file + inFile.close(); + + return true; +} +