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
