fix:Solution of conflict
Change-Id: If2565e5942ca019865720d56dd8bda1617044e6d
This commit is contained in:
commit
afdda22821
|
@ -0,0 +1,8 @@
|
|||
[submodule "third_party/cmsis"]
|
||||
path = third_party/cmsis
|
||||
url = ../third_party_cmsis.git
|
||||
branch = .
|
||||
[submodule "third_party/bounds_checking_function"]
|
||||
path = third_party/bounds_checking_function
|
||||
url = ../third_party_bounds_checking_function.git
|
||||
branch = .
|
58
arch_spec.md
58
arch_spec.md
|
@ -1,36 +1,36 @@
|
|||
```
|
||||
.
|
||||
├── components --- 可选组件,可裁剪,依赖kernel
|
||||
│ ├── cppsupport --- C++支持
|
||||
│ └── cpup --- CPUP功能
|
||||
├── kal --- 内核抽象层
|
||||
│ ├── cmsis --- cmsis标准支持
|
||||
│ └── posix --- posix标准支持
|
||||
├── kernel --- 内核最小功能集支持
|
||||
│ ├── arch --- 硬件架构相关
|
||||
│ │ ├── arm --- arm32架构
|
||||
│ │ │ └── cortex-m4 --- cortex-m4架构
|
||||
│ │ │ └── iar ---
|
||||
├── components --- Optional components
|
||||
│ ├── cppsupport --- C++
|
||||
│ └── cpup --- CPUP
|
||||
├── kal --- Kernel Abstraction Layer
|
||||
│ ├── cmsis --- cmsis
|
||||
│ └── posix --- posix
|
||||
├── kernel --- Minimalistic kernel funtionalities
|
||||
│ ├── arch --- Support for hardware architectures
|
||||
│ │ ├── arm --- arm32
|
||||
│ │ │ └── cortex-m4 --- cortex-m4
|
||||
│ │ │ └── iar
|
||||
│ │ │ ├── los_atomic.h
|
||||
│ │ │ ├── los_context.h
|
||||
│ │ │ ├── los_interrupt.h
|
||||
│ │ │ └── los_mpu.h
|
||||
│ │ └── include
|
||||
│ │ ├── los_arch_atomic.h --- 定义通用arch的原子操作
|
||||
│ │ ├── los_arch_context.h --- 定义通用arch的上下文切换
|
||||
│ │ ├── los_arch.h --- 定义通用arch初始化
|
||||
│ │ └── los_arch_interrupt.h --- 定义通用arch中断
|
||||
│ │ ├── los_arch_atomic.h --- Atomic operations
|
||||
│ │ ├── los_arch_context.h --- Context switch
|
||||
│ │ ├── los_arch.h --- Initialization
|
||||
│ │ └── los_arch_interrupt.h --- Interrupts
|
||||
│ ├── include
|
||||
│ │ ├── los_config.h --- 功能开关和配置参数
|
||||
│ │ ├── los_event.h --- 事件
|
||||
│ │ ├── los_liteos.h --- liteos最小功能集对外提供的头文件
|
||||
│ │ ├── los_memory.h --- 堆内存管理
|
||||
│ │ ├── los_mutex.h --- 互斥锁
|
||||
│ │ ├── los_queue.h --- 队列
|
||||
│ │ ├── los_scheduler.h --- 调度算法
|
||||
│ │ ├── los_sem.h --- 信号量
|
||||
│ │ ├── los_task.h --- 任务
|
||||
│ │ └── los_timer.h --- 定时器
|
||||
│ │ ├── los_config.h --- Configuration parameters
|
||||
│ │ ├── los_event.h --- Events management
|
||||
│ │ ├── los_liteos.h --- Kernel types and functions
|
||||
│ │ ├── los_memory.h --- Heap memory management
|
||||
│ │ ├── los_mutex.h --- Mutex
|
||||
│ │ ├── los_queue.h --- Queue
|
||||
│ │ ├── los_scheduler.h --- Scheduler
|
||||
│ │ ├── los_sem.h --- Semaphores
|
||||
│ │ ├── los_task.h --- Tasks
|
||||
│ │ └── los_timer.h --- Timer
|
||||
│ └── src
|
||||
├── targets
|
||||
│ └── targets
|
||||
|
@ -40,13 +40,13 @@
|
|||
│ ├── Libraries
|
||||
│ ├── main.c
|
||||
│ ├── project
|
||||
│ ├── target_config.h --- 板级配置功能开关和配置参数
|
||||
│ ├── target_config.h --- Hardware target configuration
|
||||
│ └── Utilities
|
||||
└── utils
|
||||
├── include
|
||||
│ ├── los_compiler.h --- 编译工具配置,类型定义
|
||||
│ ├── los_debug.h --- debug,printf相关
|
||||
│ ├── los_error.h --- 错误定义
|
||||
│ ├── los_compiler.h --- Compiler configuration
|
||||
│ ├── los_debug.h --- Debugging facilities
|
||||
│ ├── los_error.h --- Errors codes and definitions
|
||||
│ └── los_list.h
|
||||
└── src
|
||||
```
|
||||
|
|
|
@ -1,74 +0,0 @@
|
|||
# Copyright (c) 2013-2019, Huawei Technologies Co., Ltd. All rights reserved.
|
||||
# Copyright (c) 2020-2021, Huawei Device Co., Ltd. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without modification,
|
||||
# are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
# conditions and the following disclaimer.
|
||||
#
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
# of conditions and the following disclaimer in the documentation and/or other materials
|
||||
# provided with the distribution.
|
||||
#
|
||||
# 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||
# to endorse or promote products derived from this software without specific prior written
|
||||
# permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
static_library("sec") {
|
||||
include_dirs = [ "//third_party/bounds_checking_function/include" ]
|
||||
|
||||
sources = [
|
||||
"//third_party/bounds_checking_function/src/fscanf_s.c",
|
||||
"//third_party/bounds_checking_function/src/fwscanf_s.c",
|
||||
"//third_party/bounds_checking_function/src/gets_s.c",
|
||||
"//third_party/bounds_checking_function/src/memcpy_s.c",
|
||||
"//third_party/bounds_checking_function/src/memmove_s.c",
|
||||
"//third_party/bounds_checking_function/src/memset_s.c",
|
||||
"//third_party/bounds_checking_function/src/scanf_s.c",
|
||||
"//third_party/bounds_checking_function/src/securecutil.c",
|
||||
"//third_party/bounds_checking_function/src/secureinput_a.c",
|
||||
"//third_party/bounds_checking_function/src/secureinput_w.c",
|
||||
"//third_party/bounds_checking_function/src/secureprintoutput_a.c",
|
||||
"//third_party/bounds_checking_function/src/secureprintoutput_w.c",
|
||||
"//third_party/bounds_checking_function/src/snprintf_s.c",
|
||||
"//third_party/bounds_checking_function/src/sprintf_s.c",
|
||||
"//third_party/bounds_checking_function/src/sscanf_s.c",
|
||||
"//third_party/bounds_checking_function/src/strcat_s.c",
|
||||
"//third_party/bounds_checking_function/src/strcpy_s.c",
|
||||
"//third_party/bounds_checking_function/src/strncat_s.c",
|
||||
"//third_party/bounds_checking_function/src/strncpy_s.c",
|
||||
"//third_party/bounds_checking_function/src/strtok_s.c",
|
||||
"//third_party/bounds_checking_function/src/swprintf_s.c",
|
||||
"//third_party/bounds_checking_function/src/swscanf_s.c",
|
||||
"//third_party/bounds_checking_function/src/vfscanf_s.c",
|
||||
"//third_party/bounds_checking_function/src/vfwscanf_s.c",
|
||||
"//third_party/bounds_checking_function/src/vscanf_s.c",
|
||||
"//third_party/bounds_checking_function/src/vsnprintf_s.c",
|
||||
"//third_party/bounds_checking_function/src/vsprintf_s.c",
|
||||
"//third_party/bounds_checking_function/src/vsscanf_s.c",
|
||||
"//third_party/bounds_checking_function/src/vswprintf_s.c",
|
||||
"//third_party/bounds_checking_function/src/vswscanf_s.c",
|
||||
"//third_party/bounds_checking_function/src/vwscanf_s.c",
|
||||
"//third_party/bounds_checking_function/src/wcscat_s.c",
|
||||
"//third_party/bounds_checking_function/src/wcscpy_s.c",
|
||||
"//third_party/bounds_checking_function/src/wcsncat_s.c",
|
||||
"//third_party/bounds_checking_function/src/wcsncpy_s.c",
|
||||
"//third_party/bounds_checking_function/src/wcstok_s.c",
|
||||
"//third_party/bounds_checking_function/src/wmemcpy_s.c",
|
||||
"//third_party/bounds_checking_function/src/wmemmove_s.c",
|
||||
"//third_party/bounds_checking_function/src/wscanf_s.c",
|
||||
]
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
|
@ -1,124 +0,0 @@
|
|||
木兰宽松许可证, 第2版
|
||||
|
||||
2020年1月 http://license.coscl.org.cn/MulanPSL2
|
||||
|
||||
您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束:
|
||||
|
||||
0. 定义
|
||||
|
||||
“软件” 是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。
|
||||
|
||||
“贡献” 是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。
|
||||
|
||||
“贡献者” 是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。
|
||||
|
||||
“法人实体” 是指提交贡献的机构及其“关联实体”。
|
||||
|
||||
“关联实体” 是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。
|
||||
|
||||
1. 授予版权许可
|
||||
|
||||
每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。
|
||||
|
||||
2. 授予专利许可
|
||||
|
||||
每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。
|
||||
|
||||
3. 无商标许可
|
||||
|
||||
“本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。
|
||||
|
||||
4. 分发限制
|
||||
|
||||
您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。
|
||||
|
||||
5. 免责声明与责任限制
|
||||
|
||||
“软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。
|
||||
|
||||
6. 语言
|
||||
|
||||
“本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。
|
||||
|
||||
条款结束
|
||||
|
||||
如何将木兰宽松许可证,第2版,应用到您的软件
|
||||
|
||||
如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步:
|
||||
|
||||
1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字;
|
||||
|
||||
2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中;
|
||||
|
||||
3, 请将如下声明文本放入每个源文件的头部注释中。
|
||||
|
||||
Copyright (c) [Year] [name of copyright holder]
|
||||
[Software Name] is licensed under Mulan PSL v2.
|
||||
You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
You may obtain a copy of Mulan PSL v2 at:
|
||||
http://license.coscl.org.cn/MulanPSL2
|
||||
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
See the Mulan PSL v2 for more details.
|
||||
Mulan Permissive Software License,Version 2
|
||||
Mulan Permissive Software License,Version 2 (Mulan PSL v2)
|
||||
|
||||
January 2020 http://license.coscl.org.cn/MulanPSL2
|
||||
|
||||
Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions:
|
||||
|
||||
0. Definition
|
||||
|
||||
Software means the program and related documents which are licensed under this License and comprise all Contribution(s).
|
||||
|
||||
Contribution means the copyrightable work licensed by a particular Contributor under this License.
|
||||
|
||||
Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License.
|
||||
|
||||
Legal Entity means the entity making a Contribution and all its Affiliates.
|
||||
|
||||
Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, 'control' means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity.
|
||||
|
||||
1. Grant of Copyright License
|
||||
|
||||
Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not.
|
||||
|
||||
2. Grant of Patent License
|
||||
|
||||
Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken.
|
||||
|
||||
3. No Trademark License
|
||||
|
||||
No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in section 4.
|
||||
|
||||
4. Distribution Restriction
|
||||
|
||||
You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software.
|
||||
|
||||
5. Disclaimer of Warranty and Limitation of Liability
|
||||
|
||||
THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT'S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
6. Language
|
||||
|
||||
THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL.
|
||||
|
||||
END OF THE TERMS AND CONDITIONS
|
||||
|
||||
How to Apply the Mulan Permissive Software License,Version 2 (Mulan PSL v2) to Your Software
|
||||
|
||||
To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps:
|
||||
|
||||
Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner;
|
||||
Create a file named "LICENSE" which contains the whole context of this License in the first directory of your software package;
|
||||
Attach the statement to the appropriate annotated syntax at the beginning of each source file.
|
||||
Copyright (c) [Year] [name of copyright holder]
|
||||
[Software Name] is licensed under Mulan PSL v2.
|
||||
You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
You may obtain a copy of Mulan PSL v2 at:
|
||||
http://license.coscl.org.cn/MulanPSL2
|
||||
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
See the Mulan PSL v2 for more details.
|
|
@ -1,13 +0,0 @@
|
|||
[
|
||||
{
|
||||
"Name" : "bounds_checking_function",
|
||||
"License" : "Mulan Permissive Software License,Version 2",
|
||||
"License File" : "LICENSE",
|
||||
"Version Number" : "v1.1.10",
|
||||
"Owner" : "jianghan2@huawei.com",
|
||||
"PDM Number" : "05835DMT",
|
||||
"Upstream URL" : "https://gitee.com/openeuler/bounds_checking_function",
|
||||
"Use Application URL" : "http://pdm.huawei.com/Windchill/hwdispatcher/iris/?status=view&pboid=OR:ext.huawei.huaweipbo.HuaweiPBO:70160914898&virtualid=basicinfo&lang=en",
|
||||
"Description" : "following the standard of C11 Annex K (bound-checking interfaces), functions of the common memory/string operation classes, such as memcpy_s, strcpy_s, are selected and implemented."
|
||||
}
|
||||
]
|
|
@ -1,9 +0,0 @@
|
|||
# bounds_checking_function
|
||||
|
||||
#### Description
|
||||
|
||||
- following the standard of C11 Annex K (bound-checking interfaces), functions of the common memory/string operation classes, such as memcpy_s, strcpy_s, are selected and implemented.
|
||||
|
||||
- other standard functions in C11 Annex K will be analyzed in the future and implemented in this organization if necessary.
|
||||
|
||||
- handles the release, update, and maintenance of bounds_checking_function.
|
|
@ -1,6 +0,0 @@
|
|||
# bounds_checking_function
|
||||
|
||||
#### 介绍
|
||||
- 遵循C11 Annex K (Bounds-checking interfaces)的标准,选取并实现了常见的内存/字符串操作类的函数,如memcpy_s、strcpy_s等函数。
|
||||
- 未来将分析C11 Annex K中的其他标准函数,如果有必要,将在该组织中实现。
|
||||
- 处理边界检查函数的版本发布、更新以及维护。
|
|
@ -1,623 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: The user of this secure c library should include this header file in you source code.
|
||||
* This header file declare all supported API prototype of the library,
|
||||
* such as memcpy_s, strcpy_s, wcscpy_s,strcat_s, strncat_s, sprintf_s, scanf_s, and so on.
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#ifndef SECUREC_H_5D13A042_DC3F_4ED9_A8D1_882811274C27
|
||||
#define SECUREC_H_5D13A042_DC3F_4ED9_A8D1_882811274C27
|
||||
|
||||
#include "securectype.h"
|
||||
#ifndef SECUREC_HAVE_STDARG_H
|
||||
#define SECUREC_HAVE_STDARG_H 1
|
||||
#endif
|
||||
|
||||
#if SECUREC_HAVE_STDARG_H
|
||||
#include <stdarg.h>
|
||||
#endif
|
||||
|
||||
#ifndef SECUREC_HAVE_ERRNO_H
|
||||
#define SECUREC_HAVE_ERRNO_H 1
|
||||
#endif
|
||||
|
||||
/* EINVAL ERANGE may defined in errno.h */
|
||||
#if SECUREC_HAVE_ERRNO_H
|
||||
#if SECUREC_IN_KERNEL
|
||||
#include <linux/errno.h>
|
||||
#else
|
||||
#include <errno.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Define error code */
|
||||
#if defined(SECUREC_NEED_ERRNO_TYPE) || !defined(__STDC_WANT_LIB_EXT1__) || \
|
||||
(defined(__STDC_WANT_LIB_EXT1__) && (!__STDC_WANT_LIB_EXT1__))
|
||||
#ifndef SECUREC_DEFINED_ERRNO_TYPE
|
||||
#define SECUREC_DEFINED_ERRNO_TYPE
|
||||
/* Just check whether macrodefinition exists. */
|
||||
#ifndef errno_t
|
||||
typedef int errno_t;
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Success */
|
||||
#ifndef EOK
|
||||
#define EOK 0
|
||||
#endif
|
||||
|
||||
#ifndef EINVAL
|
||||
/* The src buffer is not correct and destination buffer cant not be reset */
|
||||
#define EINVAL 22
|
||||
#endif
|
||||
|
||||
#ifndef EINVAL_AND_RESET
|
||||
/* Once the error is detected, the dest buffer must be reseted! Value is 22 or 128 */
|
||||
#define EINVAL_AND_RESET 150
|
||||
#endif
|
||||
|
||||
#ifndef ERANGE
|
||||
/* The destination buffer is not long enough and destination buffer can not be reset */
|
||||
#define ERANGE 34
|
||||
#endif
|
||||
|
||||
#ifndef ERANGE_AND_RESET
|
||||
/* Once the error is detected, the dest buffer must be reseted! Value is 34 or 128 */
|
||||
#define ERANGE_AND_RESET 162
|
||||
#endif
|
||||
|
||||
#ifndef EOVERLAP_AND_RESET
|
||||
/* Once the buffer overlap is detected, the dest buffer must be reseted! Value is 54 or 128 */
|
||||
#define EOVERLAP_AND_RESET 182
|
||||
#endif
|
||||
|
||||
/* If you need export the function of this library in Win32 dll, use __declspec(dllexport) */
|
||||
#ifndef SECUREC_API
|
||||
#if defined(SECUREC_DLL_EXPORT)
|
||||
#define SECUREC_API __declspec(dllexport)
|
||||
#elif defined(SECUREC_DLL_IMPORT)
|
||||
#define SECUREC_API __declspec(dllimport)
|
||||
#else
|
||||
/*
|
||||
* Standardized function declaration. If a security function is declared in the your code,
|
||||
* it may cause a compilation alarm,Please delete the security function you declared.
|
||||
* Adding extern under windows will cause the system to have inline functions to expand,
|
||||
* so do not add the extern in default
|
||||
*/
|
||||
#if defined(_MSC_VER)
|
||||
#define SECUREC_API
|
||||
#else
|
||||
#define SECUREC_API extern
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#if SECUREC_ENABLE_MEMSET
|
||||
/*
|
||||
* Description: The memset_s function copies the value of c (converted to an unsigned char) into each of
|
||||
* the first count characters of the object pointed to by dest.
|
||||
* Parameter: dest - destination address
|
||||
* Parameter: destMax - The maximum length of destination buffer
|
||||
* Parameter: c - the value to be copied
|
||||
* Parameter: count - copies count bytes of value to dest
|
||||
* Return: EOK if there was no runtime-constraint violation
|
||||
*/
|
||||
SECUREC_API errno_t memset_s(void *dest, size_t destMax, int c, size_t count);
|
||||
#endif
|
||||
|
||||
#ifndef SECUREC_ONLY_DECLARE_MEMSET
|
||||
#define SECUREC_ONLY_DECLARE_MEMSET 0
|
||||
#endif
|
||||
|
||||
#if !SECUREC_ONLY_DECLARE_MEMSET
|
||||
|
||||
#if SECUREC_ENABLE_MEMMOVE
|
||||
/*
|
||||
* Description: The memmove_s function copies n characters from the object pointed to by src
|
||||
* into the object pointed to by dest.
|
||||
* Parameter: dest - destination address
|
||||
* Parameter: destMax - The maximum length of destination buffer
|
||||
* Parameter: src - source address
|
||||
* Parameter: count - copies count bytes from the src
|
||||
* Return: EOK if there was no runtime-constraint violation
|
||||
*/
|
||||
SECUREC_API errno_t memmove_s(void *dest, size_t destMax, const void *src, size_t count);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_MEMCPY
|
||||
/*
|
||||
* Description: The memcpy_s function copies n characters from the object pointed to
|
||||
* by src into the object pointed to by dest.
|
||||
* Parameter: dest - destination address
|
||||
* Parameter: destMax - The maximum length of destination buffer
|
||||
* Parameter: src - source address
|
||||
* Parameter: count - copies count bytes from the src
|
||||
* Return: EOK if there was no runtime-constraint violation
|
||||
*/
|
||||
SECUREC_API errno_t memcpy_s(void *dest, size_t destMax, const void *src, size_t count);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_STRCPY
|
||||
/*
|
||||
* Description: The strcpy_s function copies the string pointed to by strSrc (including
|
||||
* the terminating null character) into the array pointed to by strDest
|
||||
* Parameter: strDest - destination address
|
||||
* Parameter: destMax - The maximum length of destination buffer(including the terminating null character)
|
||||
* Parameter: strSrc - source address
|
||||
* Return: EOK if there was no runtime-constraint violation
|
||||
*/
|
||||
SECUREC_API errno_t strcpy_s(char *strDest, size_t destMax, const char *strSrc);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_STRNCPY
|
||||
/*
|
||||
* Description: The strncpy_s function copies not more than n successive characters (not including
|
||||
* the terminating null character) from the array pointed to by strSrc to the array pointed to by strDest.
|
||||
* Parameter: strDest - destination address
|
||||
* Parameter: destMax - The maximum length of destination buffer(including the terminating null character)
|
||||
* Parameter: strSrc - source address
|
||||
* Parameter: count - copies count characters from the src
|
||||
* Return: EOK if there was no runtime-constraint violation
|
||||
*/
|
||||
SECUREC_API errno_t strncpy_s(char *strDest, size_t destMax, const char *strSrc, size_t count);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_STRCAT
|
||||
/*
|
||||
* Description: The strcat_s function appends a copy of the string pointed to by strSrc (including
|
||||
* the terminating null character) to the end of the string pointed to by strDest.
|
||||
* Parameter: strDest - destination address
|
||||
* Parameter: destMax - The maximum length of destination buffer(including the terminating null wide character)
|
||||
* Parameter: strSrc - source address
|
||||
* Return: EOK if there was no runtime-constraint violation
|
||||
*/
|
||||
SECUREC_API errno_t strcat_s(char *strDest, size_t destMax, const char *strSrc);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_STRNCAT
|
||||
/*
|
||||
* Description: The strncat_s function appends not more than n successive characters (not including
|
||||
* the terminating null character)
|
||||
* from the array pointed to by strSrc to the end of the string pointed to by strDest.
|
||||
* Parameter: strDest - destination address
|
||||
* Parameter: destMax - The maximum length of destination buffer(including the terminating null character)
|
||||
* Parameter: strSrc - source address
|
||||
* Parameter: count - copies count characters from the src
|
||||
* Return: EOK if there was no runtime-constraint violation
|
||||
*/
|
||||
SECUREC_API errno_t strncat_s(char *strDest, size_t destMax, const char *strSrc, size_t count);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_VSPRINTF
|
||||
/*
|
||||
* Description: The vsprintf_s function is equivalent to the vsprintf function except for the parameter destMax
|
||||
* and the explicit runtime-constraints violation
|
||||
* Parameter: strDest - produce output according to a format ,write to the character string strDest.
|
||||
* Parameter: destMax - The maximum length of destination buffer(including the terminating null wide characte)
|
||||
* Parameter: format - fromat string
|
||||
* Parameter: argList - instead of a variable number of arguments
|
||||
* Return: the number of characters printed(not including the terminating null byte '\0'),
|
||||
* If an error occurred Return: -1.
|
||||
*/
|
||||
SECUREC_API int vsprintf_s(char *strDest, size_t destMax, const char *format,
|
||||
va_list argList) SECUREC_ATTRIBUTE(3, 0);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_SPRINTF
|
||||
/*
|
||||
* Description: The sprintf_s function is equivalent to the sprintf function except for the parameter destMax
|
||||
* and the explicit runtime-constraints violation
|
||||
* Parameter: strDest - produce output according to a format ,write to the character string strDest.
|
||||
* Parameter: destMax - The maximum length of destination buffer(including the terminating null byte '\0')
|
||||
* Parameter: format - fromat string
|
||||
* Return: the number of characters printed(not including the terminating null byte '\0'),
|
||||
* If an error occurred Return: -1.
|
||||
*/
|
||||
SECUREC_API int sprintf_s(char *strDest, size_t destMax, const char *format, ...) SECUREC_ATTRIBUTE(3, 4);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_VSNPRINTF
|
||||
/*
|
||||
* Description: The vsnprintf_s function is equivalent to the vsnprintf function except for
|
||||
* the parameter destMax/count and the explicit runtime-constraints violation
|
||||
* Parameter: strDest - produce output according to a format ,write to the character string strDest.
|
||||
* Parameter: destMax - The maximum length of destination buffer(including the terminating null byte '\0')
|
||||
* Parameter: count - do not write more than count bytes to strDest(not including the terminating null byte '\0')
|
||||
* Parameter: format - fromat string
|
||||
* Parameter: argList - instead of a variable number of arguments
|
||||
* Return: the number of characters printed(not including the terminating null byte '\0'),
|
||||
* If an error occurred Return: -1.Pay special attention to returning -1 when truncation occurs
|
||||
*/
|
||||
SECUREC_API int vsnprintf_s(char *strDest, size_t destMax, size_t count, const char *format,
|
||||
va_list argList) SECUREC_ATTRIBUTE(4, 0);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_SNPRINTF
|
||||
/*
|
||||
* Description: The snprintf_s function is equivalent to the snprintf function except for
|
||||
* the parameter destMax/count and the explicit runtime-constraints violation
|
||||
* Parameter: strDest - produce output according to a format ,write to the character string strDest.
|
||||
* Parameter: destMax - The maximum length of destination buffer(including the terminating null byte '\0')
|
||||
* Parameter: count - do not write more than count bytes to strDest(not including the terminating null byte '\0')
|
||||
* Parameter: format - fromat string
|
||||
* Return: the number of characters printed(not including the terminating null byte '\0'),
|
||||
* If an error occurred Return: -1.Pay special attention to returning -1 when truncation occurs
|
||||
*/
|
||||
SECUREC_API int snprintf_s(char *strDest, size_t destMax, size_t count, const char *format,
|
||||
...) SECUREC_ATTRIBUTE(4, 5);
|
||||
#endif
|
||||
|
||||
#if SECUREC_SNPRINTF_TRUNCATED
|
||||
/*
|
||||
* Description: The vsnprintf_truncated_s function is equivalent to the vsnprintf_s function except
|
||||
* no count parameter and return value
|
||||
* Parameter: strDest - produce output according to a format ,write to the character string strDest
|
||||
* Parameter: destMax - The maximum length of destination buffer(including the terminating null byte '\0')
|
||||
* Parameter: format - fromat string
|
||||
* Parameter: argList - instead of a variable number of arguments
|
||||
* Return: the number of characters printed(not including the terminating null byte '\0'),
|
||||
* If an error occurred Return: -1.Pay special attention to returning destMax - 1 when truncation occurs
|
||||
*/
|
||||
SECUREC_API int vsnprintf_truncated_s(char *strDest, size_t destMax, const char *format,
|
||||
va_list argList) SECUREC_ATTRIBUTE(3, 0);
|
||||
|
||||
/*
|
||||
* Description: The snprintf_truncated_s function is equivalent to the snprintf_2 function except
|
||||
* no count parameter and return value
|
||||
* Parameter: strDest - produce output according to a format ,write to the character string strDest.
|
||||
* Parameter: destMax - The maximum length of destination buffer(including the terminating null byte '\0')
|
||||
* Parameter: format - fromat string
|
||||
* Return: the number of characters printed(not including the terminating null byte '\0'),
|
||||
* If an error occurred Return: -1.Pay special attention to returning destMax - 1 when truncation occurs
|
||||
*/
|
||||
SECUREC_API int snprintf_truncated_s(char *strDest, size_t destMax,
|
||||
const char *format, ...) SECUREC_ATTRIBUTE(3, 4);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_SCANF
|
||||
/*
|
||||
* Description: The scanf_s function is equivalent to fscanf_s with the argument stdin
|
||||
* interposed before the arguments to scanf_s
|
||||
* Parameter: format - fromat string
|
||||
* Return: the number of input items assigned, If an error occurred Return: -1.
|
||||
*/
|
||||
SECUREC_API int scanf_s(const char *format, ...);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_VSCANF
|
||||
/*
|
||||
* Description: The vscanf_s function is equivalent to scanf_s, with the variable argument list replaced by argList
|
||||
* Parameter: format - fromat string
|
||||
* Parameter: argList - instead of a variable number of arguments
|
||||
* Return: the number of input items assigned, If an error occurred Return: -1.
|
||||
*/
|
||||
SECUREC_API int vscanf_s(const char *format, va_list argList);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_SSCANF
|
||||
/*
|
||||
* Description: The sscanf_s function is equivalent to fscanf_s, except that input is obtained from a
|
||||
* string (specified by the argument buffer) rather than from a stream
|
||||
* Parameter: buffer - read character from buffer
|
||||
* Parameter: format - fromat string
|
||||
* Return: the number of input items assigned, If an error occurred Return: -1.
|
||||
*/
|
||||
SECUREC_API int sscanf_s(const char *buffer, const char *format, ...);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_VSSCANF
|
||||
/*
|
||||
* Description: The vsscanf_s function is equivalent to sscanf_s, with the variable argument list
|
||||
* replaced by argList
|
||||
* Parameter: buffer - read character from buffer
|
||||
* Parameter: format - fromat string
|
||||
* Parameter: argList - instead of a variable number of arguments
|
||||
* Return: the number of input items assigned, If an error occurred Return: -1.
|
||||
*/
|
||||
SECUREC_API int vsscanf_s(const char *buffer, const char *format, va_list argList);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_FSCANF
|
||||
/*
|
||||
* Description: The fscanf_s function is equivalent to fscanf except that the c, s, and [ conversion specifiers
|
||||
* apply to a pair of arguments (unless assignment suppression is indicated by a*)
|
||||
* Parameter: stream - stdio file stream
|
||||
* Parameter: format - fromat string
|
||||
* Return: the number of input items assigned, If an error occurred Return: -1.
|
||||
*/
|
||||
SECUREC_API int fscanf_s(FILE *stream, const char *format, ...);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_VFSCANF
|
||||
/*
|
||||
* Description: The vfscanf_s function is equivalent to fscanf_s, with the variable argument list
|
||||
* replaced by argList
|
||||
* Parameter: stream - stdio file stream
|
||||
* Parameter: format - fromat string
|
||||
* Parameter: argList - instead of a variable number of arguments
|
||||
* Return: the number of input items assigned, If an error occurred Return: -1.
|
||||
*/
|
||||
SECUREC_API int vfscanf_s(FILE *stream, const char *format, va_list argList);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_STRTOK
|
||||
/*
|
||||
* Description: The strtok_s function parses a string into a sequence of strToken,
|
||||
* replace all characters in strToken string that match to strDelimit set with 0.
|
||||
* On the first call to strtok_s the string to be parsed should be specified in strToken.
|
||||
* In each subsequent call that should parse the same string, strToken should be NULL
|
||||
* Parameter: strToken - the string to be delimited
|
||||
* Parameter: strDelimit - specifies a set of characters that delimit the tokens in the parsed string
|
||||
* Parameter: context - is a pointer to a char * variable that is used internally by strtok_s function
|
||||
* Return: On the first call returns the address of the first non \0 character, otherwise NULL is returned.
|
||||
* In subsequent calls, the strtoken is set to NULL, and the context set is the same as the previous call,
|
||||
* return NULL if the *context string length is equal 0, otherwise return *context.
|
||||
*/
|
||||
SECUREC_API char *strtok_s(char *strToken, const char *strDelimit, char **context);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_GETS && !SECUREC_IN_KERNEL
|
||||
/*
|
||||
* Description: The gets_s function reads at most one less than the number of characters specified
|
||||
* by destMax from the stream pointed to by stdin, into the array pointed to by buffer
|
||||
* Parameter: buffer - destination address
|
||||
* Parameter: destMax - The maximum length of destination buffer(including the terminating null character)
|
||||
* Return: buffer if there was no runtime-constraint violation,If an error occurred Return: NULL.
|
||||
*/
|
||||
SECUREC_API char *gets_s(char *buffer, size_t destMax);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_WCHAR_FUNC
|
||||
#if SECUREC_ENABLE_MEMCPY
|
||||
/*
|
||||
* Description: The wmemcpy_s function copies n successive wide characters from the object pointed to
|
||||
* by src into the object pointed to by dest.
|
||||
* Parameter: dest - destination address
|
||||
* Parameter: destMax - The maximum length of destination buffer
|
||||
* Parameter: src - source address
|
||||
* Parameter: count - copies count wide characters from the src
|
||||
* Return: EOK if there was no runtime-constraint violation
|
||||
*/
|
||||
SECUREC_API errno_t wmemcpy_s(wchar_t *dest, size_t destMax, const wchar_t *src, size_t count);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_MEMMOVE
|
||||
/*
|
||||
* Description: The wmemmove_s function copies n successive wide characters from the object
|
||||
* pointed to by src into the object pointed to by dest.
|
||||
* Parameter: dest - destination address
|
||||
* Parameter: destMax - The maximum length of destination buffer
|
||||
* Parameter: src - source address
|
||||
* Parameter: count - copies count wide characters from the src
|
||||
* Return: EOK if there was no runtime-constraint violation
|
||||
*/
|
||||
SECUREC_API errno_t wmemmove_s(wchar_t *dest, size_t destMax, const wchar_t *src, size_t count);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_STRCPY
|
||||
/*
|
||||
* Description: The wcscpy_s function copies the wide string pointed to by strSrc (including theterminating
|
||||
* null wide character) into the array pointed to by strDest
|
||||
* Parameter: strDest - destination address
|
||||
* Parameter: destMax - The maximum length of destination buffer
|
||||
* Parameter: strSrc - source address
|
||||
* Return: EOK if there was no runtime-constraint violation
|
||||
*/
|
||||
SECUREC_API errno_t wcscpy_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_STRNCPY
|
||||
/*
|
||||
* Description: The wcsncpy_s function copies not more than n successive wide characters (not including the
|
||||
* terminating null wide character) from the array pointed to by strSrc to the array pointed to by strDest
|
||||
* Parameter: strDest - destination address
|
||||
* Parameter: destMax - The maximum length of destination buffer(including the terminating wide character)
|
||||
* Parameter: strSrc - source address
|
||||
* Parameter: count - copies count wide characters from the src
|
||||
* Return: EOK if there was no runtime-constraint violation
|
||||
*/
|
||||
SECUREC_API errno_t wcsncpy_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_STRCAT
|
||||
/*
|
||||
* Description: The wcscat_s function appends a copy of the wide string pointed to by strSrc (including the
|
||||
* terminating null wide character) to the end of the wide string pointed to by strDest
|
||||
* Parameter: strDest - destination address
|
||||
* Parameter: destMax - The maximum length of destination buffer(including the terminating wide character)
|
||||
* Parameter: strSrc - source address
|
||||
* Return: EOK if there was no runtime-constraint violation
|
||||
*/
|
||||
SECUREC_API errno_t wcscat_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_STRNCAT
|
||||
/*
|
||||
* Description: The wcsncat_s function appends not more than n successive wide characters (not including the
|
||||
* terminating null wide character) from the array pointed to by strSrc to the end of the wide string pointed to
|
||||
* by strDest.
|
||||
* Parameter: strDest - destination address
|
||||
* Parameter: destMax - The maximum length of destination buffer(including the terminating wide character)
|
||||
* Parameter: strSrc - source address
|
||||
* Parameter: count - copies count wide characters from the src
|
||||
* Return: EOK if there was no runtime-constraint violation
|
||||
*/
|
||||
SECUREC_API errno_t wcsncat_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_STRTOK
|
||||
/*
|
||||
* Description: The wcstok_s function is the wide-character equivalent of the strtok_s function
|
||||
* Parameter: strToken - the string to be delimited
|
||||
* Parameter: strDelimit - specifies a set of characters that delimit the tokens in the parsed string
|
||||
* Parameter: context - is a pointer to a char * variable that is used internally by strtok_s function
|
||||
* Return: a pointer to the first character of a token, or a null pointer if there is no token
|
||||
* or there is a runtime-constraint violation.
|
||||
*/
|
||||
SECUREC_API wchar_t *wcstok_s(wchar_t *strToken, const wchar_t *strDelimit, wchar_t **context);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_VSPRINTF
|
||||
/*
|
||||
* Description: The vswprintf_s function is the wide-character equivalent of the vsprintf_s function
|
||||
* Parameter: strDest - produce output according to a format ,write to the character string strDest
|
||||
* Parameter: destMax - The maximum length of destination buffer(including the terminating null )
|
||||
* Parameter: format - fromat string
|
||||
* Parameter: argList - instead of a variable number of arguments
|
||||
* Return: the number of characters printed(not including the terminating null wide characte),
|
||||
* If an error occurred Return: -1.
|
||||
*/
|
||||
SECUREC_API int vswprintf_s(wchar_t *strDest, size_t destMax, const wchar_t *format, va_list argList);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_SPRINTF
|
||||
|
||||
/*
|
||||
* Description: The swprintf_s function is the wide-character equivalent of the sprintf_s function
|
||||
* Parameter: strDest - produce output according to a format ,write to the character string strDest
|
||||
* Parameter: destMax - The maximum length of destination buffer(including the terminating null )
|
||||
* Parameter: format - fromat string
|
||||
* Return: the number of characters printed(not including the terminating null wide characte),
|
||||
* If an error occurred Return: -1.
|
||||
*/
|
||||
SECUREC_API int swprintf_s(wchar_t *strDest, size_t destMax, const wchar_t *format, ...);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_FSCANF
|
||||
/*
|
||||
* Description: The fwscanf_s function is the wide-character equivalent of the fscanf_s function
|
||||
* Parameter: stream - stdio file stream
|
||||
* Parameter: format - fromat string
|
||||
* Return: the number of input items assigned, If an error occurred Return: -1.
|
||||
*/
|
||||
SECUREC_API int fwscanf_s(FILE *stream, const wchar_t *format, ...);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_VFSCANF
|
||||
/*
|
||||
* Description: The vfwscanf_s function is the wide-character equivalent of the vfscanf_s function
|
||||
* Parameter: stream - stdio file stream
|
||||
* Parameter: format - fromat string
|
||||
* Parameter: argList - instead of a variable number of arguments
|
||||
* Return: the number of input items assigned, If an error occurred Return: -1.
|
||||
*/
|
||||
SECUREC_API int vfwscanf_s(FILE *stream, const wchar_t *format, va_list argList);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_SCANF
|
||||
/*
|
||||
* Description: The wscanf_s function is the wide-character equivalent of the scanf_s function
|
||||
* Parameter: format - fromat string
|
||||
* Return: the number of input items assigned, If an error occurred Return: -1.
|
||||
*/
|
||||
SECUREC_API int wscanf_s(const wchar_t *format, ...);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_VSCANF
|
||||
/*
|
||||
* Description: The vwscanf_s function is the wide-character equivalent of the vscanf_s function
|
||||
* Parameter: format - fromat string
|
||||
* Parameter: argList - instead of a variable number of arguments
|
||||
* Return: the number of input items assigned, If an error occurred Return: -1.
|
||||
*/
|
||||
SECUREC_API int vwscanf_s(const wchar_t *format, va_list argList);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_SSCANF
|
||||
/*
|
||||
* Description: The swscanf_s function is the wide-character equivalent of the sscanf_s function
|
||||
* Parameter: buffer - read character from buffer
|
||||
* Parameter: format - fromat string
|
||||
* Return: the number of input items assigned, If an error occurred Return: -1.
|
||||
*/
|
||||
SECUREC_API int swscanf_s(const wchar_t *buffer, const wchar_t *format, ...);
|
||||
#endif
|
||||
|
||||
#if SECUREC_ENABLE_VSSCANF
|
||||
/*
|
||||
* Description: The vswscanf_s function is the wide-character equivalent of the vsscanf_s function
|
||||
* Parameter: buffer - read character from buffer
|
||||
* Parameter: format - fromat string
|
||||
* Parameter: argList - instead of a variable number of arguments
|
||||
* Return: the number of input items assigned, If an error occurred Return: -1.
|
||||
*/
|
||||
SECUREC_API int vswscanf_s(const wchar_t *buffer, const wchar_t *format, va_list argList);
|
||||
#endif
|
||||
#endif /* SECUREC_ENABLE_WCHAR_FUNC */
|
||||
#endif
|
||||
|
||||
/* Those functions are used by macro ,must declare hare , also for without function declaration warning */
|
||||
extern errno_t strncpy_error(char *strDest, size_t destMax, const char *strSrc, size_t count);
|
||||
extern errno_t strcpy_error(char *strDest, size_t destMax, const char *strSrc);
|
||||
|
||||
#if SECUREC_WITH_PERFORMANCE_ADDONS
|
||||
/* Those functions are used by macro */
|
||||
extern errno_t memset_sOptAsm(void *dest, size_t destMax, int c, size_t count);
|
||||
extern errno_t memset_sOptTc(void *dest, size_t destMax, int c, size_t count);
|
||||
extern errno_t memcpy_sOptAsm(void *dest, size_t destMax, const void *src, size_t count);
|
||||
extern errno_t memcpy_sOptTc(void *dest, size_t destMax, const void *src, size_t count);
|
||||
|
||||
/* The strcpy_sp is a macro, not a function in performance optimization mode. */
|
||||
#define strcpy_sp(dest, destMax, src) ((__builtin_constant_p((destMax)) && \
|
||||
__builtin_constant_p((src))) ? \
|
||||
SECUREC_STRCPY_SM((dest), (destMax), (src)) : \
|
||||
strcpy_s((dest), (destMax), (src)))
|
||||
|
||||
/* The strncpy_sp is a macro, not a function in performance optimization mode. */
|
||||
#define strncpy_sp(dest, destMax, src, count) ((__builtin_constant_p((count)) && \
|
||||
__builtin_constant_p((destMax)) && \
|
||||
__builtin_constant_p((src))) ? \
|
||||
SECUREC_STRNCPY_SM((dest), (destMax), (src), (count)) : \
|
||||
strncpy_s((dest), (destMax), (src), (count)))
|
||||
|
||||
/* The strcat_sp is a macro, not a function in performance optimization mode. */
|
||||
#define strcat_sp(dest, destMax, src) ((__builtin_constant_p((destMax)) && \
|
||||
__builtin_constant_p((src))) ? \
|
||||
SECUREC_STRCAT_SM((dest), (destMax), (src)) : \
|
||||
strcat_s((dest), (destMax), (src)))
|
||||
|
||||
/* The strncat_sp is a macro, not a function in performance optimization mode. */
|
||||
#define strncat_sp(dest, destMax, src, count) ((__builtin_constant_p((count)) && \
|
||||
__builtin_constant_p((destMax)) && \
|
||||
__builtin_constant_p((src))) ? \
|
||||
SECUREC_STRNCAT_SM((dest), (destMax), (src), (count)) : \
|
||||
strncat_s((dest), (destMax), (src), (count)))
|
||||
|
||||
/* The memcpy_sp is a macro, not a function in performance optimization mode. */
|
||||
#define memcpy_sp(dest, destMax, src, count) (__builtin_constant_p((count)) ? \
|
||||
(SECUREC_MEMCPY_SM((dest), (destMax), (src), (count))) : \
|
||||
(__builtin_constant_p((destMax)) ? \
|
||||
(((size_t)(destMax) > 0 && \
|
||||
(((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_MEM_MAX_LEN)) ? \
|
||||
memcpy_sOptTc((dest), (destMax), (src), (count)) : ERANGE) : \
|
||||
memcpy_sOptAsm((dest), (destMax), (src), (count))))
|
||||
|
||||
/* The memset_sp is a macro, not a function in performance optimization mode. */
|
||||
#define memset_sp(dest, destMax, c, count) (__builtin_constant_p((count)) ? \
|
||||
(SECUREC_MEMSET_SM((dest), (destMax), (c), (count))) : \
|
||||
(__builtin_constant_p((destMax)) ? \
|
||||
(((((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_MEM_MAX_LEN)) ? \
|
||||
memset_sOptTc((dest), (destMax), (c), (count)) : ERANGE) : \
|
||||
memset_sOptAsm((dest), (destMax), (c), (count))))
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
|
@ -1,570 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: Define internal used macro and data type. The marco of SECUREC_ON_64BITS
|
||||
* will be determined in this header file, which is a switch for part
|
||||
* of code. Some macro are used to supress warning by MS compiler.
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#ifndef SECURECTYPE_H_A7BBB686_AADA_451B_B9F9_44DACDAE18A7
|
||||
#define SECURECTYPE_H_A7BBB686_AADA_451B_B9F9_44DACDAE18A7
|
||||
|
||||
#ifndef SECUREC_USING_STD_SECURE_LIB
|
||||
#if defined(_MSC_VER) && _MSC_VER >= 1400
|
||||
#if defined(__STDC_WANT_SECURE_LIB__) && (!__STDC_WANT_SECURE_LIB__)
|
||||
/* Security functions have been provided since vs2005, default use of system library functions */
|
||||
#define SECUREC_USING_STD_SECURE_LIB 0
|
||||
#else
|
||||
#define SECUREC_USING_STD_SECURE_LIB 1
|
||||
#endif
|
||||
#else
|
||||
#define SECUREC_USING_STD_SECURE_LIB 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Compatibility with older Secure C versions, shielding VC symbol redefinition warning */
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1400) && (!SECUREC_USING_STD_SECURE_LIB)
|
||||
#ifndef SECUREC_DISABLE_CRT_FUNC
|
||||
#define SECUREC_DISABLE_CRT_FUNC 1
|
||||
#endif
|
||||
#ifndef SECUREC_DISABLE_CRT_IMP
|
||||
#define SECUREC_DISABLE_CRT_IMP 1
|
||||
#endif
|
||||
#else /* MSC VER */
|
||||
#ifndef SECUREC_DISABLE_CRT_FUNC
|
||||
#define SECUREC_DISABLE_CRT_FUNC 0
|
||||
#endif
|
||||
#ifndef SECUREC_DISABLE_CRT_IMP
|
||||
#define SECUREC_DISABLE_CRT_IMP 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if SECUREC_DISABLE_CRT_FUNC
|
||||
#ifdef __STDC_WANT_SECURE_LIB__
|
||||
#undef __STDC_WANT_SECURE_LIB__
|
||||
#endif
|
||||
#define __STDC_WANT_SECURE_LIB__ 0
|
||||
#endif
|
||||
|
||||
#if SECUREC_DISABLE_CRT_IMP
|
||||
#ifdef _CRTIMP_ALTERNATIVE
|
||||
#undef _CRTIMP_ALTERNATIVE
|
||||
#endif
|
||||
#define _CRTIMP_ALTERNATIVE /* Comment microsoft *_s function */
|
||||
#endif
|
||||
|
||||
/* Compile in kernel under macro control */
|
||||
#ifndef SECUREC_IN_KERNEL
|
||||
#ifdef __KERNEL__
|
||||
#define SECUREC_IN_KERNEL 1
|
||||
#else
|
||||
#define SECUREC_IN_KERNEL 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if SECUREC_IN_KERNEL
|
||||
#ifndef SECUREC_ENABLE_SCANF_FILE
|
||||
#define SECUREC_ENABLE_SCANF_FILE 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_WCHAR_FUNC
|
||||
#define SECUREC_ENABLE_WCHAR_FUNC 0
|
||||
#endif
|
||||
#else /* SECUREC_IN_KERNEL */
|
||||
#ifndef SECUREC_ENABLE_SCANF_FILE
|
||||
#define SECUREC_ENABLE_SCANF_FILE 1
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_WCHAR_FUNC
|
||||
#define SECUREC_ENABLE_WCHAR_FUNC 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Default secure function declaration, default declarations for non-standard functions */
|
||||
#ifndef SECUREC_SNPRINTF_TRUNCATED
|
||||
#define SECUREC_SNPRINTF_TRUNCATED 1
|
||||
#endif
|
||||
|
||||
#if SECUREC_USING_STD_SECURE_LIB
|
||||
#if defined(_MSC_VER) && _MSC_VER >= 1400
|
||||
/* Declare secure functions that are not available in the VS compiler */
|
||||
#ifndef SECUREC_ENABLE_MEMSET
|
||||
#define SECUREC_ENABLE_MEMSET 1
|
||||
#endif
|
||||
/* VS 2005 have vsnprintf_s function */
|
||||
#ifndef SECUREC_ENABLE_VSNPRINTF
|
||||
#define SECUREC_ENABLE_VSNPRINTF 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_SNPRINTF
|
||||
/* VS 2005 have vsnprintf_s function Adapt the snprintf_s of the security function */
|
||||
#define snprintf_s _snprintf_s
|
||||
#define SECUREC_ENABLE_SNPRINTF 0
|
||||
#endif
|
||||
/* Before VS 2010 do not have v functions */
|
||||
#if _MSC_VER <= 1600 || defined(SECUREC_FOR_V_SCANFS)
|
||||
#ifndef SECUREC_ENABLE_VFSCANF
|
||||
#define SECUREC_ENABLE_VFSCANF 1
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_VSCANF
|
||||
#define SECUREC_ENABLE_VSCANF 1
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_VSSCANF
|
||||
#define SECUREC_ENABLE_VSSCANF 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#else /* MSC VER */
|
||||
#ifndef SECUREC_ENABLE_MEMSET
|
||||
#define SECUREC_ENABLE_MEMSET 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_SNPRINTF
|
||||
#define SECUREC_ENABLE_SNPRINTF 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_VSNPRINTF
|
||||
#define SECUREC_ENABLE_VSNPRINTF 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef SECUREC_ENABLE_MEMMOVE
|
||||
#define SECUREC_ENABLE_MEMMOVE 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_MEMCPY
|
||||
#define SECUREC_ENABLE_MEMCPY 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_STRCPY
|
||||
#define SECUREC_ENABLE_STRCPY 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_STRNCPY
|
||||
#define SECUREC_ENABLE_STRNCPY 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_STRCAT
|
||||
#define SECUREC_ENABLE_STRCAT 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_STRNCAT
|
||||
#define SECUREC_ENABLE_STRNCAT 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_SPRINTF
|
||||
#define SECUREC_ENABLE_SPRINTF 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_VSPRINTF
|
||||
#define SECUREC_ENABLE_VSPRINTF 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_SSCANF
|
||||
#define SECUREC_ENABLE_SSCANF 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_VSSCANF
|
||||
#define SECUREC_ENABLE_VSSCANF 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_SCANF
|
||||
#define SECUREC_ENABLE_SCANF 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_VSCANF
|
||||
#define SECUREC_ENABLE_VSCANF 0
|
||||
#endif
|
||||
|
||||
#ifndef SECUREC_ENABLE_FSCANF
|
||||
#define SECUREC_ENABLE_FSCANF 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_VFSCANF
|
||||
#define SECUREC_ENABLE_VFSCANF 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_STRTOK
|
||||
#define SECUREC_ENABLE_STRTOK 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_GETS
|
||||
#define SECUREC_ENABLE_GETS 0
|
||||
#endif
|
||||
|
||||
#else /* SECUREC USE STD SECURE LIB */
|
||||
|
||||
#ifndef SECUREC_ENABLE_MEMSET
|
||||
#define SECUREC_ENABLE_MEMSET 1
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_MEMMOVE
|
||||
#define SECUREC_ENABLE_MEMMOVE 1
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_MEMCPY
|
||||
#define SECUREC_ENABLE_MEMCPY 1
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_STRCPY
|
||||
#define SECUREC_ENABLE_STRCPY 1
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_STRNCPY
|
||||
#define SECUREC_ENABLE_STRNCPY 1
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_STRCAT
|
||||
#define SECUREC_ENABLE_STRCAT 1
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_STRNCAT
|
||||
#define SECUREC_ENABLE_STRNCAT 1
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_SPRINTF
|
||||
#define SECUREC_ENABLE_SPRINTF 1
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_VSPRINTF
|
||||
#define SECUREC_ENABLE_VSPRINTF 1
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_SNPRINTF
|
||||
#define SECUREC_ENABLE_SNPRINTF 1
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_VSNPRINTF
|
||||
#define SECUREC_ENABLE_VSNPRINTF 1
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_SSCANF
|
||||
#define SECUREC_ENABLE_SSCANF 1
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_VSSCANF
|
||||
#define SECUREC_ENABLE_VSSCANF 1
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_SCANF
|
||||
#if SECUREC_ENABLE_SCANF_FILE
|
||||
#define SECUREC_ENABLE_SCANF 1
|
||||
#else
|
||||
#define SECUREC_ENABLE_SCANF 0
|
||||
#endif
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_VSCANF
|
||||
#if SECUREC_ENABLE_SCANF_FILE
|
||||
#define SECUREC_ENABLE_VSCANF 1
|
||||
#else
|
||||
#define SECUREC_ENABLE_VSCANF 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef SECUREC_ENABLE_FSCANF
|
||||
#if SECUREC_ENABLE_SCANF_FILE
|
||||
#define SECUREC_ENABLE_FSCANF 1
|
||||
#else
|
||||
#define SECUREC_ENABLE_FSCANF 0
|
||||
#endif
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_VFSCANF
|
||||
#if SECUREC_ENABLE_SCANF_FILE
|
||||
#define SECUREC_ENABLE_VFSCANF 1
|
||||
#else
|
||||
#define SECUREC_ENABLE_VFSCANF 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef SECUREC_ENABLE_STRTOK
|
||||
#define SECUREC_ENABLE_STRTOK 1
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_GETS
|
||||
#define SECUREC_ENABLE_GETS 1
|
||||
#endif
|
||||
#endif /* SECUREC_USE_STD_SECURE_LIB */
|
||||
|
||||
#if !SECUREC_ENABLE_SCANF_FILE
|
||||
#if SECUREC_ENABLE_FSCANF
|
||||
#undef SECUREC_ENABLE_FSCANF
|
||||
#define SECUREC_ENABLE_FSCANF 0
|
||||
#endif
|
||||
#if SECUREC_ENABLE_VFSCANF
|
||||
#undef SECUREC_ENABLE_VFSCANF
|
||||
#define SECUREC_ENABLE_VFSCANF 0
|
||||
#endif
|
||||
#if SECUREC_ENABLE_SCANF
|
||||
#undef SECUREC_ENABLE_SCANF
|
||||
#define SECUREC_ENABLE_SCANF 0
|
||||
#endif
|
||||
#if SECUREC_ENABLE_FSCANF
|
||||
#undef SECUREC_ENABLE_FSCANF
|
||||
#define SECUREC_ENABLE_FSCANF 0
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#if SECUREC_IN_KERNEL
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#else
|
||||
#ifndef SECUREC_HAVE_STDIO_H
|
||||
#define SECUREC_HAVE_STDIO_H 1
|
||||
#endif
|
||||
#ifndef SECUREC_HAVE_STRING_H
|
||||
#define SECUREC_HAVE_STRING_H 1
|
||||
#endif
|
||||
#ifndef SECUREC_HAVE_STDLIB_H
|
||||
#define SECUREC_HAVE_STDLIB_H 1
|
||||
#endif
|
||||
#if SECUREC_HAVE_STDIO_H
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
#if SECUREC_HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#endif
|
||||
#if SECUREC_HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If you need high performance, enable the SECUREC_WITH_PERFORMANCE_ADDONS macro, default is enable.
|
||||
* The macro is automatically closed on the windows platform and linux kernel
|
||||
*/
|
||||
#ifndef SECUREC_WITH_PERFORMANCE_ADDONS
|
||||
#if SECUREC_IN_KERNEL
|
||||
#define SECUREC_WITH_PERFORMANCE_ADDONS 0
|
||||
#else
|
||||
#define SECUREC_WITH_PERFORMANCE_ADDONS 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* If enable SECUREC_COMPATIBLE_WIN_FORMAT, the output format will be compatible to Windows. */
|
||||
#if (defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER)) && !defined(SECUREC_COMPATIBLE_LINUX_FORMAT)
|
||||
#ifndef SECUREC_COMPATIBLE_WIN_FORMAT
|
||||
#define SECUREC_COMPATIBLE_WIN_FORMAT
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(SECUREC_COMPATIBLE_WIN_FORMAT)
|
||||
/* On windows platform, can't use optimized function for there is no __builtin_constant_p like function */
|
||||
/* If need optimized macro, can define this: define __builtin_constant_p(x) 0 */
|
||||
#ifdef SECUREC_WITH_PERFORMANCE_ADDONS
|
||||
#undef SECUREC_WITH_PERFORMANCE_ADDONS
|
||||
#define SECUREC_WITH_PERFORMANCE_ADDONS 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__VXWORKS__) || defined(__vxworks) || defined(__VXWORKS) || defined(_VXWORKS_PLATFORM_) || \
|
||||
defined(SECUREC_VXWORKS_VERSION_5_4)
|
||||
#ifndef SECUREC_VXWORKS_PLATFORM
|
||||
#define SECUREC_VXWORKS_PLATFORM
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* If enable SECUREC_COMPATIBLE_LINUX_FORMAT, the output format will be compatible to Linux. */
|
||||
#if !defined(SECUREC_COMPATIBLE_WIN_FORMAT) && !defined(SECUREC_VXWORKS_PLATFORM)
|
||||
#ifndef SECUREC_COMPATIBLE_LINUX_FORMAT
|
||||
#define SECUREC_COMPATIBLE_LINUX_FORMAT
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef SECUREC_COMPATIBLE_LINUX_FORMAT
|
||||
#ifndef SECUREC_HAVE_STDDEF_H
|
||||
#define SECUREC_HAVE_STDDEF_H 1
|
||||
#endif
|
||||
/* Some system may no stddef.h */
|
||||
#if SECUREC_HAVE_STDDEF_H
|
||||
#if !SECUREC_IN_KERNEL
|
||||
#include <stddef.h>
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Add the -DSECUREC_SUPPORT_FORMAT_WARNING=1 compiler option to supoort -Wformat=2.
|
||||
* Default does not check the format is that the same data type in the actual code.
|
||||
* In the product is different in the original data type definition of VxWorks and Linux.
|
||||
*/
|
||||
#ifndef SECUREC_SUPPORT_FORMAT_WARNING
|
||||
#define SECUREC_SUPPORT_FORMAT_WARNING 0
|
||||
#endif
|
||||
|
||||
#if SECUREC_SUPPORT_FORMAT_WARNING
|
||||
#define SECUREC_ATTRIBUTE(x, y) __attribute__((format(printf, (x), (y))))
|
||||
#else
|
||||
#define SECUREC_ATTRIBUTE(x, y)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Add the -DSECUREC_SUPPORT_BUILTIN_EXPECT=0 compiler option, if complier can not support __builtin_expect.
|
||||
*/
|
||||
#ifndef SECUREC_SUPPORT_BUILTIN_EXPECT
|
||||
#define SECUREC_SUPPORT_BUILTIN_EXPECT 1
|
||||
#endif
|
||||
|
||||
#if SECUREC_SUPPORT_BUILTIN_EXPECT && defined(__GNUC__) && ((__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3)))
|
||||
/*
|
||||
* This is a built-in function that can be used without a declaration, if warning for declaration not found occurred,
|
||||
* you can add -DSECUREC_NEED_BUILTIN_EXPECT_DECLARE to complier options
|
||||
*/
|
||||
#ifdef SECUREC_NEED_BUILTIN_EXPECT_DECLARE
|
||||
long __builtin_expect(long exp, long c);
|
||||
#endif
|
||||
|
||||
#define SECUREC_LIKELY(x) __builtin_expect(!!(x), 1)
|
||||
#define SECUREC_UNLIKELY(x) __builtin_expect(!!(x), 0)
|
||||
#else
|
||||
#define SECUREC_LIKELY(x) (x)
|
||||
#define SECUREC_UNLIKELY(x) (x)
|
||||
#endif
|
||||
|
||||
/* Define the max length of the string */
|
||||
#ifndef SECUREC_STRING_MAX_LEN
|
||||
#define SECUREC_STRING_MAX_LEN 0x7fffffffUL
|
||||
#endif
|
||||
#define SECUREC_WCHAR_STRING_MAX_LEN (SECUREC_STRING_MAX_LEN / sizeof(wchar_t))
|
||||
|
||||
/* Add SECUREC_MEM_MAX_LEN for memcpy and memmove */
|
||||
#ifndef SECUREC_MEM_MAX_LEN
|
||||
#define SECUREC_MEM_MAX_LEN 0x7fffffffUL
|
||||
#endif
|
||||
#define SECUREC_WCHAR_MEM_MAX_LEN (SECUREC_MEM_MAX_LEN / sizeof(wchar_t))
|
||||
|
||||
#if SECUREC_STRING_MAX_LEN > 0x7fffffffUL
|
||||
#error "max string is 2G"
|
||||
#endif
|
||||
|
||||
#if (defined(__GNUC__) && defined(__SIZEOF_POINTER__))
|
||||
#if (__SIZEOF_POINTER__ != 4) && (__SIZEOF_POINTER__ != 8)
|
||||
#error "unsupported system"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(_WIN64) || defined(WIN64) || defined(__LP64__) || defined(_LP64)
|
||||
#define SECUREC_ON_64BITS
|
||||
#endif
|
||||
|
||||
#if (!defined(SECUREC_ON_64BITS) && defined(__GNUC__) && defined(__SIZEOF_POINTER__))
|
||||
#if __SIZEOF_POINTER__ == 8
|
||||
#define SECUREC_ON_64BITS
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__SVR4) || defined(__svr4__)
|
||||
#define SECUREC_ON_SOLARIS
|
||||
#endif
|
||||
|
||||
#if (defined(__hpux) || defined(_AIX) || defined(SECUREC_ON_SOLARIS))
|
||||
#define SECUREC_ON_UNIX
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Codes should run under the macro SECUREC_COMPATIBLE_LINUX_FORMAT in unknow system on default,
|
||||
* and strtold.
|
||||
* The function strtold is referenced first at ISO9899:1999(C99), and some old compilers can
|
||||
* not support these functions. Here provides a macro to open these functions:
|
||||
* SECUREC_SUPPORT_STRTOLD -- If defined, strtold will be used
|
||||
*/
|
||||
#ifndef SECUREC_SUPPORT_STRTOLD
|
||||
#define SECUREC_SUPPORT_STRTOLD 0
|
||||
#if (defined(SECUREC_COMPATIBLE_LINUX_FORMAT))
|
||||
#if defined(__USE_ISOC99) || \
|
||||
(defined(_AIX) && defined(_ISOC99_SOURCE)) || \
|
||||
(defined(__hpux) && defined(__ia64)) || \
|
||||
(defined(SECUREC_ON_SOLARIS) && (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
|
||||
defined(_STDC_C99) || defined(__EXTENSIONS__))
|
||||
#undef SECUREC_SUPPORT_STRTOLD
|
||||
#define SECUREC_SUPPORT_STRTOLD 1
|
||||
#endif
|
||||
#endif
|
||||
#if ((defined(SECUREC_WRLINUX_BELOW4) || defined(_WRLINUX_BELOW4_)))
|
||||
#undef SECUREC_SUPPORT_STRTOLD
|
||||
#define SECUREC_SUPPORT_STRTOLD 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if SECUREC_WITH_PERFORMANCE_ADDONS
|
||||
|
||||
#ifndef SECUREC_TWO_MIN
|
||||
#define SECUREC_TWO_MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
/* For strncpy_s performance optimization */
|
||||
#define SECUREC_STRNCPY_SM(dest, destMax, src, count) \
|
||||
(((void *)(dest) != NULL && (void *)(src) != NULL && (size_t)(destMax) > 0 && \
|
||||
(((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN) && \
|
||||
(SECUREC_TWO_MIN((size_t)(count), strlen(src)) + 1) <= (size_t)(destMax)) ? \
|
||||
(((size_t)(count) < strlen(src)) ? (memcpy((dest), (src), (count)), *((char *)(dest) + (count)) = '\0', EOK) : \
|
||||
(memcpy((dest), (src), strlen(src) + 1), EOK)) : (strncpy_error((dest), (destMax), (src), (count))))
|
||||
|
||||
#define SECUREC_STRCPY_SM(dest, destMax, src) \
|
||||
(((void *)(dest) != NULL && (void *)(src) != NULL && (size_t)(destMax) > 0 && \
|
||||
(((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN) && \
|
||||
(strlen(src) + 1) <= (size_t)(destMax)) ? (memcpy((dest), (src), strlen(src) + 1), EOK) : \
|
||||
(strcpy_error((dest), (destMax), (src))))
|
||||
|
||||
/* For strcat_s performance optimization */
|
||||
#if defined(__GNUC__)
|
||||
#define SECUREC_STRCAT_SM(dest, destMax, src) ({ \
|
||||
int catRet_ = EOK; \
|
||||
if ((void *)(dest) != NULL && (void *)(src) != NULL && (size_t)(destMax) > 0 && \
|
||||
(((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN)) { \
|
||||
char *catTmpDst_ = (char *)(dest); \
|
||||
size_t catRestSize_ = (destMax); \
|
||||
while (catRestSize_ > 0 && *catTmpDst_ != '\0') { \
|
||||
++catTmpDst_; \
|
||||
--catRestSize_; \
|
||||
} \
|
||||
if (catRestSize_ == 0) { \
|
||||
catRet_ = EINVAL; \
|
||||
} else if ((strlen(src) + 1) <= catRestSize_) { \
|
||||
memcpy(catTmpDst_, (src), strlen(src) + 1); \
|
||||
catRet_ = EOK; \
|
||||
} else { \
|
||||
catRet_ = ERANGE; \
|
||||
} \
|
||||
if (catRet_ != EOK) { \
|
||||
catRet_ = strcat_s((dest), (destMax), (src)); \
|
||||
} \
|
||||
} else { \
|
||||
catRet_ = strcat_s((dest), (destMax), (src)); \
|
||||
} \
|
||||
catRet_; \
|
||||
})
|
||||
#else
|
||||
#define SECUREC_STRCAT_SM(dest, destMax, src) strcat_s((dest), (destMax), (src))
|
||||
#endif
|
||||
|
||||
/* For strncat_s performance optimization */
|
||||
#if defined(__GNUC__)
|
||||
#define SECUREC_STRNCAT_SM(dest, destMax, src, count) ({ \
|
||||
int ncatRet_ = EOK; \
|
||||
if ((void *)(dest) != NULL && (void *)(src) != NULL && (size_t)(destMax) > 0 && \
|
||||
(((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN) && \
|
||||
(((unsigned long long)(count) & (unsigned long long)(-2)) < SECUREC_STRING_MAX_LEN)) { \
|
||||
char *ncatTmpDest_ = (char *)(dest); \
|
||||
size_t ncatRestSize_ = (size_t)(destMax); \
|
||||
while (ncatRestSize_ > 0 && *ncatTmpDest_ != '\0') { \
|
||||
++ncatTmpDest_; \
|
||||
--ncatRestSize_; \
|
||||
} \
|
||||
if (ncatRestSize_ == 0) { \
|
||||
ncatRet_ = EINVAL; \
|
||||
} else if ((SECUREC_TWO_MIN((count), strlen(src)) + 1) <= ncatRestSize_) { \
|
||||
if ((size_t)(count) < strlen(src)) { \
|
||||
memcpy(ncatTmpDest_, (src), (count)); \
|
||||
*(ncatTmpDest_ + (count)) = '\0'; \
|
||||
} else { \
|
||||
memcpy(ncatTmpDest_, (src), strlen(src) + 1); \
|
||||
} \
|
||||
} else { \
|
||||
ncatRet_ = ERANGE; \
|
||||
} \
|
||||
if (ncatRet_ != EOK) { \
|
||||
ncatRet_ = strncat_s((dest), (destMax), (src), (count)); \
|
||||
} \
|
||||
} else { \
|
||||
ncatRet_ = strncat_s((dest), (destMax), (src), (count)); \
|
||||
} \
|
||||
ncatRet_; \
|
||||
})
|
||||
#else
|
||||
#define SECUREC_STRNCAT_SM(dest, destMax, src, count) strncat_s((dest), (destMax), (src), (count))
|
||||
#endif
|
||||
|
||||
/* This macro do not check buffer overlap by default */
|
||||
#define SECUREC_MEMCPY_SM(dest, destMax, src, count) \
|
||||
(!(((size_t)(destMax) == 0) || \
|
||||
(((unsigned long long)(destMax) & (unsigned long long)(-2)) > SECUREC_MEM_MAX_LEN) || \
|
||||
((size_t)(count) > (size_t)(destMax)) || ((void *)(dest)) == NULL || ((void *)(src) == NULL)) ? \
|
||||
(memcpy((dest), (src), (count)), EOK) : \
|
||||
(memcpy_s((dest), (destMax), (src), (count))))
|
||||
|
||||
#define SECUREC_MEMSET_SM(dest, destMax, c, count) \
|
||||
(!((((unsigned long long)(destMax) & (unsigned long long)(-2)) > SECUREC_MEM_MAX_LEN) || \
|
||||
((void *)(dest) == NULL) || ((size_t)(count) > (size_t)(destMax))) ? \
|
||||
(memset((dest), (c), (count)), EOK) : \
|
||||
(memset_s((dest), (destMax), (c), (count))))
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: fscanf_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securec.h"
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The fscanf_s function is equivalent to fscanf except that the c, s,
|
||||
* and [ conversion specifiers apply to a pair of arguments (unless assignment suppression is indicated by a*)
|
||||
* The fscanf function reads data from the current position of stream into
|
||||
* the locations given by argument (if any). Each argument must be a pointer
|
||||
* to a variable of a type that corresponds to a type specifier in format.
|
||||
* format controls the interpretation of the input fields and has the same
|
||||
* form and function as the format argument for scanf.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* stream Pointer to FILE structure.
|
||||
* format Format control string, see Format Specifications.
|
||||
* ... Optional arguments.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* ... The convered value stored in user assigned address
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* Each of these functions returns the number of fields successfully converted
|
||||
* and assigned; the return value does not include fields that were read but
|
||||
* not assigned. A return value of 0 indicates that no fields were assigned.
|
||||
* return -1 if an error occurs.
|
||||
*/
|
||||
int fscanf_s(FILE *stream, const char *format, ...)
|
||||
{
|
||||
int ret; /* If initialization causes e838 */
|
||||
va_list argList;
|
||||
|
||||
va_start(argList, format);
|
||||
ret = vfscanf_s(stream, format, argList);
|
||||
va_end(argList);
|
||||
(void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: fwscanf_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securec.h"
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The fwscanf_s function is the wide-character equivalent of the fscanf_s function
|
||||
* The fwscanf_s function reads data from the current position of stream into
|
||||
* the locations given by argument (if any). Each argument must be a pointer
|
||||
* to a variable of a type that corresponds to a type specifier in format.
|
||||
* format controls the interpretation of the input fields and has the same
|
||||
* form and function as the format argument for scanf.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* stream Pointer to FILE structure.
|
||||
* format Format control string, see Format Specifications.
|
||||
* ... Optional arguments.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* ... The converted value stored in user assigned address
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* Each of these functions returns the number of fields successfully converted
|
||||
* and assigned; the return value does not include fields that were read but
|
||||
* not assigned. A return value of 0 indicates that no fields were assigned.
|
||||
* return -1 if an error occurs.
|
||||
*/
|
||||
int fwscanf_s(FILE *stream, const wchar_t *format, ...)
|
||||
{
|
||||
int ret; /* If initialization causes e838 */
|
||||
va_list argList;
|
||||
|
||||
va_start(argList, format);
|
||||
ret = vfwscanf_s(stream, format, argList);
|
||||
va_end(argList);
|
||||
(void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1,72 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: gets_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securecutil.h"
|
||||
|
||||
/*
|
||||
* The parameter size is buffer size in byte
|
||||
*/
|
||||
SECUREC_INLINE void SecTrimCRLF(char *buffer, size_t size)
|
||||
{
|
||||
size_t len = strlen(buffer);
|
||||
--len; /* Unsigned integer wrapping is accepted and is checked afterwards */
|
||||
while (len < size && (buffer[len] == '\r' || buffer[len] == '\n')) {
|
||||
buffer[len] = '\0';
|
||||
--len; /* Unsigned integer wrapping is accepted and is checked next loop */
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The gets_s function reads at most one less than the number of characters
|
||||
* specified by destMax from the std input stream, into the array pointed to by buffer
|
||||
* The line consists of all characters up to and including
|
||||
* the first newline character ('\n'). gets_s then replaces the newline
|
||||
* character with a null character ('\0') before returning the line.
|
||||
* If the first character read is the end-of-file character, a null character
|
||||
* is stored at the beginning of buffer and NULL is returned.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* buffer Storage location for input string.
|
||||
* destMax The size of the buffer.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* buffer is updated
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* buffer Successful operation
|
||||
* NULL Improper parameter or read fail
|
||||
*/
|
||||
char *gets_s(char *buffer, size_t destMax)
|
||||
{
|
||||
#ifdef SECUREC_COMPATIBLE_WIN_FORMAT
|
||||
size_t bufferSize = ((destMax == (size_t)(-1)) ? SECUREC_STRING_MAX_LEN : destMax);
|
||||
#else
|
||||
size_t bufferSize = destMax;
|
||||
#endif
|
||||
|
||||
if (buffer == NULL || bufferSize == 0 || bufferSize > SECUREC_STRING_MAX_LEN) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("gets_s");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (fgets(buffer, (int)bufferSize, SECUREC_STREAM_STDIN) != NULL) {
|
||||
SecTrimCRLF(buffer, bufferSize);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -1,564 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: memcpy_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
/*
|
||||
* [Standardize-exceptions] Use unsafe function: Portability
|
||||
* [reason] Use unsafe function to implement security function to maintain platform compatibility.
|
||||
* And sufficient input validation is performed before calling
|
||||
*/
|
||||
|
||||
#include "securecutil.h"
|
||||
|
||||
#ifndef SECUREC_MEMCOPY_WITH_PERFORMANCE
|
||||
#define SECUREC_MEMCOPY_WITH_PERFORMANCE 0
|
||||
#endif
|
||||
|
||||
#if SECUREC_WITH_PERFORMANCE_ADDONS || SECUREC_MEMCOPY_WITH_PERFORMANCE
|
||||
#ifndef SECUREC_MEMCOPY_THRESHOLD_SIZE
|
||||
#define SECUREC_MEMCOPY_THRESHOLD_SIZE 64UL
|
||||
#endif
|
||||
|
||||
#define SECUREC_SMALL_MEM_COPY(dest, src, count) do { \
|
||||
if (SECUREC_ADDR_ALIGNED_8(dest) && SECUREC_ADDR_ALIGNED_8(src)) { \
|
||||
/* Use struct assignment */ \
|
||||
switch (count) { \
|
||||
case 1: \
|
||||
*(unsigned char *)(dest) = *(const unsigned char *)(src); \
|
||||
break; \
|
||||
case 2: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 2); \
|
||||
break; \
|
||||
case 3: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 3); \
|
||||
break; \
|
||||
case 4: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 4); \
|
||||
break; \
|
||||
case 5: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 5); \
|
||||
break; \
|
||||
case 6: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 6); \
|
||||
break; \
|
||||
case 7: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 7); \
|
||||
break; \
|
||||
case 8: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 8); \
|
||||
break; \
|
||||
case 9: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 9); \
|
||||
break; \
|
||||
case 10: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 10); \
|
||||
break; \
|
||||
case 11: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 11); \
|
||||
break; \
|
||||
case 12: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 12); \
|
||||
break; \
|
||||
case 13: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 13); \
|
||||
break; \
|
||||
case 14: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 14); \
|
||||
break; \
|
||||
case 15: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 15); \
|
||||
break; \
|
||||
case 16: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 16); \
|
||||
break; \
|
||||
case 17: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 17); \
|
||||
break; \
|
||||
case 18: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 18); \
|
||||
break; \
|
||||
case 19: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 19); \
|
||||
break; \
|
||||
case 20: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 20); \
|
||||
break; \
|
||||
case 21: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 21); \
|
||||
break; \
|
||||
case 22: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 22); \
|
||||
break; \
|
||||
case 23: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 23); \
|
||||
break; \
|
||||
case 24: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 24); \
|
||||
break; \
|
||||
case 25: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 25); \
|
||||
break; \
|
||||
case 26: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 26); \
|
||||
break; \
|
||||
case 27: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 27); \
|
||||
break; \
|
||||
case 28: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 28); \
|
||||
break; \
|
||||
case 29: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 29); \
|
||||
break; \
|
||||
case 30: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 30); \
|
||||
break; \
|
||||
case 31: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 31); \
|
||||
break; \
|
||||
case 32: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 32); \
|
||||
break; \
|
||||
case 33: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 33); \
|
||||
break; \
|
||||
case 34: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 34); \
|
||||
break; \
|
||||
case 35: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 35); \
|
||||
break; \
|
||||
case 36: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 36); \
|
||||
break; \
|
||||
case 37: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 37); \
|
||||
break; \
|
||||
case 38: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 38); \
|
||||
break; \
|
||||
case 39: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 39); \
|
||||
break; \
|
||||
case 40: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 40); \
|
||||
break; \
|
||||
case 41: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 41); \
|
||||
break; \
|
||||
case 42: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 42); \
|
||||
break; \
|
||||
case 43: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 43); \
|
||||
break; \
|
||||
case 44: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 44); \
|
||||
break; \
|
||||
case 45: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 45); \
|
||||
break; \
|
||||
case 46: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 46); \
|
||||
break; \
|
||||
case 47: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 47); \
|
||||
break; \
|
||||
case 48: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 48); \
|
||||
break; \
|
||||
case 49: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 49); \
|
||||
break; \
|
||||
case 50: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 50); \
|
||||
break; \
|
||||
case 51: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 51); \
|
||||
break; \
|
||||
case 52: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 52); \
|
||||
break; \
|
||||
case 53: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 53); \
|
||||
break; \
|
||||
case 54: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 54); \
|
||||
break; \
|
||||
case 55: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 55); \
|
||||
break; \
|
||||
case 56: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 56); \
|
||||
break; \
|
||||
case 57: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 57); \
|
||||
break; \
|
||||
case 58: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 58); \
|
||||
break; \
|
||||
case 59: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 59); \
|
||||
break; \
|
||||
case 60: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 60); \
|
||||
break; \
|
||||
case 61: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 61); \
|
||||
break; \
|
||||
case 62: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 62); \
|
||||
break; \
|
||||
case 63: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 63); \
|
||||
break; \
|
||||
case 64: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((dest), (src), 64); \
|
||||
break; \
|
||||
default: \
|
||||
/* Do nothing */ \
|
||||
break; \
|
||||
} /* END switch */ \
|
||||
} else { \
|
||||
unsigned char *tmpDest_ = (unsigned char *)(dest); \
|
||||
const unsigned char *tmpSrc_ = (const unsigned char *)(src); \
|
||||
switch (count) { \
|
||||
case 64: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 63: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 62: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 61: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 60: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 59: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 58: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 57: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 56: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 55: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 54: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 53: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 52: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 51: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 50: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 49: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 48: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 47: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 46: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 45: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 44: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 43: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 42: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 41: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 40: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 39: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 38: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 37: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 36: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 35: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 34: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 33: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 32: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 31: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 30: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 29: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 28: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 27: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 26: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 25: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 24: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 23: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 22: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 21: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 20: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 19: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 18: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 17: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 16: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 15: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 14: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 13: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 12: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 11: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 10: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 9: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 8: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 7: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 6: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 5: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 4: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 3: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 2: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 1: \
|
||||
*(tmpDest_++) = *(tmpSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
default: \
|
||||
/* Do nothing */ \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
} SECUREC_WHILE_ZERO
|
||||
|
||||
/*
|
||||
* Performance optimization
|
||||
*/
|
||||
#define SECUREC_MEMCPY_OPT(dest, src, count) do { \
|
||||
if ((count) > SECUREC_MEMCOPY_THRESHOLD_SIZE) { \
|
||||
SECUREC_MEMCPY_WARP_OPT((dest), (src), (count)); \
|
||||
} else { \
|
||||
SECUREC_SMALL_MEM_COPY((dest), (src), (count)); \
|
||||
} \
|
||||
} SECUREC_WHILE_ZERO
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Handling errors
|
||||
*/
|
||||
SECUREC_INLINE errno_t SecMemcpyError(void *dest, size_t destMax, const void *src, size_t count)
|
||||
{
|
||||
if (destMax == 0 || destMax > SECUREC_MEM_MAX_LEN) {
|
||||
SECUREC_ERROR_INVALID_RANGE("memcpy_s");
|
||||
return ERANGE;
|
||||
}
|
||||
if (dest == NULL || src == NULL) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("memcpy_s");
|
||||
if (dest != NULL) {
|
||||
(void)memset(dest, 0, destMax);
|
||||
return EINVAL_AND_RESET;
|
||||
}
|
||||
return EINVAL;
|
||||
}
|
||||
if (count > destMax) {
|
||||
(void)memset(dest, 0, destMax);
|
||||
SECUREC_ERROR_INVALID_RANGE("memcpy_s");
|
||||
return ERANGE_AND_RESET;
|
||||
}
|
||||
if (SECUREC_MEMORY_IS_OVERLAP(dest, src, count)) {
|
||||
(void)memset(dest, 0, destMax);
|
||||
SECUREC_ERROR_BUFFER_OVERLAP("memcpy_s");
|
||||
return EOVERLAP_AND_RESET;
|
||||
}
|
||||
/* Count is 0 or dest equal src also ret EOK */
|
||||
return EOK;
|
||||
}
|
||||
|
||||
#if defined(SECUREC_COMPATIBLE_WIN_FORMAT)
|
||||
/*
|
||||
* The fread API in windows will call memcpy_s and pass 0xffffffff to destMax.
|
||||
* To avoid the failure of fread, we don't check desMax limit.
|
||||
*/
|
||||
#define SECUREC_MEMCPY_PARAM_OK(dest, destMax, src, count) (SECUREC_LIKELY((count) <= (destMax) && \
|
||||
(dest) != NULL && (src) != NULL && \
|
||||
(count) > 0 && SECUREC_MEMORY_NO_OVERLAP((dest), (src), (count))))
|
||||
#else
|
||||
#define SECUREC_MEMCPY_PARAM_OK(dest, destMax, src, count) (SECUREC_LIKELY((count) <= (destMax) && \
|
||||
(dest) != NULL && (src) != NULL && (destMax) <= SECUREC_MEM_MAX_LEN && \
|
||||
(count) > 0 && SECUREC_MEMORY_NO_OVERLAP((dest), (src), (count))))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The memcpy_s function copies n characters from the object pointed to by src into the object pointed to by dest
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* dest Destination buffer.
|
||||
* destMax Size of the destination buffer.
|
||||
* src Buffer to copy from.
|
||||
* count Number of characters to copy
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* dest buffer is updated.
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* EOK Success
|
||||
* EINVAL dest is NULL and destMax != 0 and destMax <= SECUREC_MEM_MAX_LEN
|
||||
* EINVAL_AND_RESET dest != NULL and src is NULLL and destMax != 0 and destMax <= SECUREC_MEM_MAX_LEN
|
||||
* ERANGE destMax > SECUREC_MEM_MAX_LEN or destMax is 0
|
||||
* ERANGE_AND_RESET count > destMax and destMax != 0 and destMax <= SECUREC_MEM_MAX_LEN
|
||||
* and dest != NULL and src != NULL
|
||||
* EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and
|
||||
* count <= destMax destMax != 0 and destMax <= SECUREC_MEM_MAX_LEN and dest != NULL
|
||||
* and src != NULL and dest != src
|
||||
*
|
||||
* if an error occured, dest will be filled with 0.
|
||||
* If the source and destination overlap, the behavior of memcpy_s is undefined.
|
||||
* Use memmove_s to handle overlapping regions.
|
||||
*/
|
||||
errno_t memcpy_s(void *dest, size_t destMax, const void *src, size_t count)
|
||||
{
|
||||
if (SECUREC_MEMCPY_PARAM_OK(dest, destMax, src, count)) {
|
||||
#if SECUREC_MEMCOPY_WITH_PERFORMANCE
|
||||
SECUREC_MEMCPY_OPT(dest, src, count);
|
||||
#else
|
||||
SECUREC_MEMCPY_WARP_OPT(dest, src, count);
|
||||
#endif
|
||||
return EOK;
|
||||
}
|
||||
/* Meet some runtime violation, return error code */
|
||||
return SecMemcpyError(dest, destMax, src, count);
|
||||
}
|
||||
|
||||
#if SECUREC_IN_KERNEL
|
||||
EXPORT_SYMBOL(memcpy_s);
|
||||
#endif
|
||||
|
||||
#if SECUREC_WITH_PERFORMANCE_ADDONS
|
||||
/*
|
||||
* Performance optimization
|
||||
*/
|
||||
errno_t memcpy_sOptAsm(void *dest, size_t destMax, const void *src, size_t count)
|
||||
{
|
||||
if (SECUREC_MEMCPY_PARAM_OK(dest, destMax, src, count)) {
|
||||
SECUREC_MEMCPY_OPT(dest, src, count);
|
||||
return EOK;
|
||||
}
|
||||
/* Meet some runtime violation, return error code */
|
||||
return SecMemcpyError(dest, destMax, src, count);
|
||||
}
|
||||
|
||||
/* Trim judgement on "destMax <= SECUREC_MEM_MAX_LEN" */
|
||||
errno_t memcpy_sOptTc(void *dest, size_t destMax, const void *src, size_t count)
|
||||
{
|
||||
if (SECUREC_LIKELY(count <= destMax && dest != NULL && src != NULL && \
|
||||
count > 0 && SECUREC_MEMORY_NO_OVERLAP((dest), (src), (count)))) {
|
||||
SECUREC_MEMCPY_OPT(dest, src, count);
|
||||
return EOK;
|
||||
}
|
||||
/* Meet some runtime violation, return error code */
|
||||
return SecMemcpyError(dest, destMax, src, count);
|
||||
}
|
||||
#endif
|
||||
|
|
@ -1,119 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: memmove_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securecutil.h"
|
||||
|
||||
#ifdef SECUREC_NOT_CALL_LIBC_CORE_API
|
||||
/*
|
||||
* Implementing memory data movement
|
||||
*/
|
||||
SECUREC_INLINE void SecUtilMemmove(void *dst, const void *src, size_t count)
|
||||
{
|
||||
unsigned char *pDest = (unsigned char *)dst;
|
||||
const unsigned char *pSrc = (const unsigned char *)src;
|
||||
size_t maxCount = count;
|
||||
|
||||
if (dst <= src || pDest >= (pSrc + maxCount)) {
|
||||
/*
|
||||
* Non-Overlapping Buffers
|
||||
* Copy from lower addresses to higher addresses
|
||||
*/
|
||||
while (maxCount > 0) {
|
||||
--maxCount;
|
||||
*pDest = *pSrc;
|
||||
++pDest;
|
||||
++pSrc;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* Overlapping Buffers
|
||||
* Copy from higher addresses to lower addresses
|
||||
*/
|
||||
pDest = pDest + maxCount - 1;
|
||||
pSrc = pSrc + maxCount - 1;
|
||||
while (maxCount > 0) {
|
||||
--maxCount;
|
||||
*pDest = *pSrc;
|
||||
--pDest;
|
||||
--pSrc;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The memmove_s function copies count bytes of characters from src to dest.
|
||||
* This function can be assigned correctly when memory overlaps.
|
||||
* <INPUT PARAMETERS>
|
||||
* dest Destination object.
|
||||
* destMax Size of the destination buffer.
|
||||
* src Source object.
|
||||
* count Number of characters to copy.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* dest buffer is uptdated.
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* EOK Success
|
||||
* EINVAL dest is NULL and destMax != 0 and destMax <= SECUREC_MEM_MAX_LEN
|
||||
* EINVAL_AND_RESET dest != NULL and src is NULLL and destMax != 0 and destMax <= SECUREC_MEM_MAX_LEN
|
||||
* ERANGE destMax > SECUREC_MEM_MAX_LEN or destMax is 0
|
||||
* ERANGE_AND_RESET count > destMax and dest != NULL and src != NULL and destMax != 0
|
||||
* and destMax <= SECUREC_MEM_MAX_LEN
|
||||
*
|
||||
* If an error occured, dest will be filled with 0 when dest and destMax valid.
|
||||
* If some regions of the source area and the destination overlap, memmove_s
|
||||
* ensures that the original source bytes in the overlapping region are copied
|
||||
* before being overwritten.
|
||||
*/
|
||||
errno_t memmove_s(void *dest, size_t destMax, const void *src, size_t count)
|
||||
{
|
||||
if (destMax == 0 || destMax > SECUREC_MEM_MAX_LEN) {
|
||||
SECUREC_ERROR_INVALID_RANGE("memmove_s");
|
||||
return ERANGE;
|
||||
}
|
||||
if (dest == NULL || src == NULL) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("memmove_s");
|
||||
if (dest != NULL) {
|
||||
(void)memset(dest, 0, destMax);
|
||||
return EINVAL_AND_RESET;
|
||||
}
|
||||
return EINVAL;
|
||||
}
|
||||
if (count > destMax) {
|
||||
(void)memset(dest, 0, destMax);
|
||||
SECUREC_ERROR_INVALID_RANGE("memmove_s");
|
||||
return ERANGE_AND_RESET;
|
||||
}
|
||||
if (dest == src) {
|
||||
return EOK;
|
||||
}
|
||||
|
||||
if (count > 0) {
|
||||
#ifdef SECUREC_NOT_CALL_LIBC_CORE_API
|
||||
SecUtilMemmove(dest, src, count);
|
||||
#else
|
||||
/* Use underlying memmove for performance consideration */
|
||||
(void)memmove(dest, src, count);
|
||||
#endif
|
||||
}
|
||||
return EOK;
|
||||
}
|
||||
|
||||
#if SECUREC_IN_KERNEL
|
||||
EXPORT_SYMBOL(memmove_s);
|
||||
#endif
|
||||
|
|
@ -1,509 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: memset_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securecutil.h"
|
||||
|
||||
#define SECUREC_MEMSET_PARAM_OK(dest, destMax, count) (SECUREC_LIKELY((destMax) <= SECUREC_MEM_MAX_LEN && \
|
||||
(dest) != NULL && (count) <= (destMax)))
|
||||
|
||||
#if SECUREC_WITH_PERFORMANCE_ADDONS
|
||||
|
||||
/* Use union to clear strict-aliasing warning */
|
||||
typedef union {
|
||||
SecStrBuf32 buf32;
|
||||
SecStrBuf31 buf31;
|
||||
SecStrBuf30 buf30;
|
||||
SecStrBuf29 buf29;
|
||||
SecStrBuf28 buf28;
|
||||
SecStrBuf27 buf27;
|
||||
SecStrBuf26 buf26;
|
||||
SecStrBuf25 buf25;
|
||||
SecStrBuf24 buf24;
|
||||
SecStrBuf23 buf23;
|
||||
SecStrBuf22 buf22;
|
||||
SecStrBuf21 buf21;
|
||||
SecStrBuf20 buf20;
|
||||
SecStrBuf19 buf19;
|
||||
SecStrBuf18 buf18;
|
||||
SecStrBuf17 buf17;
|
||||
SecStrBuf16 buf16;
|
||||
SecStrBuf15 buf15;
|
||||
SecStrBuf14 buf14;
|
||||
SecStrBuf13 buf13;
|
||||
SecStrBuf12 buf12;
|
||||
SecStrBuf11 buf11;
|
||||
SecStrBuf10 buf10;
|
||||
SecStrBuf9 buf9;
|
||||
SecStrBuf8 buf8;
|
||||
SecStrBuf7 buf7;
|
||||
SecStrBuf6 buf6;
|
||||
SecStrBuf5 buf5;
|
||||
SecStrBuf4 buf4;
|
||||
SecStrBuf3 buf3;
|
||||
SecStrBuf2 buf2;
|
||||
} SecStrBuf32Union;
|
||||
/* C standard initializes the first member of the consortium. */
|
||||
static const SecStrBuf32 g_allZero = {{
|
||||
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
|
||||
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
|
||||
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
|
||||
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'
|
||||
}};
|
||||
static const SecStrBuf32 g_allFF = {{
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
|
||||
}};
|
||||
|
||||
/* Clear coversion warning strict aliasing" */
|
||||
SECUREC_INLINE const SecStrBuf32Union *SecStrictAliasingCast(const SecStrBuf32 *buf)
|
||||
{
|
||||
return (const SecStrBuf32Union *)buf;
|
||||
}
|
||||
|
||||
#ifndef SECUREC_MEMSET_THRESHOLD_SIZE
|
||||
#define SECUREC_MEMSET_THRESHOLD_SIZE 32UL
|
||||
#endif
|
||||
|
||||
#define SECUREC_UNALIGNED_SET(dest, c, count) do { \
|
||||
unsigned char *pDest_ = (unsigned char *)(dest); \
|
||||
switch (count) { \
|
||||
case 32: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 31: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 30: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 29: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 28: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 27: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 26: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 25: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 24: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 23: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 22: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 21: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 20: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 19: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 18: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 17: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 16: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 15: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 14: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 13: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 12: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 11: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 10: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 9: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 8: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 7: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 6: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 5: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 4: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 3: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 2: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 1: \
|
||||
*(pDest_++) = (unsigned char)(c); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
default: \
|
||||
/* Do nothing */ \
|
||||
break; \
|
||||
} \
|
||||
} SECUREC_WHILE_ZERO
|
||||
|
||||
#define SECUREC_SET_VALUE_BY_STRUCT(dest, dataName, n) do { \
|
||||
*(SecStrBuf##n *)(dest) = *(const SecStrBuf##n *)(&((SecStrictAliasingCast(&(dataName)))->buf##n)); \
|
||||
} SECUREC_WHILE_ZERO
|
||||
|
||||
#define SECUREC_ALIGNED_SET_OPT_ZERO_FF(dest, c, count) do { \
|
||||
switch (c) { \
|
||||
case 0: \
|
||||
switch (count) { \
|
||||
case 1: \
|
||||
*(unsigned char *)(dest) = (unsigned char)0; \
|
||||
break; \
|
||||
case 2: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 2); \
|
||||
break; \
|
||||
case 3: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 3); \
|
||||
break; \
|
||||
case 4: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 4); \
|
||||
break; \
|
||||
case 5: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 5); \
|
||||
break; \
|
||||
case 6: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 6); \
|
||||
break; \
|
||||
case 7: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 7); \
|
||||
break; \
|
||||
case 8: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 8); \
|
||||
break; \
|
||||
case 9: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 9); \
|
||||
break; \
|
||||
case 10: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 10); \
|
||||
break; \
|
||||
case 11: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 11); \
|
||||
break; \
|
||||
case 12: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 12); \
|
||||
break; \
|
||||
case 13: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 13); \
|
||||
break; \
|
||||
case 14: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 14); \
|
||||
break; \
|
||||
case 15: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 15); \
|
||||
break; \
|
||||
case 16: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 16); \
|
||||
break; \
|
||||
case 17: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 17); \
|
||||
break; \
|
||||
case 18: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 18); \
|
||||
break; \
|
||||
case 19: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 19); \
|
||||
break; \
|
||||
case 20: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 20); \
|
||||
break; \
|
||||
case 21: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 21); \
|
||||
break; \
|
||||
case 22: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 22); \
|
||||
break; \
|
||||
case 23: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 23); \
|
||||
break; \
|
||||
case 24: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 24); \
|
||||
break; \
|
||||
case 25: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 25); \
|
||||
break; \
|
||||
case 26: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 26); \
|
||||
break; \
|
||||
case 27: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 27); \
|
||||
break; \
|
||||
case 28: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 28); \
|
||||
break; \
|
||||
case 29: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 29); \
|
||||
break; \
|
||||
case 30: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 30); \
|
||||
break; \
|
||||
case 31: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 31); \
|
||||
break; \
|
||||
case 32: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allZero, 32); \
|
||||
break; \
|
||||
default: \
|
||||
/* Do nothing */ \
|
||||
break; \
|
||||
} \
|
||||
break; \
|
||||
case 0xFF: \
|
||||
switch (count) { \
|
||||
case 1: \
|
||||
*(unsigned char *)(dest) = (unsigned char)0xffU; \
|
||||
break; \
|
||||
case 2: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 2); \
|
||||
break; \
|
||||
case 3: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 3); \
|
||||
break; \
|
||||
case 4: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 4); \
|
||||
break; \
|
||||
case 5: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 5); \
|
||||
break; \
|
||||
case 6: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 6); \
|
||||
break; \
|
||||
case 7: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 7); \
|
||||
break; \
|
||||
case 8: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 8); \
|
||||
break; \
|
||||
case 9: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 9); \
|
||||
break; \
|
||||
case 10: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 10); \
|
||||
break; \
|
||||
case 11: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 11); \
|
||||
break; \
|
||||
case 12: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 12); \
|
||||
break; \
|
||||
case 13: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 13); \
|
||||
break; \
|
||||
case 14: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 14); \
|
||||
break; \
|
||||
case 15: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 15); \
|
||||
break; \
|
||||
case 16: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 16); \
|
||||
break; \
|
||||
case 17: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 17); \
|
||||
break; \
|
||||
case 18: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 18); \
|
||||
break; \
|
||||
case 19: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 19); \
|
||||
break; \
|
||||
case 20: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 20); \
|
||||
break; \
|
||||
case 21: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 21); \
|
||||
break; \
|
||||
case 22: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 22); \
|
||||
break; \
|
||||
case 23: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 23); \
|
||||
break; \
|
||||
case 24: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 24); \
|
||||
break; \
|
||||
case 25: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 25); \
|
||||
break; \
|
||||
case 26: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 26); \
|
||||
break; \
|
||||
case 27: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 27); \
|
||||
break; \
|
||||
case 28: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 28); \
|
||||
break; \
|
||||
case 29: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 29); \
|
||||
break; \
|
||||
case 30: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 30); \
|
||||
break; \
|
||||
case 31: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 31); \
|
||||
break; \
|
||||
case 32: \
|
||||
SECUREC_SET_VALUE_BY_STRUCT((dest), g_allFF, 32); \
|
||||
break; \
|
||||
default: \
|
||||
/* Do nothing */ \
|
||||
break; \
|
||||
} \
|
||||
break; \
|
||||
default: \
|
||||
SECUREC_UNALIGNED_SET((dest), (c), (count)); \
|
||||
break; \
|
||||
} /* END switch */ \
|
||||
} SECUREC_WHILE_ZERO
|
||||
|
||||
#define SECUREC_SMALL_MEM_SET(dest, c, count) do { \
|
||||
if (SECUREC_ADDR_ALIGNED_8((dest))) { \
|
||||
SECUREC_ALIGNED_SET_OPT_ZERO_FF((dest), (c), (count)); \
|
||||
} else { \
|
||||
SECUREC_UNALIGNED_SET((dest), (c), (count)); \
|
||||
} \
|
||||
} SECUREC_WHILE_ZERO
|
||||
|
||||
/*
|
||||
* Performance optimization
|
||||
*/
|
||||
#define SECUREC_MEMSET_OPT(dest, c, count) do { \
|
||||
if ((count) > SECUREC_MEMSET_THRESHOLD_SIZE) { \
|
||||
SECUREC_MEMSET_WARP_OPT((dest), (c), (count)); \
|
||||
} else { \
|
||||
SECUREC_SMALL_MEM_SET((dest), (c), (count)); \
|
||||
} \
|
||||
} SECUREC_WHILE_ZERO
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Handling errors
|
||||
*/
|
||||
SECUREC_INLINE errno_t SecMemsetError(void *dest, size_t destMax, int c, size_t count)
|
||||
{
|
||||
/* Check destMax is 0 compatible with _sp macro */
|
||||
if (destMax == 0 || destMax > SECUREC_MEM_MAX_LEN) {
|
||||
SECUREC_ERROR_INVALID_RANGE("memset_s");
|
||||
return ERANGE;
|
||||
}
|
||||
if (dest == NULL) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("memset_s");
|
||||
return EINVAL;
|
||||
}
|
||||
if (count > destMax) {
|
||||
(void)memset(dest, c, destMax); /* Set entire buffer to value c */
|
||||
SECUREC_ERROR_INVALID_RANGE("memset_s");
|
||||
return ERANGE_AND_RESET;
|
||||
}
|
||||
return EOK;
|
||||
}
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The memset_s function copies the value of c (converted to an unsigned char)
|
||||
* into each of the first count characters of the object pointed to by dest.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* dest Pointer to destination.
|
||||
* destMax The size of the buffer.
|
||||
* c Character to set.
|
||||
* count Number of characters.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* dest buffer is uptdated.
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* EOK Success
|
||||
* EINVAL dest == NULL and destMax != 0 and destMax <= SECUREC_MEM_MAX_LEN
|
||||
* ERANGE destMax > SECUREC_MEM_MAX_LEN or (destMax is 0 and count > destMax)
|
||||
* ERANGE_AND_RESET count > destMax and destMax != 0 and destMax <= SECUREC_MEM_MAX_LEN and dest != NULL
|
||||
*
|
||||
* if return ERANGE_AND_RESET then fill dest to c ,fill length is destMax
|
||||
*/
|
||||
errno_t memset_s(void *dest, size_t destMax, int c, size_t count)
|
||||
{
|
||||
if (SECUREC_MEMSET_PARAM_OK(dest, destMax, count)) {
|
||||
SECUREC_MEMSET_WARP_OPT(dest, c, count);
|
||||
return EOK;
|
||||
}
|
||||
/* Meet some runtime violation, return error code */
|
||||
return SecMemsetError(dest, destMax, c, count);
|
||||
}
|
||||
|
||||
#if SECUREC_IN_KERNEL
|
||||
EXPORT_SYMBOL(memset_s);
|
||||
#endif
|
||||
|
||||
#if SECUREC_WITH_PERFORMANCE_ADDONS
|
||||
/*
|
||||
* Performance optimization
|
||||
*/
|
||||
errno_t memset_sOptAsm(void *dest, size_t destMax, int c, size_t count)
|
||||
{
|
||||
if (SECUREC_MEMSET_PARAM_OK(dest, destMax, count)) {
|
||||
SECUREC_MEMSET_OPT(dest, c, count);
|
||||
return EOK;
|
||||
}
|
||||
/* Meet some runtime violation, return error code */
|
||||
return SecMemsetError(dest, destMax, c, count);
|
||||
}
|
||||
|
||||
/*
|
||||
* Performance optimization, trim judgement on "destMax <= SECUREC_MEM_MAX_LEN"
|
||||
*/
|
||||
errno_t memset_sOptTc(void *dest, size_t destMax, int c, size_t count)
|
||||
{
|
||||
if (SECUREC_LIKELY(count <= destMax && dest != NULL)) {
|
||||
SECUREC_MEMSET_OPT(dest, c, count);
|
||||
return EOK;
|
||||
}
|
||||
/* Meet some runtime violation, return error code */
|
||||
return SecMemsetError(dest, destMax, c, count);
|
||||
}
|
||||
#endif
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -1,52 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: scanf_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securec.h"
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The scanf_s function is equivalent to fscanf_s with the argument stdin interposed before the arguments to scanf_s
|
||||
* The scanf_s function reads data from the standard input stream stdin and
|
||||
* writes the data into the location that's given by argument. Each argument
|
||||
* must be a pointer to a variable of a type that corresponds to a type specifier
|
||||
* in format. If copying occurs between strings that overlap, the behavior is
|
||||
* undefined.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* format Format control string.
|
||||
* ... Optional arguments.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* ... The converted value stored in user assigned address
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* Returns the number of fields successfully converted and assigned;
|
||||
* the return value does not include fields that were read but not assigned.
|
||||
* A return value of 0 indicates that no fields were assigned.
|
||||
* return -1 if an error occurs.
|
||||
*/
|
||||
int scanf_s(const char *format, ...)
|
||||
{
|
||||
int ret; /* If initialization causes e838 */
|
||||
va_list argList;
|
||||
|
||||
va_start(argList, format);
|
||||
ret = vscanf_s(format, argList);
|
||||
va_end(argList);
|
||||
(void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1,194 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: Define macro, data struct, and declare function prototype,
|
||||
* which is used by input.inl, secureinput_a.c and secureinput_w.c.
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#ifndef SEC_INPUT_H_E950DA2C_902F_4B15_BECD_948E99090D9C
|
||||
#define SEC_INPUT_H_E950DA2C_902F_4B15_BECD_948E99090D9C
|
||||
#include "securecutil.h"
|
||||
|
||||
#define SECUREC_SCANF_EINVAL (-1)
|
||||
#define SECUREC_SCANF_ERROR_PARA (-2)
|
||||
|
||||
/* For internal stream flag */
|
||||
#define SECUREC_MEM_STR_FLAG 0x01U
|
||||
#define SECUREC_FILE_STREAM_FLAG 0x02U
|
||||
#define SECUREC_PIPE_STREAM_FLAG 0x04U
|
||||
#define SECUREC_LOAD_FILE_TO_MEM_FLAG 0x08U
|
||||
|
||||
#define SECUREC_UCS_BOM_HEADER_SIZE 2U
|
||||
#define SECUREC_UCS_BOM_HEADER_BE_1ST 0xfeU
|
||||
#define SECUREC_UCS_BOM_HEADER_BE_2ST 0xffU
|
||||
#define SECUREC_UCS_BOM_HEADER_LE_1ST 0xffU
|
||||
#define SECUREC_UCS_BOM_HEADER_LE_2ST 0xfeU
|
||||
#define SECUREC_UTF8_BOM_HEADER_SIZE 3U
|
||||
#define SECUREC_UTF8_BOM_HEADER_1ST 0xefU
|
||||
#define SECUREC_UTF8_BOM_HEADER_2ND 0xbbU
|
||||
#define SECUREC_UTF8_BOM_HEADER_3RD 0xbfU
|
||||
#define SECUREC_UTF8_LEAD_1ST 0xe0U
|
||||
#define SECUREC_UTF8_LEAD_2ND 0x80U
|
||||
|
||||
#define SECUREC_BEGIN_WITH_UCS_BOM(s, len) ((len) >= SECUREC_UCS_BOM_HEADER_SIZE && \
|
||||
(((unsigned char)((s)[0]) == SECUREC_UCS_BOM_HEADER_LE_1ST && \
|
||||
(unsigned char)((s)[1]) == SECUREC_UCS_BOM_HEADER_LE_2ST) || \
|
||||
((unsigned char)((s)[0]) == SECUREC_UCS_BOM_HEADER_BE_1ST && \
|
||||
(unsigned char)((s)[1]) == SECUREC_UCS_BOM_HEADER_BE_2ST)))
|
||||
|
||||
#define SECUREC_BEGIN_WITH_UTF8_BOM(s, len) ((len) >= SECUREC_UTF8_BOM_HEADER_SIZE && \
|
||||
(unsigned char)((s)[0]) == SECUREC_UTF8_BOM_HEADER_1ST && \
|
||||
(unsigned char)((s)[1]) == SECUREC_UTF8_BOM_HEADER_2ND && \
|
||||
(unsigned char)((s)[2]) == SECUREC_UTF8_BOM_HEADER_3RD)
|
||||
|
||||
#ifdef SECUREC_FOR_WCHAR
|
||||
#define SECUREC_BOM_HEADER_SIZE SECUREC_UCS_BOM_HEADER_SIZE
|
||||
#define SECUREC_BEGIN_WITH_BOM(s, len) SECUREC_BEGIN_WITH_UCS_BOM((s), (len))
|
||||
#else
|
||||
#define SECUREC_BOM_HEADER_SIZE SECUREC_UTF8_BOM_HEADER_SIZE
|
||||
#define SECUREC_BEGIN_WITH_BOM(s, len) SECUREC_BEGIN_WITH_UTF8_BOM((s), (len))
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
unsigned int flag; /* Mark the properties of input stream */
|
||||
char *base; /* The pointer to the header of buffered string */
|
||||
const char *cur; /* The pointer to next read position */
|
||||
size_t count; /* The size of buffered string in bytes */
|
||||
#if SECUREC_ENABLE_SCANF_FILE
|
||||
FILE *pf; /* The file pointer */
|
||||
size_t fileRealRead;
|
||||
long oriFilePos; /* The original position of file offset when fscanf is called */
|
||||
#if !SECUREC_USE_STD_UNGETC
|
||||
unsigned int lastChar; /* The char code of last input */
|
||||
int fUnGet; /* The boolean flag of pushing a char back to read stream */
|
||||
#endif
|
||||
#endif
|
||||
} SecFileStream;
|
||||
|
||||
#if SECUREC_ENABLE_SCANF_FILE && !SECUREC_USE_STD_UNGETC
|
||||
#define SECUREC_FILE_STREAM_INIT_FILE(stream, fp) do { \
|
||||
(stream)->pf = (fp); \
|
||||
(stream)->fileRealRead = 0; \
|
||||
(stream)->oriFilePos = 0; \
|
||||
(stream)->lastChar = 0; \
|
||||
(stream)->fUnGet = 0; \
|
||||
} SECUREC_WHILE_ZERO
|
||||
#elif SECUREC_ENABLE_SCANF_FILE && SECUREC_USE_STD_UNGETC
|
||||
#define SECUREC_FILE_STREAM_INIT_FILE(stream, fp) do { \
|
||||
(stream)->pf = (fp); \
|
||||
(stream)->fileRealRead = 0; \
|
||||
(stream)->oriFilePos = 0; \
|
||||
} SECUREC_WHILE_ZERO
|
||||
#else
|
||||
/* Disable file */
|
||||
#define SECUREC_FILE_STREAM_INIT_FILE(stream, fp)
|
||||
#endif
|
||||
|
||||
/* This initialization for eliminating redundant initialization. */
|
||||
#define SECUREC_FILE_STREAM_FROM_STRING(stream, buf, cnt) do { \
|
||||
(stream)->flag = SECUREC_MEM_STR_FLAG; \
|
||||
(stream)->base = NULL; \
|
||||
(stream)->cur = (buf); \
|
||||
(stream)->count = (cnt); \
|
||||
SECUREC_FILE_STREAM_INIT_FILE((stream), NULL); \
|
||||
} SECUREC_WHILE_ZERO
|
||||
|
||||
/* This initialization for eliminating redundant initialization. */
|
||||
#define SECUREC_FILE_STREAM_FROM_FILE(stream, fp) do { \
|
||||
(stream)->flag = SECUREC_FILE_STREAM_FLAG; \
|
||||
(stream)->base = NULL; \
|
||||
(stream)->cur = NULL; \
|
||||
(stream)->count = 0; \
|
||||
SECUREC_FILE_STREAM_INIT_FILE((stream), (fp)); \
|
||||
} SECUREC_WHILE_ZERO
|
||||
|
||||
/* This initialization for eliminating redundant initialization. */
|
||||
#define SECUREC_FILE_STREAM_FROM_STDIN(stream) do { \
|
||||
(stream)->flag = SECUREC_PIPE_STREAM_FLAG; \
|
||||
(stream)->base = NULL; \
|
||||
(stream)->cur = NULL; \
|
||||
(stream)->count = 0; \
|
||||
SECUREC_FILE_STREAM_INIT_FILE((stream), SECUREC_STREAM_STDIN); \
|
||||
} SECUREC_WHILE_ZERO
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
int SecInputS(SecFileStream *stream, const char *cFormat, va_list argList);
|
||||
void SecClearDestBuf(const char *buffer, const char *format, va_list argList);
|
||||
#ifdef SECUREC_FOR_WCHAR
|
||||
int SecInputSW(SecFileStream *stream, const wchar_t *cFormat, va_list argList);
|
||||
void SecClearDestBufW(const wchar_t *buffer, const wchar_t *format, va_list argList);
|
||||
#endif
|
||||
|
||||
/* 20150105 For software and hardware decoupling,such as UMG */
|
||||
#ifdef SECUREC_SYSAPI4VXWORKS
|
||||
#ifdef feof
|
||||
#undef feof
|
||||
#endif
|
||||
extern int feof(FILE *stream);
|
||||
#endif
|
||||
|
||||
#if defined(SECUREC_SYSAPI4VXWORKS) || defined(SECUREC_CTYPE_MACRO_ADAPT)
|
||||
#ifndef isspace
|
||||
#define isspace(c) (((c) == ' ') || ((c) == '\t') || ((c) == '\r') || ((c) == '\n'))
|
||||
#endif
|
||||
#ifndef iswspace
|
||||
#define iswspace(c) (((c) == L' ') || ((c) == L'\t') || ((c) == L'\r') || ((c) == L'\n'))
|
||||
#endif
|
||||
#ifndef isascii
|
||||
#define isascii(c) (((unsigned char)(c)) <= 0x7f)
|
||||
#endif
|
||||
#ifndef isupper
|
||||
#define isupper(c) ((c) >= 'A' && (c) <= 'Z')
|
||||
#endif
|
||||
#ifndef islower
|
||||
#define islower(c) ((c) >= 'a' && (c) <= 'z')
|
||||
#endif
|
||||
#ifndef isalpha
|
||||
#define isalpha(c) (isupper(c) || (islower(c)))
|
||||
#endif
|
||||
#ifndef isdigit
|
||||
#define isdigit(c) ((c) >= '0' && (c) <= '9')
|
||||
#endif
|
||||
#ifndef isxupper
|
||||
#define isxupper(c) ((c) >= 'A' && (c) <= 'F')
|
||||
#endif
|
||||
#ifndef isxlower
|
||||
#define isxlower(c) ((c) >= 'a' && (c) <= 'f')
|
||||
#endif
|
||||
#ifndef isxdigit
|
||||
#define isxdigit(c) (isdigit(c) || isxupper(c) || isxlower(c))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
/* Reserved file operation macro interface, s is FILE *, i is fileno zero. */
|
||||
#ifndef SECUREC_LOCK_FILE
|
||||
#define SECUREC_LOCK_FILE(s)
|
||||
#endif
|
||||
|
||||
#ifndef SECUREC_UNLOCK_FILE
|
||||
#define SECUREC_UNLOCK_FILE(s)
|
||||
#endif
|
||||
|
||||
#ifndef SECUREC_LOCK_STDIN
|
||||
#define SECUREC_LOCK_STDIN(i, s)
|
||||
#endif
|
||||
|
||||
#ifndef SECUREC_UNLOCK_STDIN
|
||||
#define SECUREC_UNLOCK_STDIN(i, s)
|
||||
#endif
|
||||
#endif
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: Provides internal functions used by this library, such as memory
|
||||
* copy and memory move. Besides, include some helper function for
|
||||
* printf family API, such as SecVsnprintfImpl
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
/* Avoid duplicate header files,not include securecutil.h */
|
||||
#include "securecutil.h"
|
||||
|
||||
#if defined(ANDROID) && (SECUREC_HAVE_WCTOMB || SECUREC_HAVE_MBTOWC)
|
||||
#include <wchar.h>
|
||||
#if SECUREC_HAVE_WCTOMB
|
||||
/*
|
||||
* Convert wide characters to narrow multi-bytes
|
||||
*/
|
||||
int wctomb(char *s, wchar_t wc)
|
||||
{
|
||||
return wcrtomb(s, wc, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if SECUREC_HAVE_MBTOWC
|
||||
/*
|
||||
* Converting narrow multi-byte characters to wide characters
|
||||
*/
|
||||
int mbtowc(wchar_t *pwc, const char *s, size_t n)
|
||||
{
|
||||
return mbrtowc(pwc, s, n, NULL);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
|
@ -1,559 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: Define macro, data struct, and declare internal used function prototype,
|
||||
* which is used by secure functions.
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#ifndef SECURECUTIL_H_46C86578_F8FF_4E49_8E64_9B175241761F
|
||||
#define SECURECUTIL_H_46C86578_F8FF_4E49_8E64_9B175241761F
|
||||
#include "securec.h"
|
||||
|
||||
#if (defined(_MSC_VER)) && (_MSC_VER >= 1400)
|
||||
/* Shield compilation alerts using discarded functions and Constant expression to maximize code compatibility */
|
||||
#define SECUREC_MASK_MSVC_CRT_WARNING __pragma(warning(push)) \
|
||||
__pragma(warning(disable : 4996 4127))
|
||||
#define SECUREC_END_MASK_MSVC_CRT_WARNING __pragma(warning(pop))
|
||||
#else
|
||||
#define SECUREC_MASK_MSVC_CRT_WARNING
|
||||
#define SECUREC_END_MASK_MSVC_CRT_WARNING
|
||||
#endif
|
||||
#define SECUREC_WHILE_ZERO SECUREC_MASK_MSVC_CRT_WARNING while (0) SECUREC_END_MASK_MSVC_CRT_WARNING
|
||||
|
||||
/* Automatically identify the platform that supports strnlen function, and use this function to improve performance */
|
||||
#ifndef SECUREC_HAVE_STRNLEN
|
||||
#if (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 700) || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200809L)
|
||||
#if SECUREC_IN_KERNEL
|
||||
#define SECUREC_HAVE_STRNLEN 0
|
||||
#else
|
||||
#if defined(__GLIBC__) && __GLIBC__ >= 2 && defined(__GLIBC_MINOR__) && __GLIBC_MINOR__ >= 10
|
||||
#define SECUREC_HAVE_STRNLEN 1
|
||||
#else
|
||||
#define SECUREC_HAVE_STRNLEN 0
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#define SECUREC_HAVE_STRNLEN 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if SECUREC_IN_KERNEL
|
||||
/* In kernel disbale functions */
|
||||
#ifndef SECUREC_ENABLE_SCANF_FILE
|
||||
#define SECUREC_ENABLE_SCANF_FILE 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_SCANF_FLOAT
|
||||
#define SECUREC_ENABLE_SCANF_FLOAT 0
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_SPRINTF_FLOAT
|
||||
#define SECUREC_ENABLE_SPRINTF_FLOAT 0
|
||||
#endif
|
||||
#ifndef SECUREC_HAVE_MBTOWC
|
||||
#define SECUREC_HAVE_MBTOWC 0
|
||||
#endif
|
||||
#ifndef SECUREC_HAVE_WCTOMB
|
||||
#define SECUREC_HAVE_WCTOMB 0
|
||||
#endif
|
||||
#ifndef SECUREC_HAVE_WCHART
|
||||
#define SECUREC_HAVE_WCHART 0
|
||||
#endif
|
||||
#else /* Not in kernel */
|
||||
/* Systems that do not support file, can define this macro to 0. */
|
||||
#ifndef SECUREC_ENABLE_SCANF_FILE
|
||||
#define SECUREC_ENABLE_SCANF_FILE 1
|
||||
#endif
|
||||
#ifndef SECUREC_ENABLE_SCANF_FLOAT
|
||||
#define SECUREC_ENABLE_SCANF_FLOAT 1
|
||||
#endif
|
||||
/* Systems that do not support float, can define this macro to 0. */
|
||||
#ifndef SECUREC_ENABLE_SPRINTF_FLOAT
|
||||
#define SECUREC_ENABLE_SPRINTF_FLOAT 1
|
||||
#endif
|
||||
#ifndef SECUREC_HAVE_MBTOWC
|
||||
#define SECUREC_HAVE_MBTOWC 1
|
||||
#endif
|
||||
#ifndef SECUREC_HAVE_WCTOMB
|
||||
#define SECUREC_HAVE_WCTOMB 1
|
||||
#endif
|
||||
#ifndef SECUREC_HAVE_WCHART
|
||||
#define SECUREC_HAVE_WCHART 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef SECUREC_USE_STD_UNGETC
|
||||
#define SECUREC_USE_STD_UNGETC 1
|
||||
#endif
|
||||
|
||||
#ifndef SECUREC_ENABLE_INLINE
|
||||
#define SECUREC_ENABLE_INLINE 0
|
||||
#endif
|
||||
|
||||
#ifndef SECUREC_INLINE
|
||||
#if SECUREC_ENABLE_INLINE
|
||||
#define SECUREC_INLINE static inline
|
||||
#else
|
||||
#define SECUREC_INLINE static
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef SECUREC_WARP_OUTPUT
|
||||
#if SECUREC_IN_KERNEL
|
||||
#define SECUREC_WARP_OUTPUT 1
|
||||
#else
|
||||
#define SECUREC_WARP_OUTPUT 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef SECUREC_STREAM_STDIN
|
||||
#define SECUREC_STREAM_STDIN stdin
|
||||
#endif
|
||||
|
||||
#define SECUREC_MUL_SIXTEEN(x) ((x) << 4U)
|
||||
#define SECUREC_MUL_EIGHT(x) ((x) << 3U)
|
||||
#define SECUREC_MUL_TEN(x) ((((x) << 2U) + (x)) << 1U)
|
||||
/* Limited format input and output width, use signed integer */
|
||||
#define SECUREC_MAX_WIDTH_LEN_DIV_TEN 21474836
|
||||
#define SECUREC_MAX_WIDTH_LEN (SECUREC_MAX_WIDTH_LEN_DIV_TEN * 10)
|
||||
/* Is the x multiplied by 10 greater than */
|
||||
#define SECUREC_MUL_TEN_ADD_BEYOND_MAX(x) (((x) > SECUREC_MAX_WIDTH_LEN_DIV_TEN))
|
||||
|
||||
#define SECUREC_FLOAT_BUFSIZE (309 + 40) /* Max length of double value */
|
||||
#define SECUREC_FLOAT_BUFSIZE_LB (4932 + 40) /* Max length of long double value */
|
||||
#define SECUREC_FLOAT_DEFAULT_PRECISION 6
|
||||
|
||||
/* This macro does not handle pointer equality or integer overflow */
|
||||
#define SECUREC_MEMORY_NO_OVERLAP(dest, src, count) \
|
||||
(((src) < (dest) && ((const char *)(src) + (count)) <= (char *)(dest)) || \
|
||||
((dest) < (src) && ((char *)(dest) + (count)) <= (const char *)(src)))
|
||||
|
||||
#define SECUREC_MEMORY_IS_OVERLAP(dest, src, count) \
|
||||
(((src) < (dest) && ((const char *)(src) + (count)) > (char *)(dest)) || \
|
||||
((dest) < (src) && ((char *)(dest) + (count)) > (const char *)(src)))
|
||||
|
||||
/*
|
||||
* Check whether the strings overlap, len is the length of the string not include terminator
|
||||
* Length is related to data type char or wchar , do not force conversion of types
|
||||
*/
|
||||
#define SECUREC_STRING_NO_OVERLAP(dest, src, len) \
|
||||
(((src) < (dest) && ((src) + (len)) < (dest)) || \
|
||||
((dest) < (src) && ((dest) + (len)) < (src)))
|
||||
|
||||
/*
|
||||
* Check whether the strings overlap for strcpy wcscpy function, dest len and src Len are not include terminator
|
||||
* Length is related to data type char or wchar , do not force conversion of types
|
||||
*/
|
||||
#define SECUREC_STRING_IS_OVERLAP(dest, src, len) \
|
||||
(((src) < (dest) && ((src) + (len)) >= (dest)) || \
|
||||
((dest) < (src) && ((dest) + (len)) >= (src)))
|
||||
|
||||
/*
|
||||
* Check whether the strings overlap for strcat wcscat function, dest len and src Len are not include terminator
|
||||
* Length is related to data type char or wchar , do not force conversion of types
|
||||
*/
|
||||
#define SECUREC_CAT_STRING_IS_OVERLAP(dest, destLen, src, srcLen) \
|
||||
(((dest) < (src) && ((dest) + (destLen) + (srcLen)) >= (src)) || \
|
||||
((src) < (dest) && ((src) + (srcLen)) >= (dest)))
|
||||
|
||||
#if SECUREC_HAVE_STRNLEN
|
||||
#define SECUREC_CALC_STR_LEN(str, maxLen, outLen) do { \
|
||||
*(outLen) = strnlen((str), (maxLen)); \
|
||||
} SECUREC_WHILE_ZERO
|
||||
#define SECUREC_CALC_STR_LEN_OPT(str, maxLen, outLen) do { \
|
||||
if ((maxLen) > 8) { \
|
||||
/* Optimization or len less then 8 */ \
|
||||
if (*((str) + 0) == '\0') { \
|
||||
*(outLen) = 0; \
|
||||
} else if (*((str) + 1) == '\0') { \
|
||||
*(outLen) = 1; \
|
||||
} else if (*((str) + 2) == '\0') { \
|
||||
*(outLen) = 2; \
|
||||
} else if (*((str) + 3) == '\0') { \
|
||||
*(outLen) = 3; \
|
||||
} else if (*((str) + 4) == '\0') { \
|
||||
*(outLen) = 4; \
|
||||
} else if (*((str) + 5) == '\0') { \
|
||||
*(outLen) = 5; \
|
||||
} else if (*((str) + 6) == '\0') { \
|
||||
*(outLen) = 6; \
|
||||
} else if (*((str) + 7) == '\0') { \
|
||||
*(outLen) = 7; \
|
||||
} else if (*((str) + 8) == '\0') { \
|
||||
/* Optimization with a length of 8 */ \
|
||||
*(outLen) = 8; \
|
||||
} else { \
|
||||
/* The offset is 8 because the performance of 8 byte alignment is high */ \
|
||||
*(outLen) = 8 + strnlen((str) + 8, (maxLen) - 8); \
|
||||
} \
|
||||
} else { \
|
||||
SECUREC_CALC_STR_LEN((str), (maxLen), (outLen)); \
|
||||
} \
|
||||
} SECUREC_WHILE_ZERO
|
||||
#else
|
||||
#define SECUREC_CALC_STR_LEN(str, maxLen, outLen) do { \
|
||||
const char *strEnd_ = (const char *)(str); \
|
||||
size_t availableSize_ = (size_t)(maxLen); \
|
||||
while (availableSize_ > 0 && *strEnd_ != '\0') { \
|
||||
--availableSize_; \
|
||||
++strEnd_; \
|
||||
} \
|
||||
*(outLen) = (size_t)(strEnd_ - (str)); \
|
||||
} SECUREC_WHILE_ZERO
|
||||
#define SECUREC_CALC_STR_LEN_OPT SECUREC_CALC_STR_LEN
|
||||
#endif
|
||||
|
||||
#define SECUREC_CALC_WSTR_LEN(str, maxLen, outLen) do { \
|
||||
const wchar_t *strEnd_ = (const wchar_t *)(str); \
|
||||
size_t len_ = 0; \
|
||||
while (len_ < (maxLen) && *strEnd_ != L'\0') { \
|
||||
++len_; \
|
||||
++strEnd_; \
|
||||
} \
|
||||
*(outLen) = len_; \
|
||||
} SECUREC_WHILE_ZERO
|
||||
|
||||
/*
|
||||
* Performance optimization, product may disable inline function.
|
||||
* Using function pointer for MEMSET to prevent compiler optimization when cleaning up memory.
|
||||
*/
|
||||
#ifdef SECUREC_USE_ASM
|
||||
#define SECUREC_MEMSET_FUNC_OPT memset_opt
|
||||
#define SECUREC_MEMCPY_FUNC_OPT memcpy_opt
|
||||
#else
|
||||
#define SECUREC_MEMSET_FUNC_OPT memset
|
||||
#define SECUREC_MEMCPY_FUNC_OPT memcpy
|
||||
#endif
|
||||
|
||||
#define SECUREC_MEMCPY_WARP_OPT(dest, src, count) (void)SECUREC_MEMCPY_FUNC_OPT((dest), (src), (count))
|
||||
|
||||
#ifndef SECUREC_MEMSET_INDIRECT_USE
|
||||
/* Can be turned off for scenarios that do not allow pointer calls */
|
||||
#define SECUREC_MEMSET_INDIRECT_USE 1
|
||||
#endif
|
||||
|
||||
#if SECUREC_MEMSET_INDIRECT_USE
|
||||
#define SECUREC_MEMSET_WARP_OPT(dest, value, count) do { \
|
||||
void *(* const volatile fn_)(void *s_, int c_, size_t n_) = SECUREC_MEMSET_FUNC_OPT; \
|
||||
(void)(*fn_)((dest), (value), (count)); \
|
||||
} SECUREC_WHILE_ZERO
|
||||
#else
|
||||
#define SECUREC_MEMSET_WARP_OPT(dest, value, count) (void)SECUREC_MEMSET_FUNC_OPT((dest), (value), (count))
|
||||
#endif
|
||||
|
||||
#ifdef SECUREC_FORMAT_OUTPUT_INPUT
|
||||
#if defined(SECUREC_COMPATIBLE_WIN_FORMAT) || defined(__ARMCC_VERSION)
|
||||
typedef __int64 SecInt64;
|
||||
typedef unsigned __int64 SecUnsignedInt64;
|
||||
#if defined(__ARMCC_VERSION)
|
||||
typedef unsigned int SecUnsignedInt32;
|
||||
#else
|
||||
typedef unsigned __int32 SecUnsignedInt32;
|
||||
#endif
|
||||
#else
|
||||
typedef unsigned int SecUnsignedInt32;
|
||||
typedef long long SecInt64;
|
||||
typedef unsigned long long SecUnsignedInt64;
|
||||
#endif
|
||||
|
||||
#ifdef SECUREC_FOR_WCHAR
|
||||
#if defined(SECUREC_VXWORKS_PLATFORM) && !defined(__WINT_TYPE__)
|
||||
typedef wchar_t wint_t;
|
||||
#endif
|
||||
#ifndef WEOF
|
||||
#define WEOF ((wchar_t)(-1))
|
||||
#endif
|
||||
#define SECUREC_CHAR(x) L ## x
|
||||
typedef wchar_t SecChar;
|
||||
typedef wchar_t SecUnsignedChar;
|
||||
typedef wint_t SecInt;
|
||||
typedef wint_t SecUnsignedInt;
|
||||
#else /* no SECUREC_FOR_WCHAR */
|
||||
#define SECUREC_CHAR(x) (x)
|
||||
typedef char SecChar;
|
||||
typedef unsigned char SecUnsignedChar;
|
||||
typedef int SecInt;
|
||||
typedef unsigned int SecUnsignedInt;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Determine whether the address is 8-byte aligned
|
||||
* Some systems do not have uintptr_t type, so use NULL to clear tool alarm 507
|
||||
*/
|
||||
#define SECUREC_ADDR_ALIGNED_8(addr) ((((size_t)(addr)) & 7U) == 0) /* Use 7 to check aligned 8 */
|
||||
|
||||
/*
|
||||
* If you define the memory allocation function, you need to define the function prototype.
|
||||
* You can define this macro as a header file.
|
||||
*/
|
||||
#if defined(SECUREC_MALLOC_PROTOTYPE)
|
||||
SECUREC_MALLOC_PROTOTYPE
|
||||
#endif
|
||||
|
||||
#ifndef SECUREC_MALLOC
|
||||
#define SECUREC_MALLOC(x) malloc((size_t)(x))
|
||||
#endif
|
||||
|
||||
#ifndef SECUREC_FREE
|
||||
#define SECUREC_FREE(x) free((void *)(x))
|
||||
#endif
|
||||
|
||||
/* Improve performance with struct assignment, buf1 is not defined to avoid tool false positive */
|
||||
#define SECUREC_COPY_VALUE_BY_STRUCT(dest, src, n) do { \
|
||||
*(SecStrBuf##n *)(void *)(dest) = *(const SecStrBuf##n *)(const void *)(src); \
|
||||
} SECUREC_WHILE_ZERO
|
||||
|
||||
typedef struct {
|
||||
unsigned char buf[2]; /* Performance optimization code structure assignment length 2 bytes */
|
||||
} SecStrBuf2;
|
||||
typedef struct {
|
||||
unsigned char buf[3]; /* Performance optimization code structure assignment length 3 bytes */
|
||||
} SecStrBuf3;
|
||||
typedef struct {
|
||||
unsigned char buf[4]; /* Performance optimization code structure assignment length 4 bytes */
|
||||
} SecStrBuf4;
|
||||
typedef struct {
|
||||
unsigned char buf[5]; /* Performance optimization code structure assignment length 5 bytes */
|
||||
} SecStrBuf5;
|
||||
typedef struct {
|
||||
unsigned char buf[6]; /* Performance optimization code structure assignment length 6 bytes */
|
||||
} SecStrBuf6;
|
||||
typedef struct {
|
||||
unsigned char buf[7]; /* Performance optimization code structure assignment length 7 bytes */
|
||||
} SecStrBuf7;
|
||||
typedef struct {
|
||||
unsigned char buf[8]; /* Performance optimization code structure assignment length 8 bytes */
|
||||
} SecStrBuf8;
|
||||
typedef struct {
|
||||
unsigned char buf[9]; /* Performance optimization code structure assignment length 9 bytes */
|
||||
} SecStrBuf9;
|
||||
typedef struct {
|
||||
unsigned char buf[10]; /* Performance optimization code structure assignment length 10 bytes */
|
||||
} SecStrBuf10;
|
||||
typedef struct {
|
||||
unsigned char buf[11]; /* Performance optimization code structure assignment length 11 bytes */
|
||||
} SecStrBuf11;
|
||||
typedef struct {
|
||||
unsigned char buf[12]; /* Performance optimization code structure assignment length 12 bytes */
|
||||
} SecStrBuf12;
|
||||
typedef struct {
|
||||
unsigned char buf[13]; /* Performance optimization code structure assignment length 13 bytes */
|
||||
} SecStrBuf13;
|
||||
typedef struct {
|
||||
unsigned char buf[14]; /* Performance optimization code structure assignment length 14 bytes */
|
||||
} SecStrBuf14;
|
||||
typedef struct {
|
||||
unsigned char buf[15]; /* Performance optimization code structure assignment length 15 bytes */
|
||||
} SecStrBuf15;
|
||||
typedef struct {
|
||||
unsigned char buf[16]; /* Performance optimization code structure assignment length 16 bytes */
|
||||
} SecStrBuf16;
|
||||
typedef struct {
|
||||
unsigned char buf[17]; /* Performance optimization code structure assignment length 17 bytes */
|
||||
} SecStrBuf17;
|
||||
typedef struct {
|
||||
unsigned char buf[18]; /* Performance optimization code structure assignment length 18 bytes */
|
||||
} SecStrBuf18;
|
||||
typedef struct {
|
||||
unsigned char buf[19]; /* Performance optimization code structure assignment length 19 bytes */
|
||||
} SecStrBuf19;
|
||||
typedef struct {
|
||||
unsigned char buf[20]; /* Performance optimization code structure assignment length 20 bytes */
|
||||
} SecStrBuf20;
|
||||
typedef struct {
|
||||
unsigned char buf[21]; /* Performance optimization code structure assignment length 21 bytes */
|
||||
} SecStrBuf21;
|
||||
typedef struct {
|
||||
unsigned char buf[22]; /* Performance optimization code structure assignment length 22 bytes */
|
||||
} SecStrBuf22;
|
||||
typedef struct {
|
||||
unsigned char buf[23]; /* Performance optimization code structure assignment length 23 bytes */
|
||||
} SecStrBuf23;
|
||||
typedef struct {
|
||||
unsigned char buf[24]; /* Performance optimization code structure assignment length 24 bytes */
|
||||
} SecStrBuf24;
|
||||
typedef struct {
|
||||
unsigned char buf[25]; /* Performance optimization code structure assignment length 25 bytes */
|
||||
} SecStrBuf25;
|
||||
typedef struct {
|
||||
unsigned char buf[26]; /* Performance optimization code structure assignment length 26 bytes */
|
||||
} SecStrBuf26;
|
||||
typedef struct {
|
||||
unsigned char buf[27]; /* Performance optimization code structure assignment length 27 bytes */
|
||||
} SecStrBuf27;
|
||||
typedef struct {
|
||||
unsigned char buf[28]; /* Performance optimization code structure assignment length 28 bytes */
|
||||
} SecStrBuf28;
|
||||
typedef struct {
|
||||
unsigned char buf[29]; /* Performance optimization code structure assignment length 29 bytes */
|
||||
} SecStrBuf29;
|
||||
typedef struct {
|
||||
unsigned char buf[30]; /* Performance optimization code structure assignment length 30 bytes */
|
||||
} SecStrBuf30;
|
||||
typedef struct {
|
||||
unsigned char buf[31]; /* Performance optimization code structure assignment length 31 bytes */
|
||||
} SecStrBuf31;
|
||||
typedef struct {
|
||||
unsigned char buf[32]; /* Performance optimization code structure assignment length 32 bytes */
|
||||
} SecStrBuf32;
|
||||
typedef struct {
|
||||
unsigned char buf[33]; /* Performance optimization code structure assignment length 33 bytes */
|
||||
} SecStrBuf33;
|
||||
typedef struct {
|
||||
unsigned char buf[34]; /* Performance optimization code structure assignment length 34 bytes */
|
||||
} SecStrBuf34;
|
||||
typedef struct {
|
||||
unsigned char buf[35]; /* Performance optimization code structure assignment length 35 bytes */
|
||||
} SecStrBuf35;
|
||||
typedef struct {
|
||||
unsigned char buf[36]; /* Performance optimization code structure assignment length 36 bytes */
|
||||
} SecStrBuf36;
|
||||
typedef struct {
|
||||
unsigned char buf[37]; /* Performance optimization code structure assignment length 37 bytes */
|
||||
} SecStrBuf37;
|
||||
typedef struct {
|
||||
unsigned char buf[38]; /* Performance optimization code structure assignment length 38 bytes */
|
||||
} SecStrBuf38;
|
||||
typedef struct {
|
||||
unsigned char buf[39]; /* Performance optimization code structure assignment length 39 bytes */
|
||||
} SecStrBuf39;
|
||||
typedef struct {
|
||||
unsigned char buf[40]; /* Performance optimization code structure assignment length 40 bytes */
|
||||
} SecStrBuf40;
|
||||
typedef struct {
|
||||
unsigned char buf[41]; /* Performance optimization code structure assignment length 41 bytes */
|
||||
} SecStrBuf41;
|
||||
typedef struct {
|
||||
unsigned char buf[42]; /* Performance optimization code structure assignment length 42 bytes */
|
||||
} SecStrBuf42;
|
||||
typedef struct {
|
||||
unsigned char buf[43]; /* Performance optimization code structure assignment length 43 bytes */
|
||||
} SecStrBuf43;
|
||||
typedef struct {
|
||||
unsigned char buf[44]; /* Performance optimization code structure assignment length 44 bytes */
|
||||
} SecStrBuf44;
|
||||
typedef struct {
|
||||
unsigned char buf[45]; /* Performance optimization code structure assignment length 45 bytes */
|
||||
} SecStrBuf45;
|
||||
typedef struct {
|
||||
unsigned char buf[46]; /* Performance optimization code structure assignment length 46 bytes */
|
||||
} SecStrBuf46;
|
||||
typedef struct {
|
||||
unsigned char buf[47]; /* Performance optimization code structure assignment length 47 bytes */
|
||||
} SecStrBuf47;
|
||||
typedef struct {
|
||||
unsigned char buf[48]; /* Performance optimization code structure assignment length 48 bytes */
|
||||
} SecStrBuf48;
|
||||
typedef struct {
|
||||
unsigned char buf[49]; /* Performance optimization code structure assignment length 49 bytes */
|
||||
} SecStrBuf49;
|
||||
typedef struct {
|
||||
unsigned char buf[50]; /* Performance optimization code structure assignment length 50 bytes */
|
||||
} SecStrBuf50;
|
||||
typedef struct {
|
||||
unsigned char buf[51]; /* Performance optimization code structure assignment length 51 bytes */
|
||||
} SecStrBuf51;
|
||||
typedef struct {
|
||||
unsigned char buf[52]; /* Performance optimization code structure assignment length 52 bytes */
|
||||
} SecStrBuf52;
|
||||
typedef struct {
|
||||
unsigned char buf[53]; /* Performance optimization code structure assignment length 53 bytes */
|
||||
} SecStrBuf53;
|
||||
typedef struct {
|
||||
unsigned char buf[54]; /* Performance optimization code structure assignment length 54 bytes */
|
||||
} SecStrBuf54;
|
||||
typedef struct {
|
||||
unsigned char buf[55]; /* Performance optimization code structure assignment length 55 bytes */
|
||||
} SecStrBuf55;
|
||||
typedef struct {
|
||||
unsigned char buf[56]; /* Performance optimization code structure assignment length 56 bytes */
|
||||
} SecStrBuf56;
|
||||
typedef struct {
|
||||
unsigned char buf[57]; /* Performance optimization code structure assignment length 57 bytes */
|
||||
} SecStrBuf57;
|
||||
typedef struct {
|
||||
unsigned char buf[58]; /* Performance optimization code structure assignment length 58 bytes */
|
||||
} SecStrBuf58;
|
||||
typedef struct {
|
||||
unsigned char buf[59]; /* Performance optimization code structure assignment length 59 bytes */
|
||||
} SecStrBuf59;
|
||||
typedef struct {
|
||||
unsigned char buf[60]; /* Performance optimization code structure assignment length 60 bytes */
|
||||
} SecStrBuf60;
|
||||
typedef struct {
|
||||
unsigned char buf[61]; /* Performance optimization code structure assignment length 61 bytes */
|
||||
} SecStrBuf61;
|
||||
typedef struct {
|
||||
unsigned char buf[62]; /* Performance optimization code structure assignment length 62 bytes */
|
||||
} SecStrBuf62;
|
||||
typedef struct {
|
||||
unsigned char buf[63]; /* Performance optimization code structure assignment length 63 bytes */
|
||||
} SecStrBuf63;
|
||||
typedef struct {
|
||||
unsigned char buf[64]; /* Performance optimization code structure assignment length 64 bytes */
|
||||
} SecStrBuf64;
|
||||
|
||||
/*
|
||||
* User can change the error handler by modify the following definition,
|
||||
* such as logging the detail error in file.
|
||||
*/
|
||||
#if defined(_DEBUG) || defined(DEBUG)
|
||||
#if defined(SECUREC_ERROR_HANDLER_BY_ASSERT)
|
||||
#define SECUREC_ERROR_INVALID_PARAMTER(msg) assert(msg "invalid argument" == NULL)
|
||||
#define SECUREC_ERROR_INVALID_RANGE(msg) assert(msg "invalid dest buffer size" == NULL)
|
||||
#define SECUREC_ERROR_BUFFER_OVERLAP(msg) assert(msg "buffer overlap" == NULL)
|
||||
#elif defined(SECUREC_ERROR_HANDLER_BY_PRINTF)
|
||||
#if SECUREC_IN_KERNEL
|
||||
#define SECUREC_ERROR_INVALID_PARAMTER(msg) printk("%s invalid argument\n", msg)
|
||||
#define SECUREC_ERROR_INVALID_RANGE(msg) printk("%s invalid dest buffer size\n", msg)
|
||||
#define SECUREC_ERROR_BUFFER_OVERLAP(msg) printk("%s buffer overlap\n", msg)
|
||||
#else
|
||||
#define SECUREC_ERROR_INVALID_PARAMTER(msg) printf("%s invalid argument\n", msg)
|
||||
#define SECUREC_ERROR_INVALID_RANGE(msg) printf("%s invalid dest buffer size\n", msg)
|
||||
#define SECUREC_ERROR_BUFFER_OVERLAP(msg) printf("%s buffer overlap\n", msg)
|
||||
#endif
|
||||
#elif defined(SECUREC_ERROR_HANDLER_BY_FILE_LOG)
|
||||
#define SECUREC_ERROR_INVALID_PARAMTER(msg) LogSecureCRuntimeError(msg " EINVAL\n")
|
||||
#define SECUREC_ERROR_INVALID_RANGE(msg) LogSecureCRuntimeError(msg " ERANGE\n")
|
||||
#define SECUREC_ERROR_BUFFER_OVERLAP(msg) LogSecureCRuntimeError(msg " EOVERLAP\n")
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Default handler is none */
|
||||
#ifndef SECUREC_ERROR_INVALID_PARAMTER
|
||||
#define SECUREC_ERROR_INVALID_PARAMTER(msg)
|
||||
#endif
|
||||
#ifndef SECUREC_ERROR_INVALID_RANGE
|
||||
#define SECUREC_ERROR_INVALID_RANGE(msg)
|
||||
#endif
|
||||
#ifndef SECUREC_ERROR_BUFFER_OVERLAP
|
||||
#define SECUREC_ERROR_BUFFER_OVERLAP(msg)
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Assembly language memory copy and memory set for X86 or MIPS ... */
|
||||
#ifdef SECUREC_USE_ASM
|
||||
void *memcpy_opt(void *dest, const void *src, size_t n);
|
||||
void *memset_opt(void *s, int c, size_t n);
|
||||
#endif
|
||||
|
||||
#if defined(SECUREC_ERROR_HANDLER_BY_FILE_LOG)
|
||||
void LogSecureCRuntimeError(const char *errDetail);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
#endif
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: By defining data type for ANSI string and including "input.inl",
|
||||
* this file generates real underlying function used by scanf family API.
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#define SECUREC_FORMAT_OUTPUT_INPUT 1
|
||||
#ifdef SECUREC_FOR_WCHAR
|
||||
#undef SECUREC_FOR_WCHAR
|
||||
#endif
|
||||
|
||||
#include "secinput.h"
|
||||
|
||||
#include "input.inl"
|
||||
|
||||
SECUREC_INLINE int SecIsDigit(SecInt ch)
|
||||
{
|
||||
/* SecInt to unsigned char clear 571, use bit mask to clear negative return of ch */
|
||||
return isdigit((int)((unsigned int)(unsigned char)(ch) & 0xffU));
|
||||
}
|
||||
SECUREC_INLINE int SecIsXdigit(SecInt ch)
|
||||
{
|
||||
return isxdigit((int)((unsigned int)(unsigned char)(ch) & 0xffU));
|
||||
}
|
||||
SECUREC_INLINE int SecIsSpace(SecInt ch)
|
||||
{
|
||||
return isspace((int)((unsigned int)(unsigned char)(ch) & 0xffU));
|
||||
}
|
||||
|
|
@ -1,78 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: By defining data type for UNICODE string and including "input.inl",
|
||||
* this file generates real underlying function used by scanf family API.
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
/* If some platforms don't have wchar.h, dont't include it */
|
||||
#if !(defined(SECUREC_VXWORKS_PLATFORM))
|
||||
/* If there is no macro below, it will cause vs2010 compiling alarm */
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
|
||||
#ifndef __STDC_WANT_SECURE_LIB__
|
||||
/* The order of adjustment is to eliminate alarm of Duplicate Block */
|
||||
#define __STDC_WANT_SECURE_LIB__ 0
|
||||
#endif
|
||||
#ifndef _CRTIMP_ALTERNATIVE
|
||||
#define _CRTIMP_ALTERNATIVE /* Comment microsoft *_s function */
|
||||
#endif
|
||||
#endif
|
||||
#include <wchar.h>
|
||||
#endif
|
||||
|
||||
/* fix redefined */
|
||||
#undef SECUREC_ENABLE_WCHAR_FUNC
|
||||
/* Disable wchar func to clear vs warning */
|
||||
#define SECUREC_ENABLE_WCHAR_FUNC 0
|
||||
#define SECUREC_FORMAT_OUTPUT_INPUT 1
|
||||
|
||||
#ifndef SECUREC_FOR_WCHAR
|
||||
#define SECUREC_FOR_WCHAR
|
||||
#endif
|
||||
|
||||
#include "secinput.h"
|
||||
|
||||
#include "input.inl"
|
||||
|
||||
SECUREC_INLINE unsigned int SecWcharHighBits(SecInt ch)
|
||||
{
|
||||
/* Convert int to unsigned int clear 571 */
|
||||
return ((unsigned int)(int)ch & (~0xffU));
|
||||
}
|
||||
|
||||
SECUREC_INLINE unsigned char SecWcharLowByte(SecInt ch)
|
||||
{
|
||||
/* Convert int to unsigned int clear 571 */
|
||||
return (unsigned char)((unsigned int)(int)ch & 0xffU);
|
||||
}
|
||||
|
||||
SECUREC_INLINE int SecIsDigit(SecInt ch)
|
||||
{
|
||||
if (SecWcharHighBits(ch) != 0) {
|
||||
return 0; /* Same as isdigit */
|
||||
}
|
||||
return isdigit((int)SecWcharLowByte(ch));
|
||||
}
|
||||
|
||||
SECUREC_INLINE int SecIsXdigit(SecInt ch)
|
||||
{
|
||||
if (SecWcharHighBits(ch) != 0) {
|
||||
return 0; /* Same as isxdigit */
|
||||
}
|
||||
return isxdigit((int)SecWcharLowByte(ch));
|
||||
}
|
||||
|
||||
SECUREC_INLINE int SecIsSpace(SecInt ch)
|
||||
{
|
||||
return iswspace((wint_t)(int)(ch));
|
||||
}
|
||||
|
|
@ -1,124 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: Define macro, enum, data struct, and declare internal used function
|
||||
* prototype, which is used by output.inl, secureprintoutput_w.c and
|
||||
* secureprintoutput_a.c.
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#ifndef SECUREPRINTOUTPUT_H_E950DA2C_902F_4B15_BECD_948E99090D9C
|
||||
#define SECUREPRINTOUTPUT_H_E950DA2C_902F_4B15_BECD_948E99090D9C
|
||||
#include "securecutil.h"
|
||||
|
||||
/*
|
||||
* Flag definitions.
|
||||
* Using macros instead of enumerations is because some of the enumerated types under the compiler are 16bit.
|
||||
*/
|
||||
#define SECUREC_FLAG_SIGN 0x00001U
|
||||
#define SECUREC_FLAG_SIGN_SPACE 0x00002U
|
||||
#define SECUREC_FLAG_LEFT 0x00004U
|
||||
#define SECUREC_FLAG_LEADZERO 0x00008U
|
||||
#define SECUREC_FLAG_LONG 0x00010U
|
||||
#define SECUREC_FLAG_SHORT 0x00020U
|
||||
#define SECUREC_FLAG_SIGNED 0x00040U
|
||||
#define SECUREC_FLAG_ALTERNATE 0x00080U
|
||||
#define SECUREC_FLAG_NEGATIVE 0x00100U
|
||||
#define SECUREC_FLAG_FORCE_OCTAL 0x00200U
|
||||
#define SECUREC_FLAG_LONG_DOUBLE 0x00400U
|
||||
#define SECUREC_FLAG_WIDECHAR 0x00800U
|
||||
#define SECUREC_FLAG_LONGLONG 0x01000U
|
||||
#define SECUREC_FLAG_CHAR 0x02000U
|
||||
#define SECUREC_FLAG_POINTER 0x04000U
|
||||
#define SECUREC_FLAG_I64 0x08000U
|
||||
#define SECUREC_FLAG_PTRDIFF 0x10000U
|
||||
#define SECUREC_FLAG_SIZE 0x20000U
|
||||
#ifdef SECUREC_COMPATIBLE_LINUX_FORMAT
|
||||
#define SECUREC_FLAG_INTMAX 0x40000U
|
||||
#endif
|
||||
|
||||
/* State definitions. Identify the status of the current format */
|
||||
typedef enum {
|
||||
STAT_NORMAL,
|
||||
STAT_PERCENT,
|
||||
STAT_FLAG,
|
||||
STAT_WIDTH,
|
||||
STAT_DOT,
|
||||
STAT_PRECIS,
|
||||
STAT_SIZE,
|
||||
STAT_TYPE,
|
||||
STAT_INVALID
|
||||
} SecFmtState;
|
||||
|
||||
/* Format output buffer pointer and available size */
|
||||
typedef struct {
|
||||
int count;
|
||||
char *cur;
|
||||
} SecPrintfStream;
|
||||
|
||||
#ifndef SECUREC_BUFFER_SIZE
|
||||
#if SECUREC_IN_KERNEL
|
||||
#define SECUREC_BUFFER_SIZE 32
|
||||
#elif defined(SECUREC_STACK_SIZE_LESS_THAN_1K)
|
||||
/*
|
||||
* SECUREC BUFFER SIZE Can not be less than 23
|
||||
* The length of the octal representation of 64-bit integers with zero lead
|
||||
*/
|
||||
#define SECUREC_BUFFER_SIZE 256
|
||||
#else
|
||||
#define SECUREC_BUFFER_SIZE 512
|
||||
#endif
|
||||
#endif
|
||||
#if SECUREC_BUFFER_SIZE < 23
|
||||
#error SECUREC_BUFFER_SIZE Can not be less than 23
|
||||
#endif
|
||||
/* Buffer size for wchar, use 4 to make the compiler aligns as 8 bytes as possible */
|
||||
#define SECUREC_WCHAR_BUFFER_SIZE 4
|
||||
|
||||
#define SECUREC_MAX_PRECISION SECUREC_BUFFER_SIZE
|
||||
/* Max. # bytes in multibyte char ,see MB_LEN_MAX */
|
||||
#define SECUREC_MB_LEN 16
|
||||
/* The return value of the internal function, which is returned when truncated */
|
||||
#define SECUREC_PRINTF_TRUNCATE (-2)
|
||||
|
||||
#define SECUREC_VSPRINTF_PARAM_ERROR(format, strDest, destMax, maxLimit) \
|
||||
((format) == NULL || (strDest) == NULL || (destMax) == 0 || (destMax) > (maxLimit))
|
||||
|
||||
#define SECUREC_VSPRINTF_CLEAR_DEST(strDest, destMax, maxLimit) do { \
|
||||
if ((strDest) != NULL && (destMax) > 0 && (destMax) <= (maxLimit)) { \
|
||||
*(strDest) = '\0'; \
|
||||
} \
|
||||
} SECUREC_WHILE_ZERO
|
||||
|
||||
#ifdef SECUREC_COMPATIBLE_WIN_FORMAT
|
||||
#define SECUREC_VSNPRINTF_PARAM_ERROR(format, strDest, destMax, count, maxLimit) \
|
||||
(((format) == NULL || (strDest) == NULL || (destMax) == 0 || (destMax) > (maxLimit)) || \
|
||||
((count) > (SECUREC_STRING_MAX_LEN - 1) && (count) != (size_t)(-1)))
|
||||
|
||||
#else
|
||||
#define SECUREC_VSNPRINTF_PARAM_ERROR(format, strDest, destMax, count, maxLimit) \
|
||||
(((format) == NULL || (strDest) == NULL || (destMax) == 0 || (destMax) > (maxLimit)) || \
|
||||
((count) > (SECUREC_STRING_MAX_LEN - 1)))
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
int SecVsnprintfImpl(char *string, size_t count, const char *format, va_list argList);
|
||||
#ifdef SECUREC_FOR_WCHAR
|
||||
int SecVswprintfImpl(wchar_t *string, size_t sizeInWchar, const wchar_t *format, va_list argList);
|
||||
#endif
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -1,174 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: By defining corresponding macro for ANSI string and including "output.inl",
|
||||
* this file generates real underlying function used by printf family API.
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#define SECUREC_FORMAT_OUTPUT_INPUT 1
|
||||
|
||||
#ifdef SECUREC_FOR_WCHAR
|
||||
#undef SECUREC_FOR_WCHAR
|
||||
#endif
|
||||
|
||||
#include "secureprintoutput.h"
|
||||
#if SECUREC_WARP_OUTPUT
|
||||
#define SECUREC_FORMAT_FLAG_TABLE_SIZE 128
|
||||
SECUREC_INLINE const char *SecSkipKnownFlags(const char *format)
|
||||
{
|
||||
static const unsigned char flagTable[SECUREC_FORMAT_FLAG_TABLE_SIZE] = {
|
||||
/*
|
||||
* Known flag is "0123456789 +-#hlLwZzjqt*I$"
|
||||
*/
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00,
|
||||
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
const char *fmt = format;
|
||||
while (*fmt != '\0') {
|
||||
char fmtChar = *fmt;
|
||||
if ((unsigned char)fmtChar > 0x7f) { /* 0x7f is upper limit of format char value */
|
||||
break;
|
||||
}
|
||||
if (flagTable[(unsigned char)fmtChar] == 0) {
|
||||
break;
|
||||
}
|
||||
++fmt;
|
||||
}
|
||||
return fmt;
|
||||
}
|
||||
|
||||
SECUREC_INLINE int SecFormatContainN(const char *format)
|
||||
{
|
||||
const char *fmt = format;
|
||||
while (*fmt != '\0') {
|
||||
++fmt;
|
||||
/* Skip normal char */
|
||||
if (*(fmt - 1) != '%') {
|
||||
continue;
|
||||
}
|
||||
/* Meet %% */
|
||||
if (*fmt == '%') {
|
||||
++fmt; /* Point to the character after the %. Correct handling %%xx */
|
||||
continue;
|
||||
}
|
||||
/* Now parse %..., fmt point to the character after the % */
|
||||
fmt = SecSkipKnownFlags(fmt);
|
||||
if (*fmt == 'n') {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
* Multi character formatted output implementation, the count include \0 character, must be greater than zero
|
||||
*/
|
||||
int SecVsnprintfImpl(char *string, size_t count, const char *format, va_list argList)
|
||||
{
|
||||
int retVal;
|
||||
if (SecFormatContainN(format) != 0) {
|
||||
string[0] = '\0';
|
||||
return -1;
|
||||
}
|
||||
retVal = vsnprintf(string, count, format, argList);
|
||||
if (retVal >= (int)count) { /* The size_t to int is ok, count max is SECUREC_STRING_MAX_LEN */
|
||||
/* The buffer was too small; we return truncation */
|
||||
string[count - 1] = '\0';
|
||||
return SECUREC_PRINTF_TRUNCATE;
|
||||
}
|
||||
if (retVal < 0) {
|
||||
string[0] = '\0'; /* Empty the dest strDest */
|
||||
return -1;
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
#else
|
||||
#if SECUREC_IN_KERNEL
|
||||
#include <linux/ctype.h>
|
||||
#endif
|
||||
|
||||
#ifndef EOF
|
||||
#define EOF (-1)
|
||||
#endif
|
||||
|
||||
#include "output.inl"
|
||||
|
||||
/*
|
||||
* Multi character formatted output implementation
|
||||
*/
|
||||
int SecVsnprintfImpl(char *string, size_t count, const char *format, va_list argList)
|
||||
{
|
||||
SecPrintfStream str;
|
||||
int retVal;
|
||||
|
||||
str.count = (int)count; /* The count include \0 character, must be greater than zero */
|
||||
str.cur = string;
|
||||
|
||||
retVal = SecOutputS(&str, format, argList);
|
||||
if (retVal >= 0) {
|
||||
if (SecPutZeroChar(&str) == 0) {
|
||||
return retVal;
|
||||
}
|
||||
}
|
||||
if (str.count < 0) {
|
||||
/* The buffer was too small, then truncate */
|
||||
string[count - 1] = '\0';
|
||||
return SECUREC_PRINTF_TRUNCATE;
|
||||
}
|
||||
string[0] = '\0'; /* Empty the dest string */
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Write a wide character
|
||||
*/
|
||||
SECUREC_INLINE void SecWriteMultiChar(char ch, int num, SecPrintfStream *f, int *pnumwritten)
|
||||
{
|
||||
int count;
|
||||
for (count = num; count > 0; --count) {
|
||||
--f->count; /* f -> count may be negative,indicating insufficient space */
|
||||
if (f->count < 0) {
|
||||
*pnumwritten = -1;
|
||||
return;
|
||||
}
|
||||
*(f->cur) = ch;
|
||||
++f->cur;
|
||||
*pnumwritten = *pnumwritten + 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Write string function, where this function is called, make sure that len is greater than 0
|
||||
*/
|
||||
SECUREC_INLINE void SecWriteString(const char *string, int len, SecPrintfStream *f, int *pnumwritten)
|
||||
{
|
||||
const char *str = string;
|
||||
int count;
|
||||
for (count = len; count > 0; --count) {
|
||||
--f->count; /* f -> count may be negative,indicating insufficient space */
|
||||
if (f->count < 0) {
|
||||
*pnumwritten = -1;
|
||||
return;
|
||||
}
|
||||
*(f->cur) = *str;
|
||||
++f->cur;
|
||||
++str;
|
||||
}
|
||||
*pnumwritten = *pnumwritten + (int)(size_t)(str - string);
|
||||
}
|
||||
#endif
|
||||
|
|
@ -1,149 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: By defining corresponding macro for UNICODE string and including "output.inl",
|
||||
* this file generates real underlying function used by printf family API.
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
/* If some platforms don't have wchar.h, dont't include it */
|
||||
#if !(defined(SECUREC_VXWORKS_PLATFORM))
|
||||
/* If there is no macro above, it will cause compiling alarm */
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
|
||||
#ifndef _CRTIMP_ALTERNATIVE
|
||||
#define _CRTIMP_ALTERNATIVE /* Comment microsoft *_s function */
|
||||
#endif
|
||||
#ifndef __STDC_WANT_SECURE_LIB__
|
||||
#define __STDC_WANT_SECURE_LIB__ 0
|
||||
#endif
|
||||
#endif
|
||||
#include <wchar.h>
|
||||
#endif
|
||||
|
||||
/* fix redefined */
|
||||
#undef SECUREC_ENABLE_WCHAR_FUNC
|
||||
/* Disable wchar func to clear vs warning */
|
||||
#define SECUREC_ENABLE_WCHAR_FUNC 0
|
||||
#define SECUREC_FORMAT_OUTPUT_INPUT 1
|
||||
|
||||
#ifndef SECUREC_FOR_WCHAR
|
||||
#define SECUREC_FOR_WCHAR
|
||||
#endif
|
||||
|
||||
#if defined(SECUREC_WARP_OUTPUT) && SECUREC_WARP_OUTPUT
|
||||
#undef SECUREC_WARP_OUTPUT
|
||||
#define SECUREC_WARP_OUTPUT 0
|
||||
#endif
|
||||
|
||||
#include "secureprintoutput.h"
|
||||
|
||||
SECUREC_INLINE void SecWriteCharW(wchar_t ch, SecPrintfStream *f, int *pnumwritten);
|
||||
SECUREC_INLINE int SecPutWcharStrEndingZero(SecPrintfStream *str, int zeroCount);
|
||||
|
||||
#include "output.inl"
|
||||
|
||||
/*
|
||||
* Wide character formatted output implementation
|
||||
*/
|
||||
int SecVswprintfImpl(wchar_t *string, size_t sizeInWchar, const wchar_t *format, va_list argList)
|
||||
{
|
||||
SecPrintfStream str;
|
||||
int retVal; /* If initialization causes e838 */
|
||||
|
||||
str.cur = (char *)string;
|
||||
/* This count include \0 character, Must be greater than zero */
|
||||
str.count = (int)(sizeInWchar * sizeof(wchar_t));
|
||||
|
||||
retVal = SecOutputSW(&str, format, argList);
|
||||
if (retVal >= 0) {
|
||||
if (SecPutWcharStrEndingZero(&str, (int)sizeof(wchar_t)) == 0) {
|
||||
return retVal;
|
||||
}
|
||||
}
|
||||
if (str.count < 0) {
|
||||
/* The buffer was too small, then truncate */
|
||||
string[sizeInWchar - 1] = L'\0';
|
||||
return SECUREC_PRINTF_TRUNCATE;
|
||||
}
|
||||
string[0] = L'\0'; /* Empty the dest string */
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Output a wide character zero end into the SecPrintfStream structure
|
||||
*/
|
||||
SECUREC_INLINE int SecPutWcharStrEndingZero(SecPrintfStream *str, int zeroCount)
|
||||
{
|
||||
int count;
|
||||
for (count = zeroCount; count > 0; --count) {
|
||||
if (SecPutZeroChar(str) != 0) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Output a wide character into the SecPrintfStream structure
|
||||
*/
|
||||
SECUREC_INLINE int SecPutCharW(wchar_t ch, SecPrintfStream *f)
|
||||
{
|
||||
f->count -= (int)sizeof(wchar_t); /* f -> count may be negative,indicating insufficient space */
|
||||
if (f->count >= 0) {
|
||||
*(wchar_t *)(void *)(f->cur) = ch;
|
||||
f->cur += sizeof(wchar_t);
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Output a wide character into the SecPrintfStream structure, returns the number of characters written
|
||||
*/
|
||||
SECUREC_INLINE void SecWriteCharW(wchar_t ch, SecPrintfStream *f, int *pnumwritten)
|
||||
{
|
||||
if (SecPutCharW(ch, f) == 0) {
|
||||
*pnumwritten = *pnumwritten + 1;
|
||||
} else {
|
||||
*pnumwritten = -1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Output multiple wide character into the SecPrintfStream structure, returns the number of characters written
|
||||
*/
|
||||
SECUREC_INLINE void SecWriteMultiCharW(wchar_t ch, int num, SecPrintfStream *f, int *pnumwritten)
|
||||
{
|
||||
int count;
|
||||
for (count = num; count > 0; --count) {
|
||||
SecWriteCharW(ch, f, pnumwritten);
|
||||
if (*pnumwritten == -1) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Output a wide string into the SecPrintfStream structure, returns the number of characters written
|
||||
*/
|
||||
SECUREC_INLINE void SecWriteStringW(const wchar_t *string, int len, SecPrintfStream *f, int *pnumwritten)
|
||||
{
|
||||
const wchar_t *str = string;
|
||||
int count;
|
||||
for (count = len; count > 0; --count) {
|
||||
SecWriteCharW(*str, f, pnumwritten);
|
||||
++str;
|
||||
if (*pnumwritten == -1) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,111 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: snprintf_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securec.h"
|
||||
|
||||
#if SECUREC_ENABLE_SNPRINTF
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The snprintf_s function is equivalent to the snprintf function
|
||||
* except for the parameter destMax/count and the explicit runtime-constraints violation
|
||||
* The snprintf_s function formats and stores count or fewer characters in
|
||||
* strDest and appends a terminating null. Each argument (if any) is converted
|
||||
* and output according to the corresponding format specification in format.
|
||||
* The formatting is consistent with the printf family of functions; If copying
|
||||
* occurs between strings that overlap, the behavior is undefined.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* strDest Storage location for the output.
|
||||
* destMax The size of the storage location for output. Size
|
||||
* in bytes for snprintf_s or size in words for snwprintf_s.
|
||||
* count Maximum number of character to store.
|
||||
* format Format-control string.
|
||||
* ... Optional arguments.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* strDest is updated
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* return the number of characters written, not including the terminating null
|
||||
* return -1 if an error occurs.
|
||||
* return -1 if count < destMax and the output string has been truncated
|
||||
*
|
||||
* If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid
|
||||
*
|
||||
*/
|
||||
int snprintf_s(char *strDest, size_t destMax, size_t count, const char *format, ...)
|
||||
{
|
||||
int ret; /* If initialization causes e838 */
|
||||
va_list argList;
|
||||
|
||||
va_start(argList, format);
|
||||
ret = vsnprintf_s(strDest, destMax, count, format, argList);
|
||||
va_end(argList);
|
||||
(void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */
|
||||
|
||||
return ret;
|
||||
}
|
||||
#if SECUREC_IN_KERNEL
|
||||
EXPORT_SYMBOL(snprintf_s);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if SECUREC_SNPRINTF_TRUNCATED
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The snprintf_truncated_s function is equivalent to the snprintf function
|
||||
* except for the parameter destMax/count and the explicit runtime-constraints violation
|
||||
* The snprintf_truncated_s function formats and stores count or fewer characters in
|
||||
* strDest and appends a terminating null. Each argument (if any) is converted
|
||||
* and output according to the corresponding format specification in format.
|
||||
* The formatting is consistent with the printf family of functions; If copying
|
||||
* occurs between strings that overlap, the behavior is undefined.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* strDest Storage location for the output.
|
||||
* destMax The size of the storage location for output. Size
|
||||
* in bytes for snprintf_truncated_s or size in words for snwprintf_s.
|
||||
* format Format-control string.
|
||||
* ... Optional arguments.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* strDest is updated
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* return the number of characters written, not including the terminating null
|
||||
* return -1 if an error occurs.
|
||||
* return destMax-1 if output string has been truncated
|
||||
*
|
||||
* If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid
|
||||
*
|
||||
*/
|
||||
int snprintf_truncated_s(char *strDest, size_t destMax, const char *format, ...)
|
||||
{
|
||||
int ret; /* If initialization causes e838 */
|
||||
va_list argList;
|
||||
|
||||
va_start(argList, format);
|
||||
ret = vsnprintf_truncated_s(strDest, destMax, format, argList);
|
||||
va_end(argList);
|
||||
(void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */
|
||||
|
||||
return ret;
|
||||
}
|
||||
#if SECUREC_IN_KERNEL
|
||||
EXPORT_SYMBOL(snprintf_truncated_s);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: sprintf_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securec.h"
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The sprintf_s function is equivalent to the sprintf function
|
||||
* except for the parameter destMax and the explicit runtime-constraints violation
|
||||
* The sprintf_s function formats and stores a series of characters and values
|
||||
* in strDest. Each argument (if any) is converted and output according to
|
||||
* the corresponding format specification in format. The format consists of
|
||||
* ordinary characters and has the same form and function as the format argument
|
||||
* for printf. A null character is appended after the last character written.
|
||||
* If copying occurs between strings that overlap, the behavior is undefined.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* strDest Storage location for output.
|
||||
* destMax Maximum number of characters to store.
|
||||
* format Format-control string.
|
||||
* ... Optional arguments
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* strDest is updated
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* return the number of bytes stored in strDest, not counting the terminating null character.
|
||||
* return -1 if an error occurred.
|
||||
*
|
||||
* If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid
|
||||
*/
|
||||
int sprintf_s(char *strDest, size_t destMax, const char *format, ...)
|
||||
{
|
||||
int ret; /* If initialization causes e838 */
|
||||
va_list argList;
|
||||
|
||||
va_start(argList, format);
|
||||
ret = vsprintf_s(strDest, destMax, format, argList);
|
||||
va_end(argList);
|
||||
(void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */
|
||||
|
||||
return ret;
|
||||
}
|
||||
#if SECUREC_IN_KERNEL
|
||||
EXPORT_SYMBOL(sprintf_s);
|
||||
#endif
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: sscanf_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securec.h"
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The sscanf_s function is equivalent to fscanf_s,
|
||||
* except that input is obtained from a string (specified by the argument buffer) rather than from a stream
|
||||
* The sscanf function reads data from buffer into the location given by each
|
||||
* argument. Every argument must be a pointer to a variable with a type that
|
||||
* corresponds to a type specifier in format. The format argument controls the
|
||||
* interpretation of the input fields and has the same form and function as
|
||||
* the format argument for the scanf function.
|
||||
* If copying takes place between strings that overlap, the behavior is undefined.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* buffer Stored data.
|
||||
* format Format control string, see Format Specifications.
|
||||
* ... Optional arguments.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* ... The converted value stored in user assigned address
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* Each of these functions returns the number of fields successfully converted
|
||||
* and assigned; the return value does not include fields that were read but
|
||||
* not assigned.
|
||||
* A return value of 0 indicates that no fields were assigned.
|
||||
* return -1 if an error occurs.
|
||||
*/
|
||||
int sscanf_s(const char *buffer, const char *format, ...)
|
||||
{
|
||||
int ret; /* If initialization causes e838 */
|
||||
va_list argList;
|
||||
|
||||
va_start(argList, format);
|
||||
ret = vsscanf_s(buffer, format, argList);
|
||||
va_end(argList);
|
||||
(void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */
|
||||
|
||||
return ret;
|
||||
}
|
||||
#if SECUREC_IN_KERNEL
|
||||
EXPORT_SYMBOL(sscanf_s);
|
||||
#endif
|
||||
|
|
@ -1,102 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: strcat_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securecutil.h"
|
||||
|
||||
/*
|
||||
* Befor this function, the basic parameter checking has been done
|
||||
*/
|
||||
SECUREC_INLINE errno_t SecDoCat(char *strDest, size_t destMax, const char *strSrc)
|
||||
{
|
||||
size_t destLen;
|
||||
size_t srcLen;
|
||||
size_t maxSrcLen;
|
||||
SECUREC_CALC_STR_LEN(strDest, destMax, &destLen);
|
||||
/* Only optimize strSrc, do not apply this function to strDest */
|
||||
maxSrcLen = destMax - destLen;
|
||||
SECUREC_CALC_STR_LEN_OPT(strSrc, maxSrcLen, &srcLen);
|
||||
|
||||
if (SECUREC_CAT_STRING_IS_OVERLAP(strDest, destLen, strSrc, srcLen)) {
|
||||
strDest[0] = '\0';
|
||||
if (strDest + destLen <= strSrc && destLen == destMax) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("strcat_s");
|
||||
return EINVAL_AND_RESET;
|
||||
}
|
||||
SECUREC_ERROR_BUFFER_OVERLAP("strcat_s");
|
||||
return EOVERLAP_AND_RESET;
|
||||
}
|
||||
if (srcLen + destLen >= destMax || strDest == strSrc) {
|
||||
strDest[0] = '\0';
|
||||
if (destLen == destMax) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("strcat_s");
|
||||
return EINVAL_AND_RESET;
|
||||
}
|
||||
SECUREC_ERROR_INVALID_RANGE("strcat_s");
|
||||
return ERANGE_AND_RESET;
|
||||
}
|
||||
SECUREC_MEMCPY_WARP_OPT(strDest + destLen, strSrc, srcLen + 1); /* Single character length include \0 */
|
||||
return EOK;
|
||||
}
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The strcat_s function appends a copy of the string pointed to by strSrc (including the terminating null character)
|
||||
* to the end of the string pointed to by strDest.
|
||||
* The initial character of strSrc overwrites the terminating null character of strDest.
|
||||
* strcat_s will return EOVERLAP_AND_RESET if the source and destination strings overlap.
|
||||
*
|
||||
* Note that the second parameter is the total size of the buffer, not the
|
||||
* remaining size.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* strDest Null-terminated destination string buffer.
|
||||
* destMax Size of the destination string buffer.
|
||||
* strSrc Null-terminated source string buffer.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* strDest is updated
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* EOK Success
|
||||
* EINVAL strDest is NULL and destMax != 0 and destMax <= SECUREC_STRING_MAX_LEN
|
||||
* EINVAL_AND_RESET (strDest unterminated and all other parameters are valid) or
|
||||
* (strDest != NULL and strSrc is NULL and destMax != 0 and destMax <= SECUREC_STRING_MAX_LEN)
|
||||
* ERANGE destMax is 0 and destMax > SECUREC_STRING_MAX_LEN
|
||||
* ERANGE_AND_RESET strDest have not enough space and all other parameters are valid and not overlap
|
||||
* EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and all parameters are valid
|
||||
*
|
||||
* If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid
|
||||
*/
|
||||
errno_t strcat_s(char *strDest, size_t destMax, const char *strSrc)
|
||||
{
|
||||
if (destMax == 0 || destMax > SECUREC_STRING_MAX_LEN) {
|
||||
SECUREC_ERROR_INVALID_RANGE("strcat_s");
|
||||
return ERANGE;
|
||||
}
|
||||
if (strDest == NULL || strSrc == NULL) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("strcat_s");
|
||||
if (strDest != NULL) {
|
||||
strDest[0] = '\0';
|
||||
return EINVAL_AND_RESET;
|
||||
}
|
||||
return EINVAL;
|
||||
}
|
||||
return SecDoCat(strDest, destMax, strSrc);
|
||||
}
|
||||
|
||||
#if SECUREC_IN_KERNEL
|
||||
EXPORT_SYMBOL(strcat_s);
|
||||
#endif
|
||||
|
|
@ -1,349 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: strcpy_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securecutil.h"
|
||||
|
||||
#ifndef SECUREC_STRCPY_WITH_PERFORMANCE
|
||||
#define SECUREC_STRCPY_WITH_PERFORMANCE 1
|
||||
#endif
|
||||
|
||||
#define SECUREC_STRCPY_PARAM_OK(strDest, destMax, strSrc) ((destMax) > 0 && \
|
||||
(destMax) <= SECUREC_STRING_MAX_LEN && (strDest) != NULL && (strSrc) != NULL && (strDest) != (strSrc))
|
||||
|
||||
#if (!SECUREC_IN_KERNEL) && SECUREC_STRCPY_WITH_PERFORMANCE
|
||||
#ifndef SECUREC_STRCOPY_THRESHOLD_SIZE
|
||||
#define SECUREC_STRCOPY_THRESHOLD_SIZE 32UL
|
||||
#endif
|
||||
/* The purpose of converting to void is to clean up the alarm */
|
||||
#define SECUREC_SMALL_STR_COPY(strDest, strSrc, lenWithTerm) do { \
|
||||
if (SECUREC_ADDR_ALIGNED_8(strDest) && SECUREC_ADDR_ALIGNED_8(strSrc)) { \
|
||||
/* Use struct assignment */ \
|
||||
switch (lenWithTerm) { \
|
||||
case 1: \
|
||||
*(strDest) = *(strSrc); \
|
||||
break; \
|
||||
case 2: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 2); \
|
||||
break; \
|
||||
case 3: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 3); \
|
||||
break; \
|
||||
case 4: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 4); \
|
||||
break; \
|
||||
case 5: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 5); \
|
||||
break; \
|
||||
case 6: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 6); \
|
||||
break; \
|
||||
case 7: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 7); \
|
||||
break; \
|
||||
case 8: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 8); \
|
||||
break; \
|
||||
case 9: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 9); \
|
||||
break; \
|
||||
case 10: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 10); \
|
||||
break; \
|
||||
case 11: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 11); \
|
||||
break; \
|
||||
case 12: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 12); \
|
||||
break; \
|
||||
case 13: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 13); \
|
||||
break; \
|
||||
case 14: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 14); \
|
||||
break; \
|
||||
case 15: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 15); \
|
||||
break; \
|
||||
case 16: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 16); \
|
||||
break; \
|
||||
case 17: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 17); \
|
||||
break; \
|
||||
case 18: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 18); \
|
||||
break; \
|
||||
case 19: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 19); \
|
||||
break; \
|
||||
case 20: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 20); \
|
||||
break; \
|
||||
case 21: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 21); \
|
||||
break; \
|
||||
case 22: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 22); \
|
||||
break; \
|
||||
case 23: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 23); \
|
||||
break; \
|
||||
case 24: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 24); \
|
||||
break; \
|
||||
case 25: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 25); \
|
||||
break; \
|
||||
case 26: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 26); \
|
||||
break; \
|
||||
case 27: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 27); \
|
||||
break; \
|
||||
case 28: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 28); \
|
||||
break; \
|
||||
case 29: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 29); \
|
||||
break; \
|
||||
case 30: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 30); \
|
||||
break; \
|
||||
case 31: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 31); \
|
||||
break; \
|
||||
case 32: \
|
||||
SECUREC_COPY_VALUE_BY_STRUCT((strDest), (strSrc), 32); \
|
||||
break; \
|
||||
default: \
|
||||
/* Do nothing */ \
|
||||
break; \
|
||||
} /* END switch */ \
|
||||
} else { \
|
||||
char *tmpStrDest_ = (char *)(strDest); \
|
||||
const char *tmpStrSrc_ = (const char *)(strSrc); \
|
||||
switch (lenWithTerm) { \
|
||||
case 32: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 31: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 30: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 29: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 28: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 27: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 26: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 25: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 24: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 23: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 22: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 21: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 20: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 19: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 18: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 17: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 16: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 15: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 14: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 13: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 12: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 11: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 10: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 9: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 8: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 7: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 6: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 5: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 4: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 3: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 2: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
case 1: \
|
||||
*(tmpStrDest_++) = *(tmpStrSrc_++); \
|
||||
/* fall-through */ /* FALLTHRU */ \
|
||||
default: \
|
||||
/* Do nothing */ \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
} SECUREC_WHILE_ZERO
|
||||
#endif
|
||||
|
||||
#if SECUREC_IN_KERNEL || (!SECUREC_STRCPY_WITH_PERFORMANCE)
|
||||
#define SECUREC_STRCPY_OPT(dest, src, lenWithTerm) SECUREC_MEMCPY_WARP_OPT((dest), (src), (lenWithTerm))
|
||||
#else
|
||||
/*
|
||||
* Performance optimization. lenWithTerm include '\0'
|
||||
*/
|
||||
#define SECUREC_STRCPY_OPT(dest, src, lenWithTerm) do { \
|
||||
if ((lenWithTerm) > SECUREC_STRCOPY_THRESHOLD_SIZE) { \
|
||||
SECUREC_MEMCPY_WARP_OPT((dest), (src), (lenWithTerm)); \
|
||||
} else { \
|
||||
SECUREC_SMALL_STR_COPY((dest), (src), (lenWithTerm)); \
|
||||
} \
|
||||
} SECUREC_WHILE_ZERO
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Check Src Range
|
||||
*/
|
||||
SECUREC_INLINE errno_t CheckSrcRange(char *strDest, size_t destMax, const char *strSrc)
|
||||
{
|
||||
size_t tmpDestMax = destMax;
|
||||
const char *tmpSrc = strSrc;
|
||||
/* Use destMax as boundary checker and destMax must be greater than zero */
|
||||
while (*tmpSrc != '\0' && tmpDestMax > 0) {
|
||||
++tmpSrc;
|
||||
--tmpDestMax;
|
||||
}
|
||||
if (tmpDestMax == 0) {
|
||||
strDest[0] = '\0';
|
||||
SECUREC_ERROR_INVALID_RANGE("strcpy_s");
|
||||
return ERANGE_AND_RESET;
|
||||
}
|
||||
return EOK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handling errors
|
||||
*/
|
||||
errno_t strcpy_error(char *strDest, size_t destMax, const char *strSrc)
|
||||
{
|
||||
if (destMax == 0 || destMax > SECUREC_STRING_MAX_LEN) {
|
||||
SECUREC_ERROR_INVALID_RANGE("strcpy_s");
|
||||
return ERANGE;
|
||||
}
|
||||
if (strDest == NULL || strSrc == NULL) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("strcpy_s");
|
||||
if (strDest != NULL) {
|
||||
strDest[0] = '\0';
|
||||
return EINVAL_AND_RESET;
|
||||
}
|
||||
return EINVAL;
|
||||
}
|
||||
return CheckSrcRange(strDest, destMax, strSrc);
|
||||
}
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The strcpy_s function copies the string pointed to strSrc
|
||||
* (including the terminating null character) into the array pointed to by strDest
|
||||
* The destination string must be large enough to hold the source string,
|
||||
* including the terminating null character. strcpy_s will return EOVERLAP_AND_RESET
|
||||
* if the source and destination strings overlap.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* strDest Location of destination string buffer
|
||||
* destMax Size of the destination string buffer.
|
||||
* strSrc Null-terminated source string buffer.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* strDest is updated.
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* EOK Success
|
||||
* EINVAL strDest is NULL and destMax != 0 and destMax <= SECUREC_STRING_MAX_LEN
|
||||
* EINVAL_AND_RESET strDest != NULL and strSrc is NULL and destMax != 0 and destMax <= SECUREC_STRING_MAX_LEN
|
||||
* ERANGE destMax is 0 and destMax > SECUREC_STRING_MAX_LEN
|
||||
* ERANGE_AND_RESET strDest have not enough space and all other parameters are valid and not overlap
|
||||
* EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and all parameters are valid
|
||||
*
|
||||
* If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid
|
||||
*/
|
||||
errno_t strcpy_s(char *strDest, size_t destMax, const char *strSrc)
|
||||
{
|
||||
if (SECUREC_STRCPY_PARAM_OK(strDest, destMax, strSrc)) {
|
||||
size_t srcStrLen;
|
||||
SECUREC_CALC_STR_LEN(strSrc, destMax, &srcStrLen);
|
||||
++srcStrLen; /* The length include '\0' */
|
||||
|
||||
if (srcStrLen <= destMax) {
|
||||
/* Use mem overlap check include '\0' */
|
||||
if (SECUREC_MEMORY_NO_OVERLAP(strDest, strSrc, srcStrLen)) {
|
||||
/* Performance optimization srcStrLen include '\0' */
|
||||
SECUREC_STRCPY_OPT(strDest, strSrc, srcStrLen);
|
||||
return EOK;
|
||||
} else {
|
||||
strDest[0] = '\0';
|
||||
SECUREC_ERROR_BUFFER_OVERLAP("strcpy_s");
|
||||
return EOVERLAP_AND_RESET;
|
||||
}
|
||||
}
|
||||
}
|
||||
return strcpy_error(strDest, destMax, strSrc);
|
||||
}
|
||||
|
||||
#if SECUREC_IN_KERNEL
|
||||
EXPORT_SYMBOL(strcpy_s);
|
||||
#endif
|
||||
|
|
@ -1,120 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: strncat_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securecutil.h"
|
||||
|
||||
/*
|
||||
* Befor this function, the basic parameter checking has been done
|
||||
*/
|
||||
SECUREC_INLINE errno_t SecDoCatLimit(char *strDest, size_t destMax, const char *strSrc, size_t count)
|
||||
{
|
||||
size_t destLen;
|
||||
size_t srcLen;
|
||||
SECUREC_CALC_STR_LEN(strDest, destMax, &destLen);
|
||||
/*
|
||||
* The strSrc is no longer optimized. The reason is that when count is small,
|
||||
* the efficiency of strnlen is higher than that of self realization.
|
||||
*/
|
||||
SECUREC_CALC_STR_LEN(strSrc, count, &srcLen);
|
||||
|
||||
if (SECUREC_CAT_STRING_IS_OVERLAP(strDest, destLen, strSrc, srcLen)) {
|
||||
strDest[0] = '\0';
|
||||
if (strDest + destLen <= strSrc && destLen == destMax) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("strncat_s");
|
||||
return EINVAL_AND_RESET;
|
||||
}
|
||||
SECUREC_ERROR_BUFFER_OVERLAP("strncat_s");
|
||||
return EOVERLAP_AND_RESET;
|
||||
}
|
||||
if (srcLen + destLen >= destMax || strDest == strSrc) {
|
||||
strDest[0] = '\0';
|
||||
if (destLen == destMax) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("strncat_s");
|
||||
return EINVAL_AND_RESET;
|
||||
}
|
||||
SECUREC_ERROR_INVALID_RANGE("strncat_s");
|
||||
return ERANGE_AND_RESET;
|
||||
}
|
||||
SECUREC_MEMCPY_WARP_OPT(strDest + destLen, strSrc, srcLen); /* No terminator */
|
||||
*(strDest + destLen + srcLen) = '\0';
|
||||
return EOK;
|
||||
}
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The strncat_s function appends not more than n successive characters
|
||||
* (not including the terminating null character)
|
||||
* from the array pointed to by strSrc to the end of the string pointed to by strDest
|
||||
* The strncat_s function try to append the first D characters of strSrc to
|
||||
* the end of strDest, where D is the lesser of count and the length of strSrc.
|
||||
* If appending those D characters will fit within strDest (whose size is given
|
||||
* as destMax) and still leave room for a null terminator, then those characters
|
||||
* are appended, starting at the original terminating null of strDest, and a
|
||||
* new terminating null is appended; otherwise, strDest[0] is set to the null
|
||||
* character.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* strDest Null-terminated destination string.
|
||||
* destMax Size of the destination buffer.
|
||||
* strSrc Null-terminated source string.
|
||||
* count Number of character to append, or truncate.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* strDest is updated
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* EOK Success
|
||||
* EINVAL strDest is NULL and destMax != 0 and destMax <= SECUREC_STRING_MAX_LEN
|
||||
* EINVAL_AND_RESET (strDest unterminated and all other parameters are valid)or
|
||||
* (strDest != NULL and strSrc is NULL and destMax != 0 and destMax <= SECUREC_STRING_MAX_LEN)
|
||||
* ERANGE destMax is 0 and destMax > SECUREC_STRING_MAX_LEN
|
||||
* ERANGE_AND_RESET strDest have not enough space and all other parameters are valid and not overlap
|
||||
* EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and all parameters are valid
|
||||
*
|
||||
* If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid
|
||||
*/
|
||||
errno_t strncat_s(char *strDest, size_t destMax, const char *strSrc, size_t count)
|
||||
{
|
||||
if (destMax == 0 || destMax > SECUREC_STRING_MAX_LEN) {
|
||||
SECUREC_ERROR_INVALID_RANGE("strncat_s");
|
||||
return ERANGE;
|
||||
}
|
||||
|
||||
if (strDest == NULL || strSrc == NULL) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("strncat_s");
|
||||
if (strDest != NULL) {
|
||||
strDest[0] = '\0';
|
||||
return EINVAL_AND_RESET;
|
||||
}
|
||||
return EINVAL;
|
||||
}
|
||||
if (count > SECUREC_STRING_MAX_LEN) {
|
||||
#ifdef SECUREC_COMPATIBLE_WIN_FORMAT
|
||||
if (count == (size_t)(-1)) {
|
||||
/* Windows internal functions may pass in -1 when calling this function */
|
||||
return SecDoCatLimit(strDest, destMax, strSrc, destMax);
|
||||
}
|
||||
#endif
|
||||
strDest[0] = '\0';
|
||||
SECUREC_ERROR_INVALID_RANGE("strncat_s");
|
||||
return ERANGE_AND_RESET;
|
||||
}
|
||||
return SecDoCatLimit(strDest, destMax, strSrc, count);
|
||||
}
|
||||
|
||||
#if SECUREC_IN_KERNEL
|
||||
EXPORT_SYMBOL(strncat_s);
|
||||
#endif
|
||||
|
|
@ -1,141 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: strncpy_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securecutil.h"
|
||||
|
||||
#if defined(SECUREC_COMPATIBLE_WIN_FORMAT)
|
||||
#define SECUREC_STRNCPY_PARAM_OK(strDest, destMax, strSrc, count) \
|
||||
(((destMax) > 0 && (destMax) <= SECUREC_STRING_MAX_LEN && (strDest) != NULL && (strSrc) != NULL && \
|
||||
((count) <= SECUREC_STRING_MAX_LEN || (count) == ((size_t)(-1))) && (count) > 0))
|
||||
#else
|
||||
#define SECUREC_STRNCPY_PARAM_OK(strDest, destMax, strSrc, count) \
|
||||
(((destMax) > 0 && (destMax) <= SECUREC_STRING_MAX_LEN && (strDest) != NULL && (strSrc) != NULL && \
|
||||
(count) <= SECUREC_STRING_MAX_LEN && (count) > 0))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Check Src Count Range
|
||||
*/
|
||||
SECUREC_INLINE errno_t CheckSrcCountRange(char *strDest, size_t destMax, const char *strSrc, size_t count)
|
||||
{
|
||||
size_t tmpDestMax = destMax;
|
||||
size_t tmpCount = count;
|
||||
const char *endPos = strSrc;
|
||||
|
||||
/* Use destMax and count as boundary checker and destMax must be greater than zero */
|
||||
while (*(endPos) != '\0' && tmpDestMax > 0 && tmpCount > 0) {
|
||||
++endPos;
|
||||
--tmpCount;
|
||||
--tmpDestMax;
|
||||
}
|
||||
if (tmpDestMax == 0) {
|
||||
strDest[0] = '\0';
|
||||
SECUREC_ERROR_INVALID_RANGE("strncpy_s");
|
||||
return ERANGE_AND_RESET;
|
||||
}
|
||||
return EOK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handling errors, when dest euqal src return EOK
|
||||
*/
|
||||
errno_t strncpy_error(char *strDest, size_t destMax, const char *strSrc, size_t count)
|
||||
{
|
||||
if (destMax == 0 || destMax > SECUREC_STRING_MAX_LEN) {
|
||||
SECUREC_ERROR_INVALID_RANGE("strncpy_s");
|
||||
return ERANGE;
|
||||
}
|
||||
if (strDest == NULL || strSrc == NULL) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("strncpy_s");
|
||||
if (strDest != NULL) {
|
||||
strDest[0] = '\0';
|
||||
return EINVAL_AND_RESET;
|
||||
}
|
||||
return EINVAL;
|
||||
}
|
||||
if (count > SECUREC_STRING_MAX_LEN) {
|
||||
strDest[0] = '\0'; /* Clear dest string */
|
||||
SECUREC_ERROR_INVALID_RANGE("strncpy_s");
|
||||
return ERANGE_AND_RESET;
|
||||
}
|
||||
if (count == 0) {
|
||||
strDest[0] = '\0';
|
||||
return EOK;
|
||||
}
|
||||
return CheckSrcCountRange(strDest, destMax, strSrc, count);
|
||||
}
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The strncpy_s function copies not more than n successive characters (not including the terminating null character)
|
||||
* from the array pointed to by strSrc to the array pointed to by strDest.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* strDest Destination string.
|
||||
* destMax The size of the destination string, in characters.
|
||||
* strSrc Source string.
|
||||
* count Number of characters to be copied.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* strDest is updated
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* EOK Success
|
||||
* EINVAL strDest is NULL and destMax != 0 and destMax <= SECUREC_STRING_MAX_LEN
|
||||
* EINVAL_AND_RESET strDest != NULL and strSrc is NULL and destMax != 0 and destMax <= SECUREC_STRING_MAX_LEN
|
||||
* ERANGE destMax is 0 and destMax > SECUREC_STRING_MAX_LEN
|
||||
* ERANGE_AND_RESET strDest have not enough space and all other parameters are valid and not overlap
|
||||
* EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and all parameters are valid
|
||||
*
|
||||
* If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid
|
||||
*/
|
||||
errno_t strncpy_s(char *strDest, size_t destMax, const char *strSrc, size_t count)
|
||||
{
|
||||
if (SECUREC_STRNCPY_PARAM_OK(strDest, destMax, strSrc, count)) {
|
||||
size_t minCpLen; /* Use it to store the maxi length limit */
|
||||
if (count < destMax) {
|
||||
SECUREC_CALC_STR_LEN(strSrc, count, &minCpLen); /* No ending terminator */
|
||||
} else {
|
||||
size_t tmpCount = destMax;
|
||||
#ifdef SECUREC_COMPATIBLE_WIN_FORMAT
|
||||
if (count == ((size_t)(-1))) {
|
||||
tmpCount = destMax - 1;
|
||||
}
|
||||
#endif
|
||||
SECUREC_CALC_STR_LEN(strSrc, tmpCount, &minCpLen); /* No ending terminator */
|
||||
if (minCpLen == destMax) {
|
||||
strDest[0] = '\0';
|
||||
SECUREC_ERROR_INVALID_RANGE("strncpy_s");
|
||||
return ERANGE_AND_RESET;
|
||||
}
|
||||
}
|
||||
if (SECUREC_STRING_NO_OVERLAP(strDest, strSrc, minCpLen) || strDest == strSrc) {
|
||||
/* Not overlap */
|
||||
SECUREC_MEMCPY_WARP_OPT(strDest, strSrc, minCpLen); /* Copy string without terminator */
|
||||
strDest[minCpLen] = '\0';
|
||||
return EOK;
|
||||
} else {
|
||||
strDest[0] = '\0';
|
||||
SECUREC_ERROR_BUFFER_OVERLAP("strncpy_s");
|
||||
return EOVERLAP_AND_RESET;
|
||||
}
|
||||
}
|
||||
return strncpy_error(strDest, destMax, strSrc, count);
|
||||
}
|
||||
|
||||
#if SECUREC_IN_KERNEL
|
||||
EXPORT_SYMBOL(strncpy_s);
|
||||
#endif
|
||||
|
|
@ -1,117 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: strtok_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securecutil.h"
|
||||
|
||||
SECUREC_INLINE int SecIsInDelimit(char ch, const char *strDelimit)
|
||||
{
|
||||
const char *ctl = strDelimit;
|
||||
while (*ctl != '\0' && *ctl != ch) {
|
||||
++ctl;
|
||||
}
|
||||
return (int)(*ctl != '\0');
|
||||
}
|
||||
|
||||
/*
|
||||
* Find beginning of token (skip over leading delimiters).
|
||||
* Note that there is no token if this loop sets string to point to the terminal null.
|
||||
*/
|
||||
SECUREC_INLINE char *SecFindBegin(char *strToken, const char *strDelimit)
|
||||
{
|
||||
char *token = strToken;
|
||||
while (*token != '\0') {
|
||||
if (SecIsInDelimit(*token, strDelimit) != 0) {
|
||||
++token;
|
||||
continue;
|
||||
}
|
||||
/* Don't find any delimiter in string header, break the loop */
|
||||
break;
|
||||
}
|
||||
return token;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find rest of token
|
||||
*/
|
||||
SECUREC_INLINE char *SecFindRest(char *strToken, const char *strDelimit)
|
||||
{
|
||||
/* Find the rest of the token. If it is not the end of the string, put a null there */
|
||||
char *token = strToken;
|
||||
while (*token != '\0') {
|
||||
if (SecIsInDelimit(*token, strDelimit) != 0) {
|
||||
/* Find a delimiter, set string termintor */
|
||||
*token = '\0';
|
||||
++token;
|
||||
break;
|
||||
}
|
||||
++token;
|
||||
}
|
||||
return token;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the final position pointer
|
||||
*/
|
||||
SECUREC_INLINE char *SecUpdateToken(char *strToken, const char *strDelimit, char **context)
|
||||
{
|
||||
/* Point to updated position. Record string position for next search in the context */
|
||||
*context = SecFindRest(strToken, strDelimit);
|
||||
/* Determine if a token has been found. */
|
||||
if (*context == strToken) {
|
||||
return NULL;
|
||||
}
|
||||
return strToken;
|
||||
}
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The strtok_s function parses a string into a sequence of strToken,
|
||||
* replace all characters in strToken string that match to strDelimit set with 0.
|
||||
* On the first call to strtok_s the string to be parsed should be specified in strToken.
|
||||
* In each subsequent call that should parse the same string, strToken should be NULL
|
||||
* <INPUT PARAMETERS>
|
||||
* strToken String containing token or tokens.
|
||||
* strDelimit Set of delimiter characters.
|
||||
* context Used to store position information between calls
|
||||
* to strtok_s
|
||||
* <OUTPUT PARAMETERS>
|
||||
* context is updated
|
||||
* <RETURN VALUE>
|
||||
* On the first call returns the address of the first non \0 character, otherwise NULL is returned.
|
||||
* In subsequent calls, the strtoken is set to NULL, and the context set is the same as the previous call,
|
||||
* return NULL if the *context string length is equal 0, otherwise return *context.
|
||||
*/
|
||||
char *strtok_s(char *strToken, const char *strDelimit, char **context)
|
||||
{
|
||||
char *orgToken = strToken;
|
||||
/* Validate delimiter and string context */
|
||||
if (context == NULL || strDelimit == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
/* Valid input string and string pointer from where to search */
|
||||
if (orgToken == NULL && *context == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
/* If string is null, continue searching from previous string position stored in context */
|
||||
if (orgToken == NULL) {
|
||||
orgToken = *context;
|
||||
}
|
||||
orgToken = SecFindBegin(orgToken, strDelimit);
|
||||
return SecUpdateToken(orgToken, strDelimit, context);
|
||||
}
|
||||
#if SECUREC_IN_KERNEL
|
||||
EXPORT_SYMBOL(strtok_s);
|
||||
#endif
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: swprintf_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securec.h"
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The swprintf_s function is the wide-character equivalent of the sprintf_s function
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* strDest Storage location for the output.
|
||||
* destMax Maximum number of characters to store.
|
||||
* format Format-control string.
|
||||
* ... Optional arguments
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* strDest is updated
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* return the number of wide characters stored in strDest, not counting the terminating null wide character.
|
||||
* return -1 if an error occurred.
|
||||
*
|
||||
* If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid
|
||||
*/
|
||||
int swprintf_s(wchar_t *strDest, size_t destMax, const wchar_t *format, ...)
|
||||
{
|
||||
int ret; /* If initialization causes e838 */
|
||||
va_list argList;
|
||||
|
||||
va_start(argList, format);
|
||||
ret = vswprintf_s(strDest, destMax, format, argList);
|
||||
va_end(argList);
|
||||
(void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: swscanf_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securec.h"
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The swscanf_s function is the wide-character equivalent of the sscanf_s function
|
||||
* The swscanf_s function reads data from buffer into the location given by
|
||||
* each argument. Every argument must be a pointer to a variable with a type
|
||||
* that corresponds to a type specifier in format. The format argument controls
|
||||
* the interpretation of the input fields and has the same form and function
|
||||
* as the format argument for the scanf function. If copying takes place between
|
||||
* strings that overlap, the behavior is undefined.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* buffer Stored data.
|
||||
* format Format control string, see Format Specifications.
|
||||
* ... Optional arguments.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* ... the converted value stored in user assigned address
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* Each of these functions returns the number of fields successfully converted
|
||||
* and assigned; The return value does not include fields that were read but not
|
||||
* assigned.
|
||||
* A return value of 0 indicates that no fields were assigned.
|
||||
* return -1 if an error occurs.
|
||||
*/
|
||||
int swscanf_s(const wchar_t *buffer, const wchar_t *format, ...)
|
||||
{
|
||||
int ret; /* If initialization causes e838 */
|
||||
va_list argList;
|
||||
|
||||
va_start(argList, format);
|
||||
ret = vswscanf_s(buffer, format, argList);
|
||||
va_end(argList);
|
||||
(void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1,65 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: vfscanf_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "secinput.h"
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The vfscanf_s function is equivalent to fscanf_s, with the variable argument list replaced by argList
|
||||
* The vfscanf_s function reads data from the current position of stream into
|
||||
* the locations given by argument (if any). Each argument must be a pointer
|
||||
* to a variable of a type that corresponds to a type specifier in format.
|
||||
* format controls the interpretation of the input fields and has the same
|
||||
* form and function as the format argument for scanf.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* stream Pointer to FILE structure.
|
||||
* format Format control string, see Format Specifications.
|
||||
* argList pointer to list of arguments
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* argList the converted value stored in user assigned address
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* Each of these functions returns the number of fields successfully converted
|
||||
* and assigned; the return value does not include fields that were read but
|
||||
* not assigned. A return value of 0 indicates that no fields were assigned.
|
||||
* return -1 if an error occurs.
|
||||
*/
|
||||
int vfscanf_s(FILE *stream, const char *format, va_list argList)
|
||||
{
|
||||
int retVal; /* If initialization causes e838 */
|
||||
SecFileStream fStr;
|
||||
|
||||
if (stream == NULL || format == NULL) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vfscanf_s");
|
||||
return SECUREC_SCANF_EINVAL;
|
||||
}
|
||||
if (stream == SECUREC_STREAM_STDIN) {
|
||||
return vscanf_s(format, argList);
|
||||
}
|
||||
|
||||
SECUREC_LOCK_FILE(stream);
|
||||
SECUREC_FILE_STREAM_FROM_FILE(&fStr, stream);
|
||||
retVal = SecInputS(&fStr, format, argList);
|
||||
SECUREC_UNLOCK_FILE(stream);
|
||||
if (retVal < 0) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vfscanf_s");
|
||||
return SECUREC_SCANF_EINVAL;
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: vfwscanf_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#ifndef SECUREC_FOR_WCHAR
|
||||
#define SECUREC_FOR_WCHAR
|
||||
#endif
|
||||
|
||||
#include "secinput.h"
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The vfwscanf_s function is the wide-character equivalent of the vfscanf_s function
|
||||
* The vfwscanf_s function reads data from the current position of stream into
|
||||
* the locations given by argument (if any). Each argument must be a pointer
|
||||
* to a variable of a type that corresponds to a type specifier in format.
|
||||
* format controls the interpretation of the input fields and has the same form
|
||||
* and function as the format argument for scanf.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* stream Pointer to FILE structure.
|
||||
* format Format control string, see Format Specifications.
|
||||
* argList pointer to list of arguments
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* argList the converted value stored in user assigned address
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* Each of these functions returns the number of fields successfully converted
|
||||
* and assigned; the return value does not include fields that were read but
|
||||
* not assigned. A return value of 0 indicates that no fields were assigned.
|
||||
* return -1 if an error occurs.
|
||||
*/
|
||||
int vfwscanf_s(FILE *stream, const wchar_t *format, va_list argList)
|
||||
{
|
||||
int retVal; /* If initialization causes e838 */
|
||||
SecFileStream fStr;
|
||||
|
||||
if (stream == NULL || format == NULL) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vfwscanf_s");
|
||||
return SECUREC_SCANF_EINVAL;
|
||||
}
|
||||
if (stream == SECUREC_STREAM_STDIN) {
|
||||
return vwscanf_s(format, argList);
|
||||
}
|
||||
|
||||
SECUREC_LOCK_FILE(stream);
|
||||
SECUREC_FILE_STREAM_FROM_FILE(&fStr, stream);
|
||||
retVal = SecInputSW(&fStr, format, argList);
|
||||
SECUREC_UNLOCK_FILE(stream);
|
||||
if (retVal < 0) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vfwscanf_s");
|
||||
return SECUREC_SCANF_EINVAL;
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
|
@ -1,64 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: vscanf_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "secinput.h"
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The vscanf_s function is equivalent to scanf_s, with the variable argument list replaced by argList,
|
||||
* The vscanf_s function reads data from the standard input stream stdin and
|
||||
* writes the data into the location that's given by argument. Each argument
|
||||
* must be a pointer to a variable of a type that corresponds to a type specifier
|
||||
* in format. If copying occurs between strings that overlap, the behavior is
|
||||
* undefined.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* format Format control string.
|
||||
* argList pointer to list of arguments
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* argList the converted value stored in user assigned address
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* Returns the number of fields successfully converted and assigned;
|
||||
* the return value does not include fields that were read but not assigned.
|
||||
* A return value of 0 indicates that no fields were assigned.
|
||||
* return -1 if an error occurs.
|
||||
*/
|
||||
int vscanf_s(const char *format, va_list argList)
|
||||
{
|
||||
int retVal; /* If initialization causes e838 */
|
||||
SecFileStream fStr;
|
||||
SECUREC_FILE_STREAM_FROM_STDIN(&fStr);
|
||||
/*
|
||||
* The "va_list" has different definition on different platform, so we can't use argList == NULL
|
||||
* To determine it's invalid. If you has fixed platform, you can check some fields to validate it,
|
||||
* such as "argList == NULL" or argList.xxx != NULL or *(size_t *)&argList != 0.
|
||||
*/
|
||||
if (format == NULL || fStr.pf == NULL) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vscanf_s");
|
||||
return SECUREC_SCANF_EINVAL;
|
||||
}
|
||||
|
||||
SECUREC_LOCK_STDIN(0, fStr.pf);
|
||||
retVal = SecInputS(&fStr, format, argList);
|
||||
SECUREC_UNLOCK_STDIN(0, fStr.pf);
|
||||
if (retVal < 0) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vscanf_s");
|
||||
return SECUREC_SCANF_EINVAL;
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
|
@ -1,139 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: vsnprintf_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "secureprintoutput.h"
|
||||
|
||||
#if SECUREC_ENABLE_VSNPRINTF
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The vsnprintf_s function is equivalent to the vsnprintf function
|
||||
* except for the parameter destMax/count and the explicit runtime-constraints violation
|
||||
* The vsnprintf_s function takes a pointer to an argument list, then formats
|
||||
* and writes up to count characters of the given data to the memory pointed
|
||||
* to by strDest and appends a terminating null.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* strDest Storage location for the output.
|
||||
* destMax The size of the strDest for output.
|
||||
* count Maximum number of character to write(not including
|
||||
* the terminating NULL)
|
||||
* format Format-control string.
|
||||
* argList pointer to list of arguments.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* strDest is updated
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* return the number of characters written, not including the terminating null
|
||||
* return -1 if an error occurs.
|
||||
* return -1 if count < destMax and the output string has been truncated
|
||||
*
|
||||
* If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid
|
||||
*/
|
||||
int vsnprintf_s(char *strDest, size_t destMax, size_t count, const char *format, va_list argList)
|
||||
{
|
||||
int retVal;
|
||||
|
||||
if (SECUREC_VSNPRINTF_PARAM_ERROR(format, strDest, destMax, count, SECUREC_STRING_MAX_LEN)) {
|
||||
SECUREC_VSPRINTF_CLEAR_DEST(strDest, destMax, SECUREC_STRING_MAX_LEN);
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vsnprintf_s");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (destMax > count) {
|
||||
retVal = SecVsnprintfImpl(strDest, count + 1, format, argList);
|
||||
if (retVal == SECUREC_PRINTF_TRUNCATE) { /* To keep dest buffer not destroyed 2014.2.18 */
|
||||
/* The string has been truncated, return -1 */
|
||||
return -1; /* To skip error handler, return strlen(strDest) or -1 */
|
||||
}
|
||||
} else {
|
||||
retVal = SecVsnprintfImpl(strDest, destMax, format, argList);
|
||||
#ifdef SECUREC_COMPATIBLE_WIN_FORMAT
|
||||
if (retVal == SECUREC_PRINTF_TRUNCATE && count == (size_t)(-1)) {
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (retVal < 0) {
|
||||
strDest[0] = '\0'; /* Empty the dest strDest */
|
||||
if (retVal == SECUREC_PRINTF_TRUNCATE) {
|
||||
/* Buffer too small */
|
||||
SECUREC_ERROR_INVALID_RANGE("vsnprintf_s");
|
||||
}
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vsnprintf_s");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
#if SECUREC_IN_KERNEL
|
||||
EXPORT_SYMBOL(vsnprintf_s);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if SECUREC_SNPRINTF_TRUNCATED
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The vsnprintf_truncated_s function is equivalent to the vsnprintf function
|
||||
* except for the parameter destMax/count and the explicit runtime-constraints violation
|
||||
* The vsnprintf_truncated_s function takes a pointer to an argument list, then formats
|
||||
* and writes up to count characters of the given data to the memory pointed
|
||||
* to by strDest and appends a terminating null.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* strDest Storage location for the output.
|
||||
* destMax The size of the strDest for output.
|
||||
* the terminating NULL)
|
||||
* format Format-control string.
|
||||
* argList pointer to list of arguments.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* strDest is updated
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* return the number of characters written, not including the terminating null
|
||||
* return -1 if an error occurs.
|
||||
* return destMax-1 if output string has been truncated
|
||||
*
|
||||
* If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid
|
||||
*/
|
||||
int vsnprintf_truncated_s(char *strDest, size_t destMax, const char *format, va_list argList)
|
||||
{
|
||||
int retVal;
|
||||
|
||||
if (SECUREC_VSPRINTF_PARAM_ERROR(format, strDest, destMax, SECUREC_STRING_MAX_LEN)) {
|
||||
SECUREC_VSPRINTF_CLEAR_DEST(strDest, destMax, SECUREC_STRING_MAX_LEN);
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vsnprintf_truncated_s");
|
||||
return -1;
|
||||
}
|
||||
|
||||
retVal = SecVsnprintfImpl(strDest, destMax, format, argList);
|
||||
if (retVal < 0) {
|
||||
if (retVal == SECUREC_PRINTF_TRUNCATE) {
|
||||
return (int)(destMax - 1); /* To skip error handler, return strlen(strDest) */
|
||||
}
|
||||
strDest[0] = '\0'; /* Empty the dest strDest */
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vsnprintf_truncated_s");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
#if SECUREC_IN_KERNEL
|
||||
EXPORT_SYMBOL(vsnprintf_truncated_s);
|
||||
#endif
|
||||
#endif
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: vsprintf_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "secureprintoutput.h"
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The vsprintf_s function is equivalent to the vsprintf function
|
||||
* except for the parameter destMax and the explicit runtime-constraints violation
|
||||
* The vsprintf_s function takes a pointer to an argument list, and then formats
|
||||
* and writes the given data to the memory pointed to by strDest.
|
||||
* The function differ from the non-secure versions only in that the secure
|
||||
* versions support positional parameters.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* strDest Storage location for the output.
|
||||
* destMax Size of strDest
|
||||
* format Format specification.
|
||||
* argList pointer to list of arguments
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* strDest is updated
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* return the number of characters written, not including the terminating null character,
|
||||
* return -1 if an error occurs.
|
||||
*
|
||||
* If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid
|
||||
*/
|
||||
int vsprintf_s(char *strDest, size_t destMax, const char *format, va_list argList)
|
||||
{
|
||||
int retVal; /* If initialization causes e838 */
|
||||
|
||||
if (SECUREC_VSPRINTF_PARAM_ERROR(format, strDest, destMax, SECUREC_STRING_MAX_LEN)) {
|
||||
SECUREC_VSPRINTF_CLEAR_DEST(strDest, destMax, SECUREC_STRING_MAX_LEN);
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vsprintf_s");
|
||||
return -1;
|
||||
}
|
||||
|
||||
retVal = SecVsnprintfImpl(strDest, destMax, format, argList);
|
||||
if (retVal < 0) {
|
||||
strDest[0] = '\0';
|
||||
if (retVal == SECUREC_PRINTF_TRUNCATE) {
|
||||
/* Buffer is too small */
|
||||
SECUREC_ERROR_INVALID_RANGE("vsprintf_s");
|
||||
}
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vsprintf_s");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
#if SECUREC_IN_KERNEL
|
||||
EXPORT_SYMBOL(vsprintf_s);
|
||||
#endif
|
||||
|
|
@ -1,88 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: vsscanf_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "secinput.h"
|
||||
#if defined(SECUREC_VXWORKS_PLATFORM) && !SECUREC_IN_KERNEL && \
|
||||
(!defined(SECUREC_SYSAPI4VXWORKS) && !defined(SECUREC_CTYPE_MACRO_ADAPT))
|
||||
#include <ctype.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* <NAME>
|
||||
* vsscanf_s
|
||||
*
|
||||
*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The vsscanf_s function is equivalent to sscanf_s, with the variable argument list replaced by argList
|
||||
* The vsscanf_s function reads data from buffer into the location given by
|
||||
* each argument. Every argument must be a pointer to a variable with a type
|
||||
* that corresponds to a type specifier in format. The format argument controls
|
||||
* the interpretation of the input fields and has the same form and function
|
||||
* as the format argument for the scanf function.
|
||||
* If copying takes place between strings that overlap, the behavior is undefined.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* buffer Stored data
|
||||
* format Format control string, see Format Specifications.
|
||||
* argList pointer to list of arguments
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* argList the converted value stored in user assigned address
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* Each of these functions returns the number of fields successfully converted
|
||||
* and assigned; the return value does not include fields that were read but
|
||||
* not assigned. A return value of 0 indicates that no fields were assigned.
|
||||
* return -1 if an error occurs.
|
||||
*/
|
||||
int vsscanf_s(const char *buffer, const char *format, va_list argList)
|
||||
{
|
||||
size_t count; /* If initialization causes e838 */
|
||||
int retVal;
|
||||
SecFileStream fStr;
|
||||
|
||||
/* Validation section */
|
||||
if (buffer == NULL || format == NULL) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vsscanf_s");
|
||||
return SECUREC_SCANF_EINVAL;
|
||||
}
|
||||
count = strlen(buffer);
|
||||
if (count == 0 || count > SECUREC_STRING_MAX_LEN) {
|
||||
SecClearDestBuf(buffer, format, argList);
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vsscanf_s");
|
||||
return SECUREC_SCANF_EINVAL;
|
||||
}
|
||||
#if defined(SECUREC_VXWORKS_PLATFORM) && !SECUREC_IN_KERNEL
|
||||
/*
|
||||
* On vxworks platform when buffer is white string, will set first %s argument tu zero.like following useage:
|
||||
* " \v\f\t\r\n", "%s", str, strSize
|
||||
* Do not check all character, just first and last character then consider it is white string
|
||||
*/
|
||||
if (isspace((int)(unsigned char)buffer[0]) != 0 && isspace((int)(unsigned char)buffer[count - 1]) != 0) {
|
||||
SecClearDestBuf(buffer, format, argList);
|
||||
}
|
||||
#endif
|
||||
SECUREC_FILE_STREAM_FROM_STRING(&fStr, buffer, count);
|
||||
retVal = SecInputS(&fStr, format, argList);
|
||||
if (retVal < 0) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vsscanf_s");
|
||||
return SECUREC_SCANF_EINVAL;
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
#if SECUREC_IN_KERNEL
|
||||
EXPORT_SYMBOL(vsscanf_s);
|
||||
#endif
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: vswprintf_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#ifndef SECUREC_FOR_WCHAR
|
||||
#define SECUREC_FOR_WCHAR
|
||||
#endif
|
||||
|
||||
#include "secureprintoutput.h"
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The vswprintf_s function is the wide-character equivalent of the vsprintf_s function
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* strDest Storage location for the output.
|
||||
* destMax Maximum number of characters to store
|
||||
* format Format specification.
|
||||
* argList pointer to list of arguments
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* strDest is updated
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* return the number of wide characters stored in strDest, not counting the terminating null wide character.
|
||||
* return -1 if an error occurred.
|
||||
*
|
||||
* If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid
|
||||
*/
|
||||
int vswprintf_s(wchar_t *strDest, size_t destMax, const wchar_t *format, va_list argList)
|
||||
{
|
||||
int retVal; /* If initialization causes e838 */
|
||||
if (SECUREC_VSPRINTF_PARAM_ERROR(format, strDest, destMax, SECUREC_WCHAR_STRING_MAX_LEN)) {
|
||||
SECUREC_VSPRINTF_CLEAR_DEST(strDest, destMax, SECUREC_WCHAR_STRING_MAX_LEN);
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vswprintf_s");
|
||||
return -1;
|
||||
}
|
||||
|
||||
retVal = SecVswprintfImpl(strDest, destMax, format, argList);
|
||||
if (retVal < 0) {
|
||||
strDest[0] = L'\0';
|
||||
if (retVal == SECUREC_PRINTF_TRUNCATE) {
|
||||
/* Buffer too small */
|
||||
SECUREC_ERROR_INVALID_RANGE("vswprintf_s");
|
||||
}
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vswprintf_s");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
|
@ -1,80 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: vswscanf_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#ifndef SECUREC_FOR_WCHAR
|
||||
#define SECUREC_FOR_WCHAR
|
||||
#endif
|
||||
|
||||
#include "secinput.h"
|
||||
|
||||
SECUREC_INLINE size_t SecWcslen(const wchar_t *s)
|
||||
{
|
||||
const wchar_t *end = s;
|
||||
while (*end != L'\0') {
|
||||
++end;
|
||||
}
|
||||
return ((size_t)((end - s)));
|
||||
}
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The vswscanf_s function is the wide-character equivalent of the vsscanf_s function
|
||||
* The vsscanf_s function reads data from buffer into the location given by
|
||||
* each argument. Every argument must be a pointer to a variable with a type
|
||||
* that corresponds to a type specifier in format.
|
||||
* The format argument controls the interpretation of the input fields and
|
||||
* has the same form and function as the format argument for the scanf function.
|
||||
* If copying takes place between strings that overlap, the behavior is undefined.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* buffer Stored data
|
||||
* format Format control string, see Format Specifications.
|
||||
* argList pointer to list of arguments
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* argList the converted value stored in user assigned address
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* Each of these functions returns the number of fields successfully converted
|
||||
* and assigned; the return value does not include fields that were read but
|
||||
* not assigned. A return value of 0 indicates that no fields were assigned.
|
||||
* return -1 if an error occurs.
|
||||
*/
|
||||
int vswscanf_s(const wchar_t *buffer, const wchar_t *format, va_list argList)
|
||||
{
|
||||
size_t count; /* If initialization causes e838 */
|
||||
SecFileStream fStr;
|
||||
int retVal;
|
||||
|
||||
/* Validation section */
|
||||
if (buffer == NULL || format == NULL) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vswscanf_s");
|
||||
return SECUREC_SCANF_EINVAL;
|
||||
}
|
||||
count = SecWcslen(buffer);
|
||||
if (count == 0 || count > SECUREC_WCHAR_STRING_MAX_LEN) {
|
||||
SecClearDestBufW(buffer, format, argList);
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vswscanf_s");
|
||||
return SECUREC_SCANF_EINVAL;
|
||||
}
|
||||
SECUREC_FILE_STREAM_FROM_STRING(&fStr, (const char *)buffer, count * sizeof(wchar_t));
|
||||
retVal = SecInputSW(&fStr, format, argList);
|
||||
if (retVal < 0) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vswscanf_s");
|
||||
return SECUREC_SCANF_EINVAL;
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
|
@ -1,65 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: vwscanf_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#ifndef SECUREC_FOR_WCHAR
|
||||
#define SECUREC_FOR_WCHAR
|
||||
#endif
|
||||
|
||||
#include "secinput.h"
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The vwscanf_s function is the wide-character equivalent of the vscanf_s function
|
||||
* The vwscanf_s function is the wide-character version of vscanf_s. The
|
||||
* function reads data from the standard input stream stdin and writes the
|
||||
* data into the location that's given by argument. Each argument must be a
|
||||
* pointer to a variable of a type that corresponds to a type specifier in
|
||||
* format. If copying occurs between strings that overlap, the behavior is
|
||||
* undefined.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* format Format control string.
|
||||
* argList pointer to list of arguments
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* argList the converted value stored in user assigned address
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* Returns the number of fields successfully converted and assigned;
|
||||
* the return value does not include fields that were read but not assigned.
|
||||
* A return value of 0 indicates that no fields were assigned.
|
||||
* return -1 if an error occurs.
|
||||
*/
|
||||
int vwscanf_s(const wchar_t *format, va_list argList)
|
||||
{
|
||||
int retVal; /* If initialization causes e838 */
|
||||
SecFileStream fStr;
|
||||
SECUREC_FILE_STREAM_FROM_STDIN(&fStr);
|
||||
if (format == NULL || fStr.pf == NULL) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vwscanf_s");
|
||||
return SECUREC_SCANF_EINVAL;
|
||||
}
|
||||
|
||||
SECUREC_LOCK_STDIN(0, fStr.pf);
|
||||
retVal = SecInputSW(&fStr, format, argList);
|
||||
SECUREC_UNLOCK_STDIN(0, fStr.pf);
|
||||
if (retVal < 0) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("vwscanf_s");
|
||||
return SECUREC_SCANF_EINVAL;
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
|
@ -1,108 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: wcscat_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securecutil.h"
|
||||
|
||||
/*
|
||||
* Befor this function, the basic parameter checking has been done
|
||||
*/
|
||||
SECUREC_INLINE errno_t SecDoCatW(wchar_t *strDest, size_t destMax, const wchar_t *strSrc)
|
||||
{
|
||||
size_t destLen;
|
||||
size_t srcLen;
|
||||
size_t maxCount; /* Store the maximum available count */
|
||||
|
||||
/* To calculate the length of a wide character, the parameter must be a wide character */
|
||||
SECUREC_CALC_WSTR_LEN(strDest, destMax, &destLen);
|
||||
maxCount = destMax - destLen;
|
||||
SECUREC_CALC_WSTR_LEN(strSrc, maxCount, &srcLen);
|
||||
|
||||
if (SECUREC_CAT_STRING_IS_OVERLAP(strDest, destLen, strSrc, srcLen)) {
|
||||
strDest[0] = L'\0';
|
||||
if (strDest + destLen <= strSrc && destLen == destMax) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("wcscat_s");
|
||||
return EINVAL_AND_RESET;
|
||||
}
|
||||
SECUREC_ERROR_BUFFER_OVERLAP("wcscat_s");
|
||||
return EOVERLAP_AND_RESET;
|
||||
}
|
||||
if (srcLen + destLen >= destMax || strDest == strSrc) {
|
||||
strDest[0] = L'\0';
|
||||
if (destLen == destMax) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("wcscat_s");
|
||||
return EINVAL_AND_RESET;
|
||||
}
|
||||
SECUREC_ERROR_INVALID_RANGE("wcscat_s");
|
||||
return ERANGE_AND_RESET;
|
||||
}
|
||||
/* Copy single character length include \0 */
|
||||
SECUREC_MEMCPY_WARP_OPT(strDest + destLen, strSrc, (srcLen + 1) * sizeof(wchar_t));
|
||||
return EOK;
|
||||
}
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The wcscat_s function appends a copy of the wide string pointed to by strSrc
|
||||
* (including the terminating null wide character)
|
||||
* to the end of the wide string pointed to by strDest.
|
||||
* The arguments and return value of wcscat_s are wide-character strings.
|
||||
*
|
||||
* The wcscat_s function appends strSrc to strDest and terminates the resulting
|
||||
* string with a null character. The initial character of strSrc overwrites the
|
||||
* terminating null character of strDest. wcscat_s will return EOVERLAP_AND_RESET if the
|
||||
* source and destination strings overlap.
|
||||
*
|
||||
* Note that the second parameter is the total size of the buffer, not the
|
||||
* remaining size.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* strDest Null-terminated destination string buffer.
|
||||
* destMax Size of the destination string buffer.
|
||||
* strSrc Null-terminated source string buffer.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* strDest is updated
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* EOK Success
|
||||
* EINVAL strDest is NULL and destMax != 0 and destMax <= SECUREC_WCHAR_STRING_MAX_LEN
|
||||
* EINVAL_AND_RESET (strDest unterminated and all other parameters are valid) or
|
||||
* (strDest != NULL and strSrc is NULLL and destMax != 0
|
||||
* and destMax <= SECUREC_WCHAR_STRING_MAX_LEN)
|
||||
* ERANGE destMax > SECUREC_WCHAR_STRING_MAX_LEN or destMax is 0
|
||||
* ERANGE_AND_RESET strDest have not enough space and all other parameters are valid and not overlap
|
||||
* EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and all parameters are valid
|
||||
*
|
||||
* If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid
|
||||
*/
|
||||
errno_t wcscat_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc)
|
||||
{
|
||||
if (destMax == 0 || destMax > SECUREC_WCHAR_STRING_MAX_LEN) {
|
||||
SECUREC_ERROR_INVALID_RANGE("wcscat_s");
|
||||
return ERANGE;
|
||||
}
|
||||
|
||||
if (strDest == NULL || strSrc == NULL) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("wcscat_s");
|
||||
if (strDest != NULL) {
|
||||
strDest[0] = L'\0';
|
||||
return EINVAL_AND_RESET;
|
||||
}
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
return SecDoCatW(strDest, destMax, strSrc);
|
||||
}
|
||||
|
|
@ -1,87 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: wcscpy_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securecutil.h"
|
||||
|
||||
SECUREC_INLINE errno_t SecDoCpyW(wchar_t *strDest, size_t destMax, const wchar_t *strSrc)
|
||||
{
|
||||
size_t srcStrLen;
|
||||
SECUREC_CALC_WSTR_LEN(strSrc, destMax, &srcStrLen);
|
||||
|
||||
if (srcStrLen == destMax) {
|
||||
strDest[0] = L'\0';
|
||||
SECUREC_ERROR_INVALID_RANGE("wcscpy_s");
|
||||
return ERANGE_AND_RESET;
|
||||
}
|
||||
if (strDest == strSrc) {
|
||||
return EOK;
|
||||
}
|
||||
|
||||
if (SECUREC_STRING_NO_OVERLAP(strDest, strSrc, srcStrLen)) {
|
||||
/* Performance optimization, srcStrLen is single character length include '\0' */
|
||||
SECUREC_MEMCPY_WARP_OPT(strDest, strSrc, (srcStrLen + 1) * sizeof(wchar_t));
|
||||
return EOK;
|
||||
} else {
|
||||
strDest[0] = L'\0';
|
||||
SECUREC_ERROR_BUFFER_OVERLAP("wcscpy_s");
|
||||
return EOVERLAP_AND_RESET;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The wcscpy_s function copies the wide string pointed to by strSrc
|
||||
* (including theterminating null wide character) into the array pointed to by strDest
|
||||
|
||||
* <INPUT PARAMETERS>
|
||||
* strDest Destination string buffer
|
||||
* destMax Size of the destination string buffer.
|
||||
* strSrc Null-terminated source string buffer.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* strDest is updated.
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* EOK Success
|
||||
* EINVAL strDest is NULL and destMax != 0 and destMax <= SECUREC_WCHAR_STRING_MAX_LEN
|
||||
* EINVAL_AND_RESET strDest != NULL and strSrc is NULLL and destMax != 0
|
||||
* and destMax <= SECUREC_WCHAR_STRING_MAX_LEN
|
||||
* ERANGE destMax > SECUREC_WCHAR_STRING_MAX_LEN or destMax is 0
|
||||
* ERANGE_AND_RESET destMax <= length of strSrc and strDest != strSrc
|
||||
* and strDest != NULL and strSrc != NULL and destMax != 0
|
||||
* and destMax <= SECUREC_WCHAR_STRING_MAX_LEN and not overlap
|
||||
* EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and destMax != 0
|
||||
* and destMax <= SECUREC_WCHAR_STRING_MAX_LEN
|
||||
* and strDest != NULL and strSrc !=NULL and strDest != strSrc
|
||||
*
|
||||
* If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid
|
||||
*/
|
||||
errno_t wcscpy_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc)
|
||||
{
|
||||
if (destMax == 0 || destMax > SECUREC_WCHAR_STRING_MAX_LEN) {
|
||||
SECUREC_ERROR_INVALID_RANGE("wcscpy_s");
|
||||
return ERANGE;
|
||||
}
|
||||
if (strDest == NULL || strSrc == NULL) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("wcscpy_s");
|
||||
if (strDest != NULL) {
|
||||
strDest[0] = L'\0';
|
||||
return EINVAL_AND_RESET;
|
||||
}
|
||||
return EINVAL;
|
||||
}
|
||||
return SecDoCpyW(strDest, destMax, strSrc);
|
||||
}
|
||||
|
|
@ -1,114 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: wcsncat_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securecutil.h"
|
||||
|
||||
/*
|
||||
* Befor this function, the basic parameter checking has been done
|
||||
*/
|
||||
SECUREC_INLINE errno_t SecDoCatLimitW(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count)
|
||||
{
|
||||
/* To calculate the length of a wide character, the parameter must be a wide character */
|
||||
size_t destLen;
|
||||
size_t srcLen;
|
||||
SECUREC_CALC_WSTR_LEN(strDest, destMax, &destLen);
|
||||
SECUREC_CALC_WSTR_LEN(strSrc, count, &srcLen);
|
||||
|
||||
if (SECUREC_CAT_STRING_IS_OVERLAP(strDest, destLen, strSrc, srcLen)) {
|
||||
strDest[0] = L'\0';
|
||||
if (strDest + destLen <= strSrc && destLen == destMax) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("wcsncat_s");
|
||||
return EINVAL_AND_RESET;
|
||||
}
|
||||
SECUREC_ERROR_BUFFER_OVERLAP("wcsncat_s");
|
||||
return EOVERLAP_AND_RESET;
|
||||
}
|
||||
if (srcLen + destLen >= destMax || strDest == strSrc) {
|
||||
strDest[0] = L'\0';
|
||||
if (destLen == destMax) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("wcsncat_s");
|
||||
return EINVAL_AND_RESET;
|
||||
}
|
||||
SECUREC_ERROR_INVALID_RANGE("wcsncat_s");
|
||||
return ERANGE_AND_RESET;
|
||||
}
|
||||
SECUREC_MEMCPY_WARP_OPT(strDest + destLen, strSrc, srcLen * sizeof(wchar_t)); /* no terminator */
|
||||
*(strDest + destLen + srcLen) = L'\0';
|
||||
return EOK;
|
||||
}
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The wcsncat_s function appends not more than n successive wide characters
|
||||
* (not including the terminating null wide character)
|
||||
* from the array pointed to by strSrc to the end of the wide string pointed to by strDest.
|
||||
*
|
||||
* The wcsncat_s function try to append the first D characters of strSrc to
|
||||
* the end of strDest, where D is the lesser of count and the length of strSrc.
|
||||
* If appending those D characters will fit within strDest (whose size is
|
||||
* given as destMax) and still leave room for a null terminator, then those
|
||||
* characters are appended, starting at the original terminating null of
|
||||
* strDest, and a new terminating null is appended; otherwise, strDest[0] is
|
||||
* set to the null character.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* strDest Null-terminated destination string.
|
||||
* destMax Size of the destination buffer.
|
||||
* strSrc Null-terminated source string.
|
||||
* count Number of character to append, or truncate.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* strDest is updated
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* EOK Success
|
||||
* EINVAL strDest is NULL and destMax != 0 and destMax <= SECUREC_WCHAR_STRING_MAX_LEN
|
||||
* EINVAL_AND_RESET (strDest unterminated and all other parameters are valid) or
|
||||
* (strDest != NULL and strSrc is NULLL and destMax != 0 and
|
||||
* destMax <= SECUREC_WCHAR_STRING_MAX_LEN)
|
||||
* ERANGE destMax > SECUREC_WCHAR_STRING_MAX_LEN or destMax is 0
|
||||
* ERANGE_AND_RESET strDest have not enough space and all other parameters are valid and not overlap
|
||||
* EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and all parameters are valid
|
||||
*
|
||||
* If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid
|
||||
*/
|
||||
errno_t wcsncat_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count)
|
||||
{
|
||||
if (destMax == 0 || destMax > SECUREC_WCHAR_STRING_MAX_LEN) {
|
||||
SECUREC_ERROR_INVALID_RANGE("wcsncat_s");
|
||||
return ERANGE;
|
||||
}
|
||||
if (strDest == NULL || strSrc == NULL) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("wcsncat_s");
|
||||
if (strDest != NULL) {
|
||||
strDest[0] = L'\0';
|
||||
return EINVAL_AND_RESET;
|
||||
}
|
||||
return EINVAL;
|
||||
}
|
||||
if (count > SECUREC_WCHAR_STRING_MAX_LEN) {
|
||||
#ifdef SECUREC_COMPATIBLE_WIN_FORMAT
|
||||
if (count == ((size_t)(-1))) {
|
||||
/* Windows internal functions may pass in -1 when calling this function */
|
||||
return SecDoCatLimitW(strDest, destMax, strSrc, destMax);
|
||||
}
|
||||
#endif
|
||||
strDest[0] = L'\0';
|
||||
SECUREC_ERROR_INVALID_RANGE("wcsncat_s");
|
||||
return ERANGE_AND_RESET;
|
||||
}
|
||||
return SecDoCatLimitW(strDest, destMax, strSrc, count);
|
||||
}
|
||||
|
|
@ -1,108 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: wcsncpy_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securecutil.h"
|
||||
|
||||
SECUREC_INLINE errno_t SecDoCpyLimitW(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count)
|
||||
{
|
||||
size_t srcStrLen;
|
||||
if (count < destMax) {
|
||||
SECUREC_CALC_WSTR_LEN(strSrc, count, &srcStrLen);
|
||||
} else {
|
||||
SECUREC_CALC_WSTR_LEN(strSrc, destMax, &srcStrLen);
|
||||
}
|
||||
if (srcStrLen == destMax) {
|
||||
strDest[0] = L'\0';
|
||||
SECUREC_ERROR_INVALID_RANGE("wcsncpy_s");
|
||||
return ERANGE_AND_RESET;
|
||||
}
|
||||
if (strDest == strSrc) {
|
||||
return EOK;
|
||||
}
|
||||
if (SECUREC_STRING_NO_OVERLAP(strDest, strSrc, srcStrLen)) {
|
||||
/* Performance optimization srcStrLen not include '\0' */
|
||||
SECUREC_MEMCPY_WARP_OPT(strDest, strSrc, srcStrLen * sizeof(wchar_t));
|
||||
*(strDest + srcStrLen) = L'\0';
|
||||
return EOK;
|
||||
} else {
|
||||
strDest[0] = L'\0';
|
||||
SECUREC_ERROR_BUFFER_OVERLAP("wcsncpy_s");
|
||||
return EOVERLAP_AND_RESET;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The wcsncpy_s function copies not more than n successive wide characters
|
||||
* (not including the terminating null wide character)
|
||||
* from the array pointed to by strSrc to the array pointed to by strDest
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* strDest Destination string.
|
||||
* destMax The size of the destination string, in characters.
|
||||
* strSrc Source string.
|
||||
* count Number of characters to be copied.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* strDest is updated
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* EOK Success
|
||||
* EINVAL strDest is NULL and destMax != 0 and destMax <= SECUREC_WCHAR_STRING_MAX_LEN
|
||||
* EINVAL_AND_RESET strDest != NULL and strSrc is NULLL and destMax != 0
|
||||
* and destMax <= SECUREC_WCHAR_STRING_MAX_LEN
|
||||
* ERANGE destMax > SECUREC_WCHAR_STRING_MAX_LEN or destMax is 0
|
||||
* ERANGE_AND_RESET count > SECUREC_WCHAR_STRING_MAX_LEN or
|
||||
* (destMax <= length of strSrc and destMax <= count and strDest != strSrc
|
||||
* and strDest != NULL and strSrc != NULL and destMax != 0 and
|
||||
* destMax <= SECUREC_WCHAR_STRING_MAX_LEN and not overlap)
|
||||
* EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and all parameters are valid
|
||||
*
|
||||
*
|
||||
* If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid
|
||||
*/
|
||||
errno_t wcsncpy_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count)
|
||||
{
|
||||
if (destMax == 0 || destMax > SECUREC_WCHAR_STRING_MAX_LEN) {
|
||||
SECUREC_ERROR_INVALID_RANGE("wcsncpy_s");
|
||||
return ERANGE;
|
||||
}
|
||||
if (strDest == NULL || strSrc == NULL) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("wcsncpy_s");
|
||||
if (strDest != NULL) {
|
||||
strDest[0] = L'\0';
|
||||
return EINVAL_AND_RESET;
|
||||
}
|
||||
return EINVAL;
|
||||
}
|
||||
if (count > SECUREC_WCHAR_STRING_MAX_LEN) {
|
||||
#ifdef SECUREC_COMPATIBLE_WIN_FORMAT
|
||||
if (count == (size_t)(-1)) {
|
||||
return SecDoCpyLimitW(strDest, destMax, strSrc, destMax - 1);
|
||||
}
|
||||
#endif
|
||||
strDest[0] = L'\0'; /* Clear dest string */
|
||||
SECUREC_ERROR_INVALID_RANGE("wcsncpy_s");
|
||||
return ERANGE_AND_RESET;
|
||||
}
|
||||
|
||||
if (count == 0) {
|
||||
strDest[0] = L'\0';
|
||||
return EOK;
|
||||
}
|
||||
|
||||
return SecDoCpyLimitW(strDest, destMax, strSrc, count);
|
||||
}
|
||||
|
|
@ -1,113 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: wcstok_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securecutil.h"
|
||||
|
||||
SECUREC_INLINE int SecIsInDelimitW(wchar_t ch, const wchar_t *strDelimit)
|
||||
{
|
||||
const wchar_t *ctl = strDelimit;
|
||||
while (*ctl != L'\0' && *ctl != ch) {
|
||||
++ctl;
|
||||
}
|
||||
return (int)(*ctl != L'\0');
|
||||
}
|
||||
|
||||
/*
|
||||
* Find beginning of token (skip over leading delimiters).
|
||||
* Note that there is no token if this loop sets string to point to the terminal null.
|
||||
*/
|
||||
SECUREC_INLINE wchar_t *SecFindBeginW(wchar_t *strToken, const wchar_t *strDelimit)
|
||||
{
|
||||
wchar_t *token = strToken;
|
||||
while (*token != L'\0') {
|
||||
if (SecIsInDelimitW(*token, strDelimit) != 0) {
|
||||
++token;
|
||||
continue;
|
||||
}
|
||||
/* Don't find any delimiter in string header, break the loop */
|
||||
break;
|
||||
}
|
||||
return token;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the end of the token. If it is not the end of the string, put a null there.
|
||||
*/
|
||||
SECUREC_INLINE wchar_t *SecFindRestW(wchar_t *strToken, const wchar_t *strDelimit)
|
||||
{
|
||||
wchar_t *token = strToken;
|
||||
while (*token != L'\0') {
|
||||
if (SecIsInDelimitW(*token, strDelimit) != 0) {
|
||||
/* Find a delimiter, set string termintor */
|
||||
*token = L'\0';
|
||||
++token;
|
||||
break;
|
||||
}
|
||||
++token;
|
||||
}
|
||||
return token;
|
||||
}
|
||||
|
||||
/*
|
||||
* Update Token wide character function
|
||||
*/
|
||||
SECUREC_INLINE wchar_t *SecUpdateTokenW(wchar_t *strToken, const wchar_t *strDelimit, wchar_t **context)
|
||||
{
|
||||
/* Point to updated position. Record string position for next search in the context */
|
||||
*context = SecFindRestW(strToken, strDelimit);
|
||||
/* Determine if a token has been found */
|
||||
if (*context == strToken) {
|
||||
return NULL;
|
||||
}
|
||||
return strToken;
|
||||
}
|
||||
|
||||
/*
|
||||
* <NAME>
|
||||
* wcstok_s
|
||||
*
|
||||
*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The wcstok_s function is the wide-character equivalent of the strtok_s function
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* strToken String containing token or tokens.
|
||||
* strDelimit Set of delimiter characters.
|
||||
* context Used to store position information between calls to
|
||||
* wcstok_s.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* context is updated
|
||||
* <RETURN VALUE>
|
||||
* The wcstok_s function is the wide-character equivalent of the strtok_s function
|
||||
*/
|
||||
wchar_t *wcstok_s(wchar_t *strToken, const wchar_t *strDelimit, wchar_t **context)
|
||||
{
|
||||
wchar_t *orgToken = strToken;
|
||||
/* Validation section */
|
||||
if (context == NULL || strDelimit == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
if (orgToken == NULL && *context == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
/* If string==NULL, continue with previous string */
|
||||
if (orgToken == NULL) {
|
||||
orgToken = *context;
|
||||
}
|
||||
orgToken = SecFindBeginW(orgToken, strDelimit);
|
||||
return SecUpdateTokenW(orgToken, strDelimit, context);
|
||||
}
|
||||
|
|
@ -1,67 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: wmemcpy_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securecutil.h"
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The wmemcpy_s function copies n successive wide characters
|
||||
* from the object pointed to by src into the object pointed to by dest.t.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* dest Destination buffer.
|
||||
* destMax Size of the destination buffer.
|
||||
* src Buffer to copy from.
|
||||
* count Number of characters to copy.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* dest buffer is uptdated.
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* EOK Success
|
||||
* EINVAL dest is NULL and destMax != 0 and count <= destMax
|
||||
* and destMax <= SECUREC_WCHAR_MEM_MAX_LEN
|
||||
* EINVAL_AND_RESET dest != NULL and src is NULLL and destMax != 0
|
||||
* and destMax <= SECUREC_WCHAR_MEM_MAX_LEN and count <= destMax
|
||||
* ERANGE destMax > SECUREC_WCHAR_MEM_MAX_LEN or destMax is 0 or
|
||||
* (count > destMax and dest is NULL and destMax != 0
|
||||
* and destMax <= SECUREC_WCHAR_MEM_MAX_LEN)
|
||||
* ERANGE_AND_RESET count > destMax and dest != NULL and destMax != 0
|
||||
* and destMax <= SECUREC_WCHAR_MEM_MAX_LEN
|
||||
* EOVERLAP_AND_RESET dest buffer and source buffer are overlapped and
|
||||
* count <= destMax destMax != 0 and destMax <= SECUREC_WCHAR_MEM_MAX_LEN
|
||||
* and dest != NULL and src != NULL and dest != src
|
||||
*
|
||||
* if an error occured, dest will be filled with 0 when dest and destMax valid .
|
||||
* If the source and destination overlap, the behavior of wmemcpy_s is undefined.
|
||||
* Use wmemmove_s to handle overlapping regions.
|
||||
*/
|
||||
errno_t wmemcpy_s(wchar_t *dest, size_t destMax, const wchar_t *src, size_t count)
|
||||
{
|
||||
if (destMax == 0 || destMax > SECUREC_WCHAR_MEM_MAX_LEN) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("wmemcpy_s");
|
||||
return ERANGE;
|
||||
}
|
||||
if (count > destMax) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("wmemcpy_s");
|
||||
if (dest != NULL) {
|
||||
(void)memset(dest, 0, destMax * sizeof(wchar_t));
|
||||
return ERANGE_AND_RESET;
|
||||
}
|
||||
return ERANGE;
|
||||
}
|
||||
return memcpy_s(dest, destMax * sizeof(wchar_t), src, count * sizeof(wchar_t));
|
||||
}
|
||||
|
|
@ -1,66 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: wmemmove_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securecutil.h"
|
||||
|
||||
/*
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The wmemmove_s function copies n successive wide characters from the object pointed
|
||||
* to by src into the object pointed to by dest.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* dest Destination buffer.
|
||||
* destMax Size of the destination buffer.
|
||||
* src Source object.
|
||||
* count Number of bytes or character to copy.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* dest is updated.
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* EOK Success
|
||||
* EINVAL dest is NULL and destMax != 0 and count <= destMax
|
||||
* and destMax <= SECUREC_WCHAR_MEM_MAX_LEN
|
||||
* EINVAL_AND_RESET dest != NULL and src is NULLL and destMax != 0
|
||||
* and destMax <= SECUREC_WCHAR_MEM_MAX_LEN and count <= destMax
|
||||
* ERANGE destMax > SECUREC_WCHAR_MEM_MAX_LEN or destMax is 0 or
|
||||
* (count > destMax and dest is NULL and destMax != 0
|
||||
* and destMax <= SECUREC_WCHAR_MEM_MAX_LEN)
|
||||
* ERANGE_AND_RESET count > destMax and dest != NULL and destMax != 0
|
||||
* and destMax <= SECUREC_WCHAR_MEM_MAX_LEN
|
||||
*
|
||||
*
|
||||
* If an error occured, dest will be filled with 0 when dest and destMax valid.
|
||||
* If some regions of the source area and the destination overlap, wmemmove_s
|
||||
* ensures that the original source bytes in the overlapping region are copied
|
||||
* before being overwritten
|
||||
*/
|
||||
errno_t wmemmove_s(wchar_t *dest, size_t destMax, const wchar_t *src, size_t count)
|
||||
{
|
||||
if (destMax == 0 || destMax > SECUREC_WCHAR_MEM_MAX_LEN) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("wmemmove_s");
|
||||
return ERANGE;
|
||||
}
|
||||
if (count > destMax) {
|
||||
SECUREC_ERROR_INVALID_PARAMTER("wmemmove_s");
|
||||
if (dest != NULL) {
|
||||
(void)memset(dest, 0, destMax * sizeof(wchar_t));
|
||||
return ERANGE_AND_RESET;
|
||||
}
|
||||
return ERANGE;
|
||||
}
|
||||
return memmove_s(dest, destMax * sizeof(wchar_t), src, count * sizeof(wchar_t));
|
||||
}
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2014-2020. All rights reserved.
|
||||
* Licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
* Description: wscanf_s function
|
||||
* Author: lishunda
|
||||
* Create: 2014-02-25
|
||||
*/
|
||||
|
||||
#include "securec.h"
|
||||
|
||||
/*
|
||||
* <NAME>
|
||||
* <FUNCTION DESCRIPTION>
|
||||
* The wscanf_s function is the wide-character equivalent of the scanf_s function
|
||||
* The wscanf_s function reads data from the standard input stream stdin and
|
||||
* writes the data into the location that's given by argument. Each argument
|
||||
* must be a pointer to a variable of a type that corresponds to a type specifier
|
||||
* in format. If copying occurs between strings that overlap, the behavior is
|
||||
* undefined.
|
||||
*
|
||||
* <INPUT PARAMETERS>
|
||||
* format Format control string.
|
||||
* ... Optional arguments.
|
||||
*
|
||||
* <OUTPUT PARAMETERS>
|
||||
* ... the converted value stored in user assigned address
|
||||
*
|
||||
* <RETURN VALUE>
|
||||
* Returns the number of fields successfully converted and assigned;
|
||||
* the return value does not include fields that were read but not assigned.
|
||||
* A return value of 0 indicates that no fields were assigned.
|
||||
* return -1 if an error occurs.
|
||||
*/
|
||||
int wscanf_s(const wchar_t *format, ...)
|
||||
{
|
||||
int ret; /* If initialization causes e838 */
|
||||
va_list argList;
|
||||
|
||||
va_start(argList, format);
|
||||
ret = vwscanf_s(format, argList);
|
||||
va_end(argList);
|
||||
(void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
19
kal/BUILD.gn
19
kal/BUILD.gn
|
@ -27,29 +27,22 @@
|
|||
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import("//build/lite/config/component/lite_component.gni")
|
||||
|
||||
declare_args() {
|
||||
enable_ohos_kernel_liteos_m_cmsis = true
|
||||
enable_ohos_kernel_liteos_m_posix = true
|
||||
}
|
||||
|
||||
static_library("kal") {
|
||||
sources = [ "kal.c" ]
|
||||
lite_component("kal") {
|
||||
|
||||
include_dirs = [
|
||||
"../kernel/arch/include",
|
||||
"../kernel/include",
|
||||
"../utils",
|
||||
"../kal/cmsis",
|
||||
"../kal",
|
||||
]
|
||||
|
||||
deps = []
|
||||
features = []
|
||||
|
||||
if (enable_ohos_kernel_liteos_m_cmsis == true) {
|
||||
deps += [ "cmsis/" ]
|
||||
features += [ "cmsis" ]
|
||||
}
|
||||
|
||||
if (enable_ohos_kernel_liteos_m_posix == true) {
|
||||
deps += [ "posix/" ]
|
||||
features += [ "posix" ]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,14 +28,13 @@
|
|||
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
static_library("cmsis") {
|
||||
sources = [ "cmsis_liteos.c" ]
|
||||
sources = [ "cmsis_liteos2.c" ]
|
||||
|
||||
include_dirs = [
|
||||
"//third_party/bounds_checking_function/include",
|
||||
"../../third_party/bounds_checking_function/include",
|
||||
"../../third_party/cmsis/CMSIS/RTOS2/Include",
|
||||
"../../kernel/include",
|
||||
"../../kernel/arch/include",
|
||||
"../../utils",
|
||||
"../../kal/cmsis",
|
||||
"../../kal",
|
||||
]
|
||||
}
|
||||
|
|
|
@ -1,201 +0,0 @@
|
|||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "{}"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright {yyyy} {name of copyright owner}
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
|
@ -1,11 +0,0 @@
|
|||
[
|
||||
{
|
||||
"Name" : "CMSIS",
|
||||
"License" : "Apache License V2.0",
|
||||
"License File" : "LICENSE.txt",
|
||||
"Version Number" : "5.7.0",
|
||||
"Owner" : "denny.shenwei@huawei.com",
|
||||
"Upstream URL" : "http://www.arm.com/zh/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php",
|
||||
"Description" : "The Cortex Microcontroller Software Interface Standard (CMSIS) is a vendor-independent hardware abstraction layer for microcontrollers that are based on Arm® Cortex® processors"
|
||||
}
|
||||
]
|
|
@ -1,38 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "los_config.h"
|
||||
|
||||
#if (CMSIS_OS_VER == 1)
|
||||
#error "cmsis version 1.0 is not supported now!"
|
||||
#elif (CMSIS_OS_VER == 2)
|
||||
#include "cmsis_liteos2.c"
|
||||
#endif
|
|
@ -29,7 +29,8 @@
|
|||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "cmsis_os.h"
|
||||
#include "cmsis_os2.h"
|
||||
#include "kal.h"
|
||||
#include "los_event.h"
|
||||
#include "los_membox.h"
|
||||
#include "los_memory.h"
|
||||
|
@ -40,13 +41,11 @@
|
|||
#include "los_swtmr.h"
|
||||
#include "los_task.h"
|
||||
#include "los_timer.h"
|
||||
#include "kal.h"
|
||||
#include "los_debug.h"
|
||||
|
||||
#include "string.h"
|
||||
#include "securec.h"
|
||||
|
||||
#if (CMSIS_OS_VER == 2)
|
||||
|
||||
/* Kernel initialization state */
|
||||
static osKernelState_t g_kernelState;
|
||||
|
@ -626,6 +625,13 @@ uint32_t osThreadGetCount(void)
|
|||
}
|
||||
|
||||
|
||||
void osThreadExit(void)
|
||||
{
|
||||
(void)LOS_TaskDelete(LOS_CurTaskIDGet());
|
||||
UNREACHABLE;
|
||||
}
|
||||
|
||||
|
||||
osStatus_t osDelay(uint32_t ticks)
|
||||
{
|
||||
UINT32 uwRet = LOS_OK;
|
||||
|
@ -696,6 +702,34 @@ osTimerId_t osTimerNew(osTimerFunc_t func, osTimerType_t type, void *argument, c
|
|||
return (osTimerId_t)OS_SWT_FROM_SID(usSwTmrID);
|
||||
}
|
||||
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
|
||||
osTimerId_t osTimerExtNew(osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr,
|
||||
osTimerRouses_t ucRouses, osTimerAlign_t ucSensitive)
|
||||
{
|
||||
UNUSED(attr);
|
||||
UINT32 usSwTmrID;
|
||||
UINT8 mode;
|
||||
|
||||
if ((OS_INT_ACTIVE) || (NULL == func) || ((osTimerOnce != type) && (osTimerPeriodic != type))) {
|
||||
return (osTimerId_t)NULL;
|
||||
}
|
||||
|
||||
if (osTimerOnce == type) {
|
||||
mode = LOS_SWTMR_MODE_NO_SELFDELETE;
|
||||
} else {
|
||||
mode = LOS_SWTMR_MODE_PERIOD;
|
||||
}
|
||||
if (LOS_OK != LOS_SwtmrCreate(1, mode, (SWTMR_PROC_FUNC)func, &usSwTmrID,
|
||||
(UINT32)(UINTPTR)argument, ucRouses, ucSensitive)) {
|
||||
return (osTimerId_t)NULL;
|
||||
}
|
||||
|
||||
return (osTimerId_t)OS_SWT_FROM_SID(usSwTmrID);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
osStatus_t osTimerStart(osTimerId_t timer_id, uint32_t ticks)
|
||||
{
|
||||
UINT32 uwRet;
|
||||
|
@ -1326,12 +1360,9 @@ osStatus_t osMessageQueueDelete(osMessageQueueId_t mq_id)
|
|||
return osErrorResource;
|
||||
}
|
||||
}
|
||||
void osThreadExit(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#define MP_ALLOC 1U
|
||||
#define MD_ALLOC 2U
|
||||
#define MEM_POOL_VALID 0xFFEEFF00
|
||||
|
@ -1618,5 +1649,3 @@ const char *osMemoryPoolGetName(osMemoryPoolId_t mp_id)
|
|||
|
||||
return p;
|
||||
}
|
||||
|
||||
#endif // (CMSIS_OS_VER == 2)
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,56 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef HOS_CMSIS_ADP_H
|
||||
#define HOS_CMSIS_ADP_H
|
||||
|
||||
#include "cmsis_os.h"
|
||||
#include "los_compiler.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#endif /* __cplusplus */
|
||||
|
||||
typedef struct {
|
||||
osSemaphoreAttr_t attr;
|
||||
UINT32 maxCount;
|
||||
UINT32 initialCount;
|
||||
} SemaphoreEx;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif
|
62
kal/kal.c
62
kal/kal.c
|
@ -1,62 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
|
||||
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
||||
* to endorse or promote products derived from this software without specific prior written
|
||||
* permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "kal.h"
|
||||
#include "los_interrupt.h"
|
||||
#include "los_swtmr.h"
|
||||
|
||||
|
||||
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
|
||||
osTimerId_t osTimerExtNew(osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr,
|
||||
osTimerRouses_t ucRouses, osTimerAlign_t ucSensitive)
|
||||
{
|
||||
UNUSED(attr);
|
||||
UINT32 usSwTmrID;
|
||||
UINT8 mode;
|
||||
|
||||
if ((OS_INT_ACTIVE) || (NULL == func) || ((osTimerOnce != type) && (osTimerPeriodic != type))) {
|
||||
return (osTimerId_t)NULL;
|
||||
}
|
||||
|
||||
if (osTimerOnce == type) {
|
||||
mode = LOS_SWTMR_MODE_NO_SELFDELETE;
|
||||
} else {
|
||||
mode = LOS_SWTMR_MODE_PERIOD;
|
||||
}
|
||||
if (LOS_OK != LOS_SwtmrCreate(1, mode, (SWTMR_PROC_FUNC)func, &usSwTmrID,
|
||||
(UINT32)(UINTPTR)argument, ucRouses, ucSensitive)) {
|
||||
return (osTimerId_t)NULL;
|
||||
}
|
||||
|
||||
return (osTimerId_t)OS_SWT_FROM_SID(usSwTmrID);
|
||||
}
|
||||
#endif
|
||||
|
|
@ -37,6 +37,7 @@ static_library("posix") {
|
|||
"src/pthread_mutex.c",
|
||||
"src/semaphore.c",
|
||||
"src/time.c",
|
||||
"src/pthread_cond.c",
|
||||
]
|
||||
|
||||
include_dirs = [
|
||||
|
|
|
@ -29,7 +29,6 @@
|
|||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#include "los_interrupt.h"
|
||||
#include "ARMCM3.h"
|
||||
#include <stdarg.h>
|
||||
#include "securec.h"
|
||||
#include "los_context.h"
|
||||
|
|
|
@ -82,7 +82,7 @@ extern VOID *HalTskStackInit(UINT32 taskID, UINT32 stackSize, VOID *topStack);
|
|||
* <ul><li>los_hw.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see None.
|
||||
*/
|
||||
LITE_OS_SEC_TEXT_MINOR VOID HalSysExit(VOID) NORETURN;
|
||||
LITE_OS_SEC_TEXT_MINOR NORETURN VOID HalSysExit(VOID);
|
||||
|
||||
/* *
|
||||
* @ingroup los_context
|
||||
|
|
|
@ -504,8 +504,8 @@ extern VOID LOS_Msleep(UINT32 mSecs);
|
|||
* @see
|
||||
*/
|
||||
extern UINT32 LOS_Start(VOID);
|
||||
extern VOID LOS_Reboot(VOID) NORETURN;
|
||||
extern VOID LOS_Panic(const CHAR *fmt, ...) NORETURN;
|
||||
extern NORETURN VOID LOS_Reboot(VOID);
|
||||
extern NORETURN VOID LOS_Panic(const CHAR *fmt, ...);
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
@ -363,7 +363,7 @@
|
|||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\kernel\arch\arm\cortex-m3\keil\cmsis\ARMCM3.h</PathWithFileName>
|
||||
<PathWithFileName>..\CMSIS\ARMCM3.h</PathWithFileName>
|
||||
<FilenameWithoutPath>ARMCM3.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
|
@ -375,7 +375,7 @@
|
|||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\kernel\arch\arm\cortex-m3\keil\cmsis\core_cm3.h</PathWithFileName>
|
||||
<PathWithFileName>..\CMSIS\core_cm3.h</PathWithFileName>
|
||||
<FilenameWithoutPath>core_cm3.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
|
@ -387,7 +387,7 @@
|
|||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\kernel\arch\arm\cortex-m3\keil\cmsis\core_cmFunc.h</PathWithFileName>
|
||||
<PathWithFileName>..\CMSIS\core_cmFunc.h</PathWithFileName>
|
||||
<FilenameWithoutPath>core_cmFunc.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
|
@ -399,7 +399,7 @@
|
|||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\kernel\arch\arm\cortex-m3\keil\cmsis\core_cmInstr.h</PathWithFileName>
|
||||
<PathWithFileName>..\CMSIS\core_cmInstr.h</PathWithFileName>
|
||||
<FilenameWithoutPath>core_cmInstr.h</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
|
@ -583,7 +583,7 @@
|
|||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\components\bounds_checking_function\src\memcpy_s.c</PathWithFileName>
|
||||
<PathWithFileName>..\..\..\third_party\bounds_checking_function\src\memcpy_s.c</PathWithFileName>
|
||||
<FilenameWithoutPath>memcpy_s.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
|
@ -595,7 +595,7 @@
|
|||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\components\bounds_checking_function\src\memmove_s.c</PathWithFileName>
|
||||
<PathWithFileName>..\..\..\third_party\bounds_checking_function\src\memmove_s.c</PathWithFileName>
|
||||
<FilenameWithoutPath>memmove_s.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
|
@ -607,7 +607,7 @@
|
|||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\components\bounds_checking_function\src\memset_s.c</PathWithFileName>
|
||||
<PathWithFileName>..\..\..\third_party\bounds_checking_function\src\memset_s.c</PathWithFileName>
|
||||
<FilenameWithoutPath>memset_s.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
|
@ -619,7 +619,7 @@
|
|||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\components\bounds_checking_function\src\strcpy_s.c</PathWithFileName>
|
||||
<PathWithFileName>..\..\..\third_party\bounds_checking_function\src\strcpy_s.c</PathWithFileName>
|
||||
<FilenameWithoutPath>strcpy_s.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
|
@ -631,7 +631,7 @@
|
|||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\..\..\components\bounds_checking_function\src\strncpy_s.c</PathWithFileName>
|
||||
<PathWithFileName>..\..\..\third_party\bounds_checking_function\src\strncpy_s.c</PathWithFileName>
|
||||
<FilenameWithoutPath>strncpy_s.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
|
|
|
@ -378,7 +378,7 @@
|
|||
<MiscControls>--gnu</MiscControls>
|
||||
<Define></Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..\cortex-m3_stm32f103_simulator_keil;..\..\..\kernel\include;..\..\..\kernel\arch\arm\cortex-m3\keil;..\..\..\kernel\arch\arm\cortex-m3\keil\cmsis;..\..\..\kernel\src;..\..\..\components\bounds_checking_function\include;..\..\..\components\cpup;..\..\..\utils;..\..\..\kernel\arch\include;..\..\..\components\exchook</IncludePath>
|
||||
<IncludePath>..;..\CMSIS;..\..\..\kernel\include;..\..\..\kernel\arch\arm\cortex-m3\keil;..\..\..\kernel\src;..\..\..\third_party\bounds_checking_function\include;..\..\..\components\cpup;..\..\..\utils;..\..\..\kernel\arch\include;..\..\..\components\exchook</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
|
@ -480,22 +480,22 @@
|
|||
<File>
|
||||
<FileName>ARMCM3.h</FileName>
|
||||
<FileType>5</FileType>
|
||||
<FilePath>..\..\..\kernel\arch\arm\cortex-m3\keil\cmsis\ARMCM3.h</FilePath>
|
||||
<FilePath>..\CMSIS\ARMCM3.h</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>core_cm3.h</FileName>
|
||||
<FileType>5</FileType>
|
||||
<FilePath>..\..\..\kernel\arch\arm\cortex-m3\keil\cmsis\core_cm3.h</FilePath>
|
||||
<FilePath>..\CMSIS\core_cm3.h</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>core_cmFunc.h</FileName>
|
||||
<FileType>5</FileType>
|
||||
<FilePath>..\..\..\kernel\arch\arm\cortex-m3\keil\cmsis\core_cmFunc.h</FilePath>
|
||||
<FilePath>..\CMSIS\core_cmFunc.h</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>core_cmInstr.h</FileName>
|
||||
<FileType>5</FileType>
|
||||
<FilePath>..\..\..\kernel\arch\arm\cortex-m3\keil\cmsis\core_cmInstr.h</FilePath>
|
||||
<FilePath>..\CMSIS\core_cmInstr.h</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>los_cpup.c</FileName>
|
||||
|
@ -580,27 +580,27 @@
|
|||
<File>
|
||||
<FileName>memcpy_s.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\components\bounds_checking_function\src\memcpy_s.c</FilePath>
|
||||
<FilePath>..\..\..\third_party\bounds_checking_function\src\memcpy_s.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>memmove_s.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\components\bounds_checking_function\src\memmove_s.c</FilePath>
|
||||
<FilePath>..\..\..\third_party\bounds_checking_function\src\memmove_s.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>memset_s.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\components\bounds_checking_function\src\memset_s.c</FilePath>
|
||||
<FilePath>..\..\..\third_party\bounds_checking_function\src\memset_s.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>strcpy_s.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\components\bounds_checking_function\src\strcpy_s.c</FilePath>
|
||||
<FilePath>..\..\..\third_party\bounds_checking_function\src\strcpy_s.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>strncpy_s.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\components\bounds_checking_function\src\strncpy_s.c</FilePath>
|
||||
<FilePath>..\..\..\third_party\bounds_checking_function\src\strncpy_s.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>los_exc_info.c</FileName>
|
||||
|
|
|
@ -36,6 +36,8 @@
|
|||
#ifndef _TARGET_CONFIG_H
|
||||
#define _TARGET_CONFIG_H
|
||||
|
||||
#include "ARMCM3.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
|
|
|
@ -122,7 +122,7 @@
|
|||
<file>$PROJ_DIR$\Debug\Obj\iar_stm32f429ig_fire-challenger.o</file>
|
||||
<file>$PROJ_DIR$\..\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_dbgmcu.h</file>
|
||||
<file>$PROJ_DIR$\Debug\Obj\stm32f4xx_exti.__cstat.et</file>
|
||||
<file>$PROJ_DIR$\..\..\..\components\bounds_checking_function\include\securec.h</file>
|
||||
<file>$PROJ_DIR$\..\..\..\third_party\bounds_checking_function\include\securec.h</file>
|
||||
<file>$TOOLKIT_DIR$\inc\c\stddef.h</file>
|
||||
<file>$TOOLKIT_DIR$\inc\c\string.h</file>
|
||||
<file>$PROJ_DIR$\Debug\Obj\los_demo.pbd</file>
|
||||
|
@ -177,7 +177,7 @@
|
|||
<file>$PROJ_DIR$\Debug\Obj\startup_stm32f429_439xx.o</file>
|
||||
<file>$PROJ_DIR$\..\Libraries\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_gpio.h</file>
|
||||
<file>$PROJ_DIR$\Debug\Obj\system_stm32f4xx.__cstat.et</file>
|
||||
<file>$PROJ_DIR$\..\..\..\components\bounds_checking_function\include\securectype.h</file>
|
||||
<file>$PROJ_DIR$\..\..\..\third_party\bounds_checking_function\include\securectype.h</file>
|
||||
<file>$PROJ_DIR$\Debug\Obj\stm32f4xx_rcc.o</file>
|
||||
<file>$PROJ_DIR$\Debug\Obj\stm324x9i_eval.o</file>
|
||||
<file>$PROJ_DIR$\Debug\Obj\los_misc.o</file>
|
||||
|
|
|
@ -357,7 +357,7 @@
|
|||
<state>$PROJ_DIR$\..\..\..\components\cppsupport</state>
|
||||
<state>$PROJ_DIR$\..\Utilities\STM32_EVAL\STM324x9I_EVAL</state>
|
||||
<state>$PROJ_DIR$\..\Utilities\STM32_EVAL\Common</state>
|
||||
<state>$PROJ_DIR$\..\..\..\components\bounds_checking_function\include</state>
|
||||
<state>$PROJ_DIR$\..\..\..\third_party\bounds_checking_function\include</state>
|
||||
<state>$PROJ_DIR$\..\..\..\utils</state>
|
||||
<state>$PROJ_DIR$\..\..\..\components\exchook</state>
|
||||
</option>
|
||||
|
|
|
@ -5,14 +5,17 @@ LITEOSTOPDIR := $(realpath $(LITEOSTOPDIR))
|
|||
C_SOURCES += $(wildcard $(LITEOSTOPDIR)/kernel/src/*.c) \
|
||||
$(wildcard $(LITEOSTOPDIR)/kernel/src/mm/*.c) \
|
||||
$(wildcard $(LITEOSTOPDIR)/components/cpup/*.c) \
|
||||
$(wildcard $(LITEOSTOPDIR)/components/bounds_checking_function/src/*.c) \
|
||||
$(wildcard $(LITEOSTOPDIR)/third_party/bounds_checking_function/src/*.c) \
|
||||
$(wildcard $(LITEOSTOPDIR)/utils/*.c) \
|
||||
$(wildcard $(LITEOSTOPDIR)/kal/posix/src/*.c) \
|
||||
Core/Src/task_sample.c
|
||||
|
||||
C_INCLUDES += -I$(LITEOSTOPDIR)/utils \
|
||||
-I$(LITEOSTOPDIR)/kal/posix/include \
|
||||
-I$(LITEOSTOPDIR)/kernel/include \
|
||||
-I$(LITEOSTOPDIR)/components/cpup \
|
||||
-I$(LITEOSTOPDIR)/components/bounds_checking_function/include
|
||||
-I$(LITEOSTOPDIR)/third_party/cmsis/CMSIS/RTOS2/Include \
|
||||
-I$(LITEOSTOPDIR)/third_party/bounds_checking_function/include
|
||||
|
||||
# Related to arch
|
||||
ASM_SOURCES += $(wildcard $(LITEOSTOPDIR)/kernel/arch/arm/cortex-m7/gcc/*.s)
|
||||
|
@ -23,8 +26,9 @@ C_SOURCES += $(wildcard $(LITEOSTOPDIR)/kernel/arch/arm/cortex-m7/gcc/*.c)
|
|||
|
||||
C_INCLUDES += -I. \
|
||||
-I$(LITEOSTOPDIR)/kernel/arch/include \
|
||||
-I$(LITEOSTOPDIR)/kernel/arch/arm/cortex-m7/gcc \
|
||||
-I$(LITEOSTOPDIR)/kernel/arch/arm/cortex-m7/gcc/cmsis
|
||||
-I$(LITEOSTOPDIR)/kernel/arch/arm/cortex-m7/gcc
|
||||
|
||||
CFLAGS += -nostdinc -nostdlib
|
||||
|
||||
# list of ASM .S program objects
|
||||
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASMS_SOURCES:.S=.o)))
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Subproject commit ebef58f44419d0694e984d25acac231e737d60ff
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 2ab5422fccd0ac2583fb616ee52051f6a043506a
|
|
@ -74,6 +74,10 @@ extern "C" {
|
|||
#define NORETURN __attribute__ ((__noreturn__))
|
||||
#endif
|
||||
|
||||
#ifndef UNREACHABLE
|
||||
#define UNREACHABLE while (1)
|
||||
#endif
|
||||
|
||||
/* for ARM Compiler */
|
||||
#elif defined(__CC_ARM)
|
||||
|
||||
|
@ -105,6 +109,10 @@ extern "C" {
|
|||
#define NORETURN __declspec(noreturn)
|
||||
#endif
|
||||
|
||||
#ifndef UNREACHABLE
|
||||
#define UNREACHABLE while (1)
|
||||
#endif
|
||||
|
||||
#pragma anon_unions
|
||||
|
||||
/* for GNU Compiler */
|
||||
|
@ -138,6 +146,10 @@ extern "C" {
|
|||
#define NORETURN __attribute__ ((__noreturn__))
|
||||
#endif
|
||||
|
||||
#ifndef UNREACHABLE
|
||||
#define UNREACHABLE __builtin_unreachable()
|
||||
#endif
|
||||
|
||||
#else
|
||||
#error Unknown compiler.
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue