[PATCH] Rewrite show_location to use membuffer primitives

Dirk Hohndel dirk at hohndel.org
Thu May 8 12:23:46 PDT 2014


While I didn't take this for 4.1 (I guess I should), I just applied it
to master.

Thanks Anton

/D

On Wed, 2014-05-07 at 00:30 +0200, Anton Lundin wrote:
> This simplifies the logic and doesn't rely on show_utf8 to print empty
> blocks.
> 
> Signed-off-by: Anton Lundin <glance at acc.umu.se>
> ---
>  save-xml.c | 58 ++++++++++++++--------------------------------------------
>  1 file changed, 14 insertions(+), 44 deletions(-)
> 
> diff --git a/save-xml.c b/save-xml.c
> index dc13fa2..b582fcf 100644
> --- a/save-xml.c
> +++ b/save-xml.c
> @@ -143,43 +143,17 @@ static void save_salinity(struct membuffer *b, struct divecomputer *dc)
>  	put_string(b, " />\n");
>  }
>  
> -/*
> - * Format degrees to within 6 decimal places. That's about 0.1m
> - * on a great circle (ie longitude at equator). And micro-degrees
> - * is also enough to fit in a fixed-point 32-bit integer.
> - */
> -static int format_degrees(char *buffer, degrees_t value)
> -{
> -	int udeg = value.udeg;
> -	const char *sign = "";
> -
> -	if (udeg < 0) {
> -		sign = "-";
> -		udeg = -udeg;
> -	}
> -	return sprintf(buffer, "%s%u.%06u",
> -		       sign, udeg / 1000000, udeg % 1000000);
> -}
> -
> -static int format_location(char *buffer, degrees_t latitude, degrees_t longitude)
> -{
> -	int len = sprintf(buffer, "gps='");
> -
> -	len += format_degrees(buffer + len, latitude);
> -	buffer[len++] = ' ';
> -	len += format_degrees(buffer + len, longitude);
> -	buffer[len++] = '\'';
> -
> -	return len;
> -}
> -
>  static void show_location(struct membuffer *b, struct dive *dive)
>  {
> -	char buffer[80];
> -	const char *prefix = "  <location>";
>  	degrees_t latitude = dive->latitude;
>  	degrees_t longitude = dive->longitude;
>  
> +	/* Should we write a location tag at all? */
> +	if (!(latitude.udeg || longitude.udeg) && !dive->location)
> +		return;
> +
> +	put_string(b, "  <location");
> +
>  	/*
>  	 * Ok, theoretically I guess you could dive at
>  	 * exactly 0,0. But we don't support that. So
> @@ -187,19 +161,15 @@ static void show_location(struct membuffer *b, struct dive *dive)
>  	 * you dove a few meters away.
>  	 */
>  	if (latitude.udeg || longitude.udeg) {
> -		int len = sprintf(buffer, "  <location ");
> -
> -		len += format_location(buffer + len, latitude, longitude);
> -		if (!dive->location || dive->location[0] == '\0') {
> -			memcpy(buffer + len, "/>\n\0", 5);
> -			put_string(b, buffer);
> -			return;
> -		}
> -		buffer[len++] = '>';
> -		buffer[len] = 0;
> -		prefix = buffer;
> +		put_degrees(b, latitude, " gps='", " ");
> +		put_degrees(b, longitude, "", "'");
>  	}
> -	show_utf8(b, dive->location, prefix, "</location>\n", 0);
> +
> +	/* Do we have a location name or should we write a empty tag? */
> +	if (dive->location && dive->location[0] != '\0')
> +		show_utf8(b, dive->location, ">", "</location>\n", 0);
> +	else
> +		put_string(b, "/>\n");
>  }
>  
>  static void save_overview(struct membuffer *b, struct dive *dive)




More information about the subsurface mailing list