diff options
author | wl <wl> | 2008-09-30 13:47:35 +0000 |
---|---|---|
committer | wl <wl> | 2008-09-30 13:47:35 +0000 |
commit | 25b34423cbcbb9f9073d0052a99bb9f5269ddcbe (patch) | |
tree | a21e773bbde8498e8bdcc7f104eeb890ed967ca8 /src | |
parent | 82f5ab3a7616505fb0f068cff66af7871fe6c4f8 (diff) | |
download | groff-25b34423cbcbb9f9073d0052a99bb9f5269ddcbe.tar.gz |
Restore behaviour of \$0 if a macro is called with string syntax
(problem caused by change on 2008-09-29).
* src/roff/troff/input.cpp (input_iterator, input_stack,
macro_iterator): Add `get_macro_name' member function.
(interpolate_string): Use it.
Diffstat (limited to 'src')
-rw-r--r-- | src/roff/troff/input.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/roff/troff/input.cpp b/src/roff/troff/input.cpp index 758293e7..304f4b2c 100644 --- a/src/roff/troff/input.cpp +++ b/src/roff/troff/input.cpp @@ -220,6 +220,7 @@ private: virtual int nargs() { return 0; } virtual input_iterator *get_arg(int) { return 0; } virtual arg_list *get_arg_list() { return 0; } + virtual symbol get_macro_name() { return NULL_SYMBOL; } virtual int space_follows_arg(int) { return 0; } virtual int get_break_flag() { return 0; } virtual int get_location(int, const char **, int *) { return 0; } @@ -422,6 +423,7 @@ public: static void push(input_iterator *); static input_iterator *get_arg(int); static arg_list *get_arg_list(); + static symbol get_macro_name(); static int space_follows_arg(int); static int get_break_flag(); static int nargs(); @@ -639,6 +641,15 @@ arg_list *input_stack::get_arg_list() return 0; } +symbol input_stack::get_macro_name() +{ + input_iterator *p; + for (p = top; p != 0; p = p->next) + if (p->has_args()) + return p->get_macro_name(); + return NULL_SYMBOL; +} + int input_stack::space_follows_arg(int i) { input_iterator *p; @@ -3671,6 +3682,7 @@ public: int has_args() { return 1; } input_iterator *get_arg(int); arg_list *get_arg_list(); + symbol get_macro_name(); int space_follows_arg(int); int get_break_flag() { return with_break; } int nargs() { return argc; } @@ -3701,6 +3713,11 @@ arg_list *macro_iterator::get_arg_list() return args; } +symbol macro_iterator::get_macro_name() +{ + return nm; +} + int macro_iterator::space_follows_arg(int i) { if (i > 0 && i <= argc) { @@ -4312,7 +4329,9 @@ static void interpolate_string(symbol nm) input_stack::push(si); } else { - macro_iterator *mi = new macro_iterator(nm, *m, "string", 1); + // if a macro is called as a string, \$0 doesn't get changed + macro_iterator *mi = new macro_iterator(input_stack::get_macro_name(), + *m, "string", 1); input_stack::push(mi); } } |