xref: /AOO41X/main/soltools/ldump/ldump.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_soltools.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <string.h>
32*cdf0e10cSrcweir #include <direct.h>
33*cdf0e10cSrcweir #include <stdio.h>
34*cdf0e10cSrcweir #include <stdlib.h>
35*cdf0e10cSrcweir 
36*cdf0e10cSrcweir #include "ldump.hxx"
37*cdf0e10cSrcweir #include "hashtbl.hxx"
38*cdf0e10cSrcweir 
39*cdf0e10cSrcweir #define MAXSYM     65536
40*cdf0e10cSrcweir #define MAXBASE    98304
41*cdf0e10cSrcweir #define MAX_MAN		4096
42*cdf0e10cSrcweir 
43*cdf0e10cSrcweir int	bFilter = 0;
44*cdf0e10cSrcweir int bLdump3 = 0;
45*cdf0e10cSrcweir int bUseDirectives = 0;
46*cdf0e10cSrcweir int bVerbose = 0;
47*cdf0e10cSrcweir int bExportByName = 0;
48*cdf0e10cSrcweir 
49*cdf0e10cSrcweir class ExportSet : public HashTable
50*cdf0e10cSrcweir {
51*cdf0e10cSrcweir public:
52*cdf0e10cSrcweir     ExportSet
53*cdf0e10cSrcweir     (
54*cdf0e10cSrcweir         unsigned long lSize,
55*cdf0e10cSrcweir         double	dMaxLoadFactor = HashTable::m_defMaxLoadFactor,
56*cdf0e10cSrcweir         double	dGrowFactor = HashTable::m_defDefGrowFactor
57*cdf0e10cSrcweir     )
58*cdf0e10cSrcweir         : HashTable(lSize,false,dMaxLoadFactor,dGrowFactor) {}
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir     virtual ~ExportSet() {}
61*cdf0e10cSrcweir 
62*cdf0e10cSrcweir     LibExport *  Find (char * const& Key) const
63*cdf0e10cSrcweir     { return (LibExport *) HashTable::Find((char *) Key); }
64*cdf0e10cSrcweir 
65*cdf0e10cSrcweir     bool Insert (char * const& Key, LibExport * Object)
66*cdf0e10cSrcweir     { return HashTable::Insert((char *) Key, (void*) Object); }
67*cdf0e10cSrcweir 
68*cdf0e10cSrcweir     LibExport *  Delete (char * const&Key)
69*cdf0e10cSrcweir     { return (LibExport *) HashTable::Delete ((char *) Key); }
70*cdf0e10cSrcweir };
71*cdf0e10cSrcweir 
72*cdf0e10cSrcweir LibDump::LibDump( char *cFileName, int bExportByName )
73*cdf0e10cSrcweir 				: cBName( NULL ),
74*cdf0e10cSrcweir 				cAPrefix( NULL ),
75*cdf0e10cSrcweir 				cLibName( NULL ),
76*cdf0e10cSrcweir 				cFilterName( NULL ),
77*cdf0e10cSrcweir 				cModName( NULL )
78*cdf0e10cSrcweir {
79*cdf0e10cSrcweir 	fprintf( stderr, "LIB-NT File Dumper v4.00 (C) 2000 Sun Microsystems, Inc.\n\n" );
80*cdf0e10cSrcweir 	fprintf( stderr, "%s ", cFileName );
81*cdf0e10cSrcweir 
82*cdf0e10cSrcweir     bExportName = bExportByName;
83*cdf0e10cSrcweir 
84*cdf0e10cSrcweir 	unsigned long nSlots =  0xfffff;
85*cdf0e10cSrcweir 	pBaseTab = new ExportSet( nSlots );
86*cdf0e10cSrcweir 	pIndexTab = new ExportSet( nSlots );
87*cdf0e10cSrcweir 	pFilterLines = new char * [MAXFILT];
88*cdf0e10cSrcweir 	CheckLibrary(cFileName);
89*cdf0e10cSrcweir 	bBase = 0;
90*cdf0e10cSrcweir 	bAll = false;
91*cdf0e10cSrcweir 	nDefStart = 0;
92*cdf0e10cSrcweir 	nBaseLines = 0;
93*cdf0e10cSrcweir 	nFilterLines = 0;
94*cdf0e10cSrcweir 	bDef = true;
95*cdf0e10cSrcweir 	cAPrefix = new char[ 1 ];
96*cdf0e10cSrcweir 	cAPrefix[ 0 ] = 0;
97*cdf0e10cSrcweir     if (!bExportName)
98*cdf0e10cSrcweir 	    CheckDataBase();
99*cdf0e10cSrcweir }
100*cdf0e10cSrcweir 
101*cdf0e10cSrcweir bool LibDump::Dump()
102*cdf0e10cSrcweir {
103*cdf0e10cSrcweir 	FILE *pList;
104*cdf0e10cSrcweir     char  aBuf[MAX_MAN];
105*cdf0e10cSrcweir     int   nLen;
106*cdf0e10cSrcweir     char  aName[MAX_MAN];
107*cdf0e10cSrcweir 
108*cdf0e10cSrcweir     pList = fopen( cLibName, "rb");
109*cdf0e10cSrcweir 	if (!pList)
110*cdf0e10cSrcweir 		DumpError(10);
111*cdf0e10cSrcweir 
112*cdf0e10cSrcweir     // forget about offset when working on linker directives
113*cdf0e10cSrcweir     if ( !bUseDirectives )
114*cdf0e10cSrcweir     {
115*cdf0e10cSrcweir         // calculating offset for name section
116*cdf0e10cSrcweir     	unsigned char TmpBuffer[4];
117*cdf0e10cSrcweir 	    fread( TmpBuffer, 1, 4, pList);
118*cdf0e10cSrcweir     	// anzahl bigendian mal laenge + ueberspringen der naechsten laengenangabe
119*cdf0e10cSrcweir     	unsigned long nOffSet = (unsigned long) ( TmpBuffer[2] * 256 + TmpBuffer[3] ) * 4 + 4;
120*cdf0e10cSrcweir     	fseek( pList, (long) nOffSet, 0);
121*cdf0e10cSrcweir     }
122*cdf0e10cSrcweir 
123*cdf0e10cSrcweir 	char aTmpBuf[4096];
124*cdf0e10cSrcweir 	// reading file containing symbols
125*cdf0e10cSrcweir     while( !feof( pList ) )
126*cdf0e10cSrcweir     {
127*cdf0e10cSrcweir    		int i = 0;
128*cdf0e10cSrcweir         if ( !bUseDirectives )
129*cdf0e10cSrcweir         {
130*cdf0e10cSrcweir 	    	// symbol komplett einlesen
131*cdf0e10cSrcweir             for (;;)
132*cdf0e10cSrcweir             {
133*cdf0e10cSrcweir                 int c = fgetc( pList );
134*cdf0e10cSrcweir                 if ( c == '\0' )
135*cdf0e10cSrcweir                 {
136*cdf0e10cSrcweir                     break;
137*cdf0e10cSrcweir                 }
138*cdf0e10cSrcweir                 if ( ((c >= 33) && (c <= 126)) && ( c!=40 && c!=41) )
139*cdf0e10cSrcweir                 	aBuf[i] = static_cast< char >(c);
140*cdf0e10cSrcweir                 else
141*cdf0e10cSrcweir                 {
142*cdf0e10cSrcweir                     aBuf[0] = '\0';
143*cdf0e10cSrcweir                     break;
144*cdf0e10cSrcweir                 }
145*cdf0e10cSrcweir             	i++;
146*cdf0e10cSrcweir             }
147*cdf0e10cSrcweir     		// Namen found
148*cdf0e10cSrcweir             aBuf[i] = '\0';
149*cdf0e10cSrcweir         }
150*cdf0e10cSrcweir         else
151*cdf0e10cSrcweir         {
152*cdf0e10cSrcweir             fgets( aTmpBuf, 4096, pList );
153*cdf0e10cSrcweir             char * pEnd = 0;
154*cdf0e10cSrcweir             char *pFound = 0;
155*cdf0e10cSrcweir             aBuf[0] = '\0';
156*cdf0e10cSrcweir             pFound = strchr( aTmpBuf, 'E' );
157*cdf0e10cSrcweir             while ( pFound )
158*cdf0e10cSrcweir             {
159*cdf0e10cSrcweir                 if ( strncmp( "EXPORT:", pFound, 7) == 0 )
160*cdf0e10cSrcweir                 {
161*cdf0e10cSrcweir                     pFound += 7;
162*cdf0e10cSrcweir                     pEnd = strchr( pFound, ',');
163*cdf0e10cSrcweir                     if ( pEnd )
164*cdf0e10cSrcweir                         *pEnd = '\0';
165*cdf0e10cSrcweir                     strncpy( aBuf, pFound, strlen( pFound));
166*cdf0e10cSrcweir                     aBuf[ strlen( pFound) ] = '\0';
167*cdf0e10cSrcweir //                    fprintf( stderr, "\n--- %s\n", aBuf);
168*cdf0e10cSrcweir                     break;
169*cdf0e10cSrcweir                 }
170*cdf0e10cSrcweir                 else
171*cdf0e10cSrcweir                 {
172*cdf0e10cSrcweir                     pFound++;
173*cdf0e10cSrcweir                     pFound = strchr( pFound, 'E' );
174*cdf0e10cSrcweir                 }
175*cdf0e10cSrcweir             }
176*cdf0e10cSrcweir         }
177*cdf0e10cSrcweir 
178*cdf0e10cSrcweir 	    if ((aBuf[0] =='?') || !strncmp(aBuf, "__CT",4))
179*cdf0e10cSrcweir 		{
180*cdf0e10cSrcweir 			nLen = (int) strlen(aBuf);
181*cdf0e10cSrcweir             memset( aName, 0, sizeof( aName ) );
182*cdf0e10cSrcweir             int nName = 0;
183*cdf0e10cSrcweir             for( i = 0; i < nLen; i++ )
184*cdf0e10cSrcweir             {
185*cdf0e10cSrcweir                 if ( (aBuf[i] != '\n') && (aBuf[i] != '\r') )
186*cdf0e10cSrcweir                 {
187*cdf0e10cSrcweir                     aName[nName] = aBuf[i];
188*cdf0e10cSrcweir                     nName++;
189*cdf0e10cSrcweir                 }
190*cdf0e10cSrcweir             }
191*cdf0e10cSrcweir 			// und raus damit
192*cdf0e10cSrcweir             PrintSym( aName, bExportByName );
193*cdf0e10cSrcweir 		}
194*cdf0e10cSrcweir 		else if ( bAll == true )
195*cdf0e10cSrcweir 		{
196*cdf0e10cSrcweir 			int nPreLen = (int) strlen( cAPrefix );
197*cdf0e10cSrcweir 
198*cdf0e10cSrcweir             nLen = (int) strlen(aBuf);
199*cdf0e10cSrcweir             memset( aName, 0, sizeof( aName ) );
200*cdf0e10cSrcweir             int nName = 0;
201*cdf0e10cSrcweir 
202*cdf0e10cSrcweir             for( i = 0; i < nLen; i++ )
203*cdf0e10cSrcweir             {
204*cdf0e10cSrcweir               if ( (aBuf[i] != '\n') && (aBuf[i] != '\r') )
205*cdf0e10cSrcweir               {
206*cdf0e10cSrcweir                   aName[nName] = aBuf[i];
207*cdf0e10cSrcweir                   nName++;
208*cdf0e10cSrcweir 			  }
209*cdf0e10cSrcweir 			}
210*cdf0e10cSrcweir 			//fprintf( stderr, "Gefundenen Prefix : %s %d \n", aTmpBuf, nPreLen );
211*cdf0e10cSrcweir 			// den ersten _ raus
212*cdf0e10cSrcweir             nLen = (int) strlen(aName);
213*cdf0e10cSrcweir             if (aName[0] == '_')
214*cdf0e10cSrcweir 				strcpy( aBuf , &aName[1] );
215*cdf0e10cSrcweir 			strncpy ( aTmpBuf, aBuf, (size_t) nPreLen );
216*cdf0e10cSrcweir 			aTmpBuf[nPreLen] = '\0';
217*cdf0e10cSrcweir 			if ( !strcmp( aTmpBuf, cAPrefix ))
218*cdf0e10cSrcweir 			{
219*cdf0e10cSrcweir 				if ( bLdump3 ) {
220*cdf0e10cSrcweir 					int nChar = '@';
221*cdf0e10cSrcweir 					char *pNeu = strchr( aBuf, nChar );
222*cdf0e10cSrcweir 					int nPos = pNeu - aBuf + 1;
223*cdf0e10cSrcweir 					if ( nPos > 0 )
224*cdf0e10cSrcweir 					{
225*cdf0e10cSrcweir 						char aOldBuf[MAX_MAN];
226*cdf0e10cSrcweir 						strcpy( aOldBuf, aBuf );
227*cdf0e10cSrcweir 						char pChar[MAX_MAN];
228*cdf0e10cSrcweir 						strncpy( pChar, aBuf, (size_t) (nPos -1) );
229*cdf0e10cSrcweir 						pChar[nPos-1] = '\0';
230*cdf0e10cSrcweir 						strcpy( aBuf, pChar );
231*cdf0e10cSrcweir 						strcat( aBuf, "=" );
232*cdf0e10cSrcweir 						strcat( aBuf, aOldBuf );
233*cdf0e10cSrcweir 						strcpy( pChar, "" );
234*cdf0e10cSrcweir 					}
235*cdf0e10cSrcweir 				}
236*cdf0e10cSrcweir 				// und raus damit
237*cdf0e10cSrcweir             	PrintSym( aBuf, true );
238*cdf0e10cSrcweir 			}
239*cdf0e10cSrcweir 		}
240*cdf0e10cSrcweir     }
241*cdf0e10cSrcweir 	fclose(pList);
242*cdf0e10cSrcweir 	return true;
243*cdf0e10cSrcweir }
244*cdf0e10cSrcweir 
245*cdf0e10cSrcweir bool LibDump::ReadFilter( char * cFilterName )
246*cdf0e10cSrcweir {
247*cdf0e10cSrcweir 	FILE* pfFilter = 0;
248*cdf0e10cSrcweir     char  aBuf[MAX_MAN];
249*cdf0e10cSrcweir     char* pStr;
250*cdf0e10cSrcweir     int   nLen;
251*cdf0e10cSrcweir 
252*cdf0e10cSrcweir     pfFilter = fopen( cFilterName, "r" );
253*cdf0e10cSrcweir 
254*cdf0e10cSrcweir     if ( !pfFilter )
255*cdf0e10cSrcweir     {
256*cdf0e10cSrcweir         ::bFilter = 0;
257*cdf0e10cSrcweir         DumpError( 500 );
258*cdf0e10cSrcweir     }
259*cdf0e10cSrcweir 
260*cdf0e10cSrcweir     while( fgets( aBuf, MAX_MAN, pfFilter ) != 0 )
261*cdf0e10cSrcweir     {
262*cdf0e10cSrcweir         nLen = (int) strlen(aBuf);
263*cdf0e10cSrcweir         pStr = new char[(unsigned int) nLen];
264*cdf0e10cSrcweir         if ( !pStr )
265*cdf0e10cSrcweir             DumpError( 98 );
266*cdf0e10cSrcweir         memcpy( pStr, aBuf, (unsigned int) nLen );
267*cdf0e10cSrcweir         if ( *(pStr+nLen-1) == '\n' )
268*cdf0e10cSrcweir             *(pStr+nLen-1) = '\0';
269*cdf0e10cSrcweir 		pFilterLines[nFilterLines] = pStr;
270*cdf0e10cSrcweir 		nFilterLines++;
271*cdf0e10cSrcweir 		if ( nFilterLines >= MAXFILT )
272*cdf0e10cSrcweir 				DumpError( 510 );
273*cdf0e10cSrcweir     }
274*cdf0e10cSrcweir 
275*cdf0e10cSrcweir 	fclose( pfFilter );
276*cdf0e10cSrcweir 	return true;
277*cdf0e10cSrcweir }
278*cdf0e10cSrcweir 
279*cdf0e10cSrcweir bool LibDump::PrintSym(char *pName, bool bName )
280*cdf0e10cSrcweir {
281*cdf0e10cSrcweir 	LibExport *pData;
282*cdf0e10cSrcweir 
283*cdf0e10cSrcweir 
284*cdf0e10cSrcweir     // Filter auswerten
285*cdf0e10cSrcweir     if ( Filter( pName ) )
286*cdf0e10cSrcweir     {
287*cdf0e10cSrcweir         if ( strlen( pName ) > 3 )
288*cdf0e10cSrcweir         {
289*cdf0e10cSrcweir             if ( bDef )
290*cdf0e10cSrcweir 		    {
291*cdf0e10cSrcweir 		        if (!bBase)
292*cdf0e10cSrcweir                     if (bExportName) {
293*cdf0e10cSrcweir 						fprintf( stdout, "\t%s\n", pName );
294*cdf0e10cSrcweir                     } else {
295*cdf0e10cSrcweir 						fprintf( stdout, "\t%s\t\t@%lu\n", pName, nDefStart );
296*cdf0e10cSrcweir                     }
297*cdf0e10cSrcweir 				else
298*cdf0e10cSrcweir 				{
299*cdf0e10cSrcweir 					 pData = pBaseTab->Find( pName );
300*cdf0e10cSrcweir 					 if ( pData )
301*cdf0e10cSrcweir 					 {
302*cdf0e10cSrcweir 						pData->bExport = true;
303*cdf0e10cSrcweir 						if ( bName )
304*cdf0e10cSrcweir 							pData->bByName = true;
305*cdf0e10cSrcweir 						else
306*cdf0e10cSrcweir 							pData->bByName = false;
307*cdf0e10cSrcweir 						if ( bVerbose )
308*cdf0e10cSrcweir 							fprintf(stderr,".");
309*cdf0e10cSrcweir 					 }
310*cdf0e10cSrcweir 					 else
311*cdf0e10cSrcweir 					 {
312*cdf0e10cSrcweir 					 	// neuen Export eintragen
313*cdf0e10cSrcweir 					 	pData = new LibExport;
314*cdf0e10cSrcweir 						pData->cExportName = new char[ strlen( pName ) + 1 ];
315*cdf0e10cSrcweir 						strcpy( pData->cExportName, pName );
316*cdf0e10cSrcweir 						pData->nOrdinal = nBaseLines++;
317*cdf0e10cSrcweir 						pData->bExport = true;
318*cdf0e10cSrcweir 						if ( bName )
319*cdf0e10cSrcweir 							pData->bByName = true;
320*cdf0e10cSrcweir 						else
321*cdf0e10cSrcweir 							pData->bByName = false;
322*cdf0e10cSrcweir 						pBaseTab->Insert( pData->cExportName, pData );
323*cdf0e10cSrcweir 						char *cBuffer = new char[ 30 ];
324*cdf0e10cSrcweir 						sprintf( cBuffer, "%lu", pData->nOrdinal );
325*cdf0e10cSrcweir 						pIndexTab->Insert( cBuffer, pData );
326*cdf0e10cSrcweir 						delete [] cBuffer;
327*cdf0e10cSrcweir 						if ( bVerbose )
328*cdf0e10cSrcweir 							fprintf(stderr,"n");
329*cdf0e10cSrcweir 					 }
330*cdf0e10cSrcweir 				}
331*cdf0e10cSrcweir 		    }
332*cdf0e10cSrcweir             else
333*cdf0e10cSrcweir                 printf( "%s\n", pName );
334*cdf0e10cSrcweir             nDefStart++;
335*cdf0e10cSrcweir         }
336*cdf0e10cSrcweir     }
337*cdf0e10cSrcweir 	return true;
338*cdf0e10cSrcweir }
339*cdf0e10cSrcweir 
340*cdf0e10cSrcweir bool LibDump::IsFromAnonymousNamespace (char *pExportName) {
341*cdf0e10cSrcweir     char* pattern1 = "@?A0x";
342*cdf0e10cSrcweir 
343*cdf0e10cSrcweir     if (strstr(pExportName, pattern1)) {
344*cdf0e10cSrcweir         return true;
345*cdf0e10cSrcweir     };
346*cdf0e10cSrcweir     return false;
347*cdf0e10cSrcweir };
348*cdf0e10cSrcweir 
349*cdf0e10cSrcweir bool LibDump::Filter(char *pExportName)
350*cdf0e10cSrcweir {
351*cdf0e10cSrcweir 	unsigned long i;
352*cdf0e10cSrcweir 	char pTest[256];
353*cdf0e10cSrcweir 
354*cdf0e10cSrcweir     // filter out symbols from anonymous namespaces
355*cdf0e10cSrcweir     if (IsFromAnonymousNamespace (pExportName))
356*cdf0e10cSrcweir         return false;
357*cdf0e10cSrcweir 
358*cdf0e10cSrcweir     // Kein Filter gesetzt
359*cdf0e10cSrcweir     if ( ::bFilter == 0 )
360*cdf0e10cSrcweir         return true;
361*cdf0e10cSrcweir 
362*cdf0e10cSrcweir 	for ( i=0; i<nFilterLines; i++ )
363*cdf0e10cSrcweir 	{
364*cdf0e10cSrcweir 		//Zum vergleichen mu� das Plus abgeschnitteb werden
365*cdf0e10cSrcweir 		if(pFilterLines[i][0] != '+')
366*cdf0e10cSrcweir 		{
367*cdf0e10cSrcweir 			if ( strstr( pExportName, pFilterLines[i]))
368*cdf0e10cSrcweir 				return false;
369*cdf0e10cSrcweir 		}
370*cdf0e10cSrcweir 		else
371*cdf0e10cSrcweir 		{
372*cdf0e10cSrcweir 			strcpy(pTest,&pFilterLines[i][1]);
373*cdf0e10cSrcweir 			if ( strstr( pExportName, pTest))
374*cdf0e10cSrcweir 				return true;
375*cdf0e10cSrcweir 		}
376*cdf0e10cSrcweir 	}
377*cdf0e10cSrcweir     return true;
378*cdf0e10cSrcweir }
379*cdf0e10cSrcweir 
380*cdf0e10cSrcweir bool LibDump::SetFilter(char * cFilterName)
381*cdf0e10cSrcweir {
382*cdf0e10cSrcweir 	ReadFilter( cFilterName );
383*cdf0e10cSrcweir 	return true;
384*cdf0e10cSrcweir }
385*cdf0e10cSrcweir 
386*cdf0e10cSrcweir bool LibDump::CheckLibrary(char * cName)
387*cdf0e10cSrcweir {
388*cdf0e10cSrcweir 	delete [] cLibName;
389*cdf0e10cSrcweir 	cLibName = new char[ strlen( cName ) + 1 ];
390*cdf0e10cSrcweir 	strcpy( cLibName, cName );
391*cdf0e10cSrcweir 	return true;
392*cdf0e10cSrcweir }
393*cdf0e10cSrcweir 
394*cdf0e10cSrcweir bool LibDump::ReadDataBase()
395*cdf0e10cSrcweir {
396*cdf0e10cSrcweir 	FILE* pfBase = 0;
397*cdf0e10cSrcweir     char  aBuf[MAX_MAN];
398*cdf0e10cSrcweir     char* pStr;
399*cdf0e10cSrcweir     char  cBuffer[ 30 ];
400*cdf0e10cSrcweir     int   nLen;
401*cdf0e10cSrcweir 	LibExport *pData;
402*cdf0e10cSrcweir 
403*cdf0e10cSrcweir     pfBase = fopen( cBName, "r" );
404*cdf0e10cSrcweir 
405*cdf0e10cSrcweir     if ( !pfBase )
406*cdf0e10cSrcweir     {
407*cdf0e10cSrcweir         bBase = 0;
408*cdf0e10cSrcweir         DumpError( 600 );
409*cdf0e10cSrcweir     }
410*cdf0e10cSrcweir 
411*cdf0e10cSrcweir 	bool bRet = true;
412*cdf0e10cSrcweir 	while( fgets( aBuf, MAX_MAN, pfBase ) != 0 )
413*cdf0e10cSrcweir     {
414*cdf0e10cSrcweir         nLen = (int) strlen(aBuf);
415*cdf0e10cSrcweir         pStr = new char[(unsigned int) nLen];
416*cdf0e10cSrcweir         if ( !pStr )
417*cdf0e10cSrcweir             DumpError( 98 );
418*cdf0e10cSrcweir         memcpy( pStr, aBuf, (size_t) nLen );
419*cdf0e10cSrcweir         if ( *(pStr+nLen-1) == '\n' )
420*cdf0e10cSrcweir             *(pStr+nLen-1) = '\0';
421*cdf0e10cSrcweir 		pData = new LibExport;
422*cdf0e10cSrcweir 		pData->cExportName = pStr;
423*cdf0e10cSrcweir 		pData->nOrdinal = nBaseLines;
424*cdf0e10cSrcweir 		pData->bExport=false;
425*cdf0e10cSrcweir 
426*cdf0e10cSrcweir 		if (pBaseTab->Insert(pData->cExportName, pData ) == NULL)
427*cdf0e10cSrcweir 			bRet = false;
428*cdf0e10cSrcweir         ltoa( (long) pData->nOrdinal, cBuffer, 10 );
429*cdf0e10cSrcweir 		if (pIndexTab->Insert( cBuffer, pData ) == NULL)
430*cdf0e10cSrcweir 			bRet = false;
431*cdf0e10cSrcweir         nBaseLines++;
432*cdf0e10cSrcweir         if ( nBaseLines >= MAXBASE )
433*cdf0e10cSrcweir             DumpError( 610 );
434*cdf0e10cSrcweir     }
435*cdf0e10cSrcweir     fclose( pfBase );
436*cdf0e10cSrcweir 	return bRet;
437*cdf0e10cSrcweir }
438*cdf0e10cSrcweir 
439*cdf0e10cSrcweir class ExportSetIter : public HashTableIterator
440*cdf0e10cSrcweir {
441*cdf0e10cSrcweir public:
442*cdf0e10cSrcweir     ExportSetIter(HashTable const& aTable)
443*cdf0e10cSrcweir 		: HashTableIterator(aTable)	{}
444*cdf0e10cSrcweir 
445*cdf0e10cSrcweir     LibExport * GetFirst()
446*cdf0e10cSrcweir     { return (LibExport *)HashTableIterator::GetFirst(); }
447*cdf0e10cSrcweir     LibExport * GetNext()
448*cdf0e10cSrcweir     { return (LibExport *)HashTableIterator::GetNext();  }
449*cdf0e10cSrcweir     LibExport * GetLast()
450*cdf0e10cSrcweir     { return (LibExport *)HashTableIterator::GetLast();  }
451*cdf0e10cSrcweir     LibExport * GetPrev()
452*cdf0e10cSrcweir     { return (LibExport *)HashTableIterator::GetPrev();  }
453*cdf0e10cSrcweir 
454*cdf0e10cSrcweir private:
455*cdf0e10cSrcweir     void operator =(ExportSetIter &); // not defined
456*cdf0e10cSrcweir };
457*cdf0e10cSrcweir 
458*cdf0e10cSrcweir bool LibDump::PrintDataBase()
459*cdf0e10cSrcweir {
460*cdf0e10cSrcweir     if (bExportName)
461*cdf0e10cSrcweir         return true;
462*cdf0e10cSrcweir 	FILE *pFp;
463*cdf0e10cSrcweir 	pFp = fopen (cBName,"w+");
464*cdf0e10cSrcweir 	if (!pFp)
465*cdf0e10cSrcweir 		fprintf( stderr, "Error opening DataBase File\n" );
466*cdf0e10cSrcweir 
467*cdf0e10cSrcweir 	LibExport *pData;
468*cdf0e10cSrcweir 	for ( unsigned long i=0; i < nBaseLines+10; i++ )
469*cdf0e10cSrcweir 	{
470*cdf0e10cSrcweir 		char * cBuffer = new char[ 30 ];
471*cdf0e10cSrcweir 		sprintf( cBuffer, "%lu", i );
472*cdf0e10cSrcweir 		pData = pIndexTab->Find( cBuffer );
473*cdf0e10cSrcweir 		delete [] cBuffer;
474*cdf0e10cSrcweir 		if ( pData )
475*cdf0e10cSrcweir 			fprintf(pFp,"%s\n",pData->cExportName);
476*cdf0e10cSrcweir 	}
477*cdf0e10cSrcweir 	fclose(pFp);
478*cdf0e10cSrcweir 	return true;
479*cdf0e10cSrcweir }
480*cdf0e10cSrcweir 
481*cdf0e10cSrcweir bool LibDump::PrintDefFile()
482*cdf0e10cSrcweir {
483*cdf0e10cSrcweir #ifdef FAST
484*cdf0e10cSrcweir 	ExportSetIter aIterator( *pBaseTab );
485*cdf0e10cSrcweir 	for ( LibExport *pData = aIterator.GetFirst(); pData != NULL;
486*cdf0e10cSrcweir 										pData = aIterator.GetNext() )
487*cdf0e10cSrcweir 	{
488*cdf0e10cSrcweir 		if ( pData->bExport )
489*cdf0e10cSrcweir 		{
490*cdf0e10cSrcweir 			if ( pData->bByName )
491*cdf0e10cSrcweir 			{
492*cdf0e10cSrcweir 				fprintf(stdout,"\t%s\n",
493*cdf0e10cSrcweir 					pData->sExportName.GetBuffer());
494*cdf0e10cSrcweir 			}
495*cdf0e10cSrcweir 			else
496*cdf0e10cSrcweir 			{
497*cdf0e10cSrcweir 				fprintf(stdout,"\t%s\t\t@%d NONAME\n",
498*cdf0e10cSrcweir 					pData->sExportName.GetBuffer(), pData->nOrdinal+nBegin);
499*cdf0e10cSrcweir 			}
500*cdf0e10cSrcweir 		}
501*cdf0e10cSrcweir 	}
502*cdf0e10cSrcweir #else
503*cdf0e10cSrcweir 	// sortiert nach Ordinals;
504*cdf0e10cSrcweir 	LibExport *pData;
505*cdf0e10cSrcweir 	for ( unsigned long i=0; i<nBaseLines+1; i++)
506*cdf0e10cSrcweir 	{
507*cdf0e10cSrcweir 		char * cBuffer = new char[ 30 ];
508*cdf0e10cSrcweir 		sprintf( cBuffer, "%lu", i );
509*cdf0e10cSrcweir 		pData = pIndexTab->Find( cBuffer );
510*cdf0e10cSrcweir 		delete [] cBuffer;
511*cdf0e10cSrcweir 		if ( pData )
512*cdf0e10cSrcweir 			if ( pData->bExport )
513*cdf0e10cSrcweir 			{
514*cdf0e10cSrcweir 				if ( pData->bByName )
515*cdf0e10cSrcweir 				{
516*cdf0e10cSrcweir 					if ( strlen( pData->cExportName ))
517*cdf0e10cSrcweir 						fprintf(stdout,"\t%s\n",
518*cdf0e10cSrcweir 							pData->cExportName);
519*cdf0e10cSrcweir 				}
520*cdf0e10cSrcweir 				else
521*cdf0e10cSrcweir 				{
522*cdf0e10cSrcweir 					if ( strlen( pData->cExportName ))
523*cdf0e10cSrcweir 						fprintf(stdout,"\t%s\t\t@%d NONAME\n",
524*cdf0e10cSrcweir 							pData->cExportName, pData->nOrdinal+nBegin);
525*cdf0e10cSrcweir 				}
526*cdf0e10cSrcweir 			}
527*cdf0e10cSrcweir 	}
528*cdf0e10cSrcweir #endif
529*cdf0e10cSrcweir 	return true;
530*cdf0e10cSrcweir }
531*cdf0e10cSrcweir 
532*cdf0e10cSrcweir bool LibDump::CheckDataBase()
533*cdf0e10cSrcweir {
534*cdf0e10cSrcweir     // existiert eine Datenbasis ?
535*cdf0e10cSrcweir     if (!bBase)
536*cdf0e10cSrcweir     {
537*cdf0e10cSrcweir 		cBName = new char[ 2048 ];
538*cdf0e10cSrcweir 		char *pTmp = "defs\\";
539*cdf0e10cSrcweir 
540*cdf0e10cSrcweir     	FILE *fp;
541*cdf0e10cSrcweir #ifdef OS2
542*cdf0e10cSrcweir 		_mkdir ("defs", 0777);
543*cdf0e10cSrcweir #else
544*cdf0e10cSrcweir 		_mkdir ("defs");
545*cdf0e10cSrcweir #endif
546*cdf0e10cSrcweir 		strcpy(cBName,pTmp);
547*cdf0e10cSrcweir #ifdef OS2
548*cdf0e10cSrcweir 		strcat(cBName,"gcc");
549*cdf0e10cSrcweir #else
550*cdf0e10cSrcweir 		strcat(cBName,getenv ("COMP_ENV"));
551*cdf0e10cSrcweir #endif
552*cdf0e10cSrcweir 
553*cdf0e10cSrcweir 		fp = fopen (cBName,"r");
554*cdf0e10cSrcweir 		if (fp)
555*cdf0e10cSrcweir 		{
556*cdf0e10cSrcweir 			bBase = true;
557*cdf0e10cSrcweir 		}
558*cdf0e10cSrcweir 		else
559*cdf0e10cSrcweir 		{
560*cdf0e10cSrcweir 			fp = fopen (cBName,"w+");
561*cdf0e10cSrcweir 			bBase = true;
562*cdf0e10cSrcweir 		}
563*cdf0e10cSrcweir 		fclose (fp);
564*cdf0e10cSrcweir     }
565*cdf0e10cSrcweir     // lese Datenbasis !
566*cdf0e10cSrcweir     if (bBase)
567*cdf0e10cSrcweir 	{
568*cdf0e10cSrcweir     	ReadDataBase();
569*cdf0e10cSrcweir 	}
570*cdf0e10cSrcweir 	return true;
571*cdf0e10cSrcweir }
572*cdf0e10cSrcweir 
573*cdf0e10cSrcweir LibDump::~LibDump()
574*cdf0e10cSrcweir {
575*cdf0e10cSrcweir 	delete [] cBName;
576*cdf0e10cSrcweir 	delete [] cAPrefix;
577*cdf0e10cSrcweir //	delete [] cLibName;
578*cdf0e10cSrcweir 	delete [] cFilterName;
579*cdf0e10cSrcweir 	delete [] cModName;
580*cdf0e10cSrcweir }
581*cdf0e10cSrcweir 
582*cdf0e10cSrcweir void LibDump::SetCExport( char* pName )
583*cdf0e10cSrcweir {
584*cdf0e10cSrcweir 	delete [] cAPrefix;
585*cdf0e10cSrcweir 	cAPrefix = new char[ strlen( pName ) + 1 ];
586*cdf0e10cSrcweir 	strcpy( cAPrefix, pName );bAll = true;
587*cdf0e10cSrcweir }
588*cdf0e10cSrcweir 
589*cdf0e10cSrcweir //******************************************************************
590*cdf0e10cSrcweir //* Error() - Gibt Fehlermeldumg aus
591*cdf0e10cSrcweir //******************************************************************
592*cdf0e10cSrcweir 
593*cdf0e10cSrcweir void LibDump::DumpError( unsigned long n )
594*cdf0e10cSrcweir {
595*cdf0e10cSrcweir     char *p;
596*cdf0e10cSrcweir 
597*cdf0e10cSrcweir     switch (n)
598*cdf0e10cSrcweir     {
599*cdf0e10cSrcweir         case 1:  p = "Input error in library file"; break;
600*cdf0e10cSrcweir         case 2:  p = "Position error in library file (no THEADR set)"; break;
601*cdf0e10cSrcweir         case 3:  p = "Overflow of symbol table"; break;
602*cdf0e10cSrcweir #ifdef WNT
603*cdf0e10cSrcweir         case 10: p = "EXP file not found"; break;
604*cdf0e10cSrcweir         case 11: p = "No valid EXP file"; break;
605*cdf0e10cSrcweir #else
606*cdf0e10cSrcweir         case 10: p = "Library file not found"; break;
607*cdf0e10cSrcweir         case 11: p = "No valid library file"; break;
608*cdf0e10cSrcweir #endif
609*cdf0e10cSrcweir         case 98: p = "Out of memory"; break;
610*cdf0e10cSrcweir         case 99: p = "LDUMP [-LD3] [-D] [-N] [-A] [-E nn] [-F name] Filename[.LIB]\n"
611*cdf0e10cSrcweir 					 "-LD3   : Supports feature set of ldump3 (default: ldump/ldump2)\n"
612*cdf0e10cSrcweir                      "-A     : all symbols (default: only C++)\n"
613*cdf0e10cSrcweir                      "-E nn  : gerenration of export table beginning with number nn\n"
614*cdf0e10cSrcweir                      "-F name: Filter file\n"
615*cdf0e10cSrcweir                      "-D     : file contains \"dumpbin\" directives\n"
616*cdf0e10cSrcweir                      "-N     : export by name\n"
617*cdf0e10cSrcweir                      "-V     : be verbose\n"; break;
618*cdf0e10cSrcweir         case 500: p = "Unable to open filter file\n"; break;
619*cdf0e10cSrcweir         case 510: p = "Overflow of filter table\n"; break;
620*cdf0e10cSrcweir         case 600: p = "Unable to open base database file\n"; break;
621*cdf0e10cSrcweir         case 610: p = "Overflow in base database table\n"; break;
622*cdf0e10cSrcweir         default: p = "Unspecified error";
623*cdf0e10cSrcweir     }
624*cdf0e10cSrcweir 	fprintf( stdout, "%s\n", p );
625*cdf0e10cSrcweir     exit (1);
626*cdf0e10cSrcweir }
627*cdf0e10cSrcweir 
628*cdf0e10cSrcweir /*********************************************************************
629*cdf0e10cSrcweir 		Test Funktionen
630*cdf0e10cSrcweir *********************************************************************/
631*cdf0e10cSrcweir 
632*cdf0e10cSrcweir 
633*cdf0e10cSrcweir void usage()
634*cdf0e10cSrcweir {
635*cdf0e10cSrcweir 	LibDump::DumpError(99);
636*cdf0e10cSrcweir }
637*cdf0e10cSrcweir 
638*cdf0e10cSrcweir #define STATE_NON		0x0000
639*cdf0e10cSrcweir #define STATE_BEGIN		0x0001
640*cdf0e10cSrcweir #define STATE_FILTER	0x0002
641*cdf0e10cSrcweir #define STATE_CEXPORT	0x0003
642*cdf0e10cSrcweir 
643*cdf0e10cSrcweir int
644*cdf0e10cSrcweir #ifdef WNT
645*cdf0e10cSrcweir __cdecl
646*cdf0e10cSrcweir #endif
647*cdf0e10cSrcweir main( int argc, char **argv )
648*cdf0e10cSrcweir {
649*cdf0e10cSrcweir 	char *pLibName = NULL, *pFilterName = NULL, *pCExport= NULL;
650*cdf0e10cSrcweir 	unsigned short nBegin=1;
651*cdf0e10cSrcweir 
652*cdf0e10cSrcweir 	unsigned short nState = STATE_NON;
653*cdf0e10cSrcweir 
654*cdf0e10cSrcweir 	if ( argc == 1 ) {
655*cdf0e10cSrcweir 		usage();
656*cdf0e10cSrcweir 	}
657*cdf0e10cSrcweir 
658*cdf0e10cSrcweir 	for ( int i = 1; i < argc; i++ ) {
659*cdf0e10cSrcweir 		if (( !strcmp( argv[ i ], "-H" )) ||
660*cdf0e10cSrcweir 			( !strcmp( argv[ i ], "-h" )) ||
661*cdf0e10cSrcweir 			( !strcmp( argv[ i ], "-?" )))
662*cdf0e10cSrcweir 		{
663*cdf0e10cSrcweir 			usage();
664*cdf0e10cSrcweir 		}
665*cdf0e10cSrcweir 		else if (( !strcmp( argv[ i ], "-LD3" )) ||
666*cdf0e10cSrcweir 			( !strcmp( argv[ i ], "-Ld3" )) ||
667*cdf0e10cSrcweir 			( !strcmp( argv[ i ], "-ld3" )) ||
668*cdf0e10cSrcweir 			( !strcmp( argv[ i ], "-lD3" )))
669*cdf0e10cSrcweir 		{
670*cdf0e10cSrcweir 			if ( nState != STATE_NON ) {
671*cdf0e10cSrcweir 				usage();
672*cdf0e10cSrcweir 			}
673*cdf0e10cSrcweir 			bLdump3 = 1;
674*cdf0e10cSrcweir 		}
675*cdf0e10cSrcweir 		else if (( !strcmp( argv[ i ], "-E" )) || ( !strcmp( argv[ i ], "-e" ))) {
676*cdf0e10cSrcweir 			if ( nState != STATE_NON ) {
677*cdf0e10cSrcweir 				usage();
678*cdf0e10cSrcweir 			}
679*cdf0e10cSrcweir 			nState = STATE_BEGIN;
680*cdf0e10cSrcweir 		}
681*cdf0e10cSrcweir 		else if (( !strcmp( argv[ i ], "-F" )) || ( !strcmp( argv[ i ], "-f" ))) {
682*cdf0e10cSrcweir 			if ( nState != STATE_NON ) {
683*cdf0e10cSrcweir 				usage();
684*cdf0e10cSrcweir 			}
685*cdf0e10cSrcweir 			nState = STATE_FILTER;
686*cdf0e10cSrcweir 		}
687*cdf0e10cSrcweir 		else if (( !strcmp( argv[ i ], "-A" )) || ( !strcmp( argv[ i ], "-a" ))) {
688*cdf0e10cSrcweir 			if ( nState != STATE_NON ) {
689*cdf0e10cSrcweir 				usage();
690*cdf0e10cSrcweir 			}
691*cdf0e10cSrcweir 			nState = STATE_CEXPORT;
692*cdf0e10cSrcweir 			pCExport = new char[ 1 ];
693*cdf0e10cSrcweir 			pCExport[ 0 ] = 0;
694*cdf0e10cSrcweir 		}
695*cdf0e10cSrcweir 		else if (( !strcmp( argv[ i ], "-D" )) || ( !strcmp( argv[ i ], "-d" ))) {
696*cdf0e10cSrcweir 			if ( nState != STATE_NON ) {
697*cdf0e10cSrcweir 				usage();
698*cdf0e10cSrcweir 			}
699*cdf0e10cSrcweir             bUseDirectives = 1;
700*cdf0e10cSrcweir 		}
701*cdf0e10cSrcweir 		else if (( !strcmp( argv[ i ], "-N" )) || ( !strcmp( argv[ i ], "-n" ))) {
702*cdf0e10cSrcweir 			if ( nState != STATE_NON ) {
703*cdf0e10cSrcweir 				usage();
704*cdf0e10cSrcweir 			}
705*cdf0e10cSrcweir             bExportByName = 1;
706*cdf0e10cSrcweir 		}
707*cdf0e10cSrcweir 		else if (( !strcmp( argv[ i ], "-V" )) || ( !strcmp( argv[ i ], "-v" ))) {
708*cdf0e10cSrcweir 			if ( nState != STATE_NON ) {
709*cdf0e10cSrcweir 				usage();
710*cdf0e10cSrcweir 			}
711*cdf0e10cSrcweir             bVerbose = 1;
712*cdf0e10cSrcweir 		}
713*cdf0e10cSrcweir 		else {
714*cdf0e10cSrcweir 			switch ( nState ) {
715*cdf0e10cSrcweir 				case STATE_BEGIN:
716*cdf0e10cSrcweir 					nBegin = static_cast< unsigned short >(atoi( argv[ i ] ));
717*cdf0e10cSrcweir 					nState = STATE_NON;
718*cdf0e10cSrcweir 				break;
719*cdf0e10cSrcweir 				case STATE_FILTER:
720*cdf0e10cSrcweir 					pFilterName = new char[ strlen( argv[ i ] ) + 1 ];
721*cdf0e10cSrcweir 					strcpy( pFilterName, argv[ i ] );
722*cdf0e10cSrcweir 					bFilter = 1;
723*cdf0e10cSrcweir 					nState = STATE_NON;
724*cdf0e10cSrcweir 				break;
725*cdf0e10cSrcweir 				case STATE_CEXPORT:
726*cdf0e10cSrcweir 					delete [] pCExport;
727*cdf0e10cSrcweir 					pCExport = new char[ strlen( argv[ i ] ) + 1 ];
728*cdf0e10cSrcweir 					strcpy( pCExport, argv[ i ] );
729*cdf0e10cSrcweir 					nState = STATE_NON;
730*cdf0e10cSrcweir 				break;
731*cdf0e10cSrcweir 				default:
732*cdf0e10cSrcweir 					pLibName = new char[ strlen( argv[ i ] ) + 1 ];
733*cdf0e10cSrcweir 					strcpy( pLibName, argv[ i ] );
734*cdf0e10cSrcweir 				break;
735*cdf0e10cSrcweir 			}
736*cdf0e10cSrcweir 		}
737*cdf0e10cSrcweir 	}
738*cdf0e10cSrcweir 
739*cdf0e10cSrcweir 	if ( !pLibName ) {
740*cdf0e10cSrcweir 		usage();
741*cdf0e10cSrcweir 	}
742*cdf0e10cSrcweir 
743*cdf0e10cSrcweir 	LibDump *pDump = new LibDump( pLibName, bExportByName );
744*cdf0e10cSrcweir 	pDump->SetBeginExport(nBegin);
745*cdf0e10cSrcweir 	if ( bFilter != 0 )
746*cdf0e10cSrcweir 		pDump->SetFilter( pFilterName );
747*cdf0e10cSrcweir 	if ( pCExport )
748*cdf0e10cSrcweir 		pDump->SetCExport( pCExport );
749*cdf0e10cSrcweir 	else {
750*cdf0e10cSrcweir 		char *pEmpty = "";
751*cdf0e10cSrcweir 		pDump->SetCExport( pEmpty );
752*cdf0e10cSrcweir 	}
753*cdf0e10cSrcweir 	pDump->Dump();
754*cdf0e10cSrcweir 	pDump->PrintDefFile();
755*cdf0e10cSrcweir 	pDump->PrintDataBase();
756*cdf0e10cSrcweir 	delete pDump;
757*cdf0e10cSrcweir 	return 0;
758*cdf0e10cSrcweir }
759