blob: cb48c1e15c8254ce64a0fe8ef3e9f777889ecc86 [file] [log] [blame]
// Copyright (c) 2001-2010 Hartmut Kaiser
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <boost/config/warning_disable.hpp>
#define BOOST_SPIRIT_UNICODE
#include <iostream>
#include <fstream>
#include <iterator>
#include <input/parse_sexpr_impl.hpp>
#include <output/generate_sexpr_impl.hpp>
namespace client
{
bool parse_sexpr_from_file(char const* filename, scheme::utree& result)
{
std::ifstream in(filename, std::ios_base::in);
if (!in)
{
std::cerr << "Error: Could not open input file: "
<< filename << std::endl;
exit(-1);
}
// Ignore the BOM marking the beginning of a UTF-8 file in Windows
char c = in.peek();
if (c == '\xef')
{
char s[3];
in >> s[0] >> s[1] >> s[2];
s[3] = '\0';
if (s != std::string("\xef\xbb\xbf"))
{
std::cerr << "Error: Unexpected characters from input file: "
<< filename << std::endl;
exit(-1);
}
}
return scheme::input::parse_sexpr(in, result);
}
bool generate_sexpr_to_file(scheme::utree const& tree, char const* filename)
{
std::ofstream out(filename);
if (!out)
{
std::cerr << "Error: Could not open output file: "
<< filename << std::endl;
exit(-1);
}
return scheme::output::generate_sexpr(out, tree);
}
}
int main(int argc, char **argv)
{
char const* filename_in = NULL;
if (argc > 1)
{
filename_in = argv[1];
}
else
{
std::cerr << "Error: No input file provided." << std::endl;
return -1;
}
char const* filename_out = NULL;
if (argc > 2)
{
filename_out = argv[2];
}
else
{
std::cerr << "Error: No output file provided." << std::endl;
return -1;
}
scheme::utree result;
if (client::parse_sexpr_from_file(filename_in, result))
{
if (client::generate_sexpr_to_file(result, filename_out))
{
std::cout << "success!" << std::endl;
}
else
{
std::cout << "generate error" << std::endl;
}
}
else
{
std::cout << "parse error" << std::endl;
}
return 0;
}