From 81534626cc87c4c6b050f9166c0c75fd61d3d53e Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Mon, 4 Aug 2014 09:50:56 +1000 Subject: rtems-tld: Add recursive parsing of headers and defines. --- rld.h | 2 +- rtems-tld.cpp | 43 ++++++++++++++++++++++++++++++++++++++++--- rtems.ini | 6 +++--- test-trace.ini | 8 +++++++- 4 files changed, 51 insertions(+), 8 deletions(-) diff --git a/rld.h b/rld.h index e1cfbf5..70a6913 100644 --- a/rld.h +++ b/rld.h @@ -175,7 +175,7 @@ namespace rld { if (e.front () != e.back ()) throw rld::error ("invalid quoting", "string: " + s); - e = e.substr (1, e.length () - 1); + e = e.substr (1, e.length () - (1 + 1)); } } if (empty || !e.empty ()) diff --git a/rtems-tld.cpp b/rtems-tld.cpp index 4f17fba..ede5d10 100644 --- a/rtems-tld.cpp +++ b/rtems-tld.cpp @@ -120,6 +120,16 @@ namespace rld wrapper (const std::string& name, rld::config::config& config); + /** + * Recursive parser for strings. + */ + void parse (rld::config::config& config, + const rld::config::section& section, + const std::string& sec_name, + const std::string& rec_name, + rld::strings& items, + int depth = 0); + /** * Dump the wrapper. */ @@ -261,11 +271,12 @@ namespace rld */ const rld::config::section& section = config.get_section (name); + parse (config, section, "headers", "header", headers); + parse (config, section, "defines", "define", defines); + rld::strings sig_list; - rld::config::parse_items (section, "header", headers); - rld::config::parse_items (section, "define", defines); - rld::config::parse_items (section, "signature", sig_list); + rld::config::parse_items (section, "signatures", sig_list); for (rld::strings::const_iterator sli = sig_list.begin (); sli != sig_list.end (); @@ -282,6 +293,32 @@ namespace rld } } + void + wrapper::parse (rld::config::config& config, + const rld::config::section& section, + const std::string& sec_name, + const std::string& rec_name, + rld::strings& items, + int depth) + { + if (depth > 32) + throw rld::error ("too deep", "parsing: " + sec_name + '/' + rec_name); + + rld::config::parse_items (section, rec_name, items); + + rld::strings sl; + + rld::config::parse_items (section, sec_name, sl); + + for (rld::strings::const_iterator sli = sl.begin (); + sli != sl.end (); + ++sli) + { + const rld::config::section& sec = config.get_section (*sli); + parse (config, sec, sec_name, rec_name, items, depth + 1); + } + } + void wrapper::dump (std::ostream& out) const { diff --git a/rtems.ini b/rtems.ini index cd59f72..f2de480 100644 --- a/rtems.ini +++ b/rtems.ini @@ -2,9 +2,9 @@ ; RTEMS API Trace Configurations ; [rtems-api] -header = rtems-api-headers -define = rtems-api-defines -signature = rtems-api-signatures +headers = rtems-api-headers +defines = rtems-api-defines +signatures = rtems-api-signatures [rtems-api-headers] header = "#include " diff --git a/test-trace.ini b/test-trace.ini index 2901952..b4e2306 100644 --- a/test-trace.ini +++ b/test-trace.ini @@ -35,7 +35,13 @@ trace = test_trace_1, test_trace_2 trace = test_trace_3 header = '#include "test-trace.h"' define = "#define TEST_TRACE 1" -signature = test-signatures +signatures = test-signatures + +[test-headers] +header = '#include "test-trace.h"' + +[test-defines] +define = "#define TEST_TRACE 1" [test-signatures] test_trace_1 = void, int -- cgit v1.2.3