ref: fe6c85f724bdef3c203b6ebc83c4fe0edfb3094a
dir: /src/libmach/formember.c/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <scc/ar.h>
#include <scc/mach.h>
static char *
getfname(struct ar_hdr *hdr, char *dst)
{
char *p;
int i;
memcpy(dst, hdr->ar_name, SARNAM);
dst[SARNAM] = '\0';
for (i = SARNAM-1; i > 0; i--) {
if (dst[i] != ' ' && dst[i] != '/')
break;
dst[i] = '\0';
}
return dst;
}
static long
armember(FILE *fp, char *member)
{
struct ar_hdr hdr;
long siz;
if (fread(&hdr, sizeof(hdr), 1, fp) != 1)
return (feof(fp)) ? 0 : -1;
if (strncmp(hdr.ar_fmag, ARFMAG, sizeof(hdr.ar_fmag)))
return -1;
siz = strtol(hdr.ar_size, NULL, 0);
if (siz & 1)
siz++;
if (siz == 0)
return -1;
getfname(&hdr, member);
return sizeof(hdr) + siz;
}
int
formember(FILE *fp, int (*fn)(FILE *, char *, void *), void *data)
{
int r;
long off;
fpos_t pos;
char name[SARNAM+1];
for (;;) {
fgetpos(fp, &pos);
if ((off = armember(fp, name)) <= 0)
return off;
r = (*fn)(fp, name, data);
if (r <= 0)
return r;
fsetpos(fp, &pos);
fseek(fp, off, SEEK_CUR);
}
}