xref: /netbsd-src/external/bsd/less/dist/lesstest/maketest (revision e4a6e799a67c2028562d75b4e61407b22434aa36)
1*e4a6e799Ssimonb#!/usr/bin/env perl
2*e4a6e799Ssimonbuse strict;
3*e4a6e799Ssimonb
4*e4a6e799Ssimonb# Create a test file.
5*e4a6e799Ssimonb# Wrapper for lesstest, using most common options.
6*e4a6e799Ssimonbmy $usage = "usage: maketest [-o lt-file] [-l less.exe] [-s lt_screen] [-t lesstest] [-w width] [-h height] [-O lesstest-opts] [-S lt_screen-opts] textfile\n";
7*e4a6e799Ssimonb
8*e4a6e799Ssimonbuse Getopt::Std;
9*e4a6e799Ssimonb
10*e4a6e799Ssimonbexit main();
11*e4a6e799Ssimonbsub main {
12*e4a6e799Ssimonb	my %opt;
13*e4a6e799Ssimonb	die $usage if not getopts('h:l:o:O:s:S:t:w:v', \%opt);
14*e4a6e799Ssimonb	my $textfile = shift @ARGV;
15*e4a6e799Ssimonb	die $usage if not defined $textfile;
16*e4a6e799Ssimonb	my $lesstest  = ($opt{t} or "./lesstest");
17*e4a6e799Ssimonb	my $lt_screen = ($opt{s} or "./lt_screen");
18*e4a6e799Ssimonb	my $less      = ($opt{l} or "../obj/less");
19*e4a6e799Ssimonb	my $lines     = ($opt{h} or $ENV{LINES}-1);
20*e4a6e799Ssimonb	my $columns   = ($opt{w} or $ENV{COLUMNS}-1);
21*e4a6e799Ssimonb	my $verbose   = ($opt{v} or 0);
22*e4a6e799Ssimonb	my $lt_opts   = opts($opt{O} or "");
23*e4a6e799Ssimonb	my $ls_opts   = opts($opt{S} or "");
24*e4a6e799Ssimonb	my $ltfile    = $opt{o};
25*e4a6e799Ssimonb	my $linked = 0;
26*e4a6e799Ssimonb	if (not less_is_test($less)) {
27*e4a6e799Ssimonb		print "$less is not compiled to support LESSTEST\n";
28*e4a6e799Ssimonb		my ($dir) = $less =~ m|^(.*)/[^/]*$|;
29*e4a6e799Ssimonb		print "To fix: cd $dir; make clean; make LESSTEST=1\n";
30*e4a6e799Ssimonb		exit 1;
31*e4a6e799Ssimonb	}
32*e4a6e799Ssimonb	if ($textfile =~ m|/|) {
33*e4a6e799Ssimonb		my ($basename) = $textfile =~ m|^.*/([^/]+)$|;
34*e4a6e799Ssimonb		if (not link $textfile, $basename) {
35*e4a6e799Ssimonb			print "cannot link $textfile to $basename: $!\n";
36*e4a6e799Ssimonb			exit 1;
37*e4a6e799Ssimonb		}
38*e4a6e799Ssimonb		$linked = 1;
39*e4a6e799Ssimonb		$textfile = $basename;
40*e4a6e799Ssimonb	}
41*e4a6e799Ssimonb	if (not defined $ltfile) {
42*e4a6e799Ssimonb		for (my $i = 0;; ++$i) {
43*e4a6e799Ssimonb			my $suffix = $i ? $i : "";
44*e4a6e799Ssimonb			$ltfile = "lt/$textfile$suffix.lt";
45*e4a6e799Ssimonb			last if not -e $ltfile;
46*e4a6e799Ssimonb		}
47*e4a6e799Ssimonb	}
48*e4a6e799Ssimonb	$ls_opts = "-S$ls_opts" if $ls_opts;
49*e4a6e799Ssimonb	my $cmd = "LINES=$lines COLUMNS=$columns $lesstest $lt_opts $ls_opts -s '$lt_screen' -o '$ltfile' -- $less '$textfile'";
50*e4a6e799Ssimonb	print "$cmd\n" if $verbose;
51*e4a6e799Ssimonb	my $err = system($cmd);
52*e4a6e799Ssimonb	if ($err) {
53*e4a6e799Ssimonb		unlink $ltfile;
54*e4a6e799Ssimonb	} else {
55*e4a6e799Ssimonb		print "created $ltfile\n";
56*e4a6e799Ssimonb	}
57*e4a6e799Ssimonb	unlink $textfile if $linked;
58*e4a6e799Ssimonb	exit $err;
59*e4a6e799Ssimonb}
60*e4a6e799Ssimonb
61*e4a6e799Ssimonbsub opts {
62*e4a6e799Ssimonb	my ($opts) = @_;
63*e4a6e799Ssimonb	$opts = "-$opts" if $opts =~ /^[^-]/;
64*e4a6e799Ssimonb	return $opts;
65*e4a6e799Ssimonb}
66*e4a6e799Ssimonb
67*e4a6e799Ssimonbsub less_is_test {
68*e4a6e799Ssimonb	my ($less) = @_;
69*e4a6e799Ssimonb	my $ver = `$less -V`;
70*e4a6e799Ssimonb	return $ver =~ /LESSTEST/;
71*e4a6e799Ssimonb}
72