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 }