Pull up dumpe2fs cleanup patch from the experimental branch.

diff --git a/misc/ChangeLog b/misc/ChangeLog
index 3c6d649..1b95361 100644
--- a/misc/ChangeLog
+++ b/misc/ChangeLog
@@ -1,3 +1,9 @@
+2001-12-02  Theodore Tso  <tytso@valinux.com>
+
+	* dumpe2fs.c: Don't print the offset to the bitmap and inode table
+		if it's negative.  Also did some generalized code clean up
+		to slim it down the support of the -x option.
+
 2001-11-24  Theodore Tso  <tytso@valinux.com>
 
 	* e2image.8.in: Fix cut-and-paste typo (Addresses Debian bug
diff --git a/misc/dumpe2fs.c b/misc/dumpe2fs.c
index 0f23ff1..87e563f 100644
--- a/misc/dumpe2fs.c
+++ b/misc/dumpe2fs.c
@@ -45,7 +45,7 @@
 
 const char * program_name = "dumpe2fs";
 char * device_name = NULL;
-int opt_hex = 0;
+char *num_format = "%lu";
 
 static void usage(void)
 {
@@ -61,23 +61,19 @@
 	unsigned long i;
 	unsigned long j;
 
+	offset += group * nbytes;
 	for (i = 0; i < nbytes; i++)
 		if (!in_use (bitmap, i))
 		{
 			if (p)
 				printf (", ");
-			if (i == nbytes - 1 || in_use (bitmap, i + 1))
-				printf (opt_hex ? "0x%04x" : "%lu",
-					group * nbytes + i + offset);
-			else
-			{
-				for (j = i; j < nbytes && !in_use (bitmap, j);
-				     j++)
-					;
-				printf (opt_hex ? "0x%04lx-0x%04lx" :
-					"%lu-%lu", group * nbytes + i + offset,
-					group * nbytes + (j - 1) + offset);
-				i = j - 1;
+			printf (num_format, i + offset);
+			for (j = i; j < nbytes && !in_use (bitmap, j); j++)
+				;
+			if (--j != i) {
+				fputc('-', stdout);
+				printf(num_format, j + offset);
+				i = j;
 			}
 			p = 1;
 		}
@@ -86,6 +82,7 @@
 static void list_desc (ext2_filsys fs)
 {
 	unsigned long i;
+	long diff;
 	blk_t	group_blk, next_blk;
 	char * block_bitmap = fs->block_map->bitmap;
 	char * inode_bitmap = fs->inode_map->bitmap;
@@ -103,50 +100,57 @@
 			     EXT2_DESC_PER_BLOCK(fs->super) - 1) /
 			    EXT2_DESC_PER_BLOCK(fs->super);
 
-	printf ("\n");
+	fputc('\n', stdout);
 	group_blk = fs->super->s_first_data_block;
 	for (i = 0; i < fs->group_desc_count; i++) {
 		next_blk = group_blk + fs->super->s_blocks_per_group;
 		if (next_blk > fs->super->s_blocks_count)
 			next_blk = fs->super->s_blocks_count;
-		printf (opt_hex ? _("Group %lu: (Blocks 0x%04x -- 0x%04x)\n"):
-			 _("Group %lu: (Blocks %u -- %u)\n"), i,
-			group_blk, next_blk -1 );
-		if (ext2fs_bg_has_super (fs, i))
-			printf (opt_hex ? _("  %s Superblock at 0x%04x,"
-				"  Group Descriptors at 0x%04x-0x%04x\n"):
-				_("  %s Superblock at %u,"
-				"  Group Descriptors at %u-%u\n"),
-				i == 0 ? _("Primary") : _("Backup"),
-				group_blk, group_blk + 1,
-				group_blk + group_desc_blocks);
-		printf (opt_hex ? _("  Block bitmap at 0x%04x (+%d), "
-			"Inode bitmap at 0x%04x (+%d)\n  "
-			"Inode table at 0x%04x-0x%04x (+%d)\n"):
-		        _("  Block bitmap at %u (+%d), "
-			"Inode bitmap at %u (+%d)\n  "
-			"Inode table at %u-%u (+%d)\n"),
-			fs->group_desc[i].bg_block_bitmap,
-			fs->group_desc[i].bg_block_bitmap - group_blk,
-			fs->group_desc[i].bg_inode_bitmap,
-			fs->group_desc[i].bg_inode_bitmap - group_blk,
-			fs->group_desc[i].bg_inode_table,
-			fs->group_desc[i].bg_inode_table +
-				inode_blocks_per_group - 1,
-			fs->group_desc[i].bg_inode_table - group_blk);
-		printf (_("  %d free blocks, %d free inodes, %d directories\n"),
+		printf (_("Group %lu: (Blocks "), i);
+		printf(num_format, group_blk);
+		fputc('-', stdout);
+		printf(num_format, next_blk - 1);
+		fputs(")\n", stdout);
+		if (ext2fs_bg_has_super (fs, i)) {
+			printf (_("  %s Superblock at "),
+				i == 0 ? _("Primary") : _("Backup"));
+			printf(num_format, group_blk);
+			printf(_(",  Group Descriptors at "));
+			printf(num_format, group_blk+1);
+			fputc('-', stdout);
+			printf(num_format, group_blk + group_desc_blocks);
+			fputc('\n', stdout);
+		}
+		fputs(_("  Block bitmap at "), stdout);
+		printf(num_format, fs->group_desc[i].bg_block_bitmap);
+		diff = fs->group_desc[i].bg_block_bitmap - group_blk;
+		if (diff >= 0)
+			printf(" (+%d)", diff);
+		fputs(_(", Inode bitmap at "), stdout);
+		printf(num_format, fs->group_desc[i].bg_inode_bitmap);
+		diff = fs->group_desc[i].bg_inode_bitmap - group_blk;
+		if (diff >= 0)
+			printf(" (+%d)", diff);
+		fputs(_("\n  Inode table at "), stdout);
+		printf(num_format, fs->group_desc[i].bg_inode_table);
+		fputc('-', stdout);
+		printf(num_format, fs->group_desc[i].bg_inode_table +
+		       inode_blocks_per_group - 1);
+		diff = fs->group_desc[i].bg_inode_table - group_blk;
+		if (diff > 0)
+			printf(" (+%d)", diff);
+		printf (_("\n  %d free blocks, %d free inodes, "
+			  "%d directories\n  Free blocks: "),
 			fs->group_desc[i].bg_free_blocks_count,
 			fs->group_desc[i].bg_free_inodes_count,
 			fs->group_desc[i].bg_used_dirs_count);
-		printf (_("  Free blocks: "));
 		print_free (i, block_bitmap, fs->super->s_blocks_per_group,
 			    fs->super->s_first_data_block);
-		block_bitmap += fs->super->s_blocks_per_group / 8;
-		printf ("\n");
-		printf (_("  Free inodes: "));
+		fputs(_("\n  Free inodes: "), stdout);
 		print_free (i, inode_bitmap, fs->super->s_inodes_per_group, 1);
+		fputc('\n', stdout);
+		block_bitmap += fs->super->s_blocks_per_group / 8;
 		inode_bitmap += fs->super->s_inodes_per_group / 8;
-		printf ("\n");
 		group_blk = next_blk;
 	}
 }
@@ -174,7 +178,7 @@
 	while (ext2fs_badblocks_list_iterate(bb_iter, &blk))
 		printf(", %d", blk);
 	ext2fs_badblocks_list_iterate_end(bb_iter);
-	printf("\n");
+	fputc('\n', stdout);
 }
 
 static void dump_bad_blocks(ext2_filsys fs)
@@ -223,20 +227,21 @@
 		exit(1);
 	}
 
-	fputs("\n", stdout);
-	printf("Journal block size:       %d\n", ntohl(jsb->s_blocksize));
-	printf("Journal length:           %d\n", ntohl(jsb->s_maxlen));
-	printf("Journal first block:      %d\n", ntohl(jsb->s_first));
-	printf("Journal sequence:         0x%08x\n", ntohl(jsb->s_sequence));
-	printf("Journal start:            %d\n", ntohl(jsb->s_start));
-	printf("Journal number of users:  %d\n", ntohl(jsb->s_nr_users));
+	printf(_("\nJournal block size:       %d\n"
+		 "Journal length:           %d\n"
+		 "Journal first block:      %d\n"
+		 "Journal sequence:         0x%08x\n"
+		 "Journal start:            %d\n"
+		 "Journal number of users:  %d\n"),
+	       ntohl(jsb->s_blocksize),  ntohl(jsb->s_maxlen),
+	       ntohl(jsb->s_first), ntohl(jsb->s_sequence),
+	       ntohl(jsb->s_start), ntohl(jsb->s_nr_users));
+
 	for (i=0; i < ntohl(jsb->s_nr_users); i++) {
-		if (i)
-			printf("                          ");
-		else
-			printf("Journal users:            ");
 		uuid_unparse(&jsb->s_users[i*16], str);
-		printf("%s\n", str);
+		printf(i ? "                          %s\n"
+		       : "Journal users:            %s\n",
+		       str);
 	}
 }
 
@@ -293,7 +298,7 @@
 				error_message(EXT2_ET_BASE));
 			exit(0);
 		case 'x':
-			opt_hex=1;
+			num_format = "0x%04x";
 			break;
 		default:
 			usage();