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