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

📄 display.c

📁 在Linux内核从2.4升级到2.6时需要升级的软件包
💻 C
字号:
/* *   Copyright (c) International Business Machines Corp., 2000-2002 * *   This program is free software;  you can redistribute it and/or modify *   it under the terms of the GNU General Public License as published by *   the Free Software Foundation; either version 2 of the License, or *   (at your option) any later version. * *   This program is distributed in the hope that it will be useful, *   but WITHOUT ANY WARRANTY;  without even the implied warranty of *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See *   the GNU General Public License for more details. * *   You should have received a copy of the GNU General Public License *   along with this program;  if not, write to the Free Software *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *//* *   FUNCTION: Displays data in a variety of formats */#include <config.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include "xpeek.h"#include "jfs_endian.h"#include "jfs_xtree.h"#include "devices.h"static void display_hex(char *, unsigned, unsigned);extern unsigned type_jfs;void display(){	int64_t addr;	int64_t block;	char *buffer;	char cmdline[512];	unsigned data_size;	int format = 'a';	int64_t len;	unsigned length = 0;	unsigned offset = 0;	char *token;	token = strtok(0, " 	\n");	if (token == 0) {		fputs("display: Please enter: block [offset [format [count]]]\ndisplay> ", stdout);		fgets(cmdline, 512, stdin);		token = strtok(cmdline, " 	\n");		if (token == 0)			return;	}	errno = 0;	block = strtoull(token, 0, 0);	if (block == 0 && errno) {		fputs("display: invalid block\n\n", stderr);		return;	}	if ((token = strtok(0, " 	\n"))) {		offset = strtoul(token, 0, 16);		if (offset == 0 && errno) {			fputs("display: invalid offset\n\n", stderr);			return;		}	}	if ((token = strtok(0, " 	\n")))		format = token[0];	if ((token = strtok(0, " 	\n"))) {		length = strtoul(token, 0, 0);		if (length == 0 && errno) {			fputs("display: invalid length\n\n", stderr);			return;		}	}	if (strtok(0, " 	\n")) {		fputs("display: Too many arguments\n\n", stderr);		return;	}	switch (format) {	case 'a':		data_size = 1;		if (length == 0)			length = bsize;		break;	case 'i':		data_size = sizeof (struct dinode);		if (length == 0)			length = 1;		break;	case 'I':		data_size = sizeof (struct iag);		if (length == 0)			length = 1;		break;	case 's':		data_size = sizeof (struct superblock);		if (length == 0)			length = 1;		break;	case 'x':		data_size = 4;		if (length == 0)			length = bsize / 4;		break;	case 'X':		data_size = sizeof (xad_t);		if (length == 0)			length = 1;		break;	default:		fputs("display:  invalid format\n\n", stderr);		return;	}	addr = block << l2bsize;	len = ((length * data_size) + offset + bsize - 1) & (~(bsize - 1));	buffer = malloc(len);	if (buffer == 0) {		fputs("display: error calling malloc\n\n", stderr);		return;	}	if (ujfs_rw_diskblocks(fp, addr, len, buffer, GET)) {		fputs("display: ujfs_rw_diskblocks failed\n\n", stderr);		free(buffer);		return;	}	printf("Block: %lld     Real Address 0x%llx\n", (long long) block, (long long) addr);	switch (format) {	case 'a':	case 'x':		display_hex(&buffer[offset], length, offset);		break;	case 'i':		{			int i;			struct dinode *inode = (struct dinode *) &buffer[offset];			for (i = 0; i < length; i++, inode++) {				/* swap if on big endian machine */				ujfs_swap_dinode(inode, GET, type_jfs);				display_inode(inode);				if (more())					return;			}		}		break;	case 'I':		{			int i;			struct iag *iag = (struct iag *) & buffer[offset];			for (i = 0; i < length; i++, iag++) {				/* swap if on big endian machine */				ujfs_swap_iag(iag);				display_iag(iag);				if (more())					return;			}		}		break;	case 's':		/* swap if on big endian machine */		ujfs_swap_superblock((struct superblock *) &buffer[offset]);		if (display_super((struct superblock *) &buffer[offset]) == XPEEK_CHANGED) {			/* swap if on big endian machine */			ujfs_swap_superblock((struct superblock *) &buffer[offset]);			if (ujfs_rw_diskblocks(fp, addr, len, buffer, PUT))				fputs("Display:  Error writing superblock!\n", stderr);		}		break;	default:		fputs("display:  specified format not yet supported\n\n", stderr);		break;	}	free(buffer);	return;}/* *	display_hex: display region in hex/ascii */static void display_hex(char *addr, unsigned length, unsigned offset){	uint8_t hextext[37];	uint8_t asciitxt[17];	uint8_t *x = (uint8_t *) addr, x1, x2;	int i, j, k, l;	hextext[36] = '\0';	asciitxt[16] = '\0';	/* null end of string */	l = 0;	for (i = 1; i <= ((length + 15) / 16); i++) {		if (i > 1 && ((i - 1) % 16) == 0)			if (more())				break;		/* print address/offset */		printf("%08x: ", offset + l);		/* print 16 bytes per line */		for (j = 0, k = 0; j < 16; j++, x++, l++) {			if ((j % 4) == 0)				hextext[k++] = ' ';			if (l < length) {				hextext[k++] = ((x1 = ((*x & 0xf0) >> 4)) < 10)				    ? ('0' + x1) : ('A' + x1 - 10);				hextext[k++] = ((x2 = (*x & 0x0f)) < 10)				    ? ('0' + x2) : ('A' + x2 - 10);				asciitxt[j] = ((*x < 0x20) || (*x >= 0x7f)) ? '.' : *x;			} else {	/* byte not in range */				hextext[k++] = ' ';				hextext[k++] = ' ';				asciitxt[j] = '.';			}		}		printf("%s   |%s|\n", hextext, asciitxt);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -