static intstar4 CheckSubscr( act_eq_entry *eqv_entry ) { //============================================================== // Check that array is properly subscripted. sym_id sym; act_dim_list *dims; int dims_no; intstar4 offset; sym = eqv_entry->name_equived; dims_no = 0; if( sym->ns.flags & SY_SUBSCRIPTED ) { dims = sym->ns.si.va.dim_ext; dims_no = _DimCount( dims->dim_flags ); dims->dim_flags &= ~DIM_PVD; } if( eqv_entry->subs_no == 0 ) { offset = 0; } else if( dims_no != eqv_entry->subs_no ) { if( eqv_entry->subs_no == 1 ) { offset = eqv_entry->subscrs[0] - 1; } else { offset = 0; NameStmtErr( EV_SSCR_INVALID, sym, PR_EQUIV ); } } else if( !DoSubscript( dims, eqv_entry->subscrs, &offset ) ) { offset = 0; NameStmtErr( EV_SSCR_INVALID, sym, PR_EQUIV ); } return( offset * _SymSize( sym ) ); }
static bool Subscript( act_dim_list *dim, intstar4 *offset ) { //================================================================ // Data initialize an array element. int dims_no; intstar4 subscrs[MAX_DIM]; dims_no = 0; while( dims_no < _DimCount( dim->dim_flags ) ) { subscrs[ dims_no ] = DXPop(); GetU16(); // skip typing information dims_no++; } return( DoSubscript( dim, subscrs, offset ) ); }
static intstar4 SubScr( int info, char PGM *adv_ss_ptr, int size ) { //========================================================================== // Get a subscript list. signed_32 ss[MAX_DIM]; act_dim_list dim_list; intstar4 PGM *dim_ptr; signed_32 PGM *ss_ptr; intstar4 lo; intstar4 offset; int num_ss; dim_list.dim_flags = 0; _SetDimCount( dim_list.dim_flags, _GetNMLSubScrs( info ) ); dim_list.num_elts = 1; dim_ptr = &dim_list.subs_1_lo; num_ss = _GetNMLSubScrs( info ); ss_ptr = ss; for(;;) { if( !ScanSNum( ss_ptr ) ) return( FALSE ); ++ss_ptr; lo = *(intstar4 PGM *)adv_ss_ptr; adv_ss_ptr += sizeof( intstar4 ); dim_list.num_elts *= *(uint PGM *)adv_ss_ptr; *dim_ptr = lo; ++dim_ptr; *dim_ptr = lo + *(uint PGM *)adv_ss_ptr - 1; ++dim_ptr; adv_ss_ptr += sizeof( uint ); --num_ss; if( num_ss == 0 ) break; if( !ScanChar( ',' ) ) break; } if( !ScanChar( ')' ) ) return( FALSE ); if( !DoSubscript( &dim_list, ss, &offset ) ) return( FALSE ); NmlInAddr = (char HPGM *)NmlInAddr + offset * size; return( TRUE ); }