X-Git-Url: https://secure.softndesign.org/git/?a=blobdiff_plain;f=format.c;h=77e3a18b3bfce0a8202a1d179b51c0aa042363da;hb=b6311fa2c6d14d644f8289cb96b5aee862956b61;hp=93000a2d462f178d33cb32841c4d5dc58b4ba80b;hpb=c58ac3e241e0732e8513790c83eb1c1d42e97700;p=calc.git diff --git a/format.c b/format.c index 93000a2..77e3a18 100644 --- a/format.c +++ b/format.c @@ -6,38 +6,133 @@ /* 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; +} + +int is_input_decimal () +{ + return (_ibase == 10); +} + +char *show_base () +{ + static char str[16] = {0}; + sprintf (str, "%d/%d", _ibase, _obase); + return str; +} + +int get_ibase () +{ + return _ibase; +} + +char *itoa (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, itoa ((unsigned int)value)); + } + return value; +} + +double printl (double value) +{ + if (_obase == 10) { + printf (_minform ? _minform : DEFAULT_MINFORM, value); + } else { + printf ("%s%s", (_prompt) ? _prompt : DEFAULT_PROMPT, itoa ((unsigned int)value)); + } return value; }