forked from dharmanshu1921/Daa-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cpp.pm
126 lines (91 loc) · 2.13 KB
/
cpp.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package Filter::cpp;
use Filter::Util::Exec ;
use Config ;
use strict;
use warnings;
our $VERSION = '1.60' ;
my $cpp;
my $sep;
if ($^O eq 'MSWin32') {
$cpp = 'cpp.exe' ;
$sep = ';';
}
else {
($cpp) = $Config{cppstdin} =~ /^(\S+)/;
$sep = ':';
}
if (! $cpp) {
require Carp;
Carp::croak ("Cannot find cpp\n");
}
# Check if cpp is installed
if ( ! -x $cpp) {
my $foundCPP = 0 ;
foreach my $dir (split($sep, $ENV{PATH}), '')
{
if (-x "$dir/$cpp")
{
$foundCPP = 1;
last ;
}
}
if (! $foundCPP) {
require Carp;
Carp::croak("Cannot find cpp\n");
}
}
sub import
{
my($self, @args) = @_ ;
if ($^O eq 'MSWin32') {
Filter::Util::Exec::filter_add ($self, 'cmd', '/c',
"cpp.exe 2>nul") ;
}
else {
Filter::Util::Exec::filter_add ($self, 'sh', '-c',
"$Config{'cppstdin'} $Config{'cppminus'} 2>/dev/null") ;
}
}
1 ;
__END__
=head1 NAME
Filter::cpp - cpp source filter
=head1 SYNOPSIS
use Filter::cpp ;
=head1 DESCRIPTION
This source filter pipes the current source file through the C
pre-processor (cpp) if it is available.
As with all source filters its scope is limited to the current source
file only. Every file you want to be processed by the filter must have a
use Filter::cpp ;
near the top.
Here is an example script which uses the filter:
use Filter::cpp ;
#define FRED 1
$a = 2 + FRED ;
print "a = $a\n" ;
#ifdef FRED
print "Hello FRED\n" ;
#else
print "Where is FRED\n" ;
#endif
And here is what it will output:
a = 3
Hello FRED
This example below, provided by Michael G Schwern, shows a clever way
to get Perl to use a C pre-processor macro when the Filter::cpp module
is available, or to use a Perl sub when it is not.
# use Filter::cpp if we can.
BEGIN { eval 'use Filter::cpp' }
sub PRINT {
my($string) = shift;
#define PRINT($string) \
(print $string."\n")
}
PRINT("Mu");
Look at Michael's Tie::VecArray module for a practical use.
=head1 AUTHOR
Paul Marquess
=head1 DATE
11th December 1995.
=cut