diff options
Diffstat (limited to 'gr-run-waveform/xyzzy.h')
-rw-r--r-- | gr-run-waveform/xyzzy.h | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/gr-run-waveform/xyzzy.h b/gr-run-waveform/xyzzy.h new file mode 100644 index 000000000..5bce79969 --- /dev/null +++ b/gr-run-waveform/xyzzy.h @@ -0,0 +1,128 @@ +/* -*- c++ -*- */ +/* + * Copyright 2010 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef _XYZZY_H_ +#define _XYZZY_H_ 1 + + +#include <libguile.h> + +#ifdef __cplusplus + +#include <cstdio> +#include <cstdlib> +#include <string> +#include <map> +#include <vector> +#include <iostream> +#include <fstream> +#include <boost/cstdint.hpp> +#include <boost/shared_ptr.hpp> +#include <boost/scoped_ptr.hpp> + +using namespace std; + +// - Special case filenames that start with /-xyzzy-/... and search for +// and load them using the single file. We'd stick "/-zyzzy-" first +// in the default load-path. + +// - Create a C read-only "port" that "reads" from the string in the file. +// (See guile docs on creating new kinds of ports) + +// - Override the default implementation of "primitive-load" and "%search-load-path" +// to make that happen. See load.c in the guile source code. Figure +// out how to get the override done before guile is fully +// initialized. (Guile loads ice-9/boot9.scm to start itself up. We'd +// need to redirect before then.) + +struct header { + char magic[8]; + + boost::uint32_t offset_to_directory; // byte offset from start of file + boost::uint32_t size_of_directory; // bytes + boost::uint32_t number_of_dir_entries; + + boost::uint32_t offset_to_strings; // byte offset from start of file + boost::uint32_t size_of_strings; // bytes +}; + +struct directory_entry { + boost::uint32_t offset_to_name; // from start of strings + boost::uint32_t offset_to_contents; // from start of strings +}; + +// Each string starts with a uint32_t length, followed by length bytes. +// There is no trailing \0 in the string. +struct string_entry { + boost::uint32_t length; + boost::uint8_t *base; +}; + +class XYZZY { +public: + XYZZY(); + ~XYZZY(); + + // Initialize with the data file produced by gen-xyzzy. + bool init(); + bool init(const std::string &filespec); + + // Does a file with name 'filename' exist in magic filesystem? + bool file_exists(const std::string &filespec); + + /// Parse a string data structure + static std::string read_string(boost::uint8_t *entry, size_t length); + static std::string read_string(struct string_entry &entry); + static std::string read_string(std::ifstream &stream); + + // Read the header of the datafile + boost::shared_ptr<struct header> read_header(boost::uint8_t *header); + + boost::shared_ptr<struct directory_entry> read_dir_entry(boost::uint8_t *header); + + std::string &get_contents(const std::string &filespec) { return _contents[filespec]; }; + +private: + std::string _filespec; + std::map<std::string, std::string> _contents; +}; + +// C linkage bindings for Guile +extern "C" { +#endif + +void scm_xyzzy_init (void); + +// Initialize with the data file produced by gen-xyzzy. +int xyzzy_init(const char *filename); + +// Does a file with name 'filename' exist in magic filesystem? +int xyzzy_file_exists(const char *filename); + +// Return a readonly port that accesses filename. +SCM xyzzy_open_file (SCM filename); + +#ifdef __cplusplus +} // end of extern C +#endif + +#endif // _XYZZY_H_ 1 |