⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dump.c

📁 这是一个SIGMA方案的PMP播放器的UCLINUX程序,可播放DVD,VCD,CD MP3...有很好的参考价值.
💻 C
📖 第 1 页 / 共 2 页
字号:
		    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 + -