[pypy-commit] pypy remove-PYPY_NOT_MAIN_FILE: Split ll_strtod.h into interface and implementation.
amauryfa
noreply at buildbot.pypy.org
Tue Oct 2 16:37:44 CEST 2012
Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: remove-PYPY_NOT_MAIN_FILE
Changeset: r57722:72618a227a33
Date: 2012-09-30 20:49 +0200
http://bitbucket.org/pypy/pypy/changeset/72618a227a33/
Log: Split ll_strtod.h into interface and implementation.
diff --git a/pypy/translator/c/genc.py b/pypy/translator/c/genc.py
--- a/pypy/translator/c/genc.py
+++ b/pypy/translator/c/genc.py
@@ -913,6 +913,7 @@
srcdir / 'thread.c',
srcdir / 'asm.c',
srcdir / 'instrument.c',
+ srcdir / 'll_strtod.c',
]
if _CYGWIN:
files.append(srcdir / 'cygwin_wait.c')
diff --git a/pypy/translator/c/src/ll_strtod.c b/pypy/translator/c/src/ll_strtod.c
new file mode 100644
--- /dev/null
+++ b/pypy/translator/c/src/ll_strtod.c
@@ -0,0 +1,126 @@
+#include <src/ll_strtod.h>
+
+#include <locale.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+
+
+double LL_strtod_parts_to_float(char *sign, char *beforept,
+ char *afterpt, char *exponent)
+{
+ char *fail_pos;
+ struct lconv *locale_data;
+ const char *decimal_point;
+ int decimal_point_len;
+ double x;
+ char *last;
+ char *expo = exponent;
+ int buf_size;
+ char *s;
+
+ if (*expo == '\0') {
+ expo = "0";
+ }
+
+ locale_data = localeconv();
+ decimal_point = locale_data->decimal_point;
+ decimal_point_len = strlen(decimal_point);
+
+ buf_size = strlen(sign) +
+ strlen(beforept) +
+ decimal_point_len +
+ strlen(afterpt) +
+ 1 /* e */ +
+ strlen(expo) +
+ 1 /* asciiz */ ;
+
+ s = (char*)malloc(buf_size);
+
+ strcpy(s, sign);
+ strcat(s, beforept);
+ strcat(s, decimal_point);
+ strcat(s, afterpt);
+ strcat(s, "e");
+ strcat(s, expo);
+
+ last = s + (buf_size-1);
+ x = strtod(s, &fail_pos);
+ errno = 0;
+ if (fail_pos > last)
+ fail_pos = last;
+ if (fail_pos == s || *fail_pos != '\0' || fail_pos != last) {
+ free(s);
+ errno = 42; // just because
+ return -1.0;
+ }
+ if (x == 0.0) { /* maybe a denormal value, ask for atof behavior */
+ x = strtod(s, NULL);
+ errno = 0;
+ }
+ free(s);
+ return x;
+}
+
+char buffer[120]; /* this should be enough, from PyString_Format code */
+int buflen = 120;
+
+#ifdef _MSC_VER
+#define snprintf _snprintf
+#endif
+
+char* LL_strtod_formatd(double x, char code, int precision)
+{
+ int res;
+ const char* fmt;
+ if (code == 'e') fmt = "%.*e";
+ else if (code == 'f') fmt = "%.*f";
+ else if (code == 'g') fmt = "%.*g";
+ else {
+ strcpy(buffer, "??.?"); /* should not occur */
+ return buffer;
+ }
+ res = snprintf(buffer, buflen, fmt, precision, x);
+ if (res <= 0 || res >= buflen) {
+ strcpy(buffer, "??.?"); /* should not occur */
+ } else {
+ struct lconv *locale_data;
+ const char *decimal_point;
+ int decimal_point_len;
+ char *p;
+
+ locale_data = localeconv();
+ decimal_point = locale_data->decimal_point;
+ decimal_point_len = strlen(decimal_point);
+
+ if (decimal_point[0] != '.' ||
+ decimal_point[1] != 0)
+ {
+ p = buffer;
+
+ if (*p == '+' || *p == '-')
+ p++;
+
+ while (isdigit((unsigned char)*p))
+ p++;
+
+ if (strncmp(p, decimal_point, decimal_point_len) == 0)
+ {
+ *p = '.';
+ p++;
+ if (decimal_point_len > 1) {
+ int rest_len;
+ rest_len = strlen(p + (decimal_point_len - 1));
+ memmove(p, p + (decimal_point_len - 1),
+ rest_len);
+ p[rest_len] = 0;
+ }
+ }
+ }
+
+ }
+
+ return buffer;
+}
diff --git a/pypy/translator/c/src/ll_strtod.h b/pypy/translator/c/src/ll_strtod.h
--- a/pypy/translator/c/src/ll_strtod.h
+++ b/pypy/translator/c/src/ll_strtod.h
@@ -1,143 +1,13 @@
-#ifndef LL_STRTOD_H
-#define LL_STRTOD_H
+/* string <-> float conversions.
+ Implementation uses sprintf and strtod.
+ Not used in modern Python, where dtoa.c is preferred.
+ */
-#include <locale.h>
-#include <ctype.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-
-
-/* prototypes */
+#ifndef _PYPY_LL_STRTOD_H
+#define _PYPY_LL_STRTOD_H
double LL_strtod_parts_to_float(char *sign, char *beforept,
char *afterpt, char *exponent);
char *LL_strtod_formatd(double x, char code, int precision);
-
-/* implementations */
-
-#ifdef PYPY_MAIN_IMPLEMENTATION_FILE
-
-double LL_strtod_parts_to_float(
- char *sign,
- char *beforept,
- char *afterpt,
- char *exponent)
-{
- char *fail_pos;
- struct lconv *locale_data;
- const char *decimal_point;
- int decimal_point_len;
- double x;
- char *last;
- char *expo = exponent;
- int buf_size;
- char *s;
-
- if (*expo == '\0') {
- expo = "0";
- }
-
- locale_data = localeconv();
- decimal_point = locale_data->decimal_point;
- decimal_point_len = strlen(decimal_point);
-
- buf_size = strlen(sign) +
- strlen(beforept) +
- decimal_point_len +
- strlen(afterpt) +
- 1 /* e */ +
- strlen(expo) +
- 1 /* asciiz */ ;
-
- s = (char*)malloc(buf_size);
-
- strcpy(s, sign);
- strcat(s, beforept);
- strcat(s, decimal_point);
- strcat(s, afterpt);
- strcat(s, "e");
- strcat(s, expo);
-
- last = s + (buf_size-1);
- x = strtod(s, &fail_pos);
- errno = 0;
- if (fail_pos > last)
- fail_pos = last;
- if (fail_pos == s || *fail_pos != '\0' || fail_pos != last) {
- free(s);
- errno = 42; // just because
- return -1.0;
- }
- if (x == 0.0) { /* maybe a denormal value, ask for atof behavior */
- x = strtod(s, NULL);
- errno = 0;
- }
- free(s);
- return x;
-}
-
-char buffer[120]; /* this should be enough, from PyString_Format code */
-int buflen = 120;
-
-#ifdef _MSC_VER
-#define snprintf _snprintf
#endif
-
-char* LL_strtod_formatd(double x, char code, int precision) {
- int res;
- const char* fmt;
- if (code == 'e') fmt = "%.*e";
- else if (code == 'f') fmt = "%.*f";
- else if (code == 'g') fmt = "%.*g";
- else {
- strcpy(buffer, "??.?"); /* should not occur */
- return buffer;
- }
- res = snprintf(buffer, buflen, fmt, precision, x);
- if (res <= 0 || res >= buflen) {
- strcpy(buffer, "??.?"); /* should not occur */
- } else {
- struct lconv *locale_data;
- const char *decimal_point;
- int decimal_point_len;
- char *p;
-
- locale_data = localeconv();
- decimal_point = locale_data->decimal_point;
- decimal_point_len = strlen(decimal_point);
-
- if (decimal_point[0] != '.' ||
- decimal_point[1] != 0)
- {
- p = buffer;
-
- if (*p == '+' || *p == '-')
- p++;
-
- while (isdigit((unsigned char)*p))
- p++;
-
- if (strncmp(p, decimal_point, decimal_point_len) == 0)
- {
- *p = '.';
- p++;
- if (decimal_point_len > 1) {
- int rest_len;
- rest_len = strlen(p + (decimal_point_len - 1));
- memmove(p, p + (decimal_point_len - 1),
- rest_len);
- p[rest_len] = 0;
- }
- }
- }
-
- }
-
- return buffer;
-}
-
-#endif /* PYPY_MAIN_IMPLEMENTATION_FILE */
-#endif
More information about the pypy-commit
mailing list