2006-12-06 17:25:32 -06:00
|
|
|
/*
|
|
|
|
* Copyright (c) 1989 The Regents of the University of California.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
|
|
* must display the following acknowledgement:
|
|
|
|
* This product includes software developed by the University of
|
|
|
|
* California, Berkeley and its contributors.
|
|
|
|
* 4. Neither the name of the University nor the names of its contributors
|
|
|
|
* may be used to endorse or promote products derived from this software
|
|
|
|
* without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
2013-01-26 10:07:51 -06:00
|
|
|
/* 1999-02-22 Arkadiusz Miśkiewicz <misiek@pld.ORG.PL>
|
2006-12-06 17:25:39 -06:00
|
|
|
* - added Native Language Support
|
|
|
|
*/
|
|
|
|
|
2006-12-06 17:25:32 -06:00
|
|
|
#include <sys/types.h>
|
|
|
|
#include <stdio.h>
|
2006-12-06 17:25:43 -06:00
|
|
|
#include <string.h>
|
2011-02-12 14:55:53 -06:00
|
|
|
#include <stdlib.h>
|
2006-12-06 17:25:32 -06:00
|
|
|
#include "hexdump.h"
|
2011-04-12 05:58:17 -05:00
|
|
|
|
2013-09-23 08:39:09 -05:00
|
|
|
#include "list.h"
|
2006-12-06 17:25:39 -06:00
|
|
|
#include "nls.h"
|
2011-04-12 05:58:17 -05:00
|
|
|
#include "c.h"
|
2012-04-04 12:39:15 -05:00
|
|
|
#include "closestream.h"
|
2006-12-06 17:25:32 -06:00
|
|
|
|
2013-09-23 08:39:09 -05:00
|
|
|
struct list_head fshead; /* head of format strings */
|
2012-05-23 03:20:19 -05:00
|
|
|
ssize_t blocksize; /* data block size */
|
2013-09-08 11:09:09 -05:00
|
|
|
int exitval; /* final exit value */
|
2012-03-21 13:35:22 -05:00
|
|
|
ssize_t length = -1; /* max bytes to read */
|
2013-09-23 08:39:38 -05:00
|
|
|
void hex_free(void);
|
2006-12-06 17:25:32 -06:00
|
|
|
|
2006-12-06 17:25:43 -06:00
|
|
|
int main(int argc, char **argv)
|
2006-12-06 17:25:32 -06:00
|
|
|
{
|
2013-09-23 08:39:09 -05:00
|
|
|
struct list_head *p;
|
2006-12-06 17:25:53 -06:00
|
|
|
FS *tfs;
|
2013-09-23 08:39:09 -05:00
|
|
|
char *c;
|
|
|
|
INIT_LIST_HEAD(&fshead);
|
2006-12-06 17:25:32 -06:00
|
|
|
|
2006-12-06 17:25:39 -06:00
|
|
|
setlocale(LC_ALL, "");
|
|
|
|
bindtextdomain(PACKAGE, LOCALEDIR);
|
|
|
|
textdomain(PACKAGE);
|
2012-04-04 12:39:15 -05:00
|
|
|
atexit(close_stdout);
|
2006-12-06 17:25:39 -06:00
|
|
|
|
2013-09-23 08:39:09 -05:00
|
|
|
if (!(c = strrchr(argv[0], 'o')) || strcmp(c, "od")) {
|
2013-09-23 08:39:22 -05:00
|
|
|
argv += newsyntax(argc, argv);
|
2011-02-12 14:55:53 -06:00
|
|
|
} else
|
|
|
|
errx(EXIT_FAILURE, _("calling hexdump as od has been deprecated "
|
|
|
|
"in favour to GNU coreutils od."));
|
2006-12-06 17:25:32 -06:00
|
|
|
|
|
|
|
/* figure out the data block size */
|
2013-09-23 08:39:09 -05:00
|
|
|
blocksize = 0;
|
|
|
|
list_for_each(p, &fshead) {
|
2013-09-23 08:39:20 -05:00
|
|
|
tfs = list_entry(p, FS, fslist);
|
2013-09-23 08:39:09 -05:00
|
|
|
if ((tfs->bcnt = block_size(tfs)) > blocksize)
|
2006-12-06 17:25:32 -06:00
|
|
|
blocksize = tfs->bcnt;
|
|
|
|
}
|
2013-09-23 08:39:09 -05:00
|
|
|
|
2006-12-06 17:25:32 -06:00
|
|
|
/* rewrite the rules, do syntax checking */
|
2013-09-23 08:39:18 -05:00
|
|
|
list_for_each(p, &fshead)
|
2013-09-23 08:39:20 -05:00
|
|
|
rewrite(list_entry(p, FS, fslist));
|
2006-12-06 17:25:32 -06:00
|
|
|
|
2013-09-23 08:39:10 -05:00
|
|
|
next(argv);
|
2006-12-06 17:25:32 -06:00
|
|
|
display();
|
2013-09-23 08:39:38 -05:00
|
|
|
hex_free();
|
2006-12-06 17:25:34 -06:00
|
|
|
return exitval;
|
2006-12-06 17:25:32 -06:00
|
|
|
}
|
2013-09-23 08:39:38 -05:00
|
|
|
|
|
|
|
void hex_free(void)
|
|
|
|
{
|
|
|
|
struct list_head *p, *pn, *q, *qn, *r, *rn;
|
|
|
|
FS *fs;
|
|
|
|
FU *fu;
|
|
|
|
PR *pr;
|
|
|
|
list_for_each_safe(p, pn, &fshead) {
|
|
|
|
fs = list_entry(p, FS, fslist);
|
|
|
|
list_for_each_safe(q, qn, &fs->fulist) {
|
|
|
|
fu = list_entry(q, FU, fulist);
|
|
|
|
list_for_each_safe(r, rn, &fu->prlist) {
|
|
|
|
pr = list_entry(r, PR, prlist);
|
|
|
|
free(pr->fmt);
|
|
|
|
free(pr);
|
|
|
|
}
|
|
|
|
free(fu->fmt);
|
|
|
|
free(fu);
|
|
|
|
}
|
|
|
|
free(fs);
|
|
|
|
}
|
|
|
|
}
|