diff options
Diffstat (limited to 'gnuradio-runtime/lib/pmt/pmt_io.cc')
-rw-r--r-- | gnuradio-runtime/lib/pmt/pmt_io.cc | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/gnuradio-runtime/lib/pmt/pmt_io.cc b/gnuradio-runtime/lib/pmt/pmt_io.cc new file mode 100644 index 0000000000..17bdee408f --- /dev/null +++ b/gnuradio-runtime/lib/pmt/pmt_io.cc @@ -0,0 +1,169 @@ +/* -*- c++ -*- */ +/* + * Copyright 2006,2009 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 this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <vector> +#include <pmt/pmt.h> +#include "pmt_int.h" +#include <sstream> +#include <iostream> + +namespace pmt { + +static void +write_list_tail(pmt_t obj, std::ostream &port) +{ + write(car(obj), port); // write the car + obj = cdr(obj); // step to cdr + + if (is_null(obj)) // () + port << ")"; + + else if (is_pair(obj)){ // normal list + port << " "; + write_list_tail(obj, port); + } + else { // dotted pair + port << " . "; + write(obj, port); + port << ")"; + } +} + +void +write(pmt_t obj, std::ostream &port) +{ + if (is_bool(obj)){ + if (is_true(obj)) + port << "#t"; + else + port << "#f"; + } + else if (is_symbol(obj)){ + port << symbol_to_string(obj); + } + else if (is_number(obj)){ + if (is_integer(obj)) + port << to_long(obj); + else if (is_uint64(obj)) + port << to_uint64(obj); + else if (is_real(obj)) + port << to_double(obj); + else if (is_complex(obj)){ + std::complex<double> c = to_complex(obj); + port << c.real() << '+' << c.imag() << 'i'; + } + else + goto error; + } + else if (is_null(obj)){ + port << "()"; + } + else if (is_pair(obj)){ + port << "("; + write_list_tail(obj, port); + } + else if (is_tuple(obj)){ + port << "{"; + size_t len = length(obj); + if (len > 0){ + port << tuple_ref(obj, 0); + for (size_t i = 1; i < len; i++) + port << " " << tuple_ref(obj, i); + } + port << "}"; + } + else if (is_vector(obj)){ + port << "#("; + size_t len = length(obj); + if (len > 0){ + port << vector_ref(obj, 0); + for (size_t i = 1; i < len; i++) + port << " " << vector_ref(obj, i); + } + port << ")"; + } + else if (is_dict(obj)){ + // FIXME + // port << "#<dict " << obj << ">"; + port << "#<dict>"; + } + else if (is_uniform_vector(obj)){ + // FIXME + // port << "#<uniform-vector " << obj << ">"; + port << "#<uniform-vector>"; + } + else { + error: + // FIXME + // port << "#<" << obj << ">"; + port << "#<unknown>"; + } +} + +std::ostream& operator<<(std::ostream &os, pmt_t obj) +{ + write(obj, os); + return os; +} + +std::string +write_string(pmt_t obj) +{ + std::ostringstream s; + s << obj; + return s.str(); +} + +pmt_t +read(std::istream &port) +{ + throw notimplemented("notimplemented: pmt::read", PMT_NIL); +} + +void +serialize(pmt_t obj, std::ostream &sink) +{ + throw notimplemented("notimplemented: pmt::serialize", obj); +} + +/*! + * \brief Create obj from portable byte-serial representation + */ +pmt_t +deserialize(std::istream &source) +{ + throw notimplemented("notimplemented: pmt::deserialize", PMT_NIL); +} + +} /* namespace pmt */ + + +void +pmt::print(pmt_t v) +{ + std::cout << write_string(v) << std::endl; +} + + |