1 /* ----------------------------------------------------------------------- *
3 * Copyright 1996-2009 The NASM Authors - All Rights Reserved
4 * See the file AUTHORS included with the NASM distribution for
5 * the specific copyright holders.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 * ----------------------------------------------------------------------- */
34 /* rdflib - manipulate RDOFF library files (.rdl) */
37 * an rdoff library is simply a sequence of RDOFF object files, each
38 * preceded by the name of the module, an ASCII string of up to 255
39 * characters, terminated by a zero.
41 * When a library is being created, special signature block is placed
42 * in the beginning of the file. It is a string 'RDLIB' followed by a
43 * version number, then int32_t content size and a int32_t time stamp.
44 * The module name of the signature block is '.sig'.
47 * There may be an optional directory placed on the end of the file.
48 * The format of the directory will be 'RDLDD' followed by a version
49 * number, followed by the length of the directory, and then the
50 * directory, the format of which has not yet been designed.
51 * The module name of the directory must be '.dir'.
53 * All module names beginning with '.' are reserved for possible future
54 * extensions. The linker ignores all such modules, assuming they have
55 * the format of a six uint8_t type & version identifier followed by int32_t
56 * content size, followed by data.
67 /* functions supported:
68 * create a library (no extra operands required)
69 * add a module from a library (requires filename and name to give mod.)
70 * replace a module in a library (requires given name and filename)
71 * delete a module from a library (requires given name)
72 * extract a module from the library (requires given name and filename)
78 " rdflib x libname [extra operands]\n\n"
79 " where x is one of:\n"
80 " c - create library\n"
81 " a - add module (operands = filename module-name)\n"
82 " x - extract (module-name filename)\n"
83 " r - replace (module-name filename)\n"
84 " d - delete (module-name)\n" " t - list\n";
86 /* Library signature */
87 const char *rdl_signature
= "RDLIB2", *sig_modname
= ".sig";
91 #define _ENDIANNESS 0 /* 0 for little, 1 for big */
93 static void int32_ttolocal(int32_t *l
)
97 uint8_t *p
= (uint8_t *)l
;
106 (void)l
; /* placate optimizers */
110 static char copybytes(FILE * fp
, FILE * fp2
, int n
)
114 for (i
= 0; i
< n
; i
++) {
117 fprintf(stderr
, "rdflib: premature end of file in '%s'\n",
122 if (fputc(t
, fp2
) == EOF
) {
123 fprintf(stderr
, "rdflib: write error\n");
127 return (char)t
; /* return last char read */
130 static int32_t copyint32_t(FILE * fp
, FILE * fp2
)
134 uint8_t *p
= (uint8_t *)&l
;
136 for (i
= 0; i
< 4; i
++) { /* skip magic no */
139 fprintf(stderr
, "rdflib: premature end of file in '%s'\n",
144 if (fputc(t
, fp2
) == EOF
) {
145 fprintf(stderr
, "rdflib: write error\n");
154 int main(int argc
, char **argv
)
156 FILE *fp
, *fp2
= NULL
, *fptmp
;
157 char *p
, buf
[256], c
;
165 if (argc
< 3 || !strncmp(argv
[1], "-h", 2)
166 || !strncmp(argv
[1], "--h", 3)) {
167 fputs(usage
, stdout
);
171 switch (argv
[1][0]) {
172 case 'c': /* create library */
173 fp
= fopen(argv
[2], "wb");
175 fprintf(stderr
, "rdflib: could not open '%s'\n", argv
[2]);
179 fwrite(sig_modname
, 1, strlen(sig_modname
) + 1, fp
);
180 fwrite(rdl_signature
, 1, strlen(rdl_signature
), fp
);
183 fwrite(&l
, sizeof(l
), 1, fp
);
184 fwrite(&t
, 1, l
, fp
);
188 case 'a': /* add module */
190 fprintf(stderr
, "rdflib: required parameter missing\n");
193 fp
= fopen(argv
[2], "ab");
195 fprintf(stderr
, "rdflib: could not open '%s'\n", argv
[2]);
200 fp2
= fopen(argv
[3], "rb");
202 fprintf(stderr
, "rdflib: could not open '%s'\n", argv
[3]);
209 if (fputc(*p
, fp
) == EOF
) {
210 fprintf(stderr
, "rdflib: write error\n");
221 if (fputc(i
, fp
) == EOF
) {
222 fprintf(stderr
, "rdflib: write error\n");
232 fprintf(stderr
, "rdflib: required parameter missing\n");
236 fp
= fopen(argv
[2], "rb");
238 fprintf(stderr
, "rdflib: could not open '%s'\n", argv
[2]);
247 while ((*(p
++) = (char)fgetc(fp
)))
255 if (argv
[1][0] == 'x') {
256 /* check against desired name */
257 if (!strcmp(buf
, argv
[3])) {
258 fp2
= fopen(argv
[4], "wb");
260 fprintf(stderr
, "rdflib: could not open '%s'\n",
267 printf("%-40s ", buf
);
269 /* step over the RDOFF file, extracting type information for
270 * the listing, and copying it if fp2 != NULL */
274 if (argv
[1][0] == 't')
275 for (i
= 0; i
< 6; i
++)
276 printf("%c", copybytes(fp
, fp2
, 1));
278 copybytes(fp
, fp2
, 6);
280 l
= copyint32_t(fp
, fp2
);
282 if (argv
[1][0] == 't')
283 printf(" %"PRId32
" bytes content\n", l
);
285 copybytes(fp
, fp2
, l
);
286 } else if ((c
= copybytes(fp
, fp2
, 6)) >= '2') { /* version 2 or above */
287 l
= copyint32_t(fp
, fp2
);
289 if (argv
[1][0] == 't')
290 printf("RDOFF%c %"PRId32
" bytes content\n", c
, l
);
291 copybytes(fp
, fp2
, l
); /* entire object */
293 if (argv
[1][0] == 't')
296 * version 1 object, so we don't have an object content
299 copybytes(fp
, fp2
, copyint32_t(fp
, fp2
)); /* header */
300 copybytes(fp
, fp2
, copyint32_t(fp
, fp2
)); /* text */
301 copybytes(fp
, fp2
, copyint32_t(fp
, fp2
)); /* data */
310 else if (argv
[1][0] == 'x') {
311 fprintf(stderr
, "rdflib: module '%s' not found in '%s'\n",
317 case 'r': /* replace module */
319 case 'd': /* delete module */
321 fprintf(stderr
, "rdflib: required parameter missing\n");
325 fp
= fopen(argv
[2], "rb");
327 fprintf(stderr
, "rdflib: could not open '%s'\n", argv
[2]);
332 if (argv
[1][0] == 'r') {
333 fp2
= fopen(argv
[4], "rb");
335 fprintf(stderr
, "rdflib: could not open '%s'\n", argv
[4]);
343 fprintf(stderr
, "rdflib: could not open temporary file\n");
348 /* copy library into temporary file */
349 fseek(fp
, 0, SEEK_END
); /* get file length */
351 fseek(fp
, 0, SEEK_SET
);
352 copybytes(fp
, fptmp
, l
);
354 if (freopen(argv
[2], "wb", fp
) == NULL
) {
355 fprintf(stderr
, "rdflib: could not reopen '%s'\n", argv
[2]);
360 while (!feof(fptmp
)) {
363 while ((*(p
++) = (char)fgetc(fptmp
)))
370 /* check against desired name */
371 if (!strcmp(buf
, argv
[3])) {
372 fread(p
= rdbuf
, 1, sizeof(rdbuf
), fptmp
);
373 l
= *(int32_t *)(p
+ 6);
374 fseek(fptmp
, l
, SEEK_CUR
);
377 fwrite(buf
, 1, strlen(buf
) + 1, fp
); /* module name */
378 if ((c
= copybytes(fptmp
, fp
, 6)) >= '2') {
379 l
= copyint32_t(fptmp
, fp
); /* version 2 or above */
380 copybytes(fptmp
, fp
, l
); /* entire object */
385 if (argv
[1][0] == 'r') {
386 /* copy new module into library */
389 if (fputc(*p
, fp
) == EOF
) {
390 fprintf(stderr
, "rdflib: write error\n");
400 if (fputc(i
, fp
) == EOF
) {
401 fprintf(stderr
, "rdflib: write error\n");
408 /* copy rest of library if any */
409 while (!feof(fptmp
)) {
415 if (fputc(i
, fp
) == EOF
) {
416 fprintf(stderr
, "rdflib: write error\n");
426 fprintf(stderr
, "rdflib: command '%c' not recognized\n",