diff options
| -rw-r--r-- | parse-events.c | 59 |
1 files changed, 31 insertions, 28 deletions
diff --git a/parse-events.c b/parse-events.c index 7b3b440..c5e8080 100644 --- a/parse-events.c +++ b/parse-events.c | |||
| @@ -30,11 +30,11 @@ | |||
| 30 | 30 | ||
| 31 | #include "parse-events.h" | 31 | #include "parse-events.h" |
| 32 | 32 | ||
| 33 | static char *input_buf; | 33 | static const char *input_buf; |
| 34 | static unsigned long long input_buf_ptr; | 34 | static unsigned long long input_buf_ptr; |
| 35 | static unsigned long long input_buf_siz; | 35 | static unsigned long long input_buf_siz; |
| 36 | 36 | ||
| 37 | static void init_input_buf(char *buf, unsigned long long size) | 37 | static void init_input_buf(const char *buf, unsigned long long size) |
| 38 | { | 38 | { |
| 39 | input_buf = buf; | 39 | input_buf = buf; |
| 40 | input_buf_siz = size; | 40 | input_buf_siz = size; |
| @@ -657,26 +657,6 @@ static enum event_type get_type(int ch) | |||
| 657 | return EVENT_OP; | 657 | return EVENT_OP; |
| 658 | } | 658 | } |
| 659 | 659 | ||
| 660 | static void __push_char(char c) | ||
| 661 | { | ||
| 662 | if (input_buf_ptr <= 0) | ||
| 663 | die("too much pushback"); | ||
| 664 | input_buf[--input_buf_ptr] = c; | ||
| 665 | } | ||
| 666 | |||
| 667 | static void __push_str(char *s) | ||
| 668 | { | ||
| 669 | char *e = s; | ||
| 670 | |||
| 671 | while (*e++) | ||
| 672 | /* nothing */; | ||
| 673 | e--; | ||
| 674 | while (s != e) { | ||
| 675 | e--; | ||
| 676 | __push_char(*e); | ||
| 677 | } | ||
| 678 | } | ||
| 679 | |||
| 680 | static int __read_char(void) | 660 | static int __read_char(void) |
| 681 | { | 661 | { |
| 682 | if (input_buf_ptr >= input_buf_siz) | 662 | if (input_buf_ptr >= input_buf_siz) |
| @@ -693,6 +673,8 @@ static int __peek_char(void) | |||
| 693 | return input_buf[input_buf_ptr]; | 673 | return input_buf[input_buf_ptr]; |
| 694 | } | 674 | } |
| 695 | 675 | ||
| 676 | static enum event_type force_token(const char *str, char **tok); | ||
| 677 | |||
| 696 | static enum event_type __read_token(char **tok) | 678 | static enum event_type __read_token(char **tok) |
| 697 | { | 679 | { |
| 698 | char buf[BUFSIZ]; | 680 | char buf[BUFSIZ]; |
| @@ -848,24 +830,45 @@ static enum event_type __read_token(char **tok) | |||
| 848 | if (strcmp(*tok, "LOCAL_PR_FMT") == 0) { | 830 | if (strcmp(*tok, "LOCAL_PR_FMT") == 0) { |
| 849 | free(*tok); | 831 | free(*tok); |
| 850 | *tok = NULL; | 832 | *tok = NULL; |
| 851 | __push_str("\"\%s\" "); | 833 | return force_token("\"\%s\" ", tok); |
| 852 | return __read_token(tok); | ||
| 853 | } else if (strcmp(*tok, "STA_PR_FMT") == 0) { | 834 | } else if (strcmp(*tok, "STA_PR_FMT") == 0) { |
| 854 | free(*tok); | 835 | free(*tok); |
| 855 | *tok = NULL; | 836 | *tok = NULL; |
| 856 | __push_str("\" sta:%pM\" "); | 837 | return force_token("\" sta:%pM\" ", tok); |
| 857 | return __read_token(tok); | ||
| 858 | } else if (strcmp(*tok, "VIF_PR_FMT") == 0) { | 838 | } else if (strcmp(*tok, "VIF_PR_FMT") == 0) { |
| 859 | free(*tok); | 839 | free(*tok); |
| 860 | *tok = NULL; | 840 | *tok = NULL; |
| 861 | __push_str("\" vif:%p(%d)\" "); | 841 | return force_token("\" vif:%p(%d)\" ", tok); |
| 862 | return __read_token(tok); | ||
| 863 | } | 842 | } |
| 864 | } | 843 | } |
| 865 | 844 | ||
| 866 | return type; | 845 | return type; |
| 867 | } | 846 | } |
| 868 | 847 | ||
| 848 | static enum event_type force_token(const char *str, char **tok) | ||
| 849 | { | ||
| 850 | const char *save_input_buf; | ||
| 851 | unsigned long long save_input_buf_ptr; | ||
| 852 | unsigned long long save_input_buf_siz; | ||
| 853 | enum event_type type; | ||
| 854 | |||
| 855 | /* save off the current input pointers */ | ||
| 856 | save_input_buf = input_buf; | ||
| 857 | save_input_buf_ptr = input_buf_ptr; | ||
| 858 | save_input_buf_siz = input_buf_siz; | ||
| 859 | |||
| 860 | init_input_buf(str, strlen(str)); | ||
| 861 | |||
| 862 | type = __read_token(tok); | ||
| 863 | |||
| 864 | /* reset back to original token */ | ||
| 865 | input_buf = save_input_buf; | ||
| 866 | input_buf_ptr = save_input_buf_ptr; | ||
| 867 | input_buf_siz = save_input_buf_siz; | ||
| 868 | |||
| 869 | return type; | ||
| 870 | } | ||
| 871 | |||
| 869 | static void free_token(char *tok) | 872 | static void free_token(char *tok) |
| 870 | { | 873 | { |
| 871 | if (tok) | 874 | if (tok) |
