int main(int argc, char **argv) { char asciibuf[512+1]; u_int16_t utf16buf[1024+1]; int len; int j, i = 1; printf("#ifndef _USB_STRINGS_H\n#define _USB_STRINGS_H\n\n"); printf("/* THIS FILE IS AUTOGENERATED, DO NOT MODIFY MANUALLY */\n\n"); printf("#include <stdint.h>\n"); printf("#include <usb/common/core/USBGenericDescriptor.h>\n"); printf("#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))\n\n"); printf("/* All standard descriptors have these 2 fields at the beginning */\n\n"); printf("struct usb_descriptor_header {\n" "\tuint8_t bLength;\n" "\tuint8_t bDescriptorType;\n" "} __attribute__ ((packed));\n\n"); print_structhdr(0, 1); printf("0x0409 /* English */ "); print_structftr(); while (scanf("%512[^\n]\n", asciibuf) != EOF) { len = strlen(asciibuf); printf("/* String %u \"%s\" */\n", i, asciibuf); /* FIXME: check return value */ utf8_to_utf16le(asciibuf, utf16buf, len); print_structhdr(i, len); print_array16(utf16buf, len); print_structftr(); i++; } #if 0 printf("static const unsigned char *usb_strings[] = {\n"); for (j = 0; j < i; j++) printf("\t(const unsigned char *) &string%d,\n", j); printf("};\n\n"); #else printf("#define USB_STRINGS_GENERATED\t\t\t\t\\\n"); for (j = 0; j < i; j++) printf("\t(const unsigned char *) &string%d,\t\t\\\n", j); printf("\n"); #endif printf("#endif /* _USB_STRINGS_H */\n"); exit(0); }
void WinCodepageConverter::_unicodeToBuffer<1>(ByteBuffer& _destBuffer, ConstStringHolder<1> _srcString) { // An empty string needs special processing. if(_srcString.empty()) return; const uint8* data; size_t sz; ByteBuffer buf; switch(getCodepage()) { case CP_UTF8: { // UTF-8 -> UTF-8 data = _srcString.c_str(); sz = _srcString.size(); break; } case CP_UTF16LE: { // UTF-8 -> UTF-16LE utf8_to_utf16le(buf, _srcString.c_str(), _srcString.size()); data = buf.data(); sz = buf.size(); break; } case CP_UTF16BE: { // UTF-8 -> UTF-16BE utf8_to_utf16be(buf, _srcString.c_str(), _srcString.size()); data = buf.data(); sz = buf.size(); break; } case CP_UTF32LE: { // UTF-8 -> UTF-32LE utf8_to_utf32le(buf, _srcString.c_str(), _srcString.size()); data = buf.data(); sz = buf.size(); break; } case CP_UTF32BE: { // UTF-8 -> UTF-32BE utf8_to_utf32be(buf, _srcString.c_str(), _srcString.size()); data = buf.data(); sz = buf.size(); break; } default: { // UTF-8 -> UTF-16 Utf16Buffer buf16; utf8_to_utf16(buf16, _srcString.c_str(), _srcString.size()); // UTF-16 -> destination code page size_t maxsz = (buf16.size() + 10) * 4; buf.resize(maxsz); BOOL usedDefaultChar; int r = WideCharToMultiByte(getCodepage(), 0, char_cast<LPWSTR>(buf16.data()), buf16.size(), char_cast<LPSTR>(buf.data()), buf.size(), 0, &usedDefaultChar); sz = r; data = buf.data(); if(r == 0 || usedDefaultChar) UnicodeSupport::_throwCouldNotConvert(getName(), "UTF-16", buf16.data(), buf16.size() * 2); } } appendDataToBuffer(_destBuffer, data, sz); }