File:  [Research Unix] / researchv10no / cmd / asd / header.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:35 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv10, HEAD
researchv10 Norman

/*
 *	various subroutines to deal with archive headers
 */

#include <stdio.h>
#include <ctype.h>
#include "asd.h"

/*
 *	convert p to a long value.  maximum input length is len,
 *	input is to be interpreted in base b.  No negative values.
 */
long
cvlong (p, len, base)
	register char *p;
	register int len, base;
{
	register int i;
	register long r;

	r = 0;
	i = len;

	do {
		register int c = *p++;
		if (isdigit (c))
			r = r * base + c - '0';
	} while (--i > 0);

	return r;
}

long
read_header (name, file)
	register char *name;
	FILE *file;
{
	register int n;
	register int i;
	register char *p, *q;

	n = fread ((char *) &ar_hdr, sizeof (ar_hdr), 1, file);
	if (n != 1) {
		fprintf (stderr, "can't read %s\n", name);
		exit (1);
	}

	if (strncmp (ar_hdr.ar_fmag, ARFMAG, sizeof (ar_hdr.ar_fmag)) != 0) {
		fprintf (stderr, "input phase error on %s\n", name);
		exit (1);
	}

	/* check the component name, allowing for trailing blanks */
	p = name;
	q = ar_hdr.ar_name;
	for (i = 0; i < sizeof (ar_hdr.ar_name); i++) {
		if (*q++ != (*p? *p++: ' ')) {
			fprintf (stderr, "expected %s, got %.*s\n",
			    name, sizeof (ar_hdr.ar_name), ar_hdr.ar_name);
		}
	}

	/* crack the archive header and put the information in "hdr" */
	hdr.size = cvlong (ar_hdr.ar_size, sizeof (ar_hdr.ar_size), 10);
	hdr.mode = cvlong (ar_hdr.ar_mode, sizeof (ar_hdr.ar_mode), 8);
	hdr.date = cvlong (ar_hdr.ar_date, sizeof (ar_hdr.ar_date), 10);

	return hdr.size;
}

/* advance to the start of the next archive header */
void
next_header(f)
	register FILE *f;
{
	if (hdr.size & 1)
		getc(f);
}

/* skip leading white space, return a field */
char *
getfield (f)
	register FILE *f;
{
	register char c;

	/* skip leading white space */
	do c = getc (f);
	while (isspace (c) && c != '\n');

	/* if we hit a newline, something's wrong */
	if (c == '\n') {
		fprintf (stderr, "unexpected newline\n");
		exit (1);
	}

	/* return the nonblank, read a "pathname" and return it */
	ungetc (c, f);
	return getpath (f);
}

/* insist on an end of line right here */
void
geteol (f)
	register FILE *f;
{
	register int c;

	c = getc (f);
	if (c != '\n') {
		fprintf (stderr, "expected newline, got %c\n", c);
		exit (1);
	}
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.