~ubuntu-branches/ubuntu/gutsy/proj/gutsy

« back to all changes in this revision

Viewing changes to src/rtodms.c

  • Committer: Bazaar Package Importer
  • Author(s): Peter S Galbraith
  • Date: 2002-01-11 10:27:12 UTC
  • Revision ID: james.westby@ubuntu.com-20020111102712-ayi18r8y2eesv0y9
Tags: upstream-4.4.5
ImportĀ upstreamĀ versionĀ 4.4.5

Show diffs side-by-side

added added

removed removed

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