aboutsummaryrefslogtreecommitdiff
path: root/src/rtodms.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2018-12-18 20:24:11 +0100
committerEven Rouault <even.rouault@spatialys.com>2018-12-26 10:08:53 +0100
commit610957f7035242f15743c399ffd429b92bc36206 (patch)
tree73f0d51147e2f4860c4bfc875f7a4bf9359386d4 /src/rtodms.cpp
parent355d681ed88019e97742344bd642c2fd97e700a1 (diff)
downloadPROJ-610957f7035242f15743c399ffd429b92bc36206.tar.gz
PROJ-610957f7035242f15743c399ffd429b92bc36206.zip
cpp conversion: minimal steps to fix compilation errors, not warnings
Diffstat (limited to 'src/rtodms.cpp')
-rw-r--r--src/rtodms.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/rtodms.cpp b/src/rtodms.cpp
new file mode 100644
index 00000000..674cebdf
--- /dev/null
+++ b/src/rtodms.cpp
@@ -0,0 +1,86 @@
+/* Convert radian argument to DMS ascii format */
+
+#include <math.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "projects.h"
+
+/*
+** RES is fractional second figures
+** RES60 = 60 * RES
+** CONV = 180 * 3600 * RES / PI (radians to RES seconds)
+*/
+ static double
+RES = 1000.,
+RES60 = 60000.,
+CONV = 206264806.24709635516;
+ static char
+format[50] = "%dd%d'%.3f\"%c";
+ static int
+dolong = 0;
+ void
+set_rtodms(int fract, int con_w) {
+ int i;
+
+ if (fract >= 0 && fract < 9 ) {
+ RES = 1.;
+ /* following not very elegant, but used infrequently */
+ for (i = 0; i < fract; ++i)
+ RES *= 10.;
+ RES60 = RES * 60.;
+ CONV = 180. * 3600. * RES / M_PI;
+ if (! con_w)
+ (void)sprintf(format,"%%dd%%d'%%.%df\"%%c", fract);
+ else
+ (void)sprintf(format,"%%dd%%02d'%%0%d.%df\"%%c",
+ fract+2+(fract?1:0), fract);
+ dolong = con_w;
+ }
+}
+ char *
+rtodms(char *s, double r, int pos, int neg) {
+ int deg, min, sign;
+ char *ss = s;
+ double sec;
+
+ if (r < 0) {
+ r = -r;
+ if (!pos) { *ss++ = '-'; sign = 0; }
+ else sign = neg;
+ } else
+ sign = pos;
+ r = floor(r * CONV + .5);
+ sec = fmod(r / RES, 60.);
+ r = floor(r / RES60);
+ min = (int)fmod(r, 60.);
+ r = floor(r / 60.);
+ deg = (int)r;
+
+ if (dolong)
+ (void)sprintf(ss,format,deg,min,sec,sign);
+ else if (sec != 0.0) {
+ char *p, *q;
+ /* double prime + pos/neg suffix (if included) + NUL */
+ size_t suffix_len = sign ? 3 : 2;
+
+ (void)sprintf(ss,format,deg,min,sec,sign);
+ /* Replace potential decimal comma by decimal point for non C locale */
+ for( p = ss; *p != '\0'; ++p ) {
+ if( *p == ',' ) {
+ *p = '.';
+ break;
+ }
+ }
+ for (q = p = ss + strlen(ss) - suffix_len; *p == '0'; --p) ;
+ if (*p != '.')
+ ++p;
+ if (++q != p)
+ (void)memmove(p, q, suffix_len);
+ } else if (min)
+ (void)sprintf(ss,"%dd%d'%c",deg,min,sign);
+ else
+ (void)sprintf(ss,"%dd%c",deg, sign);
+ return s;
+}