fix some tests
[calc.git] / format.c
index 93000a2d462f178d33cb32841c4d5dc58b4ba80b..60cb1d477e6055281b578070daf7cae63bfc75d0 100644 (file)
--- a/format.c
+++ b/format.c
 
 /* global variables */
 
+int _ibase = 10;
+int _obase = 10;
+
 #define DEFAULT_FORMAT "=> %.6g\n"
-char *format = NULL;
-char *minform = NULL;
+char *_format = NULL;
+#define DEFAULT_MINFORM "%.6g"
+char *_minform = NULL;
+
+int _precision = 6;
+
+#define DEFAULT_PROMPT "=> "
+char *_prompt = NULL;
 
 /* print function */
 
-void set_format (char *prompt, int precision)
+void set_precision (int precision)
+{
+    _precision = precision;
+}
+
+int get_precision ()
+{
+    return _precision;
+}
+
+void set_prompt (char *prompt)
+{
+    if (_prompt) {
+        free (_prompt);
+    }
+    _prompt = strdup (prompt);
+}
+
+void set_format ()
 {
     char buffer[128] = {0};
-    free_format ();
-    sprintf (buffer, "%s%%.%dg\n", prompt, precision);
-    format = strdup (buffer);
-    sprintf (buffer, "%%.%dg", precision);
-    minform = strdup (buffer);
+    sprintf (buffer, "%s%%.%dg\n", _prompt ? _prompt : DEFAULT_PROMPT, _precision);
+    if (_format) {
+        free (_format);
+    }
+    _format = strdup (buffer);
+    sprintf (buffer, "%%.%dg", _precision);
+    if (_minform) {
+        free (_minform);
+    }
+    _minform = strdup (buffer);
 }
 
 void free_format ()
 {
-    if (format) {
-        free (format);
-        format = NULL;
+    if (_format) {
+        free (_format);
+        _format = NULL;
     }
-    if (minform) {
-        free (minform);
-        minform = NULL;
+    if (_minform) {
+        free (_minform);
+        _minform = NULL;
+    }
+    if (_prompt) {
+        free (_prompt);
+        _prompt = NULL;
     }
 }
 
+void set_base (int in, int out)
+{
+    _ibase = in;
+    _obase = out;
+}
+
+char *show_base ()
+{
+    static char str[16] = {0};
+    sprintf (str, "%d/%d", _ibase, _obase);
+    return str;
+}
+
+int get_ibase ()
+{
+    return _ibase;
+}
+
+/* multi base integer to ascii function */
+
+char *mbitoa (unsigned long value)
+{
+    static char str[8 * sizeof (long) + 1];
+
+    /* decompose */
+    char buffer[8 * sizeof (long) + 1] = {0};
+    int size = 0;
+    do {
+        char x = value % _obase;
+        buffer[size++] = (x > 9) ? 'a' + x - 10 : '0' + x;
+        value /= _obase;
+    } while (value != 0);
+
+    /* revert */
+    int i;
+    for (i = 0; i < size; i++) {
+        str[i] = buffer [size - i - 1];
+    }
+    str[size] = '\0';
+
+    return str;
+}
+
 double print (double value)
 {
-    fprintf (stdout, format ? format : DEFAULT_FORMAT, value);
-    fflush (stdout);
+    if (_obase == 10) {
+        printf (_format ? _format : DEFAULT_FORMAT, value);
+    } else {
+        printf ("%s%s\n", (_prompt) ? _prompt : DEFAULT_PROMPT, mbitoa ((unsigned int)value));
+    }
+    return value;
+}
+
+double printl (double value)
+{
+    if (_obase == 10) {
+        printf (_minform ? _minform : DEFAULT_MINFORM, value);
+    } else {
+        printf ("%s", mbitoa ((unsigned int)value));
+    }
     return value;
 }