diff options
-rw-r--r-- | docs/doxygen/other/main_page.dox | 33 | ||||
-rw-r--r-- | gnuradio-runtime/lib/prefs.cc | 46 |
2 files changed, 60 insertions, 19 deletions
diff --git a/docs/doxygen/other/main_page.dox b/docs/doxygen/other/main_page.dox index e2956384f6..dde7610974 100644 --- a/docs/doxygen/other/main_page.dox +++ b/docs/doxygen/other/main_page.dox @@ -80,20 +80,20 @@ them. \code from gnuradio import gr, filter, analog - + class my_topblock(gr.top_block): def __init__(self): gr.top_block.__init__(self) - + amp = 1 taps = filter.firdes.low_pass(1, 1, 0.1, 0.01) - + self.src = analog.noise_source_c(gr.GR_GAUSSIAN, amp) self.flt = filter.fir_filter_ccf(1, taps) self.snk = blocks.null_sink(gr.sizeof_gr_complex) - + self.connect(self.src, self.flt, self.snk) - + if __name__ == "__main__": tb = my_topblock() tb.start() @@ -160,7 +160,7 @@ In some situations, you might actually want to restrict the size of the buffer itself. This can help to prevent a buffer who is blocked for data from just increasing the amount of items in its buffer, which will then cause an increased latency for new samples. You can set the -size of an output buffer for each output port for every block. +size of an output buffer for each output port for every block. WARNING: This is an advanced feature in GNU Radio and should not be used without a full understanding of this concept as explained below. @@ -305,7 +305,7 @@ def main(): tb.src1.set_max_noutput_items(2000) tb.start(100) time.sleep(0.01) - + # Stop flowgraph and disconnect the add block tb.lock() @@ -356,7 +356,7 @@ The configuration files use the following format: \code # Stuff from section 1 [section1] -var1 = value1 +var1 = value1 var2 = value2 # value of 2 # Stuff from section 2 @@ -368,9 +368,20 @@ In this file, the hash mark ('#') indicates a comment and blank lines are ignored. Section labels are defined inside square brackets as a group distinguisher. All options must be associated with a section name. The options are listed one per line with the option name is -given followed by an equals ('=') sign and then the value. All section -and option names must not have white spaces (actually, all white -spaces are ignored). +given followed by an equals ('=') sign and then the value. + +All section and option names must not have white spaces. If a value +must have white space, the it MUST be put inside quotes. Any quoted +value will have its white space preserved and the quotes internally +will be stripped. As an example, on Apple desktops, an output device +of "Display Audio" is a possible output device and can be set as: + +\code +[audio_osx] +default_output_device = "Display Audio" +\endcode + +The result will pass Display Audio to the audio setup. The value of an option can be a string or number and retrieved through a few different interfaces. There is a single preference object diff --git a/gnuradio-runtime/lib/prefs.cc b/gnuradio-runtime/lib/prefs.cc index 468532f33b..d03c6777eb 100644 --- a/gnuradio-runtime/lib/prefs.cc +++ b/gnuradio-runtime/lib/prefs.cc @@ -76,7 +76,7 @@ namespace gr { fs::directory_iterator diritr(dir); while(diritr != fs::directory_iterator()) { fs::path p = *diritr++; - if(p.extension() != ".swp") + if(p.extension() == ".conf") fnames.push_back(p.string()); } std::sort(fnames.begin(), fnames.end()); @@ -111,6 +111,40 @@ namespace gr { // remove any comments in the line size_t hash = t.find("#"); + // Remove any white space unless it's between quotes + // Search if the string has any quotes in it + size_t quote1 = t.find("\""); + if(quote1 != std::string::npos) { + // If yes, find where the start and end quotes are. + // Note that this isn't robust if there are multiple + // quoted strings in the line; this will just take the + // first and last, and if there is only a single quote, + // this will treat the entire line after the quote as the + // quoted text. + // the inq variable is strips the quotes as well. + size_t quote2 = t.find_last_of("\""); + std::string sol = t.substr(0, quote1); + std::string inq = t.substr(quote1+1, quote2-quote1-1); + std::string eol = t.substr(quote2+1, t.size()-quote2-1); + + // Remove all white space of the text before the first quote + sol.erase(std::remove_if(sol.begin(), sol.end(), + ::isspace), sol.end()); + + // Remove all white space of the text after the end quote + eol.erase(std::remove_if(eol.begin(), eol.end(), + ::isspace), eol.end()); + + // Pack the stripped start and end of lines with the part + // of the string in quotes (but without the quotes). + t = sol + inq + eol; + } + else { + // No quotes, just strip all white space + t.erase(std::remove_if(t.begin(), t.end(), + ::isspace), t.end()); + } + // Use hash marks at the end of each segment as a delimiter config += t.substr(0, hash) + '#'; } @@ -118,10 +152,6 @@ namespace gr { fin.close(); } - // Remove all whitespace. - config.erase(std::remove_if(config.begin(), config.end(), - ::isspace), config.end()); - // Convert the string into a map _convert_to_map(config); } @@ -136,11 +166,11 @@ namespace gr { size_t sec_start = sub.find("["); while(sec_start != std::string::npos) { sub = sub.substr(sec_start); - + size_t sec_end = sub.find("]"); if(sec_end == std::string::npos) throw std::runtime_error("Config file error: Mismatched section label.\n"); - + std::string sec = sub.substr(1, sec_end-1); size_t next_sec_start = sub.find("[", sec_end); std::string subsec = sub.substr(sec_end+1, next_sec_start-sec_end-2); @@ -154,7 +184,7 @@ namespace gr { while(next_opt < subsec.size()-1) { next_val = subsec.find("=", next_opt); std::string option = subsec.substr(next_opt+1, next_val-next_opt-1); - + next_opt = subsec.find("#", next_val); std::string value = subsec.substr(next_val+1, next_opt-next_val-1); |