static void writeAuxInfo( AUX_INFO *info, unsigned index ) { hw_reg_set *regs; hw_reg_set *save_parms; char *save_objname; unsigned len; info->index = index; save_parms = info->parms; save_objname = info->objname; if( save_parms != NULL ) { len = 0; regs = save_parms; for(;;) { len += sizeof( hw_reg_set ); if( HW_CEqual( *regs, HW_EMPTY ) ) break; ++regs; } info->parms = PCHSetUInt( len ); } if( save_objname != NULL ) { info->objname = PCHSetUInt( strlen( save_objname ) + 1 ); } PCHWriteVar( *info ); AsmSysPCHWriteCode( info ); if( save_parms != NULL ) { PCHWrite( save_parms, PCHGetUInt( info->parms ) ); } if( save_objname != NULL ) { PCHWrite( save_objname, PCHGetUInt( info->objname ) ); } info->parms = save_parms; info->objname = save_objname; }
pch_status PCHReadRTFNames( void ) { NAME *name; for( name = runTimeCodeName; name < &runTimeCodeName[ RTF_LAST ]; ++name ) { *name = NameMapIndex( PCHSetUInt( PCHReadUInt() ) ); } return( PCHCB_OK ); }
NAME NameGetIndex( NAME name ) /****************************/ { idname **found; idname *pname; if( name == NULL ) { return( PCHSetUInt( PCH_NULL_INDEX ) ); } pname = NAME_PTR( name ); found = bsearch( &pname, nameTranslateTable, nameCount, sizeof( idname * ), cmpFindName ); if( found == NULL ) { #ifndef NDEBUG CFatal( "invalid name passed to NameGetIndex" ); #endif return( PCHSetUInt( PCH_ERROR_INDEX ) ); } return( PCHSetUInt( ( found - nameTranslateTable ) + PCH_FIRST_INDEX ) ); }
AUX_INFO *PragmaGetIndex( AUX_INFO *i ) { if( i == NULL ) { return( (AUX_INFO *)PCH_NULL_INDEX ); } #ifndef NDEBUG if( i->index < PCH_FIRST_INDEX ) { CFatal( "aux info not assigned an index" ); } #endif return( PCHSetUInt( i->index ) ); }
pch_status PCHReadPragmas( void ) { unsigned size; unsigned max_index; unsigned entry_len; unsigned index; AUX_ENTRY *e; AUX_ENTRY *f; AUX_ENTRY *next_f; AUX_INFO *info; for( f = AuxList; f != NULL; f = next_f ) { next_f = f->next; freeAuxInfo( f->info ); CMemFree( f->info ); CMemFree( f ); } max_index = PCHReadUInt(); size = max_index * sizeof( AUX_INFO * ); infoTranslate = CMemAlloc( size ); memset( infoTranslate, 0, size ); // read all aux_info for( index = PCH_FIRST_INDEX; index < max_index; ++index ) { if( index < PCH_FIRST_USER_INDEX ) { info = BuiltinAuxInfo + index - PCH_FIRST_INDEX; } else { info = CMemAlloc( sizeof( AUX_INFO ) ); } infoTranslate[index] = info; readAuxInfo( info ); } // read aux entries AuxList = NULL; for( ; (entry_len = PCHReadUInt()) != 0; ) { e = CMemAlloc( offsetof( AUX_ENTRY, name ) + entry_len + 1 ); PCHRead( e->name, entry_len + 1 ); e->info = PragmaMapIndex( PCHSetUInt( PCHReadUInt() ) ); e->next = AuxList; AuxList = e; } return( PCHCB_OK ); }