1985-01-10 13:35:39 +00:00
|
|
|
#ifndef lint
|
|
|
|
static char rcsid[] = "$Header$";
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Routines to read in the various parts of the object file.
|
|
|
|
*/
|
|
|
|
|
1985-04-18 15:21:16 +00:00
|
|
|
#include "../../h/arch.h"
|
|
|
|
#include "../../h/out.h"
|
|
|
|
#include "../../h/ranlib.h"
|
1985-01-10 13:35:39 +00:00
|
|
|
#include "const.h"
|
|
|
|
#include "assert.h"
|
|
|
|
|
|
|
|
int infile; /* The current input file. */
|
|
|
|
|
|
|
|
extern bool bytes_reversed;
|
|
|
|
extern bool words_reversed;
|
|
|
|
|
|
|
|
ushort
|
|
|
|
getushort()
|
|
|
|
{
|
|
|
|
ushort ubuf;
|
|
|
|
|
|
|
|
if (read(infile, (char *)&ubuf, 2) != 2)
|
|
|
|
fatal("premature EOF");
|
|
|
|
if (bytes_reversed)
|
|
|
|
swap((char *)&ubuf, "2");
|
|
|
|
return ubuf;
|
|
|
|
}
|
|
|
|
|
|
|
|
long
|
|
|
|
getlong()
|
|
|
|
{
|
|
|
|
long lbuf;
|
|
|
|
|
|
|
|
if (read(infile, (char *)&lbuf, 4) != 4)
|
|
|
|
fatal("premature EOF");
|
|
|
|
if (bytes_reversed || words_reversed)
|
|
|
|
swap((char *)&lbuf, "4");
|
|
|
|
return lbuf;
|
|
|
|
}
|
|
|
|
|
|
|
|
read_head(head)
|
|
|
|
register struct outhead *head;
|
|
|
|
{
|
|
|
|
if (read(infile, (char *)head, SZ_HEAD) != SZ_HEAD)
|
|
|
|
fatal("premature EOF");
|
|
|
|
if (bytes_reversed || words_reversed)
|
|
|
|
swap((char *)head, SF_HEAD);
|
|
|
|
if (BADMAGIC(*head))
|
|
|
|
fatal("bad magic number");
|
|
|
|
}
|
|
|
|
|
1985-04-18 15:21:16 +00:00
|
|
|
read1(fd, val)
|
|
|
|
char *val ; {
|
|
|
|
if ( read(fd, val, 1)!=1 ) return 0 ;
|
|
|
|
return 1 ;
|
|
|
|
}
|
|
|
|
read2(fd, val)
|
|
|
|
int *val ; {
|
|
|
|
char rch[2] ;
|
|
|
|
if ( read(fd, rch, 2)!=2 ) return 0 ;
|
|
|
|
*val= (rch[0]&0377) + ((rch[1]&0377)<<8) ;
|
|
|
|
return 1 ;
|
|
|
|
}
|
|
|
|
read4(fd, val)
|
|
|
|
long *val ; {
|
|
|
|
int v1,v2 ;
|
|
|
|
if ( !read2(fd, &v1) ) return 0 ;
|
|
|
|
if ( !read2(fd, &v2) ) return 0 ;
|
|
|
|
*val = ((long)v1<<16) + (unsigned)v2 ;
|
|
|
|
return 1 ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1985-01-10 13:35:39 +00:00
|
|
|
read_arhdr(arhdr)
|
|
|
|
register struct ar_hdr *arhdr;
|
|
|
|
{
|
1985-04-18 15:21:16 +00:00
|
|
|
if ( read(infile,arhdr->ar_name,sizeof arhdr->ar_name)!=
|
|
|
|
sizeof arhdr->ar_name) {
|
|
|
|
goto peof ;
|
|
|
|
}
|
|
|
|
if ( !read4(infile,&arhdr->ar_date) ) goto peof ;
|
|
|
|
if ( !read1(infile,&arhdr->ar_uid) ) goto peof ;
|
|
|
|
if ( !read1(infile,&arhdr->ar_gid) ) goto peof ;
|
|
|
|
if ( !read2(infile,&arhdr->ar_mode) ) goto peof ;
|
|
|
|
if ( !read4(infile,&arhdr->ar_size) ) goto peof ;
|
|
|
|
return ;
|
|
|
|
peof:
|
|
|
|
fatal("Prematute EOF") ;
|
1985-01-10 13:35:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
read_table(ran, cnt)
|
|
|
|
register struct ranlib *ran;
|
|
|
|
register long cnt;
|
|
|
|
{
|
|
|
|
read_char((char *)ran, cnt * SZ_RAN);
|
|
|
|
if (bytes_reversed || words_reversed)
|
|
|
|
while (cnt--)
|
|
|
|
swap((char *)ran++, SF_RAN);
|
|
|
|
}
|
|
|
|
|
|
|
|
read_sect(sect, cnt)
|
|
|
|
register struct outsect *sect;
|
|
|
|
register ushort cnt;
|
|
|
|
{
|
|
|
|
if (read(infile, (char *)sect, cnt * SZ_SECT) != cnt * SZ_SECT)
|
|
|
|
fatal("premature EOF");
|
|
|
|
if (bytes_reversed || words_reversed)
|
|
|
|
while (cnt--)
|
|
|
|
swap((char *)sect++, SF_SECT);
|
|
|
|
}
|
|
|
|
|
|
|
|
read_emit(emit, cnt)
|
|
|
|
register char *emit;
|
|
|
|
register long cnt;
|
|
|
|
{
|
|
|
|
read_char(emit, cnt);
|
|
|
|
}
|
|
|
|
|
|
|
|
read_relo(relo, cnt)
|
|
|
|
register struct outrelo *relo;
|
|
|
|
register ushort cnt;
|
|
|
|
{
|
|
|
|
read_char((char *)relo, (long)cnt * SZ_RELO);
|
|
|
|
if (bytes_reversed || words_reversed)
|
|
|
|
while (cnt--)
|
|
|
|
swap((char *)relo++, SF_RELO);
|
|
|
|
}
|
|
|
|
|
|
|
|
read_name(name, cnt)
|
|
|
|
register struct outname *name;
|
|
|
|
register ushort cnt;
|
|
|
|
{
|
|
|
|
read_char((char *)name, (long)cnt * SZ_NAME);
|
|
|
|
if (bytes_reversed || words_reversed)
|
|
|
|
while (cnt--)
|
|
|
|
swap((char *)name++, SF_NAME);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* We don't have to worry about byte order here.
|
|
|
|
*/
|
|
|
|
read_char(string, cnt)
|
|
|
|
register char *string;
|
|
|
|
register long cnt;
|
|
|
|
{
|
|
|
|
register int n;
|
|
|
|
|
|
|
|
while (cnt) {
|
|
|
|
n = cnt >= MAXCHUNK ? MAXCHUNK : cnt;
|
|
|
|
if (read(infile, string, n) != n)
|
|
|
|
fatal("premature EOF");
|
|
|
|
string += n;
|
|
|
|
cnt -= n;
|
|
|
|
}
|
|
|
|
}
|