diff options
| author | Přemysl Janouch <p.janouch@gmail.com> | 2017-05-21 10:33:04 +0200 | 
|---|---|---|
| committer | Přemysl Janouch <p.janouch@gmail.com> | 2017-05-21 13:19:48 +0200 | 
| commit | 792deba5f3953b5dae44e0e0639444b83b7bc43b (patch) | |
| tree | 8aab43935b5b436f23089d64eb1fb8b991cfbf4a | |
| parent | 9eb2967340cf35abebb6bc39be4bcd5fd73f866c (diff) | |
| download | ell-792deba5f3953b5dae44e0e0639444b83b7bc43b.tar.gz ell-792deba5f3953b5dae44e0e0639444b83b7bc43b.tar.xz ell-792deba5f3953b5dae44e0e0639444b83b7bc43b.zip | |
Omit trailing zeros when not necessary
| -rwxr-xr-x | ell.c | 30 | 
1 files changed, 15 insertions, 15 deletions
| @@ -888,18 +888,18 @@ execute (struct context *ctx, struct item *body, struct item **result) {  #define defn(name) static bool name \  	(struct context *ctx, struct item *args, struct item **result) -static struct item *new_format (const char *fmt, ...) ATTRIBUTE_PRINTF (1, 2); -  static struct item * -new_format (const char *fmt, ...) { -	va_list ap; -	va_start (ap, fmt); -	char *s = vformat (fmt, ap); -	va_end (ap); - -	if (!s) +new_number (double n) { +	char *s; +	if (!(s = format ("%f", n)))  		return NULL; +	char *p = strchr (s, 0); +	while (--p > s && *p == '0') +		*p = 0; +	if (*p == '.') +		*p = 0; +  	struct item *item = new_string (s, strlen (s));  	free (s);  	return item; @@ -1090,7 +1090,7 @@ defn (fn_system) {  		return set_error (ctx, "first argument must be string");  	if (command->next)  		return set_error (ctx, "cannot deal with multiple arguments"); -	return check (ctx, (*result = new_format ("%d", system (command->value)))); +	return check (ctx, (*result = new_number (system (command->value))));  }  defn (fn_plus) { @@ -1100,17 +1100,17 @@ defn (fn_plus) {  			return set_error (ctx, "arguments must be strings");  		res += strtod (args->value, NULL);  	} -	return check (ctx, (*result = new_format ("%f", res))); +	return check (ctx, (*result = new_number (res)));  }  defn (fn_minus) { -	double res = -0.0; +	double res = 0.0;  	for (; args; args = args->next) {  		if (args->type != ITEM_STRING)  			return set_error (ctx, "arguments must be strings");  		res -= strtod (args->value, NULL);  	} -	return check (ctx, (*result = new_format ("%f", res))); +	return check (ctx, (*result = new_number (res)));  }  defn (fn_multiply) { @@ -1120,7 +1120,7 @@ defn (fn_multiply) {  			return set_error (ctx, "arguments must be strings");  		res *= strtod (args->value, NULL);  	} -	return check (ctx, (*result = new_format ("%f", res))); +	return check (ctx, (*result = new_number (res)));  }  defn (fn_divide) { @@ -1134,7 +1134,7 @@ defn (fn_divide) {  			return set_error (ctx, "division by zero");  		res /= x;  	} -	return check (ctx, (*result = new_format ("%f", res))); +	return check (ctx, (*result = new_number (res)));  }  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 
