LibOFX
ofx_utilities.cpp
Go to the documentation of this file.
1/***************************************************************************
2 ofx_util.cpp
3 -------------------
4 copyright : (C) 2002 by Benoit Gr�goire
5 email : benoitg@coeus.ca
6 ***************************************************************************/
10/***************************************************************************
11 * *
12 * This program is free software; you can redistribute it and/or modify *
13 * it under the terms of the GNU General Public License as published by *
14 * the Free Software Foundation; either version 2 of the License, or *
15 * (at your option) any later version. *
16 * *
17 ***************************************************************************/
18#include <config.h>
19#include <iostream>
20#include <assert.h>
21
22#include "ParserEventGeneratorKit.h"
23#include "SGMLApplication.h"
24#include <ctime>
25#include <cstdlib>
26#include <string>
27#include <locale.h>
28#include "messages.hh"
29#include "ofx_utilities.hh"
30
31#ifdef _WIN32
32# define DIRSEP "\\"
33/* MSWin calls it _mkgmtime instead of timegm */
34# define timegm(tm) _mkgmtime(tm)
35#else
36# define DIRSEP "/"
37#endif
38
39
40std::string CharStringtostring(const SGMLApplication::CharString source)
41{
42 // The CharString type might have multi-byte characters if SP_MULTI_BYTE was defined
43 std::string result;
44 result.resize(source.len);
45 for (size_t i = 0; i < source.len; i++)
46 {
47 result[i] = static_cast<char>(source.ptr[i]);
48 }
49 return result;
50}
51
52void AppendCharStringtostring(const SGMLApplication::CharString source, std::string &dest)
53{
54 const std::string toBeAppended = CharStringtostring(source);
55 dest.append(toBeAppended);
56}
57
68 time_t ofxdate_to_time_t(const std::string& ofxdate)
69{
70 if (ofxdate.empty())
71 {
72 message_out(ERROR, "ofxdate_to_time_t(): Unable to convert time, string is 0 length!");
73 return 0;
74 }
75 std::string ofxdate_whole =
76 ofxdate.substr(0, ofxdate.find_first_not_of("0123456789"));
77
78 if (ofxdate_whole.size() < 8)
79 {
80 message_out(ERROR, "ofxdate_to_time_t(): Unable to convert time, string " + ofxdate + " is not in proper YYYYMMDDHHMMSS.XXX[gmt offset:tz name] format!");
81 return std::time(NULL);
82 }
83
84 struct tm time;
85 memset(&time, 0, sizeof(tm));
86 time.tm_year = atoi(ofxdate_whole.substr(0, 4).c_str()) - 1900;
87 time.tm_mon = atoi(ofxdate_whole.substr(4, 2).c_str()) - 1;
88 time.tm_mday = atoi(ofxdate_whole.substr(6, 2).c_str());
89
90 if (ofxdate_whole.size() < 14)
91 {
92 message_out(WARNING, "ofxdate_to_time_t(): Successfully parsed date part, but unable to parse time part of string " + ofxdate_whole + ". It is not in proper YYYYMMDDHHMMSS.XXX[gmt offset:tz name] format!");
93 }
94 else
95 {
96 time.tm_hour = atoi(ofxdate_whole.substr(8, 2).c_str());
97 time.tm_min = atoi(ofxdate_whole.substr(10, 2).c_str());
98 time.tm_sec = atoi(ofxdate_whole.substr(12, 2).c_str());
99 }
100
101 if (time.tm_hour + time.tm_min + time.tm_sec == 0)
102 {
103 time.tm_hour = 10;
104 time.tm_min = 59;
105 time.tm_sec = 0;
106 return timegm(&time);
107 }
108
109 std::string::size_type startidx = ofxdate.find("[");
110 if (startidx != std::string::npos)
111 {
112 startidx++;
113 std::string::size_type endidx = ofxdate.find(":", startidx) - 1;
114 std::string offset_str = ofxdate.substr(startidx, (endidx - startidx) + 1);
115 float ofx_gmt_offset = atof(offset_str.c_str());
116 std::time_t temptime = std::time(nullptr);
117 static const double secs_per_hour = 3600.0;
118 time.tm_sec -= static_cast<int>(ofx_gmt_offset * secs_per_hour);
119 return timegm(&time);
120 }
121
122 /* No timezone, assume GMT */
123 return timegm(&time);
124}
125
130double ofxamount_to_double(const std::string ofxamount)
131{
132 //Replace commas and decimal points for atof()
133 std::string::size_type idx;
134 std::string tmp = ofxamount;
135
136 idx = tmp.find(',');
137 if (idx == std::string::npos)
138 {
139 idx = tmp.find('.');
140 }
141
142 if (idx != std::string::npos)
143 {
144 tmp.replace(idx, 1, 1, ((localeconv())->decimal_point)[0]);
145 }
146
147 return atof(tmp.c_str());
148}
149
153std::string strip_whitespace(const std::string para_string)
154{
155 size_t index;
156 size_t i;
157 std::string temp_string = para_string;
158 if (temp_string.empty())
159 return temp_string; // so that size()-1 is allowed below
160
161 const char *whitespace = " \b\f\n\r\t\v";
162 const char *abnormal_whitespace = "\b\f\n\r\t\v";//backspace,formfeed,newline,carriage return, horizontal and vertical tabs
163 message_out(DEBUG4, "strip_whitespace() Before: |" + temp_string + "|");
164
165 for (i = 0;
166 i <= temp_string.size()
167 && temp_string.find_first_of(whitespace, i) == i
168 && temp_string.find_first_of(whitespace, i) != std::string::npos;
169 i++);
170 temp_string.erase(0, i); //Strip leading whitespace
171
172 for (i = temp_string.size() - 1;
173 (i > 0)
174 && (temp_string.find_last_of(whitespace, i) == i)
175 && (temp_string.find_last_of(whitespace, i) != std::string::npos);
176 i--);
177 temp_string.erase(i + 1, temp_string.size() - (i + 1)); //Strip trailing whitespace
178
179 while ((index = temp_string.find_first_of(abnormal_whitespace)) != std::string::npos)
180 {
181 temp_string.erase(index, 1); //Strip leading whitespace
182 };
183
184 message_out(DEBUG4, "strip_whitespace() After: |" + temp_string + "|");
185
186 return temp_string;
187}
188
189
190std::string get_tmp_dir()
191{
192 // Tries to mimic the behaviour of
193 // http://developer.gnome.org/doc/API/2.0/glib/glib-Miscellaneous-Utility-Functions.html#g-get-tmp-dir
194 char *var;
195 var = getenv("TMPDIR");
196 if (var) return var;
197 var = getenv("TMP");
198 if (var) return var;
199 var = getenv("TEMP");
200 if (var) return var;
201#ifdef _WIN32
202 return "C:\\";
203#else
204 return "/tmp";
205#endif
206}
207
208int mkTempFileName(const char *tmpl, char *buffer, unsigned int size)
209{
210
211 std::string tmp_dir = get_tmp_dir();
212
213 strncpy(buffer, tmp_dir.c_str(), size);
214 assert((strlen(buffer) + strlen(tmpl) + 2) < size);
215 strcat(buffer, DIRSEP);
216 strcat(buffer, tmpl);
217 return 0;
218}
219
220
221
int message_out(OfxMsgType error_type, const std::string message)
Message output function.
Definition messages.cpp:67
Message IO functionality.
@ ERROR
Definition messages.hh:34
@ WARNING
Definition messages.hh:33
@ DEBUG4
Definition messages.hh:29
std::string CharStringtostring(const SGMLApplication::CharString source)
Convert OpenSP CharString to a C++ STL string.
std::string strip_whitespace(const std::string para_string)
Sanitize a string coming from OpenSP.
void AppendCharStringtostring(const SGMLApplication::CharString source, std::string &dest)
Append an OpenSP CharString to an existing C++ STL string.
double ofxamount_to_double(const std::string ofxamount)
Convert OFX amount of money to double float.
time_t ofxdate_to_time_t(const std::string &ofxdate)
Convert a C++ string containing a time in OFX format to a C time_t.
Various simple functions for type conversion & al.