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

Reply via email to