static size_t GetNameBuffAttr( drmem_hdl entry, char *buff, size_t length, dw_atnum attrib ) /******************************************************************************************/ { drmem_hdl abbrev; dw_formnum form; abbrev = DWRSkipTag( &entry ) + 1; if( DWRScanForAttrib( &abbrev, &entry, attrib ) ) { form = DWRVMReadULEB128( &abbrev ); switch( form ) { case DW_FORM_string: length = DWRVMGetStrBuff( entry, buff, length ); break; case DW_FORM_strp: { unsigned_32 offset; drmem_hdl dbgsec_str; offset = ReadConst( DW_FORM_data4, entry ); dbgsec_str = DWRCurrNode->sections[DR_DEBUG_STR].base + offset; length = DWRVMGetStrBuff( dbgsec_str, buff, length ); } break; default: DWREXCEPT( DREXCEP_BAD_DBG_INFO ); length = 0; } } else { length = 0; } return( length ); }
bool DRConstValAT( dr_handle var, uint_32 *ret ) /**********************************************/ { dr_handle abbrev; unsigned form; uint_32 val; dwr_formcl formcl; abbrev = DWRGetAbbrev( &var ); if( DWRScanForAttrib( &abbrev, &var, DW_AT_const_value ) ) { form = DWRVMReadULEB128( &abbrev ); for( ;; ) { formcl = DWRFormClass( form ); switch( formcl ) { case DWR_FORMCL_indirect: form = DWRVMReadULEB128( &var ); break; case DWR_FORMCL_data: val = ReadConst( form, var ); *ret = val; goto found; default: goto not_found; } } } not_found: return( FALSE ); found: return( TRUE ); }
static int DWRGetAT( dr_handle abbrev, dr_handle info, dr_val32 *vals, uint_16 const *at ) /********************************************************/ /* look for a specific attribute in the list of attributes */ /* if found read in */ { unsigned attrib; unsigned form; uint_16 index; dwr_formcl formcl; uint_32 value; int count; int max; count = 0; for( index = 0; at[index] != 0; ++index ) { vals[index].val_class = DR_VAL_NOT; } max = index; for( ;; ) { attrib = DWRVMReadULEB128( &abbrev ); if( attrib == 0 ) break; form = DWRVMReadULEB128( &abbrev ); for( index = 0; index < max; ++index ) { if( attrib == at[index] ) { ++count; if( form == DW_FORM_indirect ) { form = DWRVMReadULEB128( &info ); } formcl = DWRFormClass( form ); value = ReadConst( form, info ); if( formcl == DWR_FORMCL_data ) { vals[index].val_class = DR_VAL_INT; vals[index].val.s = value; } else { value += DWRFindCompileUnit( info ); vals[index].val_class = DR_VAL_REF; vals[index].val.ref = value; } } } DWRSkipForm( &info, form ); } return( count ); }
CFSVar CJSONReader::ReadVal(const CFSAString &szKeyPath) { OnValReadStart(szKeyPath); CFSVar Data; if (m_cCh=='[') { Data.Cast(CFSVar::VAR_ARRAY); GetChar(true); INTPTR ipPos=0; for (;;) { if (m_cCh==0) { throw CJSONException(FSTSTR("Unexpetcted EOF")); } else if (m_cCh==']') { GetChar(true); break; } else if (ipPos>0) { if (m_cCh==',') { GetChar(true); } else { throw CJSONException(FSTSTR("Missing ',' in array")); } } CFSAString szKey; szKey.Format("%zd", ipPos); CFSVar Data1=ReadVal(szKeyPath+"/"+szKey); if (m_iCollectData>0) { Data[ipPos]=Data1; } ipPos++; } } else if (m_cCh=='{') { Data.Cast(CFSVar::VAR_MAP); GetChar(true); INTPTR ipPos=0; for (;;) { if (m_cCh==0) { throw CJSONException(FSTSTR("Unexpetcted EOF")); } else if (m_cCh=='}') { GetChar(true); break; } else if (ipPos>0) { if (m_cCh==',') { GetChar(true); } else { throw CJSONException(FSTSTR("Missing ',' in map")); } } CFSAString szKey; if (m_cCh=='\"' || m_cCh=='\'') { szKey=ReadString(); } else if (FSIsLetter(m_cCh)) { szKey=ReadText(); } else { throw CJSONException(FSTSTR("Expected key")); } if (m_cCh==':') { GetChar(true); } else { throw CJSONException(FSTSTR("Expected ':'")); } CFSVar Data1=ReadVal(szKeyPath+"/"+szKey); if (m_iCollectData>0) { Data[szKey]=Data1; } ipPos++; } } else if (m_cCh=='\"' || m_cCh=='\'') { Data=ReadString(); } else if ((m_cCh>='0' && m_cCh<='9') || FSStrChr("-+.", m_cCh)) { Data=ReadNumber(); } else if (FSIsLetter(m_cCh)) { Data=ReadConst(); } else if (!m_cCh) { } else { throw CJSONException(FSTSTR("Unknown value type")); } OnValReadEnd(szKeyPath, Data); return Data; }