/* vms.h -- Header file for VMS (Alpha and Vax) support.
   Copyright (C) 1996-2016 Free Software Foundation, Inc.

   Main header file.

   Written by Klaus K"ampf (kkaempf@rmi.de)

   This file is part of BFD, the Binary File Descriptor library.

   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 of the License, or
   (at your option) any later version.

   This 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 this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#undef vms
#ifndef VMS_H
#define VMS_H

#include <time.h>

/* Size of a VMS block on disk.  */

#define VMS_BLOCK_SIZE  512

/* Miscellaneous definitions.  */

#define MAX_OUTREC_SIZE 4096
#define MIN_OUTREC_LUFT 64

/* File format.  */

enum file_format_enum
  {
    /* Not yet known.  */
    FF_UNKNOWN,

    /* Unix format.  Each record is preceeded by the record length,
       on 2 bytes.  */
    FF_FOREIGN,

    /* Native (=VMS) format.  The file only contains the content of the
       records.  This may also appear on Unix, depending on which tool
       was used to transfer files.  */
    FF_NATIVE
  };

/* VMS records input buffer.  */

struct vms_rec_rd
{
  /* Buffer and its size.  */
  unsigned char *buf;
  unsigned int buf_size;

  /* Current record and its size.  */
  unsigned char *rec;
  unsigned int rec_size;

  /* Input file format.  */
  enum file_format_enum file_format;
};

/* VMS records output buffer.  */

struct vms_rec_wr
{
  /* Output buffer.  */
  unsigned char *buf;

  /* Current length of the record.  */
  unsigned short int size;

  /* Sub-record start offset.  */
  unsigned short int subrec_offset;

  /* Some records must have a size that is a multiple of the alignment.
     Mustn't be 0.  */
  unsigned short int align;
};

struct evax_private_udata_struct
{
  asymbol *bsym;
  asymbol *enbsym;
  char *origname;
  int lkindex;
};

/* vms-misc.c.  */

#define VMS_DEBUG 1

#if VMS_DEBUG
extern void _bfd_vms_debug (int, char *, ...) ATTRIBUTE_PRINTF_2;
extern void _bfd_hexdump   (int, unsigned char *, int, int);

#define vms_debug _bfd_vms_debug
#define vms_debug2(X) _bfd_vms_debug X
#else
#define vms_debug2(X)
#endif

extern char * vms_get_module_name (const char *, bfd_boolean);
extern unsigned char *get_vms_time_string (void);
extern time_t vms_time_to_time_t (unsigned int hi, unsigned int lo);
extern time_t vms_rawtime_to_time_t (unsigned char *);
extern void vms_time_t_to_vms_time (time_t ut, unsigned int *hi, unsigned int *lo);
extern void vms_get_time (unsigned int *hi, unsigned int *lo);
extern void vms_raw_get_time (unsigned char *buf);

extern char * _bfd_vms_save_sized_string (unsigned char *, int);
extern char * _bfd_vms_save_counted_string (unsigned char *);
extern void   _bfd_vms_output_begin (struct vms_rec_wr *, int);
extern void   _bfd_vms_output_alignment (struct vms_rec_wr *, int);
extern void   _bfd_vms_output_begin_subrec (struct vms_rec_wr *, int);
extern void   _bfd_vms_output_end_subrec (struct vms_rec_wr *);
extern void   _bfd_vms_output_end (bfd *, struct vms_rec_wr *);
extern int    _bfd_vms_output_check (struct vms_rec_wr *, int);
extern void   _bfd_vms_output_byte (struct vms_rec_wr *, unsigned);
extern void   _bfd_vms_output_short (struct vms_rec_wr *, unsigned);
extern void   _bfd_vms_output_long (struct vms_rec_wr *, unsigned long);
extern void   _bfd_vms_output_quad (struct vms_rec_wr *, bfd_vma);
extern void   _bfd_vms_output_counted (struct vms_rec_wr *, const char *);
extern void   _bfd_vms_output_dump (struct vms_rec_wr *, const unsigned char *, int);
extern void   _bfd_vms_output_fill (struct vms_rec_wr *, int, int);
extern int    _bfd_vms_convert_to_var_unix_filename (const char *);

/* vms-alpha.c  */

extern void bfd_vms_set_section_flags (bfd *, asection *, flagword, flagword);

#endif /* VMS_H */
