27.10 Parse State, Restartable Functions: variable name
Closed this issue · 1 comments
I have to say i'm a little confused by then naming of variable in that example
// mbsrtowcs() modifies the input pointer to point at the first
// invalid character, or NULL if successful. Let's make a copy of
// the pointer for mbsrtowcs() to mess with so our original is
// unchanged.
const char *invalid = mb_string;
Why call it invalid
in this case?
I initially thought you wanted to show a case where the conversion is failing. Instead it's a case where the conversion succeeds.
I personally think that the invalid case would be interesting.
If you keep the valid case, how about showing a multi-threaded example? (I understand you might not want to digress too much).
Otherwise, how about renaming the variable maybe_invalid
or even maybe_invalid_but_valid_here
(I understand C likes to name variable with way too few characters, so feel free to reject those on those grounds)
I've modded the example to show handling of success and failure (although the example will still probably succeed on all platforms). Cheers!
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <wchar.h>
#include <string.h>
#include <locale.h>
int main(void)
{
// Get out of the C locale to one that likely has the euro symbol
setlocale(LC_ALL, "");
// Original multibyte string with a euro symbol (Unicode point 20ac)
char *mb_string = "The cost is \u20ac1.23"; // €1.23
size_t mb_len = strlen(mb_string);
// Wide character array that will hold the converted string
wchar_t wc_string[128]; // Holds up to 128 wide characters
// Set up the conversion state
mbstate_t mbs;
memset(&mbs, 0, sizeof mbs); // Initial state
// mbsrtowcs() modifies the input pointer to point at the first
// invalid character, or NULL if successful. Let's make a copy of
// the pointer for mbsrtowcs() to mess with so our original is
// unchanged.
//
// This example will probably be successful, but we check farther
// down to see.
const char *invalid = mb_string;
// Convert the MB string to WC; this returns the number of wide chars
size_t wc_len = mbsrtowcs(wc_string, &invalid, 128, &mbs);
if (invalid == NULL) {
printf("No invalid characters found\n");
// Print result--note the %ls for wide char strings
printf("multibyte: \"%s\" (%zu bytes)\n", mb_string, mb_len);
printf("wide char: \"%ls\" (%zu characters)\n", wc_string, wc_len);
} else {
ptrdiff_t offset = invalid - mb_string;
printf("Invalid character at offset %td\n", offset);
}
}