Hi,

while at these helpers... would you implement the non-locale (LANG=C)
version? what happens in real life is that to parse/generate floats and
dates people often assume it's generating in English... then you run it in
a pt-BR or other locales where stuff are different and everything breaks :-)

ie: generating HTTP headers or ISO 8601 for JSON encoded dates.



On Fri, Oct 13, 2017 at 4:04 AM, Amitesh Singh <[email protected]>
wrote:

> ami pushed a commit to branch master.
>
> http://git.enlightenment.org/core/efl.git/commit/?id=
> 2cf24eb30428fd56e32b1633ab3d795a3fbea5a3
>
> commit 2cf24eb30428fd56e32b1633ab3d795a3fbea5a3
> Author: Amitesh Singh <[email protected]>
> Date:   Fri Oct 13 14:36:31 2017 +0900
>
>     eina: strbuf - Add strftime related functions
>
>     eina_strbuf_append_strftime()
>     eina_strbuf_insert_strftime()
>     eina_strbuf_prepend_strftime() - macro
>
>     We need these functions for implementing generic format function
>     interface especially for calander.
>
>     Ref T6204
> ---
>  src/examples/eina/eina_strbuf_02.c | 35 ++++++++++++++++++++
>  src/lib/eina/eina_strbuf.c         | 28 ++++++++++++++++
>  src/lib/eina/eina_strbuf.h         | 68 ++++++++++++++++++++++++++++++
> ++++++++
>  src/tests/eina/eina_test_strbuf.c  | 31 +++++++++++++++++
>  4 files changed, 162 insertions(+)
>
> diff --git a/src/examples/eina/eina_strbuf_02.c b/src/examples/eina/eina_
> strbuf_02.c
> new file mode 100644
> index 0000000000..9282b69ed5
> --- /dev/null
> +++ b/src/examples/eina/eina_strbuf_02.c
> @@ -0,0 +1,35 @@
> +//Compile with:
> +//gcc -Wall -o eina_strbuf_02 eina_strbuf_02c `pkg-config --cflags --libs
> eina`
> +
> +#include <stdio.h>
> +#include <Eina.h>
> +
> +int main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
> +{
> +   Eina_Strbuf *buf;
> +   time_t curr_time;
> +   struct tm *info;
> +
> +   eina_init();
> +
> +   curr_time = time(NULL);
> +   info = localtime(&curr_time);
> +
> +   buf = eina_strbuf_new();
> +   eina_strbuf_append_strftime(buf, "%I:%M%p", info);
> +   printf("current time: %s\n", eina_strbuf_string_get(buf));
> +   eina_strbuf_reset(buf);
> +
> +   buf = eina_strbuf_new();
> +   eina_strbuf_append(buf, "Hours: Minutes");
> +   //insert hour at ^Hours: Minutes where ^ is the position
> +   eina_strbuf_prepend_strftime(buf, "%I ", info);
> +   //insert hour at hhhHours: ^Minutes where ^ is the position
> +   eina_strbuf_insert_strftime(buf, "%M ", info, 10);
> +   printf("%s\n", eina_strbuf_string_get(buf));
> +
> +   eina_strbuf_free(buf);
> +   eina_shutdown();
> +
> +   return 0;
> +}
> diff --git a/src/lib/eina/eina_strbuf.c b/src/lib/eina/eina_strbuf.c
> index 586bffb21c..f18408d59e 100644
> --- a/src/lib/eina/eina_strbuf.c
> +++ b/src/lib/eina/eina_strbuf.c
> @@ -220,6 +220,34 @@ eina_strbuf_substr_get(Eina_Strbuf *buf, size_t pos,
> size_t len)
>     return eina_strbuf_manage_new(str);
>  }
>
> +EAPI Eina_Bool
> +eina_strbuf_append_strftime(Eina_Strbuf *buf, const char *format, const
> struct tm *tm)
> +{
> +   char *outputbuf;
> +
> +   outputbuf = eina_strftime(format, tm);
> +   if (!outputbuf) return EINA_FALSE;
> +
> +   eina_strbuf_append(buf, outputbuf);
> +   free(outputbuf);
> +
> +   return EINA_TRUE;
> +}
> +
> +EAPI Eina_Bool
> +eina_strbuf_insert_strftime(Eina_Strbuf *buf, const char *format, const
> struct tm *tm, size_t pos)
> +{
> +   char *outputbuf;
> +
> +   outputbuf = eina_strftime(format, tm);
> +   if (!outputbuf) return EINA_FALSE;
> +
> +   eina_strbuf_insert_length(buf, outputbuf, strlen(outputbuf), pos);
> +   free(outputbuf);
> +
> +   return EINA_TRUE;
> +}
> +
>  /* Unicode */
>
>  #include "eina_strbuf_template_c.x"
> diff --git a/src/lib/eina/eina_strbuf.h b/src/lib/eina/eina_strbuf.h
> index 7d90ae6324..eeea11c47f 100644
> --- a/src/lib/eina/eina_strbuf.h
> +++ b/src/lib/eina/eina_strbuf.h
> @@ -738,6 +738,74 @@ EAPI Eina_Rw_Slice eina_strbuf_rw_slice_get(const
> Eina_Strbuf *buf) EINA_WARN_UN
>  EAPI char* eina_strbuf_release(Eina_Strbuf *buf) EINA_WARN_UNUSED_RESULT
> EINA_ARG_NONNULL(1);
>
>  /**
> + * @brief append the given buffer based on strftime output.
> + *
> + * @param tm Pointer to a tm structure needed by strftime.
> + * @param fmt String containing format specifiers needed by strftime.
> + * @return #EINA_TRUE on success, #EINA_FALSE on failure.
> + *
> + * This will add append buffer of exact required size based on strftime
> output
> + *
> + * Example usage:
> + * @code
> + * time_t curr_time;
> + * struct tm *info;
> + * Eina_Strbuf *buf = eina_strbuf_new();
> + * curr_time = time(NULL);
> + * info = localtime(&curr_time);
> + * eina_strbuf_append_strftime(buf, "%I:%M%p", info);
> + * //after use
> + * eina_strbuf_free(buf);
> + * @endcode #EINA_TRUE on success, #EINA_FALSE on failure.
> + *
> + * @since 1.21
> + */
> +EAPI Eina_Bool eina_strbuf_append_strftime(Eina_Strbuf *buf, const char
> *fmt, const struct tm *tm);
> +
> +/**
> + * @brief insert the given buffer based on strftime output at given
> position
> + *
> + * @param buf The string buffer to prepend to.
> + * @param fmt String containing format specifiers needed by strftime.
> + * @param tm Pointer to a tm structure needed by strftime.
> + * @return #EINA_TRUE on success, #EINA_FALSE on failure.
> + *
> + * This will add append buffer of exact required size based on strftime
> output
> + *
> + * Example usage:
> + * @code
> + * time_t curr_time;
> + * struct tm *info;
> + * Eina_Strbuf *buf = eina_strbuf_new();
> + * curr_time = time(NULL);
> + * info = localtime(&curr_time);
> + * eina_strbuf_insert_strftime(buf, "%I:%M%p", info, 2);
> + * //after use
> + * eina_strbuf_free(buf);
> + * @endcode
> + *
> + * @since 1.21
> + */
> +EAPI Eina_Bool eina_strbuf_insert_strftime(Eina_Strbuf *buf, const char
> *fmt, const struct tm *tm, size_t pos);
> +
> +/**
> + * @def eina_strbuf_prepend_strftime(buf, fmt, tm)
> + * @brief Prepends the given string to the given buffer.
> + *
> + * @param buf The string buffer to prepend to.
> + * @param fmt The string to prepend.
> + * @param tm The variable arguments.
> + * @return #EINA_TRUE on success, #EINA_FALSE on failure.
> + *
> + * This macro is calling eina_strbuf_insert_strftime() at position 0. If
> @p buf
> + * can't prepend it, #EINA_FALSE is returned, otherwise #EINA_TRUE is
> + * returned.
> + *
> + * @since 1.21
> + */
> +#define eina_strbuf_prepend_strftime(buf, fmt, tm)
> eina_strbuf_insert_strftime(buf, fmt, tm, 0)
> +
> +/**
>   * @}
>   */
>
> diff --git a/src/tests/eina/eina_test_strbuf.c b/src/tests/eina/eina_test_
> strbuf.c
> index 0511d96011..4add7a188e 100644
> --- a/src/tests/eina/eina_test_strbuf.c
> +++ b/src/tests/eina/eina_test_strbuf.c
> @@ -660,6 +660,36 @@ START_TEST(strbuf_release_test)
>  }
>  END_TEST
>
> +START_TEST(strbuf_strftime_test)
> +{
> +   Eina_Strbuf *buf;
> +   time_t curr_time;
> +   struct tm *info;
> +   char cbuf[32];
> +   const char *str;
> +
> +   curr_time = time(NULL);
> +   info = localtime(&curr_time);
> +
> +   strftime(cbuf, 32, "%I:%M%p", info);
> +
> +   buf = eina_strbuf_new();
> +   eina_strbuf_append_strftime(buf, "%I:%M%p", info);
> +   str = eina_strbuf_string_get(buf);
> +   fail_if(str == NULL || strcmp(str, cbuf) != 0);
> +   eina_strbuf_reset(buf);
> +
> +   buf = eina_strbuf_new();
> +   eina_strbuf_append(buf, "Hours: Minutes");
> +   eina_strbuf_prepend_strftime(buf, "%I ", info);
> +   eina_strbuf_insert_strftime(buf, "%M ", info, 10);
> +   strftime(cbuf, 32, "%I Hours: %M Minutes", info);
> +   str = eina_strbuf_string_get(buf);
> +   fail_if(str == NULL || strcmp(str, cbuf) != 0);
> +
> +   eina_strbuf_free(buf);
> +}
> +
>  void
>  eina_test_strbuf(TCase *tc)
>  {
> @@ -677,4 +707,5 @@ eina_test_strbuf(TCase *tc)
>     tcase_add_test(tc, strbuf_substr_get);
>     tcase_add_test(tc, strbuf_prepend_print);
>     tcase_add_test(tc, strbuf_release_test);
> +   tcase_add_test(tc, strbuf_strftime_test);
>  }
>
> --
>
>
>


-- 
Gustavo Sverzut Barbieri
--------------------------------------
Mobile: +55 (16) 99354-9890
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to