aboutsummaryrefslogtreecommitdiff
path: root/src/dmstor.c
diff options
context:
space:
mode:
authorFrank Warmerdam <warmerdam@pobox.com>1999-03-18 16:34:52 +0000
committerFrank Warmerdam <warmerdam@pobox.com>1999-03-18 16:34:52 +0000
commit565a4bd035b9d4a83955808efef20f1d8dfa24cf (patch)
tree75785fc897708023f1ccdaf40079afcbaaf0fd3a /src/dmstor.c
downloadPROJ-565a4bd035b9d4a83955808efef20f1d8dfa24cf.tar.gz
PROJ-565a4bd035b9d4a83955808efef20f1d8dfa24cf.zip
New
git-svn-id: http://svn.osgeo.org/metacrs/proj/trunk@776 4e78687f-474d-0410-85f9-8d5e500ac6b2
Diffstat (limited to 'src/dmstor.c')
-rw-r--r--src/dmstor.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/dmstor.c b/src/dmstor.c
new file mode 100644
index 00000000..5b4bccf1
--- /dev/null
+++ b/src/dmstor.c
@@ -0,0 +1,78 @@
+/* Convert DMS string to radians */
+#ifndef lint
+static const char SCCSID[]="@(#)dmstor.c 4.4 93/06/16 GIE REL";
+#endif
+#include <projects.h>
+#include <string.h>
+#include <ctype.h>
+
+/* following should be sufficient for all but the rediculous */
+#define MAX_WORK 64
+ static const char
+*sym = "NnEeSsWw";
+ static const double
+vm[] = {
+ .0174532925199433,
+ .0002908882086657216,
+ .0000048481368110953599
+};
+ double
+dmstor(const char *is, char **rs) {
+ int sign, n, nl;
+ char *p, *s, work[MAX_WORK];
+ double v, tv;
+
+ if (rs)
+ *rs = (char *)is;
+ /* copy sting into work space */
+ while (isspace(sign = *is)) ++is;
+ for (n = MAX_WORK, s = work, p = (char *)is; isgraph(*p) && --n ; )
+ *s++ = *p++;
+ *s = '\0';
+ /* it is possible that a really odd input (like lots of leading
+ zeros) could be truncated in copying into work. But ... */
+ sign = *(s = work);
+ if (sign == '+' || sign == '-') s++;
+ else sign = '+';
+ for (v = 0., nl = 0 ; nl < 3 ; nl = n + 1 ) {
+ if (!(isdigit(*s) || *s == '.')) break;
+ if ((tv = strtod(s, &s)) == HUGE_VAL)
+ return tv;
+ switch (*s) {
+ case 'D': case 'd':
+ n = 0; break;
+ case '\'':
+ n = 1; break;
+ case '"':
+ n = 2; break;
+ case 'r': case 'R':
+ if (nl) {
+ pj_errno = -16;
+ return HUGE_VAL;
+ }
+ ++s;
+ v = tv;
+ goto skip;
+ default:
+ v += tv * vm[nl];
+ skip: n = 4;
+ continue;
+ }
+ if (n < nl) {
+ pj_errno = -16;
+ return HUGE_VAL;
+ }
+ v += tv * vm[n];
+ ++s;
+ }
+ /* postfix sign */
+ if (*s && (p = strchr(sym, *s))) {
+ sign = (p - sym) >= 4 ? '-' : '+';
+ ++s;
+ }
+ if (sign == '-')
+ v = -v;
+ if (rs) /* return point of next char after valid string */
+ *rs = (char *)is + (s - work);
+ return v;
+}