summaryrefslogtreecommitdiff
path: root/src/textual.cc
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2010-03-17 02:40:42 -0400
committerJohn Wiegley <johnw@newartisans.com>2010-03-17 02:40:42 -0400
commit8dd362b57cf2b49c5268e72898ae873522d8756f (patch)
tree4c5741d682e89b1ea4e567c32a78d32ba17737db /src/textual.cc
parent36b616da5e0e2b31138e05d347b0ff3599467c00 (diff)
downloadfork-ledger-8dd362b57cf2b49c5268e72898ae873522d8756f.tar.gz
fork-ledger-8dd362b57cf2b49c5268e72898ae873522d8756f.tar.bz2
fork-ledger-8dd362b57cf2b49c5268e72898ae873522d8756f.zip
The include directive now supports file globbing
This only happens at the base filename, not for any of the directory names for now.
Diffstat (limited to 'src/textual.cc')
-rw-r--r--src/textual.cc38
1 files changed, 33 insertions, 5 deletions
diff --git a/src/textual.cc b/src/textual.cc
index 0a2166f8..dfca7943 100644
--- a/src/textual.cc
+++ b/src/textual.cc
@@ -665,14 +665,42 @@ void instance_t::include_directive(char * line)
filename = resolve_path(filename);
DEBUG("textual.include", "resolved path: " << filename.string());
- if (! exists(filename))
+ mask_t glob;
+#if BOOST_VERSION >= 103700
+ path parent_path = filename.parent_path();
+ glob.assign_glob(filename.filename());
+#else // BOOST_VERSION >= 103700
+ path parent_path = filename.branch_path();
+ glob.assign_glob(filename.leaf());
+#endif // BOOST_VERSION >= 103700
+
+ bool files_found = false;
+ if (exists(parent_path)) {
+ filesystem::directory_iterator end;
+ for (filesystem::directory_iterator iter(parent_path);
+ iter != end;
+ ++iter) {
+ if (is_regular_file(*iter)) {
+#if BOOST_VERSION >= 103700
+ string base = (*iter).filename();
+#else // BOOST_VERSION >= 103700
+ string base = (*iter).leaf();
+#endif // BOOST_VERSION >= 103700
+ if (glob.match(base)) {
+ path inner_file(*iter);
+ ifstream stream(inner_file);
+ instance_t instance(context, stream, master, &inner_file, this);
+ instance.parse();
+ files_found = true;
+ }
+ }
+ }
+ }
+
+ if (! files_found)
throw_(std::runtime_error,
_("File to include was not found: '%1'") << filename);
- ifstream stream(filename);
-
- instance_t instance(context, stream, master, &filename, this);
- instance.parse();
}
void instance_t::master_account_directive(char * line)