/*
* Copyright (C) 2009 Rich Burridge
* Copyright (C) 2012 Robert Ancell
*
* This program 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 of the License, or (at your option) any later
* version. See http://www.gnu.org/copyleft/gpl.html the full text of the
* license.
*/
private const int MAXLINE = 1024;
private static Serializer result_serializer;
static void solve (string equation)
{
var tsep_string = Posix.nl_langinfo (Posix.NLItem.THOUSEP);
if (tsep_string == null || tsep_string == "")
tsep_string = " ";
var decimal = Posix.nl_langinfo (Posix.NLItem.RADIXCHAR);
if (decimal == null)
decimal = "";
string? error_token = null;
var e = new Equation (equation.replace (tsep_string, "").replace (decimal, "."));
e.base = 10;
e.wordlen = 32;
e.angle_units = AngleUnit.DEGREES;
ErrorCode ret;
uint representation_base;
var z = e.parse (out representation_base, out ret, out error_token);
result_serializer.set_representation_base (representation_base);
if (z != null)
{
var str = result_serializer.to_string (z);
if (result_serializer.error != null)
{
stderr.printf ("%s\n", result_serializer.error);
result_serializer.error = null;
}
else
stdout.printf ("%s\n", str);
}
else if (ret == ErrorCode.MP)
stderr.printf ("Error %s\n", (Number.error != null) ? Number.error : error_token);
else
stderr.printf ("Error %d\n", ret);
}
public static int main (string[] args)
{
/* Seed random number generator. */
var now = new DateTime.now_utc ();
bool requires_new_line = false;
Random.set_seed (now.get_microsecond ());
Intl.setlocale (LocaleCategory.ALL, "");
result_serializer = new Serializer (DisplayFormat.AUTOMATIC, 10, 9);
if (args.length == 2) {
solve (args[1]);
return Posix.EXIT_SUCCESS;
}
var buffer = new char[1024];
while (true)
{
stdout.printf ("> ");
var line = stdin.gets (buffer);
if (line != null)
line = line.strip ();
else
requires_new_line = true;
if (line == null || line == "exit" || line == "quit" || line == "")
break;
solve (line);
}
if (requires_new_line)
stdout.printf ("\n");
return Posix.EXIT_SUCCESS;
}