void Args::help(){ QTextStream qerr(stderr, QIODevice::WriteOnly); qerr << "Usage: " << program << " [flags]" << endl; qerr << "Options: " << endl; QHashIterator<QString, Arg*> i(this->args); while(i.hasNext()){ i.next(); Arg arg = *i.value(); /* print the short argument */ if(arg.getShortname() == ""){ qerr << QString("%1 ").arg("", 4); }else{ qerr << QString("%1, ").arg("-" + arg.getShortname(), 4); } /* print the long argument and the default value */ if(i.value()->getRequired()){ qerr << QString("%1=<%2>").arg("--" + i.key(), i.key().toUpper()); }else{ qerr << QString("%1=[%2]").arg("--" + i.key(), arg.getDefault().toString()); } /* print the help */ if(i.value()->getHelp().length()){ qerr << " -- " << i.value()->getHelp(); } qerr << endl; } }
void SsuCli::optFlavour(QStringList opt){ QTextStream qout(stdout); QTextStream qerr(stderr); if (opt.count() == 3 && opt.at(2) == "-s"){ qout << ssu.flavour(); state = Idle; } else if (opt.count() == 3){ qout << "Changing flavour from " << ssu.flavour() << " to " << opt.at(2) << endl; QDBusPendingReply<> reply = ssuProxy->setFlavour(opt.at(2)); reply.waitForFinished(); if (reply.isError()){ qerr << "DBus call failed, falling back to libssu" << endl; ssu.setFlavour(opt.at(2)); SsuRepoManager repoManager; repoManager.update(); uidWarning(); } state = Idle; } else if (opt.count() == 2) { qout << "Device flavour is currently: " << ssu.flavour() << endl; state = Idle; } }
void SsuCli::optModifyRepo(enum Actions action, QStringList opt){ SsuRepoManager repoManager; QTextStream qout(stdout); QTextStream qerr(stderr); if (opt.count() == 3){ QDBusPendingReply<> reply = ssuProxy->modifyRepo(action, opt.at(2)); reply.waitForFinished(); if (reply.isError()){ qerr << "DBus call failed, falling back to libssu" << endl; switch(action){ case Add: repoManager.add(opt.at(2)); repoManager.update(); uidWarning(); break; case Remove: repoManager.remove(opt.at(2)); repoManager.update(); uidWarning(); break; case Disable: repoManager.disable(opt.at(2)); repoManager.update(); uidWarning(); break; case Enable: repoManager.enable(opt.at(2)); repoManager.update(); uidWarning(); break; } } } else if (opt.count() == 4 && action == Add){ QString url, repo; if (opt.at(2).indexOf(QRegExp("[a-z]*://", Qt::CaseInsensitive)) == 0){ url = opt.at(2); repo = opt.at(3); } else if (opt.at(3).indexOf(QRegExp("[a-z]*://", Qt::CaseInsensitive)) == 0){ url = opt.at(3); repo = opt.at(2); } else { qerr << "Invalid parameters for 'ssu ar': URL required." << endl; return; } QDBusPendingReply<> reply = ssuProxy->addRepo(repo, url); reply.waitForFinished(); if (reply.isError()){ qerr << "DBus call failed, falling back to libssu" << endl; repoManager.add(repo, url); repoManager.update(); uidWarning(); } } }
void MainApp::reportError(const QString& error) { QTextStream qerr(stderr); qerr << "Error: " << error << endl; m_good = false; // won't work in initializeGL because main loop has not been entered yet qApp->quit(); }
void SsuCli::optModel(QStringList opt){ QTextStream qout(stdout); QTextStream qerr(stderr); SsuDeviceInfo deviceInfo; if (opt.count() == 3 && opt.at(2) == "-s"){ qout << deviceInfo.deviceModel(); state = Idle; } else if (opt.count() == 2){ qout << "Device model is: " << deviceInfo.deviceModel() << endl; state = Idle; } }
void SsuCli::optMode(QStringList opt){ QTextStream qout(stdout); QTextStream qerr(stderr); // TODO: allow setting meaningful names instead of numbers if (opt.count() == 2){ QStringList modeList; int deviceMode = ssu.deviceMode(); if ((deviceMode & Ssu::DisableRepoManager) == Ssu::DisableRepoManager) modeList.append("DisableRepoManager"); if ((deviceMode & Ssu::RndMode) == Ssu::RndMode) modeList.append("RndMode"); if ((deviceMode & Ssu::ReleaseMode) == Ssu::ReleaseMode) modeList.append("ReleaseMode"); if ((deviceMode & Ssu::LenientMode) == Ssu::LenientMode) modeList.append("LenientMode"); if ((deviceMode & Ssu::UpdateMode) == Ssu::UpdateMode) modeList.append("UpdateMode"); qout << "Device mode is: " << ssu.deviceMode() << " (" << modeList.join(" | ") << ")" << endl; if ((deviceMode & Ssu::RndMode) == Ssu::RndMode && (deviceMode & Ssu::ReleaseMode) == Ssu::ReleaseMode) qout << "Both Release and RnD mode set, device is in RnD mode" << endl; state = Idle; } else if (opt.count() == 3 && opt.at(2) == "-s"){ qout << ssu.deviceMode(); state = Idle; } else if (opt.count() == 3){ qout << "Setting device mode from " << ssu.deviceMode() << " to " << opt.at(2) << endl; QDBusPendingReply<> reply = ssuProxy->setDeviceMode(opt.at(2).toInt()); reply.waitForFinished(); if (reply.isError()){ qerr << "DBus call failed, falling back to libssu" << endl; ssu.setDeviceMode(Ssu::DeviceModeFlags(opt.at(2).toInt())); SsuRepoManager repoManager; repoManager.update(); uidWarning(); } state = Idle; } }
void SsuCli::optRelease(QStringList opt){ QTextStream qout(stdout); QTextStream qerr(stderr); if (opt.count() == 3){ if (opt.at(2) == "-r"){ qout << "Device release (RnD) is currently: " << ssu.release(true) << endl; state = Idle; } else { qout << "Changing release from " << ssu.release() << " to " << opt.at(2) << endl; qout << "Your device is now in release mode!" << endl; QDBusPendingReply<> reply = ssuProxy->setRelease(opt.at(2), false); reply.waitForFinished(); if (reply.isError()){ qerr << "DBus call failed, falling back to libssu" << endl; ssu.setRelease(opt.at(2)); SsuRepoManager repoManager; repoManager.update(); uidWarning(); } state = Idle; } } else if (opt.count() == 2) { qout << "Device release is currently: " << ssu.release() << endl; state = Idle; } else if (opt.count() == 4 && opt.at(2) == "-r"){ qout << "Changing release (RnD) from " << ssu.release(true) << " to " << opt.at(3) << endl; qout << "Your device is now in RnD mode!" << endl; QDBusPendingReply<> reply = ssuProxy->setRelease(opt.at(3), true); reply.waitForFinished(); if (reply.isError()){ qerr << "DBus call failed, falling back to libssu" << endl; ssu.setRelease(opt.at(3), true); SsuRepoManager repoManager; repoManager.update(); uidWarning(); } state = Idle; } }
void SsuCli::optRegister(QStringList opt){ /* * register a new device */ QString username, password; QTextStream qin(stdin); QTextStream qout(stdout); QTextStream qerr(stderr); SsuCoreConfig *ssuSettings = SsuCoreConfig::instance(); struct termios termNew, termOld; qout << "Username: "******"WARNING: Unable to disable echo on your terminal, password will echo!" << endl; qout << "Password: "******"-h") ssuSettings->setValue("repository-url-variables/user", username); QDBusPendingReply<> reply = ssuProxy->registerDevice(username, password); reply.waitForFinished(); if (reply.isError()){ qerr << "DBus call failed, falling back to libssu" << endl; qerr << reply.error().message() << endl; ssu.sendRegistration(username, password); } state = Busy; }
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QNetworkRequest req; QUrl *login_url = new QUrl("https://www.secure.pixiv.net/login.php?return_to=%2F"); req.setUrl(*login_url); req.setHeader(QNetworkRequest::UserAgentHeader, "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36"); req.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); QNetworkAccessManager man; QNetworkCookieJar *cookies = new QNetworkCookieJar(); man.setCookieJar(cookies); QByteArray *data = new QByteArray(); data->append("mode=login&return_to=http%3A%2F%2Fwww.pixiv.net%2F&pixiv_id=beta168921%40gmail.com&pass=xjy168921&skip=1"); QNetworkReply *reply = man.post(req,*data); QObject::connect(reply,&QNetworkReply::finished, [&reply, &man](){ QTextStream qerr(stderr); QList<QNetworkReply::RawHeaderPair> headers(reply->rawHeaderPairs()); for (int i = 0; i < headers.size(); ++i) { qerr << "HEADER: " << headers[i].first << " CONTENT: " << headers[i].second << "\n"; } // man(reply->manager()); // qerr << "\n\n"; // QList<QNetworkCookie> cookie(man->cookieJar()->cookiesForUrl(QUrl("http://www.pixiv.net"))); // for (int i = 0; i > cookie.size(); ++i) { // qerr << cookie[i].toRawForm(); // } // qerr << man.cookieJar()->cookiesForUrl(QUrl("http://www.pixiv.net")); }); // QTextStream qerr(stderr); return a.exec(); }
int Args::getFile(QFile *file, QString key, QFlags<QIODevice::OpenModeFlag> flags){ QTextStream qerr(stderr, QIODevice::WriteOnly); QString filename = getString(key); if(filename == "-"){ if(flags & QIODevice::ReadOnly){ qerr << "Reading from stdin" << endl; if(!file->open(stdin, flags)){ qerr << "Unable to read stdin, exiting" << endl; return -2; } }else{ qerr << "Writing to stdout" << endl; if(!file->open(stdout, flags)){ qerr << "Unable to write to stdout, exiting" << endl; return -3; } } }else{ file->setFileName(filename); if(flags & QIODevice::ReadOnly){ qerr << "Reading from " << filename << endl; if (!file->open(flags)){ qerr << "Unable to open '" << filename << "', exiting" << endl; return -4; } }else{ qerr << "Writing to " << filename << endl; if (!file->open(flags)){ qerr << "Unable to open '" << filename << "', exiting" << endl; return -4; } } } return 0; }
void SsuKs::run(){ QStringList arguments = QCoreApplication::arguments(); // get rid of the binary name arguments.removeFirst(); QTextStream qout(stdout); QTextStream qerr(stderr); QHash<QString, QString> repoParameters; if (arguments.count() == 1 && (arguments.at(0) == "help" || arguments.at(0) == "--help" || arguments.at(0) == "-h")) { usage(); return; } QString fileName; if (arguments.count() >= 1 && !arguments.at(0).contains("=")){ fileName = arguments.at(0); arguments.removeFirst(); } for (int i=0; i<arguments.count(); i++){ if (arguments.at(i).count("=") != 1){ qout << "Invalid flag: " << arguments.at(i) << endl; QCoreApplication::exit(1); return; } QStringList split = arguments.at(i).split("="); repoParameters.insert(split.at(0), split.at(1)); } QString sandbox; Sandbox *sb; if (repoParameters.contains("sandbox")){ sandbox = repoParameters.value("sandbox"); repoParameters.remove("sandbox"); sb = new Sandbox(sandbox, Sandbox::UseDirectly, Sandbox::ThisProcess); if (!sb->addWorldFiles(SSU_DATA_DIR)){ qerr << "Failed to copy files into sandbox, using empty sandbox" << endl; } if (sb->activate()) qerr << "Using sandbox at " << sandbox << endl; else { qerr << "Failed to activate sandbox" << endl; QCoreApplication::exit(1); return; } // force re-merge of settings QFile::remove(Sandbox::map(SSU_BOARD_MAPPING_CONFIGURATION)); SsuSettings(SSU_BOARD_MAPPING_CONFIGURATION, SSU_BOARD_MAPPING_CONFIGURATION_DIR); } SsuKickstarter kickstarter; kickstarter.setRepoParameters(repoParameters); QCoreApplication::exit(!kickstarter.write(fileName)); return; QCoreApplication::exit(0); }
/* * Process a machine op. */ VOID machine(struct mne * mp) { int op, t1, t2; struct expr e1, e2; int rf, v1, v2; clrexpr(&e1); clrexpr(&e2); op = (int) mp->m_valu; rf = mp->m_type; #if 0 if (!hd64 && rf>X_HD64) rf = 0; #endif if (!r4k_mode && rf > X_R4K_MODE) rf = 0; switch (rf) { case S_INH1: outab(op); break; case S_INH2: outab(0xED); outab(op); break; case S_RET: if (more()) { if ((v1 = admode(CND)) != 0) { outab(op | (v1<<3)); } else { qerr(); } } else { outab(0xC9); } break; case S_PUSH: if (admode(R16X)) { outab(op+0x30); break; } else if ((v1 = admode(R8IP)) != 0) { outab(0xED); if (op == 0xC5) outab(0x76); /* push */ else outab(0x7E); /* pop */ break; } else if ((v1 = admode(R16)) != 0 && (v1 &= 0xFF) != SP) { if (v1 != gixiy(v1)) { outab(op+0x20); break; } outab(op | (v1<<4)); break; } else if (r4k_mode) { if ( (v1 = admode(R32_JKHL)) != 0 ) { outab(JKHL_PG); outab(op+0x30); break; } else if ( (v1 = admode(R32_BCDE)) != 0 ) { outab(BCDE_PG); outab(op+0x30); break; } } aerr(); break; case S_RST: v1 = (int) absexpr(); /* ljm comment - * block RST 00, 08, and 30 b/c those opcodes * are assigned to different instructions in the * rabbit processor */ if ((v1 == 0x00) || (v1 == 0x08) || (v1 == 0x30)) { aerr( ); v1 = 0; } if (v1 & ~0x38) { aerr(); v1 = 0; } outab(op|v1); break; #if 0 /* IM x set interrupt mode on Z-80 */ /* Rabbit processor use the opcode to set interrupt level */ case S_IM: expr(&e1, 0); abscheck(&e1); if (e1.e_addr > 2) { aerr(); e1.e_addr = 0; } outab(op); outab(imtab[(int) e1.e_addr]); break; #endif case S_BIT: expr(&e1, 0); t1 = 0; v1 = (int) e1.e_addr; if (v1 > 7) { ++t1; v1 &= 0x07; } op |= (v1<<3); comma(1); addr(&e2); abscheck(&e1); if (genop(0xCB, op, &e2, 0) || t1) aerr(); break; case S_RL: t1 = 0; t2 = addr(&e2); if ((t2 == S_IMMED) && r4k_mode) { v1 = (int) e2.e_addr; /* v1 should be shift count of 1,2,4, or 8 */ comma(1); clrexpr(&e2); t2 = addr(&e2); if ((t2 != S_R32_BCDE) && (t2 != S_R32_JKHL)) aerr( ); if (v1 == 1) v1 = 0x48; else if (v1 == 2) v1 = 0x49; else if (v1 == 4) v1 = 0x4B; else if ((v1 == 8) && (op < 0x20 /* op is rlc|rrc|rl|rr */)) v1 = 0x4F; else { err('o'); break; } /* 00 rlc, 08 rrc, 10 rl , 18 rr * * 20 sla, 28 sra, 38 srl, [30 sll == sla] */ outab( ((t2 == S_R32_JKHL)?JKHL_PG:BCDE_PG) ); outab(v1 + (op << 1)); break; } else if (more()) { if ((t2 != S_R8) || (e2.e_addr != A)) ++t1; comma(1); clrexpr(&e2); t2 = addr(&e2); } else if (t2 == S_R16) { v2 = (int) e2.e_addr; if ((v2 == DE) && ((op == 0x10 /* rl */) || (op == 0x18 /* rr */))) { outab( 0xF3 - 0x10 + op ); break; } if ((v2 == HL) && (op == 0x18 /* rr */)) { outab( 0xFC ); break; } if (r4k_mode) { if ((v2 == HL) && (op == 0x10 /* rl */)) { outab( 0x42 ); break; } if (((v2 == BC)||(v2 == DE)) && (op < 0x20 /* 00 rlc, 08 rrc, 10 rl, 18 rr */)) { outab( 0x50 + (op >> 3) + ((v2==BC)?0x10:0x00) ); break; } } aerr( ); }
bool Args::parse(int argc, char **argv){ /* Simple class to parse some commandline arguments */ QTextStream qerr(stderr, QIODevice::WriteOnly); QHash<QString, QString> args; /* to accept parameters like -f=spam-eggs */ QRegExp short_key_value_re("-([^=-])=(.+)"); /* to accept parameters like -f */ QRegExp short_key_re("-([^=-]+)"); /* to accept parameters like --foo-bar=spam-eggs */ QRegExp key_value_re("--([^=]+)=(.+)"); /* to accept parameters like --foo-bar */ QRegExp key_re("--([^=]+)"); /* to accept values for space separated parameters */ QRegExp value_re("([^-]+.*|.)"); /* Using argc/argv so all parameters work, not just the ones not filtered out by Qt */ program = QString(argv[0]); for(int i=1; i<argc; i++){ int j; QString key; QString value; QString tmp = QString(argv[i]); if(short_key_value_re.exactMatch(tmp)){ key = short_key_value_re.cap(1); value = short_key_value_re.cap(2); if(key.length() > 1){ qerr << "Can't have multiple short arguments with values." \ << endl; qerr << "Did you forget a '-'? Try --" << key << "=" \ << value << " instead" << endl; return false; } }else if(short_key_re.exactMatch(tmp)){ key = short_key_re.cap(1); if(short_key_re.cap(1).length() != 1){ j = short_key_re.cap(1).length(); while(j--){ args.insert(QString(key[j]), value); } continue; } }else if(key_value_re.exactMatch(tmp)){ key = key_value_re.cap(1); value = key_value_re.cap(2); }else if(key_re.exactMatch(tmp)){ key = key_re.cap(1); } if(i+1 < argc){ tmp = QString(argv[i+1]); if(value == NULL && value_re.exactMatch(tmp)){ i++; value = value_re.cap(1); } } args.insert(key, value); } QHashIterator<QString, Arg*> j(this->args); while(j.hasNext()){ j.next(); Arg arg = *j.value(); if(args.contains(arg.getName())){ /* Called help, exiting to display help */ if(arg.getName() == "help"){ return false; } insert(arg.getName(), arg.callback(args.take(arg.getName()))); }else if(args.contains(arg.getShortname())){ /* Called help, exiting to display help */ if(arg.getName() == "help"){ return false; } insert(arg.getName(), arg.callback(args.take(arg.getShortname()))); }else if(arg.getRequired()){ qerr << "Argument '" << j.key() \ << "' is required and not given." << endl; return false; }else{ insert(arg.getName(), arg.getDefault()); } } if(!args.empty()){ qerr << "The following unsupported arguments were found:" << endl; QHashIterator<QString, QString> j(args); while(j.hasNext()){ j.next(); if(j.key().length() == 1){ qerr << "\t-"; }else{ qerr << "\t--"; } qerr << j.key(); if(j.value() != ""){ qerr << " with value: " << j.value(); } qerr << endl; } return false; } return true; }
int main(int argc, char **argv) { QTextStream qout(stdout, QIODevice::WriteOnly); QTextStream qerr(stderr, QIODevice::WriteOnly); QTextStream qin(stdin, QIODevice::ReadOnly); Args args; args.add(new Arg("h", "help", Arg::setTrue, QVariant(false))); args.add(new Arg("v", "verbose", Arg::setTrue, QVariant(false))); //args.add(new Arg("i", "input-file", Arg::readableFile, QVariant("/var/log/postgresql.log"))); args.add(new Arg("i", "input-file", Arg::readableFile, QVariant("/var/log/postgresql/postgresql-9.1-main.log"))); args.add(new Arg("o", "output-file", Arg::writableFile, QVariant("report.html"))); args.add(new Arg("u", "users", Arg::toString, QVariant())); args.add(new Arg("d", "databases", Arg::toString, QVariant())); args.add(new Arg("top", Arg::toInt, QVariant(20))); args.add(new Arg("t", "query-types", Arg::toString, QVariant("SELECT,UPDATE,INSERT,DELETE"))); if(!args.parse(argc, argv)) { args.help(); return -1; } QStringList users = args.getStringList("users"); QStringList databases = args.getStringList("databases"); QStringList query_types = args.getStringList("query-types"); int ret; QString line; int start_index; int stop_index; int old_query_id; int new_query_id; int old_line_id; int new_line_id; QString database; QString user; QString statement; uint duration; QFile input_file; ret = args.getFile(&input_file, "input-file", QIODevice::ReadOnly | QIODevice::Text); if(ret)return ret; QFile output_file; ret = args.getFile(&output_file, "output-file", QIODevice::WriteOnly | QIODevice::Text); if(ret)return ret; QTextStream output(&output_file); /* display the top N queries */ int top = args.getInt("top"); Queries queries; old_query_id = -1; old_line_id = -0; statement = ""; duration = 0; QTime timer; timer.start(); uint lines = 0; if(input_file.atEnd()) { qerr << "The input file (" << input_file.fileName(); qerr << ") seems to be empty" << endl; } while (!input_file.atEnd()) { line = input_file.readLine(4096); lines++; if(lines % 1000 == 0) { qout << "Read " << lines << " lines." << endl; qout.flush(); } if(line[0] == '\t') { statement.append(line); continue; } start_index = line.indexOf("[", 15); start_index = line.indexOf("[", start_index + 3) + 1; stop_index = line.indexOf("-", start_index); new_query_id = line.mid(start_index, stop_index - start_index).toInt(); start_index = stop_index + 1; stop_index = line.indexOf("]", start_index); new_line_id = line.mid(start_index, stop_index - start_index).toInt(); if(new_query_id != old_query_id || old_line_id < new_line_id) { old_query_id = new_query_id; QString hashStatement = Query::normalize(statement); statement = Query::format(statement); if(( hashStatement.startsWith("INSERT") || hashStatement.startsWith("DELETE") || hashStatement.startsWith("UPDATE") || hashStatement.startsWith("SELECT") ) && (!users.length() || users.contains(user)) && (!databases.length() || databases.contains(database))) { uint hash = qHash(hashStatement); if(queries.contains(hash)) { queries[hash]->addStatement(duration, statement); } else { queries.insert(hash, new Query(hashStatement, statement, user, database, duration)); } } user = ""; database = ""; duration = 0; statement = ""; start_index = line.indexOf("user="******",", start_index); user = line.mid(start_index, stop_index - start_index); start_index = line.indexOf("db=", stop_index) + 3; stop_index = line.indexOf(" ", start_index); if(start_index == -1 || stop_index == -1)continue; database = line.mid(start_index, stop_index - start_index); start_index = line.indexOf("duration: ", stop_index) + 10; stop_index = line.indexOf(" ", start_index); duration = line.mid(start_index, stop_index - start_index).toDouble() * 1000; start_index = line.indexOf("statement: ", stop_index) + 11; if(start_index < stop_index)continue; stop_index = line.length(); statement = line.mid(start_index, stop_index - start_index); } else { start_index = line.indexOf("] ", stop_index); if(start_index != -1) { start_index += 2; stop_index = line.length() - start_index; statement.append(line.mid(start_index, line.length() - start_index)); } } } QFile header(":templates/header.html"); if (!header.open(QIODevice::ReadOnly | QIODevice::Text)) { qout << "Unable to open templates/header.html" << endl; return -4; } else { output << header.readAll(); header.close(); } QList<Query*> queries_sorted; output << QString("<div class=\"information\">" "<ul>" "<li>Generated on %1</li>" "<li>Parsed %2 (%3 lines) in %4 ms</li>" "</ul>" "</div>") \ .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")) \ .arg(args.getString("input_file")) \ .arg(lines) \ .arg(timer.elapsed()); output << "<div class=\"reports\">"; output << "<h2 id=\"NormalizedQueriesMostTimeReport\">Queries that took up the most time (N) <a href=\"#top\" title=\"Back to top\">^</a></h2>"; output << print_queries(queries.sortedQueries(Queries::mostTotalDuration), top); output << "<h2 id=\"NormalizedQueriesMostFrequentReport\">Most frequent queries (N) <a href=\"#top\" title=\"Back to top\">^</a></h2>"; output << print_queries(queries.sortedQueries(Queries::mostExecutions), top); output << "<h2 id=\"NormalizedQueriesSlowestAverageReport\">Slowest queries (N) <a href=\"#top\" title=\"Back to top\">^</a></h2>"; output << print_queries(queries.sortedQueries(Queries::mostAverageDuration), top); QFile footer(":templates/footer.html"); if (!footer.open(QIODevice::ReadOnly | QIODevice::Text)) { qout << "Unable to open templates/footer.html" << endl; return -5; } else { output << footer.readAll(); footer.close(); } qout << "Wrote to file " << args.getString("output-file") << endl; }
/* * Process machine ops. */ VOID machine(struct mne *mp) { char *p, *str; char pid[NINPUT], id[NINPUT]; int c, d, t, t1, v1; a_uint op; struct sym *sp; struct expr e, e1, e2; clrexpr(&e); clrexpr(&e1); clrexpr(&e2); op = mp->m_valu; switch (mp->m_type) { case S_CPU: opcycles = OPCY_CPU; lmode = SLIST; switch(op) { default: op = DS8XCXXX; case DS8XCXXX: v1 = 2; str = "DS8XCXXX"; sym[2].s_addr = X_DS8XCXXX; break; case DS80C310: v1 = 2; str = "DS80C310"; sym[2].s_addr = X_DS80C310; break; case DS80C320: v1 = 2; str = "DS80C320"; sym[2].s_addr = X_DS80C320; break; case DS80C323: v1 = 2; str = "DS80C323"; sym[2].s_addr = X_DS80C323; break; case DS80C390: v1 = 3; str = "DS80C390"; sym[2].s_addr = X_DS80C390; break; case DS83C520: v1 = 2; str = "DS83C520"; sym[2].s_addr = X_DS83C520; break; case DS83C530: v1 = 2; str = "DS83C530"; sym[2].s_addr = X_DS83C530; break; case DS83C550: v1 = 2; str = "DS83C550"; sym[2].s_addr = X_DS83C550; break; case DS87C520: v1 = 2; str = "DS87C520"; sym[2].s_addr = X_DS87C520; break; case DS87C530: v1 = 2; str = "DS87C530"; sym[2].s_addr = X_DS87C530; break; case DS87C550: v1 = 2; str = "DS87C550"; sym[2].s_addr = X_DS87C550; break; case DS______: v1 = 2; str = "DS______"; sym[2].s_addr = X_DS______; if (more()) { str = p = pid; d = getnb(); while ((c = get()) != d) { if (c == '\0') { qerr(); } if (p < &pid[sizeof(pid)-3]) { *p++ = c; } else { break; } } *p = 0; } break; } if (op != 0) { ds8_bytes = v1; exprmasks(v1); } mchtyp = (int) op; sprintf(id, "__%s", str); sp = lookup(id); if (sp->s_type != S_NEW && (sp->s_flag & S_ASG) == 0) { err('m'); } sp->s_type = S_USER; sp->s_addr = 1; sp->s_flag |= S_ASG; sprintf(buff, "%s %s", DS_CPU, str); cpu = buff; sp = lookup("__SFR_BITS"); if (sp->s_type != S_NEW && (sp->s_flag & S_ASG) == 0) { err('m'); } sp->s_type = S_USER; sp->s_flag |= S_ASG; if (more()) { expr(&e, 0); abscheck(&e); sp->s_addr = e.e_addr; } else { sp->s_addr = 1; } break; case S_AMODE: opcycles = OPCY_AMODE; if ((mchtyp != 0) && (mchtyp != DS80C390)) { err('o'); break; } expr(&e, 0); abscheck(&e); amode = (int) e.e_addr; if ((amode < 0) || (amode > 2)) { amode = 0; err('o'); } if ((c = getnb()) == ',') { expr(&e1, 0); abscheck(&e1); if (e1.e_addr != 0) { /* mov ta,#0aah */ outab(0x075); outab(0x0C7); outab(0x0AA); /* mov ta,#055h */ outab(0x075); outab(0x0C7); outab(0x055); /* mov acon,#amode */ outab(0x075); outab(0x09D); outab(amode); } else { lmode = SLIST; } } else { unget(c); lmode = SLIST; } break; case S_BITS: if (ds8_bytes == 0) { ds8_bytes = (int) op; exprmasks(ds8_bytes); } else if (ds8_bytes != (int) op) { err('m'); } opcycles = OPCY_BITS; lmode = SLIST; break; case S_INH: outab(op); break; case S_JMP11: expr(&e, 0); if (amode == 2) { outr3bm(&e, R_J19, op); } else { outrwm(&e, R_J11, op); } break; case S_JMP16: expr(&e, 0); outab(op); if (amode == 2) { outr3b(&e, R_NORM); } else { outrw(&e, R_NORM); } break; case S_ACC: t = addr(&e); if (t != S_A) aerr(); outab(op); break; case S_TYP1: /* A, direct, @R0, @R1, R0 to R7. "INC" also allows DPTR */ t = addr(&e); switch (t) { case S_A: outab(op + 4); break; case S_DIR: case S_EXT: /* Direct is also legal */ outab(op + 5); outrb(&e, R_PAG0); break; case S_AT_R: outab(op + 6 + e.e_addr); break; case S_REG: outab(op + 8 + e.e_addr); break; case S_DPTR: if (op != 0) /* only INC (op=0) has DPTR mode */ aerr(); else outab( 0xA3); break; default: aerr(); } break; case S_TYP2: /* A,#imm; A,direct; A,@R0; A,@R1; A,R0 to A,R7 */ t = addr(&e); if (t != S_A) aerr(); comma(1); t1 = addr(&e1); switch (t1) { case S_IMMED: outab(op + 4); outrb(&e1, R_NORM); break; case S_DIR: case S_EXT: outab(op + 5); outrb(&e1, R_PAG0); break; case S_AT_R: outab(op + 6 + e1.e_addr); break; case S_REG: outab(op + 8 + (e1.e_addr)); break; default: aerr(); } break; case S_TYP3: /* dir,A; dir,#imm; * A,#imm; A,direct; A,@R0; A,@R1; A,R0 to A,R7 * C,direct; C,/direct */ t = addr(&e); comma(1); t1 = addr(&e1); switch (t) { case S_DIR: case S_EXT: switch (t1) { case S_A: outab(op + 2); outrb(&e, R_PAG0); break; case S_IMMED: outab(op + 3); outrb(&e, R_PAG0); outrb(&e1, R_NORM); break; default: aerr(); } break; case S_A: switch (t1) { case S_IMMED: outab(op + 4); outrb(&e1, R_NORM); break; case S_DIR: case S_EXT: outab(op + 5); outrb(&e1, R_PAG0); break; case S_AT_R: outab(op + 6 + e1.e_addr); break; case S_REG: outab(op + 8 + e1.e_addr); break; default: aerr(); } break; case S_C: /* XRL has no boolean version. Trap it */ if (op == 0x60) aerr(); switch (t1) { case S_DIR: case S_EXT: outab(op + 0x32); outrb(&e1, R_PAG0); break; case S_NOT_BIT: outab(op + 0x60); outrb(&e1, R_PAG0); break; default: aerr(); } break; default: aerr(); } break; case S_TYP4: /* A,direct; A,@R0; A,@R1; A,R0 to A,R7 */ t = addr(&e); if (t != S_A) aerr(); comma(1); t1 = addr(&e1); switch (t1) { case S_DIR: case S_EXT: outab(op + 5); outrb(&e1, R_PAG0); break; case S_AT_R: outab(op + 6 + e1.e_addr); break; case S_REG: outab(op + 8 + e1.e_addr); break; default: aerr(); } break; /* MOV instruction, all modes */ case S_MOV: t = addr(&e); comma(1); t1 = addr(&e1); switch (t) { case S_A: switch (t1) { case S_IMMED: outab(0x74); outrb(&e1, R_NORM); break; case S_DIR: case S_EXT: outab(0xE5); outrb(&e1, R_PAG0); break; case S_AT_R: outab(0xE6 + e1.e_addr); break; case S_REG: outab(0xE8 + e1.e_addr); break; default: aerr(); } break; case S_REG: switch (t1) { case S_A: outab(0xF8 + e.e_addr); break; case S_IMMED: outab(0x78 + e.e_addr); outrb(&e1, R_NORM); break; case S_DIR: case S_EXT: outab(0xA8 + e.e_addr); outrb(&e1, R_PAG0); break; default: aerr(); } break; case S_DIR: case S_EXT: switch (t1) { case S_A: outab(0xF5); outrb(&e, R_PAG0); break; case S_IMMED: outab(0x75); outrb(&e, R_PAG0); outrb(&e1, R_NORM); break; case S_DIR: case S_EXT: outab(0x85); outrb(&e1, R_PAG0); outrb(&e, R_PAG0); break; case S_AT_R: outab(0x86 + e1.e_addr); outrb(&e, R_PAG0); break; case S_REG: outab(0x88 + e1.e_addr); outrb(&e, R_PAG0); break; case S_C: outab(0x92); outrb(&e, R_PAG0); break; default: aerr(); } break; case S_AT_R: switch (t1) { case S_IMMED: outab(0x76 + e.e_addr); outrb(&e1, R_NORM); break; case S_DIR: case S_EXT: outab(0xA6 + e.e_addr); outrb(&e1, R_PAG0); break; case S_A: outab(0xF6 + e.e_addr); break; default: aerr(); } break; case S_C: if ((t1 != S_DIR) && (t1 != S_EXT)) aerr(); outab(0xA2); outrb(&e1, R_PAG0); break; case S_DPTR: if (t1 != S_IMMED) aerr(); outab(0x90); if (amode == 2) outr3b(&e1, R_NORM); else outrw(&e1, R_NORM); break; default: aerr(); } break; case S_BITBR: /* JB, JBC, JNB bit,rel */ /* Branch on bit set/clear */ t = addr(&e); if ((t != S_DIR) && (t != S_EXT)) aerr(); /* sdcc svn rev #4994: fixed bug 1865114 */ comma(1); expr(&e1, 0); outab(op); outrb(&e, R_PAG0); if (mchpcr(&e1)) { v1 = (int) (e1.e_addr - dot.s_addr - 1); /* sdcc svn rev #602: Fix some path problems */ if (pass == 2 && ((v1 < -128) || (v1 > 127))) aerr(); outab(v1); } else { outrb(&e1, R_PCR); } if (e1.e_mode != S_USER) rerr(); break; case S_BR: /* JC, JNC, JZ, JNZ */ /* Relative branch */ /* sdcc svn rev #4994: fixed bug 1865114 */ expr(&e1, 0); outab(op); if (mchpcr(&e1)) { v1 = (int) (e1.e_addr - dot.s_addr - 1); /* sdcc svn rev #602: Fix some path problems */ if (pass == 2 && ((v1 < -128) || (v1 > 127))) aerr(); outab(v1); } else { outrb(&e1, R_PCR); } if (e1.e_mode != S_USER) rerr(); break; case S_CJNE: /* A,#; A,dir; @R0,#; @R1,#; Rn,# */ t = addr(&e); comma(1); t1 = addr(&e1); /* Benny */ comma(1); expr(&e2, 0); switch (t) { case S_A: if (t1 == S_IMMED) { outab(op + 4); outrb(&e1, R_NORM); } else if ((t1 == S_DIR) || (t1 == S_EXT)) { outab(op + 5); outrb(&e1, R_PAG0); } else aerr(); break; case S_AT_R: outab(op + 6 + e.e_addr); if (t1 != S_IMMED) aerr(); outrb(&e1, R_NORM); break; case S_REG: outab(op + 8 + e.e_addr); if (t1 != S_IMMED) aerr(); outrb(&e1, R_NORM); break; default: aerr(); break; } /* branch destination */ if (mchpcr(&e2)) { v1 = (int) (e2.e_addr - dot.s_addr - 1); /* sdcc svn rev #602: Fix some path problems */ if (pass == 2 && ((v1 < -128) || (v1 > 127))) aerr(); outab(v1); } else { outrb(&e2, R_PCR); } if (e2.e_mode != S_USER) rerr(); break; case S_DJNZ: /* Dir,dest; Reg,dest */ t = addr(&e); /* sdcc svn rev #4994: fixed bug 1865114 */ comma(1); expr(&e1, 0); switch (t) { case S_DIR: case S_EXT: outab(op + 5); outrb(&e, R_PAG0); break; case S_REG: outab(op + 8 + e.e_addr); break; default: aerr(); } /* branch destination */ /* sdcc svn rev #4994: fixed bug 1865114 */ if (mchpcr(&e1)) { v1 = (int) (e1.e_addr - dot.s_addr - 1); /* sdcc svn rev #602: Fix some path problems */ if (pass == 2 && ((v1 < -128) || (v1 > 127))) aerr(); outab(v1); } else { outrb(&e1, R_PCR); } if (e1.e_mode != S_USER) rerr(); break; case S_JMP: /* @A+DPTR */ t = addr(&e); if (t != S_AT_ADP) aerr(); outab(op); break; case S_MOVC: /* A,@A+DPTR A,@A+PC */ t = addr(&e); if (t != S_A) aerr(); comma(1); t1 = addr(&e1); if (t1 == S_AT_ADP) outab(0x93); else if (t1 == S_AT_APC) outab(0x83); else aerr(); break; case S_MOVX: /* A,@DPTR A,@R0 A,@R1 @DPTR,A @R0,A @R1,A */ t = addr(&e); comma(1); t1 = addr(&e1); switch (t) { case S_A: switch (t1) { case S_AT_DP: outab(0xE0); break; case S_AT_R: outab(0xE2 + e1.e_addr); break; default: aerr(); } break; case S_AT_DP: if (t1 == S_A) outab(0xF0); else aerr(); break; case S_AT_R: if (t1 == S_A) outab(0xF2 + e.e_addr); else aerr(); break; default: aerr(); } break; /* MUL/DIV A,B */ case S_AB: t = addr(&e); if (t != S_RAB) aerr(); outab(op); break; /* CLR or CPL: A, C, or bit */ case S_ACBIT: t = addr(&e); switch (t) { case S_A: if (op == 0xB2) outab(0xF4); else outab(0xE4); break; case S_C: outab(op+1); break; case S_DIR: case S_EXT: outab(op); outrb(&e, R_PAG0); break; default: aerr(); } break; /* SETB C or bit */ case S_SETB: t = addr(&e); switch (t) { case S_C: outab(op+1); break; case S_DIR: case S_EXT: outab(op); outrb(&e, R_PAG0); break; default: aerr(); } break; /* direct */ case S_DIRECT: t = addr(&e); if (t == S_A) { e.e_addr = 0xE0; e.e_mode = S_DIR; } else if ((t != S_DIR) && (t != S_EXT)) { aerr(); break; } outab(op); outrb(&e, R_PAG0); break; /* XCHD A,@Rn */ case S_XCHD: t = addr(&e); if (t != S_A) aerr(); comma(1); t1 = addr(&e1); switch (t1) { case S_AT_R: outab(op + e1.e_addr); break; default: aerr(); } break; default: opcycles = OPCY_ERR; err('o'); break; } if (opcycles == OPCY_NONE) { opcycles = ds8pg1[cb[0] & 0xFF]; } }