/* 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/>.  */

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#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;
}
