armember.c - scc - simple c99 compiler
(HTM) git clone git://git.simple-cc.org/scc
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Submodules
(DIR) README
(DIR) LICENSE
---
armember.c (925B)
---
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
9 static char *
10 getfname(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
26 long
27 armember(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 }