Patch from Ralf Corsepius <corsepiu@faw.uni-ulm.de>:

1. Rtems contains some perl scripts that use hard-coded paths to
      /usr/bin/perl or /usr/local/bin/perl I have already fixed these
      problems by adding some checks to configure.in.   While doing this,
      I also cleaned up some more autoconf related problems for generating
      shell scripts.  This patch might seem a bit scary to you, but I am
      quite confident it won't break something (I've been testing it for
      almost a week now, however it might introduce typos for a limited
      number configurations I don't have access to - But it shouldn't be
      a problem for you to test them :-).

   I expect to get this finished tonight, hence you will very likely
   have the patch when you get up tomorrow.

   Changes:

   * Check for PERL and disable all PERL scripts if perl wasn't found.
   * Generate all KSHELL-scripts with autoconf instead of make-script
   * Automatic dependency handling for autoconf generated KSHELL or PERL
     scripts (make/rtems.cfg)

   Notes:
   * this patch contains new files and deletes some other files.
   * The patch is relative to rtems-4.0.0-beta4 with my previous
     rtems-rc-981014-1.diff patch applied.

   Testing:
      I tested it with sh-rtems and posix under linux. Now all targets
      which are touched by this patch and which are not used while building
      for sh-rtems and posix still need to be tested. AFAIS, only the
      sparc/erc32 BSP should be affected by this criterion. And if you
      like to, you should also consider testing it on a Cygwin32 and a
      Solaris host for one arbitrary BSP.
This commit is contained in:
Joel Sherrill
1998-10-14 20:19:30 +00:00
parent 946b3cb0cf
commit 11cfb6f7f6
40 changed files with 2921 additions and 216 deletions

View File

@@ -22,11 +22,3 @@ unlock-directory
Useful to keep people from accidentally overwriting
"released" trees if they get confused about which
module they have loaded.
rtems-glom
glom together all the rtems libraries in order to simplify
the link line used by applications.
Produces rtems.rel.
Not used by the RTEMS src tree at all.
Strictly optional.

View File

@@ -0,0 +1,142 @@
#!@KSH@ -p
#
# Either bash or ksh will be ok for this; requires (( )) arithmetic
# (-p above just says to not parse $ENV file; makes it faster for
# those of us who set $ENV)
#
# install files if they have changed by running 'cmp', then 'install'
# as necessary.
#
# Optionally, can append a suffix before last existing suffix (if any)
#
# NOTE
# We avoid using typical install(1M) programs since they have
# large variability across systems and we also need to support ou
# -V option.
# So we just copy and chmod by hand.
#
# $Id$
#
progname=`basename $0`
#progname=${0##*/} # fast basename hack for ksh, bash
USAGE=\
"usage: $progname [ -vmV ] file [ file ... ] dest-directory-or-file
-v -- verbose
-V suffix -- suffix to append to targets (before any . suffix)
eg: -V _g would change 'foo' to 'foo_g' and
'libfoo.a' to 'libfoo_g.a'
-m mode -- mode for new file(s)"
fatal() {
if [ "$1" ]
then
echo $* >&2
fi
echo "$USAGE" 1>&2
exit 1
}
#
# process the options
#
verbose=""
suffix=""
mode=""
while getopts vm:V: OPT
do
case "$OPT" in
v)
verbose="yes";;
V)
eval suffix=$OPTARG;;
m)
mode="$OPTARG";;
*)
fatal
esac
done
shiftcount=`expr $OPTIND - 1`
shift $shiftcount
args=$*
#
# Separate source file(s) from dest directory or file
#
files=""
dest=""
for d in $args
do
files="$files $dest"
dest=$d
done
if [ ! "$files" ] || [ ! "$dest" ]
then
fatal "missing files or invalid destination"
fi
#
# Process the arguments
#
targets=""
for f in $files
do
# leaf=`basename $f`
leaf=${f##*/} # fast basename hack for ksh, bash
target=$dest
if [ -d $dest ]
then
# if we were given a suffix, then add it as appropriate
if [ "$suffix" ]
then
case $f in
*.*)
# leaf=`echo $leaf |
# /bin/sed "s/\([~\.]*\)\.\(.*\)$/\1$suffix.\2/"`
# ksh,bash hack for above sed script
leaf=${leaf%%.*}$suffix.${leaf#*.}
[ "$verbose" = "yes" ] &&
echo "$progname: $f will be installed as $leaf"
;;
*)
leaf=$leaf$suffix;;
esac
fi
target=$target/$leaf
fi
[ ! -r $f ] && fatal "can not read $f"
if cmp -s $f $target
then
[ "$verbose" = "yes" ] && echo "'$f' not newer than '$target'"
else
[ "$verbose" = "yes" ] && echo "rm -f $target"
rm -f $target
echo "cp -p $f $target"
cp -p $f $target || exit 1
targets="$targets $target" # keep list for chmod below
fi
done
if [ "$mode" -a "$targets" ]
then
[ "$verbose" = "yes" ] && echo "chmod $mode $targets"
chmod $mode $targets
fi
exit 0
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -0,0 +1,43 @@
#!@KSH@
#
# $Id$
#
# Make a directory write protected
# Used to write protect the install point after a build
# to prevent inadvertant overwriting.
#
# is a particular command available on this machine?
#
cmd_avail()
{
set -- `type $1 2>&1`
if [ "$2" = "not" -a "$3" = "found" ] || [ "$3" = "not" -a "$4" = "found" ]
then
return 1
else
return 0
fi
}
lock_directory() {
l_dir=$1/. # get any symlink out of the way using '.'
if [ -d $l_dir ]
then
find $l_dir -type d -perm -0200 -print | $XARGS chmod -w
fi
}
# Use gnu xargs if available; faster, more reliable in general
XARGS=xargs
cmd_avail gxargs && XARGS=gxargs
for dir
do
lock_directory $dir
done
# Local Variables: ***
# mode:ksh ***
# End: ***

73
tools/build/rcs-clean.in Normal file
View File

@@ -0,0 +1,73 @@
#!@KSH@ -p
#
# $Id$
#
# Delete all files from the current directory that can be recreated
# via RCS 'co' commonds
# Used by 'make clobber'
#
progname=${0##*/} # fast basename hack for ksh, bash
USAGE=\
"usage: $progname [ -v ]"
fatal() {
if [ "$1" ]
then
echo $* >&2
fi
echo "$USAGE" 1>&2
exit 1
}
#
# process the options
#
verbose=""
while getopts v OPT
do
case "$OPT" in
v)
verbose="yes";;
*)
fatal
esac
done
let $((shiftcount = $OPTIND - 1))
shift $shiftcount
args=$*
[ "$args" ] && fatal
[ -d RCS/. ] || exit 0
# there is probably a better way to do this
rcs_files=`echo RCS/*,v | sed -e 's?RCS/??g' -e's/,v//g'`
kills=""
for f in $rcs_files
do
# build list of all files in RCS/*,v that are *not* locked
if [ -f $f ] && [ ! -w $f ] && [ -f RCS/$f,v ]
then
locked=`rlog -L -R $f`
[ "$locked" = "" ] && kills="$kills $f"
fi
done
if [ "$kills" ]
then
[ "$verbose" ] && echo rm -f $kills
rm -f $kills
fi
exit 0
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -14,21 +14,23 @@ PROJECT_ROOT = @PROJECT_ROOT@
include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
include $(RTEMS_ROOT)/make/leaf.cfg
include $(RTEMS_ROOT)/make/rtems.cfg
DESTDIR=$(PROJECT_RELEASE)/build-tools
PGMS=install-if-change rcs-clean lock-directory unlock-directory \
search-id.sh
BUILD_PGMS=install-if-change rcs-clean lock-directory unlock-directory
PGMS = $(BUILD_PGMS) search-id.sh
INSTALLED=$(PGMS:%=$(DESTDIR)/%)
CLEAN_ADDITIONS += $(BUILD_PGMS)
INSTALLED_PGMS=$(PGMS:%=$(DESTDIR)/%)
all: $(DESTDIR) $(PGMS) install
$(DESTDIR):
@INSTALL@ $(INSTDIRFLAGS) $@
install: $(INSTALLED)
$(INSTALLED_PGMS): $(PGMS)
@INSTALL@ $(INSTBINFLAGS) $^ $(DESTDIR)
# Install the program
$(DESTDIR)/%: %
$(make-script)
install: $(DESTDIR) $(INSTALLED_PGMS)

View File

@@ -22,11 +22,3 @@ unlock-directory
Useful to keep people from accidentally overwriting
"released" trees if they get confused about which
module they have loaded.
rtems-glom
glom together all the rtems libraries in order to simplify
the link line used by applications.
Produces rtems.rel.
Not used by the RTEMS src tree at all.
Strictly optional.

View File

@@ -0,0 +1,142 @@
#!@KSH@ -p
#
# Either bash or ksh will be ok for this; requires (( )) arithmetic
# (-p above just says to not parse $ENV file; makes it faster for
# those of us who set $ENV)
#
# install files if they have changed by running 'cmp', then 'install'
# as necessary.
#
# Optionally, can append a suffix before last existing suffix (if any)
#
# NOTE
# We avoid using typical install(1M) programs since they have
# large variability across systems and we also need to support ou
# -V option.
# So we just copy and chmod by hand.
#
# $Id$
#
progname=`basename $0`
#progname=${0##*/} # fast basename hack for ksh, bash
USAGE=\
"usage: $progname [ -vmV ] file [ file ... ] dest-directory-or-file
-v -- verbose
-V suffix -- suffix to append to targets (before any . suffix)
eg: -V _g would change 'foo' to 'foo_g' and
'libfoo.a' to 'libfoo_g.a'
-m mode -- mode for new file(s)"
fatal() {
if [ "$1" ]
then
echo $* >&2
fi
echo "$USAGE" 1>&2
exit 1
}
#
# process the options
#
verbose=""
suffix=""
mode=""
while getopts vm:V: OPT
do
case "$OPT" in
v)
verbose="yes";;
V)
eval suffix=$OPTARG;;
m)
mode="$OPTARG";;
*)
fatal
esac
done
shiftcount=`expr $OPTIND - 1`
shift $shiftcount
args=$*
#
# Separate source file(s) from dest directory or file
#
files=""
dest=""
for d in $args
do
files="$files $dest"
dest=$d
done
if [ ! "$files" ] || [ ! "$dest" ]
then
fatal "missing files or invalid destination"
fi
#
# Process the arguments
#
targets=""
for f in $files
do
# leaf=`basename $f`
leaf=${f##*/} # fast basename hack for ksh, bash
target=$dest
if [ -d $dest ]
then
# if we were given a suffix, then add it as appropriate
if [ "$suffix" ]
then
case $f in
*.*)
# leaf=`echo $leaf |
# /bin/sed "s/\([~\.]*\)\.\(.*\)$/\1$suffix.\2/"`
# ksh,bash hack for above sed script
leaf=${leaf%%.*}$suffix.${leaf#*.}
[ "$verbose" = "yes" ] &&
echo "$progname: $f will be installed as $leaf"
;;
*)
leaf=$leaf$suffix;;
esac
fi
target=$target/$leaf
fi
[ ! -r $f ] && fatal "can not read $f"
if cmp -s $f $target
then
[ "$verbose" = "yes" ] && echo "'$f' not newer than '$target'"
else
[ "$verbose" = "yes" ] && echo "rm -f $target"
rm -f $target
echo "cp -p $f $target"
cp -p $f $target || exit 1
targets="$targets $target" # keep list for chmod below
fi
done
if [ "$mode" -a "$targets" ]
then
[ "$verbose" = "yes" ] && echo "chmod $mode $targets"
chmod $mode $targets
fi
exit 0
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -0,0 +1,43 @@
#!@KSH@
#
# $Id$
#
# Make a directory write protected
# Used to write protect the install point after a build
# to prevent inadvertant overwriting.
#
# is a particular command available on this machine?
#
cmd_avail()
{
set -- `type $1 2>&1`
if [ "$2" = "not" -a "$3" = "found" ] || [ "$3" = "not" -a "$4" = "found" ]
then
return 1
else
return 0
fi
}
lock_directory() {
l_dir=$1/. # get any symlink out of the way using '.'
if [ -d $l_dir ]
then
find $l_dir -type d -perm -0200 -print | $XARGS chmod -w
fi
}
# Use gnu xargs if available; faster, more reliable in general
XARGS=xargs
cmd_avail gxargs && XARGS=gxargs
for dir
do
lock_directory $dir
done
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -0,0 +1,73 @@
#!@KSH@ -p
#
# $Id$
#
# Delete all files from the current directory that can be recreated
# via RCS 'co' commonds
# Used by 'make clobber'
#
progname=${0##*/} # fast basename hack for ksh, bash
USAGE=\
"usage: $progname [ -v ]"
fatal() {
if [ "$1" ]
then
echo $* >&2
fi
echo "$USAGE" 1>&2
exit 1
}
#
# process the options
#
verbose=""
while getopts v OPT
do
case "$OPT" in
v)
verbose="yes";;
*)
fatal
esac
done
let $((shiftcount = $OPTIND - 1))
shift $shiftcount
args=$*
[ "$args" ] && fatal
[ -d RCS/. ] || exit 0
# there is probably a better way to do this
rcs_files=`echo RCS/*,v | sed -e 's?RCS/??g' -e's/,v//g'`
kills=""
for f in $rcs_files
do
# build list of all files in RCS/*,v that are *not* locked
if [ -f $f ] && [ ! -w $f ] && [ -f RCS/$f,v ]
then
locked=`rlog -L -R $f`
[ "$locked" = "" ] && kills="$kills $f"
fi
done
if [ "$kills" ]
then
[ "$verbose" ] && echo rm -f $kills
rm -f $kills
fi
exit 0
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -0,0 +1,41 @@
#!@KSH@
#
# $Id$
#
# Unlock a directory processed by lock_directory
#
# is a particular command available on this machine?
#
cmd_avail()
{
set -- `type $1 2>&1`
if [ "$2" = "not" -a "$3" = "found" ] || [ "$3" = "not" -a "$4" = "found" ]
then
return 1
else
return 0
fi
}
unlock_directory() {
ul_dir=$1/. # get any symlink out of the way using '.'
if [ -d $ul_dir ]
then
find $ul_dir -type d ! -perm -0222 -print | $XARGS -t chmod +w
fi
}
# Use gnu xargs if available; faster, more reliable in general
XARGS=xargs
cmd_avail gxargs && XARGS=gxargs
for dir
do
unlock_directory $dir
done
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -0,0 +1,41 @@
#!@KSH@
#
# $Id$
#
# Unlock a directory processed by lock_directory
#
# is a particular command available on this machine?
#
cmd_avail()
{
set -- `type $1 2>&1`
if [ "$2" = "not" -a "$3" = "found" ] || [ "$3" = "not" -a "$4" = "found" ]
then
return 1
else
return 0
fi
}
unlock_directory() {
ul_dir=$1/. # get any symlink out of the way using '.'
if [ -d $ul_dir ]
then
find $ul_dir -type d ! -perm -0222 -print | $XARGS -t chmod +w
fi
}
# Use gnu xargs if available; faster, more reliable in general
XARGS=xargs
cmd_avail gxargs && XARGS=gxargs
for dir
do
unlock_directory $dir
done
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -14,20 +14,23 @@ PROJECT_ROOT = @PROJECT_ROOT@
include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
include $(RTEMS_ROOT)/make/leaf.cfg
include $(RTEMS_ROOT)/make/rtems.cfg
DESTDIR=$(PROJECT_RELEASE)/bin
PGMS=size_rtems
BUILD_PGMS=size_rtems
PGMS=$(BUILD_PGMS)
INSTALLED=$(PGMS:%=$(DESTDIR)/%)
CLEAN_ADDITIONS += $(BUILD_PGMS)
INSTALLED_PGMS=$(PGMS:%=$(DESTDIR)/%)
all: $(DESTDIR) $(PGMS) install
$(DESTDIR):
@INSTALL@ $(INSTDIRFLAGS) $@
install: $(INSTALLED)
# Install the program
$(DESTDIR)/%: %
$(INSTALLED_PGMS): $(PGMS)
@INSTALL@ $(INSTBINFLAGS) $^ $@
install: $(DESTDIR) $(INSTALLED_PGMS)

View File

@@ -1,9 +1,6 @@
#
# $Id$
#
# NOTE: of course we can't use any of these tools
# in this Makefile. Most notably: install-if-change
#
@SET_MAKE@
srcdir = @srcdir@
@@ -13,26 +10,34 @@ PROJECT_ROOT = @PROJECT_ROOT@
include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
include $(RTEMS_ROOT)/make/leaf.cfg
include $(RTEMS_ROOT)/make/rtems.cfg
DESTDIR=$(PROJECT_RELEASE)/update-tools
PGMS=update word-replace
BUILD_PGMS = update
ifneq (@PERL@,)
BUILD_PGMS += word-replace
endif
PGMS = $(BUILD_PGMS)
CLEAN_ADDITIONS += $(BUILD_PGMS)
MISC_SUPPORT=310_to_320_list
INSTALL_LIST= $(PGMS) $(MISC_SUPPORT)
INSTALLED_PGMS=$(PGMS:%=$(DESTDIR)/%)
INSTALLED_DATA=$(MISC_SUPPORT:%=$(DESTDIR)/%)
INSTALLED=$(INSTALL_LIST:%=$(DESTDIR)/%)
all: $(DESTDIR)
all: $(PGMS)
$(DESTDIR):
@INSTALL@ $(INSTDIRFLAGS) $@
install: $(INSTALLED)
$(INSTALLED_PGMS): $(PGMS)
@INSTALL@ $(INSTBINFLAGS) $^ $(DESTDIR)
$(INSTALLED_DATA): $(MISC_SUPPORT)
@INSTALL@ $(INSTDATAFLAGS) $^ $(DESTDIR)
install: $(DESTDIR) $(INSTALLED_PGMS) $(INSTALLED_DATA)
# Install the program
# FIXME: This isn't correct
$(DESTDIR)/%: %
$(make-script)
@INSTALL@ $(INSTBINFLAGS) $(PERL_PGMS) ${DESTDIR}
@INSTALL@ $(INSTDATAFLAGS) $(MISC_SUPPORT) ${DESTDIR}

216
tools/update/update.in Normal file
View File

@@ -0,0 +1,216 @@
#!@KSH@ -p
#
# $Id$
#
# Either bash or ksh will be ok for this; requires 'test -ot'
# (-p above just says to not parse $ENV file; makes it faster for
# those of us who set $ENV)
#
# Update RTEMS applications for the API changes from 3.1.0 to 3.2.0
#
# NOTE
#
# This is potentially a very dangerous program.
# progname=`basename $0`
progname=${0##*/} # fast basename hack for ksh, bash
USAGE=\
"
usage: $progname [ -vs ] [ -b base_directory ] [-p file] [-f] [files...]
-v -- verbose
-p -- file with replacement instructions
-s -- skip prompt for backup verification
-f -- do files at end of line
base_directory is the root directory of the source code to update. It
defaults to the current directory.
This program updates C, H, and .inl files.
"
fatal() {
if [ "$1" ]
then
echo >&2
echo $* >&2
echo >&2
fi
echo "$USAGE" 1>&2
exit 1
}
#
# KLUDGE to figure out at runtime how to echo a line without a
# newline.
#
count=`echo "\\c" | wc -c`
if [ ${count} -ne 0 ] ; then
EARG="-n"
EOL=""
else
EARG=""
EOL="\\c"
fi
#
# Function to make sure they do a backup
#
WARNING=\
"
*******************************************************************************
*******************************************************************************
*******************************************************************************
**** ****
**** WARNING!!! WARNING!!! WARNING!!! ****
**** ****
**** ALL SOURCE CODE SHOULD BE BACKED UP BEFORE RUNNING THIS PROGRAM!! ****
**** ****
**** WARNING!!! WARNING!!! WARNING!!! ****
**** ****
*******************************************************************************
*******************************************************************************
*******************************************************************************
"
verify_backup()
{
echo "$WARNING"
continue="yes"
while [ $continue = "yes" ]
do
echo ${EARG} "Do you wish to update the source tree at this time [y|n]? " ${EOL}
read answer
case $answer in
[yY]*)
continue="no"
;;
[nN]*)
echo
echo "Exitting at user request"
echo
exit 0
;;
esac
done
}
#
# Default tools to use...
#
# NOTE: The GNU versions of both of these are faster.
#
find_prog=find
xargs_prog=xargs
#
# process the options
#
verbose=""
suffix=""
mode=""
base_directory=.
do_files="no"
do_prompt="yes"
replacement_file="${RTEMS_ROOT}/update-tools/310_to_320_list"
while getopts sfp:b:v OPT
do
case "$OPT" in
v)
verbose="yes";;
s)
do_prompt="no";;
b)
base_directory=${OPTARG};;
p)
replacement_file=${OPTARG};;
f)
do_files="yes";;
*)
fatal
esac
done
let $((shiftcount = $OPTIND - 1))
shift $shiftcount
args=$*
#
# Make sure they have done a backup
#
if [ ${do_prompt} = "yes" ]
then
verify_backup
fi
#
# Validate the base directory
#
if [ ! -d $base_directory ]
then
fatal "${base_directory} does not exist"
fi
#
# Validate the replacement file
#
if [ ! -r $replacement_file ]
then
fatal "${replacement_file} does not exist or is not readable"
fi
#
# Verify enough of the RTEMS environment variables are set
#
if [ ! -d "${RTEMS_ROOT}" ]
then
fatal "RTEMS_ROOT environment variable is not initialized"
fi
#
# Update the files
#
generate_list()
{
if [ ${do_files} = "yes" ]
then
for i in $args
do
echo $i
done
else
${find_prog} ${base_directory} \( -name "*.[ch]" -o -name "*.inl" \) -print
fi
}
generate_list | ${xargs_prog} |
while read line
do
${RTEMS_ROOT}/update-tools/word-replace -p ${replacement_file} ${line}
if [ $? -ne 0 ]
then
exit 1
fi
for file in ${line}
do
mv ${file}.fixed ${file}
done
done
exit 0
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -0,0 +1,89 @@
#!@PERL@
#
# $Id$
#
eval "exec @PERL@ -S $0 $*"
if $running_under_some_shell;
require 'getopts.pl';
&Getopts("p:vh"); # help, pattern file, verbose,
if ($opt_h || ! $opt_p) {
print STDERR <<NO_MORE_HELP;
word-replace
Replace *words* with patterns. Pattern file specifies which patterns
to replace on each line. All patterns are wrapped with perl \\b regexp
specifiers.
Usage: $0 [-v] -p pattern-file files to replace
-v -- possibly more verbose
-p file -- pattern file
-h -- help
anything else == this help message
Pattern file looks like this:
# Example:
# ignores all lines with beginning with # or not exactly 2 fields
_Dorky_Name rtems_dorky_name # comments, and blank lines are cool
_Dorky_Name2 rtems_dorky_name2 # comments, and blank lines are cool
NO_MORE_HELP
exit 0;
}
$verbose = $opt_v;
$pattern_file = $opt_p;
# make standard outputs unbuffered (so the '.'s come out ok)
$oldfh = select(STDERR); $| = 1; select($oldfh);
$oldfh = select(STDOUT); $| = 1; select($oldfh);
# pull in the patterns
open(PATTERNS, "<$pattern_file") ||
die "could not open $pattern_file: $!, crapped out at";
foreach (<PATTERNS>)
{
chop;
s/#.*//;
next if /^$/;
($orig, $new, $junk, @rest) = split;
next if ( ! $orig || ! $new || $junk); # <2 or >2 patterns
die "pattern appears 2x: '$orig' in '$pattern_file'--" if defined($patterns{$orig});
$patterns{$orig} = $new;
}
close PATTERNS;
# walk thru each line in each file
foreach $file (@ARGV)
{
print "$file\t";
open (INFILE, "<$file") ||
die "could not open input file $file: $!";
$outfile = $file . ".fixed";;
open (OUTFILE, ">$outfile") ||
die "could not open output file $outfile: $!";
while (<INFILE>)
{
study; # maybe make s/// faster
foreach $key (keys %patterns)
{
if ( s/\b$key\b/$patterns{$key}/ge )
{
print ".";
}
}
print OUTFILE $_;
}
print "\n";
close INFILE;
close OUTFILE;
}