1 /*!
2   \file lib/gis/wind_scan.c
3 
4   \brief GIS Library - Coordinate scanning functions.
5 
6   (C) 2001-2009, 2011 by the GRASS Development Team
7 
8   This program is free software under the GNU General Public License
9   (>=v2). Read the file COPYING that comes with GRASS for details.
10 
11   \author Original author CERL
12 */
13 
14 #include <stdio.h>
15 #include <grass/gis.h>
16 
17 static int scan_double(const char *, double *);
18 
19 /*!
20   \brief ASCII northing to double.
21 
22   Converts the ASCII "northing" coordinate string in <i>buf</i> to its
23   double representation (into <i>northing</i>).
24 
25   Supported projection codes (see gis.h):
26    - PROJECTION_XY
27    - PROJECTION_UTM
28    - PROJECTION_LL
29    - PROJECTION_OTHER
30 
31   \param buf buffer hold string northing
32   \param[out] northing northing
33   \param projection projection code
34 
35   \return 0 on error
36   \return 1 on success
37 */
G_scan_northing(const char * buf,double * northing,int projection)38 int G_scan_northing(const char *buf, double *northing, int projection)
39 {
40     if (projection == PROJECTION_LL) {
41 	if (!scan_double(buf, northing))
42 	    return G_lat_scan(buf, northing);
43 
44 	return 1;
45     }
46 
47     return scan_double(buf, northing);
48 }
49 
50 /*!
51   \brief ASCII easting to double.
52 
53   Converts the ASCII "easting" coordinate string in <i>buf</i> to its
54   double representation (into <i>easting</i>).
55 
56   Supported projection codes (see gis.h):
57    - PROJECTION_XY
58    - PROJECTION_UTM
59    - PROJECTION_LL
60    - PROJECTION_OTHER
61 
62   \param buf buffer containing string easting
63   \param[out] easting easting
64   \param projection projection code
65 
66   \return 0 on error
67   \return 1 on success
68 */
G_scan_easting(const char * buf,double * easting,int projection)69 int G_scan_easting(const char *buf, double *easting, int projection)
70 {
71     if (projection == PROJECTION_LL) {
72 	if (!scan_double(buf, easting))
73 	    return G_lon_scan(buf, easting);
74 
75 	return 1;
76     }
77 
78     return scan_double(buf, easting);
79 }
80 
81 /*!
82   \brief ASCII resolution to double.
83 
84   Converts the ASCII "resolution" string in <i>buf</i> to its double
85   representation (into resolution).
86 
87   Supported projection codes (see gis.h):
88    - PROJECTION_XY
89    - PROJECTION_UTM
90    - PROJECTION_LL
91    - PROJECTION_OTHER
92 
93   \param buf buffer containing string resolution
94   \param[out] resolution resolution value
95   \param projection projection code
96 
97   \return 0 on error
98   \return 1 on success
99 */
G_scan_resolution(const char * buf,double * res,int projection)100 int G_scan_resolution(const char *buf, double *res, int projection)
101 {
102     if (projection == PROJECTION_LL) {
103 	if (G_llres_scan(buf, res))
104 	    return (*res > 0.0);
105     }
106 
107     return (scan_double(buf, res) && *res > 0.0);
108 }
109 
scan_double(const char * buf,double * value)110 static int scan_double(const char *buf, double *value)
111 {
112     char junk[2];
113 
114     /* use sscanf to convert buf to double
115      * make sure value doesn't have other characters after it */
116 
117     *junk = 0;
118     *value = 0.0;
119 
120     if (sscanf(buf, "%lf%1s", value, junk) == 1 && *junk == 0) {
121 	while (*buf)
122 	    buf++;
123 	buf--;
124 
125 	if (*buf >= 'A' && *buf <= 'Z')
126 	    return 0;
127 	if (*buf >= 'a' && *buf <= 'z')
128 	    return 0;
129 
130 	return 1;		/* success */
131     }
132 
133     return 0;			/* failure */
134 }
135