summaryrefslogtreecommitdiff
path: root/src/coreclr/applydefines.pl
blob: b4d1ca4d01a59cf4e8b03f1eb9eb5bae7e5da5ee (plain)
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
126
127
128
#!/usr/bin/env perl

use strict;

my $sourceFile;
my $outputFile="";
my $definesFile="";

#parse arguments

if (@ARGV == 0)
{
   Usage();
}

my %Defines;

# parse args

while (@ARGV)
{
    my $nextArg=shift;
    if($nextArg eq '-s')
    {
        NeedNextArg($nextArg, 'file name');
        $sourceFile=shift;
    }
    elsif ($nextArg eq '-o')
    {
        NeedNextArg($nextArg, 'file name');
        $outputFile=shift;
    }
    elsif ($nextArg eq '-f')
    {
        NeedNextArg($nextArg, 'file name');
        $definesFile=shift;
    }
    elsif ($nextArg eq '-d')
    {
        NeedNextArg($nextArg, 'value');
        my $customDefine=shift;
        if ( $customDefine=~m/^\"?(\S+)=(\S*)\"?$/ )
        {
           $Defines{$1}=$2;
        }
        else
        {
           print "-d expects name=value\n";
           Usage();
        }
    }
    elsif ($nextArg eq '-h')
    {
        Usage();
    }
    else
    {
        print "Unknown argument '$nextArg'\n";
        Usage();
    }
}

# check if we have what we need

if ($sourceFile eq "" || $outputFile eq "" || $definesFile eq "")
{
	Usage();
}

open (SOURCEFILE,$sourceFile) or die "Cannot open $sourceFile for reading\n";
open (DEFINESFILE,$definesFile) or die "Cannot open $definesFile for reading\n";
open (OUTPUTFILE,"> $outputFile") or die "Cannot open $outputFile for writing\n";

#load defines

while (<DEFINESFILE>)
{
	chomp;
	if (/^\s*#define\s+(\S+)\s+(\S*)\s*$/)
	{
		if (defined $2)
		{
			$Defines{$1}=$2;
		}
		else
		{
			$Defines{$1}="";
		}
	}
}

while (<SOURCEFILE>)
{
    my $string=$_;
    my $processed="";
    while ($string=~m/\$\(([^)]+)\)/)
    {
		if (! defined $Defines{$1})
		{
			die "'$1' is not defined.\n";
		}
		$string=~s/\$\(([^)]+)\)/$Defines{$1}/;
    }
    print OUTPUTFILE $string ;
}


# functions
sub Usage()
{
    print "Usage: applydefines [options]\n";
    print "\t-s <file>\t: the source file to process\n";
    print "\t-f <file>\t: the file containing #define settings\n";
    print "\t-o <file>\t: the output file\n";
    print "\t-d <name>=<Value>\t: additional define\n";
    
    exit 1;
}

sub NeedNextArg()
{
    if (@ARGV == 0)
    {
        print "'@_[0]' requires @_[1]\n";
        Usage();
    }
}