Listing 2: Testing FSS-UTF converter

const char *fname = "myfile";

bool write_file(wchar_t code = 0)
    {locale loc = _ADDFAC(locale::classic(), new Mycodecvt);
    wofstream myostr;
    myostr.imbue(loc);
    myostr.open(fname, ios_base::binary);
    if (!myostr.is_open())
        {cerr << "can't write to " << fname << endl;
        return (false); }
    if (code != 0 && !myostr.write(&code, 1))
        {cerr << "failed for code = " << (int)code << endl;
        return (false); }
    for (wchar_t i = 0; i < 0xfff; ++i)
        if (!myostr.write(&i, 1))
            {cerr << "write failed for i = " << (int)i << endl;
            return (false); }
    return (true); }

bool read_file()
    {locale loc = _ADDFAC(locale::classic(), new Mycodecvt);
    wifstream myistr;
    myistr.imbue(loc);
    myistr.open(fname, ios_base::binary);
    if (!myistr.is_open())
        {cerr << "can't read from " << fname << endl;
        return (false); }
    for (wchar_t i = 0; i < 0xfff; ++i)
        {wchar_t n = 0;
        if (!myistr.read(&n, 1) || n != i)
            {cerr << "read failed for i = " << (int)i << endl;
            cerr << "got " << (int)n << endl;
            return (false); }}
    return (true); }

int main(int argc, char **argv)
    {wchar_t arg = argc < 2 ? 0
        : *argv[1] == 'b' ? 0xfeff : 0xfffe;
    return (write_file(arg) && read_file()); }