Commit 8bfccfb1 authored by Stephen Morris's avatar Stephen Morris

[trac900] Basic code changes

Basic changes to get the code to read the new-style message files.
In addition, a suggestion made on the bind10-dev list - to add the
prefix to the symbols in the symbol dictionary (and not just to the
C++ symbols) has been implemented. (This minimises the chances of
polluting symbol namespace.)  As a result, multiple $PREFIX directives
can be supported.
parent 434719dc
......@@ -16,7 +16,7 @@ liblog_la_SOURCES += logger_impl.cc logger_impl.h
liblog_la_SOURCES += logger_support.cc logger_support.h
liblog_la_SOURCES += messagedef.cc messagedef.h
liblog_la_SOURCES += message_dictionary.cc message_dictionary.h
liblog_la_SOURCES += message_exception.h message_exception.cc
liblog_la_SOURCES += message_exception.h
liblog_la_SOURCES += message_initializer.cc message_initializer.h
liblog_la_SOURCES += message_reader.cc message_reader.h
liblog_la_SOURCES += message_types.h
......
......@@ -50,17 +50,13 @@ static const char* VERSION = "1.0-0";
/// \li A .cc file containing code that adds the messages to the program's
/// message dictionary at start-up time.
///
/// Alternatively, the program can produce a .py file that contains the
/// message definitions.
///
/// \b Invocation<BR>
/// The program is invoked with the command:
///
/// <tt>message [-v | -h | \<message-file\>]</tt>
///
/// It reads the message file and writes out two files of the same name but with
/// extensions of .h and .cc.
/// It reads the message file and writes out two files of the same name in the
/// default directory but with extensions of .h and .cc.
///
/// \-v causes it to print the version number and exit. \-h prints a help
/// message (and exits).
......@@ -251,17 +247,16 @@ writeClosingNamespace(ostream& output, const vector<string>& ns) {
///
/// \param file Name of the message file. The header file is written to a
/// file of the same name but with a .h suffix.
/// \param prefix Prefix string to use in symbols
/// \param ns Namespace in which the definitions are to be placed. An empty
/// string indicates no namespace.
/// \param dictionary Dictionary holding the message definitions.
void
writeHeaderFile(const string& file, const string& prefix,
const vector<string>& ns_components, MessageDictionary& dictionary)
writeHeaderFile(const string& file, const vector<string>& ns_components,
MessageDictionary& dictionary)
{
Filename message_file(file);
Filename header_file(message_file.useAsDefault(".h"));
Filename header_file(Filename(message_file.name()).useAsDefault(".h"));
// Text to use as the sentinels.
string sentinel_text = sentinel(header_file);
......@@ -294,7 +289,7 @@ writeHeaderFile(const string& file, const string& prefix,
vector<string> idents = sortedIdentifiers(dictionary);
for (vector<string>::const_iterator j = idents.begin();
j != idents.end(); ++j) {
hfile << "extern const isc::log::MessageID " << prefix << *j << ";\n";
hfile << "extern const isc::log::MessageID " << *j << ";\n";
}
hfile << "\n";
......@@ -354,11 +349,11 @@ replaceNonAlphaNum(char c) {
/// to it. But until BIND-10 is ported to Windows, we won't know.
void
writeProgramFile(const string& file, const string& prefix,
const vector<string>& ns_components, MessageDictionary& dictionary)
writeProgramFile(const string& file, const vector<string>& ns_components,
MessageDictionary& dictionary)
{
Filename message_file(file);
Filename program_file(message_file.useAsDefault(".cc"));
Filename program_file(Filename(message_file.name()).useAsDefault(".cc"));
// Open the output file for writing
ofstream ccfile(program_file.fullName().c_str());
......@@ -387,7 +382,7 @@ writeProgramFile(const string& file, const string& prefix,
vector<string> idents = sortedIdentifiers(dictionary);
for (vector<string>::const_iterator j = idents.begin();
j != idents.end(); ++j) {
ccfile << "extern const isc::log::MessageID " << prefix << *j <<
ccfile << "extern const isc::log::MessageID " << *j <<
" = \"" << *j << "\";\n";
}
ccfile << "\n";
......@@ -518,13 +513,10 @@ main(int argc, char* argv[]) {
vector<string> ns_components = splitNamespace(reader.getNamespace());
// Write the header file.
writeHeaderFile(message_file, reader.getPrefix(), ns_components,
dictionary);
writeHeaderFile(message_file, ns_components, dictionary);
// Write the file that defines the message symbols and text
writeProgramFile(message_file, reader.getPrefix(), ns_components,
dictionary);
writeProgramFile(message_file, ns_components, dictionary);
// Finally, warn of any duplicates encountered.
warnDuplicates(reader);
......
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// PERFORMANCE OF THIS SOFTWARE.
/// \brief Body of Virtual Destructor
#include <log/message_exception.h>
namespace isc {
namespace log {
MessageException::~MessageException() throw() {
}
} // namespace log
} // namespace isc
......@@ -19,6 +19,7 @@
#include <string>
#include <vector>
#include <boost/lexical_cast.hpp>
#include <log/message_types.h>
namespace isc {
......@@ -35,33 +36,47 @@ public:
/// \brief Constructor
///
/// \param id Message identification
MessageException(MessageID id) : id_(id)
{}
/// \param id Message identification.
/// \param lineno Line number on which error occurred (if > 0).
MessageException(MessageID id, int lineno = 0) : id_(id)
{
if (lineno > 0) {
args_.push_back(boost::lexical_cast<std::string>(lineno));
}
}
/// \brief Constructor
///
/// \param id Message identification
/// \param arg1 First message argument
MessageException(MessageID id, const std::string& arg1) : id_(id)
/// \param id Message identification.
/// \param arg1 First message argument.
/// \param lineno Line number on which error occurred (if > 0).
MessageException(MessageID id, const std::string& arg1, int lineno = 0)
: id_(id)
{
if (lineno > 0) {
args_.push_back(boost::lexical_cast<std::string>(lineno));
}
args_.push_back(arg1);
}
/// \brief Constructor
///
/// \param id Message identification
/// \param arg1 First message argument
/// \param arg2 Second message argument
/// \param id Message identification.
/// \param arg1 First message argument.
/// \param arg2 Second message argument.
/// \param lineno Line number on which error occurred (if > 0).
MessageException(MessageID id, const std::string& arg1,
const std::string& arg2) : id_(id)
const std::string& arg2, int lineno = 0) : id_(id)
{
if (lineno > 0) {
args_.push_back(boost::lexical_cast<std::string>(lineno));
}
args_.push_back(arg1);
args_.push_back(arg2);
}
/// \brief Destructor
virtual ~MessageException() throw();
~MessageException() throw() {}
/// \brief Return Message ID
///
......
......@@ -12,6 +12,7 @@
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// PERFORMANCE OF THIS SOFTWARE.
#include <cassert>
#include <errno.h>
#include <string.h>
......@@ -25,14 +26,18 @@
using namespace std;
namespace isc {
namespace log {
namespace {
const char DIRECTIVE_FLAG = '$'; // Starts each directive
const char MESSAGE_FLAG = '%'; // Starts each message
// Virtual destructor.
MessageReader::~MessageReader() {
}
namespace isc {
namespace log {
// Read the file.
void
......@@ -42,18 +47,21 @@ MessageReader::readFile(const string& file, MessageReader::Mode mode) {
// being reused.
not_added_.clear();
// Open the file
// Open the file and store the name (in case we need it elsewhere).
ifstream infile(file.c_str());
if (infile.fail()) {
throw MessageException(MSG_OPNMSGIN, file, strerror(errno));
}
// Loop round reading it.
// Loop round reading it. Keep a track of line number of aid diagnosis
// of problems.
string line;
getline(infile, line);
lineno_ = 1;
while (infile.good()) {
processLine(line, mode);
getline(infile, line);
++lineno_;
}
// Why did the loop terminate?
......@@ -74,15 +82,16 @@ MessageReader::processLine(const string& line, MessageReader::Mode mode) {
if (text.empty()) {
; // Ignore blank lines
} else if ((text[0] == '#') || (text[0] == '+')) {
; // Ignore comments or descriptions
} else if (text[0] == '$') {
} else if (text[0] == DIRECTIVE_FLAG) {
parseDirective(text); // Process directives
} else {
parseMessage(text, mode); // Process other lines
} else if (text[0] == MESSAGE_FLAG) {
parseMessage(text, mode); // Process message definition line
} else {
; // Other lines are extended message
// description and are ignored
}
}
......@@ -99,130 +108,161 @@ MessageReader::parseDirective(const std::string& text) {
isc::util::str::uppercase(tokens[0]);
if (tokens[0] == string("$PREFIX")) {
parsePrefix(tokens);
} else if (tokens[0] == string("$NAMESPACE")) {
parseNamespace(tokens);
} else {
throw MessageException(MSG_UNRECDIR, tokens[0]);
throw MessageException(MSG_UNRECDIR, tokens[0], lineno_);
}
}
// Process $PREFIX
void
MessageReader::parsePrefix(const vector<string>& tokens) {
// Check argument count
// Should not get here unless there is something in the tokens array.
assert(tokens.size() > 0);
static string valid = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
if (tokens.size() < 2) {
throw MessageException(MSG_PRFNOARG);
} else if (tokens.size() > 2) {
throw MessageException(MSG_PRFEXTRARG);
// Process $PREFIX. With no arguments, the prefix is set to the empty
// string. One argument sets the prefix to the (upper-case) value of
// it, and more than one argument is invalid.
if (tokens.size() == 1) {
prefix_ = "";
}
} else if (tokens.size() == 2) {
prefix_ = tokens[1];
// As a style, we are going to have the symbols in uppercase
string prefix = tokens[1];
isc::util::str::uppercase(prefix);
// Token is potentially valid providing it only contains alphabetic
// and numeric characters (and underscores) and does not start with a
// digit.
if (invalidSymbol(prefix_)) {
throw MessageException(MSG_PRFINVARG, prefix_, lineno_);
}
// Token is potentially valid providing it only contains alphabetic
// and numeric characters (and underscores) and does not start with a
// digit.
if ((prefix.find_first_not_of(valid) != string::npos) ||
(std::isdigit(prefix[0]))) {
// Invalid character in string or it starts with a digit.
throw MessageException(MSG_PRFINVARG, tokens[1]);
}
// All OK - unless the prefix has already been set.
} else {
if (prefix_.size() != 0) {
throw MessageException(MSG_DUPLPRFX);
// Too many arguments
throw MessageException(MSG_PRFEXTRARG, lineno_);
}
}
// Prefix has not been set, so set it and return success.
prefix_ = prefix;
// Check if string is an invalid C++ symbol. It is valid if comprises only
// alphanumeric characters and underscores, and does not start with a digit.
// (Owing to the logic of the rest of the code, we check for its invalidity,
// not its validity.)
bool
MessageReader::invalidSymbol(const string& symbol) {
static const string valid_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789_";
return ( symbol.empty() ||
(symbol.find_first_not_of(valid_chars) != string::npos) ||
(std::isdigit(symbol[0])));
}
// Process $NAMESPACE. A lot of the processing is similar to that of $PREFIX,
// except that only limited checks will be done on the namespace (to avoid a
// lot of parsing and separating out of the namespace components.)
// lot of parsing and separating out of the namespace components.) Also, unlike
// $PREFIX, there can only be one $NAMESPACE in a file.
void
MessageReader::parseNamespace(const vector<string>& tokens) {
// Check argument count
static string valid = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_:"
"abcdefghijklmnopqrstuvwxyz";
if (tokens.size() < 2) {
throw MessageException(MSG_NSNOARG);
throw MessageException(MSG_NSNOARG, lineno_);
} else if (tokens.size() > 2) {
throw MessageException(MSG_NSEXTRARG);
throw MessageException(MSG_NSEXTRARG, lineno_);
}
// Token is potentially valid providing it only contains alphabetic
// and numeric characters (and underscores and colons).
if (tokens[1].find_first_not_of(valid) != string::npos) {
// Invalid character in string or it starts with a digit.
throw MessageException(MSG_NSINVARG, tokens[1]);
// and numeric characters (and underscores and colons). As noted above,
// we won't be exhaustive - after all, and code containing the resultant
// namespace will have to be compiled, and the compiler will catch errors.
static const string valid_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789_:";
if (tokens[1].find_first_not_of(valid_chars) != string::npos) {
throw MessageException(MSG_NSINVARG, tokens[1], lineno_);
}
// All OK - unless the namespace has already been set.
if (ns_.size() != 0) {
throw MessageException(MSG_DUPLNS);
throw MessageException(MSG_DUPLNS, lineno_);
}
// Prefix has not been set, so set it and return success.
ns_ = tokens[1];
}
// Process message. By the time this method is called, the line has been
// stripped of leading and trailing spaces, and we believe that it is a line
// defining a message. The first token on the line is converted to uppercase
// and becomes the message ID; the rest of the line is the message text.
// stripped of leading and trailing spaces. The first character of the string
// is the message introducer, so we can get rid of that. The remainder is
// a line defining a message.
//
// The first token on the line, when concatenated to the prefix and converted to
// upper-case, is the message ID. The first of the line from the next token
// on is the message text.
void
MessageReader::parseMessage(const std::string& text, MessageReader::Mode mode) {
static string delimiters("\t\n "); // Delimiters
// The line passed should be at least one character long and start with the
// message introducer (else we should not have got here).
assert((text.size() >= 1) && (text[0] == MESSAGE_FLAG));
// A line comprising just the message introducer is not valid.
if (text.size() == 1) {
throw MessageException(MSG_NOMSGID, text, lineno_);
}
// Strip off the introducer and any leading space after that.
string message_line = isc::util::str::trim(text.substr(1));
// Look for the first delimiter.
size_t first_delim = text.find_first_of(delimiters);
size_t first_delim = message_line.find_first_of(delimiters);
if (first_delim == string::npos) {
// Just a single token in the line - this is not valid
throw MessageException(MSG_NOMSGTXT, text);
throw MessageException(MSG_NOMSGTXT, message_line, lineno_);
}
// Extract the first token into the message ID
string ident = text.substr(0, first_delim);
// Extract the first token into the message ID, preceding it with the
// current prefix, then convert to upper-case. If the prefix is not set,
// perform the valid character check now - the string will become a C++
// symbol so we may as well identify problems early.
string ident = prefix_ + message_line.substr(0, first_delim);
if (prefix_.empty()) {
if (invalidSymbol(ident)) {
throw MessageException(MSG_INVMSGID, ident, lineno_);
}
}
isc::util::str::uppercase(ident);
// Locate the start of the message text
size_t first_text = text.find_first_not_of(delimiters, first_delim);
size_t first_text = message_line.find_first_not_of(delimiters, first_delim);
if (first_text == string::npos) {
// ?? This happens if there are trailing delimiters, which should not
// occur as we have stripped trailing spaces off the line. Just treat
// this as a single-token error for simplicity's sake.
throw MessageException(MSG_NOMSGTXT, text);
throw MessageException(MSG_NOMSGTXT, message_line, lineno_);
}
// Add the result to the dictionary and to the non-added list if the add to
// the dictionary fails.
bool added;
if (mode == ADD) {
added = dictionary_->add(ident, text.substr(first_text));
added = dictionary_->add(ident, message_line.substr(first_text));
}
else {
added = dictionary_->replace(ident, text.substr(first_text));
added = dictionary_->replace(ident, message_line.substr(first_text));
}
if (!added) {
not_added_.push_back(ident);
......
......@@ -65,10 +65,6 @@ public:
{}
/// \brief Virtual Destructor
virtual ~MessageReader();
/// \brief Get Dictionary
///
/// Returns the pointer to the dictionary object. Note that ownership is
......@@ -188,10 +184,24 @@ private:
/// \param tokens $NAMESPACE line split into tokens
void parseNamespace(const std::vector<std::string>& tokens);
/// \brief Check for invalid C++ symbol name
///
/// The message ID (or concatenation of prefix and message ID) will be used
/// as the name of a symbol in C++ code. This function checks if the name
/// is invalid (contains anything other than alphanumeric characters or
/// underscores, or starts with a digit).
///
/// \param symbol name to check to see if it is an invalid C++ symbol.
///
/// \return true if the name is invalid, false if it is valid.
bool invalidSymbol(const std::string& symbol);
/// Attributes
MessageDictionary* dictionary_; ///< Dictionary to add messages to
MessageIDCollection not_added_; ///< List of IDs not added
int lineno_; ///< Number of last line read
std::string prefix_; ///< Argument of $PREFIX statement
std::string ns_; ///< Argument of $NAMESPACE statement
};
......
// File created from messagedef.mes on Mon Feb 14 11:07:45 2011
// File created from messagedef.mes on Fri May 6 19:06:38 2011
#include <cstddef>
#include <log/message_types.h>
......@@ -7,23 +7,23 @@
namespace isc {
namespace log {
extern const isc::log::MessageID MSG_DUPLNS = "DUPLNS";
extern const isc::log::MessageID MSG_DUPLPRFX = "DUPLPRFX";
extern const isc::log::MessageID MSG_DUPMSGID = "DUPMSGID";
extern const isc::log::MessageID MSG_IDNOTFND = "IDNOTFND";
extern const isc::log::MessageID MSG_MSGRDERR = "MSGRDERR";
extern const isc::log::MessageID MSG_MSGWRTERR = "MSGWRTERR";
extern const isc::log::MessageID MSG_NOMSGTXT = "NOMSGTXT";
extern const isc::log::MessageID MSG_NSEXTRARG = "NSEXTRARG";
extern const isc::log::MessageID MSG_NSINVARG = "NSINVARG";
extern const isc::log::MessageID MSG_NSNOARG = "NSNOARG";
extern const isc::log::MessageID MSG_OPNMSGIN = "OPNMSGIN";
extern const isc::log::MessageID MSG_OPNMSGOUT = "OPNMSGOUT";
extern const isc::log::MessageID MSG_PRFEXTRARG = "PRFEXTRARG";
extern const isc::log::MessageID MSG_PRFINVARG = "PRFINVARG";
extern const isc::log::MessageID MSG_PRFNOARG = "PRFNOARG";
extern const isc::log::MessageID MSG_RDLOCMES = "RDLOCMES";
extern const isc::log::MessageID MSG_UNRECDIR = "UNRECDIR";
extern const isc::log::MessageID MSG_DUPLNS = "MSG_DUPLNS";
extern const isc::log::MessageID MSG_DUPMSGID = "MSG_DUPMSGID";
extern const isc::log::MessageID MSG_IDNOTFND = "MSG_IDNOTFND";
extern const isc::log::MessageID MSG_INVMSGID = "MSG_INVMSGID";
extern const isc::log::MessageID MSG_MSGRDERR = "MSG_MSGRDERR";
extern const isc::log::MessageID MSG_MSGWRTERR = "MSG_MSGWRTERR";
extern const isc::log::MessageID MSG_NOMSGID = "MSG_NOMSGID";
extern const isc::log::MessageID MSG_NOMSGTXT = "MSG_NOMSGTXT";
extern const isc::log::MessageID MSG_NSEXTRARG = "MSG_NSEXTRARG";
extern const isc::log::MessageID MSG_NSINVARG = "MSG_NSINVARG";
extern const isc::log::MessageID MSG_NSNOARG = "MSG_NSNOARG";
extern const isc::log::MessageID MSG_OPNMSGIN = "MSG_OPNMSGIN";
extern const isc::log::MessageID MSG_OPNMSGOUT = "MSG_OPNMSGOUT";
extern const isc::log::MessageID MSG_PRFEXTRARG = "MSG_PRFEXTRARG";
extern const isc::log::MessageID MSG_PRFINVARG = "MSG_PRFINVARG";
extern const isc::log::MessageID MSG_RDLOCMES = "MSG_RDLOCMES";
extern const isc::log::MessageID MSG_UNRECDIR = "MSG_UNRECDIR";
} // namespace log
} // namespace isc
......@@ -31,23 +31,23 @@ extern const isc::log::MessageID MSG_UNRECDIR = "UNRECDIR";
namespace {
const char* values[] = {
"DUPLNS", "duplicate $NAMESPACE directive found",
"DUPLPRFX", "duplicate $PREFIX directive found",
"DUPMSGID", "duplicate message ID (%s) in compiled code",
"IDNOTFND", "could not replace message for '%s': no such message identification",
"MSGRDERR", "error reading from message file %s: %s",
"MSGWRTERR", "error writing to %s: %s",
"NOMSGTXT", "a line containing a message ID ('%s') and nothing else was found",
"NSEXTRARG", "$NAMESPACE directive has too many arguments",
"NSINVARG", "$NAMESPACE directive has an invalid argument ('%s')",
"NSNOARG", "no arguments were given to the $NAMESPACE directive",
"OPNMSGIN", "unable to open message file %s for input: %s",
"OPNMSGOUT", "unable to open %s for output: %s",
"PRFEXTRARG", "$PREFIX directive has too many arguments",
"PRFINVARG", "$PREFIX directive has an invalid argument ('%s')",
"PRFNOARG", "no arguments were given to the $PREFIX directive",
"RDLOCMES", "reading local message file %s",
"UNRECDIR", "unrecognised directive '%s'",
"MSG_DUPLNS", "line %s: duplicate $NAMESPACE directive found",
"MSG_DUPMSGID", "duplicate message ID (%s) in compiled code",
"MSG_IDNOTFND", "could not replace message for '%s': no such message identification",
"MSG_INVMSGID", "line %s: invalid message identification '%s'",
"MSG_MSGRDERR", "error reading from message file %s: %s",
"MSG_MSGWRTERR", "error writing to %s: %s",
"MSG_NOMSGID", "line %s: message definition line found without a message ID",
"MSG_NOMSGTXT", "line %s: line found containing a message ID ('%s') and nothing else",
"MSG_NSEXTRARG", "line %s: $NAMESPACE directive has too many arguments",
"MSG_NSINVARG", "line %s: $NAMESPACE directive has an invalid argument ('%s')",
"MSG_NSNOARG", "line %s: no arguments were given to the $NAMESPACE directive",
"MSG_OPNMSGIN", "unable to open message file %s for input: %s",
"MSG_OPNMSGOUT", "unable to open %s for output: %s",
"MSG_PRFEXTRARG", "line %s: $PREFIX directive has too many arguments",
"MSG_PRFINVARG", "line %s: $PREFIX directive has an invalid argument ('%s')",
"MSG_RDLOCMES", "reading local message file %s",
"MSG_UNRECDIR", "line %s: unrecognised directive '%s'",
NULL
};
......
// File created from messagedef.mes on Mon Feb 14 11:07:45 2011
// File created from messagedef.mes on Fri May 6 19:06:38 2011
#ifndef __MESSAGEDEF_H
#define __MESSAGEDEF_H
......@@ -9,11 +9,12 @@ namespace isc {
namespace log {
extern const isc::log::MessageID MSG_DUPLNS;
extern const isc::log::MessageID MSG_DUPLPRFX;
extern const isc::log::MessageID MSG_DUPMSGID;
extern const isc::log::MessageID MSG_IDNOTFND;
extern const isc::log::MessageID MSG_INVMSGID;
extern const isc::log::MessageID MSG_MSGRDERR;
extern const isc::log::MessageID MSG_MSGWRTERR;
extern const isc::log::MessageID MSG_NOMSGID;
extern const isc::log::MessageID MSG_NOMSGTXT;
extern const isc::log::MessageID MSG_NSEXTRARG;
extern const isc::log::MessageID MSG_NSINVARG;
......@@ -22,7 +23,6 @@ extern const isc::log::MessageID MSG_OPNMSGIN;
extern const isc::log::MessageID MSG_OPNMSGOUT;
extern const isc::log::MessageID MSG_PRFEXTRARG;
extern const isc::log::MessageID MSG_PRFINVARG;
extern const isc::log::MessageID MSG_PRFNOARG;
extern const isc::log::MessageID MSG_RDLOCMES;
extern const isc::log::MessageID MSG_UNRECDIR;
......
......@@ -23,97 +23,97 @@ $NAMESPACE isc::log
# chicken-and-egg situation where we need the files to build the message
# compiler, yet we need the compiler to build the files.
DUPMSGID duplicate message ID (%s) in compiled code