citrus_none's stdenc::mbtowc() multiple bugs.

Issue #55 closed
Takehiko NOZAKI repo owner created an issue

stdenc::mbtowc is similar to ctype::mbrtowc, except:

  • updates string pointer to next of converted byte(same as mbrtowc_priv).
  • return zero if null terminate(=L'\0') has been convert.

but:

  • citrus_none.c doesn't update result string pointer correctly.
  • retuen one if null terminate (=L'\0') has been converted.

following sample code may fail.

#include <assert.h>
#include <limits.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>


#include "citrus_namespace.h"
#include "citrus_types.h"
#include "citrus_module.h"
#include "citrus_ctype.h"
#include "citrus_ctype_local.h"
#include "citrus_stdenc.h"
#include "citrus_stdenc_local.h"

#include "citrus_none.h"

extern struct _citrus_stdenc _citrus_stdenc_default;

int
main(void)
{
        struct _citrus_stdenc *ce = &_citrus_stdenc_default;
        char st[sizeof(mbstate_t)];
        size_t ret, n;
        _citrus_wc_t wc;
        const char *s = "", *t;

        t = s;
        (*ce->ce_ops->eo_init_state)(ce, &st);
        ret = (*ce->ce_ops->eo_mbtowc)(ce,
            &wc, &t, 1, (void *)&st, &n);
        assert(ret == 0);
        assert(t == s + 1);
}

Comments (2)

  1. Log in to comment