31 #include <glib/gstdio.h>
36 #include "qif-import-p.h"
37 #include "qif-objects-p.h"
43 qif_make_line(
const char* buf, gint lineno)
46 g_return_val_if_fail(buf && *buf, NULL);
50 line->lineno = lineno;
51 line->line = g_strdup(buf + 1);
57 qif_record_destroy(GList *record)
62 for (node = record; node; node = node->next)
78 qif_make_record(
QifContext ctx,
char *buf,
size_t bufsiz, gboolean *found_bangtype)
83 g_return_val_if_fail(ctx, NULL);
84 g_return_val_if_fail(buf, NULL);
85 g_return_val_if_fail(found_bangtype, NULL);
87 *found_bangtype = FALSE;
89 while (fgets(buf, bufsiz, ctx->fp) != NULL)
105 *found_bangtype = TRUE;
121 line = qif_make_line(buf, ctx->lineno);
123 record = g_list_prepend(record, line);
132 PERR(
"error loading file: incomplete record at line %d", ctx->lineno);
134 qif_record_destroy(record);
138 return g_list_reverse(record);
150 QifError err = QIF_E_OK;
152 g_return_val_if_fail(ctx, QIF_E_BADARGS);
153 g_return_val_if_fail(f, QIF_E_BADARGS);
161 record = qif_make_record(ctx, buf,
sizeof(buf), &found_bang);
166 if (!ctx->handler || !ctx->handler->parse_record)
168 PERR(
"Trying to process QIF record without a handler at %d", ctx->lineno);
172 err = ctx->handler->parse_record(ctx, record);
176 qif_record_destroy(record);
182 g_assert(*buf ==
'!');
187 if (ctx->handler && ctx->handler->end)
189 err = ctx->handler->end(ctx);
195 qif_parse_bangtype(ctx, buf);
199 while ((record || found_bang) && err == QIF_E_OK);
202 if (err == QIF_E_OK && ctx->handler && ctx->handler->end)
203 err = ctx->handler->end(ctx);
206 qif_object_list_reverse(ctx, QIF_O_TXN);
212 qif_import_file(
QifContext ctx,
const char *filename)
217 g_return_val_if_fail(ctx, QIF_E_BADARGS);
218 g_return_val_if_fail(filename, QIF_E_BADARGS);
219 g_return_val_if_fail(*filename, QIF_E_BADARGS);
222 fp = g_fopen(filename,
"r");
226 ctx->filename = g_strdup(filename);
229 err = qif_read_file(ctx, fp);
239 qif_file_new(
QifContext ctx,
const char *filename)
243 g_return_val_if_fail(ctx, NULL);
244 g_return_val_if_fail(filename, NULL);
246 fctx = qif_context_new();
249 qif_parse_bangtype(fctx,
"!type:bank");
252 if (qif_import_file(fctx, filename) != QIF_E_OK)
254 qif_context_destroy(fctx);
261 ctx->files = g_list_prepend(ctx->files, fctx);
272 qif_file_parse(
QifContext ctx, gpointer ui_args)
274 g_return_val_if_fail(ctx, QIF_E_BADARGS);
275 g_return_val_if_fail(!qif_file_needs_account(ctx), QIF_E_BADSTATE);
277 qif_parse_all(ctx, ui_args);
286 g_return_val_if_fail(ctx, FALSE);
288 return ((ctx->parse_flags & QIF_F_TXN_NEEDS_ACCT) ||
289 (ctx->parse_flags & QIF_F_ITXN_NEEDS_ACCT));
295 g_return_val_if_fail(ctx, NULL);
296 return ctx->filename;
300 set_txn_acct(gpointer obj, gpointer arg)
306 txn->from_acct = acct;
310 qif_file_set_default_account(
QifContext ctx,
const char *acct_name)
314 g_return_if_fail(ctx);
315 g_return_if_fail(acct_name);
317 if (! qif_file_needs_account(ctx))
return;
319 acct = find_or_make_acct(ctx, g_strdup(acct_name),
320 qif_parse_acct_type_guess(ctx->parse_type));
322 qif_object_list_foreach(ctx, QIF_O_TXN, set_txn_acct, acct);
324 qif_clear_flag(ctx->parse_flags, QIF_F_TXN_NEEDS_ACCT);
325 qif_clear_flag(ctx->parse_flags, QIF_F_ITXN_NEEDS_ACCT);
#define PERR(format, args...)
All type declarations for the whole Gnucash engine.
const gchar * QofLogModule