/* deffile.h - header for .DEF file parser
   Copyright (C) 1998-2016 Free Software Foundation, Inc.
   Written by DJ Delorie dj@cygnus.com

   This file is part of the GNU Binutils.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   The program 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 a copy of the GNU General Public License
   along with GLD; see the file COPYING.  If not, write to the Free
   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
   02110-1301, USA.  */

#ifndef DEFFILE_H
#define DEFFILE_H

/* DEF storage definitions.  Note that any ordinal may be zero, and
   any pointer may be NULL, if not defined by the DEF file.  */

typedef struct def_file_section {
  char *name;			/* always set */
  char *class;			/* may be NULL */
  char flag_read, flag_write, flag_execute, flag_shared;
} def_file_section;

typedef struct def_file_export {
  char *name;			/* always set */
  char *internal_name;		/* always set, may == name */
  char *its_name;		/* optional export table name refered to. */
  int ordinal;			/* -1 if not specified */
  int hint;
  char flag_private, flag_constant, flag_noname, flag_data, flag_forward;
} def_file_export;

typedef struct def_file_module {
  struct def_file_module *next;
  void *user_data;
  char name[1];			/* extended via malloc */
} def_file_module;

typedef struct def_file_import {
  char *internal_name;		/* always set */
  def_file_module *module;	/* always set */
  char *name;			/* may be NULL; either this or ordinal will be set */
  char *its_name;		/* optional import table name refered to. */
  int ordinal;			/* may be -1 */
  int data;			/* = 1 if data */
} def_file_import;

typedef struct def_file_aligncomm {
  struct def_file_aligncomm *next;	/* Chain pointer.  */
  char *symbol_name;		/* Name of common symbol.  */
  unsigned int alignment;	/* log-2 alignment.        */
} def_file_aligncomm;

typedef struct def_file {
  /* From the NAME or LIBRARY command.  */
  char *name;
  int is_dll;			/* -1 if NAME/LIBRARY not given */
  bfd_vma base_address;		/* (bfd_vma)(-1) if unspecified */

  /* From the DESCRIPTION command.  */
  char *description;

  /* From the STACK/HEAP command, -1 if unspecified.  */
  int stack_reserve, stack_commit;
  int heap_reserve, heap_commit;

  /* From the SECTION/SEGMENT commands.  */
  int num_section_defs;
  def_file_section *section_defs;

  /* From the EXPORTS commands.  */
  int num_exports;
  def_file_export *exports;

  /* Used by imports for module names.  */
  def_file_module *modules;

  /* From the IMPORTS commands.  */
  int num_imports;
  def_file_import *imports;

  /* From the VERSION command, -1 if not specified.  */
  int version_major, version_minor;

  /* Only expected from .drectve sections, not .DEF files.  */
  def_file_aligncomm *aligncomms;

} def_file;

extern def_file *def_file_empty (void);

/* The second arg may be NULL.  If not, this .def is appended to it.  */
extern def_file *def_file_parse (const char *, def_file *);
extern void def_file_free (def_file *);
extern def_file_export *def_file_add_export (def_file *, const char *,
					     const char *, int,
					     const char *, int *);
extern def_file_import *def_file_add_import (def_file *, const char *,
					     const char *, int, const char *,
					     const char *, int *);
extern void def_file_add_directive (def_file *, const char *, int);
extern def_file_module *def_get_module (def_file *, const char *);
#ifdef DEF_FILE_PRINT
extern void def_file_print (FILE *, def_file *);
#endif

#endif /* DEFFILE_H */
