[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] libpoke,ios: new search function to find IO spaces
From: |
Jose E. Marchesi |
Subject: |
Re: [PATCH] libpoke,ios: new search function to find IO spaces |
Date: |
Wed, 01 Nov 2023 00:38:05 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) |
Hi Mohammad.
> This commit adds a function which can find the IO space whose
> handler contains the provided partial handler.
>
> 2023-11-01 Mohammad-Reza Nabipoor <mnabipoor@gnu.org>
>
> * libpoke/libpoke.h (pk_ios_search_by_partial_handler): New
> function to find IO spaces using part of the handler.
What about adding an additional argument to pk_ios_search instead of
adding a new service? Something like:
pk_ios pk_ios_search (pk_compiler pkc, const char *handler,
int partial_p);
We will have to bump the DSO version in the next release anyway.
If we add a new service, I expect the following idiom to be used to
support partial searches (like in pk_ios_ailen_token_handler):
ios = pk_ios_search (poke_compiler, HANDLER);
if (ios == NULL)
ios = pkl_ios_search_partial (poke_compiler, HANDLER);
which cannot be implemented as efficiently as this could:
ios = pk_ios_search (poke_compiler, HANDLER, 1 /* partial_p */);
> * libpoke/libpoke.c (pk_ios_search_by_partial_handler): Likewise.
> * libpoke/ios.h (ios_search_partial): Likewise.
> * libpoke/ios.c (ios_search_partial): Likewise.
> * testsuite/poke.libpoke/api.c (STREQ): New macro.
> (test_pk_ios): New function for testing IO space functions.
> (main): Call `test_pk_ios'.
> ---
> ChangeLog | 11 +++++
> libpoke/ios.c | 16 +++++++
> libpoke/ios.h | 6 +++
> libpoke/libpoke.c | 8 ++++
> libpoke/libpoke.h | 7 +++
> testsuite/poke.libpoke/api.c | 90 ++++++++++++++++++++++++++++++++++++
> 6 files changed, 138 insertions(+)
>
> diff --git a/ChangeLog b/ChangeLog
> index a7bfa9cf..4316936a 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,14 @@
> +2023-11-01 Mohammad-Reza Nabipoor <mnabipoor@gnu.org>
> +
> + * libpoke/libpoke.h (pk_ios_search_by_partial_handler): New
> + function to find IO spaces using part of the handler.
> + * libpoke/libpoke.c (pk_ios_search_by_partial_handler): Likewise.
> + * libpoke/ios.h (ios_search_partial): Likewise.
> + * libpoke/ios.c (ios_search_partial): Likewise.
> + * testsuite/poke.libpoke/api.c (STREQ): New macro.
> + (test_pk_ios): New function for testing IO space functions.
> + (main): Call `test_pk_ios'.
> +
> 2023-10-30 Jose E. Marchesi <jemarch@gnu.org>
>
> * poke/pk-help.pk (pk_help): Hint at activating the page at the
> diff --git a/libpoke/ios.c b/libpoke/ios.c
> index 974aface..870cc305 100644
> --- a/libpoke/ios.c
> +++ b/libpoke/ios.c
> @@ -342,6 +342,22 @@ ios_search (ios_context ios_ctx, const char *handler)
> return io;
> }
>
> +ios ios_search_partial (ios_context ios_ctx, const char *partial_handler)
> +{
> + ios ios_matched = NULL;
> + size_t n_matched = 0;
> +
> + for (ios io = ios_ctx->io_list; io; io = io->next)
> + if (strstr (io->handler, partial_handler) != NULL)
> + {
> + if (++n_matched > 1)
> + return NULL;
> + ios_matched = io;
> + }
> +
> + return ios_matched;
> +}
> +
> ios
> ios_search_by_id (ios_context ios_ctx, int id)
> {
> diff --git a/libpoke/ios.h b/libpoke/ios.h
> index 3c695bc4..d4b05a9d 100644
> --- a/libpoke/ios.h
> +++ b/libpoke/ios.h
> @@ -193,6 +193,12 @@ void ios_set_cur (ios_context ios_ctx, ios io);
>
> ios ios_search (ios_context ios_ctx, const char *handler);
>
> +/* Return the IO space whose handler matches the given PARTIAL_HANDLER.
> + A handler matches the PARTIAL_HANDLER if the PARTIAL_HANDLER is a
> + sub-string of that handler. Return NULL if there's no unique match. */
> +
> +ios ios_search_partial (ios_context ios_ctx, const char *partial_handler);
> +
> /* Return the IO space having the given ID. Return NULL if no such
> space exists. */
>
> diff --git a/libpoke/libpoke.c b/libpoke/libpoke.c
> index 57d28828..7fbb5607 100644
> --- a/libpoke/libpoke.c
> +++ b/libpoke/libpoke.c
> @@ -624,6 +624,14 @@ pk_ios_search (pk_compiler pkc, const char *handler)
> return (pk_ios) ios_search (pvm_ios_context (pkc->vm), handler);
> }
>
> +pk_ios
> +pk_ios_search_by_partial_handler (pk_compiler pkc, const char
> *partial_handler)
> +{
> + pkc->status = PK_OK;
> + return (pk_ios) ios_search_partial (pvm_ios_context (pkc->vm),
> + partial_handler);
> +}
> +
> pk_ios
> pk_ios_search_by_id (pk_compiler pkc, int id)
> {
> diff --git a/libpoke/libpoke.h b/libpoke/libpoke.h
> index 988df231..edba01c2 100644
> --- a/libpoke/libpoke.h
> +++ b/libpoke/libpoke.h
> @@ -478,6 +478,13 @@ void pk_ios_set_cur (pk_compiler pkc, pk_ios ios)
> LIBPOKE_API;
>
> pk_ios pk_ios_search (pk_compiler pkc, const char *handler) LIBPOKE_API;
>
> +/* Return the IO space whose handler matches the given PARTIAL_HANDLER.
> + A handler matches the PARTIAL_HANDLER if the PARTIAL_HANDLER is a
> + sub-string of that handler. Return NULL if there's no unique match. */
> +
> +pk_ios pk_ios_search_by_partial_handler (pk_compiler pkc,
> + const char *partial_handler)
> LIBPOKE_API;
> +
> /* Return the IO space having the given ID. Return NULL if no such
> space exist in the given Poke incremental compiler. */
>
> diff --git a/testsuite/poke.libpoke/api.c b/testsuite/poke.libpoke/api.c
> index 805c16e7..d19cb0c3 100644
> --- a/testsuite/poke.libpoke/api.c
> +++ b/testsuite/poke.libpoke/api.c
> @@ -31,6 +31,8 @@
>
> #include "term-if.h"
>
> +#define STREQ(a, b) (strcmp ((a), (b)) == 0)
> +
> #define T(name, cond)
> \
> do
> \
> {
> \
> @@ -135,6 +137,93 @@ test_pk_load (pk_compiler pkc)
> T ("pk_load_1 exception", exception == 0);
> }
>
> +static void
> +test_pk_ios (pk_compiler pkc)
> +{
> +#define N 4
> + int ios_id[N];
> + pk_ios ios[N];
> + uint64_t flags = 0;
> +
> + ios_id[0] = pk_ios_open (pkc, "*foo*", flags, /*set_cur_p*/ 1);
> + T ("pk_ios_open_1", ios_id[0] == 0);
> + ios[0] = pk_ios_cur (pkc);
> + T ("pk_ios_cur_1", ios[0] != NULL);
> +
> + ios_id[1] = pk_ios_open (pkc, "*foobar*", flags, /*set_cur_p*/ 0);
> + T ("pk_ios_open_2", ios_id[1] == 1);
> + T ("pk_ios_cur_2", ios[0] == pk_ios_cur (pkc));
> +
> + ios_id[2] = pk_ios_open (pkc, "*funfoo*", flags, /*set_cur_p*/ 0);
> + T ("pk_ios_open_3", ios_id[2] == 2);
> + T ("pk_ios_cur_3", ios[0] == pk_ios_cur (pkc));
> +
> + ios_id[3] = pk_ios_open (pkc, "*baz*", flags, /*set_cur_p*/ 0);
> + T ("pk_ios_open_4", ios_id[3] == 3);
> + T ("pk_ios_cur_4", ios[0] == pk_ios_cur (pkc));
> +
> + ios[1] = pk_ios_search_by_id (pkc, ios_id[1]);
> + ios[2] = pk_ios_search_by_id (pkc, ios_id[2]);
> + ios[3] = pk_ios_search_by_id (pkc, ios_id[3]);
> + T ("pk_ios_search_by_id_1", ios[1] != NULL);
> + T ("pk_ios_search_by_id_2", ios[2] != NULL);
> + T ("pk_ios_search_by_id_3", ios[3] != NULL);
> +
> + T ("pk_ios_get_id_1", pk_ios_get_id (ios[0]) == ios_id[0]);
> + T ("pk_ios_get_id_2", pk_ios_get_id (ios[1]) == ios_id[1]);
> + T ("pk_ios_get_id_3", pk_ios_get_id (ios[2]) == ios_id[2]);
> + T ("pk_ios_get_id_4", pk_ios_get_id (ios[3]) == ios_id[3]);
> +
> + T ("pk_ios_handler_1", pk_ios_handler (ios[0]) != NULL);
> + T ("pk_ios_handler_2", pk_ios_handler (ios[1]) != NULL);
> + T ("pk_ios_handler_3", pk_ios_handler (ios[2]) != NULL);
> + T ("pk_ios_handler_4", pk_ios_handler (ios[3]) != NULL);
> +
> + T ("pk_ios_handler_5", STREQ (pk_ios_handler (ios[0]), "*foo*"));
> + T ("pk_ios_handler_6", STREQ (pk_ios_handler (ios[1]), "*foobar*"));
> + T ("pk_ios_handler_7", STREQ (pk_ios_handler (ios[2]), "*funfoo*"));
> + T ("pk_ios_handler_8", STREQ (pk_ios_handler (ios[3]), "*baz*"));
> +
> + T ("pk_ios_search_by_partial_handler_1",
> + pk_ios_search_by_partial_handler (pkc, "/some/non-existent/thing")
> + == NULL);
> +
> + T ("pk_ios_search_by_partial_handler_2",
> + pk_ios_search_by_partial_handler (pkc, "baz") == ios[3]);
> +
> + T ("pk_ios_search_by_partial_handler_3",
> + pk_ios_search_by_partial_handler (pkc, "baz*") == ios[3]);
> +
> + T ("pk_ios_search_by_partial_handler_4",
> + pk_ios_search_by_partial_handler (pkc, "*baz") == ios[3]);
> +
> + T ("pk_ios_search_by_partial_handler_5",
> + pk_ios_search_by_partial_handler (pkc, "*baz*") == ios[3]);
> +
> + T ("pk_ios_search_by_partial_handler_6",
> + pk_ios_search_by_partial_handler (pkc, "az") == ios[3]);
> +
> + T ("pk_ios_search_by_partial_handler_7",
> + pk_ios_search_by_partial_handler (pkc, "z") == ios[3]);
> +
> + T ("pk_ios_search_by_partial_handler_8",
> + pk_ios_search_by_partial_handler (pkc, "bar*") == ios[1]);
> +
> + T ("pk_ios_search_by_partial_handler_9",
> + pk_ios_search_by_partial_handler (pkc, "bar") == ios[1]);
> +
> + T ("pk_ios_search_by_partial_handler_10",
> + pk_ios_search_by_partial_handler (pkc, "foo") == NULL);
> +
> + T ("pk_ios_search_by_partial_handler_11",
> + pk_ios_search_by_partial_handler (pkc, "ba") == NULL);
> +
> + for (int i = N; i != 0; --i)
> + pk_ios_close (pkc, ios[i - 1]);
> +
> +#undef N
> +}
> +
> int
> main ()
> {
> @@ -144,6 +233,7 @@ main ()
>
> test_pk_keyword_p (pkc);
> test_pk_load (pkc);
> + test_pk_ios (pkc);
> test_pk_compiler_free (pkc);
>
> return 0;