Skip to content

Commit 7c3f900

Browse files
committed
Replace sscanf by std::stringstream
Using std::stringstream allows working with the C locale, independent of the current locale settings. Signed-off-by: Stefan Weil <sw@weilnetz.de>
1 parent 4194b93 commit 7c3f900

File tree

2 files changed

+33
-14
lines changed

2 files changed

+33
-14
lines changed

src/ccstruct/boxread.cpp

+14-5
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
* File: boxread.cpp
33
* Description: Read data from a box file.
44
* Author: Ray Smith
5-
* Created: Fri Aug 24 17:47:23 PDT 2007
65
*
76
* (C) Copyright 2007, Google Inc.
87
** Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,6 +18,8 @@
1918

2019
#include "boxread.h"
2120
#include <cstring> // for strchr, strcmp, strrchr
21+
#include <locale> // for std::locale::classic
22+
#include <sstream> // for std::stringstream
2223
#include "errcode.h" // for ERRCODE, TESSEXIT
2324
#include "fileerr.h" // for CANTOPENFILE
2425
#include "genericvector.h" // for GenericVector
@@ -194,11 +195,19 @@ bool ParseBoxFileStr(const char* boxfile_str, int* page_number,
194195
uch_len < kBoxReadBufSize - 1);
195196
uch[uch_len] = '\0';
196197
if (*buffptr != '\0') ++buffptr;
197-
int x_min, y_min, x_max, y_max;
198+
int x_min = INT_MAX;
199+
int y_min = INT_MAX;
200+
int x_max = INT_MIN;
201+
int y_max = INT_MIN;
198202
*page_number = 0;
199-
int count = sscanf(buffptr, "%d %d %d %d %d",
200-
&x_min, &y_min, &x_max, &y_max, page_number);
201-
if (count != 5 && count != 4) {
203+
std::stringstream stream(buffptr);
204+
stream.imbue(std::locale::classic());
205+
stream >> x_min;
206+
stream >> y_min;
207+
stream >> x_max;
208+
stream >> y_max;
209+
stream >> *page_number;
210+
if (x_max < x_min || y_max < y_min) {
202211
tprintf("Bad box coordinates in boxfile string! %s\n", ubuf);
203212
return false;
204213
}

src/ccutil/params.cpp

+19-9
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,13 @@
1616
*
1717
**********************************************************************/
1818

19+
#include <climits> // for INT_MIN, INT_MAX
20+
#include <cmath> // for NAN, std::isnan
1921
#include <cstdio>
2022
#include <cstring>
2123
#include <cstdlib>
24+
#include <locale> // for std::locale::classic
25+
#include <sstream> // for std::stringstream
2226

2327
#include "genericvector.h"
2428
#include "tprintf.h"
@@ -96,11 +100,17 @@ bool ParamUtils::SetParam(const char *name, const char* value,
96100
if (*value == '\0') return (sp != nullptr);
97101

98102
// Look for the parameter among int parameters.
99-
int intval;
100103
auto *ip = FindParam<IntParam>(name, GlobalParams()->int_params,
101104
member_params->int_params);
102-
if (ip && ip->constraint_ok(constraint) && sscanf(value, "%d", &intval) == 1)
103-
ip->set_value(intval);
105+
if (ip && ip->constraint_ok(constraint)) {
106+
int intval = INT_MIN;
107+
std::stringstream stream(value);
108+
stream.imbue(std::locale::classic());
109+
stream >> intval;
110+
if (intval != INT_MIN) {
111+
ip->set_value(intval);
112+
}
113+
}
104114

105115
// Look for the parameter among bool parameters.
106116
auto *bp = FindParam<BoolParam>(name, GlobalParams()->bool_params,
@@ -116,16 +126,16 @@ bool ParamUtils::SetParam(const char *name, const char* value,
116126
}
117127

118128
// Look for the parameter among double parameters.
119-
double doubleval;
120129
auto *dp = FindParam<DoubleParam>(name, GlobalParams()->double_params,
121130
member_params->double_params);
122131
if (dp != nullptr && dp->constraint_ok(constraint)) {
123-
#ifdef EMBEDDED
124-
doubleval = strtofloat(value);
125-
#else
126-
if (sscanf(value, "%lf", &doubleval) == 1)
127-
#endif
132+
double doubleval = NAN;
133+
std::stringstream stream(value);
134+
stream.imbue(std::locale::classic());
135+
stream >> doubleval;
136+
if (!std::isnan(doubleval)) {
128137
dp->set_value(doubleval);
138+
}
129139
}
130140
return (sp || ip || bp || dp);
131141
}

0 commit comments

Comments
 (0)