diff options
Diffstat (limited to 'hw/xfree86/getconfig')
-rw-r--r-- | hw/xfree86/getconfig/cfg.man.pre | 138 | ||||
-rw-r--r-- | hw/xfree86/getconfig/cfg.sample | 111 | ||||
-rw-r--r-- | hw/xfree86/getconfig/getconfig | 45 | ||||
-rw-r--r-- | hw/xfree86/getconfig/getconfig.man.pre | 98 | ||||
-rw-r--r-- | hw/xfree86/getconfig/getconfig.pl | 429 |
5 files changed, 821 insertions, 0 deletions
diff --git a/hw/xfree86/getconfig/cfg.man.pre b/hw/xfree86/getconfig/cfg.man.pre new file mode 100644 index 000000000..fcf1a6161 --- /dev/null +++ b/hw/xfree86/getconfig/cfg.man.pre @@ -0,0 +1,138 @@ +.\" $XFree86: xc/programs/Xserver/hw/xfree86/getconfig/cfg.man,v 1.1 2003/11/12 04:52:15 dawes Exp $ +.TH getconfig __filemansuffix__ __vendorversion__ +.SH NAME +getconfig - meta configuration files for getconfig(1) +.SH SYNOPSIS +.B \(**.cfg +.SH DESCRIPTION +.B getconfig +is a programatic interface that is used by the +.B XFree86 +server to get configuration information about video hardware when +operating without an +.B XF86Config +file. +.PP +This implementation of +.B getconfig +is written in perl. It processes rules from meta-configuration files. +All meta-configuration files have a +.I .cfg +suffix. +.PP +Lines starting with a pound-sign (#) are comments, and are ignored. +Blank lines that consist only of white space are also treated as comments +and ignored. +.PP +The first non-comment line must be a signature string followed by +the file format version number. The signature string is +.PP +.RS 4 +.nf +"XFree86 Project getconfig rules file.\ \ Version: " +.fi +.RE +.PP +The currently defined version is "1.0". Files that do not have the +correct signature string are ignored. +.PP +The remaining non-comment lines define rules. The start of a new rule +is indicated by a line with no leading white space. Subsequent lines +making up a rule must be indented with white space. Logical lines within +a rule may be split over multiple physical lines by using the usual +continuation convention ('\e' at the end of the line). The first logical +line of each rule is a perl expression. It may be any valid perl +expression whose evaluated (with 'eval') result may be used as the +argument to a perl 'if' statement. The second logical line should be +the name of the XFree86 video driver to use when the rule is true, and +subsequent logical lines of each rule, if present, are additional +configuration output for the video device's +.B XF86Config +.B Device +section. The driver name and additional lines of configuration information +are written to standard output when the rule is chosen as the successful +rule. +.PP +Pseudo rules consisting of perl expressions may be present in the file +for the purpose of defining custom perl variables or setting the weight +to use for the following rules. Pseudo rules are rules that consist of +a single logical line only, and the are never candidates themselves for the +successful rule. +.PP +Several perl variables are pre-defined, and may be used within rules. +They include: +.PP +.RS 4 +.nf +.BR "$vendor " "PCI vendor ID" +.BR "$device " "PCI device ID" +.BR "$revision " "PCI revision ID" +.BR "$subsys " "PCI subsystem ID" +.BR "$subsysVendor " "PCI subsystem vendor ID" +.BR "$class " "PCI class" +.BR "$XFree86Version " "XFree86 version, as a 'v' string" +.BR "$XFree86VersionNumeric " "XFree86 numeric version" +.BR "$XFree86VersionMajor " "XFree86 major version" +.BR "$XFree86VersionMinor " "XFree86 minor version" +.BR "$XFree86VersionPatch " "XFree86 patch version" +.BR "$XFree86VersionSnap " "XFree86 snap version" +.BR "$weight " "current rule weight" +.fi +.RE +.PP +The +.B $weight +variable deterines the weight of the rules as they are processed. The +weight for subsequent rules may be set with a pseudo rule that sets or +changes the value of +.BR $weight . +The default weight, and the weight used for built-in rules is 500. The +meta-configuration files are processed in an unpredictable order. The +weighting of the rules is used to determine their relative priority +.PP +After processing all of the rules, both built-in and those read from +the meta-configration files, the +.B getconfig +program chooses as the successful rule the last and highest weighted +rule that evaluates to true. +.SH FILES +.I .cfg +files located in the search path. The search path typically specified +by the +.B XFree86 +server is: +.PP +.RS 4 +.nf +.I /etc/X11 +.I __projectroot__/etc/X11 +.I <modulepath> +.I __projectroot__/lib/X11/getconfig +.fi +.RE +.PP +where +.I <modulepath> +is the +.B XFree86 +server's module search path. +.PP +.TP 30 +.I __projectroot__/lib/X11/getconfig/xfree86.cfg +Default rules file that gets installed. This file doesn't contain any +rules by default. +.TP 30 +.I __projectroot__/lib/X11/getconfig/cfg.sample +A sample rules file that gives some examples of what types of rules can +appear in rules files. + +.SH "SEE ALSO" +getconfig(1), +XFree86(1), +XF86Config(__filemansuffix__). + +.SH AUTHORS +The XFree86 automatic configuration support and the +.B getconfig +interface was written by David H. Dawes, with the support of X-Oz +Technologies. diff --git a/hw/xfree86/getconfig/cfg.sample b/hw/xfree86/getconfig/cfg.sample new file mode 100644 index 000000000..acf262d1a --- /dev/null +++ b/hw/xfree86/getconfig/cfg.sample @@ -0,0 +1,111 @@ +# $DHD: xc/programs/Xserver/hw/xfree86/getconfig/cfg.sample,v 1.2 2003/09/23 05:12:07 dawes Exp $ +# $XFree86: xc/programs/Xserver/hw/xfree86/getconfig/cfg.sample,v 1.2 2003/11/12 04:52:15 dawes Exp $ + +# Some sample XFree86 getconfig rules file. + +# +# The line below is the getconfig rules file signature, and must be the +# first non-blank, non-comment line. +# + +XFree86 Project getconfig rules file. Version: 1.0 + +# +# Set the weight for the following rules. This should be set, otherwise +# the previously set weight will get used, and you have no idea of knowing +# what that might be. +# + +$weight = 1000 + +# +# Rules. Rules consist of a condition (in perl code) followed by +# a driver name and optionally some additional strings. The start of a +# rule is indicated by a line with no leading white space. Subsequent +# lines making up a rule must be indented. Logical lines may be split +# over multiple physical lines by using the usual continuation '\'. +# +# Rules that are not followed by a driver name may be used to do other +# things, like setting the weight as above. +# + +# +# Pre-defined variables include: +# +# $vendor PCI vendor ID +# $device PCI device ID +# $revision PCI revision ID +# $subsys PCI subsystem ID +# $subsysVendor PCI subsystem vendor ID +# $class PCI class +# $XFree86Version XFree86 version, as a 'v' string. +# +# The XFree86 version information is also available as the following: +# +# $XFree86VersionNumeric +# $XFree86VersionMajor +# $XFree86VersionMinor +# $XFree86VersionPatch +# $XFree86VersionSnap +# + +# Define a fake vendor ID for some sample rules. + +$novendor = 0x10000 +$nodevice = 0x10000 + +$vendor == $novendor + nodriver + Option "xx" + Videoram 1000 + +# A rule with continued lines. + +$vendor == $novendor && \ +$device == $nodevice + nodriver2 + Option \ + "yy" + +# Increase the weight of the following rules if the XFree86 version is 4.3 or +# higher. + +$weight++ if ($XFree86Version ge v4.3) + +$vendor == $novendor + nodriver + Option "yy" + +# +# The weight can be changed at any times, and applies to rules that follow +# until changed again. +# + +$weight = 100 + +$vendor == $novendor && $XFree86Version eq v4.3.2.1 + nodriver3 + +$weight = 600 + +# +# The following two examples use some real values. +# + +# Example: make the default depth 24 for Radeon R200 and RV200 cards. + +$vendor == 0x1002 && \ + ($device >= 0x5148 && $device <= 0x514F || \ + $device >= 0x5168 && $device <= 0x516C || \ + $device == 0x4242 || \ + $device >= 0x5157 && device <= 0x5158) + ati + Option "DefaultDepth" "24" + + +# Example: enable DRI for MGA G400 + +$vendor == 0x102b && $device == 0x0525 + mga + Option "dri" + diff --git a/hw/xfree86/getconfig/getconfig b/hw/xfree86/getconfig/getconfig new file mode 100644 index 000000000..d2acc9bb8 --- /dev/null +++ b/hw/xfree86/getconfig/getconfig @@ -0,0 +1,45 @@ +#!/bin/sh + +# $DHD: xc/programs/Xserver/hw/xfree86/getconfig/getconfig.sh,v 1.2 2003/09/20 01:45:57 dawes Exp $ + +# +# Copyright 2003 by David H. Dawes. +# Copyright 2003 by X-Oz Technologies. +# All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the copyright holder(s) +# and author(s) shall not be used in advertising or otherwise to promote +# the sale, use or other dealings in this Software without prior written +# authorization from the copyright holder(s) and author(s). +# +# Author: David Dawes <dawes@XFree86.Org>. +# + +# $XFree86: xc/programs/Xserver/hw/xfree86/getconfig/getconfig.sh,v 1.1 2003/10/08 14:58:29 dawes Exp $ + +# A simple wrapper to execute the real getconfig program. So long as perl +# is in $PATH, we don't need to know where it is this way. + +if echo $0 | grep / >/dev/null 2>&1; then + DIR=`dirname $0`/ +fi + +exec perl ${DIR}getconfig.pl "$@" diff --git a/hw/xfree86/getconfig/getconfig.man.pre b/hw/xfree86/getconfig/getconfig.man.pre new file mode 100644 index 000000000..16c472fc5 --- /dev/null +++ b/hw/xfree86/getconfig/getconfig.man.pre @@ -0,0 +1,98 @@ +.\" $XFree86: xc/programs/Xserver/hw/xfree86/getconfig/getconfig.man,v 1.1 2003/11/12 04:52:15 dawes Exp $ +.TH getconfig 1 __vendorversion__ +.SH NAME +getconfig - get configuration information for the XFree86 server +.SH SYNOPSIS +.B getconfig +.RI [ option +.IR ... ] +.SH DESCRIPTION +.B getconfig +is a programatic interface that is used by the +.B XFree86 +server to get configuration information about video hardware when +operating without an +.B XF86Config +file. +.PP +This implementation of +.B getconfig +is written in perl. It processes a prioritized and ordered list of +rules supplied internally and from meta-configuration files. The rules +are in the form of perl expressions. +.B getconfig +writes to standard output the XF86Config-style configuration data +specified by the last highest priority rule that evaluates to true. +Information about the format of the meta-configuration files can be +found in the getconfig(__filemansuffix__) manual page. +.SH OPTIONS +.TP 8 +.BI \-I " search-path" +Specify the search path to use for meta-config files. +.I search-path +is a comma-separated list of directories to search. Each directory in +the search path is searched for files with a +.I .cfg +suffix. Each such file is opened and checked for a valid signature +string. Rules are read from files with a valid signature string and +appended to the list of rules to evaluate. If no search path is specified, +only the internally supplied configuration rules will be used. +.TP 8 +.B \-D +Enable debugging output. +.TP 8 +.B \-V +Print out the version information and exit. +.TP 8 +.BI \-X " XFree86-version" +Specify the XFree86 version in numeric (integer) form. +.TP 8 +.BI \-b " subsys-id" +Specify the PCI subsystem ID of the video device. +.TP 8 +.BI \-c " class" +Specify the PCI class of the video device. +.TP 8 +.BI \-d " device-id" +Specify the PCI devide ID of the video device. +.TP 8 +.BI \-r " revision" +Specify the PCI revision of the video device. +.TP 8 +.BI \-s " subsysvendor-id" +Specify the PCI subsystem vendor ID of the video device. +.TP 8 +.BI \-v " vendor-id" +Specify the PCI vendor ID of the video device. +.SH FILES +.I .cfg +files located in the search path. The search path typically specified +by the +.B XFree86 +server is: +.PP +.RS 4 +.nf +.I /etc/X11 +.I __projectroot__/etc/X11 +.I <modulepath> +.I __projectroot__/lib/X11/getconfig +.fi +.RE +.PP +where +.I <modulepath> +is the +.B XFree86 +server's module search path. + +.SH "SEE ALSO" +getconfig(__filemansuffix__), +XFree86(1), +XF86Config(__filemansuffix__). + +.SH AUTHORS +The XFree86 automatic configuration support and the +.B getconfig +interface was written by David H. Dawes, with the support of X-Oz +Technologies. diff --git a/hw/xfree86/getconfig/getconfig.pl b/hw/xfree86/getconfig/getconfig.pl new file mode 100644 index 000000000..fcfd7d057 --- /dev/null +++ b/hw/xfree86/getconfig/getconfig.pl @@ -0,0 +1,429 @@ +#!/usr/bin/perl + +# $DHD: xc/programs/Xserver/hw/xfree86/getconfig/getconfig.pl,v 1.13 2003/09/23 05:12:07 dawes Exp $ + +# +# Copyright 2003 by David H. Dawes. +# Copyright 2003 by X-Oz Technologies. +# All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the copyright holder(s) +# and author(s) shall not be used in advertising or otherwise to promote +# the sale, use or other dealings in this Software without prior written +# authorization from the copyright holder(s) and author(s). +# +# Author: David Dawes <dawes@XFree86.Org>. +# + +# $XFree86: xc/programs/Xserver/hw/xfree86/getconfig/getconfig.pl,v 1.1 2003/10/08 14:58:29 dawes Exp $ + +# +# This script takes PCI id information, compares it against an ordered list +# of rules, and prints out the configuration information specified by the +# last matching rule. +# +# This script is called by xf86AutoConfig(). +# + +# Command line processing. + +$GetconfigVersion = v1.0; + +$debug = 0; + +$myname = $0; +$myname =~ s/.*\///; + +$signature = "XFree86 Project getconfig rules file. Version: "; + +while (@ARGV[0] =~ /^-[A-Za-z]$/) { + $f = shift; + SWITCH: { + if ($f eq "-D") { + $debug = 1; + last SWITCH; + } + if ($f eq "-I") { + push(@searchPaths, split(/,/, shift)); + last SWITCH; + } + if ($f eq "-V") { + printf STDERR "$myname: Version %vd.\n", $GetconfigVersion; + exit 0; + } + if ($f eq "-X") { + $XFree86VersionNumeric = shift; + if (!defined($XFree86VersionNumeric)) { + print STDERR "$myname: -X requires the XFree86 version.\n"; + exit 1; + } + } + if ($f eq "-b") { + $subsys = oct(shift); + if (!defined($subsys)) { + print STDERR "$myname: -b requires the subsys id.\n"; + exit 1; + } + last SWITCH; + } + if ($f eq "-c") { + $class = oct(shift); + if (!defined($class)) { + print STDERR "$myname: -c requires the class value.\n"; + exit 1; + } + last SWITCH; + } + if ($f eq "-d") { + $device = oct(shift); + if (!defined($device)) { + print STDERR "$myname: -d requires the device id.\n"; + exit 1; + } + last SWITCH; + } + if ($f eq "-r") { + $revision = oct(shift); + if (!defined($revision)) { + print STDERR "$myname: -r requires the device revision.\n"; + exit 1; + } + last SWITCH; + } + if ($f eq "-s") { + $subsysVendor = oct(shift); + if (!defined($subsysVendor)) { + print STDERR "$myname: -s requires the subsysVendor id.\n"; + exit 1; + } + last SWITCH; + } + if ($f eq "-v") { + $vendor = oct(shift); + if (!defined($vendor)) { + print STDERR "$myname: -v requires the vendor id.\n"; + exit 1; + } + last SWITCH; + } + } +} + +printf STDERR "$myname: Version %vd.\n", $GetconfigVersion; + +if (defined($XFree86VersionNumeric)) { + $XFree86VersionMajor = $XFree86VersionNumeric / 10000000; + $XFree86VersionMinor = ($XFree86VersionNumeric % 10000000) / 100000; + $XFree86VersionPatch = ($XFree86VersionNumeric % 100000) / 1000; + $XFree86VersionSnapshot = $XFree86VersionNumeric % 1000; + $XFree86Version = chr($XFree86VersionMajor) . chr($XFree86VersionMinor) . + chr($XFree86VersionPatch) . chr($XFree86VersionSnapshot); +} + +if ($debug) { + printf STDERR "$myname: XFree86 Version: %d, %d.%d.%d.%d, %vd.\n", + $XFree86VersionNumeric, $XFree86VersionMajor, $XFree86VersionMinor, + $XFree86VersionPatch, $XFree86VersionSnapshot, $XFree86Version; +} else { + printf STDERR "$myname: XFree86 Version: %vd.\n", $XFree86Version; +} + + +# The rules here are just basic vendor ID to driver mappings. +# Ideally this is all that would be required. More complicated configuration +# rules will be provided in external files. + +# XXX This set of basic rules isn't complete yet. + +@rules = ( + +# Set the weight for the built-in rules. +['$weight = 500'], + +# APM +['$vendor == 0x1142', + 'apm'], + +# ARK +['$vendor == 0xedd8', + 'apm'], + +# ATI +['$vendor == 0x1002', + 'ati'], + +# Chips & Technologies +['$vendor == 0x102c', + 'chips'], + +# Cirrus +['$vendor == 0x1013', + 'cirrus'], + +# Intel +['$vendor == 0x8086', + 'i810'], +['$vendor == 0x8086 && ($chipType == 0x00d1 || $chipType == 0x7800)', + 'i740'], + +# Matrox +['$vendor == 0x102b', + 'mga'], + +# Neomagic +['$vendor == 0x10c8', + 'neomagic'], + +# Number Nine +['$vendor == 0x105d', + 'i128'], + +# NVIDIA +['$vendor == 0x10de || $vendor == 0x12d2', + 'nv'], + +# S3 +['$vendor == 0x5333 && ($device == 0x88d0 ||' . + '$device == 0x88d1 ||' . + '$device == 0x88f0 ||' . + '$device == 0x8811 ||' . + '$device == 0x8812 ||' . + '$device == 0x8814 ||' . + '$device == 0x8901)', + 's3'], + +# S3 virge +['$vendor == 0x5333 && ($device == 0x5631 ||' . + '$device == 0x883d ||' . + '$device == 0x8a01 ||' . + '$device == 0x8a10 ||' . + '$device == 0x8c01 ||' . + '$device == 0x8c03 ||' . + '$device == 0x8904 ||' . + '$device == 0x8a13)', + 's3virge'], + +# S3 Savage +['$vendor == 0x5333 && ($device >= 0x8a20 && $device <= 0x8a22 ||' . + '$device == 0x9102 ||' . + '$device >= 0x8c10 && $device <= 0x8c13 ||' . + '$device == 0x8a25 ||' . + '$device == 0x8a26 ||' . + '$device >= 0x8d01 && $device <= 0x8d04 ||' . + '$device >= 0x8c2a && $device <= 0x8c2f ||' . + '$device == 0x8c22 ||' . + '$device == 0x8c24 ||' . + '$device == 0x8c26)', + 'savage'], + +# SIS +['$vendor == 0x1039', + 'sis'], + +# SMI +['$vendor == 0x126f', + 'siliconmotion'], + +# 3Dfx +['$vendor == 0x121a', + 'tdfx'], + +# 3Dlabs +['$vendor == 0x3d3d', + 'glint'], + +# Trident +['$vendor == 0x1023', + 'trident'], + +# Tseng Labs +['$vendor == 0x100c', + 'tseng'], + +# VIA +['$vendor == 0x1106', + 'via'], + +# VMware +['$vendor == 0x15ad', + 'vmware'], + +); + +# Reverse the search path list, since the later rules have higher priority +# than earlier ones (weighting being equal). + +@searchPaths = reverse(@searchPaths); + +if ($debug) { + $i = 0; + for $path (@searchPaths) { + print STDERR "$myname: Search path $i is: \"$path\".\n"; + $i++; + } +} + +print STDERR "$myname: ", $#rules + 1, " built-in rule", plural($#rules + 1), + ".\n"; + +for $path (@searchPaths) { + while (<$path/*.cfg>) { + @tmp = readRulesFile($_); + if (defined(@tmp[0])) { + push @rules, @tmp; + } + } +} + +if ($debug) { + $i = 0; + for $r (@rules) { + print STDERR "$myname: rule $i is: \'@$r\'.\n"; + $i++ + } +} + +$i = 0; +$e = 0; +$weight = 0; +$w = 0; +for $r (@rules) { + ($cond, $d, @o) = @$r; + $result = eval $cond; + if ($@) { + print STDERR "$myname: Error evaluating rule $i \'$cond\': $@"; + $e++; + } + if ($debug) { + print STDERR "$myname: rule $i \'$cond\' evaluates to \'$result\'.\n"; + } + if ($result && defined($d) && $weight >= $w) { + $driver = $d; + @opts = @o; + $w = $weight; + } + $i++; +} + +print STDERR "$myname: Evaluated $i rule", plural($i), + " with $e error", plural($e), ".\n"; + +print STDERR "$myname: Weight of result is $w.\n"; + +if ($debug) { + if (defined($driver)) { + print STDERR "$myname: Driver is \'$driver\'.\n"; + } else { + print STDERR "$myname: No driver.\n"; + } + if (defined(@opts)) { + print STDERR "$myname: options are:\n"; + for $opt (@opts) { + print STDERR "\t$opt\n"; + } + } else { + print STDERR "$myname: No options.\n"; + } +} + +print "$driver\n"; +for $opt (@opts) { + print "$opt\n"; +} + +exit 0; + +# Subroutines. + +sub readRulesFile { + my ($file) = @_; + my $signatureOK = 0; + my @r, @tmp; + my $line, $cont, $prevcont, $fileversion; + + undef @tmp; + undef @r; + + if (open(RF, "<$file")) { + $prevcont = 0; + while (<RF>) { + chop; + $line = $_; + next if ($line =~ /^#/); + next if ($line =~ /^\s*$/); + if (!$signatureOK) { + if ($line =~ /^$signature(.*)$/) { + $fileversion = $1; + $signatureOK = 1; + print STDERR + "$myname: rules file \'$file\' has version $fileversion.\n"; + next; + } + } + if (!$signatureOK) { + print STDERR "$myname: file \'$file\' has bad signature.\n"; + close(RF); + last; + } + $cont = 0; + if ($line =~ s/\\\s*$//) { + $cont = 1; + } + if (!$prevcont && $line =~ /^\S+/) { + if (defined(@tmp[0])) { + push(@r,[@tmp]); + } + undef @tmp; + } + if ($prevcont) { + push(@tmp, pop(@tmp) . $line); + } else { + push(@tmp, $line); + } + $prevcont = $cont; + } + if (defined(@tmp[0])) { + push(@r,[@tmp]); + } + if (!defined(@r[0])) { + print STDERR "$myname: no rules in file \'$file\'.\n"; + } else { + print STDERR "$myname: ", $#r + 1, + " rule", plural($#r + 1), + " added from file \'$file\'.\n"; + } + } else { + print STDERR "$myname: cannot open file \'$file\'.\n"; + } + + return @r; +} + +sub plural { + my ($count) = @_; + + if ($count != 1) { + return "s"; + } else { + return ""; + } +} + |