[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Fwd: [PATCH] Add support for resetting '__file__' and '__line__'.
From: |
Raphael 'kena' Poss |
Subject: |
Fwd: [PATCH] Add support for resetting '__file__' and '__line__'. |
Date: |
Sat, 30 Oct 2010 14:54:40 +0200 |
Dear all,
I posted the mail below to m4-patches a while ago, but I haven't seen any
reaction; did my mail server do anything wrong?
Begin doorgestuurd bericht:
> Van: Raphael 'kena' Poss <address@hidden>
> Datum: 6 oktober 2010 22:59:43 GMT+02:00
> Aan: address@hidden
> Onderwerp: [PATCH] Add support for resetting '__file__' and '__line__'.
>
> Please review the patch below.
>
> Context:
>
> Op 3 jul 2009, om 15:37 heeft Raphaël “Kena” Poss het volgende geschreven:
>
>> as part of a project I am looking for ways to perform context-insensitive
>> but parameterized substitutions on C code. It happens that m4 delivers well
>> for what I need to do. Except for the following.
>> [...] using m4 after the C preprocessor mostly works, but then m4 does not
>> recognize the location markers (#line) inserted by the preprocessor and
>> therefore most m4 errors are reported at an incorrect location, and
>> multi-line expansions cause m4 to use wrong relative numbers in new
>> synclines. [...]
>> I tried a possible route forward by replacing any occurrence of "#line X" in
>> the m4 input by m4_define(`__line__', X), but unfortunately that doesn't
>> seem to help. Is there an option to allow __line__ (and __file__) to be
>> reset by macros?
>
> Patch:
>
> * src/input.c (reset_line, reset_file): Add functions to reset the
> current location.
> * src/m4.h: Declare them.
> * src/builtin.c (m4___file__, m4___line__): Use them.
>
> * doc/m4.texinfo (Location): Document the new feature. Add a
> test.
> * NEWS: Document the new feature.
> ---
> ChangeLog | 12 ++++++++++++
> NEWS | 2 ++
> doc/m4.texinfo | 39 ++++++++++++++++++++++++++++++++++-----
> src/builtin.c | 26 ++++++++++++++++++++------
> src/input.c | 19 +++++++++++++++++++
> src/m4.h | 5 +++++
> 6 files changed, 92 insertions(+), 11 deletions(-)
>
> diff --git a/ChangeLog b/ChangeLog
> index 5e5889e..9761fb0 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,15 @@
> +2010-10-06 Raphael 'kena' Poss <address@hidden>
> +
> + Add support for resetting '__file__' and '__line__'.
> + * src/input.c (reset_line, reset_file): Add functions to reset the
> + current location.
> + * src/m4.h: Declare them.
> + * src/builtin.c (m4___file__, m4___line__): Use them.
> +
> + * doc/m4.texinfo (Location): Document the new feature. Add a
> + test.
> + * NEWS: Document the new feature.
> +
> 2010-08-30 Eric Blake <address@hidden>
>
> Clean up compiler warnings.
> diff --git a/NEWS b/NEWS
> index 1afe792..c45462a 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -3,6 +3,8 @@ GNU M4 NEWS - User visible changes.
> * Noteworthy changes in Version 1.6 (????-??-??) [stable]
> Released by ????, based on git versions 1.4.10b.x-* and 1.5.*
>
> +** Add support for resetting '__file__' and '__line__'.
> +
> ** Fix regressions introduced in 1.4.10b:
> *** Using `builtin' or `indir' to perform nested `shift' calls triggered
> an assertion failure (not present in 1.4.11).
> diff --git a/doc/m4.texinfo b/doc/m4.texinfo
> index 91b8e00..c803c35 100644
> --- a/doc/m4.texinfo
> +++ b/doc/m4.texinfo
> @@ -7779,11 +7779,12 @@
> Line numbers start at 1 for each file. If the file was found due to the
> @option{-I} option or @env{M4PATH} environment variable, that is
> reflected in the file name. The syncline option (@option{-s},
> address@hidden features, , Invoking m4}), and the
> address@hidden and @samp{l} flags of @code{debugmode} (@pxref{Debugmode}),
> -also use this notion of current file and line. Redefining the three
> -location macros has no effect on syncline, debug, warning, or error
> -message output.
> address@hidden features, , Invoking m4}), and the @samp{f} and
> address@hidden flags of @code{debugmode} (@pxref{Debugmode}), also use this
> +notion of current file and line. Redefining the three location macros
> +has no effect on syncline, debug, warning, or error message output,
> +although the line numbers and file names can be reset as described
> +below.
>
> This example reuses the file @file{incl.m4} mentioned earlier
> (@pxref{Include}):
> @@ -7841,6 +7842,34 @@
> @result{}12
> @end example
>
> +The @address@hidden and @address@hidden macros take an optional
> +argument which allow to reset the current input file name and line
> +number, respectively. If @option{-s} is enabled, a synchronization line
> +will be emitted at the next newline in the input. Input line numbers
> +will autoincrement from the new value, and the file name will stay
> +active for the current input source until the input source is exhausted
> +or the name is reset again. This feature can be used when the input to
> +M4 already contains synchronization information, as when M4 is used as a
> +filter between a preprocessor and a compiler.
> +
> address@hidden options: -s
> address@hidden
> +$ @kbd{m4 -s}
> +foo __line__(42)bar __line__
> +baz __line__
> +__line__
> address@hidden 1 "stdin"
> address@hidden bar 42
> address@hidden 43
> address@hidden 43
> address@hidden
> +foo __file__(`newname')bar __file__
> +baz __file__
> address@hidden bar newname
> address@hidden 46 "newname"
> address@hidden newname
> address@hidden example
> +
> The @address@hidden macro behaves like @samp{$0} in shell
> terminology. If you invoke @code{m4} through an absolute path or a link
> with a different spelling, rather than by relying on a @env{PATH} search
> diff --git a/src/builtin.c b/src/builtin.c
> index bc0cde2..fd57970 100644
> --- a/src/builtin.c
> +++ b/src/builtin.c
> @@ -1613,17 +1613,31 @@ m4_errprint (struct obstack *obs, int argc,
> macro_arguments *argv)
> static void
> m4___file__ (struct obstack *obs, int argc, macro_arguments *argv)
> {
> - bad_argc (arg_info (argv), argc, 0, 0);
> - obstack_grow (obs, curr_quote.str1, curr_quote.len1);
> - obstack_grow (obs, current_file, strlen (current_file));
> - obstack_grow (obs, curr_quote.str2, curr_quote.len2);
> + bad_argc (arg_info (argv), argc, 0, 1);
> + if (argc > 1)
> + reset_file (ARG (1));
> + else
> + {
> + obstack_grow (obs, curr_quote.str1, curr_quote.len1);
> + obstack_grow (obs, current_file, strlen (current_file));
> + obstack_grow (obs, curr_quote.str2, curr_quote.len2);
> + }
> }
>
> static void
> m4___line__ (struct obstack *obs, int argc, macro_arguments *argv)
> {
> - bad_argc (arg_info (argv), argc, 0, 0);
> - shipout_int (obs, current_line);
> + int line;
> +
> + bad_argc (arg_info (argv), argc, 0, 1);
> + if (argc > 1)
> + {
> + if (!numeric_arg (arg_info (argv), ARG (1), ARG_LEN (1), &line))
> + return;
> + reset_line (line);
> + }
> + else
> + shipout_int (obs, current_line);
> }
>
> static void
> diff --git a/src/input.c b/src/input.c
> index 04f0991..316d4bd 100644
> --- a/src/input.c
> +++ b/src/input.c
> @@ -2226,3 +2226,22 @@ lex_debug (void)
> print_token ("lex", t, &td);
> }
> #endif /* DEBUG_INPUT */
> +
> +/*---------------------------------.
> + | Reset the current line counter. |
> + `--------------------------------*/
> +void reset_line(int line)
> +{
> + isp->line = line;
> + input_change = true;
> +}
> +
> +/*-------------------------------.
> + | Reset the current file title. |
> + `------------------------------*/
> +void reset_file(const char *title)
> +{
> + isp->file = (char *) obstack_copy0 (&file_names, title, strlen (title));
> + output_current_line = -1;
> + input_change = true;
> +}
> diff --git a/src/m4.h b/src/m4.h
> index d333c24..b2662ef 100644
> --- a/src/m4.h
> +++ b/src/m4.h
> @@ -565,6 +565,11 @@ void expand_format (struct obstack *, int,
> macro_arguments *);
> void produce_frozen_state (const char *);
> void reload_frozen_state (const char *);
>
> +/* File: input.c --- input sources. */
> +
> +void reset_line (int);
> +void reset_file (const char *);
> +
> /* Debugging the memory allocator. */
>
> #ifdef WITH_DMALLOC
> --
> 1.7.2.3
>
>
>
>
> _______________________________________________
> M4-patches mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/m4-patches