static void StructIO( struct field *fd ) { //============================================ sym_id map; sym_id big_map; unsigned_32 size; while( fd != NULL ) { if( fd->typ == FT_STRUCTURE ) { if( fd->dim_ext != NULL ) { StructIOArrayStruct( (sym_id)fd ); } else { StructIO( fd->xt.record->fl.fields ); } } else if( fd->typ == FT_UNION ) { size = 0; map = fd->xt.sym_record; while( map != NULL ) { // find biggest map if( map->sd.size > size ) { size = map->sd.size; // 91/08/01 DJG big_map = map; } map = map->sd.link; } StructIO( big_map->sd.fl.fields ); } else { StructIOItem( (sym_id)fd ); } fd = &fd->link->fd; } }
void FCInpStruct( void ) { //===================== // Input a structure. IORtnTable = InpRtn; TmpStructPtr = MkTmp( XPop(), TY_POINTER ); StructIO( ((sym_id)GetPtr())->sd.fl.fields ); }
void FCOutStruct( void ) { //===================== // Output a structure. IORtnTable = OutRtn; TmpStructPtr = MkTmp( XPop(), TY_POINTER ); StructIO( ((sym_id)GetPtr())->u.sd.fl.fields ); }
static void DoStructArrayIO( tmp_handle num_elts, struct field *fieldz ) { //============================================================================ // Perform structure array i/o. label_handle label; label = BENewLabel(); CGControl( O_LABEL, NULL, label ); StructIO( fieldz ); CGControl( O_IF_TRUE, CGCompare( O_NE, CGAssign( TmpPtr( num_elts, TY_INT_4 ), CGBinary( O_MINUS, TmpVal( num_elts, TY_INT_4 ), CGInteger( 1, TY_INTEGER ), TY_INT_4 ), TY_INT_4 ), CGInteger( 0, TY_INTEGER ), TY_INT_4 ), label ); BEFiniLabel( label ); }