use strict;
use warnings;
use Data::Dumper;
+use Getopt::Long;
use v5.10;
+my $input = '';
+my $prefix = '';
+my $result = GetOptions(
+ 'input=s' => \$input,
+ 'prefix=s' => \$prefix
+);
+
+die qq|Input file "$input" does not exist!| unless -e $input;
+
# reads in a whole file
sub slurp {
open my $fh, '<', shift;
# Stores the different states.
my %states;
-# XXX: don’t hardcode input and output
-my $input = '../parser-specs/commands.spec';
my @raw_lines = split("\n", slurp($input));
my @lines;
# It is important to keep the order the same, so we store the keys once.
my @keys = keys %states;
-open(my $enumfh, '>', 'GENERATED_enums.h');
+open(my $enumfh, '>', "GENERATED_${prefix}_enums.h");
# XXX: we might want to have a way to do this without a trailing comma, but gcc
# seems to eat it.
close($enumfh);
# Third step: Generate the call function.
-open(my $callfh, '>', 'GENERATED_call.h');
+open(my $callfh, '>', "GENERATED_${prefix}_call.h");
say $callfh 'static void GENERATED_call(const int call_identifier, struct CommandResult *result) {';
say $callfh ' switch (call_identifier) {';
my $call_id = 0;
# Fourth step: Generate the token datastructures.
-open(my $tokfh, '>', 'GENERATED_tokens.h');
+open(my $tokfh, '>', "GENERATED_${prefix}_tokens.h");
for my $state (@keys) {
my $tokens = $states{$state};
- say $tokfh 'cmdp_token tokens_' . $state . '[' . scalar @$tokens . '] = {';
+ say $tokfh 'static cmdp_token tokens_' . $state . '[' . scalar @$tokens . '] = {';
for my $token (@$tokens) {
my $call_identifier = 0;
my $token_name = $token->{token};
say $tokfh '};';
}
-say $tokfh 'cmdp_token_ptr tokens[' . scalar @keys . '] = {';
+say $tokfh 'static cmdp_token_ptr tokens[' . scalar @keys . '] = {';
for my $state (@keys) {
my $tokens = $states{$state};
say $tokfh ' { tokens_' . $state . ', ' . scalar @$tokens . ' },';
* input parser-specs/commands.spec.
******************************************************************************/
-#include "GENERATED_enums.h"
+#include "GENERATED_commands_enums.h"
typedef struct token {
char *name;
int n;
} cmdp_token_ptr;
-#include "GENERATED_tokens.h"
+#include "GENERATED_commands_tokens.h"
/*******************************************************************************
* The (small) stack where identified literals are stored during the parsing
static struct CommandResult subcommand_output;
static struct CommandResult command_output;
-#include "GENERATED_call.h"
+#include "GENERATED_commands_call.h"
static void next_state(const cmdp_token *token) {