blob: 713408a8310ec3599b04a302d04c7c9c5b7d504b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <log4cxx/spi/location/locationinfo.h>
#include <log4cxx/helpers/pool.h>
using namespace ::log4cxx::spi;
using namespace log4cxx::helpers;
/**
When location information is not available the constant
<code>NA</code> is returned. Current value of this string
constant is <b>?</b>. */
const char* const LocationInfo::NA = "?";
const char* const LocationInfo::NA_METHOD = "?::?";
const LocationInfo& LocationInfo::getLocationUnavailable()
{
static const LocationInfo unavailable;
return unavailable;
}
/**
* Constructor.
* @remarks Used by LOG4CXX_LOCATION to generate
* location info for current code site
*/
LocationInfo::LocationInfo( const char* const fileName1,
const char* const shortFileName1,
const char* const methodName1,
int lineNumber1 )
: lineNumber( lineNumber1 ),
fileName( fileName1 ),
shortFileName(shortFileName1),
methodName( methodName1 )
{
}
/**
* Default constructor.
*/
LocationInfo::LocationInfo()
: lineNumber( -1 ),
fileName(LocationInfo::NA),
shortFileName(LocationInfo::NA),
methodName(LocationInfo::NA_METHOD)
{
}
/**
* Copy constructor.
* @param src source location
*/
LocationInfo::LocationInfo( const LocationInfo& src )
: lineNumber( src.lineNumber ),
fileName( src.fileName ),
shortFileName( src.shortFileName ),
methodName( src.methodName )
{
}
/**
* Assignment operator.
* @param src source location
*/
LocationInfo& LocationInfo::operator = ( const LocationInfo& src )
{
fileName = src.fileName;
methodName = src.methodName;
lineNumber = src.lineNumber;
return * this;
}
/**
* Resets location info to default state.
*/
void LocationInfo::clear()
{
fileName = NA;
methodName = NA_METHOD;
lineNumber = -1;
}
/**
* Return the file name of the caller.
* @returns file name, may be null.
*/
const char* LocationInfo::getFileName() const
{
return fileName;
}
const char* LocationInfo::getShortFileName() const{
return shortFileName;
}
/**
* Returns the line number of the caller.
* @returns line number, -1 if not available.
*/
int LocationInfo::getLineNumber() const
{
return lineNumber;
}
/** Returns the method name of the caller. */
const std::string LocationInfo::getMethodName() const
{
std::string tmp(methodName);
size_t parenPos = tmp.find('(');
if (parenPos != std::string::npos)
{
tmp.erase(parenPos);
}
size_t colonPos = tmp.rfind("::");
if (colonPos != std::string::npos)
{
tmp.erase(0, colonPos + 2);
}
else
{
size_t spacePos = tmp.find(' ');
if (spacePos != std::string::npos)
{
tmp.erase(0, spacePos + 1);
}
}
return tmp;
}
const std::string LocationInfo::getClassName() const
{
std::string tmp(methodName);
size_t parenPos = tmp.find('(');
if (parenPos != std::string::npos)
{
tmp.erase(parenPos);
}
size_t colonPos = tmp.rfind("::");
if (colonPos != std::string::npos)
{
tmp.erase(colonPos);
size_t spacePos = tmp.find_last_of(' ');
if (spacePos != std::string::npos)
{
tmp.erase(0, spacePos + 1);
}
return tmp;
}
tmp.erase(0, tmp.length() );
return tmp;
}