gcontini
2020-05-02 4bd7da9ff2eb06c11b1f54e2b8e2cfb44af56776
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
 * StringUtils.cpp
 *
 *  Created on: Apr 8, 2014
 *
 */
 
#include <cctype>  //toupper
#include <iostream>
#include <string>
#include <sstream>
#include <cstring>
#include <algorithm>
#include <stdexcept>
#include <regex>
#include "string_utils.h"
 
#ifdef _WIN32
#include <time.h>  //mktime under windows
#endif
 
namespace license {
using namespace std;
 
string trim_copy(const string &string_to_trim) {
    std::string::const_iterator it = string_to_trim.begin();
    while (it != string_to_trim.end() && isspace(*it)) {
        ++it;
    }
    std::string::const_reverse_iterator rit = string_to_trim.rbegin();
    while (rit.base() != it && (isspace(*rit) || *rit == 0)) {
        ++rit;
    }
    return std::string(it, rit.base());
}
 
string toupper_copy(const string &lowercase) {
    string cp(lowercase);
    std::transform(cp.begin(), cp.end(), cp.begin(), (int (*)(int))toupper);
    return cp;
}
 
time_t seconds_from_epoch(const string &timeString) {
    int year, month, day;
    tm tm;
    if (timeString.size() == 8) {
        const int nfield = sscanf(timeString.c_str(), "%4d%2d%2d", &year, &month, &day);
        if (nfield != 3) {
            throw invalid_argument("Date not recognized");
        }
    } else if (timeString.size() == 10) {
        const int nfield = sscanf(timeString.c_str(), "%4d-%2d-%2d", &year, &month, &day);
        if (nfield != 3) {
            const int nfield = sscanf(timeString.c_str(), "%4d/%2d/%2d", &year, &month, &day);
            if (nfield != 3) {
                throw invalid_argument("Date [" + timeString + "] not recognized");
            }
        }
    } else {
        throw invalid_argument("Date [" + timeString + "] not recognized");
    }
    tm.tm_isdst = -1;
    tm.tm_year = year - 1900;
    tm.tm_mon = month - 1;
    tm.tm_mday = day;
    tm.tm_hour = 0;
    tm.tm_min = 0;
    tm.tm_sec = 0;
    tm.tm_yday = -1;
    tm.tm_wday = -1;
    return mktime(&tm);
}
 
const vector<string> split_string(const string &licensePositions, char splitchar) {
    std::stringstream streamToSplit(licensePositions);
    std::string segment;
    std::vector<string> seglist;
 
    while (std::getline(streamToSplit, segment, splitchar)) {
        seglist.push_back(segment);
    }
    return seglist;
}
 
const static regex iniSection("\\[.*?\\]");
const static regex b64("^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$");
 
FILE_FORMAT identify_format(const string &license) {
    FILE_FORMAT result = UNKNOWN;
    if (regex_match(license, b64)) {
        result = BASE64;
    } else if (regex_search(license, iniSection)) {
        result = INI;
    }
    return result;
}
 
// strnln_s is not well supported and strlen is marked unsafe..
size_t mstrnlen_s(const char *szptr, size_t maxsize) {
    if (szptr == nullptr) {
        return 0;
    }
    size_t count = 0;
    while (*szptr++ && maxsize--) {
        count++;
    }
    return count;
}
 
} /* namespace license */