+/* Convert a string in the platform-dependent encoding to UTF-16LE, but if both
+ * encodings are UTF-16LE, simply re-use the string. Release with
+ * tstr_put_utf16le() when done. */
+static inline int
+tstr_get_utf16le_and_len(const tchar *tstr,
+ const utf16lechar **ustr_ret, size_t *usize_ret)
+{
+ size_t tsize = tstrlen(tstr) * sizeof(tchar);
+#if TCHAR_IS_UTF16LE
+ /* No conversion or copy needed */
+ *ustr_ret = tstr;
+ *usize_ret = tsize;
+ return 0;
+#else
+ return tstr_to_utf16le(tstr, tsize, (utf16lechar **)ustr_ret, usize_ret);
+#endif
+}
+
+/* Convert a string in the platform-dependent encoding to UTF-16LE, but if both
+ * encodings are UTF-16LE, simply re-use the string. Release with
+ * tstr_put_utf16le() when done. */
+static inline int
+tstr_get_utf16le(const tchar *tstr, const utf16lechar **ustr_ret)
+{
+#if TCHAR_IS_UTF16LE
+ /* No conversion or copy needed */
+ *ustr_ret = tstr;
+ return 0;
+#else
+ size_t tsize = tstrlen(tstr) * sizeof(tchar);
+ size_t dummy;
+ return tstr_to_utf16le(tstr, tsize, (utf16lechar **)ustr_ret, &dummy);
+#endif
+}
+
+/* Release a string acquired with tstr_get_utf16le() or
+ * tstr_get_utf16le_and_len(). */
+static inline void
+tstr_put_utf16le(const utf16lechar *ustr)
+{
+#if !TCHAR_IS_UTF16LE
+ FREE((void *)ustr);
+#endif
+}
+
+/* Convert a UTF16-LE string to the platform-dependent encoding, but if both
+ * encodings are UTF-16LE, simply re-use the string. Release with
+ * utf16le_put_tstr() when done. */
+static inline int
+utf16le_get_tstr(const utf16lechar *ustr, size_t usize,
+ const tchar **tstr_ret, size_t *tsize_ret)
+{
+#if TCHAR_IS_UTF16LE
+ /* No conversion or copy needed */
+ *tstr_ret = ustr;
+ *tsize_ret = usize;
+ return 0;
+#else
+ return utf16le_to_tstr(ustr, usize, (tchar **)tstr_ret, tsize_ret);
+#endif
+}
+
+/* Release a string acquired with utf16le_get_tstr(). */
+static inline void
+utf16le_put_tstr(const tchar *tstr)
+{
+#if !TCHAR_IS_UTF16LE
+ FREE((void *)tstr);
+#endif
+}
+