void Trivial::visit_pre_signature(signature* n) { // verify that if we see a parameter with a default, that // we don't find a parameter after it with no default // function($foo, $bar='test', $baz) int p = n->numParams(); if (!p) return; formalParam* param(0); formalParam* firstParam(0); // note, the params are in reverse order for (int i = p-1; i >= 0; i--) { param = n->getParam(i); if (param->hasDefault()) { if (!firstParam) firstParam = param; } else if (firstParam) { addDiagnostic(param, "parameter should have default because previous parameter does"); addDiagnostic(firstParam, "first parameter with default defined here"); // return so that we only show the diag once return; } } }
int main(int argc, char *argv[]) { qInstallMessageHandler(logMessageHandler); // Enable log as early as possible QApplication a(argc, argv); a.setApplicationName("qTox"); a.setOrganizationName("Tox"); a.setApplicationVersion("\nGit commit: " + QString(GIT_VERSION)); #ifdef HIGH_DPI a.setAttribute(Qt::AA_UseHighDpiPixmaps, true); #endif qsrand(time(0)); Settings::getInstance(); Translator::translate(); // Process arguments QCommandLineParser parser; parser.setApplicationDescription("qTox, version: " + QString(GIT_VERSION) + "\nBuilt: " + __TIME__ + " " + __DATE__); parser.addHelpOption(); parser.addVersionOption(); parser.addPositionalArgument("uri", QObject::tr("Tox URI to parse")); parser.addOption(QCommandLineOption("p", QObject::tr("Starts new instance and loads specified profile."), QObject::tr("profile"))); parser.process(a); #ifndef Q_OS_ANDROID IPC& ipc = IPC::getInstance(); #endif sodium_init(); // For the auto-updater #ifdef LOG_TO_FILE logFileStream.reset(new QTextStream); logFileFile.reset(new QFile(Settings::getInstance().getSettingsDirPath()+"qtox.log")); if (logFileFile->open(QIODevice::Append)) { logFileStream->setDevice(logFileFile.get()); *logFileStream << QDateTime::currentDateTime().toString("\nyyyy-MM-dd HH:mm:ss' file logger starting\n'"); } else { qWarning() << "Couldn't open log file!\n"; logFileStream.release(); } #endif // Windows platform plugins DLL hell fix QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath()); a.addLibraryPath("platforms"); qDebug() << "built on: " << __TIME__ << __DATE__ << "(" << TIMESTAMP << ")"; qDebug() << "commit: " << GIT_VERSION << "\n"; #if defined(Q_OS_MACX) && defined(QT_RELEASE) osx::moveToAppFolder(); #endif // Install Unicode 6.1 supporting font QFontDatabase::addApplicationFont("://DejaVuSans.ttf"); // Check whether we have an update waiting to be installed #if AUTOUPDATE_ENABLED if (AutoUpdater::isLocalUpdateReady()) AutoUpdater::installLocalUpdate(); ///< NORETURN #endif #ifndef Q_OS_ANDROID // Inter-process communication ipc.registerEventHandler("uri", &toxURIEventHandler); ipc.registerEventHandler("save", &toxSaveEventHandler); ipc.registerEventHandler("activate", &toxActivateEventHandler); if (parser.isSet("p")) { QString profileName = parser.value("p"); if (Profile::exists(profileName)) { qDebug() << "Setting profile to" << profileName; if (Profile::isEncrypted(profileName)) { Settings::getInstance().setCurrentProfile(profileName); } else { Profile* profile = Profile::loadProfile(profileName); if (!profile) { qCritical() << "-p profile" << profileName + ".tox" << " couldn't be loaded"; return EXIT_FAILURE; } Nexus::getInstance().setProfile(profile); } } else { qCritical() << "-p profile" << profileName + ".tox" << "doesn't exist"; return EXIT_FAILURE; } } if (parser.positionalArguments().size() > 0) { QString firstParam(parser.positionalArguments()[0]); // Tox URIs. If there's already another qTox instance running, we ask it to handle the URI and we exit // Otherwise we start a new qTox instance and process it ourselves if (firstParam.startsWith("tox:")) { if (ipc.isCurrentOwner()) // Don't bother sending an event if we're going to process it ourselves { handleToxURI(firstParam.toUtf8()); } else { time_t event = ipc.postEvent("uri", firstParam.toUtf8()); ipc.waitUntilAccepted(event); // If someone else processed it, we're done here, no need to actually start qTox if (!ipc.isCurrentOwner()) return EXIT_SUCCESS; } } else if (firstParam.endsWith(".tox")) { if (ipc.isCurrentOwner()) // Don't bother sending an event if we're going to process it ourselves { handleToxSave(firstParam.toUtf8()); } else { time_t event = ipc.postEvent("save", firstParam.toUtf8()); ipc.waitUntilAccepted(event); // If someone else processed it, we're done here, no need to actually start qTox if (!ipc.isCurrentOwner()) return EXIT_SUCCESS; } } else { fprintf(stderr, "Invalid argument\n"); return EXIT_FAILURE; } } else if (!ipc.isCurrentOwner() && !parser.isSet("p")) { time_t event = ipc.postEvent("activate"); if (!ipc.waitUntilAccepted(event, 2)) { return EXIT_SUCCESS; } } #endif // Autologin if (Settings::getInstance().getAutoLogin()) { QString profileName = Settings::getInstance().getCurrentProfile(); if (Profile::exists(profileName) && !Profile::isEncrypted(profileName)) { Profile* profile = Profile::loadProfile(profileName); if (profile) Nexus::getInstance().setProfile(profile); } } Nexus::getInstance().start(); // Run int errorcode = a.exec(); #ifdef LOG_TO_FILE logFileStream.release(); #endif Nexus::destroyInstance(); CameraSource::destroyInstance(); Settings::destroyInstance(); qDebug() << "Clean exit with status"<<errorcode; return errorcode; }
bool ecSdoAsyn::isTrig(int param) { return rangeOkay(param) && ((param - firstParam()) % 3 == 2); }
bool ecSdoAsyn::isStat(int param) { return rangeOkay(param) && ((param - firstParam()) % 3 == 1); }
bool ecSdoAsyn::isVal(int param) { return rangeOkay(param) && ((param - firstParam()) % 3 == 0); }
bool ecSdoAsyn::rangeOkay(int param) { return (param >= firstParam() && param <= lastParam()); }