/*****************************************************************************/ /** Microsoft LAN Manager **/ /** Copyright(c) Microsoft Corp., 1987-1999 **/ /*****************************************************************************/ /***************************************************************************** File : miscnode.cxx Title : miscellaneous typenode handler History : 08-Aug-1991 VibhasC Created *****************************************************************************/ #pragma warning ( disable : 4514 ) /**************************************************************************** includes ****************************************************************************/ #include "nulldefs.h" extern "C" { #include #include #include } #include "allnodes.hxx" #include "gramutil.hxx" #include "cmdana.hxx" #include "control.hxx" #include "filehndl.hxx" #include "lextable.hxx" extern BOOL IsTempName( char * ); /**************************************************************************** extern data ****************************************************************************/ extern SymTable * pBaseSymTbl; extern CCONTROL * pCompiler; extern PASS_1 * pPass1; extern node_error * pErrorTypeNode; extern short ImportLevel; extern CMD_ARG * pCommand; extern NFA_INFO * pImportCntrl; extern IINFODICT * pInterfaceInfoDict; extern LexTable * pMidlLexTable; /**************************************************************************** local defines ****************************************************************************/ /****************************************************************************/ /**************************************************************************** node_interface procedures ****************************************************************************/ node_interface::node_interface( NODE_T Kind ) : named_node( Kind ) { ProcCount = 0; CallBackProcCount = 0; pBaseIntf = NULL; pDefiningFile = NULL; OptimFlags = OPTIMIZE_NONE; OptimLevel = OPT_LEVEL_OS; fIAmIUnknown = 0; fPickle = 0; fHasProcsWithRpcSs = 0; fSemAnalyzed = 0; fPrintedDef = 0; fPrintedIID = 0; pMyCG = NULL; pMyTlbCG = NULL; pProcTbl = NULL; fHasOLEAutomation = 0; fIsAsyncClone = 0; pAsyncInterface = 0; if ( pCommand->IsSwitchDefined( SWITCH_MS_CONF_STRUCT ) ) { fHasMSConfStructAttr = TRUE; } else { fHasMSConfStructAttr = FALSE; } } void node_interface::GetVersionDetails( unsigned short * Maj, unsigned short * Min ) { node_version * pAttr; pAttr = (node_version *) GetAttribute( ATTR_VERSION ); if (pAttr) { pAttr->GetVersion( Maj, Min ); } else { *Maj = 0; *Min = 0; }; }; node_interface * node_interface::GetMyBaseInterface() { node_interface *pRealBaseInterface = 0; node_interface_reference *pRef; //Get the real base interface node, skipping over the //node_forward and the node_interface_reference. if(pBaseIntf) { //if necessary, skip over forward reference node if(pBaseIntf->NodeKind() == NODE_FORWARD) pRef = (node_interface_reference *)pBaseIntf->GetChild(); else pRef = (node_interface_reference *)pBaseIntf; //skip over the interface reference node. if(pRef) pRealBaseInterface = pRef->GetRealInterface(); } return pRealBaseInterface; } /**************************************************************************** node_file procedures ****************************************************************************/ node_file::node_file( char * pInputName, short ImpLevel ) : named_node( NODE_FILE, pInputName ) { fHasComClasses = FALSE; /** ** save our file name and import level **/ ImportLevel = ImpLevel; pActualFileName = new char[ strlen( pInputName ) + 1 ]; strcpy( pActualFileName, pInputName ); /** ** if the pass is the acf pass, then just set the symbol name to ** be the input name, else munge it. **/ if( pCompiler->GetPassNumber() == IDL_PASS ) { fAcfInclude = FALSE; SetFileName( pInputName ); } else { fAcfInclude = TRUE; SetSymName( pInputName ); } fIsXXXBaseIdl = FALSE; } void node_file::SetFileName( char * pFullName ) { char pDrive[ _MAX_DRIVE ], pPath[ _MAX_PATH ], pName[ _MAX_FNAME ], pExt[ _MAX_EXT ]; short lenDrive, lenPath, lenName, lenExt; char * pNewName; CMD_ARG * pCmd = pCompiler->GetCommandProcessor(); _splitpath( pFullName, pDrive, pPath, pName, pExt ); if( (GetImportLevel() != 0 ) || !pCmd->IsSwitchDefined( SWITCH_HEADER ) ) { strcpy( pExt, ".h" ); } else { pCmd->GetHeaderFileNameComponents( pDrive,pPath,pName,pExt); } lenDrive= (short) strlen( pDrive ); lenPath = (short) strlen( pPath ); lenName = (short) strlen( pName ); lenExt = (short) strlen( pExt ); pNewName = new char [ lenDrive + lenPath + lenName + lenExt + 1 ]; strcpy( pNewName, pDrive ); strcat( pNewName, pPath ); strcat( pNewName, pName ); strcat( pNewName, pExt ); SetSymName( pNewName ); // insert the original name into the symbol table to be able to // access the filename later and get at the aux thru the symbol table SymKey SKey( pFullName, NAME_FILE ); pBaseSymTbl->SymInsert( SKey, (SymTable *)NULL, (named_node *)this ); } BOOL node_file::AcfExists() { char agBuf[ _MAX_DRIVE + _MAX_PATH + _MAX_FNAME + _MAX_EXT + 1]; FILE * hFile; AcfName( agBuf ); if ( agBuf[0] && ( hFile = fopen( agBuf, "r") ) != 0 ) { fclose( hFile ); return (BOOL)1; } return (BOOL)0; } void node_file::AcfName( char * pBuf ) { char agDrive[ _MAX_DRIVE ] , agPath[ _MAX_PATH ], agName[ _MAX_FNAME ], agExt[ _MAX_EXT ]; char agLast[ _MAX_PATH]; char * pPath; BOOL fUserSpecifiedAcf; char * pTemp; // if this is the base idl file, then it can potentially have // an acf called differently. The imported file will have its acf // only derived from the idl files name. fUserSpecifiedAcf = ( ( GetImportLevel() == 0 ) && pCommand->IsSwitchDefined( SWITCH_ACF ) ); if( fUserSpecifiedAcf ) pTemp = pCommand->GetAcfFileName(); else pTemp = pActualFileName; strcpy( agLast, pTemp ); // // we need to figure out the complete file name of the file we are searching // for. // If the user specified a file // { // if it did not have a path component // then we need to search in the path list that we derive from his // -I and include env vsriable specification. // else // (if he did have a path ) // we pick that file up from this path. // } // else // (the user did not specify a file ) // { // we derive the file name from he idl file name and add a .acf to it. // } _splitpath( agLast, agDrive, agPath, agName, agExt ); if( fUserSpecifiedAcf ) { if( (agDrive[0] == '\0') && (agPath[0] == '\0') ) { // no path was specified, pPath = (char *)0; } else { // agLast has the whole thing... pPath = ""; } } else { // he did not specify an acf switch, so derive the filename and // the path. The basename is available, the extension in this case // is .acf pPath = (char *)0; strcpy( agExt, ".acf" ); } if( ! pPath ) { strcpy( agLast, agName ); strcat( agLast, agExt ); pPath = pImportCntrl->SearchForFile( agLast ); } // // now we know all components of the full file name. Go ahead and // reconstruct the file name. // sprintf(pBuf, "%s%s", pPath, agLast); //_makepath( pBuf, agDrive, pPath, agName, agExt ); } /**************************************************************************** node_e_status_t procedures ****************************************************************************/ node_e_status_t::node_e_status_t() : named_node( NODE_E_STATUS_T, (char *) NULL ) { node_skl * pC; char * pName; GetBaseTypeNode( &pC, SIGN_UNSIGNED, SIZE_LONG, TYPE_INT ); // force name into lexeme table pName = pMidlLexTable->LexInsert("error_status_t"); SetSymName( pName ); SetChild( pC); } /**************************************************************************** node_wchar_t procedures ****************************************************************************/ node_wchar_t::node_wchar_t() : named_node( NODE_WCHAR_T, (char *) NULL ) { node_skl * pC; char * pName; GetBaseTypeNode( &pC, SIGN_UNSIGNED, SIZE_SHORT, TYPE_INT ); pName = pMidlLexTable->LexInsert("wchar_t"); SetSymName( pName ); SetChild( pC); } void node_forward::GetSymDetails( NAME_T * pTag, char ** ppName ) { *pTag = SKey.GetKind(); *ppName = SKey.GetString(); }