+}
+#endif
+
+void usage()
+{
+ fprintf(stdout,
+ "Usage:\n"
+ " %s [OPTIONS] [FILE]\n"
+ "\n"
+ "Help Options:\n"
+ " -h, -?, --help Show help option\n"
+ "\n"
+ "Application Options:\n"
+ " -V, --version Show release version\n"
+ " -l, --loglevel Set libsigrok/libsigrokdecode loglevel\n"
+ " -d, --driver Specify the device driver to use\n"
+ " -D, --no-scan Don't auto-scan for devices, use -d spec only\n"
+ " -i, --input-file Load input from file\n"
+ " -I, --input-format Input format\n"
+ " -c, --clean Don't restore previous sessions on startup\n"
+ "\n", PV_BIN_NAME);
+}
+
+int main(int argc, char *argv[])
+{
+ int ret = 0;
+ shared_ptr<sigrok::Context> context;
+ string open_file_format, driver;
+ vector<string> open_files;
+ bool restore_sessions = true;
+ bool do_scan = true;
+
+ Application a(argc, argv);
+
+#ifdef ANDROID
+ srau_init_environment();
+ pv::AndroidLogHandler::install_callbacks();
+ pv::AndroidAssetReader asset_reader;
+#endif
+
+ // Parse arguments
+ while (true) {
+ static const struct option long_options[] = {
+ {"help", no_argument, nullptr, 'h'},
+ {"version", no_argument, nullptr, 'V'},
+ {"loglevel", required_argument, nullptr, 'l'},
+ {"driver", required_argument, nullptr, 'd'},
+ {"no-scan", no_argument, nullptr, 'D'},
+ {"input-file", required_argument, nullptr, 'i'},
+ {"input-format", required_argument, nullptr, 'I'},
+ {"clean", no_argument, nullptr, 'c'},
+ {"log-to-stdout", no_argument, nullptr, 's'},
+ {nullptr, 0, nullptr, 0}
+ };
+
+ const int c = getopt_long(argc, argv,
+ "h?VDcl:d:i:I:", long_options, nullptr);
+ if (c == -1)
+ break;
+
+ switch (c) {
+ case 'h':
+ case '?':
+ usage();
+ return 0;
+
+ case 'V':
+ // Print version info
+ fprintf(stdout, "%s %s\n", PV_TITLE, PV_VERSION_STRING);
+ return 0;
+
+ case 'l':
+ {
+ const int loglevel = atoi(optarg);
+ if (loglevel < 0 || loglevel > 5) {
+ qDebug() << "ERROR: invalid log level spec.";
+ break;
+ }
+ context->set_log_level(sigrok::LogLevel::get(loglevel));