* tiny
[mascara-docs.git] / compilers / bcc / linux86-0.16.17 / ld / ld86r.c
blobdfc876d9bc6fe4469289dcdc7a1f81f7ac5053d6
1 #include <stdio.h>
2 #include <string.h>
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #ifdef __STDC__
6 #include <stdlib.h>
7 #include <unistd.h>
8 #else
9 #include <malloc.h>
10 #endif
12 #define ARMAG "!<arch>\n"
13 #define SARMAG 8
14 #define ARFMAG "`\n"
16 struct ar_hdr {
17 char ar_name[16],
18 ar_date[12],
19 ar_uid[6],
20 ar_gid[6],
21 ar_mode[8],
22 ar_size[10],
23 ar_fmag[2];
24 } arbuf;
26 void
27 fatal(char * str) { fprintf(stderr, "%s\n", str); exit(2); }
29 void
30 main(int argc, char ** argv)
32 char buf[128];
33 FILE * fd, * ifd;
34 struct stat st;
35 int ar, libarg=0, need_o = 0, got_o = 0;
37 for(ar=1; ar<argc; ar++) if( argv[ar][0] == '-' )
39 if( argv[ar][1] == 'r' ) need_o = 1;
40 if( argv[ar][1] == 'o' ) { got_o++; libarg = 0; }
42 else
44 if( libarg == 0 ) libarg = ar;
47 if( libarg == 0 || got_o > 1 || need_o > got_o )
48 fatal("Err, what's the output gonna be called?");
50 if( (fd =fopen(argv[libarg], "wb")) == 0 ) fatal("Cannot open archive");
51 if( fwrite(ARMAG, 1, SARMAG, fd) != SARMAG) fatal("Cannot write magic");
53 for(ar=1; ar<argc; ar++) if( ar != libarg && argv[ar][0] != '-' )
55 char * ptr;
56 if( stat(argv[ar], &st) < 0 ) fatal("Cannot stat object");
57 if((ptr=strchr(argv[ar], '/'))) ptr++; else ptr=argv[ar];
58 memset(&arbuf, ' ', sizeof(arbuf));
59 strcpy(buf, ptr); strcat(buf, "/ ");
60 strncpy(arbuf.ar_name, buf, sizeof(arbuf.ar_name));
62 sprintf(arbuf.ar_date, "%-12ld", (long)st.st_mtime);
63 sprintf(arbuf.ar_uid, "%-6d", (int)(st.st_uid%1000000L));
64 sprintf(arbuf.ar_gid, "%-6d", (int)(st.st_gid%1000000L));
65 sprintf(arbuf.ar_mode, "%-8lo", (long)st.st_mode);
66 sprintf(arbuf.ar_size, "%-10ld", (long)st.st_size);
67 memcpy(arbuf.ar_fmag, ARFMAG, sizeof(arbuf.ar_fmag));
69 if( fwrite(&arbuf, 1, sizeof(arbuf), fd) != sizeof(arbuf) )
70 fatal("Cannot write header");
72 ptr = malloc(st.st_size+2);
73 if( ptr == 0 ) fatal("Out of memory");
74 ptr[st.st_size] = ' ';
75 if( (ifd = fopen(argv[ar], "rb")) == 0 ) fatal("Cannot open input");
76 if( fread(ptr, 1, st.st_size, ifd) != st.st_size )
77 fatal("Cannot read input file");
78 fclose(ifd);
80 if( st.st_size&1 ) st.st_size++;
81 if( fwrite(ptr, 1, st.st_size, fd) != st.st_size )
82 fatal("Cannot write output file");
84 fclose(fd);
85 exit(0);