source: wkhtmltox/trunk/fuentes/src/shared/commandlineparserbase.cc @ 51

Last change on this file since 51 was 51, checked in by mabarracus, 4 years ago

wip

File size: 5.6 KB
Line 
1// -*- mode: c++; tab-width: 4; indent-tabs-mode: t; eval: (progn (c-set-style "stroustrup") (c-set-offset 'innamespace 0)); -*-
2// vi:set ts=4 sts=4 sw=4 noet :
3//
4// Copyright 2010, 2011 wkhtmltopdf authors
5//
6// This file is part of wkhtmltopdf.
7//
8// wkhtmltopdf is free software: you can redistribute it and/or modify
9// it under the terms of the GNU Lesser General Public License as published by
10// the Free Software Foundation, either version 3 of the License, or
11// (at your option) any later version.
12//
13// wkhtmltopdf is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16// GNU General Public License for more details.
17//
18// You should have received a copy of the GNU Lesser General Public License
19// along with wkhtmltopdf.  If not, see <http://www.gnu.org/licenses/>.
20
21#include "commandlineparserbase.hh"
22#include "outputter.hh"
23#include <qwebframe.h>
24
25bool ahsort(const ArgHandler * a, const ArgHandler * b) {
26        QRegExp e("^(no|enable|disable|include-in|exclude-from)-");
27        QString x=a->longName;
28        QString y=b->longName;
29        x.remove(e);
30        y.remove(e);
31        if (x == y) {
32                QRegExp e("^no-");
33                x=a->longName;
34                y=b->longName;
35                x.replace(e,"zzzz");
36                y.replace(e,"zzzz");
37        }
38        return x < y;
39}
40
41/*!
42  Output description of switches to an outputter
43  \param o The outputter to output to
44  \param extended Should we also output extended arguments
45  \param doc Indicate to the outputter that it is writing documentation
46*/
47void CommandLineParserBase::outputSwitches(Outputter * o, bool extended, bool doc) const {
48        foreach (const QString & section, sections) {
49                QList<const ArgHandler *> display;
50                foreach (const ArgHandler * handler, sectionArgumentHandles[section]) {
51#ifndef __EXTENSIVE_WKHTMLTOPDF_QT_HACK__
52                        if (!doc && handler->qthack) continue;
53#else
54                        Q_UNUSED(doc);
55#endif
56                        if (!extended && handler->extended) continue;
57                        display.push_back(handler);
58                }
59                qSort(display.begin(), display.end(), ahsort);
60                if (display.size() == 0) continue;
61                o->beginSection(section);
62                if (!sectionDesc[section].isEmpty()) {
63                        o->beginParagraph();
64                        o->text(sectionDesc[section]);
65                        o->endParagraph();
66                }
67                o->beginSwitch();
68                foreach (const ArgHandler * handler, display)
69                        o->cswitch(handler);
70                o->endSwitch();
71                o->endSection();
72        }
73}
74
75#define STRINGIZE_(x) #x
76#define STRINGIZE(x) STRINGIZE_(x)
77
78const char *CommandLineParserBase::appVersion() const {
79#ifdef __EXTENSIVE_WKHTMLTOPDF_QT_HACK__
80        return STRINGIZE(FULL_VERSION) " (with patched qt)";
81#else
82        return STRINGIZE(FULL_VERSION);
83#endif
84}
85
86/*!
87  Output version information aka. --version
88  \param fd The file to output to
89*/
90void CommandLineParserBase::version(FILE * fd) const {
91        fprintf(fd, "%s %s\n", appName().toLocal8Bit().constData(), appVersion());
92}
93
94/*!
95  Output license information aka. --license
96  \param fd The file to output to
97*/
98void CommandLineParserBase::license(FILE * fd) const {
99        Outputter * o = Outputter::text(fd,false);
100        outputName(o);
101        outputAuthors(o);
102        outputLicense(o);
103        delete o;
104}
105
106void CommandLineParserBase::parseArg(int sections, const int argc, const char ** argv, bool & defaultMode, int & arg, char * page) {
107        if (argv[arg][1] == '-') { //We have a long style argument
108                //After an -- apperas in the argument list all that follows is interpreted as default arguments
109                if (argv[arg][2] == '0') {
110                        defaultMode=true;
111                        return;
112                }
113                //Try to find a handler for this long switch
114                QHash<QString, ArgHandler*>::iterator j = longToHandler.find(argv[arg]+2);
115                if (j == longToHandler.end()) { //Ups that argument did not exist
116                        fprintf(stderr, "Unknown long argument %s\n\n", argv[arg]);
117                        usage(stderr, false);
118                        exit(1);
119                }
120                if (!(j.value()->section & sections)) {
121                        fprintf(stderr, "%s specified in incorrect location\n\n", argv[arg]);
122                        usage(stderr, false);
123                        exit(1);
124                }
125                //Check to see if there is enough arguments to the switch
126                if (argc-arg < j.value()->argn.size()+1) {
127                        fprintf(stderr, "Not enough arguments parsed to %s\n\n", argv[arg]);
128                        usage(stderr, false);
129                        exit(1);
130                }
131                if (!(*(j.value()))(argv+arg+1, *this, page)) {
132                        fprintf(stderr, "Invalid argument(s) parsed to %s\n\n", argv[arg]);
133                        usage(stderr, false);
134                        exit(1);
135                }
136#ifndef __EXTENSIVE_WKHTMLTOPDF_QT_HACK__
137                if (j.value()->qthack)
138                        fprintf(stderr, "The switch %s, is not support using unpatched qt, and will be ignored.", argv[arg]);
139#endif
140                //Skip already handled switch arguments
141                arg += j.value()->argn.size();
142        } else {
143                int c=arg;//Remember the current argument we are parsing
144                for (int j=1; argv[c][j] != '\0'; ++j) {
145                        QHash<char, ArgHandler*>::iterator k = shortToHandler.find(argv[c][j]);
146                        //If the short argument is invalid print usage information and exit
147                        if (k == shortToHandler.end()) {
148                                fprintf(stderr, "Unknown switch -%c\n\n", argv[c][j]);
149                                usage(stderr, false);
150                                exit(1);
151                        }
152
153                        if (!(k.value()->section & sections)) {
154                                fprintf(stderr, "-%c specified in incorrect location\n\n", argv[c][j]);
155                                usage(stderr, false);
156                                exit(1);
157                        }
158                        //Check to see if there is enough arguments to the switch
159                        if (argc-arg < k.value()->argn.size()+1) {
160                                fprintf(stderr, "Not enough arguments parsed to -%c\n\n", argv[c][j]);
161                                usage(stderr, false);
162                                exit(1);
163                        }
164                        if (!(*(k.value()))(argv+arg+1, *this, page)) {
165                                fprintf(stderr, "Invalid argument(s) parsed to -%c\n\n", argv[c][j]);
166                                usage(stderr, false);
167                                exit(1);
168                        }
169#ifndef __EXTENSIVE_WKHTMLTOPDF_QT_HACK__
170                        if (k.value()->qthack)
171                                fprintf(stderr, "The switch -%c, is not support using unpatched qt, and will be ignored.", argv[c][j]);
172#endif
173                        //Skip already handled switch arguments
174                        arg += k.value()->argn.size();
175                }
176        }
177}
Note: See TracBrowser for help on using the repository browser.