4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* $Id$ */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * fsw_strfunc.h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Copyright (C) 2010 Oracle Corporation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * available from http://www.virtualbox.org. This file is free software;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * you can redistribute it and/or modify it under the terms of the GNU
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * General Public License (GPL) as published by the Free Software
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The contents of this file may alternatively be used under the terms
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * of the Common Development and Distribution License Version 1.0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * VirtualBox OSE distribution, in which case the provisions of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * CDDL are applicable instead of those of the GPL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * You may elect to license modified versions of this file under the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * terms and conditions of either the GPL or the CDDL or both.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* fsw_strfunc.h generated by mk_fsw_strfunc.py */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic int fsw_streq_ISO88591_UTF8(void *s1data, void *s2data, int len)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u8 *p1 = (fsw_u8 *)s1data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u8 *p2 = (fsw_u8 *)s2data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u32 c1, c2;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < len; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c1 = *p1++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c2 = *p2++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((c2 & 0xe0) == 0xc0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c2 = ((c2 & 0x1f) << 6) | (*p2++ & 0x3f);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((c2 & 0xf0) == 0xe0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c2 = ((c2 & 0x0f) << 12) | ((*p2++ & 0x3f) << 6);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c2 |= (*p2++ & 0x3f);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((c2 & 0xf8) == 0xf0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c2 = ((c2 & 0x07) << 18) | ((*p2++ & 0x3f) << 12);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c2 |= ((*p2++ & 0x3f) << 6);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c2 |= (*p2++ & 0x3f);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (c1 != c2)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef HOST_EFI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic int fsw_streq_ISO88591_UTF16(void *s1data, void *s2data, int len)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u8 *p1 = (fsw_u8 *)s1data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u16 *p2 = (fsw_u16 *)s2data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u32 c1, c2;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < len; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c1 = *p1++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c2 = *p2++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (c1 != c2)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic int fsw_streq_ISO88591_UTF16_SWAPPED(void *s1data, void *s2data, int len)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u8 *p1 = (fsw_u8 *)s1data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u16 *p2 = (fsw_u16 *)s2data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u32 c1, c2;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < len; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c1 = *p1++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c2 = *p2++; c2 = FSW_SWAPVALUE_U16(c2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (c1 != c2)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic int fsw_streq_UTF8_UTF16(void *s1data, void *s2data, int len)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u8 *p1 = (fsw_u8 *)s1data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u16 *p2 = (fsw_u16 *)s2data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u32 c1, c2;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < len; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c1 = *p1++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((c1 & 0xe0) == 0xc0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c1 = ((c1 & 0x1f) << 6) | (*p1++ & 0x3f);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((c1 & 0xf0) == 0xe0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c1 = ((c1 & 0x0f) << 12) | ((*p1++ & 0x3f) << 6);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c1 |= (*p1++ & 0x3f);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((c1 & 0xf8) == 0xf0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c1 = ((c1 & 0x07) << 18) | ((*p1++ & 0x3f) << 12);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c1 |= ((*p1++ & 0x3f) << 6);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c1 |= (*p1++ & 0x3f);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c2 = *p2++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (c1 != c2)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic int fsw_streq_UTF8_UTF16_SWAPPED(void *s1data, void *s2data, int len)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u8 *p1 = (fsw_u8 *)s1data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u16 *p2 = (fsw_u16 *)s2data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u32 c1, c2;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < len; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c1 = *p1++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((c1 & 0xe0) == 0xc0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c1 = ((c1 & 0x1f) << 6) | (*p1++ & 0x3f);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((c1 & 0xf0) == 0xe0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c1 = ((c1 & 0x0f) << 12) | ((*p1++ & 0x3f) << 6);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c1 |= (*p1++ & 0x3f);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((c1 & 0xf8) == 0xf0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c1 = ((c1 & 0x07) << 18) | ((*p1++ & 0x3f) << 12);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c1 |= ((*p1++ & 0x3f) << 6);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c1 |= (*p1++ & 0x3f);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c2 = *p2++; c2 = FSW_SWAPVALUE_U16(c2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (c1 != c2)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic int fsw_streq_UTF16_UTF16_SWAPPED(void *s1data, void *s2data, int len)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u16 *p1 = (fsw_u16 *)s1data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u16 *p2 = (fsw_u16 *)s2data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u32 c1, c2;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < len; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c1 = *p1++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c2 = *p2++; c2 = FSW_SWAPVALUE_U16(c2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (c1 != c2)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic fsw_status_t fsw_strcoerce_UTF8_ISO88591(void *srcdata, int srclen, struct fsw_string *dest)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_status_t status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u8 *sp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u8 *dp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u32 c;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->type = FSW_STRING_TYPE_ISO88591;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->len = srclen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->size = srclen * sizeof(fsw_u8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync status = fsw_alloc(dest->size, &dest->data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (status)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return status;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sp = (fsw_u8 *)srcdata;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dp = (fsw_u8 *)dest->data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < srclen; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c = *sp++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((c & 0xe0) == 0xc0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c = ((c & 0x1f) << 6) | (*sp++ & 0x3f);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((c & 0xf0) == 0xe0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c = ((c & 0x0f) << 12) | ((*sp++ & 0x3f) << 6);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c |= (*sp++ & 0x3f);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((c & 0xf8) == 0xf0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c = ((c & 0x07) << 18) | ((*sp++ & 0x3f) << 12);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c |= ((*sp++ & 0x3f) << 6);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c |= (*sp++ & 0x3f);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)c;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FSW_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic fsw_status_t fsw_strcoerce_UTF16_ISO88591(void *srcdata, int srclen, struct fsw_string *dest)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_status_t status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u16 *sp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u8 *dp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u32 c;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->type = FSW_STRING_TYPE_ISO88591;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->len = srclen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->size = srclen * sizeof(fsw_u8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync status = fsw_alloc(dest->size, &dest->data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (status)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return status;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sp = (fsw_u16 *)srcdata;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dp = (fsw_u8 *)dest->data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < srclen; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c = *sp++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)c;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FSW_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic fsw_status_t fsw_strcoerce_UTF16_SWAPPED_ISO88591(void *srcdata, int srclen, struct fsw_string *dest)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_status_t status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u16 *sp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u8 *dp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u32 c;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->type = FSW_STRING_TYPE_ISO88591;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->len = srclen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->size = srclen * sizeof(fsw_u8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync status = fsw_alloc(dest->size, &dest->data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (status)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return status;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sp = (fsw_u16 *)srcdata;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dp = (fsw_u8 *)dest->data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < srclen; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c = *sp++; c = FSW_SWAPVALUE_U16(c);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)c;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FSW_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic fsw_status_t fsw_strcoerce_ISO88591_UTF16(void *srcdata, int srclen, struct fsw_string *dest)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_status_t status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u8 *sp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u16 *dp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u32 c;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->type = FSW_STRING_TYPE_UTF16;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->len = srclen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->size = srclen * sizeof(fsw_u16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync status = fsw_alloc(dest->size, &dest->data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (status)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return status;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sp = (fsw_u8 *)srcdata;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dp = (fsw_u16 *)dest->data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < srclen; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c = *sp++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u16)c;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FSW_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic fsw_status_t fsw_strcoerce_UTF8_UTF16(void *srcdata, int srclen, struct fsw_string *dest)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_status_t status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u8 *sp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u16 *dp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u32 c;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->type = FSW_STRING_TYPE_UTF16;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->len = srclen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->size = srclen * sizeof(fsw_u16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync status = fsw_alloc(dest->size, &dest->data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (status)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return status;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sp = (fsw_u8 *)srcdata;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dp = (fsw_u16 *)dest->data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < srclen; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c = *sp++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((c & 0xe0) == 0xc0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c = ((c & 0x1f) << 6) | (*sp++ & 0x3f);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((c & 0xf0) == 0xe0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c = ((c & 0x0f) << 12) | ((*sp++ & 0x3f) << 6);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c |= (*sp++ & 0x3f);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((c & 0xf8) == 0xf0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c = ((c & 0x07) << 18) | ((*sp++ & 0x3f) << 12);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c |= ((*sp++ & 0x3f) << 6);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c |= (*sp++ & 0x3f);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u16)c;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FSW_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic fsw_status_t fsw_strcoerce_UTF16_SWAPPED_UTF16(void *srcdata, int srclen, struct fsw_string *dest)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_status_t status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u16 *sp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u16 *dp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u32 c;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->type = FSW_STRING_TYPE_UTF16;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->len = srclen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->size = srclen * sizeof(fsw_u16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync status = fsw_alloc(dest->size, &dest->data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (status)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return status;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sp = (fsw_u16 *)srcdata;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dp = (fsw_u16 *)dest->data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < srclen; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c = *sp++; c = FSW_SWAPVALUE_U16(c);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u16)c;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FSW_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic fsw_status_t fsw_strcoerce_ISO88591_UTF8(void *srcdata, int srclen, struct fsw_string *dest)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_status_t status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i, destsize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u8 *sp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u8 *dp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u32 c;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sp = (fsw_u8 *)srcdata;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destsize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < srclen; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c = *sp++;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (c < 0x000080)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destsize++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else if (c < 0x000800)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destsize += 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else if (c < 0x010000)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destsize += 3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destsize += 4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->type = FSW_STRING_TYPE_UTF8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->len = srclen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->size = destsize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync status = fsw_alloc(dest->size, &dest->data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (status)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return status;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sp = (fsw_u8 *)srcdata;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dp = (fsw_u8 *)dest->data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < srclen; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c = *sp++;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (c < 0x000080) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)c;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (c < 0x000800) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0xc0 | ((c >> 6) & 0x1f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0x80 | (c & 0x3f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (c < 0x010000) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0xe0 | ((c >> 12) & 0x0f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0x80 | ((c >> 6) & 0x3f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0x80 | (c & 0x3f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0xf0 | ((c >> 18) & 0x07));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0x80 | ((c >> 12) & 0x3f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0x80 | ((c >> 6) & 0x3f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0x80 | (c & 0x3f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FSW_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic fsw_status_t fsw_strcoerce_UTF16_UTF8(void *srcdata, int srclen, struct fsw_string *dest)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_status_t status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i, destsize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u16 *sp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u8 *dp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u32 c;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sp = (fsw_u16 *)srcdata;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destsize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < srclen; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c = *sp++;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (c < 0x000080)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destsize++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else if (c < 0x000800)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destsize += 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else if (c < 0x010000)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destsize += 3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destsize += 4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->type = FSW_STRING_TYPE_UTF8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->len = srclen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->size = destsize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync status = fsw_alloc(dest->size, &dest->data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (status)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return status;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sp = (fsw_u16 *)srcdata;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dp = (fsw_u8 *)dest->data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < srclen; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c = *sp++;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (c < 0x000080) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)c;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (c < 0x000800) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0xc0 | ((c >> 6) & 0x1f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0x80 | (c & 0x3f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (c < 0x010000) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0xe0 | ((c >> 12) & 0x0f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0x80 | ((c >> 6) & 0x3f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0x80 | (c & 0x3f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0xf0 | ((c >> 18) & 0x07));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0x80 | ((c >> 12) & 0x3f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0x80 | ((c >> 6) & 0x3f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0x80 | (c & 0x3f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FSW_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic fsw_status_t fsw_strcoerce_UTF16_SWAPPED_UTF8(void *srcdata, int srclen, struct fsw_string *dest)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_status_t status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i, destsize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u16 *sp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u8 *dp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fsw_u32 c;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sp = (fsw_u16 *)srcdata;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destsize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < srclen; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c = *sp++; c = FSW_SWAPVALUE_U16(c);
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (c < 0x000080)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destsize++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else if (c < 0x000800)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destsize += 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else if (c < 0x010000)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destsize += 3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destsize += 4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->type = FSW_STRING_TYPE_UTF8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->len = srclen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest->size = destsize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync status = fsw_alloc(dest->size, &dest->data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (status)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return status;
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sp = (fsw_u16 *)srcdata;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dp = (fsw_u8 *)dest->data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < srclen; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync c = *sp++; c = FSW_SWAPVALUE_U16(c);
1e9e76e4273dcc2e3d560a0f3605c46f0013eb7bvboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (c < 0x000080) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)c;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (c < 0x000800) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0xc0 | ((c >> 6) & 0x1f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0x80 | (c & 0x3f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (c < 0x010000) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0xe0 | ((c >> 12) & 0x0f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0x80 | ((c >> 6) & 0x3f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0x80 | (c & 0x3f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0xf0 | ((c >> 18) & 0x07));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0x80 | ((c >> 12) & 0x3f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0x80 | ((c >> 6) & 0x3f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *dp++ = (fsw_u8)(0x80 | (c & 0x3f));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FSW_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}