summaryrefslogtreecommitdiffstats
path: root/private/windbg/lib/cfin.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/windbg/lib/cfin.c')
-rw-r--r--private/windbg/lib/cfin.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/private/windbg/lib/cfin.c b/private/windbg/lib/cfin.c
new file mode 100644
index 000000000..15582de0b
--- /dev/null
+++ b/private/windbg/lib/cfin.c
@@ -0,0 +1,73 @@
+/***
+*cfin.c - Encode interface for C
+*
+* Copyright (c) 19xx-1991, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+*
+*Revision History:
+* 07-20-91 GDP Ported to C from assembly
+* 04-30-92 GDP use __strgtold12 and _ld12tod
+* 05-26-92 GWK Windbg srcs
+*
+*******************************************************************************/
+
+#include <string.h>
+#include "cv.h"
+
+
+
+
+#ifndef MTHREAD
+static struct _flt ret;
+static FLT flt = &ret;
+#endif
+
+/* The only three conditions that this routine detects */
+#define CFIN_NODIGITS 512
+#define CFIN_OVERFLOW 128
+#define CFIN_UNDERFLOW 256
+
+/* This version ignores the last two arguments (radix and scale)
+ * Input string should be null terminated
+ * len is also ignored
+ */
+#ifdef MTHREAD
+FLT _fltin2(FLT flt, const char *str, int len_ignore, int scale_ignore, int radix_ignore)
+#else
+FLT _fltin(const char *str, int len_ignore, int scale_ignore, int radix_ignore)
+#endif
+{
+ _ULDBL12 ld12;
+ UDOUBLE x;
+ char *EndPtr;
+ unsigned flags;
+ int retflags = 0;
+
+ flags = __strgtold12(&ld12, &EndPtr, (char *)str, 0);
+ if (flags & SLD_NODIGITS) {
+ retflags |= CFIN_NODIGITS;
+ *(u_long *)&x = 0;
+ *((u_long *)&x+1) = 0;
+ }
+ else {
+ INTRNCVT_STATUS intrncvt;
+
+ intrncvt = _ld12tod(&ld12, &x);
+
+ if (flags & SLD_OVERFLOW ||
+ intrncvt == INTRNCVT_OVERFLOW) {
+ retflags |= CFIN_OVERFLOW;
+ }
+ if (flags & SLD_UNDERFLOW ||
+ intrncvt == INTRNCVT_UNDERFLOW) {
+ retflags |= CFIN_UNDERFLOW;
+ }
+ }
+
+ flt->flags = retflags;
+ flt->nbytes = EndPtr - (char *)str;
+ flt->dval = *(double *)&x;
+
+ return flt;
+}