-int
-_bfd_vms_get_record (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 the VAX there's no length information in the record
- so start with OBJ_S_C_MAXRECSIZ. */
-
- if (PRIV (buf_size) == 0)
- {
- bfd_size_type amt;
-
- if (PRIV (is_vax))
- {
- amt = OBJ_S_C_MAXRECSIZ;
- PRIV (file_format) = FF_VAX;
- }
- else
- amt = 6;
- PRIV (vms_buf) = bfd_malloc (amt);
- PRIV (buf_size) = amt;
- }
-
- vms_buf = PRIV (vms_buf);
-
- if (vms_buf == 0)
- 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;
-
- default:
- case FF_VAX:
- test_len = 0;
- test_start = 0;
- break;
- }
-
- /* Skip odd alignment byte. */
-
- if (bfd_tell (abfd) & 1)
- {
- if (bfd_bread (PRIV (vms_buf), (bfd_size_type) 1, abfd) != 1)
- {
- bfd_set_error (bfd_error_file_truncated);
- return 0;
- }
- }
-
- /* Read the record header on Alpha. */
- if ((test_len != 0)
- && (bfd_bread (PRIV (vms_buf), (bfd_size_type) 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_bread (vms_buf, (bfd_size_type) 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) = bfd_realloc (vms_buf,
- (bfd_size_type) PRIV (rec_length));
- vms_buf = PRIV (vms_buf);
- if (vms_buf == 0)
- 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_bread remaining %d\n", remaining);
-#endif
- if (bfd_bread (vms_buf + test_len, (bfd_size_type) 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_bread 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 (bfd * abfd)