// -*- mode: c++; tab-width: 4; indent-tabs-mode: t; eval: (progn (c-set-style "stroustrup") (c-set-offset 'innamespace 0)); -*- // vi:set ts=4 sts=4 sw=4 noet : // // Copyright 2010, 2011 wkhtmltopdf authors // // This file is part of wkhtmltopdf. // // wkhtmltopdf is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // wkhtmltopdf is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with wkhtmltopdf. If not, see . #include "commandlineparserbase.hh" #include "outputter.hh" #include bool ahsort(const ArgHandler * a, const ArgHandler * b) { QRegExp e("^(no|enable|disable|include-in|exclude-from)-"); QString x=a->longName; QString y=b->longName; x.remove(e); y.remove(e); if (x == y) { QRegExp e("^no-"); x=a->longName; y=b->longName; x.replace(e,"zzzz"); y.replace(e,"zzzz"); } return x < y; } /*! Output description of switches to an outputter \param o The outputter to output to \param extended Should we also output extended arguments \param doc Indicate to the outputter that it is writing documentation */ void CommandLineParserBase::outputSwitches(Outputter * o, bool extended, bool doc) const { foreach (const QString & section, sections) { QList display; foreach (const ArgHandler * handler, sectionArgumentHandles[section]) { #ifndef __EXTENSIVE_WKHTMLTOPDF_QT_HACK__ if (!doc && handler->qthack) continue; #else Q_UNUSED(doc); #endif if (!extended && handler->extended) continue; display.push_back(handler); } qSort(display.begin(), display.end(), ahsort); if (display.size() == 0) continue; o->beginSection(section); if (!sectionDesc[section].isEmpty()) { o->beginParagraph(); o->text(sectionDesc[section]); o->endParagraph(); } o->beginSwitch(); foreach (const ArgHandler * handler, display) o->cswitch(handler); o->endSwitch(); o->endSection(); } } #define STRINGIZE_(x) #x #define STRINGIZE(x) STRINGIZE_(x) const char *CommandLineParserBase::appVersion() const { #ifdef __EXTENSIVE_WKHTMLTOPDF_QT_HACK__ return STRINGIZE(FULL_VERSION) " (with patched qt)"; #else return STRINGIZE(FULL_VERSION); #endif } /*! Output version information aka. --version \param fd The file to output to */ void CommandLineParserBase::version(FILE * fd) const { fprintf(fd, "%s %s\n", appName().toLocal8Bit().constData(), appVersion()); } /*! Output license information aka. --license \param fd The file to output to */ void CommandLineParserBase::license(FILE * fd) const { Outputter * o = Outputter::text(fd,false); outputName(o); outputAuthors(o); outputLicense(o); delete o; } void CommandLineParserBase::parseArg(int sections, const int argc, const char ** argv, bool & defaultMode, int & arg, char * page) { if (argv[arg][1] == '-') { //We have a long style argument //After an -- apperas in the argument list all that follows is interpreted as default arguments if (argv[arg][2] == '0') { defaultMode=true; return; } //Try to find a handler for this long switch QHash::iterator j = longToHandler.find(argv[arg]+2); if (j == longToHandler.end()) { //Ups that argument did not exist fprintf(stderr, "Unknown long argument %s\n\n", argv[arg]); usage(stderr, false); exit(1); } if (!(j.value()->section & sections)) { fprintf(stderr, "%s specified in incorrect location\n\n", argv[arg]); usage(stderr, false); exit(1); } //Check to see if there is enough arguments to the switch if (argc-arg < j.value()->argn.size()+1) { fprintf(stderr, "Not enough arguments parsed to %s\n\n", argv[arg]); usage(stderr, false); exit(1); } if (!(*(j.value()))(argv+arg+1, *this, page)) { fprintf(stderr, "Invalid argument(s) parsed to %s\n\n", argv[arg]); usage(stderr, false); exit(1); } #ifndef __EXTENSIVE_WKHTMLTOPDF_QT_HACK__ if (j.value()->qthack) fprintf(stderr, "The switch %s, is not support using unpatched qt, and will be ignored.", argv[arg]); #endif //Skip already handled switch arguments arg += j.value()->argn.size(); } else { int c=arg;//Remember the current argument we are parsing for (int j=1; argv[c][j] != '\0'; ++j) { QHash::iterator k = shortToHandler.find(argv[c][j]); //If the short argument is invalid print usage information and exit if (k == shortToHandler.end()) { fprintf(stderr, "Unknown switch -%c\n\n", argv[c][j]); usage(stderr, false); exit(1); } if (!(k.value()->section & sections)) { fprintf(stderr, "-%c specified in incorrect location\n\n", argv[c][j]); usage(stderr, false); exit(1); } //Check to see if there is enough arguments to the switch if (argc-arg < k.value()->argn.size()+1) { fprintf(stderr, "Not enough arguments parsed to -%c\n\n", argv[c][j]); usage(stderr, false); exit(1); } if (!(*(k.value()))(argv+arg+1, *this, page)) { fprintf(stderr, "Invalid argument(s) parsed to -%c\n\n", argv[c][j]); usage(stderr, false); exit(1); } #ifndef __EXTENSIVE_WKHTMLTOPDF_QT_HACK__ if (k.value()->qthack) fprintf(stderr, "The switch -%c, is not support using unpatched qt, and will be ignored.", argv[c][j]); #endif //Skip already handled switch arguments arg += k.value()->argn.size(); } } }