13d58139fSopenharmony_ci/*
23d58139fSopenharmony_ci * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved.
33d58139fSopenharmony_ci * Licensed under Mulan PSL v2.
43d58139fSopenharmony_ci * You can use this software according to the terms and conditions of the Mulan PSL v2.
53d58139fSopenharmony_ci * You may obtain a copy of Mulan PSL v2 at:
63d58139fSopenharmony_ci *          http://license.coscl.org.cn/MulanPSL2
73d58139fSopenharmony_ci * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
83d58139fSopenharmony_ci * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
93d58139fSopenharmony_ci * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
103d58139fSopenharmony_ci * See the Mulan PSL v2 for more details.
113d58139fSopenharmony_ci * Description: Define macro, data struct, and declare function prototype,
123d58139fSopenharmony_ci *              which is used by input.inl, secureinput_a.c and secureinput_w.c.
133d58139fSopenharmony_ci * Create: 2014-02-25
143d58139fSopenharmony_ci */
153d58139fSopenharmony_ci
163d58139fSopenharmony_ci#ifndef SEC_INPUT_H_E950DA2C_902F_4B15_BECD_948E99090D9C
173d58139fSopenharmony_ci#define SEC_INPUT_H_E950DA2C_902F_4B15_BECD_948E99090D9C
183d58139fSopenharmony_ci#include "securecutil.h"
193d58139fSopenharmony_ci
203d58139fSopenharmony_ci#define SECUREC_SCANF_EINVAL             (-1)
213d58139fSopenharmony_ci#define SECUREC_SCANF_ERROR_PARA         (-2)
223d58139fSopenharmony_ci
233d58139fSopenharmony_ci/* For internal stream flag */
243d58139fSopenharmony_ci#define SECUREC_MEM_STR_FLAG             0x01U
253d58139fSopenharmony_ci#define SECUREC_FILE_STREAM_FLAG         0x02U
263d58139fSopenharmony_ci#define SECUREC_PIPE_STREAM_FLAG         0x04U
273d58139fSopenharmony_ci#define SECUREC_LOAD_FILE_TO_MEM_FLAG    0x08U
283d58139fSopenharmony_ci
293d58139fSopenharmony_ci#define SECUREC_UCS_BOM_HEADER_SIZE      2U
303d58139fSopenharmony_ci#define SECUREC_UCS_BOM_HEADER_BE_1ST    0xfeU
313d58139fSopenharmony_ci#define SECUREC_UCS_BOM_HEADER_BE_2ST    0xffU
323d58139fSopenharmony_ci#define SECUREC_UCS_BOM_HEADER_LE_1ST    0xffU
333d58139fSopenharmony_ci#define SECUREC_UCS_BOM_HEADER_LE_2ST    0xfeU
343d58139fSopenharmony_ci#define SECUREC_UTF8_BOM_HEADER_SIZE     3U
353d58139fSopenharmony_ci#define SECUREC_UTF8_BOM_HEADER_1ST      0xefU
363d58139fSopenharmony_ci#define SECUREC_UTF8_BOM_HEADER_2ND      0xbbU
373d58139fSopenharmony_ci#define SECUREC_UTF8_BOM_HEADER_3RD      0xbfU
383d58139fSopenharmony_ci#define SECUREC_UTF8_LEAD_1ST            0xe0U
393d58139fSopenharmony_ci#define SECUREC_UTF8_LEAD_2ND            0x80U
403d58139fSopenharmony_ci
413d58139fSopenharmony_ci#define SECUREC_BEGIN_WITH_UCS_BOM(s, len) ((len) == SECUREC_UCS_BOM_HEADER_SIZE && \
423d58139fSopenharmony_ci    (((unsigned char)((s)[0]) == SECUREC_UCS_BOM_HEADER_LE_1ST && \
433d58139fSopenharmony_ci    (unsigned char)((s)[1]) == SECUREC_UCS_BOM_HEADER_LE_2ST) || \
443d58139fSopenharmony_ci    ((unsigned char)((s)[0]) == SECUREC_UCS_BOM_HEADER_BE_1ST && \
453d58139fSopenharmony_ci    (unsigned char)((s)[1]) == SECUREC_UCS_BOM_HEADER_BE_2ST)))
463d58139fSopenharmony_ci
473d58139fSopenharmony_ci#define SECUREC_BEGIN_WITH_UTF8_BOM(s, len) ((len) == SECUREC_UTF8_BOM_HEADER_SIZE && \
483d58139fSopenharmony_ci    (unsigned char)((s)[0]) == SECUREC_UTF8_BOM_HEADER_1ST && \
493d58139fSopenharmony_ci    (unsigned char)((s)[1]) == SECUREC_UTF8_BOM_HEADER_2ND && \
503d58139fSopenharmony_ci    (unsigned char)((s)[2]) == SECUREC_UTF8_BOM_HEADER_3RD)
513d58139fSopenharmony_ci
523d58139fSopenharmony_ci#ifdef SECUREC_FOR_WCHAR
533d58139fSopenharmony_ci#define SECUREC_BOM_HEADER_SIZE SECUREC_UCS_BOM_HEADER_SIZE
543d58139fSopenharmony_ci#define SECUREC_BEGIN_WITH_BOM(s, len) SECUREC_BEGIN_WITH_UCS_BOM((s), (len))
553d58139fSopenharmony_ci#else
563d58139fSopenharmony_ci#define SECUREC_BOM_HEADER_SIZE SECUREC_UTF8_BOM_HEADER_SIZE
573d58139fSopenharmony_ci#define SECUREC_BEGIN_WITH_BOM(s, len) SECUREC_BEGIN_WITH_UTF8_BOM((s), (len))
583d58139fSopenharmony_ci#endif
593d58139fSopenharmony_ci
603d58139fSopenharmony_citypedef struct {
613d58139fSopenharmony_ci    unsigned int flag;          /* Mark the properties of input stream */
623d58139fSopenharmony_ci    char *base;                 /* The pointer to the header of buffered string */
633d58139fSopenharmony_ci    const char *cur;            /* The pointer to next read position */
643d58139fSopenharmony_ci    size_t count;               /* The size of buffered string in bytes */
653d58139fSopenharmony_ci#if SECUREC_ENABLE_SCANF_FILE
663d58139fSopenharmony_ci    FILE *pf;                   /* The file pointer */
673d58139fSopenharmony_ci    size_t fileRealRead;
683d58139fSopenharmony_ci    long oriFilePos;            /* The original position of file offset when fscanf is called */
693d58139fSopenharmony_ci#endif
703d58139fSopenharmony_ci} SecFileStream;
713d58139fSopenharmony_ci
723d58139fSopenharmony_ci#if SECUREC_ENABLE_SCANF_FILE
733d58139fSopenharmony_ci#define SECUREC_FILE_STREAM_INIT_FILE(stream, fp) do { \
743d58139fSopenharmony_ci    (stream)->pf = (fp); \
753d58139fSopenharmony_ci    (stream)->fileRealRead = 0; \
763d58139fSopenharmony_ci    (stream)->oriFilePos = 0; \
773d58139fSopenharmony_ci} SECUREC_WHILE_ZERO
783d58139fSopenharmony_ci#else
793d58139fSopenharmony_ci/* Disable file */
803d58139fSopenharmony_ci#define SECUREC_FILE_STREAM_INIT_FILE(stream, fp)
813d58139fSopenharmony_ci#endif
823d58139fSopenharmony_ci
833d58139fSopenharmony_ci/* This initialization for eliminating redundant initialization. */
843d58139fSopenharmony_ci#define SECUREC_FILE_STREAM_FROM_STRING(stream, buf, cnt) do { \
853d58139fSopenharmony_ci    (stream)->flag = SECUREC_MEM_STR_FLAG; \
863d58139fSopenharmony_ci    (stream)->base = NULL; \
873d58139fSopenharmony_ci    (stream)->cur = (buf); \
883d58139fSopenharmony_ci    (stream)->count = (cnt); \
893d58139fSopenharmony_ci    SECUREC_FILE_STREAM_INIT_FILE((stream), NULL); \
903d58139fSopenharmony_ci} SECUREC_WHILE_ZERO
913d58139fSopenharmony_ci
923d58139fSopenharmony_ci/* This initialization for eliminating redundant initialization. */
933d58139fSopenharmony_ci#define SECUREC_FILE_STREAM_FROM_FILE(stream, fp) do { \
943d58139fSopenharmony_ci    (stream)->flag = SECUREC_FILE_STREAM_FLAG; \
953d58139fSopenharmony_ci    (stream)->base = NULL; \
963d58139fSopenharmony_ci    (stream)->cur = NULL; \
973d58139fSopenharmony_ci    (stream)->count = 0; \
983d58139fSopenharmony_ci    SECUREC_FILE_STREAM_INIT_FILE((stream), (fp)); \
993d58139fSopenharmony_ci} SECUREC_WHILE_ZERO
1003d58139fSopenharmony_ci
1013d58139fSopenharmony_ci/* This initialization for eliminating redundant initialization. */
1023d58139fSopenharmony_ci#define SECUREC_FILE_STREAM_FROM_STDIN(stream) do { \
1033d58139fSopenharmony_ci    (stream)->flag = SECUREC_PIPE_STREAM_FLAG; \
1043d58139fSopenharmony_ci    (stream)->base = NULL; \
1053d58139fSopenharmony_ci    (stream)->cur = NULL; \
1063d58139fSopenharmony_ci    (stream)->count = 0; \
1073d58139fSopenharmony_ci    SECUREC_FILE_STREAM_INIT_FILE((stream), SECUREC_STREAM_STDIN); \
1083d58139fSopenharmony_ci} SECUREC_WHILE_ZERO
1093d58139fSopenharmony_ci
1103d58139fSopenharmony_ci#ifdef __cplusplus
1113d58139fSopenharmony_ciextern "C" {
1123d58139fSopenharmony_ci#endif
1133d58139fSopenharmony_ciint SecInputS(SecFileStream *stream, const char *cFormat, va_list argList);
1143d58139fSopenharmony_civoid SecClearDestBuf(const char *buffer, const char *format, va_list argList);
1153d58139fSopenharmony_ci#ifdef SECUREC_FOR_WCHAR
1163d58139fSopenharmony_ciint SecInputSW(SecFileStream *stream, const wchar_t *cFormat, va_list argList);
1173d58139fSopenharmony_civoid SecClearDestBufW(const wchar_t *buffer, const wchar_t *format, va_list argList);
1183d58139fSopenharmony_ci#endif
1193d58139fSopenharmony_ci
1203d58139fSopenharmony_ci/* 20150105 For software and hardware decoupling,such as UMG */
1213d58139fSopenharmony_ci#ifdef SECUREC_SYSAPI4VXWORKS
1223d58139fSopenharmony_ci#ifdef feof
1233d58139fSopenharmony_ci#undef feof
1243d58139fSopenharmony_ci#endif
1253d58139fSopenharmony_ciextern int feof(FILE *stream);
1263d58139fSopenharmony_ci#endif
1273d58139fSopenharmony_ci
1283d58139fSopenharmony_ci#if defined(SECUREC_SYSAPI4VXWORKS) || defined(SECUREC_CTYPE_MACRO_ADAPT)
1293d58139fSopenharmony_ci#ifndef isspace
1303d58139fSopenharmony_ci#define isspace(c) (((c) == ' ') || ((c) == '\t') || ((c) == '\r') || ((c) == '\n'))
1313d58139fSopenharmony_ci#endif
1323d58139fSopenharmony_ci#ifndef iswspace
1333d58139fSopenharmony_ci#define iswspace(c) (((c) == L' ') || ((c) == L'\t') || ((c) == L'\r') || ((c) == L'\n'))
1343d58139fSopenharmony_ci#endif
1353d58139fSopenharmony_ci#ifndef isascii
1363d58139fSopenharmony_ci#define isascii(c) (((unsigned char)(c)) <= 0x7f)
1373d58139fSopenharmony_ci#endif
1383d58139fSopenharmony_ci#ifndef isupper
1393d58139fSopenharmony_ci#define isupper(c) ((c) >= 'A' && (c) <= 'Z')
1403d58139fSopenharmony_ci#endif
1413d58139fSopenharmony_ci#ifndef islower
1423d58139fSopenharmony_ci#define islower(c) ((c) >= 'a' && (c) <= 'z')
1433d58139fSopenharmony_ci#endif
1443d58139fSopenharmony_ci#ifndef isalpha
1453d58139fSopenharmony_ci#define isalpha(c) (isupper(c) || (islower(c)))
1463d58139fSopenharmony_ci#endif
1473d58139fSopenharmony_ci#ifndef isdigit
1483d58139fSopenharmony_ci#define isdigit(c) ((c) >= '0' && (c) <= '9')
1493d58139fSopenharmony_ci#endif
1503d58139fSopenharmony_ci#ifndef isxupper
1513d58139fSopenharmony_ci#define isxupper(c) ((c) >= 'A' && (c) <= 'F')
1523d58139fSopenharmony_ci#endif
1533d58139fSopenharmony_ci#ifndef isxlower
1543d58139fSopenharmony_ci#define isxlower(c) ((c) >= 'a' && (c) <= 'f')
1553d58139fSopenharmony_ci#endif
1563d58139fSopenharmony_ci#ifndef isxdigit
1573d58139fSopenharmony_ci#define isxdigit(c) (isdigit(c) || isxupper(c) || isxlower(c))
1583d58139fSopenharmony_ci#endif
1593d58139fSopenharmony_ci#endif
1603d58139fSopenharmony_ci
1613d58139fSopenharmony_ci#ifdef __cplusplus
1623d58139fSopenharmony_ci}
1633d58139fSopenharmony_ci#endif
1643d58139fSopenharmony_ci/* Reserved file operation macro interface, s is FILE *, i is fileno zero. */
1653d58139fSopenharmony_ci#ifndef SECUREC_LOCK_FILE
1663d58139fSopenharmony_ci#define SECUREC_LOCK_FILE(s)
1673d58139fSopenharmony_ci#endif
1683d58139fSopenharmony_ci
1693d58139fSopenharmony_ci#ifndef SECUREC_UNLOCK_FILE
1703d58139fSopenharmony_ci#define SECUREC_UNLOCK_FILE(s)
1713d58139fSopenharmony_ci#endif
1723d58139fSopenharmony_ci
1733d58139fSopenharmony_ci#ifndef SECUREC_LOCK_STDIN
1743d58139fSopenharmony_ci#define SECUREC_LOCK_STDIN(i, s)
1753d58139fSopenharmony_ci#endif
1763d58139fSopenharmony_ci
1773d58139fSopenharmony_ci#ifndef SECUREC_UNLOCK_STDIN
1783d58139fSopenharmony_ci#define SECUREC_UNLOCK_STDIN(i, s)
1793d58139fSopenharmony_ci#endif
1803d58139fSopenharmony_ci#endif
1813d58139fSopenharmony_ci
182