You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
4.4 KiB
172 lines
4.4 KiB
/*****************************************************************************/
|
|
/** Microsoft LAN Manager **/
|
|
/** Copyright(c) Microsoft Corp., 1987-1999 **/
|
|
/*****************************************************************************/
|
|
/*****************************************************************************
|
|
File : pass2.cxx
|
|
Title : pass2 controller
|
|
History :
|
|
24-Aug-1991 VibhasC Created
|
|
|
|
*****************************************************************************/
|
|
|
|
#if 0
|
|
Notes
|
|
-----
|
|
This file provides the interface for the acf semantics pass. It also
|
|
initializes the pass2 controller object.
|
|
|
|
#endif // 0
|
|
|
|
#pragma warning ( disable : 4514 )
|
|
|
|
/****************************************************************************
|
|
includes
|
|
****************************************************************************/
|
|
|
|
#include "nulldefs.h"
|
|
extern "C" {
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <malloc.h>
|
|
extern int yyacfparse();
|
|
}
|
|
|
|
#include "allnodes.hxx"
|
|
#include "control.hxx"
|
|
#include "cmdana.hxx"
|
|
#include "filehndl.hxx"
|
|
#include "idict.hxx"
|
|
|
|
/****************************************************************************
|
|
local definitions
|
|
****************************************************************************/
|
|
|
|
#define ACF_ATTR_COUNT (ACF_ATTR_END - ACF_ATTR_START)
|
|
#define ACF_ATTR_MAX (ACF_ATTR_COUNT - 1)
|
|
|
|
/****************************************************************************
|
|
extern procedures
|
|
****************************************************************************/
|
|
|
|
extern void initlex();
|
|
extern void ParseError( STATUS_T, char * );
|
|
|
|
/****************************************************************************
|
|
extern data
|
|
****************************************************************************/
|
|
|
|
extern class ccontrol * pCompiler;
|
|
extern node_source * pSourceNode;
|
|
extern NFA_INFO * pImportCntrl;
|
|
extern CMD_ARG * pCommand;
|
|
|
|
/****************************************************************************
|
|
local data
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************/
|
|
|
|
|
|
_pass2::_pass2()
|
|
{
|
|
pCompiler->SetPassNumber( ACF_PASS );
|
|
}
|
|
|
|
STATUS_T
|
|
_pass2::Go()
|
|
{
|
|
MEM_ITER MemIter( pSourceNode );
|
|
node_file * pFNode;
|
|
node_file * pBaseFileNode = 0;
|
|
char Buffer[_MAX_DRIVE+_MAX_PATH+_MAX_FNAME+_MAX_EXT+1];
|
|
STATUS_T Status = STATUS_OK;
|
|
|
|
/**
|
|
** create a new import controller for the acf and
|
|
** set the defaults needed
|
|
**/
|
|
|
|
pImportCntrl = pCompiler->SetImportController( new NFA_INFO );
|
|
pImportCntrl->Init();
|
|
|
|
/**
|
|
** for each idl file, check if the corresponding acf exists.
|
|
** if yes, process it.
|
|
**/
|
|
|
|
|
|
while ( ( pFNode = (node_file *) MemIter.GetNext() ) != 0 )
|
|
{
|
|
pFileNode = pFNode;
|
|
if(pFNode->GetImportLevel() == 0)
|
|
pBaseFileNode = pFNode;
|
|
|
|
if( pFNode->AcfExists() )
|
|
{
|
|
pFNode->AcfName( Buffer );
|
|
|
|
if( !pImportCntrl->IsDuplicateInput( Buffer ) )
|
|
{
|
|
Status = pImportCntrl->SetNewInputFile( Buffer );
|
|
char * pCopy = new char[ strlen( Buffer) + 1];
|
|
strcpy( pCopy, Buffer );
|
|
AddFileToDB( pCopy );
|
|
|
|
if( Status != STATUS_OK)
|
|
break;
|
|
|
|
pImportCntrl->ResetEOIFlag();
|
|
|
|
initlex();
|
|
|
|
|
|
if( yyacfparse() || pCompiler->GetErrorCount() )
|
|
{
|
|
Status = SYNTAX_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else if(pFNode->GetImportLevel() == 0)
|
|
{
|
|
|
|
// he could not find the acf file. If the user did specify
|
|
// an acf switch then we must error out if we do not find
|
|
// the acf.
|
|
|
|
if( pCommand->IsSwitchDefined( SWITCH_ACF ) )
|
|
{
|
|
RpcError((char *)NULL,
|
|
0,
|
|
(Status = INPUT_OPEN) ,
|
|
pCommand->GetAcfFileName());
|
|
break;
|
|
}
|
|
}
|
|
|
|
// clean up
|
|
pImportCntrl->EndOperations();
|
|
|
|
} // end of outer while loop
|
|
|
|
if( (Status == STATUS_OK) )
|
|
{
|
|
/**
|
|
** The acf pass may have created include file nodes They must translate
|
|
** into include statements in the generated stubs. We handle that by
|
|
** merging the include file list with the members of the source node.
|
|
**/
|
|
|
|
pSourceNode->MergeMembersToHead( AcfIncludeList );
|
|
|
|
}
|
|
else
|
|
{
|
|
ParseError( ERRORS_PASS1_NO_PASS2, (char *)0 );
|
|
}
|
|
|
|
delete pImportCntrl;
|
|
return Status;
|
|
}
|