/* Alpha VMS external format of Libraries.

   Copyright (C) 2010-2021 Free Software Foundation, Inc.
   Written by Tristan Gingold <gingold@adacore.com>, AdaCore.

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

#ifndef _VMS_LBR_H
#define _VMS_LBR_H

/* Libray HeaDer.  */

/* Magic numbers.  Should match the major version.  */

#define LHD_SANEID_DCX 319232342
#define LHD_SANEID3 233579905
#define LHD_SANEID6 233579911

/* Library type.  */
#define LBR__C_TYP_UNK    0	/* Unknown / unspecified.  */
#define LBR__C_TYP_OBJ    1	/* Vax object.  */
#define LBR__C_TYP_MLB    2	/* Macro.  */
#define LBR__C_TYP_HLP    3	/* Help.  */
#define LBR__C_TYP_TXT    4	/* Text.  */
#define LBR__C_TYP_SHSTB  5	/* Vax shareable image.  */
#define LBR__C_TYP_NCS    6	/* NCS.  */
#define LBR__C_TYP_EOBJ   7	/* Alpha object.  */
#define LBR__C_TYP_ESHSTB 8	/* Alpha shareable image.  */
#define LBR__C_TYP_IOBJ   9	/* IA-64 object.  */
#define LBR__C_TYP_ISHSTB 10	/* IA-64 shareable image.  */

struct vms_lhd
{
  /* Type of the library.  See above.  */
  unsigned char type;

  /* Number of indexes.  Generally 1, 2 for object libraries.  */
  unsigned char nindex;

  unsigned char fill_1[2];

  /* Sanity Id.  */
  unsigned char sanity[4];

  /* Version.  */
  unsigned char majorid[2];
  unsigned char minorid[2];

  /* Tool name.  */
  unsigned char lbrver[32];

  /* Create time.  */
  unsigned char credat[8];

  /* Update time.  */
  unsigned char updtim[8];

  /* Size of the MHD.  */
  unsigned char mhdusz;

  unsigned char idxblkf[2];	/* Unused.  */
  unsigned char fill_2;
  unsigned char closerror[2];

  unsigned char spareword[2];

  /* First free block, and number of free blocks.  */
  unsigned char freevbn[4];
  unsigned char freeblk[4];

  unsigned char nextrfa[6];
  unsigned char nextvbn[4];

  /* Free pre-allocated index block.  */
  /* Number of free blocks.  */
  unsigned char freidxblk[4];
  /* VBN of a simply linked list of free blocks.  The list is terminated by a
     nul VBN.  */
  unsigned char freeidx[4];

  /* Highest pre-allocated index block and in use.  */
  unsigned char hipreal[4];
  unsigned char hiprusd[4];

  /* Number of index blocks in use.  */
  unsigned char idxblks[4];

  /* Number of index entries.  */
  unsigned char idxcnt[4];

  /* Number of modules entries.  */
  unsigned char modcnt[4];

  unsigned char fill_3[2];

  /* Number of module headers.  */
  unsigned char modhdrs[4];

  /* Overhead index pointers.  */
  unsigned char idxovh[4];

  /* Update history records.  */
  unsigned char maxluhrec[2];
  unsigned char numluhrec[2];
  unsigned char begluhrfa[6];
  unsigned char endluhrfa[6];

  /* DCX map.  */
  unsigned char dcxmapvbn[4];

  unsigned char fill_4[4 * 13];
};

/* Known major ids.  */
#define LBR_MAJORID 3		/* Alpha libraries.  */
#define LBR_ELFMAJORID 6	/* Elf libraries (new index, new data).  */

/* Offset of the first IDD.  */
#define LHD_IDXDESC 196

/* InDex Description.  */
struct vms_idd
{
  unsigned char flags[2];

  /* Max length of the key.  */
  unsigned char keylen[2];

  /* First index block.  */
  unsigned char vbn[4];
};

/* IDD flags.  */
#define IDD__FLAGS_ASCII 1
#define IDD__FLAGS_LOCKED 2
#define IDD__FLAGS_VARLENIDX 4
#define IDD__FLAGS_NOCASECMP 8
#define IDD__FLAGS_NOCASENTR 16
#define IDD__FLAGS_UPCASNTRY 32

#define IDD_LENGTH 8

/* Index block.  */
#define INDEXDEF__LENGTH 512
#define INDEXDEF__BLKSIZ 500

struct vms_indexdef
{
  /* Number of bytes used.  */
  unsigned char used[2];

  /* VBN of the parent.  */
  unsigned char parent[4];

  unsigned char fill_1[6];

  /* The key field contains vms_idx/vms_elfidx structures, which are
     simply a key (= a string) and a rfa.  */
  unsigned char keys[INDEXDEF__BLKSIZ];
};

/* An offset in a file.  */

struct vms_rfa
{
  /* Logical block number, 1 based.
     0 means that the field is absent.  Block size is 512.  */
  unsigned char vbn[4];

  /* Offset within the block.  */
  unsigned char offset[2];
};

/* Index keys.  For version 3.  */

struct vms_idx
{
  /* Offset from the start of the vbn, so minimum should be
     DATA__DATA (ie 6).  */
  struct vms_rfa rfa;

  unsigned char keylen;
  /* The length of this field is in fact keylen.  */
  unsigned char keyname[256];
};

/* Index keys, for version 4 and later.  */

struct vms_elfidx
{
  struct vms_rfa rfa;

  unsigned char keylen[2];
  unsigned char flags;
  unsigned char keyname[256];
};

/* Flags of elfidx.  */

#define ELFIDX__WEAK 0x01	/* Weak symbol.  */
#define ELFIDX__GROUP 0x02	/* Group symbol.  */
#define ELFIDX__LISTRFA 0x04	/* RFA field points to an LHS.  */
#define ELFIDX__SYMESC 0x08	/* Long symbol.  */

#define RFADEF__C_INDEX 0xffff

/* List head structure.  That's what is pointed by rfa when LISTRFA flag
   is set in elfidx.  */

struct vms_lhs
{
  struct vms_rfa ng_g_rfa;	/* Non-group global.  */
  struct vms_rfa ng_wk_rfa;	/* Non-group weak.  */
  struct vms_rfa g_g_rfa;	/* Group global.  */
  struct vms_rfa g_wk_rfa;	/* Group weak.  */
  unsigned char flags;
};

/* List node structure.  Fields of LHS point to this structure.  */

struct vms_lns
{
  /* Next node in the list.  */
  struct vms_rfa nxtrfa;

  /* Module associated with the key.  */
  struct vms_rfa modrfa;
};

struct vms_datadef
{
  /* Number of records in this block.  */
  unsigned char recs;
  unsigned char fill_1;

  /* Next vbn.  */
  unsigned char link[4];

  /* Data.  The first word is the record length, followed by record
     data and a possible pad byte so that record length is always aligned.  */
  unsigned char data[506];
};
#define DATA__LENGTH 512
#define DATA__DATA 6

/* Key name block.  This is used for keys longer than 128 bytes.  */

struct vms_kbn
{
  /* Length of the key chunk.  */
  unsigned char keylen[2];

  /* RFA of the next chunk.  */
  struct vms_rfa rfa;

  /* Followed by the key chunk.  */
};

/* Module header.  */
struct vms_mhd
{
  /* Fixed part.  */
  unsigned char lbrflag;
  unsigned char id;
  unsigned char fill_1[2];
  unsigned char refcnt[4];
  unsigned char datim[8];

  unsigned char objstat;
  /* Ident or GSMATCH.  */
  unsigned char objidlng;
  unsigned char objid[31];

  unsigned char pad1[3];
  unsigned char otherefcnt[4];
  unsigned char modsize[4];
  unsigned char pad2[4];
};

#define MHD__C_MHDID 0xad	/* Value for id.  */
#define MHD__C_MHDLEN 16	/* Fixed part length.  */
#define MHD__C_USRDAT 16

/* Flags for objstat.  */
#define MHD__M_SELSRC 0x1	/* Selective search.  */
#define MHD__M_OBJTIR 0x2
#define MHD__M_WKSYM  0x4

struct vms_luh
{
  unsigned char nxtluhblk[4];
  unsigned char spare[2];
  unsigned char data[506];
};

struct vms_luhdef
{
  unsigned char rechdr[2];
  unsigned char reclen[2];
};
#define LUH__RECHDRLEN 4
#define LUH__RECHDRMRK 0xabba
#define LUH__DATAFLDLEN 506

/* Entry in the history.  */

struct vms_leh
{
  unsigned char date[8];
  unsigned char nbr_units[2];
  unsigned char action[2]; /* 1: delete, 2: insert, 3: replaced.  */
  unsigned char idlen;
  /* username
     modules... */
};

#endif /* _VMS_LBR_H */
