Skip to content

Commit

Permalink
Modify nanosvg.h to support compilation by Visual Studio 7.
Browse files Browse the repository at this point in the history
This is a new implementation that does not tamper with the program's locale.

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12431 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
  • Loading branch information
Manolo Gouy authored and Manolo Gouy committed Sep 7, 2017
1 parent a222837 commit 0bf5f98
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 79 deletions.
74 changes: 8 additions & 66 deletions nanosvg/fl_nanosvg.diff
@@ -1,76 +1,18 @@
1,10d0
1,9d0
< //
< // "$Id$"
< //
<
< /* Modified by FLTK from original source file "nanosvg.h" to support compilation
< with Visual Studio 7:
< remove the implementation of function nsvg__atof() that uses
< unsupported "long long" type and strtoll() function.
< /* Modified for the FLTK library from original source file "nanosvg.h" to
< support compilation with Visual Studio 7:
< replace in function nsvg__atof() the "long long" type by "fl_nsvg_int".
< */
<
1087a1078,1137
> // We roll our own string to float because the std library one uses locale and messes things up.
> static double nsvg__atof(const char* s)
> {
> char* cur = (char*)s;
> char* end = NULL;
> double res = 0.0, sign = 1.0;
1093c1084
< fl_nsvg_int intPart = 0, fracPart = 0;
---
> long long intPart = 0, fracPart = 0;
> char hasIntPart = 0, hasFracPart = 0;
>
> // Parse optional sign
> if (*cur == '+') {
> cur++;
> } else if (*cur == '-') {
> sign = -1;
> cur++;
> }
>
> // Parse integer part
> if (nsvg__isdigit(*cur)) {
> // Parse digit sequence
> intPart = (double)strtoll(cur, &end, 10);
> if (cur != end) {
> res = (double)intPart;
> hasIntPart = 1;
> cur = end;
> }
> }
>
> // Parse fractional part.
> if (*cur == '.') {
> cur++; // Skip '.'
> if (nsvg__isdigit(*cur)) {
> // Parse digit sequence
> fracPart = strtoll(cur, &end, 10);
> if (cur != end) {
> res += (double)fracPart / pow(10.0, (double)(end - cur));
> hasFracPart = 1;
> cur = end;
> }
> }
> }
>
> // A valid number should have integer or fractional part.
> if (!hasIntPart && !hasFracPart)
> return 0.0;
>
> // Parse optional exponent
> if (*cur == 'e' || *cur == 'E') {
> int expPart = 0;
> cur++; // skip 'E'
> expPart = strtol(cur, &end, 10); // Parse digit sequence with sign
> if (cur != end) {
> res *= pow(10.0, (double)expPart);
> }
> }
>
> return res * sign;
> }
>
>
2876,2879d2925
2935,2938d2925
<
< //
< // End of "$Id$".
Expand Down
67 changes: 63 additions & 4 deletions nanosvg/fl_nanosvg.h
Expand Up @@ -2,10 +2,9 @@
// "$Id$"
//

/* Modified by FLTK from original source file "nanosvg.h" to support compilation
with Visual Studio 7:
remove the implementation of function nsvg__atof() that uses
unsupported "long long" type and strtoll() function.
/* Modified for the FLTK library from original source file "nanosvg.h" to
support compilation with Visual Studio 7:
replace in function nsvg__atof() the "long long" type by "fl_nsvg_int".
*/

/*
Expand Down Expand Up @@ -1085,6 +1084,66 @@ static void nsvg__addPath(NSVGparser* p, char closed)
}
}

// We roll our own string to float because the std library one uses locale and messes things up.
static double nsvg__atof(const char* s)
{
char* cur = (char*)s;
char* end = NULL;
double res = 0.0, sign = 1.0;
fl_nsvg_int intPart = 0, fracPart = 0;
char hasIntPart = 0, hasFracPart = 0;

// Parse optional sign
if (*cur == '+') {
cur++;
} else if (*cur == '-') {
sign = -1;
cur++;
}

// Parse integer part
if (nsvg__isdigit(*cur)) {
// Parse digit sequence
intPart = (double)strtoll(cur, &end, 10);
if (cur != end) {
res = (double)intPart;
hasIntPart = 1;
cur = end;
}
}

// Parse fractional part.
if (*cur == '.') {
cur++; // Skip '.'
if (nsvg__isdigit(*cur)) {
// Parse digit sequence
fracPart = strtoll(cur, &end, 10);
if (cur != end) {
res += (double)fracPart / pow(10.0, (double)(end - cur));
hasFracPart = 1;
cur = end;
}
}
}

// A valid number should have integer or fractional part.
if (!hasIntPart && !hasFracPart)
return 0.0;

// Parse optional exponent
if (*cur == 'e' || *cur == 'E') {
int expPart = 0;
cur++; // skip 'E'
expPart = strtol(cur, &end, 10); // Parse digit sequence with sign
if (cur != end) {
res *= pow(10.0, (double)expPart);
}
}

return res * sign;
}


static const char* nsvg__parseNumber(const char* s, char* it, const int size)
{
const int last = size-1;
Expand Down
16 changes: 7 additions & 9 deletions src/Fl_SVG_Image.cxx
Expand Up @@ -28,8 +28,13 @@
#include <locale.h>
#endif

// the C locale is set in init_() before calling nsvgParse(), therefore plain atof() can be used
#define nsvg__atof(s) atof(s)
#ifdef HAVE_LONG_LONG
typedef long long fl_nsvg_int;
#else
typedef long fl_nsvg_int;
# define strtoll(a, b, c) strtol(a, b, c)
#endif


#define NANOSVG_ALL_COLOR_KEYWORDS // Include full list of color keywords.
#define NANOSVG_IMPLEMENTATION // Expands implementation
Expand Down Expand Up @@ -104,14 +109,7 @@ void Fl_SVG_Image::init_(const char *filename, char *filedata, Fl_SVG_Image *cop
} else ld(ERR_FILE_ACCESS);
}
if (filedata) {
#if HAVE_LOCALE_H
char *saved_locale = setlocale(LC_NUMERIC, NULL);
setlocale(LC_NUMERIC, "C");
#endif
counted_svg_image_->svg_image = nsvgParse(filedata, "px", 96);
#if HAVE_LOCALE_H
setlocale(LC_NUMERIC, saved_locale);
#endif
if (filename) free(filedata);
if (counted_svg_image_->svg_image->width == 0 || counted_svg_image_->svg_image->height == 0) {
d(-1);
Expand Down

0 comments on commit 0bf5f98

Please sign in to comment.