Update to version 1.43 of the geodesic routines. This fixes two
[proj.git] / proj / src / rtodms.c
blobabf6bc1c65c473514db6631e58a6c72c9e7b2054
1 /* Convert radian argument to DMS ascii format */
2 #include <projects.h>
3 #include <stdio.h>
4 #include <string.h>
5 /*
6 ** RES is fractional second figures
7 ** RES60 = 60 * RES
8 ** CONV = 180 * 3600 * RES / PI (radians to RES seconds)
9 */
10 static double
11 RES = 1000.,
12 RES60 = 60000.,
13 CONV = 206264806.24709635515796003417;
14 static char
15 format[50] = "%dd%d'%.3f\"%c";
16 static int
17 dolong = 0;
18 void
19 set_rtodms(int fract, int con_w) {
20 int i;
22 if (fract >= 0 && fract < 9 ) {
23 RES = 1.;
24 /* following not very elegant, but used infrequently */
25 for (i = 0; i < fract; ++i)
26 RES *= 10.;
27 RES60 = RES * 60.;
28 CONV = 180. * 3600. * RES / PI;
29 if (! con_w)
30 (void)sprintf(format,"%%dd%%d'%%.%df\"%%c", fract);
31 else
32 (void)sprintf(format,"%%dd%%02d'%%0%d.%df\"%%c",
33 fract+2+(fract?1:0), fract);
34 dolong = con_w;
37 char *
38 rtodms(char *s, double r, int pos, int neg) {
39 int deg, min, sign;
40 char *ss = s;
41 double sec;
43 if (r < 0) {
44 r = -r;
45 if (!pos) { *ss++ = '-'; sign = 0; }
46 else sign = neg;
47 } else
48 sign = pos;
49 r = floor(r * CONV + .5);
50 sec = fmod(r / RES, 60.);
51 r = floor(r / RES60);
52 min = fmod(r, 60.);
53 r = floor(r / 60.);
54 deg = r;
56 if (dolong)
57 (void)sprintf(ss,format,deg,min,sec,sign);
58 else if (sec) {
59 char *p, *q;
61 (void)sprintf(ss,format,deg,min,sec,sign);
62 for (q = p = ss + strlen(ss) - (sign ? 3 : 2); *p == '0'; --p) ;
63 if (*p != '.')
64 ++p;
65 if (++q != p)
66 (void)strcpy(p, q);
67 } else if (min)
68 (void)sprintf(ss,"%dd%d'%c",deg,min,sign);
69 else
70 (void)sprintf(ss,"%dd%c",deg, sign);
71 return s;