summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-04-26 05:58:49 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-04-26 05:58:49 +0000
commit90d5b5c0a268e145cd121a0bcf2bdc0b624f0ca3 (patch)
tree913532d3875403d87d38037dcca0e15c3fed539c /src
parent0f92203ffebb18f754cffecc06dcb2bea2189594 (diff)
2008-04-26 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Added StringFormat class, which internally calls vasprintf. operator<< is defined for this class, so it can be used with iostream classes nicely. SimpleLogger and following functions are rewritten using StringFormat class. Besides, now Logger class's methods are non-const, many classes that has a const Logger* as a member variable are modified to remove const qualifier from the variable declaration. * src/HelpItemFactory.cc * src/Request.cc * src/SimpleLogger.cc * src/StringFormat.cc * src/StringFormat.h * src/Util.cc * src/option_processing.cc * src/version_usage.cc * test/StringFormatTest.cc * src/*.h: The classes that has const Logger* as a member variable.
Diffstat (limited to 'src')
-rw-r--r--src/AbstractBtMessage.h2
-rw-r--r--src/AbstractDiskWriter.h2
-rw-r--r--src/BtDependency.h2
-rw-r--r--src/BtLeecherStateChoke.h2
-rw-r--r--src/BtSeederStateChoke.h2
-rw-r--r--src/BtSetup.h2
-rw-r--r--src/Command.h2
-rw-r--r--src/DHTAbstractTask.h2
-rw-r--r--src/DHTBucket.h2
-rw-r--r--src/DHTConnectionImpl.h2
-rw-r--r--src/DHTMessageDispatcherImpl.h2
-rw-r--r--src/DHTMessageFactoryImpl.h2
-rw-r--r--src/DHTMessageReceiver.h2
-rw-r--r--src/DHTMessageTracker.h2
-rw-r--r--src/DHTPeerAnnounceStorage.h2
-rw-r--r--src/DHTRoutingTable.h2
-rw-r--r--src/DHTSetup.h2
-rw-r--r--src/DHTTaskFactoryImpl.h2
-rw-r--r--src/DefaultBtContext.h2
-rw-r--r--src/DefaultBtInteractive.h2
-rw-r--r--src/DefaultBtMessageDispatcher.h2
-rw-r--r--src/DefaultBtMessageReceiver.h2
-rw-r--r--src/DefaultBtProgressInfoFile.h2
-rw-r--r--src/DefaultExtensionMessageFactory.h2
-rw-r--r--src/DiskAdaptor.h2
-rw-r--r--src/DownloadEngine.h2
-rw-r--r--src/DownloadEngineFactory.h2
-rw-r--r--src/DownloadHandler.h2
-rw-r--r--src/FtpConnection.h2
-rw-r--r--src/HandshakeExtensionMessage.h2
-rw-r--r--src/HelpItemFactory.cc6
-rw-r--r--src/HttpConnection.h2
-rw-r--r--src/HttpResponse.h2
-rw-r--r--src/IteratableChecksumValidator.h2
-rw-r--r--src/IteratableChunkChecksumValidator.h2
-rw-r--r--src/Logger.h20
-rw-r--r--src/MSEHandshake.h2
-rw-r--r--src/Makefile.am3
-rw-r--r--src/Makefile.in24
-rw-r--r--src/Metalink2RequestGroup.h2
-rw-r--r--src/MultiUrlRequestInfo.h2
-rw-r--r--src/PeerConnection.h2
-rw-r--r--src/Request.cc6
-rw-r--r--src/RequestGroup.h2
-rw-r--r--src/RequestGroupMan.h2
-rw-r--r--src/SegmentMan.h2
-rw-r--r--src/SimpleLogger.cc68
-rw-r--r--src/SimpleLogger.h37
-rw-r--r--src/StringFormat.cc67
-rw-r--r--src/StringFormat.h57
-rw-r--r--src/Util.cc11
-rw-r--r--src/option_processing.cc5
-rw-r--r--src/version_usage.cc31
53 files changed, 277 insertions, 140 deletions
diff --git a/src/AbstractBtMessage.h b/src/AbstractBtMessage.h
index 16dfc3c2..67858565 100644
--- a/src/AbstractBtMessage.h
+++ b/src/AbstractBtMessage.h
@@ -76,7 +76,7 @@ protected:
std::deque<SharedHandle<BtEventListener> > listeners;
- const Logger* logger;
+ Logger* logger;
public:
AbstractBtMessage();
diff --git a/src/AbstractDiskWriter.h b/src/AbstractDiskWriter.h
index 9f7704cc..5067bc62 100644
--- a/src/AbstractDiskWriter.h
+++ b/src/AbstractDiskWriter.h
@@ -46,7 +46,7 @@ class AbstractDiskWriter : public DiskWriter {
protected:
std::string filename;
int fd;
- const Logger* logger;
+ Logger* logger;
void createFile(const std::string& filename, int addFlags = 0);
diff --git a/src/BtDependency.h b/src/BtDependency.h
index dcbfad51..7edc8c15 100644
--- a/src/BtDependency.h
+++ b/src/BtDependency.h
@@ -49,7 +49,7 @@ private:
WeakHandle<RequestGroup> _dependant;
SharedHandle<RequestGroup> _dependee;
const Option* _option;
- const Logger* _logger;
+ Logger* _logger;
public:
BtDependency(const WeakHandle<RequestGroup>& dependant,
const SharedHandle<RequestGroup>& dependee,
diff --git a/src/BtLeecherStateChoke.h b/src/BtLeecherStateChoke.h
index d898775b..80070143 100644
--- a/src/BtLeecherStateChoke.h
+++ b/src/BtLeecherStateChoke.h
@@ -51,7 +51,7 @@ private:
Time _lastRound;
- const Logger* _logger;
+ Logger* _logger;
void plannedOptimisticUnchoke(std::deque<Peer*>& peers);
diff --git a/src/BtSeederStateChoke.h b/src/BtSeederStateChoke.h
index 8255dcd8..79b06075 100644
--- a/src/BtSeederStateChoke.h
+++ b/src/BtSeederStateChoke.h
@@ -54,7 +54,7 @@ private:
Time _lastRound;
- const Logger* _logger;
+ Logger* _logger;
void unchoke(std::deque<Peer*>& peers);
public:
diff --git a/src/BtSetup.h b/src/BtSetup.h
index 3617e970..ed113438 100644
--- a/src/BtSetup.h
+++ b/src/BtSetup.h
@@ -48,7 +48,7 @@ class Command;
class BtSetup {
private:
- const Logger* _logger;
+ Logger* _logger;
public:
BtSetup();
diff --git a/src/Command.h b/src/Command.h
index f2f24282..0aa77504 100644
--- a/src/Command.h
+++ b/src/Command.h
@@ -60,7 +60,7 @@ private:
STATUS status;
protected:
int32_t cuid;
- const Logger* logger;
+ Logger* logger;
public:
Command(int32_t cuid);
diff --git a/src/DHTAbstractTask.h b/src/DHTAbstractTask.h
index c0016a8e..82500763 100644
--- a/src/DHTAbstractTask.h
+++ b/src/DHTAbstractTask.h
@@ -54,7 +54,7 @@ class DHTAbstractTask:public DHTTask {
protected:
bool _finished;
- const Logger* _logger;
+ Logger* _logger;
SharedHandle<DHTNode> _localNode;
diff --git a/src/DHTBucket.h b/src/DHTBucket.h
index adbcee8f..c1b2252c 100644
--- a/src/DHTBucket.h
+++ b/src/DHTBucket.h
@@ -67,7 +67,7 @@ private:
Time _lastUpdated;
- const Logger* _logger;
+ Logger* _logger;
public:
DHTBucket(const SharedHandle<DHTNode>& localNode);
diff --git a/src/DHTConnectionImpl.h b/src/DHTConnectionImpl.h
index 7e3f94a5..8806d6cd 100644
--- a/src/DHTConnectionImpl.h
+++ b/src/DHTConnectionImpl.h
@@ -48,7 +48,7 @@ class DHTConnectionImpl:public DHTConnection {
private:
SharedHandle<SocketCore> _socket;
- const Logger* _logger;
+ Logger* _logger;
public:
DHTConnectionImpl();
diff --git a/src/DHTMessageDispatcherImpl.h b/src/DHTMessageDispatcherImpl.h
index 9ef29398..d18d04a3 100644
--- a/src/DHTMessageDispatcherImpl.h
+++ b/src/DHTMessageDispatcherImpl.h
@@ -50,7 +50,7 @@ private:
std::deque<SharedHandle<DHTMessageEntry> > _messageQueue;
- const Logger* _logger;
+ Logger* _logger;
void sendMessage(const SharedHandle<DHTMessageEntry>& msg);
public:
diff --git a/src/DHTMessageFactoryImpl.h b/src/DHTMessageFactoryImpl.h
index dcffcdd1..5f0fc248 100644
--- a/src/DHTMessageFactoryImpl.h
+++ b/src/DHTMessageFactoryImpl.h
@@ -63,7 +63,7 @@ private:
WeakHandle<DHTTokenTracker> _tokenTracker;
- const Logger* _logger;
+ Logger* _logger;
// search node in routingTable. If it is not found, create new one.
SharedHandle<DHTNode> getRemoteNode(const unsigned char* id, const std::string& ipaddr, uint16_t port) const;
diff --git a/src/DHTMessageReceiver.h b/src/DHTMessageReceiver.h
index f77f3f09..20b2143e 100644
--- a/src/DHTMessageReceiver.h
+++ b/src/DHTMessageReceiver.h
@@ -58,7 +58,7 @@ private:
SharedHandle<DHTRoutingTable> _routingTable;
- const Logger* _logger;
+ Logger* _logger;
SharedHandle<DHTMessage>
handleUnknownMessage(const unsigned char* data, size_t length,
diff --git a/src/DHTMessageTracker.h b/src/DHTMessageTracker.h
index 9c92b78e..890bcd5c 100644
--- a/src/DHTMessageTracker.h
+++ b/src/DHTMessageTracker.h
@@ -59,7 +59,7 @@ private:
SharedHandle<DHTMessageFactory> _factory;
- const Logger* _logger;
+ Logger* _logger;
public:
DHTMessageTracker();
diff --git a/src/DHTPeerAnnounceStorage.h b/src/DHTPeerAnnounceStorage.h
index 27e63eb4..1e085ca3 100644
--- a/src/DHTPeerAnnounceStorage.h
+++ b/src/DHTPeerAnnounceStorage.h
@@ -58,7 +58,7 @@ private:
SharedHandle<DHTTaskFactory> _taskFactory;
- const Logger* _logger;
+ Logger* _logger;
public:
DHTPeerAnnounceStorage();
diff --git a/src/DHTRoutingTable.h b/src/DHTRoutingTable.h
index 89640ae6..21721f98 100644
--- a/src/DHTRoutingTable.h
+++ b/src/DHTRoutingTable.h
@@ -61,7 +61,7 @@ private:
SharedHandle<DHTTaskFactory> _taskFactory;
- const Logger* _logger;
+ Logger* _logger;
bool addNode(const SharedHandle<DHTNode>& node, bool good);
public:
diff --git a/src/DHTSetup.h b/src/DHTSetup.h
index be001877..27a5c6a2 100644
--- a/src/DHTSetup.h
+++ b/src/DHTSetup.h
@@ -48,7 +48,7 @@ class DHTSetup {
private:
static size_t _initialized;
- const Logger* _logger;
+ Logger* _logger;
public:
DHTSetup();
diff --git a/src/DHTTaskFactoryImpl.h b/src/DHTTaskFactoryImpl.h
index f8ab278e..d35e5323 100644
--- a/src/DHTTaskFactoryImpl.h
+++ b/src/DHTTaskFactoryImpl.h
@@ -59,7 +59,7 @@ private:
WeakHandle<DHTTaskQueue> _taskQueue;
- const Logger* _logger;
+ Logger* _logger;
void setCommonProperty(const SharedHandle<DHTAbstractTask>& task);
public:
diff --git a/src/DefaultBtContext.h b/src/DefaultBtContext.h
index 060e9f6d..b752b4d8 100644
--- a/src/DefaultBtContext.h
+++ b/src/DefaultBtContext.h
@@ -69,7 +69,7 @@ private:
RequestGroup* _ownerRequestGroup;
- const Logger* _logger;
+ Logger* _logger;
void clear();
void extractPieceHash(const unsigned char* hashData,
diff --git a/src/DefaultBtInteractive.h b/src/DefaultBtInteractive.h
index 625fbaa2..0e8a1425 100644
--- a/src/DefaultBtInteractive.h
+++ b/src/DefaultBtInteractive.h
@@ -98,7 +98,7 @@ private:
WeakHandle<DHTNode> _localNode;
- const Logger* logger;
+ Logger* logger;
size_t allowedFastSetSize;
Time haveCheckPoint;
Time keepAliveCheckPoint;
diff --git a/src/DefaultBtMessageDispatcher.h b/src/DefaultBtMessageDispatcher.h
index c4fc9bad..0d63e48c 100644
--- a/src/DefaultBtMessageDispatcher.h
+++ b/src/DefaultBtMessageDispatcher.h
@@ -61,7 +61,7 @@ private:
SharedHandle<Peer> peer;
unsigned int maxUploadSpeedLimit;
time_t requestTimeout;
- const Logger* logger;
+ Logger* logger;
public:
DefaultBtMessageDispatcher();
diff --git a/src/DefaultBtMessageReceiver.h b/src/DefaultBtMessageReceiver.h
index 6bbcc4ee..8344eb10 100644
--- a/src/DefaultBtMessageReceiver.h
+++ b/src/DefaultBtMessageReceiver.h
@@ -55,7 +55,7 @@ private:
WeakHandle<PeerConnection> peerConnection;
WeakHandle<BtMessageDispatcher> dispatcher;
WeakHandle<BtMessageFactory> messageFactory;
- const Logger* logger;
+ Logger* logger;
void sendHandshake();
public:
diff --git a/src/DefaultBtProgressInfoFile.h b/src/DefaultBtProgressInfoFile.h
index f52ff67e..be7566e3 100644
--- a/src/DefaultBtProgressInfoFile.h
+++ b/src/DefaultBtProgressInfoFile.h
@@ -49,7 +49,7 @@ private:
SharedHandle<DownloadContext> _dctx;
SharedHandle<PieceStorage> _pieceStorage;
const Option* _option;
- const Logger* _logger;
+ Logger* _logger;
std::string _filename;
bool isTorrentDownload();
diff --git a/src/DefaultExtensionMessageFactory.h b/src/DefaultExtensionMessageFactory.h
index 4465bf46..6bbc45ef 100644
--- a/src/DefaultExtensionMessageFactory.h
+++ b/src/DefaultExtensionMessageFactory.h
@@ -49,7 +49,7 @@ private:
SharedHandle<Peer> _peer;
- const Logger* _logger;
+ Logger* _logger;
public:
DefaultExtensionMessageFactory();
diff --git a/src/DiskAdaptor.h b/src/DiskAdaptor.h
index 7b5c036b..df4acf1e 100644
--- a/src/DiskAdaptor.h
+++ b/src/DiskAdaptor.h
@@ -49,7 +49,7 @@ class DiskAdaptor:public BinaryStream {
protected:
std::string storeDir;
std::deque<SharedHandle<FileEntry> > fileEntries;
- const Logger* logger;
+ Logger* logger;
public:
DiskAdaptor();
virtual ~DiskAdaptor();
diff --git a/src/DownloadEngine.h b/src/DownloadEngine.h
index 039a1246..6aa519b2 100644
--- a/src/DownloadEngine.h
+++ b/src/DownloadEngine.h
@@ -99,7 +99,7 @@ private:
fd_set wfdset;
int fdmax;
- const Logger* logger;
+ Logger* logger;
SharedHandle<StatCalc> _statCalc;
diff --git a/src/DownloadEngineFactory.h b/src/DownloadEngineFactory.h
index 662830a6..a381e4e9 100644
--- a/src/DownloadEngineFactory.h
+++ b/src/DownloadEngineFactory.h
@@ -48,7 +48,7 @@ class DownloadEngine;
class DownloadEngineFactory {
private:
- const Logger* _logger;
+ Logger* _logger;
public:
DownloadEngineFactory();
diff --git a/src/DownloadHandler.h b/src/DownloadHandler.h
index c12a0a17..9c6681e3 100644
--- a/src/DownloadHandler.h
+++ b/src/DownloadHandler.h
@@ -51,7 +51,7 @@ class DownloadHandler
protected:
SharedHandle<RequestGroupCriteria> _criteria;
- const Logger* _logger;
+ Logger* _logger;
public:
DownloadHandler();
diff --git a/src/FtpConnection.h b/src/FtpConnection.h
index bc0b597b..2f1f7709 100644
--- a/src/FtpConnection.h
+++ b/src/FtpConnection.h
@@ -54,7 +54,7 @@ private:
SharedHandle<SocketCore> socket;
SharedHandle<Request> req;
const Option* option;
- const Logger* logger;
+ Logger* logger;
std::string strbuf;
diff --git a/src/HandshakeExtensionMessage.h b/src/HandshakeExtensionMessage.h
index 201891a0..ca33fc9e 100644
--- a/src/HandshakeExtensionMessage.h
+++ b/src/HandshakeExtensionMessage.h
@@ -59,7 +59,7 @@ private:
SharedHandle<Peer> _peer;
- const Logger* _logger;
+ Logger* _logger;
public:
HandshakeExtensionMessage();
diff --git a/src/HelpItemFactory.cc b/src/HelpItemFactory.cc
index bd5e9a11..5c9eccd2 100644
--- a/src/HelpItemFactory.cc
+++ b/src/HelpItemFactory.cc
@@ -40,6 +40,7 @@
#include "a2io.h"
#include "help_tags.h"
#include "Option.h"
+#include "StringFormat.h"
namespace aria2 {
@@ -459,9 +460,8 @@ TagContainerHandle HelpItemFactory::createHelpItems(const Option* op)
}
{
HelpItemHandle item(new HelpItem("help", TEXT_HELP, TAG_BASIC));
- char buf[64];
- snprintf(buf, sizeof(buf), "%s,%s,%s,%s,%s,%s,all", TAG_BASIC, TAG_ADVANCED, TAG_HTTP, TAG_FTP, TAG_METALINK, TAG_BITTORRENT);
- item->setAvailableValues(buf);
+ item->setAvailableValues
+ (StringFormat("%s,%s,%s,%s,%s,%s,all", TAG_BASIC, TAG_ADVANCED, TAG_HTTP, TAG_FTP, TAG_METALINK, TAG_BITTORRENT).toString());
item->addTag(TAG_BASIC);
tc->addItem(item);
}
diff --git a/src/HttpConnection.h b/src/HttpConnection.h
index 21684fd2..3a6a21c3 100644
--- a/src/HttpConnection.h
+++ b/src/HttpConnection.h
@@ -72,7 +72,7 @@ private:
int32_t cuid;
SharedHandle<SocketCore> socket;
const Option* option;
- const Logger* logger;
+ Logger* logger;
HttpRequestEntries outstandingHttpRequests;
diff --git a/src/HttpResponse.h b/src/HttpResponse.h
index 7ec54db9..04ea1153 100644
--- a/src/HttpResponse.h
+++ b/src/HttpResponse.h
@@ -51,7 +51,7 @@ private:
int32_t cuid;
SharedHandle<HttpRequest> httpRequest;
SharedHandle<HttpHeader> httpHeader;
- const Logger* logger;
+ Logger* logger;
public:
HttpResponse();
diff --git a/src/IteratableChecksumValidator.h b/src/IteratableChecksumValidator.h
index 5150e6a0..2a8997a8 100644
--- a/src/IteratableChecksumValidator.h
+++ b/src/IteratableChecksumValidator.h
@@ -55,7 +55,7 @@ private:
SharedHandle<MessageDigestContext> _ctx;
- const Logger* _logger;
+ Logger* _logger;
unsigned char* _buffer;
diff --git a/src/IteratableChunkChecksumValidator.h b/src/IteratableChunkChecksumValidator.h
index 6d5e3e75..8517c378 100644
--- a/src/IteratableChunkChecksumValidator.h
+++ b/src/IteratableChunkChecksumValidator.h
@@ -52,7 +52,7 @@ private:
SharedHandle<PieceStorage> _pieceStorage;
BitfieldMan* _bitfield;
size_t _currentIndex;
- const Logger* _logger;
+ Logger* _logger;
SharedHandle<MessageDigestContext> _ctx;
unsigned char* _buffer;
diff --git a/src/Logger.h b/src/Logger.h
index 319ad84f..64a0e978 100644
--- a/src/Logger.h
+++ b/src/Logger.h
@@ -44,16 +44,16 @@ class Exception;
class Logger {
public:
virtual ~Logger() {}
- virtual void debug(const char* msg, ...) const = 0;
- virtual void debug(const char* msg, Exception* ex, ...) const = 0;
- virtual void info(const char* msg, ...) const = 0;
- virtual void info(const char* msg, Exception* ex, ...) const = 0;
- virtual void notice(const char* msg, ...) const = 0;
- virtual void notice(const char* msg, Exception* ex, ...) const = 0;
- virtual void warn(const char* msg, ...) const = 0;
- virtual void warn(const char* msg, Exception* ex, ...) const = 0;
- virtual void error(const char* msg, ...) const = 0;
- virtual void error(const char* msg, Exception* ex, ...) const = 0;
+ virtual void debug(const char* msg, ...) = 0;
+ virtual void debug(const char* msg, Exception* ex, ...) = 0;
+ virtual void info(const char* msg, ...) = 0;
+ virtual void info(const char* msg, Exception* ex, ...) = 0;
+ virtual void notice(const char* msg, ...) = 0;
+ virtual void notice(const char* msg, Exception* ex, ...) = 0;
+ virtual void warn(const char* msg, ...) = 0;
+ virtual void warn(const char* msg, Exception* ex, ...) = 0;
+ virtual void error(const char* msg, ...) = 0;
+ virtual void error(const char* msg, Exception* ex, ...) = 0;
enum LEVEL {
DEBUG = 1 << 0,
diff --git a/src/MSEHandshake.h b/src/MSEHandshake.h
index bb192a43..8dc43eff 100644
--- a/src/MSEHandshake.h
+++ b/src/MSEHandshake.h
@@ -78,7 +78,7 @@ private:
int32_t _cuid;
SharedHandle<SocketCore> _socket;
const Option* _option;
- const Logger* _logger;
+ Logger* _logger;
unsigned char _rbuf[MAX_BUFFER_LENGTH];
size_t _rbufLength;
diff --git a/src/Makefile.am b/src/Makefile.am
index 708f4457..e0126f56 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -182,7 +182,8 @@ SRCS = Socket.h\
prefs.h\
usage_text.h\
ProtocolDetector.cc ProtocolDetector.h\
- NullStatCalc.h
+ NullStatCalc.h\
+ StringFormat.cc StringFormat.h
if ENABLE_MESSAGE_DIGEST
SRCS += IteratableChunkChecksumValidator.cc IteratableChunkChecksumValidator.h\
diff --git a/src/Makefile.in b/src/Makefile.in
index 1748ebe0..3dd96acc 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -404,7 +404,8 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \
TrueRequestGroupCriteria.h a2algo.h a2functional.h a2io.h \
a2netcompat.h a2time.h array_fun.h help_tags.h prefs.h \
usage_text.h ProtocolDetector.cc ProtocolDetector.h \
- NullStatCalc.h IteratableChunkChecksumValidator.cc \
+ NullStatCalc.h StringFormat.cc StringFormat.h \
+ IteratableChunkChecksumValidator.cc \
IteratableChunkChecksumValidator.h \
IteratableChecksumValidator.cc IteratableChecksumValidator.h \
CheckIntegrityCommand.cc CheckIntegrityCommand.h \
@@ -780,11 +781,11 @@ am__objects_14 = SocketCore.$(OBJEXT) Command.$(OBJEXT) \
HelpItem.$(OBJEXT) TaggedItem.$(OBJEXT) TagContainer.$(OBJEXT) \
HelpItemFactory.$(OBJEXT) SingleFileDownloadContext.$(OBJEXT) \
TimedHaltCommand.$(OBJEXT) ProtocolDetector.$(OBJEXT) \
- $(am__objects_1) $(am__objects_2) $(am__objects_3) \
- $(am__objects_4) $(am__objects_5) $(am__objects_6) \
- $(am__objects_7) $(am__objects_8) $(am__objects_9) \
- $(am__objects_10) $(am__objects_11) $(am__objects_12) \
- $(am__objects_13)
+ StringFormat.$(OBJEXT) $(am__objects_1) $(am__objects_2) \
+ $(am__objects_3) $(am__objects_4) $(am__objects_5) \
+ $(am__objects_6) $(am__objects_7) $(am__objects_8) \
+ $(am__objects_9) $(am__objects_10) $(am__objects_11) \
+ $(am__objects_12) $(am__objects_13)
am_libaria2c_a_OBJECTS = $(am__objects_14)
libaria2c_a_OBJECTS = $(am_libaria2c_a_OBJECTS)
am__installdirs = "$(DESTDIR)$(bindir)"
@@ -1119,11 +1120,11 @@ SRCS = Socket.h SocketCore.cc SocketCore.h BinaryStream.h Command.cc \
TrueRequestGroupCriteria.h a2algo.h a2functional.h a2io.h \
a2netcompat.h a2time.h array_fun.h help_tags.h prefs.h \
usage_text.h ProtocolDetector.cc ProtocolDetector.h \
- NullStatCalc.h $(am__append_1) $(am__append_2) $(am__append_3) \
- $(am__append_4) $(am__append_5) $(am__append_6) \
- $(am__append_7) $(am__append_8) $(am__append_9) \
- $(am__append_10) $(am__append_11) $(am__append_12) \
- $(am__append_13)
+ NullStatCalc.h StringFormat.cc StringFormat.h $(am__append_1) \
+ $(am__append_2) $(am__append_3) $(am__append_4) \
+ $(am__append_5) $(am__append_6) $(am__append_7) \
+ $(am__append_8) $(am__append_9) $(am__append_10) \
+ $(am__append_11) $(am__append_12) $(am__append_13)
noinst_LIBRARIES = libaria2c.a
libaria2c_a_SOURCES = $(SRCS)
aria2c_LDADD = libaria2c.a @LIBINTL@ @ALLOCA@ @LIBGNUTLS_LIBS@\
@@ -1459,6 +1460,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SpeedCalc.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StreamCheckIntegrityEntry.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StreamFileAllocationEntry.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StringFormat.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TagContainer.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TaggedItem.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TimeA2.Po@am__quote@
diff --git a/src/Metalink2RequestGroup.h b/src/Metalink2RequestGroup.h
index 8c1d0075..fd591678 100644
--- a/src/Metalink2RequestGroup.h
+++ b/src/Metalink2RequestGroup.h
@@ -52,7 +52,7 @@ class Metalink2RequestGroup {
private:
const Option* _option;
- const Logger* _logger;
+ Logger* _logger;
std::deque<SharedHandle<RequestGroup> >
createRequestGroup(std::deque<SharedHandle<MetalinkEntry> > entries);
diff --git a/src/MultiUrlRequestInfo.h b/src/MultiUrlRequestInfo.h
index a66dc9bb..ccf37346 100644
--- a/src/MultiUrlRequestInfo.h
+++ b/src/MultiUrlRequestInfo.h
@@ -57,7 +57,7 @@ private:
std::ostream& _summaryOut;
- const Logger* _logger;
+ Logger* _logger;
void printMessageForContinue();
diff --git a/src/PeerConnection.h b/src/PeerConnection.h
index 57e97c9f..cccf13c5 100644
--- a/src/PeerConnection.h
+++ b/src/PeerConnection.h
@@ -56,7 +56,7 @@ private:
int32_t cuid;
SharedHandle<SocketCore> socket;
const Option* option;
- const Logger* logger;
+ Logger* logger;
unsigned char resbuf[MAX_PAYLOAD_LEN];
size_t resbufLength;
diff --git a/src/Request.cc b/src/Request.cc
index 545dc600..e06f1981 100644
--- a/src/Request.cc
+++ b/src/Request.cc
@@ -38,6 +38,7 @@
#include "CookieBoxFactory.h"
#include "CookieBox.h"
#include "RecoverableException.h"
+#include "StringFormat.h"
#include <utility>
namespace aria2 {
@@ -180,10 +181,7 @@ std::string Request::urlencode(const std::string& src) const
result.replace(index, 1, "%25");
}
} else {
- char temp[4];
- sprintf(temp, "%%%02x", c);
- temp[3] = '\0';
- result.replace(index, 1, temp);
+ result.replace(index, 1, StringFormat("%%%02x", c).toString());
}
}
}
diff --git a/src/RequestGroup.h b/src/RequestGroup.h
index b6958ebd..657eb2c9 100644
--- a/src/RequestGroup.h
+++ b/src/RequestGroup.h
@@ -112,7 +112,7 @@ private:
const Option* _option;
- const Logger* _logger;
+ Logger* _logger;
void validateFilename(const std::string& expectedFilename,
const std::string& actualFilename) const;
diff --git a/src/RequestGroupMan.h b/src/RequestGroupMan.h
index b70d46fb..65f56705 100644
--- a/src/RequestGroupMan.h
+++ b/src/RequestGroupMan.h
@@ -55,7 +55,7 @@ private:
std::deque<SharedHandle<RequestGroup> > _requestGroups;
std::deque<SharedHandle<RequestGroup> > _reservedGroups;
std::deque<SharedHandle<DownloadResult> > _downloadResults;
- const Logger* _logger;
+ Logger* _logger;
unsigned int _maxSimultaneousDownloads;
int32_t _gidCounter;
diff --git a/src/SegmentMan.h b/src/SegmentMan.h
index 8807ee48..2519cf55 100644
--- a/src/SegmentMan.h
+++ b/src/SegmentMan.h
@@ -69,7 +69,7 @@ class SegmentMan {
private:
const Option* _option;
- const Logger* logger;
+ Logger* logger;
SharedHandle<DownloadContext> _downloadContext;
diff --git a/src/SimpleLogger.cc b/src/SimpleLogger.cc
index e6425e63..2dc5ab1d 100644
--- a/src/SimpleLogger.cc
+++ b/src/SimpleLogger.cc
@@ -38,8 +38,11 @@
#include "message.h"
#include "a2io.h"
#include "a2time.h"
+#include "StringFormat.h"
#include <cerrno>
#include <cstring>
+#include <iostream>
+#include <cstdlib>
namespace aria2 {
@@ -63,22 +66,22 @@ va_start(ap, EX);\
writeFile(Logger::LEVEL, MSG, ap, EX);\
va_end(ap);
-SimpleLogger::SimpleLogger(FILE* logfile):file(logfile), stdoutField(0) {}
+SimpleLogger::SimpleLogger():stdoutField(0) {}
SimpleLogger::~SimpleLogger() {
closeFile();
}
void SimpleLogger::openFile(const std::string& filename) {
- file = fopen(filename.c_str(), "ab");
- if(file == NULL) {
+ file.open(filename.c_str(), std::ios::app|std::ios::binary);
+ if(!file) {
throw new DlAbortEx(EX_FILE_OPEN, filename.c_str(), strerror(errno));
}
}
void SimpleLogger::closeFile() {
- if(file != NULL) {
- fclose(file);
+ if(file.is_open()) {
+ file.close();
}
}
@@ -90,13 +93,15 @@ void SimpleLogger::setStdout(Logger::LEVEL level, bool enabled) {
}
}
-void SimpleLogger::writeHeader(FILE* file,
- const std::string& date, const std::string& level) const
+void SimpleLogger::writeHeader(std::ostream& o, const std::string& date,
+ const std::string& level)
{
- fprintf(file, "%s %s - ", date.c_str(), level.c_str());
+ o << StringFormat("%s %s - ", date.c_str(), level.c_str());
}
-void SimpleLogger::writeLog(FILE* file, Logger::LEVEL level, const char* msg, va_list ap, Exception* e, bool printHeader) const
+void SimpleLogger::writeLog(std::ostream& o, Logger::LEVEL level,
+ const char* msg, va_list ap, Exception* e,
+ bool printHeader)
{
va_list apCopy;
va_copy(apCopy, ap);
@@ -126,65 +131,74 @@ void SimpleLogger::writeLog(FILE* file, Logger::LEVEL level, const char* msg, va
// TODO a quick hack not to print header in console
if(printHeader) {
- writeHeader(file, datestr, levelStr);
+ writeHeader(o, datestr, levelStr);
+ }
+ {
+ char* res;
+ if(vasprintf(&res, std::string(Util::replace(msg, "\r", "")+"\n").c_str(), apCopy) == -1) {
+ o << "SimpleLogger error, cannot allocate memory.\n";
+ } else {
+ o << res;
+ free(res);
+ }
}
- vfprintf(file, std::string(Util::replace(msg, "\r", "")+"\n").c_str(), apCopy);
for(Exception* nestedEx = e; nestedEx; nestedEx = nestedEx->getCause()) {
// TODO a quick hack not to print header in console
if(printHeader) {
- writeHeader(file, datestr, levelStr);
+ writeHeader(o, datestr, levelStr);
}
- fprintf(file, "exception: %s\n", Util::replace(nestedEx->getMsg(), "\r", "").c_str());
+ o << StringFormat("exception: %s\n", Util::replace(nestedEx->getMsg(), "\r", "").c_str());
}
- fflush(file);
+ o << std::flush;
va_end(apCopy);
}
-void SimpleLogger::writeFile(Logger::LEVEL level, const char* msg, va_list ap, Exception* e) const {
+void SimpleLogger::writeFile(Logger::LEVEL level, const char* msg, va_list ap, Exception* e)
+{
writeLog(file, level, msg, ap, e);
if(stdoutField&level) {
- fprintf(stdout, "\n");
- writeLog(stdout, level, msg, ap, e);
+ std::cout << "\n";
+ writeLog(std::cout, level, msg, ap, e);
}
}
-void SimpleLogger::debug(const char* msg, ...) const {
+void SimpleLogger::debug(const char* msg, ...) {
WRITE_LOG(DEBUG, msg);
}
-void SimpleLogger::debug(const char* msg, Exception* e, ...) const {
+void SimpleLogger::debug(const char* msg, Exception* e, ...) {
WRITE_LOG_EX(DEBUG, msg, e);
}
-void SimpleLogger::info(const char* msg, ...) const {
+void SimpleLogger::info(const char* msg, ...) {
WRITE_LOG(INFO, msg);
}
-void SimpleLogger::info(const char* msg, Exception* e, ...) const {
+void SimpleLogger::info(const char* msg, Exception* e, ...) {
WRITE_LOG_EX(INFO, msg, e);
}
-void SimpleLogger::notice(const char* msg, ...) const {
+void SimpleLogger::notice(const char* msg, ...) {
WRITE_LOG(NOTICE, msg);
}
-void SimpleLogger::notice(const char* msg, Exception* e, ...) const {
+void SimpleLogger::notice(const char* msg, Exception* e, ...) {
WRITE_LOG_EX(INFO, msg, e);
}
-void SimpleLogger::warn(const char* msg, ...) const {
+void SimpleLogger::warn(const char* msg, ...) {
WRITE_LOG(WARN, msg);
}
-void SimpleLogger::warn(const char* msg, Exception* e, ...) const {
+void SimpleLogger::warn(const char* msg, Exception* e, ...) {
WRITE_LOG_EX(WARN, msg, e);
}
-void SimpleLogger::error(const char* msg, ...) const {
+void SimpleLogger::error(const char* msg, ...) {
WRITE_LOG(ERROR, msg);
}
-void SimpleLogger::error(const char* msg, Exception* e, ...) const {
+void SimpleLogger::error(const char* msg, Exception* e, ...) {
WRITE_LOG_EX(ERROR, msg, e);
}
diff --git a/src/SimpleLogger.h b/src/SimpleLogger.h
index 616ee5e1..8d32c4e8 100644
--- a/src/SimpleLogger.h
+++ b/src/SimpleLogger.h
@@ -36,38 +36,39 @@
#define _D_SIMPLE_LOGGER_H_
#include "Logger.h"
-#include <cstdio>
#include <cstdarg>
#include <string>
+#include <fstream>
namespace aria2 {
class SimpleLogger:public Logger {
private:
- void writeFile(Logger::LEVEL level, const char* msg, va_list ap, Exception* e = 0) const;
- void writeHeader(FILE* file,
- const std::string& date, const std::string& level) const;
- void writeLog(FILE* file, Logger::LEVEL level,
+ void writeFile(Logger::LEVEL level, const char* msg, va_list ap, Exception* e = 0);
+ void writeHeader(std::ostream& out,
+ const std::string& date, const std::string& level);
+ void writeLog(std::ostream& out, Logger::LEVEL level,
const char* msg, va_list ap,
- Exception* e = 0, bool printHeader = true) const;
- FILE* file;
+ Exception* e = 0, bool printHeader = true);
+
+ std::ofstream file;
int stdoutField;
public:
- SimpleLogger(FILE* logfile = 0);
+ SimpleLogger();
~SimpleLogger();
void openFile(const std::string& filename);
void closeFile();
- virtual void debug(const char* msg, ...) const;
- virtual void debug(const char* msg, Exception* ex, ...) const;
- virtual void info(const char* msg, ...) const;
- virtual void info(const char* msg, Exception* ex, ...) const;
- virtual void notice(const char* msg, ...) const;
- virtual void notice(const char* msg, Exception* ex, ...) const;
- virtual void warn(const char* msg, ...) const;
- virtual void warn(const char* msg, Exception* ex, ...) const;
- virtual void error(const char* msg, ...) const;
- virtual void error(const char* msg, Exception* ex, ...) const;
+ virtual void debug(const char* msg, ...);
+ virtual void debug(const char* msg, Exception* ex, ...);
+ virtual void info(const char* msg, ...);
+ virtual void info(const char* msg, Exception* ex, ...);
+ virtual void notice(const char* msg, ...);
+ virtual void notice(const char* msg, Exception* ex, ...);
+ virtual void warn(const char* msg, ...);
+ virtual void warn(const char* msg, Exception* ex, ...);
+ virtual void error(const char* msg, ...);
+ virtual void error(const char* msg, Exception* ex, ...);
void setStdout(Logger::LEVEL level, bool enabled);
};
diff --git a/src/StringFormat.cc b/src/StringFormat.cc
new file mode 100644
index 00000000..2dadc0ac
--- /dev/null
+++ b/src/StringFormat.cc
@@ -0,0 +1,67 @@
+/* <!-- copyright */
+/*
+ * aria2 - The high speed download utility
+ *
+ * Copyright (C) 2006 Tatsuhiro Tsujikawa
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+/* copyright --> */
+#include "StringFormat.h"
+#include <ostream>
+#include <cstring>
+#include <cstdio>
+#include <cstdarg>
+#include <cstdlib>
+
+namespace aria2 {
+
+StringFormat::StringFormat(const char* fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ char* strp;
+ if(vasprintf(&strp, fmt, ap) != -1) {
+ _msg.assign(&strp[0], &strp[strlen(strp)]);
+ free(strp);
+ }
+ va_end(ap);
+}
+
+const std::string& StringFormat::toString() const
+{
+ return _msg;
+}
+
+std::ostream& operator<<(std::ostream& o, const StringFormat& fmt)
+{
+ o << fmt.toString();
+ return o;
+}
+
+} // namespace aria2
diff --git a/src/StringFormat.h b/src/StringFormat.h
new file mode 100644
index 00000000..f119863b
--- /dev/null
+++ b/src/StringFormat.h
@@ -0,0 +1,57 @@
+/* <!-- copyright */
+/*
+ * aria2 - The high speed download utility
+ *
+ * Copyright (C) 2006 Tatsuhiro Tsujikawa
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+/* copyright --> */
+#ifndef _D_STRING_FORMAT_H_
+#define _D_STRING_FORMAT_H_
+
+#include <string>
+#include <iosfwd>
+#include <cstdarg>
+
+namespace aria2 {
+
+class StringFormat {
+private:
+ std::string _msg;
+public:
+ StringFormat(const char* fmt, ...);
+
+ const std::string& toString() const;
+};
+
+std::ostream& operator<<(std::ostream& o, const StringFormat& fmt);
+
+} // namespace aria2
+
+#endif // _D_STRING_FORMAT_H_
diff --git a/src/Util.cc b/src/Util.cc
index c137704a..25829b9e 100644
--- a/src/Util.cc
+++ b/src/Util.cc
@@ -42,6 +42,7 @@
#include "DefaultDiskWriter.h"
#include "FatalException.h"
#include "FileEntry.h"
+#include "StringFormat.h"
#include <signal.h>
#include <cerrno>
#include <cassert>
@@ -205,10 +206,7 @@ std::string Util::urlencode(const unsigned char* target, size_t len) {
std::string dest;
for(size_t i = 0; i < len; i++) {
if(shouldUrlencode(target[i])) {
- char temp[4];
- sprintf(temp, "%%%02x", target[i]);
- temp[sizeof(temp)-1] = '\0';
- dest.append(temp);
+ dest.append(StringFormat("%%%02x", target[i]).toString());
} else {
dest += target[i];
}
@@ -224,10 +222,7 @@ std::string Util::torrentUrlencode(const unsigned char* target, size_t len) {
('a' <= target[i] && target[i] <= 'z')) {
dest += target[i];
} else {
- char temp[4];
- sprintf(temp, "%%%02x", target[i]);
- temp[sizeof(temp)-1] = '\0';
- dest.append(temp);
+ dest.append(StringFormat("%%%02x", target[i]).toString());
}
}
return dest;
diff --git a/src/option_processing.cc b/src/option_processing.cc
index 4a5b78a8..0f344bd6 100644
--- a/src/option_processing.cc
+++ b/src/option_processing.cc
@@ -44,6 +44,7 @@
#include "a2io.h"
#include "help_tags.h"
#include "File.h"
+#include "StringFormat.h"
#include <cstdlib>
#include <fstream>
#include <sstream>
@@ -523,8 +524,8 @@ Option* option_processing(int argc, char* const argv[])
exit(EXIT_FAILURE);
}
} else if(ucfname.size()) {
- printf("Configuration file %s is not found.", cfname.c_str());
- std::cout << "\n";
+ std::cout << StringFormat("Configuration file %s is not found.", cfname.c_str())
+ << "\n";
}
}
try {
diff --git a/src/version_usage.cc b/src/version_usage.cc
index 7add5a5c..65c645b3 100644
--- a/src/version_usage.cc
+++ b/src/version_usage.cc
@@ -44,6 +44,7 @@
#include "HelpItemFactory.h"
#include "help_tags.h"
#include "prefs.h"
+#include "StringFormat.h"
#include <iostream>
#include <iterator>
#include <algorithm>
@@ -89,34 +90,34 @@ void showVersion() {
#ifdef ENABLE_MESSAGE_DIGEST
<< "message digest algorithms: " << MessageDigestContext::getSupportedAlgoString() << "\n"
#endif // ENABLE_MESSAGE_DIGEST
- << "\n";
- printf(_("Report bugs to %s"), "<tujikawa at users dot sourceforge dot net>");
- std::cout << std::endl;
+ << "\n"
+ << StringFormat(_("Report bugs to %s"), "<tujikawa at users dot sourceforge dot net>")
+ << std::endl;
}
void showUsage(const std::string& category, const Option* option) {
- printf(_("Usage: %s [options] URL ...\n"), PACKAGE_NAME);
+ std::cout << StringFormat(_("Usage: %s [options] URL ...\n"), PACKAGE_NAME)
#ifdef ENABLE_BITTORRENT
- printf(_(" %s [options] -T TORRENT_FILE URL ...\n"), PACKAGE_NAME);
+ << StringFormat(_(" %s [options] -T TORRENT_FILE URL ...\n"), PACKAGE_NAME)
#endif // ENABLE_BITTORRENT
#ifdef ENABLE_METALINK
- printf(_(" %s [options] -M METALINK_FILE\n"), PACKAGE_NAME);
+ << StringFormat(_(" %s [options] -M METALINK_FILE\n"), PACKAGE_NAME)
#endif // ENABLE_METALINK
- std::cout << "\n";
+ << "\n";
SharedHandle<TagContainer> tc = HelpItemFactory::createHelpItems(option);
std::deque<SharedHandle<TaggedItem> > items =
category == V_ALL ? tc->getAllItems() : tc->search(category);
if(items.size() > 0) {
if(category == V_ALL) {
- printf(_("Printing all options."));
+ std::cout << _("Printing all options.");
} else {
- printf(_("Printing options tagged with '%s'."), category.c_str());
+ std::cout << StringFormat(_("Printing options tagged with '%s'."), category.c_str());
std::cout << "\n";
SharedHandle<HelpItem> helpItem
(dynamic_pointer_cast<HelpItem>(tc->nameMatch("help")));
- printf(_("See -h option to know other command-line options(%s)."),
- helpItem->getAvailableValues().c_str());
+ std::cout << StringFormat(_("See -h option to know other command-line options(%s)."),
+ helpItem->getAvailableValues().c_str());
}
std::cout << "\n"
<< _("Options:") << "\n";
@@ -126,13 +127,13 @@ void showUsage(const std::string& category, const Option* option) {
} else {
std::deque<SharedHandle<TaggedItem> > items = tc->nameMatchForward(category);
if(items.size() > 0) {
- printf(_("Printing options whose name starts with '%s'."), category.c_str());
- std::cout << "\n"
+ std::cout << StringFormat(_("Printing options whose name starts with '%s'."), category.c_str())
+ << "\n"
<< _("Options:") << "\n";
std::copy(items.begin(), items.end(), std::ostream_iterator<SharedHandle<TaggedItem> >(std::cout, "\n"));
} else {
- printf(_("No help category or option name matching with '%s'."), category.c_str());
- std::cout << "\n" << tc->nameMatch("help") << "\n";
+ std::cout << StringFormat(_("No help category or option name matching with '%s'."), category.c_str())
+ << "\n" << tc->nameMatch("help") << "\n";
}
}
if(category == TAG_BASIC) {