FreeCalypso > hg > freecalypso-reveng
diff mpffs/cat.c @ 35:ee4c761187cf
mpffs-cat implemented
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sun, 30 Jun 2013 16:55:19 +0000 |
parents | |
children | 8256eec598dd |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpffs/cat.c Sun Jun 30 16:55:19 2013 +0000 @@ -0,0 +1,102 @@ +/* + * This module contains the main function and other code specific to mpffs-cat + */ + +#include <sys/types.h> +#include <ctype.h> +#include <stdio.h> +#include <string.h> +#include <strings.h> +#include <stdlib.h> +#include <unistd.h> +#include "types.h" +#include "struct.h" + +extern char *imgfile; +extern int verbose; + +cat_chunk(chi) + struct chunkinfo *chi; +{ + u8 *dp; + size_t len; + int c; + + dp = chi->start; + len = chi->len; + while (len) { + c = *dp++; + if (!verbose || c >= ' ' && c <= '~' || c == '\n') + putchar(c); + else { + if (c & 0x80) { + putchar('M'); + putchar('-'); + c &= 0x7F; + } + putchar('^'); + if (c == 0x7F) + putchar('?'); + else + putchar(c + '@'); + } + len--; + } +} + +cat_file(headidx) +{ + int ent; + struct objinfo obj; + struct chunkinfo chi; + + obj.entryno = headidx; + get_index_entry(&obj); + if (obj.type != 0xF1) { + fprintf(stderr, + "mpffs-cat: the requested FFS object is not a regular file\n"); + exit(1); + } + validate_chunk(&obj); + size_head_chunk(&obj, &chi); + if (verbose) + printf("\n--- file content:\n"); + cat_chunk(&chi); + for (ent = obj.descend; ent != 0xFFFF; ent = obj.descend) { + obj.entryno = ent; + get_index_entry(&obj); + if (obj.type != 0xF4) { + fprintf(stderr, + "file continuation object at index %x: type %02X != expected F4\n", + ent, obj.type); + exit(1); + } + validate_chunk(&obj); + size_extra_chunk(&obj, &chi); + cat_chunk(&chi); + } + if (verbose) + printf("\n-- end quote --\n"); +} + +usage() +{ + fprintf(stderr, "usage: mpffs-cat [options] ffs-image pathname\n"); + exit(1); +} + +main(argc, argv) + char **argv; +{ + extern int optind; + int idx; + + parse_cmdline_options(argc, argv); + if (argc - optind != 2) + usage(); + imgfile = argv[optind]; + preliminaries(); + idx = find_pathname(argv[optind+1]); + cat_file(idx); + exit(0); +}