/* Alpha VMS external format of Libraries.

   Copyright 2010 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.  */
  unsigned char freidxblk[4];
  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 */
