Beispiel #1
0
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);
	}