forked from xythian/wp-lambdamoo
/
version_opt_gen.pl
152 lines (138 loc) · 3.31 KB
/
version_opt_gen.pl
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#!/usr/bin/perl
use warnings;
use strict;
our $oreflect_file = 'version_options.h';
# @options grammar
#
# <option_list> ::= <option_elements> ...
# <option elements> ::=
# _DDEF => [<id> ...] | # #define-only options
# _DINT => [<id> ...] | # integer options
# _DSTR => [<id> ...] | # string options
# _DENUM => [[<id> => <ovalues>] ...] # enumeration options
# <ovalues> ::=
# <value> ... | # abbreviates {<value>=>[], ...}
# {<value> => <odescr> ...}
# <odescr> ::=
# <id> | # use <id> to depict this option value
# [<option_list>] # use <value> AND include these other options
# #
# # there should probably be a way to both specify an <id>
# # and include a list of suboptions, we don't need it yet
my @options =
(
#network settings
_DENUM => [[NETWORK_PROTOCOL =>
{ NP_SINGLE => [],
NP_TCP => [_DINT => [qw(DEFAULT_PORT)]],
NP_LOCAL => [_DSTR => [qw(DEFAULT_CONNECT_FILE)]],
}],
[NETWORK_STYLE =>
qw(NS_BSD
NS_SYSV
)],
[MPLEX_STYLE =>
qw(MP_SELECT
MP_POLL
MP_FAKE
)],
[OUTBOUND_NETWORK =>
{ qw(0 OFF
1 ON
) }],
],
_DINT => [qw(DEFAULT_CONNECT_TIMEOUT
MAX_QUEUED_OUTPUT
MAX_QUEUED_INPUT
)],
# optimizations
_DDEF => [qw(USE_GNU_MALLOC
UNFORKED_CHECKPOINTS
BYTECODE_REDUCE_REF
STRING_INTERNING
MEMO_STRLEN
)],
# input options
_DDEF => [qw(LOG_COMMANDS
INPUT_APPLY_BACKSPACE
IGNORE_PROP_PROTECTED
)],
_DSTR => [qw(OUT_OF_BAND_PREFIX
OUT_OF_BAND_QUOTE_PREFIX
)],
# execution limits
_DINT => [qw(DEFAULT_MAX_STACK_DEPTH
DEFAULT_FG_TICKS
DEFAULT_BG_TICKS
DEFAULT_FG_SECONDS
DEFAULT_BG_SECONDS
PATTERN_CACHE_SIZE
DEFAULT_MAX_LIST_CONCAT
MIN_LIST_CONCAT_LIMIT
DEFAULT_MAX_STRING_CONCAT
MIN_STRING_CONCAT_LIMIT
)],
);
our $indent;
my %put;
sub put_dlist {
local $indent = shift;
while ((my $_DXXX, my $lst, @_) = @_) {
$put{$_DXXX}->($_) foreach (@$lst);
}
}
$put{_DDEF} = sub {
my ($n) = @_;
print OREFL <<EOF ;
#${indent}ifdef $n
_DDEF("$n")
#${indent}else
_DNDEF("$n")
#${indent}endif
EOF
};
for (qw(_DSTR _DINT)) {
my $_DXXX = $_;
$put{$_} = sub {
my ($n) = @_;
print OREFL <<EOF ;
#${indent}ifdef $n
${_DXXX}1($n)
#${indent}else
_DNDEF("$n")
#${indent}endif
EOF
};
}
$put{_DENUM} = sub {
my($d,@svals) = @{$_[0]};
print OREFL <<EOF ;
#${indent}if !defined($d)
_DNDEF("$d")
EOF
my %svals = ref($svals[0]) ? %{$svals[0]} : (map {$_,[]} @svals);
foreach my $vs (keys %svals) {
my $vd = ref($svals{$vs}) ? $vs : $svals{$vs};
print OREFL <<EOF ;
#${indent}elif $d == $vs
_DSTR("$d","$vd")
EOF
put_dlist($indent . ' ', @{$svals{$vs}}) if ref($svals{$vs});
}
print OREFL <<EOF ;
#${indent}else
_DINT1($d)
#${indent}endif
EOF
};
open OREFL,">$oreflect_file" or die "could not write $oreflect_file: $!";
print OREFL <<EOF ;
/******************************************************************/
/* Automatically generated file; changes made here may be lost */
/* If options.h changes, edit and rerun version_opt_gen.pl */
/******************************************************************/
#define _DINT1(OPT) _DINT(#OPT,OPT)
#define _DSTR1(OPT) _DSTR(#OPT,OPT)
EOF
put_dlist('', @options);
close OREFL;