scc

A fork of https://git.simple-cc.org/scc/ for Qute

git clone https://git.8pit.net/scc.git

 1#include <errno.h>
 2#include <stdio.h>
 3#include <stdlib.h>
 4#include <string.h>
 5
 6#include <scc/ar.h>
 7#include <scc/mach.h>
 8
 9static char *
10getfname(struct ar_hdr *hdr, char *dst)
11{
12        char *p;
13        int i;
14
15        memcpy(dst, hdr->ar_name, SARNAM);
16        dst[SARNAM] = '\0';
17
18        for (i = SARNAM-1; i > 0; i--) {
19                if (dst[i] != ' ' && dst[i] != '/')
20                        break;
21                dst[i] = '\0';
22        }
23        return dst;
24}
25
26long
27armember(FILE *fp, char *member, struct ar_hdr *phdr)
28{
29	struct ar_hdr hdr;
30	long siz;
31
32	if (fread(&hdr, sizeof(hdr), 1, fp) != 1)
33		return (feof(fp)) ? 0 : -1;
34
35	if (strncmp(hdr.ar_fmag, ARFMAG, sizeof(hdr.ar_fmag))) {
36		errno = ERANGE;
37		return -1;
38	}
39
40	siz = strtol(hdr.ar_size, NULL, 0);
41	if (siz & 1)
42		siz++;
43	if (siz == 0) {
44		errno = ERANGE;
45		return -1;
46	}
47
48	getfname(&hdr, member);
49
50	if (phdr)
51		*phdr = hdr;
52
53	return sizeof(hdr) + siz;
54}