1/* vms.h -- Header file for VMS (Alpha and Vax) support.
2   Copyright (C) 1996-2017 Free Software Foundation, Inc.
3
4   Main header file.
5
6   Written by Klaus K"ampf (kkaempf@rmi.de)
7
8   This file is part of BFD, the Binary File Descriptor library.
9
10   This program is free software; you can redistribute it and/or modify
11   it under the terms of the GNU General Public License as published by
12   the Free Software Foundation; either version 3 of the License, or
13   (at your option) any later version.
14
15   This program is distributed in the hope that it will be useful,
16   but WITHOUT ANY WARRANTY; without even the implied warranty of
17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18   GNU General Public License for more details.
19
20   You should have received a copy of the GNU General Public License
21   along with this program; if not, write to the Free Software
22   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
23   MA 02110-1301, USA.  */
24
25#undef vms
26#ifndef VMS_H
27#define VMS_H
28
29#include <time.h>
30
31/* Size of a VMS block on disk.  */
32
33#define VMS_BLOCK_SIZE  512
34
35/* Miscellaneous definitions.  */
36
37#define MAX_OUTREC_SIZE 4096
38#define MIN_OUTREC_LUFT 64
39
40/* File format.  */
41
42enum file_format_enum
43  {
44    /* Not yet known.  */
45    FF_UNKNOWN,
46
47    /* Unix format.  Each record is preceeded by the record length,
48       on 2 bytes.  */
49    FF_FOREIGN,
50
51    /* Native (=VMS) format.  The file only contains the content of the
52       records.  This may also appear on Unix, depending on which tool
53       was used to transfer files.  */
54    FF_NATIVE
55  };
56
57/* VMS records input buffer.  */
58
59struct vms_rec_rd
60{
61  /* Buffer and its size.  */
62  unsigned char *buf;
63  unsigned int buf_size;
64
65  /* Current record and its size.  */
66  unsigned char *rec;
67  unsigned int rec_size;
68
69  /* Input file format.  */
70  enum file_format_enum file_format;
71};
72
73/* VMS records output buffer.  */
74
75struct vms_rec_wr
76{
77  /* Output buffer.  */
78  unsigned char *buf;
79
80  /* Current length of the record.  */
81  unsigned short int size;
82
83  /* Sub-record start offset.  */
84  unsigned short int subrec_offset;
85
86  /* Some records must have a size that is a multiple of the alignment.
87     Mustn't be 0.  */
88  unsigned short int align;
89};
90
91struct evax_private_udata_struct
92{
93  asymbol *bsym;
94  asymbol *enbsym;
95  char *origname;
96  int lkindex;
97};
98
99/* vms-misc.c.  */
100
101#define VMS_DEBUG 1
102
103#if VMS_DEBUG
104extern void _bfd_vms_debug (int, char *, ...) ATTRIBUTE_PRINTF_2;
105extern void _bfd_hexdump   (int, unsigned char *, int, int);
106
107#define vms_debug _bfd_vms_debug
108#define vms_debug2(X) _bfd_vms_debug X
109#else
110#define vms_debug2(X)
111#endif
112
113extern char * vms_get_module_name (const char *, bfd_boolean);
114extern unsigned char *get_vms_time_string (void);
115extern time_t vms_time_to_time_t (unsigned int hi, unsigned int lo);
116extern time_t vms_rawtime_to_time_t (unsigned char *);
117extern void vms_time_t_to_vms_time (time_t ut, unsigned int *hi, unsigned int *lo);
118extern void vms_get_time (unsigned int *hi, unsigned int *lo);
119extern void vms_raw_get_time (unsigned char *buf);
120
121extern char * _bfd_vms_save_sized_string (unsigned char *, int);
122extern char * _bfd_vms_save_counted_string (unsigned char *);
123extern void   _bfd_vms_output_begin (struct vms_rec_wr *, int);
124extern void   _bfd_vms_output_alignment (struct vms_rec_wr *, int);
125extern void   _bfd_vms_output_begin_subrec (struct vms_rec_wr *, int);
126extern void   _bfd_vms_output_end_subrec (struct vms_rec_wr *);
127extern void   _bfd_vms_output_end (bfd *, struct vms_rec_wr *);
128extern int    _bfd_vms_output_check (struct vms_rec_wr *, int);
129extern void   _bfd_vms_output_byte (struct vms_rec_wr *, unsigned);
130extern void   _bfd_vms_output_short (struct vms_rec_wr *, unsigned);
131extern void   _bfd_vms_output_long (struct vms_rec_wr *, unsigned long);
132extern void   _bfd_vms_output_quad (struct vms_rec_wr *, bfd_vma);
133extern void   _bfd_vms_output_counted (struct vms_rec_wr *, const char *);
134extern void   _bfd_vms_output_dump (struct vms_rec_wr *, const unsigned char *, int);
135extern void   _bfd_vms_output_fill (struct vms_rec_wr *, int, int);
136extern int    _bfd_vms_convert_to_var_unix_filename (const char *);
137
138/* vms-alpha.c  */
139
140extern void bfd_vms_set_section_flags (bfd *, asection *, flagword, flagword);
141
142#endif /* VMS_H */
143