# Parse input file.
our (%ops);
-our (@funcs, @opers);
+our (@funcs, @opers, @order);
parse_input ();
# Produce output.
init_type ('number', 'any', C_TYPE => 'double',
ATOM => 'number', MANGLE => 'n', HUMAN_NAME => 'num',
STACK => 'ns', MISSING_VALUE => 'SYSMIS');
- init_type ('string', 'any', C_TYPE => 'struct fixed_string',
+ init_type ('string', 'any', C_TYPE => 'struct substring',
ATOM => 'string', MANGLE => 's', HUMAN_NAME => 'string',
STACK => 'ss', MISSING_VALUE => 'empty_string');
init_type ('boolean', 'any', C_TYPE => 'double',
init_type ('str_var', 'leaf', C_TYPE => 'const struct variable *',
ATOM => 'variable', MANGLE => 'Vs',
HUMAN_NAME => 'string_variable');
+ init_type ('var', 'leaf', C_TYPE => 'const struct variable *',
+ ATOM => 'variable', MANGLE => 'V',
+ HUMAN_NAME => 'variable');
# Vectors.
init_type ('vector', 'leaf', C_TYPE => 'const struct vector *',
FIXED_VALUE => 'c');
init_type ('case_idx', 'fixed', C_TYPE => 'size_t',
FIXED_VALUE => 'case_idx');
+ init_type ('dataset', 'fixed', C_TYPE => 'struct dataset *',
+ FIXED_VALUE => 'ds');
# One of these is emitted at the end of each expression as a sentinel
# that tells expr_evaluate() to return the value on the stack.
$op{OPTIMIZABLE} = 1;
$op{UNIMPLEMENTED} = 0;
$op{EXTENSION} = 0;
+ $op{PERM_ONLY} = 0;
for (;;) {
if (match ('extension')) {
$op{EXTENSION} = 1;
$op{OPTIMIZABLE} = 0;
} elsif (match ('absorb_miss')) {
$op{ABSORB_MISS} = 1;
+ } elsif (match ('perm_only')) {
+ $op{PERM_ONLY} = 1;
+ } elsif (match ('no_abbrev')) {
+ $op{NO_ABBREV} = 1;
} else {
last;
}
$ops{$a}->{OPNAME} cmp $ops{$b}->{OPNAME}}
@funcs;
@opers = sort {$ops{$a}->{NAME} cmp $ops{$b}->{NAME}} @opers;
- our (@order) = (@funcs, @opers);
+ @order = (@funcs, @opers);
}
# Reads the next token into $token, $toktype.