+++ /dev/null
-From 8a7a76b7dcc94e8e71725e26a146330c73377ebd Mon Sep 17 00:00:00 2001
-From: Alexandre Rostovtsev <tetromino@gmail.com>
-Date: Mon, 26 Sep 2011 04:46:44 -0400
-Subject: [PATCH 2/2] Switch LC_NUMERIC locale to "C" for decimal point
- separator safety
-
-Make sure to switch the LC_NUMERIC locale to "C" when using strtod() and
-fpritnf("%g",...) to ensure that '.' is used as the decimal point
-separator when reading and writing .ply files.
----
- rply.c | 31 +++++++++++++++++++++++++++----
- 1 files changed, 27 insertions(+), 4 deletions(-)
-
-diff --git a/rply.c b/rply.c
-index 9eaa77f..789c002 100644
---- a/rply.c
-+++ b/rply.c
-@@ -12,6 +12,7 @@
- #include <string.h>
- #include <limits.h>
- #include <float.h>
-+#include <locale.h>
- #include <stdarg.h>
- #include <stdlib.h>
- #include <stddef.h>
-@@ -1229,13 +1230,27 @@ static int oascii_uint32(p_ply ply, double value) {
- }
-
- static int oascii_float32(p_ply ply, double value) {
-+ char *curr_locale;
-+ int ret;
- if (value < -FLT_MAX || value > FLT_MAX) return 0;
-- return fprintf(ply->fp, "%g ", (float) value) > 0;
-+ /* Switch locale to C to use '.' as the decimal point separator */
-+ curr_locale = setlocale(LC_NUMERIC, NULL);
-+ setlocale(LC_NUMERIC, "C");
-+ ret = fprintf(ply->fp, "%g ", (float) value);
-+ setlocale(LC_NUMERIC, curr_locale);
-+ return ret > 0;
- }
-
- static int oascii_float64(p_ply ply, double value) {
-+ char *curr_locale;
-+ int ret;
- if (value < -DBL_MAX || value > DBL_MAX) return 0;
-- return fprintf(ply->fp, "%g ", value) > 0;
-+ /* Switch locale to C to use '.' as the decimal point separator */
-+ curr_locale = setlocale(LC_NUMERIC, NULL);
-+ setlocale(LC_NUMERIC, "C");
-+ ret = fprintf(ply->fp, "%g ", value);
-+ setlocale(LC_NUMERIC, curr_locale);
-+ return ret > 0;
- }
-
- static int obinary_int8(p_ply ply, double value) {
-@@ -1336,17 +1351,25 @@ static int iascii_uint32(p_ply ply, double *value) {
- }
-
- static int iascii_float32(p_ply ply, double *value) {
-- char *end;
-+ char *end, *curr_locale;
- if (!ply_read_word(ply)) return 0;
-+ /* Switch locale to C to use '.' as the decimal point separator */
-+ curr_locale = setlocale(LC_NUMERIC, NULL);
-+ setlocale(LC_NUMERIC, "C");
- *value = strtod(BWORD(ply), &end);
-+ setlocale(LC_NUMERIC, curr_locale);
- if (*end || *value < -FLT_MAX || *value > FLT_MAX) return 0;
- return 1;
- }
-
- static int iascii_float64(p_ply ply, double *value) {
-- char *end;
-+ char *end, *curr_locale;
- if (!ply_read_word(ply)) return 0;
-+ /* Switch locale to C to use '.' as the decimal point separator */
-+ curr_locale = setlocale(LC_NUMERIC, NULL);
-+ setlocale(LC_NUMERIC, "C");
- *value = strtod(BWORD(ply), &end);
-+ setlocale(LC_NUMERIC, curr_locale);
- if (*end || *value < -DBL_MAX || *value > DBL_MAX) return 0;
- return 1;
- }
---
-1.7.6.1
-
+++ /dev/null
-From eeb09032068baed6d81cff01cdfcccd6d55a8152 Mon Sep 17 00:00:00 2001
-From: Alexandre Rostovtsev <tetromino@gmail.com>
-Date: Mon, 26 Sep 2011 04:45:49 -0400
-Subject: [PATCH 1/2] Use stdint.h types
-
-Use stdint.h types (int16_t and int32_t) instead of assuming that short
-and long must always a specific number of bytes. Also, use strtoul for
-reading uint32_t values.
----
- rply.c | 61 ++++++++++++++++++++++++++++---------------------------------
- 1 files changed, 28 insertions(+), 33 deletions(-)
-
-diff --git a/rply.c b/rply.c
-index 042244f..9eaa77f 100644
---- a/rply.c
-+++ b/rply.c
-@@ -15,6 +15,7 @@
- #include <stdarg.h>
- #include <stdlib.h>
- #include <stddef.h>
-+#include <stdint.h>
-
- #include "rply.h"
-
-@@ -1183,18 +1184,12 @@ static e_ply_storage_mode ply_arch_endian(void) {
- static int ply_type_check(void) {
- assert(sizeof(char) == 1);
- assert(sizeof(unsigned char) == 1);
-- assert(sizeof(short) == 2);
-- assert(sizeof(unsigned short) == 2);
-- assert(sizeof(long) == 4);
-- assert(sizeof(unsigned long) == 4);
-+ assert(sizeof(long) >= 4);
- assert(sizeof(float) == 4);
- assert(sizeof(double) == 8);
- if (sizeof(char) != 1) return 0;
- if (sizeof(unsigned char) != 1) return 0;
-- if (sizeof(short) != 2) return 0;
-- if (sizeof(unsigned short) != 2) return 0;
-- if (sizeof(long) != 4) return 0;
-- if (sizeof(unsigned long) != 4) return 0;
-+ if (sizeof(long) < 4) return 0;
- if (sizeof(float) != 4) return 0;
- if (sizeof(double) != 8) return 0;
- return 1;
-@@ -1214,23 +1209,23 @@ static int oascii_uint8(p_ply ply, double value) {
- }
-
- static int oascii_int16(p_ply ply, double value) {
-- if (value > SHRT_MAX || value < SHRT_MIN) return 0;
-- return fprintf(ply->fp, "%d ", (short) value) > 0;
-+ if (value > INT16_MAX || value < INT16_MIN) return 0;
-+ return fprintf(ply->fp, "%d ", (int16_t) value) > 0;
- }
-
- static int oascii_uint16(p_ply ply, double value) {
-- if (value > USHRT_MAX || value < 0) return 0;
-- return fprintf(ply->fp, "%d ", (unsigned short) value) > 0;
-+ if (value > UINT16_MAX || value < 0) return 0;
-+ return fprintf(ply->fp, "%d ", (uint16_t) value) > 0;
- }
-
- static int oascii_int32(p_ply ply, double value) {
-- if (value > LONG_MAX || value < LONG_MIN) return 0;
-- return fprintf(ply->fp, "%d ", (int) value) > 0;
-+ if (value > INT32_MAX || value < INT32_MIN) return 0;
-+ return fprintf(ply->fp, "%d ", (int32_t) value) > 0;
- }
-
- static int oascii_uint32(p_ply ply, double value) {
-- if (value > ULONG_MAX || value < 0) return 0;
-- return fprintf(ply->fp, "%d ", (unsigned int) value) > 0;
-+ if (value > UINT32_MAX || value < 0) return 0;
-+ return fprintf(ply->fp, "%d ", (uint32_t) value) > 0;
- }
-
- static int oascii_float32(p_ply ply, double value) {
-@@ -1256,26 +1251,26 @@ static int obinary_uint8(p_ply ply, double value) {
- }
-
- static int obinary_int16(p_ply ply, double value) {
-- short int16 = (short) value;
-- if (value > SHRT_MAX || value < SHRT_MIN) return 0;
-+ int16_t int16 = value;
-+ if (value > INT16_MAX || value < INT16_MIN) return 0;
- return ply->odriver->ochunk(ply, &int16, sizeof(int16));
- }
-
- static int obinary_uint16(p_ply ply, double value) {
-- unsigned short uint16 = (unsigned short) value;
-- if (value > USHRT_MAX || value < 0) return 0;
-+ uint16_t uint16 = value;
-+ if (value > UINT16_MAX || value < 0) return 0;
- return ply->odriver->ochunk(ply, &uint16, sizeof(uint16));
- }
-
- static int obinary_int32(p_ply ply, double value) {
-- long int32 = (long) value;
-- if (value > LONG_MAX || value < LONG_MIN) return 0;
-+ int32_t int32 = value;
-+ if (value > INT32_MAX || value < INT32_MIN) return 0;
- return ply->odriver->ochunk(ply, &int32, sizeof(int32));
- }
-
- static int obinary_uint32(p_ply ply, double value) {
-- unsigned long uint32 = (unsigned long) value;
-- if (value > ULONG_MAX || value < 0) return 0;
-+ uint32_t uint32 = value;
-+ if (value > UINT32_MAX || value < 0) return 0;
- return ply->odriver->ochunk(ply, &uint32, sizeof(uint32));
- }
-
-@@ -1312,7 +1307,7 @@ static int iascii_int16(p_ply ply, double *value) {
- char *end;
- if (!ply_read_word(ply)) return 0;
- *value = strtol(BWORD(ply), &end, 10);
-- if (*end || *value > SHRT_MAX || *value < SHRT_MIN) return 0;
-+ if (*end || *value > INT16_MAX || *value < INT16_MIN) return 0;
- return 1;
- }
-
-@@ -1320,7 +1315,7 @@ static int iascii_uint16(p_ply ply, double *value) {
- char *end;
- if (!ply_read_word(ply)) return 0;
- *value = strtol(BWORD(ply), &end, 10);
-- if (*end || *value > USHRT_MAX || *value < 0) return 0;
-+ if (*end || *value > UINT16_MAX || *value < 0) return 0;
- return 1;
- }
-
-@@ -1328,15 +1323,15 @@ static int iascii_int32(p_ply ply, double *value) {
- char *end;
- if (!ply_read_word(ply)) return 0;
- *value = strtol(BWORD(ply), &end, 10);
-- if (*end || *value > LONG_MAX || *value < LONG_MIN) return 0;
-+ if (*end || *value > INT32_MAX || *value < INT32_MIN) return 0;
- return 1;
- }
-
- static int iascii_uint32(p_ply ply, double *value) {
- char *end;
- if (!ply_read_word(ply)) return 0;
-- *value = strtol(BWORD(ply), &end, 10);
-- if (*end || *value < 0) return 0;
-+ *value = strtoul(BWORD(ply), &end, 10);
-+ if (*end || *value > UINT32_MAX || *value < 0) return 0;
- return 1;
- }
-
-@@ -1371,28 +1366,28 @@ static int ibinary_uint8(p_ply ply, double *value) {
- }
-
- static int ibinary_int16(p_ply ply, double *value) {
-- short int16;
-+ int16_t int16;
- if (!ply->idriver->ichunk(ply, &int16, sizeof(int16))) return 0;
- *value = int16;
- return 1;
- }
-
- static int ibinary_uint16(p_ply ply, double *value) {
-- unsigned short uint16;
-+ uint16_t uint16;
- if (!ply->idriver->ichunk(ply, &uint16, sizeof(uint16))) return 0;
- *value = uint16;
- return 1;
- }
-
- static int ibinary_int32(p_ply ply, double *value) {
-- long int32;
-+ int32_t int32;
- if (!ply->idriver->ichunk(ply, &int32, sizeof(int32))) return 0;
- *value = int32;
- return 1;
- }
-
- static int ibinary_uint32(p_ply ply, double *value) {
-- unsigned long uint32;
-+ uint32_t uint32;
- if (!ply->idriver->ichunk(ply, &uint32, sizeof(uint32))) return 0;
- *value = uint32;
- return 1;
---
-1.7.6.1
-