📄 dump.c
字号:
length == -1 ? need : MIN(length, need), stdin); if (!n) { if (ferror(stdin)) { perror_msg("%s", _argv[-1]); } ateof = 1; continue; } ateof = 0; if (length != -1) { length -= n; } if (!(need -= n)) { if (vflag == ALL || vflag == FIRST || bcmp(curp, savp, blocksize)) { if (vflag == DUP || vflag == FIRST) { vflag = WAIT; } return(curp); } if (vflag == WAIT) { printf("*\n"); } vflag = DUP; address = savaddress += blocksize; need = blocksize; nread = 0; } else { nread += n; } }}static void bpad(PR *pr){ register char *p1, *p2; /* * remove all conversion flags; '-' is the only one valid * with %s, and it's not useful here. */ pr->flags = F_BPAD; *pr->cchar = 's'; for (p1 = pr->fmt; *p1 != '%'; ++p1); for (p2 = ++p1; *p1 && index(" -0+#", *p1); ++p1); while ((*p2++ = *p1++) != 0) ;}void conv_c(PR *pr, u_char *p){ char buf[10], *str; switch(*p) { case '\0': str = "\\0"; goto strpr; /* case '\a': */ case '\007': str = "\\a"; goto strpr; case '\b': str = "\\b"; goto strpr; case '\f': str = "\\f"; goto strpr; case '\n': str = "\\n"; goto strpr; case '\r': str = "\\r"; goto strpr; case '\t': str = "\\t"; goto strpr; case '\v': str = "\\v"; goto strpr; default: break; } if (isprint(*p)) { *pr->cchar = 'c'; (void)printf(pr->fmt, *p); } else { sprintf(str = buf, "%03o", (int)*p);strpr: *pr->cchar = 's'; printf(pr->fmt, str); }}void conv_u(PR *pr, u_char *p){ static char *list[] = { "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel", "bs", "ht", "lf", "vt", "ff", "cr", "so", "si", "dle", "dcl", "dc2", "dc3", "dc4", "nak", "syn", "etb", "can", "em", "sub", "esc", "fs", "gs", "rs", "us", }; /* od used nl, not lf */ if (*p <= 0x1f) { *pr->cchar = 's'; printf(pr->fmt, list[*p]); } else if (*p == 0x7f) { *pr->cchar = 's'; printf(pr->fmt, "del"); } else if (isprint(*p)) { *pr->cchar = 'c'; printf(pr->fmt, *p); } else { *pr->cchar = 'x'; printf(pr->fmt, (int)*p); }}void display(void){// extern FU *endfu; register FS *fs; register FU *fu; register PR *pr; register int cnt; register u_char *bp;// off_t saveaddress; u_char savech = 0, *savebp; while ((bp = get()) != NULL) { for (fs = fshead, savebp = bp, saveaddress = address; fs; fs = fs->nextfs, bp = savebp, address = saveaddress) { for (fu = fs->nextfu; fu; fu = fu->nextfu) { if (fu->flags & F_IGNORE) { break; } for (cnt = fu->reps; cnt; --cnt) { for (pr = fu->nextpr; pr; address += pr->bcnt, bp += pr->bcnt, pr = pr->nextpr) { if (eaddress && address >= eaddress && !(pr->flags&(F_TEXT|F_BPAD))) { bpad(pr); } if (cnt == 1 && pr->nospace) { savech = *pr->nospace; *pr->nospace = '\0'; }// PRINT; switch(pr->flags) { case F_ADDRESS: printf(pr->fmt, address); break; case F_BPAD: printf(pr->fmt, ""); break; case F_C: conv_c(pr, bp); break; case F_CHAR: printf(pr->fmt, *bp); break; case F_DBL: { double dval; float fval; switch(pr->bcnt) { case 4: bcopy((char *)bp, (char *)&fval, sizeof(fval)); printf(pr->fmt, fval); break; case 8: bcopy((char *)bp, (char *)&dval, sizeof(dval)); printf(pr->fmt, dval); break; } break; } case F_INT: { int ival; short sval; switch(pr->bcnt) { case 1: printf(pr->fmt, (int)*bp); break; case 2: bcopy((char *)bp, (char *)&sval, sizeof(sval)); printf(pr->fmt, (int)sval); break; case 4: bcopy((char *)bp, (char *)&ival, sizeof(ival)); printf(pr->fmt, ival); break; } break; } case F_P: printf(pr->fmt, isprint(*bp) ? *bp : '.'); break; case F_STR: printf(pr->fmt, (char *)bp); break; case F_TEXT: printf(pr->fmt); break; case F_U: conv_u(pr, bp); break; case F_UINT: { u_int ival; u_short sval; switch(pr->bcnt) { case 1: printf(pr->fmt, (u_int)*bp); break; case 2: bcopy((char *)bp, (char *)&sval, sizeof(sval)); printf(pr->fmt, (u_int)sval); break; case 4: bcopy((char *)bp, (char *)&ival, sizeof(ival)); printf(pr->fmt, ival); break; } break; } } if (cnt == 1 && pr->nospace) { *pr->nospace = savech; } } } } } } if (endfu) { /* * if eaddress not set, error or file size was multiple of * blocksize, and no partial block ever found. */ if (!eaddress) { if (!address) { return; } eaddress = address; } for (pr = endfu->nextpr; pr; pr = pr->nextpr) { switch(pr->flags) { case F_ADDRESS: (void)printf(pr->fmt, eaddress); break; case F_TEXT: (void)printf(pr->fmt); break; } } }}int dump(char **argv){ register FS *tfs; /* figure out the data block size */ for (blocksize = 0, tfs = fshead; tfs; tfs = tfs->nextfs) { tfs->bcnt = size(tfs); if (blocksize < tfs->bcnt) { blocksize = tfs->bcnt; } } /* rewrite the rules, do syntax checking */ for (tfs = fshead; tfs; tfs = tfs->nextfs) { rewrite(tfs); } next(argv); display(); return(exitval);}void add(char *fmt){ register char *p; register char *p1; register char *p2; static FS **nextfs; FS *tfs; FU *tfu, **nextfu; char *savep; /* start new linked list of format units */ /* NOSTRICT */ tfs = (FS *)xmalloc(sizeof(FS)); if (!fshead) { fshead = tfs; } else { *nextfs = tfs; } nextfs = &tfs->nextfs; nextfu = &tfs->nextfu; /* take the format string and break it up into format units */ for (p = fmt;;) { /* skip leading white space */ for (; isspace(*p); ++p); if (!*p) { break; } /* allocate a new format unit and link it in */ /* NOSTRICT */ tfu = (FU *)xmalloc(sizeof(FU)); *nextfu = tfu; nextfu = &tfu->nextfu; tfu->reps = 1; /* if leading digit, repetition count */ if (isdigit(*p)) { for (savep = p; isdigit(*p); ++p); if (!isspace(*p) && *p != '/') { error_msg_and_die("hexdump: bad format {%s}", fmt); } /* may overwrite either white space or slash */ tfu->reps = atoi(savep); tfu->flags = F_SETREP; /* skip trailing white space */ for (++p; isspace(*p); ++p); } /* skip slash and trailing white space */ if (*p == '/') { while (isspace(*++p)); } /* byte count */ if (isdigit(*p)) { for (savep = p; isdigit(*p); ++p); if (!isspace(*p)) { error_msg_and_die("hexdump: bad format {%s}", fmt); } tfu->bcnt = atoi(savep); /* skip trailing white space */ for (++p; isspace(*p); ++p); } /* format */ if (*p != '"') { error_msg_and_die("hexdump: bad format {%s}", fmt); } for (savep = ++p; *p != '"';) { if (*p++ == 0) { error_msg_and_die("hexdump: bad format {%s}", fmt); } } if (!(tfu->fmt = malloc(p - savep + 1))) { perror_msg_and_die("hexdump"); } strncpy(tfu->fmt, savep, p - savep); tfu->fmt[p - savep] = '\0';// escape(tfu->fmt); p1 = tfu->fmt; /* alphabetic escape sequences have to be done in place */ for (p2 = p1;; ++p1, ++p2) { if (!*p1) { *p2 = *p1; break; } if (*p1 == '\\') { switch(*++p1) { case 'a': /* *p2 = '\a'; */ *p2 = '\007'; break; case 'b': *p2 = '\b'; break; case 'f': *p2 = '\f'; break; case 'n': *p2 = '\n'; break; case 'r': *p2 = '\r'; break; case 't': *p2 = '\t'; break; case 'v': *p2 = '\v'; break; default: *p2 = *p1; break; } } } p++; }}/* * 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. 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. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -