[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] libpoke: Move auto-completion global state to compiler insta
From: |
Jose E. Marchesi |
Subject: |
Re: [PATCH] libpoke: Move auto-completion global state to compiler instance |
Date: |
Tue, 22 Mar 2022 12:45:10 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) |
Hi Mohammad.
> 2022-03-22 Mohammad-Reza Nabipoor <mnabipoor@gnu.org>
>
> * libpoke/libpoke.c (struct _pk_compiler): Add auto completion
> machinery data.
> (pk_compiler_new_with_flags): s/malloc/calloc/.
> (complete_attribute): Remove global state, use `pkc`.
> (complete_struct): Likewise.
> (complete_decl): Likewise.
> (pk_ios_completion_function): Likewise.
> ---
>
> Hi, Jose.
>
> Instead of having `pk_{make,free}_completion_state` functions, I decided
> to move global state to compiler instance.
>
> WDYT?
I would prefer for the macros you are defining (idx, iter, io, ...) to
be upper-case.
Other than that, OK for master.
Thanks!
>
> Regards,
> Mohammad-Reza
>
>
>
> ChangeLog | 10 ++++++++++
> libpoke/libpoke.c | 47 ++++++++++++++++++++++++++++-------------------
> 2 files changed, 38 insertions(+), 19 deletions(-)
>
> diff --git a/ChangeLog b/ChangeLog
> index cd95242d..73572766 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,13 @@
> +2022-03-22 Mohammad-Reza Nabipoor <mnabipoor@gnu.org>
> +
> + * libpoke/libpoke.c (struct _pk_compiler): Add auto completion
> + machinery data.
> + (pk_compiler_new_with_flags): s/malloc/calloc/.
> + (complete_attribute): Remove global state, use `pkc`.
> + (complete_struct): Likewise.
> + (complete_decl): Likewise.
> + (pk_ios_completion_function): Likewise.
> +
> 2022-03-22 Jose E. Marchesi <jemarch@gnu.org>
>
> * emacs/poke.el (poke-repl-end-of-iteration): Echo output in the
> diff --git a/libpoke/libpoke.c b/libpoke/libpoke.c
> index afd7a220..a7ec27bc 100644
> --- a/libpoke/libpoke.c
> +++ b/libpoke/libpoke.c
> @@ -36,8 +36,12 @@ struct _pk_compiler
> pkl_compiler compiler;
> pvm vm;
>
> - pkl_ast_node complete_type;
> int status; /* Status of last API function call. Initialized with PK_OK */
> + /* Data for completion machinery. */
> + pkl_ast_node complete_type;
> + ios completion_ios;
> + int completion_idx;
> + struct pkl_ast_node_iter completion_iter;
> };
>
> struct pk_term_if libpoke_term_if;
> @@ -57,7 +61,7 @@ pk_compiler_new_with_flags (struct pk_term_if *term_if,
> uint32_t flags)
> || !term_if->hyperlink_fn || !term_if->end_hyperlink_fn)
> return NULL;
>
> - pkc = malloc (sizeof (struct _pk_compiler));
> + pkc = calloc (1, sizeof (struct _pk_compiler));
> if (pkc)
> {
> uint32_t pkl_flags = 0;
> @@ -200,11 +204,12 @@ pk_set_alien_token_fn (pk_compiler pkc,
> pk_alien_token_handler_fn cb)
> static char *
> complete_attribute (pk_compiler pkc, const char *x, int state)
> {
> - static int idx = 0;
> +#define idx pkc->completion_idx
> +
> size_t trunk_len;
> char *ret = NULL;
> size_t len = strlen (x);
> - static char *attr_names[] =
> + static const char *attr_names[] =
> {
> #define PKL_DEF_ATTR(CODE,NAME) NAME,
> #include "pkl-attrs.def"
> @@ -220,7 +225,7 @@ complete_attribute (pk_compiler pkc, const char *x, int
> state)
> int i;
> for (i = idx; attr_names[i] != NULL; ++i)
> {
> - char *attr_name = attr_names[i];
> + const char *attr_name = attr_names[i];
>
> if (strncmp (x + trunk_len, attr_name, len - trunk_len) == 0)
> {
> @@ -240,12 +245,15 @@ complete_attribute (pk_compiler pkc, const char *x, int
> state)
>
> exit:
> return ret;
> +
> +#undef idx
> }
>
> static char *
> complete_struct (pk_compiler pkc, const char *x, int state)
> {
> - static int idx = 0;
> +#define idx pkc->completion_idx
> +
> char *ret = NULL;
> pkl_ast_node type = pkc->complete_type;
> pkl_ast_node t;
> @@ -328,13 +336,16 @@ complete_struct (pk_compiler pkc, const char *x, int
> state)
> exit:
> pkc->complete_type = type;
> return ret;
> +
> +#undef idx
> }
>
> static char *
> complete_decl (pk_compiler pkc, const char *x, int state)
> {
> - static int idx = 0;
> - static struct pkl_ast_node_iter iter;
> +#define idx pkc->completion_idx
> +#define iter pkc->completion_iter
> +
> pkl_env env = pkl_get_env (pkc->compiler);
> if (state == 0)
> {
> @@ -351,6 +362,9 @@ complete_decl (pk_compiler pkc, const char *x, int state)
>
> size_t len = strlen (x);
> return pkl_env_get_next_matching_decl (env, &iter, x, len);
> +
> +#undef iter
> +#undef idx
> }
>
> /* This function is called repeatedly by the readline library, when
> @@ -388,20 +402,13 @@ pk_completion_function (pk_compiler pkc,
> indicate that there are no more such tags.
> */
> char *
> -pk_ios_completion_function (pk_compiler pkc __attribute__ ((unused)),
> - const char *text, int state)
> +pk_ios_completion_function (pk_compiler pkc, const char *text, int state)
> {
> - static ios io;
> - if (state == 0)
> - {
> - io = ios_begin ();
> - }
> - else
> - {
> - io = ios_next (io);
> - }
> +#define io pkc->completion_ios
>
> int len = strlen (text);
> +
> + io = state == 0 ? ios_begin () : ios_next (io);
> while (1)
> {
> if (ios_end (io))
> @@ -417,6 +424,8 @@ pk_ios_completion_function (pk_compiler pkc __attribute__
> ((unused)),
> }
>
> return NULL;
> +
> +#undef io
> }
>
> int