#!/usr/bin/env perl # usage: cgal_conditional_include file1 ... # Author: Geert-Jan Giezeman. # Protects CGAL and other include directives in the following way: # #ifndef CGAL_HANDLE_H # #include # #endif # # is converted to # # #include # #ifndef CGAL_PROTECT_STDLIB_H # #include # #define CGAL_PROTECT_STDLIB_H # #endif # # is converted to # # #include use strict; my $protect_name; my $suffix; my $tmpfilename = "CondIncl$$"; my $filename; my $skipped = 0; FILE: foreach $filename (@ARGV) { if (!open(INFILE, $filename)) { print STDERR "Could not open ${filename} for reading\n$!\n"; next FILE; } open(TMPFILE, ">$tmpfilename") || die "Could not open temp file for writing\n$!\n"; my $last = ''; Line: while () { if (($protect_name,$suffix) = m|^[\s]*#[\s]*ifndef[\s]+CGAL_PROTECT_(.*?)(_H)?\b|) { my $protect_line = $_; $_ = ; my $include_file; if ( !(($include_file) = m|^[\s]*#[\s]*include[\s]*<(.*?)(?:\.h)?>[\s]*|)) { warn "'#include <...>' missing in line ", $.-$skipped," ($filename)\n"; print TMPFILE $protect_line; redo; } my $include_line = $_; $include_file =~ s'/'_'g; $include_file =~ tr/a-z/A-Z/; if ($include_file ne $protect_name) { warn "'#ifndef CGAL_PROTECT_$protect_name$suffix'", " followed by non corresponding #include in line ", $.-$skipped," ($filename)\n"; print TMPFILE $protect_line; print TMPFILE $include_line; next; } $_ = ; my $protect_name2; if (!(($protect_name2) = m|^[\s]*#[\s]*define[\s]+CGAL_PROTECT_(.*?)(?:_H)?[\s]*$|)) { warn "'#define CGAL_PROTECT_$protect_name$suffix' missing in line ", $.-$skipped," ($filename)\n"; print TMPFILE $protect_line; print TMPFILE $include_line; redo; } my $protect_line2 = $_; if ($protect_name2 ne $protect_name) { warn "'#ifndef CGAL_PROTECT_$protect_name$suffix' lacks ", "'#define CGAL_PROTECT_$protect_name$suffix' in line ", $.-$skipped," ($filename)\n"; print TMPFILE $protect_line; print TMPFILE $include_line; print TMPFILE $protect_line2; next; } $_ = ; if ( ! m|^[\s]*#[\s]*endif|) { warn "'#ifndef CGAL_PROTECT_$protect_name$suffix' lacks ", "'#endif' in line ", $.-$skipped," ($filename)\n"; print TMPFILE $protect_line; print TMPFILE $include_line; print TMPFILE $protect_line2; redo; } print TMPFILE $include_line; $skipped += 3; } elsif ((($protect_name,$suffix) = m|^[\s]*#[\s]*ifndef[\s]+CGAL_(.*?)(_H)?[\s]*$|)) { my $protect_line; $protect_line = $_; $_ = ; my $include_file; if ( !(($include_file) = m|^[\s]*#[\s]*include[\s]*[\s]*|)) { print TMPFILE $protect_line; redo; } my $include_line = $_; $include_file =~ s'/'_'g; $include_file =~ tr/a-z/A-Z/; if ($include_file ne $protect_name) { warn "'#ifndef CGAL_$protect_name$suffix'", " followed by non corresponding #include in line ", $.-$skipped," ($filename)\n"; print TMPFILE $protect_line; print TMPFILE $include_line; next; } $_ = ; if ( ! m|^[\s]*#[\s]*endif|) { warn "'#ifndef CGAL_$protect_name$suffix' lacks ", "'#endif' in line ", $.-$skipped," ($filename)\n"; print TMPFILE $protect_line; print TMPFILE $include_line; redo; } print TMPFILE $include_line; $skipped += 2; } else { # copy other lines print TMPFILE $_; } } close INFILE; close TMPFILE; if ($?) { print STDERR "Conversion of ${filename} failed\n$!\n"; next FILE; } if (!rename($tmpfilename,${filename})) { print STDERR "Cannot rename $tmpfilename to ${filename}.\n$!\n"; print STDERR "Conversion of ${filename} failed\n"; } }