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 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>LibOFX: ofx_utilities.cpp Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.3 -->
<div class="tabs">
<ul>
<li><a href="main.html"><span>Main Page</span></a></li>
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
<li><a href="annotated.html"><span>Data Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<h1>ofx_utilities.cpp</h1><a href="fx-0_88_82_2lib_2ofx__utilities_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************************************</span>
<a name="l00002"></a>00002 <span class="comment"> ofx_util.cpp</span>
<a name="l00003"></a>00003 <span class="comment"> -------------------</span>
<a name="l00004"></a>00004 <span class="comment"> copyright : (C) 2002 by Benoit Grgoire</span>
<a name="l00005"></a>00005 <span class="comment"> email : bock@step.polymtl.ca</span>
<a name="l00006"></a>00006 <span class="comment"> ***************************************************************************/</span>
<a name="l00010"></a>00010 <span class="comment">/***************************************************************************</span>
<a name="l00011"></a>00011 <span class="comment"> * *</span>
<a name="l00012"></a>00012 <span class="comment"> * This program is free software; you can redistribute it and/or modify *</span>
<a name="l00013"></a>00013 <span class="comment"> * it under the terms of the GNU General Public License as published by *</span>
<a name="l00014"></a>00014 <span class="comment"> * the Free Software Foundation; either version 2 of the License, or *</span>
<a name="l00015"></a>00015 <span class="comment"> * (at your option) any later version. *</span>
<a name="l00016"></a>00016 <span class="comment"> * *</span>
<a name="l00017"></a>00017 <span class="comment"> ***************************************************************************/</span>
<a name="l00018"></a>00018 <span class="preprocessor">#include <config.h></span>
<a name="l00019"></a>00019 <span class="preprocessor">#include <iostream></span>
<a name="l00020"></a>00020 <span class="preprocessor">#include "ParserEventGeneratorKit.h"</span>
<a name="l00021"></a>00021 <span class="preprocessor">#include "SGMLApplication.h"</span>
<a name="l00022"></a>00022 <span class="preprocessor">#include <time.h></span>
<a name="l00023"></a>00023 <span class="preprocessor">#include <string></span>
<a name="l00024"></a>00024 <span class="preprocessor">#include <locale.h></span>
<a name="l00025"></a>00025 <span class="preprocessor">#include "<a class="code" href="fx-0_88_82_2lib_2messages_8hh.html" title="Message IO functionality.">messages.hh</a>"</span>
<a name="l00026"></a>00026 <span class="preprocessor">#include "<a class="code" href="fx-0_88_82_2lib_2ofx__utilities_8hh.html" title="Various simple functions for type conversion &amp; al.">ofx_utilities.hh</a>"</span>
<a name="l00027"></a>00027
<a name="l00028"></a>00028 <span class="keyword">using namespace </span>std;
<a name="l00032"></a>00032 <span class="comment">/*ostream &operator<<(ostream &os, SGMLApplication::CharString s)</span>
<a name="l00033"></a>00033 <span class="comment"> {</span>
<a name="l00034"></a>00034 <span class="comment"> for (size_t i = 0; i < s.len; i++)</span>
<a name="l00035"></a>00035 <span class="comment"> {</span>
<a name="l00036"></a>00036 <span class="comment"> os << ((char *)(s.ptr))[i*sizeof(SGMLApplication::Char)];</span>
<a name="l00037"></a>00037 <span class="comment"> }</span>
<a name="l00038"></a>00038 <span class="comment"> return os;</span>
<a name="l00039"></a>00039 <span class="comment"> }*/</span>
<a name="l00040"></a>00040
<a name="l00041"></a>00041 <span class="comment">/*wostream &operator<<(wostream &os, SGMLApplication::CharString s)</span>
<a name="l00042"></a>00042 <span class="comment"> {</span>
<a name="l00043"></a>00043 <span class="comment"> for (size_t i = 0; i < s.len; i++)</span>
<a name="l00044"></a>00044 <span class="comment"> {//cout<<i;</span>
<a name="l00045"></a>00045 <span class="comment"> os << wchar_t(s.ptr[i*MULTIPLY4]); </span>
<a name="l00046"></a>00046 <span class="comment"> }</span>
<a name="l00047"></a>00047 <span class="comment"> return os;</span>
<a name="l00048"></a>00048 <span class="comment"> } */</span>
<a name="l00049"></a>00049
<a name="l00050"></a>00050 <span class="comment">/*wchar_t* CharStringtowchar_t(SGMLApplication::CharString source, wchar_t *dest)</span>
<a name="l00051"></a>00051 <span class="comment"> {</span>
<a name="l00052"></a>00052 <span class="comment"> size_t i;</span>
<a name="l00053"></a>00053 <span class="comment"> for (i = 0; i < source.len; i++)</span>
<a name="l00054"></a>00054 <span class="comment"> {</span>
<a name="l00055"></a>00055 <span class="comment"> dest[i]+=wchar_t(source.ptr[i*sizeof(SGMLApplication::Char)*(sizeof(char)/sizeof(wchar_t))]);</span>
<a name="l00056"></a>00056 <span class="comment"> }</span>
<a name="l00057"></a>00057 <span class="comment"> return dest;</span>
<a name="l00058"></a>00058 <span class="comment"> }*/</span>
<a name="l00059"></a>00059
<a name="l00060"></a><a class="code" href="fx-0_88_82_2lib_2ofx__utilities_8cpp.html#e7575392f9f9c464ede10057dec0e8e4">00060</a> <span class="keywordtype">string</span> <a class="code" href="ofx__utilities_8cpp.html#e7575392f9f9c464ede10057dec0e8e4" title="Convert OpenSP CharString to a C++ STL string.">CharStringtostring</a>(<span class="keyword">const</span> SGMLApplication::CharString source, <span class="keywordtype">string</span> &dest)
<a name="l00061"></a>00061 {
<a name="l00062"></a>00062 <span class="keywordtype">size_t</span> i;
<a name="l00063"></a>00063 dest.assign(<span class="stringliteral">""</span>);<span class="comment">//Empty the provided string</span>
<a name="l00064"></a>00064 <span class="comment">// cout<<"Length: "<<source.len<<"sizeof(Char)"<<sizeof(SGMLApplication::Char)<<endl;</span>
<a name="l00065"></a>00065 <span class="keywordflow">for</span> (i = 0; i < source.len; i++){
<a name="l00066"></a>00066 dest+=(char)(((source.ptr)[i]));
<a name="l00067"></a>00067 <span class="comment">// cout<<i<<" "<<(char)(((source.ptr)[i]))<<endl; </span>
<a name="l00068"></a>00068 }
<a name="l00069"></a>00069 <span class="keywordflow">return</span> dest;
<a name="l00070"></a>00070 }
<a name="l00071"></a>00071
<a name="l00072"></a><a class="code" href="fx-0_88_82_2lib_2ofx__utilities_8cpp.html#50b88c84b759d3058397336e7ea42c32">00072</a> <span class="keywordtype">string</span> <a class="code" href="ofx__utilities_8cpp.html#50b88c84b759d3058397336e7ea42c32" title="Append an OpenSP CharString to an existing C++ STL string.">AppendCharStringtostring</a>(<span class="keyword">const</span> SGMLApplication::CharString source, <span class="keywordtype">string</span> &dest)
<a name="l00073"></a>00073 {
<a name="l00074"></a>00074 <span class="keywordtype">size_t</span> i;
<a name="l00075"></a>00075 <span class="keywordflow">for</span> (i = 0; i < source.len; i++)
<a name="l00076"></a>00076 {
<a name="l00077"></a>00077 dest+=(char)(((source.ptr)[i]));
<a name="l00078"></a>00078 }
<a name="l00079"></a>00079 <span class="keywordflow">return</span> dest;
<a name="l00080"></a>00080 }
<a name="l00081"></a>00081
<a name="l00097"></a><a class="code" href="fx-0_88_82_2lib_2ofx__utilities_8cpp.html#5fdbbc08f8d80a534f8db03d25316d7a">00097</a> time_t <a class="code" href="ofx__utilities_8cpp.html#5fdbbc08f8d80a534f8db03d25316d7a" title="Convert a C++ string containing a time in OFX format to a C time_t.">ofxdate_to_time_t</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> ofxdate)
<a name="l00098"></a>00098 {
<a name="l00099"></a>00099 <span class="keyword">struct </span>tm time;
<a name="l00100"></a>00100 <span class="keywordtype">double</span> local_offset; <span class="comment">/* in seconds */</span>
<a name="l00101"></a>00101 <span class="keywordtype">float</span> ofx_gmt_offset; <span class="comment">/* in fractionnal hours */</span>
<a name="l00102"></a>00102 <span class="keywordtype">char</span> timezone[4]; <span class="comment">/* Original timezone: the library does not expose this value*/</span>
<a name="l00103"></a>00103 <span class="keywordtype">char</span> exact_time_specified = <span class="keyword">false</span>;
<a name="l00104"></a>00104 <span class="keywordtype">char</span> time_zone_specified = <span class="keyword">false</span>;
<a name="l00105"></a>00105
<a name="l00106"></a>00106 time_t temptime;
<a name="l00107"></a>00107 std::time(&temptime);
<a name="l00108"></a>00108 local_offset = difftime(mktime(localtime(&temptime)), mktime(gmtime(&temptime)));
<a name="l00109"></a>00109
<a name="l00110"></a>00110 <span class="keywordflow">if</span>(ofxdate.size()!=0){
<a name="l00111"></a>00111 time.tm_year=atoi(ofxdate.substr(0,4).c_str())-1900;
<a name="l00112"></a>00112 time.tm_mon=atoi(ofxdate.substr(4,2).c_str())-1;
<a name="l00113"></a>00113 time.tm_mday=atoi(ofxdate.substr(6,2).c_str());
<a name="l00114"></a>00114 <span class="keywordflow">if</span>(ofxdate.size()>8) {
<a name="l00115"></a>00115 <span class="comment">/* if exact time is specified */</span>
<a name="l00116"></a>00116 exact_time_specified = <span class="keyword">true</span>;
<a name="l00117"></a>00117 time.tm_hour=atoi(ofxdate.substr(8,2).c_str());
<a name="l00118"></a>00118 time.tm_min=atoi(ofxdate.substr(10,2).c_str());
<a name="l00119"></a>00119 time.tm_sec=atoi(ofxdate.substr(12,2).c_str());
<a name="l00120"></a>00120 }
<a name="l00121"></a>00121
<a name="l00122"></a>00122 <span class="comment">/* Check if the timezone has been specified */</span>
<a name="l00123"></a>00123 string::size_type startidx = ofxdate.find(<span class="stringliteral">"["</span>);
<a name="l00124"></a>00124 string::size_type endidx;
<a name="l00125"></a>00125 <span class="keywordflow">if</span>(startidx!=string::npos){
<a name="l00126"></a>00126 <span class="comment">/* Time zone was specified */</span>
<a name="l00127"></a>00127 time_zone_specified = <span class="keyword">true</span>;
<a name="l00128"></a>00128 startidx++;
<a name="l00129"></a>00129 endidx = ofxdate.find(<span class="stringliteral">":"</span>, startidx)-1;
<a name="l00130"></a>00130 ofx_gmt_offset=atof(ofxdate.substr(startidx,(endidx-startidx)+1).c_str());
<a name="l00131"></a>00131 startidx = endidx+2;
<a name="l00132"></a>00132 strncpy(timezone,ofxdate.substr(startidx,3).c_str(),4);
<a name="l00133"></a>00133 }
<a name="l00134"></a>00134 <span class="keywordflow">else</span>{
<a name="l00135"></a>00135 <span class="comment">/* Time zone was not specified, assume GMT (provisionnaly) in case exact time is specified */</span>
<a name="l00136"></a>00136 ofx_gmt_offset=0;
<a name="l00137"></a>00137 strcpy(timezone, <span class="stringliteral">"GMT"</span>);
<a name="l00138"></a>00138 }
<a name="l00139"></a>00139
<a name="l00140"></a>00140 <span class="keywordflow">if</span>(time_zone_specified == <span class="keyword">true</span>)
<a name="l00141"></a>00141 {
<a name="l00142"></a>00142 <span class="comment">/* If the timezone is specified always correct the timezone */</span>
<a name="l00143"></a>00143 <span class="comment">/* If the timezone is not specified, but the exact time is, correct the timezone, assuming GMT following the spec */</span>
<a name="l00144"></a>00144 <span class="comment">/* Correct the time for the timezone */</span>
<a name="l00145"></a>00145 time.tm_sec = time.tm_sec + (int)(local_offset - (ofx_gmt_offset*60*60));<span class="comment">//Convert from fractionnal hours to seconds</span>
<a name="l00146"></a>00146 }
<a name="l00147"></a>00147 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (exact_time_specified == <span class="keyword">false</span>)
<a name="l00148"></a>00148 {
<a name="l00149"></a>00149 <span class="comment">/*Time zone data missing and exact time not specified, diverge from the OFX spec ans assume 11h59 local time */</span>
<a name="l00150"></a>00150 time.tm_hour=11;
<a name="l00151"></a>00151 time.tm_min=59;
<a name="l00152"></a>00152 time.tm_sec=0;
<a name="l00153"></a>00153 }
<a name="l00154"></a>00154 }
<a name="l00155"></a>00155 <span class="keywordflow">else</span>{
<a name="l00156"></a>00156 <a class="code" href="messages_8cpp.html#6af6947c1ec6fcbefd793f80c26d90fa" title="Message output function.">message_out</a>(<a class="code" href="messages_8hh.html#7cd03dafa59895bc306bf220b7b85f692fd6f336d08340583bd620a7f5694c90">ERROR</a>, <span class="stringliteral">"ofxdate_to_time_t(): Unable to convert time, string is 0 length!"</span>);
<a name="l00157"></a>00157 }
<a name="l00158"></a>00158 <span class="keywordflow">return</span> mktime(&time);
<a name="l00159"></a>00159 }
<a name="l00160"></a>00160
<a name="l00165"></a><a class="code" href="fx-0_88_82_2lib_2ofx__utilities_8cpp.html#bfca5b423e5d7b194eb53c53f706f6ba">00165</a> <span class="keywordtype">double</span> <a class="code" href="ofx__utilities_8cpp.html#bfca5b423e5d7b194eb53c53f706f6ba" title="Convert OFX amount of money to double float.">ofxamount_to_double</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> ofxamount)
<a name="l00166"></a>00166 {
<a name="l00167"></a>00167 <span class="comment">//Replace commas and decimal points for atof()</span>
<a name="l00168"></a>00168 string::size_type idx;
<a name="l00169"></a>00169 <span class="keywordtype">string</span> tmp = ofxamount;
<a name="l00170"></a>00170
<a name="l00171"></a>00171 idx = tmp.find(<span class="charliteral">','</span>);
<a name="l00172"></a>00172 <span class="keywordflow">if</span>(idx==string::npos){
<a name="l00173"></a>00173 idx = tmp.find(<span class="charliteral">'.'</span>);
<a name="l00174"></a>00174 }
<a name="l00175"></a>00175
<a name="l00176"></a>00176 <span class="keywordflow">if</span>(idx!=string::npos){
<a name="l00177"></a>00177 tmp.replace(idx,1,1,((localeconv())->decimal_point)[0]);
<a name="l00178"></a>00178 }
<a name="l00179"></a>00179
<a name="l00180"></a>00180 <span class="keywordflow">return</span> atof(tmp.c_str());
<a name="l00181"></a>00181 }
<a name="l00182"></a>00182
<a name="l00186"></a><a class="code" href="fx-0_88_82_2lib_2ofx__utilities_8cpp.html#34933785dd934134973847e58a700733">00186</a> <span class="keywordtype">string</span> <a class="code" href="ofx__utilities_8cpp.html#34933785dd934134973847e58a700733" title="Sanitize a string coming from OpenSP.">strip_whitespace</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> para_string)
<a name="l00187"></a>00187 {
<a name="l00188"></a>00188 <span class="keywordtype">size_t</span> index;
<a name="l00189"></a>00189 <span class="keywordtype">size_t</span> i;
<a name="l00190"></a>00190 <span class="keywordtype">string</span> temp_string = para_string;
<a name="l00191"></a>00191 <span class="keywordtype">char</span> *whitespace = <span class="stringliteral">" \b\f\n\r\t\v"</span>;
<a name="l00192"></a>00192 <span class="keywordtype">char</span> *abnormal_whitespace = <span class="stringliteral">"\b\f\n\r\t\v"</span>;<span class="comment">//backspace,formfeed,newline,cariage return, horizontal and vertical tabs</span>
<a name="l00193"></a>00193 <a class="code" href="messages_8cpp.html#6af6947c1ec6fcbefd793f80c26d90fa" title="Message output function.">message_out</a>(<a class="code" href="messages_8hh.html#7cd03dafa59895bc306bf220b7b85f69b03d2afd0c05cf9e3b1a3f60c2545b67">DEBUG4</a>,<span class="stringliteral">"strip_whitespace() Before: |"</span>+temp_string+<span class="stringliteral">"|"</span>);
<a name="l00194"></a>00194 <span class="keywordflow">for</span>(i=0;i<=temp_string.size()&&temp_string.find_first_of(whitespace, i)==i&&temp_string.find_first_of(whitespace, i)!=string::npos;i++);
<a name="l00195"></a>00195 temp_string.erase(0,i);<span class="comment">//Strip leading whitespace</span>
<a name="l00196"></a>00196 <span class="keywordflow">for</span>(i=temp_string.size()-1;(i>=0)&&(temp_string.find_last_of(whitespace, i)==i)&&(temp_string.find_last_of(whitespace, i)!=string::npos);i--);
<a name="l00197"></a>00197 temp_string.erase(i+1,temp_string.size()-(i+1));<span class="comment">//Strip trailing whitespace</span>
<a name="l00198"></a>00198
<a name="l00199"></a>00199 <span class="keywordflow">while</span> ((index = temp_string.find_first_of(abnormal_whitespace))!=string::npos)
<a name="l00200"></a>00200 {
<a name="l00201"></a>00201 temp_string.erase(index,1);<span class="comment">//Strip leading whitespace</span>
<a name="l00202"></a>00202 };
<a name="l00203"></a>00203
<a name="l00204"></a>00204 <a class="code" href="messages_8cpp.html#6af6947c1ec6fcbefd793f80c26d90fa" title="Message output function.">message_out</a>(<a class="code" href="messages_8hh.html#7cd03dafa59895bc306bf220b7b85f69b03d2afd0c05cf9e3b1a3f60c2545b67">DEBUG4</a>,<span class="stringliteral">"strip_whitespace() After: |"</span>+temp_string+<span class="stringliteral">"|"</span>);
<a name="l00205"></a>00205
<a name="l00206"></a>00206 <span class="keywordflow">return</span> temp_string;
<a name="l00207"></a>00207 }
</pre></div><hr size="1"><address style="text-align: right;"><small>Generated on Mon Nov 19 20:27:59 2007 for LibOFX by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.3 </small></address>
</body>
</html>
|