summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwl <wl>2008-09-30 13:47:35 +0000
committerwl <wl>2008-09-30 13:47:35 +0000
commit25b34423cbcbb9f9073d0052a99bb9f5269ddcbe (patch)
treea21e773bbde8498e8bdcc7f104eeb890ed967ca8
parent82f5ab3a7616505fb0f068cff66af7871fe6c4f8 (diff)
downloadgroff-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.
-rw-r--r--ChangeLog9
-rw-r--r--src/roff/troff/input.cpp21
2 files changed, 29 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 20cf660f..973cd237 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-09-30 Werner LEMBERG <wl@gnu.org>
+
+ 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.
+
2008-09-29 Werner LEMBERG <wl@gnu.org>
Make \\*[xxx]\\ within a macro (with `xxx' a macro too) work as
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);
}
}