#include <iomanip>
#include <sstream>
+#include <string.h>
#include <simgear/debug/logstream.hxx>
-#include <simgear/structure/exception.hxx>
#include <simgear/environment/metar.hxx>
+#include <simgear/structure/exception.hxx>
-using std::ostringstream;
+using namespace std;
// text color
-#if defined(__linux__) || defined( __sun__ ) ||defined(__CYGWIN__) || defined( __FreeBSD__ )
+#if defined(__linux__) || defined( __sun__ ) || defined(__CYGWIN__) \
+ || defined( __FreeBSD__ ) || defined ( sgi )
# define R "\033[31;1m" // red
# define G "\033[32;1m" // green
# define Y "\033[33;1m" // yellow
#endif
-const char *azimuthName(double d);
-double rnd(double number, int digits);
-void printReport(SGMetar *m);
-void printVisibility(SGMetarVisibility *v);
-void printArgs(SGMetar *m, double airport_elevation);
-
const char *azimuthName(double d)
{
// date/time
int year = m->getYear();
int month = m->getMonth();
- cout << "Report time:\t\t";
- if (year != -1 && month != -1)
- cout << year << '/' << month << '/' << m->getDay();
+ cout << "Report time:\t\t" << year << '/' << month << '/' << m->getDay();
cout << ' ' << m->getHour() << ':';
- cout << std::setw(2) << std::setfill('0') << m->getMinute() << " UTC" << endl;
+ cout << setw(2) << setfill('0') << m->getMinute() << " UTC" << endl;
// visibility
// assemble surface string
vector<string> surface;
- if ((s = rwy.getDeposit()) && strlen(s))
+ if ((s = rwy.getDepositString()) && strlen(s))
surface.push_back(s);
if ((s = rwy.getExtentString()) && strlen(s))
surface.push_back(s);
// output everything
- cout << "fgfs" << endl;
+ //cout << "fgfs" << endl;
vector<string>::iterator arg;
for (i = 0, arg = args.begin(); arg != args.end(); i++, arg++) {
cout << "\t" << *arg << endl;
}
+void getproxy(string& host, string& port)
+{
+ host = "";
+ port = "80";
+
+ const char *p = getenv("http_proxy");
+ if (!p)
+ return;
+ while (isspace(*p))
+ p++;
+ if (!strncmp(p, "http://", 7))
+ p += 7;
+ if (!*p)
+ return;
+
+ char s[256], *t;
+ strncpy(s, p, 255);
+ s[255] = '\0';
+
+ for (t = s + strlen(s); t > s; t--)
+ if (!isspace(t[-1]) && t[-1] != '/')
+ break;
+ *t = '\0';
+
+ t = strchr(s, ':');
+ if (t) {
+ *t++ = '\0';
+ port = t;
+ }
+ host = s;
+}
+
+
+void usage()
+{
+ printf(
+ "Usage: metar [-v] [-e elevation] [-r|-c] <list of ICAO airport ids or METAR strings>\n"
+ " metar -h\n"
+ "\n"
+ " -h|--help show this help\n"
+ " -v|--verbose verbose output\n"
+ " -r|--report print report (default)\n"
+ " -c|--command-line print command line\n"
+ " -e E|--elevation E set airport elevation to E meters\n"
+ " (added to cloud bases in command line mode)\n"
+ "Environment:\n"
+ " http_proxy set proxy in the form \"http://host:port/\"\n"
+ "\n"
+ "Examples:\n"
+ " $ metar ksfo koak\n"
+ " $ metar -c ksfo -r ksfo\n"
+ " $ metar \"LOWL 161500Z 19004KT 160V240 9999 FEW035 SCT300 29/23 Q1006 NOSIG\"\n"
+ " $ fgfs `metar -e 183 -c loww`\n"
+ " $ http_proxy=http://localhost:3128/ metar ksfo\n"
+ "\n"
+ );
+}
+
+
int main(int argc, char *argv[])
{
+ bool report = true;
+ bool verbose = false;
+ double elevation = 0.0;
+
if (argc <= 1) {
- fprintf(stderr,
- "Usage: metar <list of ICAO airport ids>\n"
- "Example: metar ksfo koak\n"
- );
+ usage();
return 0;
}
+ string proxy_host, proxy_port;
+ getproxy(proxy_host, proxy_port);
+
for (int i = 1; i < argc; i++) {
- try {
- SGMetar *m = new SGMetar(argv[i]);
- //SGMetar *m = new SGMetar("2004/01/11 01:20\nLOWG 110120Z AUTO VRB01KT 0050 1600N R35/0600 FG M06/M06 Q1019 88//////\n");
+ if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help"))
+ usage();
+ else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--verbose"))
+ verbose = true;
+ else if (!strcmp(argv[i], "-r") || !strcmp(argv[i], "--report"))
+ report = true;
+ else if (!strcmp(argv[i], "-c") || !strcmp(argv[i], "--command-line"))
+ report = false;
+ else if (!strcmp(argv[i], "-e") || !strcmp(argv[i], "--elevation")) {
+ if (++i >= argc) {
+ cerr << "-e option used without elevation" << endl;
+ return 1;
+ }
+ elevation = strtod(argv[i], 0);
+ } else {
+ static bool shown = false;
+ if (verbose && !shown) {
+ cerr << "Proxy host: '" << proxy_host << "'" << endl;
+ cerr << "Proxy port: '" << proxy_port << "'" << endl << endl;
+ shown = true;
+ }
+
+ try {
+ SGMetar *m = new SGMetar(argv[i], proxy_host, proxy_port, "", time(0));
+ //SGMetar *m = new SGMetar("2004/01/11 01:20\nLOWG 110120Z AUTO VRB01KT 0050 1600N R35/0600 FG M06/M06 Q1019 88//////\n");
- printf(G"INPUT: %s\n"N, m->getData());
- const char *unused = m->getUnusedData();
- if (*unused)
- printf(R"UNUSED: %s\n"N, unused);
+ if (verbose) {
+ cerr << G"INPUT: " << m->getData() << ""N << endl;
- printReport(m);
- //printArgs(m, 0.0);
+ const char *unused = m->getUnusedData();
+ if (*unused)
+ cerr << R"UNUSED: " << unused << ""N << endl;
+ }
- delete m;
- } catch (const sg_io_exception& e) {
- fprintf(stderr, R"ERROR: %s\n\n"N, e.getFormattedMessage().c_str());
+ if (report)
+ printReport(m);
+ else
+ printArgs(m, elevation);
+
+ delete m;
+ } catch (const sg_io_exception& e) {
+ cerr << R"ERROR: " << e.getFormattedMessage().c_str() << ""N << endl << endl;
+ }
}
}
return 0;