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