toolsandutils/e32tools/elf2e32/source/deffile.cpp
branchGCC_SURGE
changeset 56 626366955efb
parent 55 59148e28d9f6
child 57 e69da8462916
--- a/toolsandutils/e32tools/elf2e32/source/deffile.cpp	Fri Jun 25 18:24:47 2010 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1002 +0,0 @@
-// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of "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:
-// Implementation of the Class DefFile for the elf2e32 tool
-// @internalComponent
-// @released
-// 
-//
-
-//
-#include <stdio.h>
-#include <iostream>
-#include <stdlib.h>
-
-#include "pl_symbol.h"
-#include "deffile.h"
-#include "errorhandler.h"
-
-#ifdef __LINUX__
-    #include "h_utl.h"
-    #define STRUPR strupr
-#else 
-    #define STRUPR _strupr
-#endif
-
-using std::cerr;
-using std::cout;
-using std::endl;
-
-#define SUCCESS 1
-#define FAILURE 0
-
-/**
-Destructor to release all the allocated memory
-@internalComponent
-@released
-*/
-DefFile::~DefFile()
-{
-	if(iSymbolList && iSymbolList->size())
-	{
-		SymbolList::iterator aItr = iSymbolList->begin();
-		SymbolList::iterator last = iSymbolList->end();
-		Symbol *temp;
-
-		while(aItr != last)
-		{
-			temp = *aItr;
-			aItr++;
-			delete temp;
-		}
-		iSymbolList->clear();
-	}
-	delete iSymbolList;
-}
-/**
-Function to Get File Size.
-@param fptrDef - File pointer to DEF file
-@internalComponent
-@released
-*/
-int DefFile::GetFileSize(FILE *fptrDef)
-{
-	int fileSize,status;
-
-	status=fseek(fptrDef, 0, SEEK_END);
-	if(status!=0)
-	{
-		throw FileError(FILEREADERROR,iFileName);
-	}
-	fileSize=ftell(fptrDef);
-	rewind(fptrDef);
-
-	return fileSize;
-
-}
-
-/**
-Function to Open File and read it in memory.
-@param defFile - DEF File name
-@internalComponent
-@released
-*/
-char* DefFile::OpenDefFile(char * defFile)
-{
-	int fileSize;
-	char *defFileEntries;
-	FILE *fptrDef;
-
-	iFileName=defFile;
-	if((fptrDef=fopen(defFile,"rb"))==NULL)
-	{
-		throw FileError(FILEOPENERROR,defFile);
-	}
-
-	fileSize=GetFileSize(fptrDef);
-
-	if((defFileEntries= new char[fileSize+2]) ==NULL)
-	{
-		throw MemoryAllocationError(MEMORYALLOCATIONERROR,defFile);
-	}
-
-	//Getting whole file in memory
-	if(!fread(defFileEntries, fileSize, 1, fptrDef))
-	{
-		throw FileError(FILEREADERROR,defFile);
-	}
-
-	//Adding ENTER at end
-	*(defFileEntries+fileSize)='\n';
-	//Adding '\0' at end
-	*(defFileEntries+fileSize+1)='\0';
-
-	fclose(fptrDef);
-
-	return defFileEntries;
-
-}
-
-/**
-Function to Parse Def File which has been read in buffer.
-@param defFileEntries - pointer to def file entries which has been read in buffer
-@internalComponent
-@released
-*/
-void DefFile::ParseDefFile(char *defFileEntries)
-{
-	iSymbolList = new SymbolList;
-
-	int ordinalNo = 0;
-	int symbolType=SymbolTypeCode;
-	int PreviousOrdinal=0;
-	char MultiLineStatement[1024]="";
-	bool NAMEorLIBRARYallowed=true;
-	int LineNum = 0;
-	bool isComment;
-
-	char *lineToken;
-	int aLineLength = 0, width = 0;
-	unsigned i;
-	char *ptrEntry,*ptrEntryType;
-	char entryType[256];
-	bool entryFlag;
-
-
-	lineToken=strtok(defFileEntries,"\n");
-	while(lineToken != NULL)
-	{
-		symbolType=SymbolTypeCode;
-		isComment=false;
-		entryType[0]='\0';
-		aLineLength = strlen(lineToken);
-		LineNum++;
-
-		if (lineToken == NULL || lineToken[0]==13)
-		{
-			lineToken=strtok(NULL,"\n");
-			continue;
-		}
-
-		// comment lines
-		if (lineToken[0] == ';')
-		{
-			lineToken=strtok(NULL,"\n");
-			continue;
-		}
-
-		ptrEntry=lineToken;
-
-		if((!strstr(lineToken, "NONAME") && ((ptrEntryType=strstr(lineToken, "NAME")) != NULL)) ||
-			((ptrEntryType=strstr(lineToken, "EXPORTS")) != NULL) ||
-			((ptrEntryType=strstr(lineToken, "IMPORTS")) != NULL) ||
-			((ptrEntryType=strstr(lineToken, "SECTIONS")) != NULL) ||
-			((ptrEntryType=strstr(lineToken, "LIBRARY")) != NULL) ||
-			((ptrEntryType=strstr(lineToken, "DESCRIPTION")) != NULL)||
-			((ptrEntryType=strstr(lineToken, "STACKSIZE")) != NULL)||
-			((ptrEntryType=strstr(lineToken, "VERSION")) != NULL)
-			)
-		{
-			entryFlag=true;
-
-			for(i=0; ptrEntry!=ptrEntryType; i++,ptrEntry++)
-			{
-				switch(lineToken[i])
-				{
-				case ' ':
-				case '\t':
-					continue;
-				default:
-					entryFlag=false;
-					break;
-				}
-				if(entryFlag==false)
-					break;
-			}
-
-			if(entryFlag==false && !strcmp(MultiLineStatement,""))
-			{
-				throw DEFFileError(UNRECOGNIZEDTOKEN,iFileName,LineNum,lineToken);
-			}
-
-			if(entryFlag==true)
-			{
-				switch(ptrEntryType[0])
-				{
-				case 'E':
-				case 'I':
-				case 'L':
-				case 'V':
-					width=7;
-					break;
-				case 'S':
-					if(ptrEntryType[1]=='E')
-						width=8;
-					else
-						width=9;
-					break;
-				case 'N':
-					width=4;
-					break;
-				case 'D':
-					width=11;
-					break;
-				}
-			}
-
-			if(entryFlag==true)
-			{
-  				for(i=i+width; i<strlen(lineToken); i++)
-				{
-					switch(lineToken[i])
-					{
-					case ' ':
-					case '\t':
-						continue;
-					case '\r':
-					case '\0':
-						break;
-					default:
-						entryFlag=false;
-						break;
-					}
-
-					if(entryFlag==false)
-						break;
-				}
-			}
-
-			if(entryFlag==false && !strcmp(MultiLineStatement,""))
-			{
-				throw DEFFileError(UNRECOGNIZEDTOKEN,iFileName,LineNum,lineToken+i);
-			}
-
-			if(entryFlag==true)
-			{
-				strncpy(entryType, ptrEntryType, width);
-				entryType[width]='\0';
-
-				switch(ptrEntryType[0])
-				{
-				case 'E':		// check for multi-line sections starting
-					strcpy(MultiLineStatement, STRUPR(entryType)); // Uppercase token
-					NAMEorLIBRARYallowed = false;
-					lineToken = strtok(NULL, "\n" ); // Get the next line
-					continue;
-				case 'N':
-					break;
-				case 'L':
-					break;
-				case 'D':
-					break;
-				case 'S':
-				case 'V':
-					if(entryType[1]!='E')
-					{
-						// set MULTI-LINE statement to OFF
-						strcpy(MultiLineStatement, STRUPR(entryType)); // Uppercase token
-						// check single-line statements are specified correctly
-						// check NAME or LIBRARY statements aren't supplied incorrectly
-						if (!strcmp(entryType, "NAME") ||
-							!strcmp(entryType, "LIBRARY")
-							)
-						{
-							if (NAMEorLIBRARYallowed == false)
-							{
-								throw DEFFileError(NAMELIBRARYNOTCORRECT,iFileName,LineNum,lineToken);
-							}
-							lineToken=strtok(NULL,"\n");
-							continue;
-						}
-						NAMEorLIBRARYallowed = false;
-						lineToken=strtok(NULL,"\n");
-						continue;
-					}
-					continue;
-				case 'I':
-					strcpy(MultiLineStatement, STRUPR(entryType)); // Uppercase token
-					lineToken = strtok(NULL, "\n" ); // Get the next line
-					continue;
-				}
-			}
-
-		}
-		else
-		{
-			if (!strcmp(MultiLineStatement,""))
-		    {
-				throw DEFFileError(EXPORTSEXPECTED,iFileName,LineNum,lineToken);
-			}
-		}	
-			
-		// Get Export entries
-		if (!strcmp(MultiLineStatement,"EXPORTS"))
-		{
-			Symbol aSymbol(NULL, SymbolTypeCode);
-			if( Tokenize(lineToken, LineNum, aSymbol) )
-			{
-				Symbol *newSymbolEntry = new Symbol(aSymbol);
-				iSymbolList->push_back(newSymbolEntry);
-
-				ordinalNo = aSymbol.OrdNum();
-				//Check for ordinal sequence
-				if (ordinalNo != PreviousOrdinal+1)
-		   		{
-					throw DEFFileError(ORDINALSEQUENCEERROR,iFileName,LineNum,(char*)aSymbol.SymbolName());
-				}
-
-				PreviousOrdinal = ordinalNo;
-
-			}
-			lineToken=strtok(NULL,"\n");
-			continue;
-		}
-		else if(strcmp(MultiLineStatement,"")!=0)//For entry other than exports
-			lineToken = strtok(NULL, "\n" ); // Get the next line
-
-	}//End of while
-}
-
-/**
-This Function calls LineToken's Tokenize function.
-@param aTokens   - Input string at the current line number
-@param aLineNum  - Current line number
-@param aSymbol   - Symbol to be populated while parsing the line.
-Return value     - It returns true if a valid def file entry is found.
-@internalComponent
-@released
-*/
-bool DefFile::Tokenize(char* aTokens, int aLineNum, Symbol& aSymbol)
-{
-	/*
-	 * Pattern to match is:
-	 * START\s*(\S+)\s+@\s*(d+)\s*(NONAME)?\s*(R3UNUSED)?\s*(ABSENT)?\s*(;\s*(.*))END
-	 */
-	LineToken aLine(iFileName, aLineNum, aTokens, &aSymbol);
-	return aLine.Tokenize();
-}
-
-
-char * DefFilePatterns[] =
-	{
-		"NONAME",//index 0
-		"DATA",
-		"R3UNUSED",
-		"ABSENT"
-	};
-
-#define DEF_NONAME		0
-#define DEF_DATA		1
-#define DEF_R3UNUSED	2
-#define DEF_ABSENT		3
-
-/**
-This constructor creates an instance of LineToken class.
-@param aFileName - Def File Name.
-@param aLineNum  - Current line number
-@param aLn       - Input string at the current line number
-@param aSym      - Symbol to be populated while parsing the line.
-@internalComponent
-@released
-*/
-LineToken::LineToken(char* aFileName, int aLineNum, char *aLn, Symbol* aSym) : \
-		iLine(aLn) , iSymbol(aSym) , iOffset(0), iState(EInitState),iFileName(aFileName), iLineNum(aLineNum) 
-{
-}
-
-/**
-This function tokenizes the line and populates a symbol entry 
-if there is one.
-Return Value - True, if the current line has a valid def entry.
-@internalComponent
-@released
-*/
-bool LineToken::Tokenize()
-{
-	while (1) 
-	{
-		switch( iState )
-		{
-		case EFinalState:
-			return true;
-		case EInitState:
-			if( *(iLine + iOffset) == '\0' || 
-				*(iLine + iOffset) == '\r' || 
-				*(iLine + iOffset) == '\n')
-			{
-				/*
-				 * Skip empty lines.
-				 */
-				return false;
-			}
-			else
-			{
-				NextToken();
-			}
-			break;
-		default:
-			NextToken();
-			break;
-		}
-	}
-	return false;
-}
-
-/**
-This function parses a line of the def file based on the current 
-state it is in.
-@internalComponent
-@released
-*/
-void LineToken::NextToken()
-{
-	int aCurrentPos = 0;
-	char *aSymbolName;
-
-	switch( iState )
-	{
-	case EInitState:
-		if(IsWhiteSpace((iLine + iOffset), aCurrentPos))
-		{
-			IncrOffset(aCurrentPos);
-		}
-
-		if(IsWord(iLine + iOffset, aCurrentPos))
-		{
-			SetState(ESymbolName);
-		}
-	break;
-
-	case ESymbolName:
-	{
-		// Get the length of the symbol
-		IsWord(iLine + iOffset, aCurrentPos);
-
-		char *cmt = strchr(iLine + iOffset, ';');
-		char *aAlias = strchr(iLine + iOffset, '=');
-
-		if( aAlias && (!cmt || (aAlias < cmt)) )
-		{
-			int aAliasPos = aAlias - (iLine+ iOffset);
-
-			//Check if alias name is also supplied, they should be separated 
-			// by whitespace, i.e., SymbolName=AliasName is valid while, 
-			// SymbolName =AliasName is invalid.
-			if( aAliasPos > aCurrentPos)
-			{
-				char *aToken = (iLine + iOffset + aCurrentPos);
-				throw DEFFileError(UNRECOGNIZEDTOKEN, iFileName, iLineNum, aToken);
-			}
-
-			aSymbolName = new char[aAliasPos+1];
-			strncpy(aSymbolName, iLine + iOffset, aAliasPos);
-			aSymbolName[aAliasPos] = '\0';
-			char *aExportName = new char[aCurrentPos - aAliasPos + 1];
-			strncpy(aExportName, aAlias +1, (aCurrentPos - aAliasPos));
-			aExportName[(aCurrentPos - aAliasPos)] = '\0';
-			iSymbol->ExportName(aExportName);
-		}
-		else
-		{
-			aSymbolName = new char[aCurrentPos+1];
-			strncpy(aSymbolName, iLine+ iOffset, aCurrentPos);
-			aSymbolName[aCurrentPos] = '\0';
-		}
-		iSymbol->SymbolName(aSymbolName);
-		
-		IncrOffset(aCurrentPos);
-
-		if(IsWhiteSpace((iLine + iOffset), aCurrentPos))
-		{
-			IncrOffset(aCurrentPos);
-		}
-		
-		if(*(iLine+iOffset) == '@')
-		{
-			SetState(EAtSymbol);
-			IncrOffset(1);
-		}
-		else
-		{
-			/*
-			 * The first non-whitespace entry in a line is assumed to be the 
-			 * symbol name and a symbol name might also have a '@' char. Hence
-			 * there MUST be a whitespace between symbol name and '@'.
-			 */
-			throw DEFFileError(ATRATEMISSING,iFileName,iLineNum,(iLine+iOffset));
-		}
-	}
-	break;
-
-	case EAtSymbol:
-		if(IsWhiteSpace((iLine + iOffset), aCurrentPos))
-		{
-			IncrOffset(aCurrentPos);
-		}
-		
-		SetState(EOrdinal);
-		break;
-	case EOrdinal:
-	{
-		if(!IsDigit(iLine+iOffset, aCurrentPos ) )
-		{
-			throw DEFFileError(ORDINALNOTANUMBER, iFileName, iLineNum, (iLine+iOffset));
-		}
-		char aTmp[32];
-		strncpy(aTmp, iLine+iOffset, aCurrentPos);
-		aTmp[aCurrentPos] = '\0';
-		int aOrdinal = atoi(aTmp);
-		iSymbol->SetOrdinal(aOrdinal);
-
-		IncrOffset(aCurrentPos);
-
-		if(IsWhiteSpace((iLine + iOffset), aCurrentPos))
-		{
-			IncrOffset(aCurrentPos);
-		}
-		SetState(EOptionals);
-	}
-	break;
-
-	case EOptionals:
-		{
-		int aPrevPatternIndex, aPatternIdx = 0;
-		aPrevPatternIndex = -1;
-		while (*(iLine + iOffset) != '\n' || *(iLine + iOffset) != '\r')
-		{
-			if(IsPattern(iLine+iOffset, aCurrentPos, aPatternIdx) )
-			{
-				switch(aPatternIdx)
-				{
-				case DEF_NONAME:
-					break;
-				case DEF_DATA:
-					iSymbol->CodeDataType(SymbolTypeData);
-
-					IncrOffset(aCurrentPos);
-					if(IsWhiteSpace((iLine + iOffset), aCurrentPos))
-					{
-						IncrOffset(aCurrentPos);
-					}
-					if(IsDigit(iLine+iOffset, aCurrentPos ) )
-					{
-						char aSymSz[16];
-						strncpy(aSymSz, (iLine + iOffset), aCurrentPos);
-						aSymSz[aCurrentPos] = '\0';
-						iSymbol->SetSymbolSize(atoi(aSymSz));
-					}
-					break;
-				case DEF_R3UNUSED:
-					iSymbol->R3Unused(true);
-					break;
-				case DEF_ABSENT:
-					iSymbol->SetAbsent(true);
-					break;
-				default:
-					break;
-				}
-
-				/*
-				 * NONAME , DATA, R3UNUSED and ABSENT, all the 3 are optional. But, if more than
-				 * one of them appear, they MUST appear in that order. 
-				 * Else, it is not accepted.
-				 */
-				if( aPrevPatternIndex >= aPatternIdx)
-				{
-					throw DEFFileError(UNRECOGNIZEDTOKEN, iFileName, iLineNum,(iLine + iOffset));
-				}
-				aPrevPatternIndex = aPatternIdx;
-
-				IncrOffset(aCurrentPos);
-				
-				if(IsWhiteSpace((iLine + iOffset), aCurrentPos))
-				{
-					IncrOffset(aCurrentPos);
-				}
-			}
-			else
-			{
-				if( *(iLine + iOffset) == ';' )
-				{
-					SetState(EComment);
-					IncrOffset(1);
-					return;
-				}
-				else if( *(iLine + iOffset) == '\0' || 
-						 *(iLine + iOffset) == '\r' || 
-						 *(iLine + iOffset) == '\n')
-				{
-					SetState(EFinalState);
-					return;
-				}
-				else
-				{
-					throw DEFFileError(UNRECOGNIZEDTOKEN, iFileName, iLineNum,(iLine + iOffset));
-				}
-			}
-		}
-		}
-	break;
-
-	case EComment:
-	{
-		if(IsWhiteSpace(iLine + iOffset, aCurrentPos))
-		{
-			IncrOffset(aCurrentPos);
-		}
-		
-	
-		int aLen = strlen(iLine + iOffset);
-		if( *(iLine + iOffset + aLen - 1 ) == '\n' ||  *(iLine + iOffset + aLen - 1 ) == '\r')
-			aLen -=1;
-
-		char * aComment = new char[ aLen + 1];
-		strncpy( aComment, iLine + iOffset, aLen);
-		aComment[aLen] = '\0';
-
-		IncrOffset(aLen);
-
-		iSymbol->Comment(aComment);
-		SetState(EFinalState);
-	}
-	break;
-
-	case EFinalState:
-		return;
-	default:
-		break;	
-	}
-}
-
-/**
-This function returns true if the string starts with one
-of the fixed patterns.
-It also updates the length  and index of this pattern.
-@param aChar - Line Token
-@param aTill - Length of the pattern
-@param aTill - Index of the pattern
-Return Value - True, if the string starts with one of the patterns.
-@internalComponent
-@released
-*/
-bool LineToken::IsPattern(char* aStr, int& aTill, int& aIndex)
-{
-	int pos = 0;
-	int aLength;
-	int size = sizeof(DefFilePatterns)/sizeof(char*);
-	while(size > pos)
-	{
-		aLength = strlen(DefFilePatterns[pos]);
-		if(!strncmp(aStr, DefFilePatterns[pos], aLength))
-		{
-			aTill = aLength;
-			aIndex = pos;
-			return true;
-		}
-		pos++;
-	}
-	return false;
-}
-
-/**
-This function returns true if the string starts with digits.
-It also updates the length of this digit string.
-@param aChar - Line Token
-@param aTill - Length of the digit string
-Return Value - True, if the string starts with digit(s)
-@internalComponent
-@released
-*/
-bool LineToken::IsDigit(char *aChar, int &aTill)
-{
-	int pos = 0;
-	if( aChar[pos] - '0' >= 0 &&  aChar[pos] - '0' <= 9)
-	{
-		pos++;
-		while(aChar[pos] - '0' >= 0 &&  aChar[pos] - '0' <= 9)
-		{
-			pos++;
-		}
-		aTill = pos;
-		return true;
-	}
-	else
-	{
-		return false;
-	}
-}
-
-/**
-This function returns true if the string starts with white space.
-It also updates the length of this white string!
-@param aStr - Line Token
-@param aTill - Length of the white string
-Return Value - True, if the string starts with whitespace
-@internalComponent
-@released
-*/
-bool LineToken::IsWhiteSpace(char *aStr, int &aTill)
-{
-	int pos = 0;
-	switch( aStr[pos] )
-	{
-	case ' ':
-	case '\t':
-		break;
-	default:
-		return false;
-	}
-
-	pos++;
-	while( aStr[pos])
-	{
-		switch(aStr[pos])
-		{
-			case ' ':
-			case '\t':
-				pos++;
-			break;
-			default:
-				aTill = pos;
-				return true;
-		}
-
-	}
-	aTill = pos;
-	return true;
-}
-
-/**
-This function returns true if the string starts with non-whitespace.
-It also updates the length of this word.
-@param aStr  - Line Token
-@param aTill - Length of the word
-Return Value - True, if the string starts with non-whitespace chars.
-It also updates the length of the word.
-@internalComponent
-@released
-*/
-bool LineToken::IsWord(char *aStr, int &aTill)
-{
-	int pos = 0;
-	switch( aStr[pos] )
-	{
-	case '\0':
-	case ' ':
-	case '\t':
-	case '\r':
-	case '\n':
-		return false;
-	default:
-		break;
-	}
-
-	pos++;
-	while( aStr[pos])
-	{
-		switch(aStr[pos])
-		{
-			case ' ':
-			case '\t':
-			case '\r':
-			case '\n':
-				aTill = pos;
-				return true;
-			default:
-				pos++;
-				break;
-		}
-
-	}
-	aTill = pos;
-	return true;
-}
-
-/**
-This function increments the current offset.
-@param aOff  - increment by this value
-@internalComponent
-@released
-*/
-void LineToken::IncrOffset(int aOff)
-{ 
-	iOffset += aOff;
-}
-
-/**
-This function sets the state of the tokenizer that is parsing 
-the line.
-@param aState  - next state
-@internalComponent
-@released
-*/
-void LineToken::SetState(DefStates aState)
-{
-	iState = aState;
-}
-
-/**
-Function to Read def file and get the internal representation in structure.
-@param defFile - DEF File name
-@internalComponent
-@released
-*/
-SymbolList* DefFile::ReadDefFile(char *defFile)
-{
-	char *defFileEntries;
-
-	defFileEntries=OpenDefFile(defFile);
-	ParseDefFile(defFileEntries);
-
-	delete [] defFileEntries;//Free the memory which was required to read def file
-
-	return iSymbolList;
-
-}
-
-/**
-Function to get the internal representation of Def File.
-@param defFile - DEF File name
-@internalComponent
-@released
-*/
-SymbolList* DefFile::GetSymbolEntryList(char *defFile)
-{
-	if(iSymbolList)
-	{
-		return iSymbolList;
-	}
-	else
-	{
-		iSymbolList=ReadDefFile(defFile);
-		return iSymbolList;
-	}
-
-}
-
-/**
-Function to write DEF file from symbol entry List.
-@param fileName - Def file name
-@param newSymbolList - pointer to SymbolList which we get as an input for writing in DEF File
-@internalComponent
-@released
-*/
-void DefFile::WriteDefFile(char *fileName, SymbolList * newSymbolList)
-{
-
-	char ordinal[6];
-	int newDefEntry=0;
-	FILE *fptr;
-
-	if((fptr=fopen(fileName,"wb"))==NULL)
-	{
-		throw FileError(FILEOPENERROR,fileName);
-	}
-	else
-	{
-		SymbolList::iterator aItr = newSymbolList->begin();
-		SymbolList::iterator last = newSymbolList->end();
-		Symbol *aSym;
-
-		fputs("EXPORTS",fptr);
-		fputs("\r\n",fptr);
-		while( aItr != last)
-		{
-			aSym = *aItr;
-			//Do not write now if its a new entry
-			if(aSym->GetSymbolStatus()==New)
-			{
-				newDefEntry=1;
-				aItr++;
-				continue;
-			}
-
-			//Make it comment if its missing def entry
-			if(aSym->GetSymbolStatus()==Missing)
-				fputs("; MISSING:",fptr);
-
-			fputs("\t",fptr);
-			if((aSym->ExportName()) && strcmp(aSym->SymbolName(),aSym->ExportName())!=0)
-			{
-				fputs(aSym->ExportName(),fptr);
-				fputs("=",fptr);
-			}
-			fputs(aSym->SymbolName(),fptr);
-			fputs(" @ ",fptr);
-			sprintf(ordinal,"%d",aSym->OrdNum());
-			fputs(ordinal,fptr);
-			fputs(" NONAME",fptr);
-			if(aSym->CodeDataType()==SymbolTypeData) {
-				fputs(" DATA",fptr);
-				fputs(" ",fptr);
-				char aSymSize[16];
-				sprintf(aSymSize, "%d", aSym->SymbolSize());
-				fputs(aSymSize,fptr);
-			}
-			if(aSym->R3unused())
-				fputs(" R3UNUSED",fptr);
-			if(aSym->Absent())
-				fputs(" ABSENT",fptr);
-				
-			if(aSym->Comment()!=NULL)
-			{
-				fputs(" ; ",fptr);
-				fputs(aSym->Comment(),fptr);
-			}
-			fputs("\r\n",fptr);
-			aItr++;
-		}
-
-		//This is for writing new def entry in DEF File
-		if(newDefEntry)
-		{
-			fputs("; NEW:",fptr);
-			fputs("\r\n",fptr);
-			aItr = newSymbolList->begin();
-			last = newSymbolList->end();
-
-			while( aItr != last)
-			{
-				aSym = *aItr;
-				if(aSym->GetSymbolStatus()!=New)
-				{
-					aItr++;
-					continue;
-				}
-				fputs("\t",fptr);
-				if((aSym->ExportName()) && strcmp(aSym->SymbolName(),aSym->ExportName())!=0)
-				{
-					fputs(aSym->ExportName(),fptr);
-					fputs("=",fptr);
-				}
-				fputs(aSym->SymbolName(),fptr);
-				fputs(" @ ",fptr);
-				sprintf(ordinal,"%d",aSym->OrdNum());
-				fputs(ordinal,fptr);
-				fputs(" NONAME",fptr);
-
-				if(aSym->CodeDataType()==SymbolTypeData) {
-					fputs(" DATA",fptr);
-					fputs(" ",fptr);
-					char aSymSize[16];
-					sprintf(aSymSize, "%d", aSym->SymbolSize());
-					fputs(aSymSize,fptr);
-				}
-
-				if(aSym->R3unused())
-					fputs(" R3UNUSED",fptr);
-				if(aSym->Absent())
-					fputs(" ABSENT",fptr);
-
-				if(aSym->Comment()!=NULL)
-				{
-					if(aSym->CodeDataType()!=SymbolTypeCode &&
-						aSym->CodeDataType()!=SymbolTypeData)
-					{
-						fputs(" ; ",fptr);
-						fputs(aSym->Comment(),fptr);
-					}
-					else
-					{
-						fputs(" ",fptr);
-						fputs(aSym->Comment(),fptr);
-					}
-				}
-				fputs("\r\n",fptr);
-				aItr++;
-			}
-		}
-		fputs("\r\n",fptr);
-		fclose(fptr);
-	}
-}