mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-02 22:46:30 +02:00
gpgscm: Use native string searching functions.
* tests/gpgscm/ffi-private.h: Handle character arguments. * tests/gpgscm/ffi.c (do_string_index): New function. (do_string_rindex): Likewise. (do_string_contains): Likewise. (ffi_init): Define new functions. * tests/gpgscm/ffi.scm (ffi-define): New macro. * tests/gpgscm/lib.scm (string-index): Use native function, demonstrate behavior. (string-rindex): Likewise. (string-contains?): Likewise. Demonstrate behavior of various other functions. (read-all): Rework so that it can handle large files. Signed-off-by: Justus Winter <justus@g10code.com>
This commit is contained in:
parent
d99949fc8c
commit
5fbbc4b334
4 changed files with 117 additions and 42 deletions
|
@ -939,6 +939,72 @@ do_splice (scheme *sc, pointer args)
|
|||
FFI_RETURN (sc);
|
||||
}
|
||||
|
||||
static pointer
|
||||
do_string_index (scheme *sc, pointer args)
|
||||
{
|
||||
FFI_PROLOG ();
|
||||
char *haystack;
|
||||
char needle;
|
||||
ssize_t offset = 0;
|
||||
char *position;
|
||||
FFI_ARG_OR_RETURN (sc, char *, haystack, string, args);
|
||||
FFI_ARG_OR_RETURN (sc, char, needle, character, args);
|
||||
if (args != sc->NIL)
|
||||
{
|
||||
FFI_ARG_OR_RETURN (sc, ssize_t, offset, number, args);
|
||||
if (offset < 0)
|
||||
return ffi_sprintf (sc, "offset must be positive");
|
||||
if (offset > strlen (haystack))
|
||||
return ffi_sprintf (sc, "offset exceeds haystack");
|
||||
}
|
||||
FFI_ARGS_DONE_OR_RETURN (sc, args);
|
||||
|
||||
position = strchr (haystack+offset, needle);
|
||||
if (position)
|
||||
FFI_RETURN_INT (sc, position - haystack);
|
||||
else
|
||||
FFI_RETURN_POINTER (sc, sc->F);
|
||||
}
|
||||
|
||||
static pointer
|
||||
do_string_rindex (scheme *sc, pointer args)
|
||||
{
|
||||
FFI_PROLOG ();
|
||||
char *haystack;
|
||||
char needle;
|
||||
ssize_t offset = 0;
|
||||
char *position;
|
||||
FFI_ARG_OR_RETURN (sc, char *, haystack, string, args);
|
||||
FFI_ARG_OR_RETURN (sc, char, needle, character, args);
|
||||
if (args != sc->NIL)
|
||||
{
|
||||
FFI_ARG_OR_RETURN (sc, ssize_t, offset, number, args);
|
||||
if (offset < 0)
|
||||
return ffi_sprintf (sc, "offset must be positive");
|
||||
if (offset > strlen (haystack))
|
||||
return ffi_sprintf (sc, "offset exceeds haystack");
|
||||
}
|
||||
FFI_ARGS_DONE_OR_RETURN (sc, args);
|
||||
|
||||
position = strrchr (haystack+offset, needle);
|
||||
if (position)
|
||||
FFI_RETURN_INT (sc, position - haystack);
|
||||
else
|
||||
FFI_RETURN_POINTER (sc, sc->F);
|
||||
}
|
||||
|
||||
static pointer
|
||||
do_string_contains (scheme *sc, pointer args)
|
||||
{
|
||||
FFI_PROLOG ();
|
||||
char *haystack;
|
||||
char *needle;
|
||||
FFI_ARG_OR_RETURN (sc, char *, haystack, string, args);
|
||||
FFI_ARG_OR_RETURN (sc, char *, needle, string, args);
|
||||
FFI_ARGS_DONE_OR_RETURN (sc, args);
|
||||
FFI_RETURN_POINTER (sc, strstr (haystack, needle) ? sc->T : sc->F);
|
||||
}
|
||||
|
||||
|
||||
gpg_error_t
|
||||
ffi_list2argv (scheme *sc, pointer list, char ***argv, size_t *len)
|
||||
|
@ -1134,6 +1200,9 @@ ffi_init (scheme *sc, const char *argv0, int argc, const char **argv)
|
|||
/* Test helper functions. */
|
||||
ffi_define_function (sc, file_equal);
|
||||
ffi_define_function (sc, splice);
|
||||
ffi_define_function (sc, string_index);
|
||||
ffi_define_function (sc, string_rindex);
|
||||
ffi_define_function_name (sc, "string-contains?", string_contains);
|
||||
|
||||
/* User interface. */
|
||||
ffi_define_function (sc, flush_stdio);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue