bintools/rcomp/src/FILELINE.CPP
author timothy.murphy@nokia.com
Fri, 30 Apr 2010 16:07:17 +0100
branchfix
changeset 511 7581d432643a
parent 0 044383f39525
permissions -rw-r--r--
fix: support new trace compiler features for preventing clashes. Automatically turn on OST_TRACE_COMPILER_IN_USE macro. Look for trace header in systemincludes. Make directories in makefile parse to prevent clashes during build. Correct path for autogen headers. Correct case issue with autogen headers on Linux.

/*
* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/


#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include "ASTRING.H"
#include "FILELINE.H"
#include "NUMVAL.H"  
#include "TOKENS.H"  

#ifdef __LINUX__
#include <linux/limits.h>
#define _MAX_PATH PATH_MAX
#endif //__LINUX__

#ifdef __VC32__
#pragma warning( push, 1 )	// MS STL libraries do not compile cleanly, temporarily set warning level to 1
#pragma warning( disable : 4710 )	// function not inlined.
#endif
FileLineManager::FileLineManager():
	iOffsetLineNumber(0) {}
FileLineManager::~FileLineManager() {}
void FileLineManager::SetCurrentFile(const String& a)
	{
	iCurrentFileName = &*(iAllFileNames.insert(a).first);
	}
#ifdef __VC32__
#pragma warning( pop )
#endif

void FileLineManager::SetBase(const String& aFileName,int aLineNumber)
	{
	SetCurrentFile(aFileName);
	iBaseFileName = iCurrentFileName;
	iOffsetLineNumber=aLineNumber;
	}

void FileLineManager::SetPath(const String& aDriveAndDirectory)
	{
	iBasePath=aDriveAndDirectory;
	}

String FileLineManager::ExtractFileName( const String & Text)
	{

    // The string that is passed to this procedure is expected to contain
    // a file specification followed by a " followed by other stuff that
    // is generated by the preprocessor.  We can discard the latter stuff.
    // This will leave either an empty string (implying the base file name)
    // or a unix-format relative file specification.

    // This string class has very little functionality, so we end up
    // doing traditional C-style stuff on a char buffer to achieve
    // what we need  {sigh}...

    char buffer[_MAX_PATH +1];
    // (older version of this code used heap allocation but I prefer
    //  this way which is safer and does less heap-churning)

    
    String result;      // This is what we will pass back

	// Copy the text to our working buffer

    int n = Text.Length();
    if ( n >= _MAX_PATH ) n = _MAX_PATH; // Unlikely, but you never know
    strncpy(buffer, Text.GetAssertedNonEmptyBuffer(), n);
    buffer[n] = '\0';                  // add zero terminator

    // truncate to the expected double quote character

    char * pquote = strchr(buffer, '"');
    if ( pquote != NULL ) * pquote = '\0';

    n = strlen(buffer);


    // If we now have an empty string then replace it with the
    // base filename string that should already be defined.

    if ( n == 0 )
        {
        n = iBaseFileName->Length();
        if ( n > _MAX_PATH ) n = _MAX_PATH;
        if (n>0) strncpy(buffer, iBaseFileName->GetAssertedNonEmptyBuffer(), n);
        buffer[n] = '\0';
        }

#ifndef __LINUX__
    // Replace all the unix-like forward slashes with DOS-like backslashes

    while ( n > 0 )
        {
        n -=1;
        if ( buffer[n] == '/' ) buffer[n] = '\\';
        }
#endif //__LINUX__
    
    result = buffer;
    return result;
	}

void FileLineManager::SetInclude(const String& aNameText,int aLineNumber)
	{
	SetCurrentFile(ExtractFileName(aNameText));
	iOffsetLineNumber = aLineNumber;	
	}

void FileLineManager::PostInclude( char* aNameText, char * aRealLineNumber, int aLineNumber)
	{	// Returning to a file (after having included another file).
	SetCurrentFile(ExtractFileName(aNameText));
	int val = atoi(aRealLineNumber);
	iOffsetLineNumber=aLineNumber - val + 1;
	}

int	FileLineManager::GetErrorLine(int aCurrentLineNumber) const
	{
	return aCurrentLineNumber-iOffsetLineNumber;
	}

const String* FileLineManager::GetCurrentFile() const
	{ 
	return iCurrentFileName;
	}