00001
00002
00003
00004
00005
00006
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
#include <stdio.h>
00042
#include <string.h>
00043
#include <time.h>
00044
#include "libofx.h"
00045
00046
#define QIF_FILE_MAX_SIZE 256000
00047
00048
int ofx_proc_transaction_cb(
const struct OfxTransactionData data,
void * transaction_data)
00049 {
00050
char dest_string[255];
00051
char trans_buff[4096];
00052
struct tm temp_tm;
00053
char trans_list_buff[QIF_FILE_MAX_SIZE];
00054
00055 trans_list_buff[0]=
'\0';
00056
00057
if(data.
date_posted_valid==
true){
00058 temp_tm = *localtime(&(data.
date_posted));
00059 sprintf(trans_buff,
"D%d%s%d%s%d%s", temp_tm.tm_mday,
"/", temp_tm.tm_mon+1,
"/", temp_tm.tm_year+1900,
"\n");
00060 strncat(trans_list_buff, trans_buff,
sizeof(trans_list_buff)-1 - strlen(trans_list_buff));
00061 }
00062
if(data.
amount_valid==
true){
00063 sprintf(trans_buff,
"T%.2f%s",data.
amount,
"\n");
00064 strncat(trans_list_buff, trans_buff,
sizeof(trans_list_buff)-1 - strlen(trans_list_buff));
00065 }
00066
if(data.
check_number_valid==
true){
00067 sprintf(trans_buff,
"N%s%s",data.
check_number,
"\n");
00068 strncat(trans_list_buff, trans_buff,
sizeof(trans_list_buff)-1 - strlen(trans_list_buff));
00069 }
00070
else if(data.
reference_number_valid==
true){
00071 sprintf(trans_buff,
"N%s%s",data.
reference_number,
"\n");
00072 strncat(trans_list_buff, trans_buff,
sizeof(trans_list_buff)-1 - strlen(trans_list_buff));
00073 }
00074
if(data.
name_valid==
true){
00075 sprintf(trans_buff,
"P%s%s",data.
name,
"\n");
00076 strncat(trans_list_buff, trans_buff,
sizeof(trans_list_buff)-1 - strlen(trans_list_buff));
00077 }
00078
if(data.
memo_valid==
true){
00079 sprintf(trans_buff,
"M%s%s",data.
memo,
"\n");
00080 strncat(trans_list_buff, trans_buff,
sizeof(trans_list_buff)-1 - strlen(trans_list_buff));
00081 }
00082
00083
00084
00085
if(data.
transactiontype_valid==
true){
00086
switch(data.
transactiontype){
00087
case OFX_CREDIT: strncpy(dest_string,
"Generic credit",
sizeof(dest_string));
00088
break;
00089
case OFX_DEBIT: strncpy(dest_string,
"Generic debit",
sizeof(dest_string));
00090
break;
00091
case OFX_INT: strncpy(dest_string,
"Interest earned or paid (Note: Depends on signage of amount)",
sizeof(dest_string));
00092
break;
00093
case OFX_DIV: strncpy(dest_string,
"Dividend",
sizeof(dest_string));
00094
break;
00095
case OFX_FEE: strncpy(dest_string,
"FI fee",
sizeof(dest_string));
00096
break;
00097
case OFX_SRVCHG: strncpy(dest_string,
"Service charge",
sizeof(dest_string));
00098
break;
00099
case OFX_DEP: strncpy(dest_string,
"Deposit",
sizeof(dest_string));
00100
break;
00101
case OFX_ATM: strncpy(dest_string,
"ATM debit or credit (Note: Depends on signage of amount)",
sizeof(dest_string));
00102
break;
00103
case OFX_POS: strncpy(dest_string,
"Point of sale debit or credit (Note: Depends on signage of amount)",
sizeof(dest_string));
00104
break;
00105
case OFX_XFER: strncpy(dest_string,
"Transfer",
sizeof(dest_string));
00106
break;
00107
case OFX_CHECK: strncpy(dest_string,
"Check",
sizeof(dest_string));
00108
break;
00109
case OFX_PAYMENT: strncpy(dest_string,
"Electronic payment",
sizeof(dest_string));
00110
break;
00111
case OFX_CASH: strncpy(dest_string,
"Cash withdrawal",
sizeof(dest_string));
00112
break;
00113
case OFX_DIRECTDEP: strncpy(dest_string,
"Direct deposit",
sizeof(dest_string));
00114
break;
00115
case OFX_DIRECTDEBIT: strncpy(dest_string,
"Merchant initiated debit",
sizeof(dest_string));
00116
break;
00117
case OFX_REPEATPMT: strncpy(dest_string,
"Repeating payment/standing order",
sizeof(dest_string));
00118
break;
00119
case OFX_OTHER: strncpy(dest_string,
"Other",
sizeof(dest_string));
00120
break;
00121
default : strncpy(dest_string,
"Unknown transaction type",
sizeof(dest_string));
00122
break;
00123 }
00124 sprintf(trans_buff,
"L%s%s",dest_string,
"\n");
00125 strncat(trans_list_buff, trans_buff,
sizeof(trans_list_buff)-1 - strlen(trans_list_buff));
00126 }
00127 strcpy(trans_buff,
"^\n");
00128 strncat(trans_list_buff, trans_buff,
sizeof(trans_list_buff)-1 - strlen(trans_list_buff));
00129 fputs(trans_list_buff,stdout);
00130
return 0;
00131 }
00132
00133
int ofx_proc_statement_cb(
const struct OfxStatementData data,
void * statement_data)
00134 {
00135
struct tm temp_tm;
00136
00137 printf(
"!Account\n");
00138
if(data.
account_id_valid==
true){
00139
00140 printf(
"N%s%s",data.
account_id,
"\n");
00141 }
00142
if(data.
account_ptr->
account_type_valid==
true)
00143 {
00144
switch(data.
account_ptr->
account_type){
00145
case OFX_CHECKING : printf(
"TBank\n");
00146
break;
00147
case OFX_SAVINGS : printf(
"TBank\n");
00148
break;
00149
case OFX_MONEYMRKT : printf(
"TOth A\n");
00150
break;
00151
case OFX_CREDITLINE : printf(
"TOth L\n");
00152
break;
00153
case OFX_CMA : printf(
"TOth A\n");
00154
break;
00155
case OFX_CREDITCARD : printf(
"TCCard\n");
00156
break;
00157
default: perror(
"WRITEME: ofx_proc_account() This is an unknown account type!");
00158 }
00159 }
00160 printf(
"DOFX online account\n");
00161
00162
if(data.
ledger_balance_date_valid==
true){
00163 temp_tm = *localtime(&(data.
ledger_balance_date));
00164 printf(
"/%d%s%d%s%d%s", temp_tm.tm_mday,
"/", temp_tm.tm_mon+1,
"/", temp_tm.tm_year+1900,
"\n");
00165 }
00166
if(data.
ledger_balance_valid==
true){
00167 printf(
"$%.2f%s",data.
ledger_balance,
"\n");
00168 }
00169 printf(
"^\n");
00170
00171
if(data.
account_ptr->
account_type_valid==
true){
00172
switch(data.
account_ptr->
account_type){
00173
case OFX_CHECKING : printf(
"!Type:Bank\n");
00174
break;
00175
case OFX_SAVINGS : printf(
"!Type:Bank\n");
00176
break;
00177
case OFX_MONEYMRKT : printf(
"!Type:Oth A\n");
00178
break;
00179
case OFX_CREDITLINE : printf(
"!Type:Oth L\n");
00180
break;
00181
case OFX_CMA : printf(
"!Type:Oth A\n");
00182
break;
00183
case OFX_CREDITCARD : printf(
"!Type:CCard\n");
00184
break;
00185
default: perror(
"WRITEME: ofx_proc_account() This is an unknown account type!");
00186 }
00187 }
00188
00189
return 0;
00190 }
00191
00192
int ofx_proc_account_cb(
const struct OfxAccountData data,
void * account_data)
00193 {
00194
char dest_string[255]=
"";
00195
00196
00197
00198 fputs(dest_string,stdout);
00199
return 0;
00200 }
00201
00202
int main (
int argc,
char *argv[])
00203 {
00204
extern int ofx_PARSER_msg;
00205
extern int ofx_DEBUG_msg;
00206
extern int ofx_WARNING_msg;
00207
extern int ofx_ERROR_msg;
00208
extern int ofx_INFO_msg;
00209
extern int ofx_STATUS_msg;
00210
ofx_PARSER_msg =
false;
00211
ofx_DEBUG_msg =
false;
00212
ofx_WARNING_msg =
false;
00213
ofx_ERROR_msg =
false;
00214
ofx_INFO_msg =
false;
00215
ofx_STATUS_msg =
false;
00216
00217 LibofxContextPtr libofx_context =
libofx_get_new_context();
00218
ofx_set_statement_cb(libofx_context, ofx_proc_statement_cb, 0);
00219
ofx_set_account_cb(libofx_context, ofx_proc_account_cb, 0);
00220
ofx_set_transaction_cb(libofx_context, ofx_proc_transaction_cb, 0);
00221
00222
if(argc >= 2){
00223
libofx_proc_file(libofx_context, argv[1], OFX);
00224 }
00225
return libofx_free_context(libofx_context);
00226 }
00227
00228
00229
00230
00231