/*
 **************************************************************
 *         C++ Mathematical Expression Toolkit Library        *
 *                                                            *
 * Simple Example 18                                          *
 * Author: Arash Partow (1999-2016)                           *
 * URL: http://www.partow.net/programming/exprtk/index.html   *
 *                                                            *
 * Copyright notice:                                          *
 * Free use of the Mathematical Expression Toolkit Library is *
 * permitted under the guidelines and in accordance with the  *
 * most current version of the Common Public License.         *
 * http://www.opensource.org/licenses/cpl1.0.php              *
 *                                                            *
 **************************************************************
*/


#include <cstdio>
#include <string>

#include "exprtk.hpp"


template <typename T>
void file_io()
{
   typedef exprtk::symbol_table<T> symbol_table_t;
   typedef exprtk::expression<T>     expression_t;
   typedef exprtk::parser<T>             parser_t;

   std::string fileio_program =
                " var file_name := 'file.txt';                         "
                " var stream    := null;                               "
                "                                                      "
                " if (stream := open('file.txt','w'))                  "
                "   println('Successfully opened file: ' + file_name); "
                " else                                                 "
                " {                                                    "
                "   println('Failed to open file: ' + file_name);      "
                "   return [false];                                    "
                " }                                                    "
                "                                                      "
                " var s := 'Hello world...\n';                         "
                "                                                      "
                " for (var i := 0; i < 10; i += 1)                     "
                " {                                                    "
                "   write(stream,s);                                   "
                " }                                                    "
                "                                                      "
                " if (close(stream))                                   "
                "   println('Sucessfully closed file: ' + file_name);  "
                " else                                                 "
                " {                                                    "
                "   println('Failed to close file: ' + file_name);     "
                "   return [false];                                    "
                " }                                                    ";

   exprtk::rtl::io::println<T>       println;
   exprtk::rtl::io::file::package<T> package;

   symbol_table_t symbol_table;
   symbol_table.add_function("println",println);
   symbol_table.add_package (package);

   expression_t expression;
   expression.register_symbol_table(symbol_table);

   parser_t parser;
   parser.compile(fileio_program,expression);

   printf("Result %10.3f\n",expression.value());
}

int main()
{
   file_io<double>();
   return 0;
}
