1beacf11bSopenharmony_ci/* ----------------------------------------------------------------------------
2beacf11bSopenharmony_ci * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
3beacf11bSopenharmony_ci * Description: LiteOS USB Driver Config Data Stream
4beacf11bSopenharmony_ci * Author: Yannik Li
5beacf11bSopenharmony_ci * Create: 2021-02-21
6beacf11bSopenharmony_ci * Redistribution and use in source and binary forms, with or without modification,
7beacf11bSopenharmony_ci * are permitted provided that the following conditions are met:
8beacf11bSopenharmony_ci * 1. Redistributions of source code must retain the above copyright notice, this list of
9beacf11bSopenharmony_ci * conditions and the following disclaimer.
10beacf11bSopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright notice, this list
11beacf11bSopenharmony_ci * of conditions and the following disclaimer in the documentation and/or other materials
12beacf11bSopenharmony_ci * provided with the distribution.
13beacf11bSopenharmony_ci * 3. Neither the name of the copyright holder nor the names of its contributors may be used
14beacf11bSopenharmony_ci * to endorse or promote products derived from this software without specific prior written
15beacf11bSopenharmony_ci * permission.
16beacf11bSopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17beacf11bSopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18beacf11bSopenharmony_ci * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19beacf11bSopenharmony_ci * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
20beacf11bSopenharmony_ci * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21beacf11bSopenharmony_ci * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22beacf11bSopenharmony_ci * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23beacf11bSopenharmony_ci * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24beacf11bSopenharmony_ci * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25beacf11bSopenharmony_ci * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26beacf11bSopenharmony_ci * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27beacf11bSopenharmony_ci * --------------------------------------------------------------------------- */
28beacf11bSopenharmony_ci/* ----------------------------------------------------------------------------
29beacf11bSopenharmony_ci * Notice of Export Control Law
30beacf11bSopenharmony_ci * ===============================================
31beacf11bSopenharmony_ci * Huawei LiteOS may be subject to applicable export control laws and regulations, which might
32beacf11bSopenharmony_ci * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.
33beacf11bSopenharmony_ci * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such
34beacf11bSopenharmony_ci * applicable export control laws and regulations.
35beacf11bSopenharmony_ci * --------------------------------------------------------------------------- */
36beacf11bSopenharmony_ci
37beacf11bSopenharmony_ci#include <poll.h>
38beacf11bSopenharmony_ci#include "usbd_config.h"
39beacf11bSopenharmony_ci#include "implementation/global_implementation.h"
40beacf11bSopenharmony_ci#include "usb_string.h"
41beacf11bSopenharmony_ci
42beacf11bSopenharmony_ci#ifdef __cplusplus
43beacf11bSopenharmony_ci#if __cplusplus
44beacf11bSopenharmony_ci//extern "C" {
45beacf11bSopenharmony_ci#endif /* __cplusplus */
46beacf11bSopenharmony_ci#endif /* __cplusplus */
47beacf11bSopenharmony_ci
48beacf11bSopenharmony_ciint utf8_to_utf16le(const char *src, uint8_t *target, uint32_t len)
49beacf11bSopenharmony_ci{
50beacf11bSopenharmony_ci  int count = 0;
51beacf11bSopenharmony_ci  uint8_t c;
52beacf11bSopenharmony_ci  uint16_t wc;
53beacf11bSopenharmony_ci
54beacf11bSopenharmony_ci  while (len != 0 && (c = (uint8_t)*src++) != 0)
55beacf11bSopenharmony_ci    {
56beacf11bSopenharmony_ci      if ((c & 0x80) == 0)
57beacf11bSopenharmony_ci        { /* 0xxxxxxx => 000000000xxxxxxx */
58beacf11bSopenharmony_ci          wc = c;
59beacf11bSopenharmony_ci        }
60beacf11bSopenharmony_ci      else if ((c & 0xe0) == 0xc0)
61beacf11bSopenharmony_ci        { /* 110yyyyy 10xxxxxx => 00000yyyyyxxxxxx */
62beacf11bSopenharmony_ci          wc = (c & 0x1f) << 6;
63beacf11bSopenharmony_ci
64beacf11bSopenharmony_ci          c = (uint8_t)*src++;
65beacf11bSopenharmony_ci          if ((c & 0xc0) != 0x80)
66beacf11bSopenharmony_ci            goto err;
67beacf11bSopenharmony_ci          c &= 0x3f;
68beacf11bSopenharmony_ci          wc |= c;
69beacf11bSopenharmony_ci        }
70beacf11bSopenharmony_ci      else if ((c & 0xf0) == 0xe0)
71beacf11bSopenharmony_ci        { /* 1110zzzz 10yyyyyy 10xxxxxx => zzzzyyyyyyxxxxxx */
72beacf11bSopenharmony_ci          wc = (c & 0x0f) << 12;
73beacf11bSopenharmony_ci
74beacf11bSopenharmony_ci          c = (uint8_t)*src++;
75beacf11bSopenharmony_ci          if ((c & 0xc0) != 0x80)
76beacf11bSopenharmony_ci            goto err;
77beacf11bSopenharmony_ci          c &= 0x3f;
78beacf11bSopenharmony_ci          wc |= c << 6;
79beacf11bSopenharmony_ci
80beacf11bSopenharmony_ci          c = (uint8_t)*src++;
81beacf11bSopenharmony_ci          if ((c & 0xc0) != 0x80)
82beacf11bSopenharmony_ci            goto err;
83beacf11bSopenharmony_ci          c &= 0x3f;
84beacf11bSopenharmony_ci          wc |= c;
85beacf11bSopenharmony_ci
86beacf11bSopenharmony_ci          /* don't support surrogates */
87beacf11bSopenharmony_ci          if (0xd800 <= wc && wc <= 0xdfff)
88beacf11bSopenharmony_ci            {
89beacf11bSopenharmony_ci              goto err;
90beacf11bSopenharmony_ci            }
91beacf11bSopenharmony_ci        }
92beacf11bSopenharmony_ci      else
93beacf11bSopenharmony_ci        { /* 4 bytes sequence is not supported */
94beacf11bSopenharmony_ci          goto err;
95beacf11bSopenharmony_ci        }
96beacf11bSopenharmony_ci
97beacf11bSopenharmony_ci      *target++ = (uint8_t)wc;
98beacf11bSopenharmony_ci      *target++ = (uint8_t)(wc >> 8);
99beacf11bSopenharmony_ci      count++;
100beacf11bSopenharmony_ci      len--;
101beacf11bSopenharmony_ci    }
102beacf11bSopenharmony_ci  return count;
103beacf11bSopenharmony_ci
104beacf11bSopenharmony_cierr:
105beacf11bSopenharmony_ci  return -1;
106beacf11bSopenharmony_ci}
107beacf11bSopenharmony_ci
108beacf11bSopenharmony_ci#ifdef __cplusplus
109beacf11bSopenharmony_ci#if __cplusplus
110beacf11bSopenharmony_ci//}
111beacf11bSopenharmony_ci#endif /* __cplusplus */
112beacf11bSopenharmony_ci#endif /* __cplusplus */
113