#!/usr/bin/perl -w use strict; use warnings; # script to convert a microsoft .rc DIALOG specification to an ascii rendering of the # control locations # # http://msdn.microsoft.com/en-us/library/aa381043(VS.85).aspx my @a; my @names; sub mark { my ($x, $y, $dx, $dy, $id)= @_; for (my $i= $x ; $i<$x+$dx ; $i++) { for (my $j= $y ; $j<$y+$dy ; $j++) { push @{$a[$i][$j]}, $id; } } } my ($xmax, $ymax); my $id= 1; while (<>) { if (/CONTROL.*,\s*(\w+)\s*,[^,]*,[^,]*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*/ || /(\w+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*/) { my ($name, $x, $y, $dx, $dy)= ($1, $2, $3, $4, $5); mark($x, $y, $dx, $dy, scalar @names); push @names, $name; $xmax = $x+$dx if !defined $xmax || $xmax<$x+$dx; $ymax = $y+$dy if !defined $ymax || $ymax<$y+$dy; } } for (my $j= 0 ; $j<=$ymax ; $j++) { for (my $i= 0 ; $i<=$xmax ; $i++) { if (!defined $a[$i][$j] || @{$a[$i][$j]}==0) { print " "; } elsif (@{$a[$i][$j]}>1) { print "*"; } else { printf("%c", 65+$a[$i][$j][0]); } } print "\n"; } print "\n"; printf("max: %d x %d\n", $xmax, $ymax); for (my $i=0 ; $i<@names ; $i++) { printf("%c %s\n", 65+$i, $names[$i]); }