Fix compilation with bionic libc

Refactor out a cairo_get_locale_decimal_point() routine to handle a case
where localeconv() is not available.

Fixes:  https://bugs.freedesktop.org/show_bug.cgi?id=70492
Reviewed-by: Bryce Harrington <b.harrington@samsung.com>

[edit:  Condensed cairo_get_locale_decimal_point and conditionalized
locale.h inclusion.  -- bryce]
This commit is contained in:
Adrian Johnson 2014-03-24 19:08:10 +10:30 committed by Bryce Harrington
parent a02e29a12d
commit 9a19ef1858
5 changed files with 24 additions and 11 deletions

View file

@ -295,7 +295,6 @@ decode_nibble (int n, char *buf)
static unsigned char *
decode_real (unsigned char *p, double *real)
{
struct lconv *locale_data;
const char *decimal_point;
int decimal_point_len;
int n;
@ -305,8 +304,7 @@ decode_real (unsigned char *p, double *real)
char *buf = buffer;
char *buf_end = buffer + sizeof (buffer);
locale_data = localeconv ();
decimal_point = locale_data->decimal_point;
decimal_point = cairo_get_locale_decimal_point ();
decimal_point_len = strlen (decimal_point);
assert (decimal_point_len != 0);

View file

@ -759,6 +759,24 @@ _cairo_half_from_float (float f)
}
}
#ifndef __BIONIC__
# include <locale.h>
const char *
cairo_get_locale_decimal_point (void)
{
struct lconv *locale_data = localeconv ();
return locale_data->decimal_point;
}
#else
/* Android's Bionic libc doesn't provide decimal_point */
const char *
cairo_get_locale_decimal_point (void)
{
return '.';
}
#endif
#ifdef _WIN32

View file

@ -43,7 +43,6 @@
#include "cairo-compiler-private.h"
#include <stdio.h>
#include <locale.h>
#include <errno.h>
/* Numbers printed with %f are printed with this number of significant
@ -303,7 +302,6 @@ _cairo_output_stream_write_hex_string (cairo_output_stream_t *stream,
static void
_cairo_dtostr (char *buffer, size_t size, double d, cairo_bool_t limited_precision)
{
struct lconv *locale_data;
const char *decimal_point;
int decimal_point_len;
char *p;
@ -314,8 +312,7 @@ _cairo_dtostr (char *buffer, size_t size, double d, cairo_bool_t limited_precisi
if (d == 0.0)
d = 0.0;
locale_data = localeconv ();
decimal_point = locale_data->decimal_point;
decimal_point = cairo_get_locale_decimal_point ();
decimal_point_len = strlen (decimal_point);
assert (decimal_point_len != 0);

View file

@ -53,7 +53,6 @@
#include "cairo-output-stream-private.h"
#include <ctype.h>
#include <locale.h>
#define TYPE1_STACKSIZE 24 /* Defined in Type 1 Font Format */
@ -309,12 +308,10 @@ cairo_type1_font_subset_get_matrix (cairo_type1_font_subset_t *font,
const char *start, *end, *segment_end;
int ret, s_max, i, j;
char *s;
struct lconv *locale_data;
const char *decimal_point;
int decimal_point_len;
locale_data = localeconv ();
decimal_point = locale_data->decimal_point;
decimal_point = cairo_get_locale_decimal_point ();
decimal_point_len = strlen (decimal_point);
assert (decimal_point_len != 0);

View file

@ -871,6 +871,9 @@ _cairo_intern_string (const char **str_inout, int len);
cairo_private void
_cairo_intern_string_reset_static_data (void);
cairo_private const char *
cairo_get_locale_decimal_point (void);
/* cairo-path-fixed.c */
cairo_private cairo_path_fixed_t *
_cairo_path_fixed_create (void);