/* Get information from a source line record returned by libdwfl.
   Copyright (C) 2005-2010, 2015 Red Hat, Inc.
   This file is part of elfutils.

   This file is free software; you can redistribute it and/or modify
   it under the terms of either

     * the GNU Lesser General Public License as published by the Free
       Software Foundation; either version 3 of the License, or (at
       your option) any later version

   or

     * the GNU General Public License as published by the Free
       Software Foundation; either version 2 of the License, or (at
       your option) any later version

   or both in parallel, as here.

   elfutils is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received copies of the GNU General Public License and
   the GNU Lesser General Public License along with this program.  If
   not, see <http://www.gnu.org/licenses/>.  */

#include "libdwflP.h"
#include "../libdw/libdwP.h"

const char *
dwfl_lineinfo (Dwfl_Line *line, Dwarf_Addr *addr, int *linep, int *colp,
	       Dwarf_Word *mtime, Dwarf_Word *length)
{
  if (line == NULL)
    return NULL;

  struct dwfl_cu *cu = dwfl_linecu (line);
  const Dwarf_Line *info = &cu->die.cu->lines->info[line->idx];

  if (addr != NULL)
    *addr = dwfl_adjusted_dwarf_addr (cu->mod, info->addr);
  if (linep != NULL)
    *linep = info->line;
  if (colp != NULL)
    *colp = info->column;

  if (unlikely (info->file >= info->files->nfiles))
    {
      __libdwfl_seterrno (DWFL_E (LIBDW, DWARF_E_INVALID_DWARF));
      return NULL;
    }

  struct Dwarf_Fileinfo_s *file = &info->files->info[info->file];
  if (mtime != NULL)
    *mtime = file->mtime;
  if (length != NULL)
    *length = file->length;
  return file->name;
}
