#!/usr/bin/env perl ############################################################################### # Purpose: Remove all occurrences of "#pragma once" from the source tree. # Usage: "unpragma-once *.h" or "find . -name \*.h | xargs unpragma-once" # Author: Vadim Zeitlin # Licence: Free Software released under BSD license # Copyright: (C) 2011 TT-Solutions SARL ############################################################################### use warnings; use strict; use autodie; use File::Copy qw(move); use File::Spec (); use File::Temp (); use IO::Handle; sub process_single_file { my $filename = shift; my ($volume, $dir, $basename) = File::Spec->splitpath($filename); open my $in, '<', $filename; my $out = File::Temp->new(DIR => $volume . $dir); my $guard = ''; my $last_was_empty = 0; while (<$in>) { if (/^#pragma\s+once\s+$/) { die "Duplicate #pragma once at $filename:$.\n" if $guard; ($guard = uc $basename) =~ s/(\w+)\.(\w+)/$1_$2_/; print $out "#ifndef $guard\n"; print $out "#define $guard\n"; } else { $last_was_empty = ($_ =~ /^\s*$/); print $out $_ } } if ($guard) { print $out "\n" unless $last_was_empty; print $out "#endif // $guard\n"; $out->flush(); move($out->filename, $filename); } } for (@ARGV) { process_single_file $_ }