summaryrefslogtreecommitdiff
path: root/support/dktools/dk3madsc.ctr
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/dk3madsc.ctr
Initial commit
Diffstat (limited to 'support/dktools/dk3madsc.ctr')
-rw-r--r--support/dktools/dk3madsc.ctr115
1 files changed, 115 insertions, 0 deletions
diff --git a/support/dktools/dk3madsc.ctr b/support/dktools/dk3madsc.ctr
new file mode 100644
index 0000000000..be4ccbf67b
--- /dev/null
+++ b/support/dktools/dk3madsc.ctr
@@ -0,0 +1,115 @@
+%% options
+
+copyright owner = Dirk Krause
+copyright year = 2014-xxxx
+license = bsd
+
+
+%% header
+
+
+/** @file dk3madsc.h Conversion from double to short and
+ unsigned short.
+*/
+
+#include <dk3conf.h>
+
+#include <stdio.h>
+#if DK3_HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#if DK3_HAVE_STDINT
+#include <stdint.h>
+#endif
+#if DK3_HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+#if DK3_HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#if DK3_HAVE_MATH_H
+#include <math.h>
+#endif
+#if DK3_HAVE_FLOAT_H
+#include <float.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Convert double value to short.
+ @param x Double value to convert.
+ @param ec Pointer to error code variable.
+ Set to DK3_ERROR_MATH_OVERFLOW if the absolute value of x is too large.
+ @return Conversion result.
+*/
+short
+dk3ma_d_to_s_ok(double x, int *ec);
+
+/** Convert double value to unsigned short.
+ @param x Double value to convert.
+ @param ec Pointer to error code variable.
+ Set to DK3_ERROR_MATH_OVERFLOW if the absolute value of x is too large,
+ DK3_ERROR_MATH_OUT_OF_RANGE for negative x.
+ @return Conversion result.
+*/
+unsigned short
+dk3ma_d_to_us_ok(double x, int *ec);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+%% module
+
+
+
+#include "dk3ma.h"
+
+
+
+$!trace-include
+
+
+
+short
+dk3ma_d_to_s_ok(double x, int *ec)
+{
+ short back = 0;
+ if ((double)DK3_S_MIN <= x) {
+ if ((double)DK3_S_MAX >= x) {
+ back = (short)x;
+ } else {
+ back = DK3_S_MAX;
+ if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
+ }
+ } else {
+ back = DK3_S_MIN;
+ if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
+ }
+ return back;
+}
+
+
+
+unsigned short
+dk3ma_d_to_us_ok(double x, int *ec)
+{
+ unsigned short back = 0U;
+ if (0.0 <= x) {
+ if ((double)DK3_US_MAX >= x) {
+ back = (unsigned short)x;
+ } else {
+ back = DK3_US_MAX;
+ if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; }
+ }
+ } else {
+ if (NULL != ec) { *ec = DK3_ERROR_MATH_OUT_OF_RANGE; }
+ }
+ return back;
+}
+