const'ify our strtod() helper functions

The C library doesn't use const char pointers for legacy reasons (and
because you *can* modify the string the end pointer points to), but
let's do it in our internal implementation just because it's a nice
guarantee to have.

We actually used to have a non-const end pointer and replace a decimal
comma with a decimal dot, but that was because we didn't have the fancy
"allow commas" flags.  So by using our own strtod_flags() function, we
can now keep all the strings we parse read-only rather than modify them
as we parse them.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Linus Torvalds 2014-01-08 14:51:22 +08:00 committed by Dirk Hohndel
parent 19b982d3df
commit 2d1d78ebfe
4 changed files with 11 additions and 11 deletions

2
dive.h
View file

@ -806,7 +806,7 @@ extern void remove_weightsystem(struct dive *dive, int idx);
#define STRTOD_NO_DOT 0x02 #define STRTOD_NO_DOT 0x02
#define STRTOD_NO_COMMA 0x04 #define STRTOD_NO_COMMA 0x04
#define STRTOD_NO_EXPONENT 0x08 #define STRTOD_NO_EXPONENT 0x08
extern double strtod_flags(char *str, char **ptr, unsigned int flags); extern double strtod_flags(const char *str, const char **ptr, unsigned int flags);
#define STRTOD_ASCII (STRTOD_NO_COMMA) #define STRTOD_ASCII (STRTOD_NO_COMMA)

View file

@ -263,7 +263,7 @@ enum number_type {
FLOAT FLOAT
}; };
static enum number_type parse_float(char *buffer, double *res, char **endp) static enum number_type parse_float(const char *buffer, double *res, const char **endp)
{ {
double val; double val;
static bool first_time = TRUE; static bool first_time = TRUE;
@ -281,9 +281,8 @@ static enum number_type parse_float(char *buffer, double *res, char **endp)
fprintf(stderr, "Floating point value with decimal comma (%s)?\n", buffer); fprintf(stderr, "Floating point value with decimal comma (%s)?\n", buffer);
first_time = FALSE; first_time = FALSE;
} }
/* Try again */ /* Try again in permissive mode*/
**endp = '.'; val = strtod_flags(buffer, endp, 0);
val = ascii_strtod(buffer, endp);
} }
} }
@ -297,7 +296,7 @@ union int_or_float {
static enum number_type integer_or_float(char *buffer, union int_or_float *res) static enum number_type integer_or_float(char *buffer, union int_or_float *res)
{ {
char *end; const char *end;
return parse_float(buffer, &res->fp, &end); return parse_float(buffer, &res->fp, &end);
} }
@ -459,7 +458,7 @@ static void percent(char *buffer, void *_fraction)
{ {
fraction_t *fraction = _fraction; fraction_t *fraction = _fraction;
double val; double val;
char *end; const char *end;
switch (parse_float(buffer, &val, &end)) { switch (parse_float(buffer, &val, &end)) {
case FLOAT: case FLOAT:

View file

@ -464,9 +464,9 @@ void WeightModel::passInData(const QModelIndex& index, const QVariant& value)
} }
} }
weight_t string_to_weight(char *str) weight_t string_to_weight(const char *str)
{ {
char *end; const char *end;
double value = strtod_flags(str, &end, 0); double value = strtod_flags(str, &end, 0);
QString rest = QString(end).trimmed(); QString rest = QString(end).trimmed();
QString local_kg = WeightModel::tr("kg"); QString local_kg = WeightModel::tr("kg");

View file

@ -29,9 +29,10 @@
#include <ctype.h> #include <ctype.h>
#include "dive.h" #include "dive.h"
double strtod_flags(char *str, char **ptr, unsigned int flags) double strtod_flags(const char *str, const char **ptr, unsigned int flags)
{ {
char *p = str, c, *ep; char c;
const char *p = str, *ep;
double val = 0.0; double val = 0.0;
double decimal = 1.0; double decimal = 1.0;
int sign = 0, esign = 0; int sign = 0, esign = 0;