1#!/usr/bin/perl -w 2#- 3# Copyright (c) 2003 Dag-Erling Coïdan Smørgrav 4# All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions 8# are met: 9# 1. Redistributions of source code must retain the above copyright 10# notice, this list of conditions and the following disclaimer 11# in this position and unchanged. 12# 2. Redistributions in binary form must reproduce the above copyright 13# notice, this list of conditions and the following disclaimer in the 14# documentation and/or other materials provided with the distribution. 15# 3. The name of the author may not be used to endorse or promote products 16# derived from this software without specific prior written permission. 17# 18# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28# 29# $FreeBSD$ 30# 31 32use strict; 33use Getopt::Std; 34 35our $opt_b; 36our $opt_v; 37 38sub hcomp($) 39{ 40 my $fn = shift; 41 42 local *FILE; 43 my $header; 44 45 warn("$fn\n") 46 if ($opt_v); 47 48 open(FILE, "<", $fn) 49 or die("$fn: $!\n"); 50 $header = join('', <FILE>); 51 close(FILE); 52 53 # Remove comments 54 $header =~ s|/\*.*?\*/||gs; 55 $header =~ s|//.*$||gm; 56 57 # Collapse preprocessor directives 58 while ($header =~ s|(\n\#.*?)\\\n|$1|gs) { 59 # nothing 60 } 61 62 # Remove superfluous whitespace 63 $header =~ s|^\s+||s; 64 $header =~ s|^\s+||gm; 65 $header =~ s|\s+$||s; 66 $header =~ s|\s+$||gm; 67 $header =~ s|\n+|\n|gs; 68 $header =~ s|[ \t]+| |gm; 69 70 open(FILE, ">", "$fn.new") 71 or die("$fn.new: $!\n"); 72 print(FILE $header); 73 close(FILE); 74 75 rename($fn, "$fn.$opt_b") 76 if defined($opt_b); 77 rename("$fn.new", $fn); 78} 79 80sub usage() 81{ 82 print(STDERR "usage: hcomp [-b ext] file ...\n"); 83 exit(1); 84} 85 86MAIN:{ 87 my %opts; 88 getopts('b:v') 89 or usage(); 90 foreach (@ARGV) { 91 hcomp($_); 92 } 93} 94