]> git.sur5r.net Git - i3/i3/commitdiff
generate-command-parser: make input/output configurable
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 7 Oct 2012 14:30:34 +0000 (16:30 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 7 Oct 2012 14:31:35 +0000 (16:31 +0200)
generate-command-parser.pl
src/commands_parser.c
src/i3.mk

index 01cbe462ec64d05c7a51c2d80da8e7b710c5820c..ed05efd420577bf56e83367fab1683e4269159c9 100755 (executable)
 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;
@@ -24,8 +34,6 @@ sub slurp {
 # 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;
 
@@ -103,7 +111,7 @@ for my $line (@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.
@@ -117,7 +125,7 @@ say $enumfh '} cmdp_state;';
 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;
@@ -168,11 +176,11 @@ close($callfh);
 
 # 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};
@@ -192,7 +200,7 @@ for my $state (@keys) {
     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 . ' },';
index d739f4e146ad7ae11449829c464457a019d4df96..bbba2c44eb5cbc72a69eb5e073266690b401a892 100644 (file)
@@ -46,7 +46,7 @@
  * input parser-specs/commands.spec.
  ******************************************************************************/
 
-#include "GENERATED_enums.h"
+#include "GENERATED_commands_enums.h"
 
 typedef struct token {
     char *name;
@@ -63,7 +63,7 @@ typedef struct tokenptr {
     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
@@ -182,7 +182,7 @@ static Match current_match;
 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) {
index 78e19890e52882e77485747ba813b3648ed1dc4b..94a988ffeb8209ad885a7ee7e2791e404be501b7 100644 (file)
--- a/src/i3.mk
+++ b/src/i3.mk
@@ -55,7 +55,7 @@ src/commands_parser.o: src/commands_parser.c $(i3_HEADERS_DEP) i3-command-parser
 
 i3-command-parser.stamp: generate-command-parser.pl parser-specs/commands.spec
        echo "[i3] Generating command parser"
-       (cd include; ../generate-command-parser.pl)
+       (cd include; ../generate-command-parser.pl --input=../parser-specs/commands.spec --prefix=commands)
        touch $@
 
 i3: libi3.a $(i3_OBJECTS)