bintools/rcomp/src/FILELINE.CPP
changeset 0 044383f39525
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/rcomp/src/FILELINE.CPP	Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,141 @@
+/*
+* 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;
+	}
+