Le 22 sept. 2015 02:30, "Daniel Kolesa" <[email protected]> a écrit : > > On Mon, Sep 21, 2015 at 11:24 PM, Shilpa Singh <[email protected]> wrote: > > cedric pushed a commit to branch master. > > > > http://git.enlightenment.org/core/efl.git/commit/?id=abaf29cb768375957c9ee0b64d36034c21c618ea > > > > commit abaf29cb768375957c9ee0b64d36034c21c618ea > > Author: Shilpa Singh <[email protected]> > > Date: Mon Sep 21 23:48:16 2015 +0200 > > > > eina_tmpstr: add eina_tmpstr_strftime > > This API seems awfully arbitrary and I don't really see the point. > Might as well be any other function that prints to strings - are you > gonna add these too? Sounds horrible to me.
Is it better to have our code cluttered by static buffer and no overflow check ? Obviously not. Yes,I expect we refactor all our buffer print code as it is pretty bad right now and may even lead to security issue in some case. Cedric > D5 > > > > > Summary: > > > > @feature > > > > Test Plan: > > eina_tmpstr_strftime API can be used to create a temporary string > > which is updated with strftime output > > > > eina_tmpstr_steal can be used to get actual string set in eina_tmpstr > > > > Reviewers: cedric > > > > Subscribers: rajeshps, cedric, govi > > > > Differential Revision: https://phab.enlightenment.org/D3048 > > > > Signed-off-by: Cedric BAIL <[email protected]> > > --- > > AUTHORS | 1 + > > src/lib/eina/eina_tmpstr.c | 39 +++++++++++++++++++++++++++++++++++++-- > > src/lib/eina/eina_tmpstr.h | 25 +++++++++++++++++++++++++ > > 3 files changed, 63 insertions(+), 2 deletions(-) > > > > diff --git a/AUTHORS b/AUTHORS > > index eab2011..f714c39 100644 > > --- a/AUTHORS > > +++ b/AUTHORS > > @@ -53,6 +53,7 @@ ChunEon Park (Hermet) <[email protected]> > > Rajeev Ranjan (Rajeev) <[email protected]> <[email protected]> > > Subodh Kumar <[email protected]> > > Michelle Legrand <[email protected]> > > +Shilpa Singh <[email protected]> <[email protected]> > > > > Eet > > --- > > diff --git a/src/lib/eina/eina_tmpstr.c b/src/lib/eina/eina_tmpstr.c > > index 43824b7..5b81819 100644 > > --- a/src/lib/eina/eina_tmpstr.c > > +++ b/src/lib/eina/eina_tmpstr.c > > @@ -133,13 +133,48 @@ eina_tmpstr_len(Eina_Tmpstr *tmpstr) > > for (s = strs; s; s = s->next) > > { > > if (s->str == tmpstr) > > - { > > + { > > size_t ret = s->length; > > eina_lock_release(&_mutex); > > return ret; > > - } > > + } > > } > > eina_lock_release(&_mutex); > > > > return strlen(tmpstr); > > } > > + > > +EAPI Eina_Tmpstr * > > +eina_tmpstr_strftime(const char *format, const struct tm *tm) > > +{ > > + const size_t flen = strlen(format); > > + size_t buflen = 16; // An arbitrary starting size > > + char *buf = NULL; > > + > > + do { > > + char *tmp; > > + size_t len; > > + > > + tmp = realloc(buf, buflen * sizeof(char)); > > + if (!tmp) goto on_error; > > + buf = tmp; > > + > > + len = strftime(buf, buflen, format, tm); > > + // Check if we have the expected result and return it. > > + if ((len > 0 && len < buflen) || (len == 0 && flen == 0)) > > + { > > + Eina_Tmpstr *r; > > + > > + r = eina_tmpstr_add_length(buf, len + 1); > > + free(buf); > > + return r; > > + } > > + > > + /* Possibly buf overflowed - try again with a bigger buffer */ > > + buflen <<= 1; // multiply buffer size by 2 > > + } while (buflen < 128 * flen); > > + > > + on_error: > > + free(buf); > > + return NULL; > > +} > > diff --git a/src/lib/eina/eina_tmpstr.h b/src/lib/eina/eina_tmpstr.h > > index f784a67..8d9f517 100644 > > --- a/src/lib/eina/eina_tmpstr.h > > +++ b/src/lib/eina/eina_tmpstr.h > > @@ -238,6 +238,31 @@ EAPI size_t eina_tmpstr_len(Eina_Tmpstr *tmpstr); > > EAPI void eina_tmpstr_del(Eina_Tmpstr *tmpstr) EINA_ARG_NONNULL(1); > > > > /** > > + * @brief Add a new temporary string based on strftime output. > > + * > > + * @param tm Pointer to a tm structure needed by strftime. > > + * @param format String containing format specifiers needed by strftime. > > + * > > + * This will add a new temporary string by updating the string value by output > > + * of strftime. > > + * > > + * Example usage: > > + * > > + * @code > > + * time_t curr_time; > > + * struct tm * info; > > + * Eina_Tmpstr *buf; > > + * > > + * curr_time = time(NULL); > > + * info = localtime(&curr_time); > > + * buf = eina_tmpstr_strftime("%I:%M%p", info); > > + * @endcode > > + * > > + * @since 1.16.0 > > + */ > > +EAPI Eina_Tmpstr *eina_tmpstr_strftime(const char *format, const struct tm *tm) EINA_ARG_NONNULL(2); > > + > > +/** > > * @} > > */ > > > > > > -- > > > > > > ------------------------------------------------------------------------------ > _______________________________________________ > enlightenment-devel mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel > ------------------------------------------------------------------------------ _______________________________________________ enlightenment-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
