/* vms-misc.c -- Miscellaneous functions for VAX (openVMS/VAX) and
   EVAX (openVMS/Alpha) files.
   Copyright 1996, 1997, 1998, 1999 Free Software Foundation, Inc.

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

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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */


#if __STDC__
#include <stdarg.h>
#endif

#include "bfd.h"
#include "sysdep.h"
#include "bfdlink.h"
#include "libbfd.h"

#include "vms.h"

/*-----------------------------------------------------------------------------*/
#if VMS_DEBUG
/* debug functions */

/* debug function for all vms extensions
   evaluates environment variable VMS_DEBUG for a
   numerical value on the first call
   all error levels below this value are printed
  
   levels:
   1	toplevel bfd calls (functions from the bfd vector)
   2	functions called by bfd calls
   ...
   9	almost everything

   level is also identation level. Indentation is performed
   if level > 0
	*/

#if __STDC__
void
_bfd_vms_debug (int level, char *format, ...)
{
  static int min_level = -1;
  static FILE *output = NULL;
  char *eptr;
  va_list args;
  int abslvl = (level > 0)?level:-level;

  if (min_level == -1)
    {
      if ((eptr = getenv("VMS_DEBUG")) != NULL)
	{
	  min_level = atoi(eptr);
	  output = stderr;
	}
      else
	min_level = 0;
    }
  if (output == NULL)
    return;
  if (abslvl > min_level)
    return;

  while(--level>0)
    fprintf(output, " ");
  va_start(args, format);
  vfprintf(output, format, args);
  fflush(output);
  va_end(args);

  return;
}

#else /* not __STDC__ */

void
_bfd_vms_debug (level, format, a1, a2, a3, a4, a5, a6)
     int level;
     char *format;
     long a1; long a2; long a3;
     long a4; long a5; long a6;
{
  static int min_level = -1;
  static FILE *output = NULL;
  char *eptr;

  if (min_level == -1)
    {
      if ((eptr = getenv("VMS_DEBUG")) != NULL)
	{
	  min_level = atoi(eptr);
	  output = stderr;
	}
      else
	min_level = 0;
    }
  if (output == NULL)
    return;
  if (level > min_level)
    return;

  while(--level>0)
    fprintf(output, " ");
  fprintf(output, format, a1, a2, a3, a4, a5, a6);
  fflush(output);

  return;
}
#endif /* __STDC__ */


/* a debug function
   hex dump 'size' bytes starting at 'ptr'  */

void
_bfd_hexdump (level, ptr, size, offset)
     int level;
     unsigned char *ptr;
     int size;
     int offset;
{
  unsigned char *lptr = ptr;
  int count = 0;
  long start = offset;

  while (size-- > 0)
    {
      if ((count%16) == 0)
	vms_debug (level, "%08lx:", start);
      vms_debug (-level, " %02x", *ptr++);
      count++;
      start++;
      if (size == 0)
	{
	  while ((count%16) != 0)
	    {
	      vms_debug (-level, "   ");
	      count++;
	    }
	}
      if ((count%16) == 0)
	{
	  vms_debug (-level, " ");
	  while (lptr < ptr)
	    {
	      vms_debug (-level, "%c", (*lptr < 32)?'.':*lptr);
	      lptr++;
	    }
	  vms_debug (-level, "\n");
	}
    }
  if ((count%16) != 0)
    vms_debug (-level, "\n");

  return;
}
#endif


/* hash functions

   These are needed when reading an object file.  */

/* allocate new vms_hash_entry
   keep the symbol name and a pointer to the bfd symbol in the table  */

struct bfd_hash_entry *
_bfd_vms_hash_newfunc (entry, table, string)
     struct bfd_hash_entry *entry;
     struct bfd_hash_table *table;
     const char *string;
{
  vms_symbol_entry *ret;

#if VMS_DEBUG
  vms_debug (5, "_bfd_vms_hash_newfunc(%p, %p, %s)\n", entry, table, string);
#endif

  if (entry == (struct bfd_hash_entry *)NULL)
    {
      ret = (vms_symbol_entry *)
	      bfd_hash_allocate (table, sizeof (vms_symbol_entry));
      if (ret == (vms_symbol_entry *) NULL)
	{
	  bfd_set_error (bfd_error_no_memory);
	  return (struct bfd_hash_entry *)NULL;
	}
      entry = (struct bfd_hash_entry *) ret;
    }

  /* Call the allocation method of the base class.  */

  ret = (vms_symbol_entry *) bfd_hash_newfunc (entry, table, string);
#if VMS_DEBUG
  vms_debug (6, "_bfd_vms_hash_newfunc ret %p\n", ret);
#endif

  ret->symbol = (asymbol *)NULL;

  return (struct bfd_hash_entry *)ret;
}


/* object file input functions */

/* Return type and length from record header (buf) on Alpha.  */

void
_bfd_vms_get_header_values (abfd, buf, type, length)
     bfd *abfd ATTRIBUTE_UNUSED;
     unsigned char *buf;
     int *type;
     int *length;
{
  if (type != 0)
    *type = bfd_getl16 (buf);
  buf += 2;
  if (length != 0)
    *length = bfd_getl16 (buf);

#if VMS_DEBUG
  vms_debug (10, "_bfd_vms_get_header_values type %x, length %x\n", (type?*type:0), (length?*length:0));
#endif


  return;
}


/* Get next record from object file to vms_buf
   set PRIV(buf_size) and return it
  
   this is a little tricky since it should be portable.
  
   the openVMS object file has 'variable length' which means that
   read() returns data in chunks of (hopefully) correct and expected
   size. The linker (and other tools on vms) depend on that. Unix doesn't
   know about 'formatted' files, so reading and writing such an object
   file in a unix environment is not trivial.
  
   With the tool 'file' (available on all vms ftp sites), one
   can view and change the attributes of a file. Changing from
   'variable length' to 'fixed length, 512 bytes' reveals the
   record length at the first 2 bytes of every record. The same
   happens during the transfer of object files from vms to unix,
   at least with ucx, dec's implementation of tcp/ip.
  
   The vms format repeats the length at bytes 2 & 3 of every record.
  
   On the first call (file_format == FF_UNKNOWN) we check if
   the first and the third byte pair (!) of the record match.
   If they do it's an object file in an unix environment or with
   wrong attributes (FF_FOREIGN), else we should be in a vms
   environment where read() returns the record size (FF_NATIVE).
  
   reading is always done in 2 steps.
   first just the record header is read and the length extracted
   by get_header_values
   then the read buffer is adjusted and the remaining bytes are
   read in.
  
   all file i/o is always done on even file positions  */

int
_bfd_vms_get_record (abfd)
     bfd *abfd;
{
  int test_len, test_start, remaining;
  unsigned char *vms_buf;

#if VMS_DEBUG
  vms_debug (8, "_bfd_vms_get_record\n");
#endif

  /* minimum is 6 bytes on Alpha
     (2 bytes length, 2 bytes record id, 2 bytes length repeated)

     on VAX there's no length information in the record
     so start with OBJ_S_C_MAXRECSIZ  */

  if (PRIV(buf_size) == 0)
    {
      if (PRIV(is_vax))
	{
	  PRIV(vms_buf) = (unsigned char *) malloc (OBJ_S_C_MAXRECSIZ);
	  PRIV(buf_size) = OBJ_S_C_MAXRECSIZ;
	  PRIV(file_format) = FF_VAX;
	}
      else
	PRIV(vms_buf) = (unsigned char *) malloc (6);
    }

  vms_buf = PRIV(vms_buf);

  if (vms_buf == 0)
    {
      bfd_set_error (bfd_error_no_memory);
      return -1;
    }

  switch (PRIV(file_format))
    {
      case FF_UNKNOWN:
      case FF_FOREIGN:
	test_len = 6;			/* probe 6 bytes */
	test_start = 2;			/* where the record starts */
      break;

      case FF_NATIVE:
	test_len = 4;
	test_start = 0;
      break;

      case FF_VAX:
	test_len = 0;
	test_start = 0;
      break;
  }

  /* skip odd alignment byte  */

  if (bfd_tell (abfd) & 1)
    {
      if (bfd_read (PRIV(vms_buf), 1, 1, abfd) != 1)
	{
	  bfd_set_error (bfd_error_file_truncated);
	  return 0;
	}
    }

  /* read the record header on Alpha.  */

  if ((test_len != 0)
      && (bfd_read (PRIV(vms_buf), 1, test_len, abfd)
	  != (bfd_size_type) test_len))
    {
      bfd_set_error (bfd_error_file_truncated);
      return 0;
    }

  /* check file format on first call  */

  if (PRIV(file_format) == FF_UNKNOWN)
    {						/* record length repeats ? */
      if ( (vms_buf[0] == vms_buf[4])
        && (vms_buf[1] == vms_buf[5]))
	{
	  PRIV(file_format) = FF_FOREIGN;	/* Y: foreign environment */
	  test_start = 2;
	}
      else
	{
	  PRIV(file_format) = FF_NATIVE;	/* N: native environment */
	  test_start = 0;
	}
    }

  if (PRIV(is_vax))
    {
      PRIV(rec_length) = bfd_read (vms_buf, 1, PRIV(buf_size), abfd);
      if (PRIV(rec_length) <= 0)
	{
	  bfd_set_error (bfd_error_file_truncated);
	  return 0;
	}
      PRIV(vms_rec) = vms_buf;
    }
  else		/* Alpha  */
    {
      /* extract vms record length  */

      _bfd_vms_get_header_values (abfd, vms_buf+test_start, NULL,
				  &PRIV(rec_length));

      if (PRIV(rec_length) <= 0)
	{
	  bfd_set_error (bfd_error_file_truncated);
	  return 0;
	}

      /* that's what the linker manual says  */

      if (PRIV(rec_length) > EOBJ_S_C_MAXRECSIZ)
	{
	  bfd_set_error (bfd_error_file_truncated);
	  return 0;
	}

      /* adjust the buffer  */

      if (PRIV(rec_length) > PRIV(buf_size))
	{
	  PRIV(vms_buf) = (unsigned char *) realloc (vms_buf, PRIV(rec_length));
	  vms_buf = PRIV(vms_buf);
	  if (vms_buf == 0)
	    {
	      bfd_set_error (bfd_error_no_memory);
	      return -1;
	    }
	  PRIV(buf_size) = PRIV(rec_length);
	}

      /* read the remaining record  */

      remaining = PRIV(rec_length) - test_len + test_start;

#if VMS_DEBUG
      vms_debug (10, "bfd_read remaining %d\n", remaining);
#endif
      if (bfd_read (vms_buf + test_len, 1, remaining, abfd) !=
	  (bfd_size_type) remaining)
	{
	  bfd_set_error (bfd_error_file_truncated);
	  return 0;
	}
      PRIV(vms_rec) = vms_buf + test_start;
    }

#if VMS_DEBUG
  vms_debug (11, "bfd_read rec_length %d\n", PRIV(rec_length));
#endif

  return PRIV(rec_length);
}


/* get next vms record from file
   update vms_rec and rec_length to new (remaining) values  */

int
_bfd_vms_next_record (abfd)
     bfd *abfd;
{
#if VMS_DEBUG
  vms_debug (8, "_bfd_vms_next_record (len %d, size %d)\n",
	      PRIV(rec_length), PRIV(rec_size));
#endif

  if (PRIV(rec_length) > 0)
    {
      PRIV(vms_rec) += PRIV(rec_size);
    }
  else
    {
      if (_bfd_vms_get_record (abfd) <= 0)
	return -1;
    }

  if (PRIV(is_vax))
    {
      PRIV(rec_type) = *(PRIV(vms_rec));
      PRIV(rec_size) = PRIV(rec_length);
    }
  else
    {
      _bfd_vms_get_header_values (abfd, PRIV(vms_rec), &PRIV(rec_type),
				  &PRIV(rec_size));
    }
  PRIV(rec_length) -= PRIV(rec_size);

#if VMS_DEBUG
  vms_debug (8, "_bfd_vms_next_record: rec %p, size %d, length %d, type %d\n",
	      PRIV(vms_rec), PRIV(rec_size), PRIV(rec_length),
	      PRIV(rec_type));
#endif

  return PRIV(rec_type);
}



/* Copy sized string (string with fixed length) to new allocated area
   size is string length (size of record)  */

char *
_bfd_vms_save_sized_string (str, size)
     unsigned char *str;
     int size;
{
  char *newstr = bfd_malloc (size + 1);

  if (newstr == NULL)
    return 0;
  strncpy (newstr, (char *)str, size);
  newstr[size] = 0;

  return newstr;
}

/* Copy counted string (string with length at first byte) to new allocated area
   ptr points to length byte on entry  */

char *
_bfd_vms_save_counted_string (ptr)
     unsigned char *ptr;
{
  int len = *ptr++;

  return _bfd_vms_save_sized_string (ptr, len);
}


/* stack routines for vms ETIR commands */

/* Push value and section index  */

void
_bfd_vms_push (abfd, val, psect)
     bfd *abfd;
     uquad val;
     int psect;
{
  static int last_psect;

#if VMS_DEBUG
  vms_debug (4, "<push %016lx(%d) at %d>\n", val, psect, PRIV(stackptr));
#endif

  if (psect >= 0)
    last_psect = psect;

  PRIV(stack[PRIV(stackptr)]).value = val;
  PRIV(stack[PRIV(stackptr)]).psect = last_psect;
  PRIV(stackptr)++;
  if (PRIV(stackptr) >= STACKSIZE)
    {
      bfd_set_error (bfd_error_bad_value);
      (*_bfd_error_handler) (_("Stack overflow (%d) in _bfd_vms_push"), PRIV(stackptr));
      exit (1);
    }
  return;
}


/* Pop value and section index  */

uquad
_bfd_vms_pop (abfd, psect)
     bfd *abfd;
     int *psect;
{
  uquad value;

  if (PRIV(stackptr) == 0)
    {
      bfd_set_error (bfd_error_bad_value);
      (*_bfd_error_handler) (_("Stack underflow in _bfd_vms_pop"));
      exit (1);
    }
  PRIV(stackptr)--;
  value = PRIV(stack[PRIV(stackptr)]).value;
  if ((psect != NULL) && (PRIV(stack[PRIV(stackptr)]).psect >= 0))
    *psect = PRIV(stack[PRIV(stackptr)]).psect;

#if VMS_DEBUG
  vms_debug (4, "<pop %016lx(%d)>\n", value, PRIV(stack[PRIV(stackptr)]).psect);
#endif

  return value;
}


/* object file output functions */

/* GAS tends to write sections in little chunks (bfd_set_section_contents)
   which we can't use directly. So we save the little chunks in linked
   lists (one per section) and write them later.  */

/* Add a new vms_section structure to vms_section_table
   - forward chaining -  */

static vms_section *
add_new_contents (abfd, section)
     bfd *abfd;
     sec_ptr section;
{
  vms_section *sptr, *newptr;

  sptr = PRIV(vms_section_table)[section->index];
  if (sptr != NULL)
    return sptr;

  newptr = (vms_section *) bfd_malloc (sizeof (vms_section));
  if (newptr == (vms_section *) NULL)
    return NULL;
  newptr->contents = (unsigned char *) bfd_alloc (abfd, (int)section->_raw_size);
  if (newptr->contents == (unsigned char *)NULL)
    return NULL;
  newptr->offset = 0;
  newptr->size = section->_raw_size;
  newptr->next = 0;
  PRIV(vms_section_table)[section->index] = newptr;
  return newptr;
}


/* Save section data & offset to an vms_section structure
   vms_section_table[] holds the vms_section chain  */

boolean
_bfd_save_vms_section (abfd, section, data, offset, count)
     bfd *abfd;
     sec_ptr section;
     PTR data;
     file_ptr offset;
     bfd_size_type count;
{
  vms_section *sptr;

  if (section->index >= VMS_SECTION_COUNT)
    {
      bfd_set_error (bfd_error_nonrepresentable_section);
      return false;
    }
  if (count == (bfd_size_type)0)
    return true;
  sptr = add_new_contents (abfd, section);
  if (sptr == NULL)
    return false;
  memcpy (sptr->contents + offset, data, (size_t) count);

  return true;
}


/* Get vms_section pointer to saved contents for section # index  */

vms_section *
_bfd_get_vms_section (abfd, index)
     bfd *abfd;
     int index;
{
  if (index >=  VMS_SECTION_COUNT)
    {
      bfd_set_error (bfd_error_nonrepresentable_section);
      return NULL;
    }
  return PRIV(vms_section_table)[index];
}


/* Object output routines  */

/* Begin new record or record header
   write 2 bytes rectype
   write 2 bytes record length (filled in at flush)
   write 2 bytes header type (ommitted if rechead == -1)  */

void
_bfd_vms_output_begin (abfd, rectype, rechead)
     bfd *abfd;
     int rectype;
     int rechead;
{
#if VMS_DEBUG
  vms_debug (6, "_bfd_vms_output_begin(type %d, head %d)\n", rectype,
	      rechead);
#endif

  _bfd_vms_output_short (abfd,rectype);

  /* save current output position to fill in lenght later  */

  if (PRIV(push_level) > 0)
    PRIV(length_pos) = PRIV(output_size);

#if VMS_DEBUG
  vms_debug (6, "_bfd_vms_output_begin: length_pos = %d\n",
	      PRIV(length_pos));
#endif

  _bfd_vms_output_short (abfd,0);		/* placeholder for length */

  if (rechead != -1)
    _bfd_vms_output_short (abfd,rechead);

  return;
}


/* Set record/subrecord alignment  */

void
_bfd_vms_output_alignment (abfd, alignto)
     bfd *abfd;
     int alignto;
{
#if VMS_DEBUG
  vms_debug (6, "_bfd_vms_output_alignment(%d)\n", alignto);
#endif

  PRIV(output_alignment) = alignto;
  return;
}


/* Prepare for subrecord fields  */

void
_bfd_vms_output_push (abfd)
     bfd *abfd;
{
#if VMS_DEBUG
  vms_debug (6, "vms_output_push(pushed_size = %d)\n", PRIV(output_size));
#endif

  PRIV(push_level)++;
  PRIV(pushed_size) = PRIV(output_size);
  return;
}


/* End of subrecord fields  */

void
_bfd_vms_output_pop (abfd)
     bfd *abfd;
{
#if VMS_DEBUG
  vms_debug (6, "vms_output_pop(pushed_size = %d)\n", PRIV(pushed_size));
#endif

  _bfd_vms_output_flush (abfd);
  PRIV(length_pos) = 2;

#if VMS_DEBUG
  vms_debug (6, "vms_output_pop: length_pos = %d\n", PRIV(length_pos));
#endif

  PRIV(pushed_size) = 0;
  PRIV(push_level)--;
  return;
}


/* Flush unwritten output, ends current record  */

void
_bfd_vms_output_flush (abfd)
     bfd *abfd;
{
  int real_size = PRIV(output_size);
  int aligncount;
  int length;

#if VMS_DEBUG
  vms_debug (6, "_bfd_vms_output_flush(real_size = %d, pushed_size %d at lenpos %d)\n",
	      real_size, PRIV(pushed_size), PRIV(length_pos));
#endif

  if (PRIV(push_level) > 0)
    length = real_size - PRIV(pushed_size);
  else
    length = real_size;

  if (length == 0)
    return;
  aligncount = (PRIV(output_alignment)
		- (length % PRIV(output_alignment))) % PRIV(output_alignment);

#if VMS_DEBUG
  vms_debug (6, "align: adding %d bytes\n", aligncount);
#endif

  while(aligncount-- > 0)
    {
      PRIV(output_buf)[real_size++] = 0;
#if 0
      /* this is why I *love* vms: inconsistency :-}
	 alignment is added to the subrecord length
	 but not to the record length  */
      if (PRIV(push_level) > 0)
#endif
	length++;
    }

  /* put length to buffer  */
  PRIV(output_size) = PRIV(length_pos);
  _bfd_vms_output_short (abfd, (unsigned int)length);

  if (PRIV(push_level) == 0)
    {
#ifndef VMS
	/* write length first, see FF_FOREIGN in the input routines */
      fwrite (PRIV(output_buf)+2, 2, 1, (FILE *)abfd->iostream);
#endif
      fwrite (PRIV(output_buf), real_size, 1, (FILE *)abfd->iostream);

      PRIV(output_size) = 0;
    }
  else
    {
      PRIV(output_size) = real_size;
      PRIV(pushed_size) = PRIV(output_size);
    }

  return;
}


/* End record output  */

void
_bfd_vms_output_end (abfd)
     bfd *abfd;
{
#if VMS_DEBUG
  vms_debug (6, "_bfd_vms_output_end\n");
#endif

  _bfd_vms_output_flush (abfd);

  return;
}


/* check remaining buffer size

   return what's left.  */

int
_bfd_vms_output_check (abfd, size)
    bfd *abfd;
    int size;
{
#if VMS_DEBUG
  vms_debug (6, "_bfd_vms_output_check(%d)\n", size);
#endif

  return (MAX_OUTREC_SIZE - (PRIV(output_size) + size + MIN_OUTREC_LUFT));
}


/* Output byte (8 bit) value  */

void
_bfd_vms_output_byte (abfd, value)
     bfd *abfd;
     unsigned int value;
{
#if VMS_DEBUG
  vms_debug (6, "_bfd_vms_output_byte(%02x)\n", value);
#endif

  bfd_put_8 (abfd, value & 0xff, PRIV(output_buf) + PRIV(output_size));
  PRIV(output_size) += 1;
  return;
}


/* Output short (16 bit) value  */

void
_bfd_vms_output_short (abfd, value)
     bfd *abfd;
     unsigned int value;
{
#if VMS_DEBUG
  vms_debug (6, "_bfd_vms_output_short (%04x)\n", value);
#endif

  bfd_put_16 (abfd, value & 0xffff, PRIV(output_buf) + PRIV(output_size));
  PRIV(output_size) += 2;
  return;
}


/* Output long (32 bit) value  */

void
_bfd_vms_output_long (abfd, value)
     bfd *abfd;
     unsigned long value;
{
#if VMS_DEBUG
  vms_debug (6, "_bfd_vms_output_long (%08lx)\n", value);
#endif

  bfd_put_32 (abfd, value, PRIV(output_buf) + PRIV(output_size));
  PRIV(output_size) += 4;
  return;
}


/* Output quad (64 bit) value  */

void
_bfd_vms_output_quad (abfd, value)
     bfd *abfd;
     uquad value;
{
#if VMS_DEBUG
  vms_debug (6, "_bfd_vms_output_quad(%016lx)\n", value);
#endif

  bfd_put_64(abfd, value, PRIV(output_buf) + PRIV(output_size));
  PRIV(output_size) += 8;
  return;
}


/* Output c-string as counted string  */

void
_bfd_vms_output_counted (abfd, value)
     bfd *abfd;
     char *value;
{
int len;

#if VMS_DEBUG
  vms_debug (6, "_bfd_vms_output_counted(%s)\n", value);
#endif

  len = strlen (value);
  if (len == 0)
    {
      (*_bfd_error_handler) (_("_bfd_vms_output_counted called with zero bytes"));
      return;
    }
  if (len > 255)
    {
      (*_bfd_error_handler) (_("_bfd_vms_output_counted called with too many bytes"));
      return;
    }
  _bfd_vms_output_byte (abfd, len & 0xff);
  _bfd_vms_output_dump (abfd, (unsigned char *)value, len);
}


/* Output character area  */

void
_bfd_vms_output_dump (abfd, data, length)
     bfd *abfd;
     unsigned char *data;
     int length;
{
#if VMS_DEBUG
  vms_debug (6, "_bfd_vms_output_dump(%d)\n", length);
#endif

  if (length == 0)
    return;

  memcpy (PRIV(output_buf) + PRIV(output_size), data, length);
  PRIV(output_size) += length;

  return;
}


/* Output count bytes of value  */

void
_bfd_vms_output_fill (abfd, value, count)
     bfd *abfd;
     int value;
     int count;
{
#if VMS_DEBUG
  vms_debug (6, "_bfd_vms_output_fill(val %02x times %d)\n", value, count);
#endif

  if (count == 0)
    return;
  memset (PRIV(output_buf) + PRIV(output_size), value, count);
  PRIV(output_size) += count;

  return;
}

/* this hash routine borrowed from GNU-EMACS, and strengthened slightly  ERY*/

static int
hash_string (ptr)
     const char *ptr;
{
  register const unsigned char *p = (unsigned char *) ptr;
  register const unsigned char *end = p + strlen (ptr);
  register unsigned char c;
  register int hash = 0;

  while (p != end)
    {
      c = *p++;
      hash = ((hash << 3) + (hash << 15) + (hash >> 28) + c);
    }
  return hash;
}

/* Generate a length-hashed VMS symbol name (limited to maxlen chars).  */

char *
_bfd_vms_length_hash_symbol (abfd, in, maxlen)
     bfd *abfd;
     const char *in;
     int maxlen;
{
  long int result;
  int in_len;
  char *new_name;
  const char *old_name;
  int i;
  static char outbuf[EOBJ_S_C_SYMSIZ+1];
  char *out = outbuf;

#if VMS_DEBUG
  vms_debug(4, "_bfd_vms_length_hash_symbol \"%s\"\n", in);
#endif

  if (maxlen > EOBJ_S_C_SYMSIZ)
    maxlen = EOBJ_S_C_SYMSIZ;

  new_name = out;		/* save this for later.  */

  /* We may need to truncate the symbol, save the hash for later.  */

  in_len = strlen (in);

  result = (in_len > maxlen) ? hash_string (in) : 0;

  old_name = in;

  /* Do the length checking.  */

  if (in_len <= maxlen)
    {
      i = in_len;
    }
  else
    {
      if (PRIV(flag_hash_long_names))
	i = maxlen-9;
      else
	i = maxlen;
    }

  strncpy (out, in, i);
  in += i;
  out += i;

  if ((in_len > maxlen)
      && PRIV(flag_hash_long_names))
    sprintf (out, "_%08lx", result);
  else
    *out = 0;

#if VMS_DEBUG
  vms_debug(4, "--> [%d]\"%s\"\n", strlen (outbuf), outbuf);
#endif

  if (in_len > maxlen
	&& PRIV(flag_hash_long_names)
	&& PRIV(flag_show_after_trunc))
    printf (_("Symbol %s replaced by %s\n"), old_name, new_name);

  return outbuf;
}


/* Allocate and initialize a new symbol.  */

static asymbol *
new_symbol (abfd, name)
     bfd *abfd;
     char *name;
{
  asymbol *symbol;

#if VMS_DEBUG
  _bfd_vms_debug (7,  "new_symbol %s\n", name);
#endif

  symbol = _bfd_vms_make_empty_symbol (abfd);
  if (symbol == 0)
    return symbol;
  symbol->name = name;
  symbol->section = bfd_make_section (abfd, BFD_UND_SECTION_NAME);

  return symbol;
}


/* Allocate and enter a new private symbol.  */

vms_symbol_entry *
_bfd_vms_enter_symbol (abfd, name)
     bfd *abfd;
     char *name;
{
  vms_symbol_entry *entry;

#if VMS_DEBUG
  _bfd_vms_debug (6,  "_bfd_vms_enter_symbol %s\n", name);
#endif

  entry = (vms_symbol_entry *)
	  bfd_hash_lookup (PRIV(vms_symbol_table), name, false, false);
  if (entry == 0)
    {
#if VMS_DEBUG
      _bfd_vms_debug (8,  "creating hash entry for %s\n", name);
#endif
      entry = (vms_symbol_entry *)bfd_hash_lookup (PRIV(vms_symbol_table), name, true, false);
      if (entry != 0)
	{
	  asymbol *symbol;
	  symbol = new_symbol (abfd, name);
	  if (symbol != 0)
	    {
	      entry->symbol = symbol;
	      PRIV(gsd_sym_count)++;
	      abfd->symcount++;
	    }
	  else
	    entry = 0;
	}
      else
	(*_bfd_error_handler) (_("failed to enter %s"), name);
    }
  else
    {
#if VMS_DEBUG
      _bfd_vms_debug (8,  "found hash entry for %s\n", name);
#endif
    }

#if VMS_DEBUG
  _bfd_vms_debug (7, "-> entry %p, entry->symbol %p\n", entry, entry->symbol);
#endif
  return entry;
}
