size_t DIPIMPENTRY( CueFile )( imp_image_handle *ii, imp_cue_handle *ic, char *buff, size_t buff_size ) /************************************************************************/ { char *name; file_walk_name wlk; size_t len; drmem_hdl stmts; drmem_hdl cu_tag; int i; mod_info *modinfo; DRSetDebug( ii->dwarf->handle ); /* must do at each call into dwarf */ modinfo = IMH2MODI( ii, ic->im ); stmts = modinfo->stmts; cu_tag = modinfo->cu_tag; if( stmts == DRMEM_HDL_NULL || cu_tag == DRMEM_HDL_NULL ) { DCStatus( DS_FAIL ); return( 0 ); } wlk.index = ic->fno; wlk.ret = NULL; wlk.num_dirs = 0; wlk.dirs = NULL; DRWalkLFiles( stmts, ACueFile, &wlk, ACueDir, &wlk ); name = wlk.ret; // Free directory and file table information for( i = 0; i < wlk.num_dirs; i++ ) { DCFree( wlk.dirs[i].name ); } DCFree( wlk.dirs ); if( name == NULL ) { DCStatus( DS_FAIL ); return( 0 ); } // If compilation unit has a DW_AT_comp_dir attribute, we need to // stuff that in front of the file pathname, unless that is absolute len = DRGetCompDirBuff( cu_tag, buff, buff_size ); if( ( len > 1 ) && IsRelPathname( name ) ) { // Ignore empty comp dirs len = NameCopy( buff, "/", buff_size, len ); } else { len = 0; } len = NameCopy( buff, name, buff_size, len ); DCFree( name ); return( len ); }
unsigned DIPENTRY DIPImpCueFile( imp_image_handle *ii, imp_cue_handle *ic, char *buff, unsigned max ) /********************************************************************/ { char *name; char *dir_path; file_walk_name wlk; unsigned len; unsigned dir_len; im_idx imx; dr_handle stmts; dr_handle cu_handle; int i; imx = ic->imx; DRSetDebug( ii->dwarf->handle ); /* must do at each call into dwarf */ stmts = ii->mod_map[imx].stmts; if( stmts == 0 ) { DCStatus( DS_FAIL ); return( 0 ); } cu_handle = ii->mod_map[imx].cu_tag; if( cu_handle == 0 ) { DCStatus( DS_FAIL ); return( 0 ); } wlk.index = ic->fno; wlk.ret = NULL; wlk.num_dirs = 0; wlk.dirs = NULL; DRWalkLFiles( stmts, ACueFile, &wlk, ACueDir, &wlk ); name = wlk.ret; // Free directory and file table information for( i = 0; i < wlk.num_dirs; i++) DCFree(wlk.dirs[i].name); DCFree(wlk.dirs); if( name == NULL ) { DCStatus( DS_FAIL ); return( 0 ); } // If compilation unit has a DW_AT_comp_dir attribute, we need to // stuff that in front of the file pathname, unless that is absolute dir_len = DRGetCompDirBuff( cu_handle, NULL, 0 ); if( (dir_len > 1) && IsRelPathname( name ) ) { // Ignore empty comp dirs if( max == 0 ) { len = NameCopy( buff, name, max ) + dir_len; } else { dir_path = DCAlloc( dir_len ); if( dir_path == NULL ) { DCStatus( DS_FAIL ); return( 0 ); } DRGetCompDirBuff( cu_handle, dir_path, dir_len ); len = NameCopy( buff, dir_path, max ); DCFree( dir_path ); if( max > len + 1 ) { len += NameCopy( buff + len, "/", 1 + 1 ); len += NameCopy( buff + len, name, max - len ); } } } else { len = NameCopy( buff, name, max ); } DCFree( name ); return( len ); }