150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#!/bin/sh
250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#$Id$
350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o# Create Adobe-PostScript file that graphically displays the output of
450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o# dumpe2fs(8). Use "dumpe2fs | dconf" to create a PostScript file on stdout.
550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o# Developed and tested for Linux 1.0.
650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o# Copyright (c) 1994
750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o# Ulrich Windl
850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o# ALte Regensburger Strasse 11a
950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o# D-93149 Nittenau, Germany
1050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o# <Ulrich.Windl@rz.uni-regensburg.de>
1150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oSELF=`basename $0`
1250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oAWKFILE=/tmp/${SELF}.awk
1350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oTEMPFILE=/tmp/${SELF}.tmp
1450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oecho '
1550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oBEGIN {
1650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	print "B"
1750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
1850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/^Inode count:/ {
1950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	ic=$3; next
2050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
2150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/^Block count:/ {
2250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	bc=$3; next
2350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
2450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/^First block:/ {
2550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	fb=$3; next
2650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
2750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/^Block size:/ {
2850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	bs=$3; next
2950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
3050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/^Blocks per group:/ {
3150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	bpg=$4
3250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	printf("BC %d\n", bpg)
3350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	printf("GC %d\n", (bc + bpg - 1) / bpg)
3450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	next
3550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
3650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/^Inodes per group:/ {
3750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	ipg=$4; next
3850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
3950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/^Last write time:/ {
4050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	lwtime=$0; gsub("Last write time:[ ]+", "", lwtime)
4150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	printf("T %s\n", lwtime)
4250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	next
4350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
4450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/^Group [0-9]+:/ {
4550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	group=$2; gsub(":", "", group)
4650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	block=""
4750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	group_start=group*bpg+fb
4850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	group_end=group_start+bpg
4950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	printf("G %d : %d - %d\n", group, group_start, group_end)
5050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	next
5150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
5250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/^[ ]+Free blocks: / {
5350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	for ( i=3; i < NF; ++i ) {
5450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		block=$i; gsub(",", "", block)
5550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		if ( index(block, "-") == 0 ) block=block "-" block
5650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		pos=index(block, "-")
5750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		printf("FB %d-%d\n",
5850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		       substr(block, 0, pos) - group_start,
5950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o		       substr(block, pos + 1) - group_start)
6050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	}
6150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	if ( block == "" ) printf("Group %d is full\n", group)
6250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	print "----"
6350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	next
6450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
6550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oEND {
6650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	printf("E %s\n", lwtime)
6750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}' >$AWKFILE
6850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oawk -f $AWKFILE $* >$TEMPFILE
6950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oecho '
7050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oBEGIN {
7150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o        printf("%%!PS-Adobe\n")
7250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o        printf("%%%%BoundingBox: 0 0 1 1\n")
7350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	printf("/rect {/y2 exch def /x2 exch def /y1 exch def /x1 exch def\n")
7450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	printf("       newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto\n")
7550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	printf("       x1 y2 lineto closepath} def\n")
7650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	printf("/fb {rect gsave 1.0 setgray fill grestore} def\n")
7750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	printf("/dg {rect gsave gsave 0.0 setgray fill grestore\n")
7850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	printf("     0.5 setgray stroke grestore} def\n")
7950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	printf("/textxy {moveto show} bind def\n")
8050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	printf("0.0001 setlinewidth\n")
8150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
8250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o$1 == "GC" && NF == 2 {
8350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	number_of_groups=$2
8450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	printf("/Times-Roman findfont %g scalefont setfont\n",
8550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	       1.0 / number_of_groups)
8650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	next
8750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
8850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o$1 == "BC" && NF == 2 {
8950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	blocks_per_group=$2; next
9050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
9150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o$1 == "T" && NF > 1 {
9250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	printf("(%s) %g %g textxy\n",
9350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	       substr($0, 2), 0, 1.02)
9450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	next
9550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
9650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o$1 == "G" && NF == 6 && $3 == ":" && $5 == "-" {
9750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	group_index=$2
9850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	gs=$4
9950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	ge=$6
10050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	height=1.0 / number_of_groups
10150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	vstart=group_index * height
10250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	printf("%% group %d of %d:\n0 %g 1 %g dg\n",
10350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	       group_index, number_of_groups, vstart, vstart + height)
10450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	printf("(Group %s) 1.02 %g textxy\n", group_index, vstart)
10550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	next
10650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
10750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o$1 == "FB" && NF == 2 {
10850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	pos = index($2, "-")
10950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	printf("%% hole %s\n%g %g %g %g fb\n",
11050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	       $2, substr($2, 0, pos) / blocks_per_group, vstart,
11150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	       (substr($2, pos + 1) + 1) / blocks_per_group, vstart + height)
11250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o	next
11350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
11450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oEND {
11550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o    	printf("%%%%EOF\n")
11650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o}
11750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o' >$AWKFILE
11850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oawk -f $AWKFILE $TEMPFILE
119