[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [tyndur-devel] [PATCH 3/5] libc: mbs(r)towcs() und wcs(r)tombs()



On Thu, May 21 21:22, Kevin Wolf wrote:
> > +/**
> > + * Wird sowohl von wcstombs als auch von wcsrtombs benutzt, und entspricht
> > + * abgesehen vom wcstate-Kram wcsrtombs.
> > + *
> > + * @see wcstombs
> > + * @see wcsrtombs
> > + */
> > +size_t __internal_wcsrtombs(char* buf, const wchar_t** wcs, size_t len)
> > +{
> > +    char intbuf[MB_CUR_MAX];
> > +    size_t bufpos = 0;
> > +    int curlen;
> > +
> > +    while (**wcs && (!buf || (bufpos < len))) {
> > +        if ((curlen = wctomb(intbuf, *(*wcs)++)) == -1) {
> > +            return (size_t) -1;
> > +        }
> > +
> > +        if (buf && ((len - bufpos) < curlen)) {
> > +            // Schade, zu eng, das Zeichen passt nicht mehr vollstaendig
> > in den +            // Puffer
> > +            break;
> > +        }
> > +
> > +        // Passt noch rein
> > +        if (buf) {
> > +            memcpy(buf + bufpos, intbuf, curlen);
> > +        }
> > +        bufpos += curlen;
> > +    }
> > +
> > +    // Wenn wir am Ende angekommen sind, und noch Platz frei ist,
> > terminieren +    // wir das ganze noch mit einem netten kleinen '\0'.
> > +    if (buf && !**wcs && (bufpos < len)) {
> > +        *wcs = NULL;
> 
> Ich glaube, das darf nicht von buf != NULL abhängen

Ich glaube doch. Die manpage scheint mir da nicht wirklich klar zu sein,
deshalb habe ich nachgesehen, wie die newlib das macht. Dort wird
*wcs _nicht_ angerührt wenn buf == NULL. Aber mein Code ist dann
natürlich trotzdem nicht in Ordnung, wie er jetzt ist.

Das gilt auch für mbstowcs.

-- 
Antoine Kaufmann
<toni@xxxxxxxxxxxxxxxx>

Attachment: pgpJw6EwWS9tB.pgp
Description: PGP signature