From 758cd0b472d1dc0c23a36f5073d2b36678ddc4d1 Mon Sep 17 00:00:00 2001 From: zianed Date: Wed, 19 May 2021 11:30:01 +0800 Subject: [PATCH 1/3] sync code to l0l1 --- .gitattributes | 15 + .gitignore | 4 + OAT.xml | 99 +++++ README.md | 6 +- README_zh.md | 8 +- core/shared/include/hdf_device_info.h | 72 ---- core/shared/src/hdf_device_info.c | 1 - figures/architecture-of-the-hdf.png | Bin 81696 -> 76207 bytes model/network/common/netdevice/net_device.c | 23 +- model/network/wifi/core/hdf_wifi_core.c | 16 +- model/network/wifi/core/hdf_wifi_core.h | 4 +- support/platform/include/emmc_core.h | 6 +- support/platform/include/plat_common.h | 2 +- support/platform/include/plat_log.h | 2 +- support/platform/include/sdio_core.h | 2 +- support/platform/include/watchdog_core.h | 2 +- support/platform/src/gpio_core.c | 6 +- support/platform/src/watchdog_if.c | 1 - support/posix/src/osal_mutex.c | 2 +- support/posix/src/osal_spinlock.c | 108 +++++ support/posix/src/osal_thread.c | 6 +- .../hcs_parser/unittest/hcs_config_test.c | 68 +-- test/unittest/common/hdf_common_test.c | 2 +- test/unittest/common/hdf_main_test.c | 2 +- test/unittest/manager/sample_driver_test.c | 2 - .../wifi/unittest/net/hdf_netbuf_test.c | 4 +- .../wifi/unittest/netdevice/net_device_test.c | 6 +- .../wifi/unittest/qos/flow_control_test.c | 2 +- test/unittest/osal/osal_all_test.c | 20 +- test/unittest/osal/osal_get_case_test.c | 2 +- test/unittest/osal/osal_test_entry.c | 2 +- test/unittest/platform/common/emmc_test.c | 18 +- test/unittest/platform/common/gpio_test.c | 2 +- .../platform/common/i2c_driver_test.c | 16 +- test/unittest/platform/common/i2c_test.c | 12 +- .../platform/common/platform_driver_test.c | 2 +- test/unittest/platform/common/sdio_test.c | 26 +- test/unittest/platform/common/uart_test.c | 16 +- test/unittest/platform/common/watchdog_test.c | 2 +- .../platform/hdf_mipi_dsi_entry_test.c | 2 +- test/unittest/platform/hdf_rtc_entry_test.c | 58 +-- test/unittest/platform/hdf_rtc_entry_test.h | 2 +- test/unittest/sensor/hdf_sensor_test.c | 2 +- test/unittest/wifi/hdf_wifi_test.c | 7 +- test/unittest/wifi/hdf_wifi_test.h | 1 - tools/hc-gen/Makefile | 2 +- tools/hc-gen/README.md | 2 +- tools/hc-gen/bin/hc-gen | Bin 92808 -> 80360 bytes tools/hc-gen/include/hcs_compiler.h | 6 +- tools/hc-gen/include/hcs_decompiler.h | 4 +- tools/hc-gen/include/hcs_file.h | 18 +- tools/hc-gen/include/hcs_gener.h | 4 +- tools/hc-gen/include/hcs_log.h | 14 +- tools/hc-gen/include/hcs_opcode.h | 2 +- tools/hc-gen/include/hcs_option.h | 14 +- tools/hc-gen/src/hcs_ast.c | 25 +- tools/hc-gen/src/hcs_bytecode_gen.c | 15 +- tools/hc-gen/src/hcs_decompile_gen.c | 82 ++-- tools/hc-gen/src/hcs_decompiler.c | 10 +- tools/hc-gen/src/hcs_file.c | 153 ++++--- tools/hc-gen/src/hcs_hexdump.c | 5 +- tools/hc-gen/src/hcs_mem.c | 7 +- tools/hc-gen/src/hcs_middle.c | 19 +- tools/hc-gen/src/hcs_opcode.c | 4 +- tools/hc-gen/src/hcs_option.c | 33 +- tools/hc-gen/src/hcs_parser.c | 2 +- tools/hc-gen/src/hcs_text_gen.c | 397 ++++++------------ 67 files changed, 749 insertions(+), 730 deletions(-) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 OAT.xml create mode 100644 support/posix/src/osal_spinlock.c diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..51c63e295 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,15 @@ +*.tgz filter=lfs diff=lfs merge=lfs -text +*.trp filter=lfs diff=lfs merge=lfs -text +*.apk filter=lfs diff=lfs merge=lfs -text +*.jar filter=lfs diff=lfs merge=lfs -text +*.mp4 filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.asm filter=lfs diff=lfs merge=lfs -text +*.8svn filter=lfs diff=lfs merge=lfs -text +*.9svn filter=lfs diff=lfs merge=lfs -text +*.dylib filter=lfs diff=lfs merge=lfs -text +*.exe filter=lfs diff=lfs merge=lfs -text +*.a filter=lfs diff=lfs merge=lfs -text +*.so filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.dll filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..755f09aa6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.o +*.a +*.d +*.cmd diff --git a/OAT.xml b/OAT.xml new file mode 100644 index 000000000..9877bc288 --- /dev/null +++ b/OAT.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/README.md b/README.md index 27cb7c89a..e182839b0 100644 --- a/README.md +++ b/README.md @@ -156,9 +156,9 @@ For details, see [WLAN Overview](https://gitee.com/openharmony/docs/blob/master drivers\_framework -[drivers\_adapter\_uhdf](https://gitee.com/openharmony/drivers_adapter_uhdf/blob/master/README.md) +[drivers\_adapter](https://gitee.com/openharmony/drivers_adapter/blob/master/README.md) -[drivers\_adapter\_khdf\_linux](https://gitee.com/openharmony/drivers_adapter_uhdf/blob/master/README.md) +[drivers\_adapter\_khdf\_linux](https://gitee.com/openharmony/drivers_adapter_khdf_linux/blob/master/README.md) -[drivers\_adapter\_khdf\_liteos](https://gitee.com/openharmony/drivers_adapter_uhdf/blob/master/README.md) +[drivers\_peripheral](https://gitee.com/openharmony/drivers_peripheral/blob/master/README.md) diff --git a/README_zh.md b/README_zh.md index 9cac92994..ecc7f41f8 100644 --- a/README_zh.md +++ b/README_zh.md @@ -156,13 +156,9 @@ HDF驱动框架详细开发请参考[驱动开发指南](https://gitee.com/openh drivers\_framework -[drivers\_adapter\_uhdf](https://gitee.com/openharmony/drivers_adapter_uhdf/blob/master/README_zh.md) +[drivers\_adapter](https://gitee.com/openharmony/drivers_adapter/blob/master/README_zh.md) [drivers\_adapter\_khdf\_linux](https://gitee.com/openharmony/drivers_adapter_khdf_linux/blob/master/README_zh.md) -[drivers\_adapter\_khdf\_liteos](https://gitee.com/openharmony/drivers_adapter_khdf_liteos/blob/master/README_zh.md) - - - -
+[drivers\_peripheral](https://gitee.com/openharmony/drivers_peripheral/blob/master/README_zh.md) diff --git a/core/shared/include/hdf_device_info.h b/core/shared/include/hdf_device_info.h index b77ec148c..de2f2984d 100755 --- a/core/shared/include/hdf_device_info.h +++ b/core/shared/include/hdf_device_info.h @@ -12,9 +12,6 @@ #include "hdf_device_desc.h" #include "hdf_slist.h" -#define USB_PNP_INFO_MAX_INTERFACES 32 -#define USB_PNP_DEBUG_STRING "" - enum { HDF_SERVICE_UNUSABLE, HDF_SERVICE_USABLE, @@ -39,75 +36,6 @@ struct HdfDeviceInfo { const char *moduleName; const char *svcName; const char *deviceMatchAttr; - const void *private; -}; - -enum UsbPnpNotifyServiceCmd { - USB_PNP_NOTIFY_ADD_INTERFACE, - USB_PNP_NOTIFY_REMOVE_INTERFACE, - USB_PNP_NOTIFY_REPORT_INTERFACE, -}; - -enum UsbPnpNotifyRemoveType { - USB_PNP_NOTIFY_REMOVE_BUS_DEV_NUM, - USB_PNP_NOTIFY_REMOVE_INTERFACE_NUM, -}; - -enum { - USB_PNP_NOTIFY_MATCH_VENDOR = 0x0001, - USB_PNP_NOTIFY_MATCH_PRODUCT = 0x0002, - USB_PNP_NOTIFY_MATCH_DEV_LOW = 0x0004, - USB_PNP_NOTIFY_MATCH_DEV_HIGH = 0x0008, - USB_PNP_NOTIFY_MATCH_DEV_CLASS = 0x0010, - USB_PNP_NOTIFY_MATCH_DEV_SUBCLASS = 0x0020, - USB_PNP_NOTIFY_MATCH_DEV_PROTOCOL = 0x0040, - USB_PNP_NOTIFY_MATCH_INT_CLASS = 0x0080, - USB_PNP_NOTIFY_MATCH_INT_SUBCLASS = 0x0100, - USB_PNP_NOTIFY_MATCH_INT_PROTOCOL = 0x0200, - USB_PNP_NOTIFY_MATCH_INT_NUMBER = 0x0400, -}; - -struct UsbPnpNotifyServiceInfo { - int32_t length; - - int32_t devNum; - int32_t busNum; - - int32_t interfaceLength; - uint8_t interfaceNumber[USB_PNP_INFO_MAX_INTERFACES]; -} __attribute__ ((packed)); - -struct UsbPnpNotifyInterfaceInfo { - uint8_t interfaceClass; - uint8_t interfaceSubClass; - uint8_t interfaceProtocol; - - uint8_t interfaceNumber; -}; - -struct UsbPnpNotifyDeviceInfo { - uint16_t vendorId; - uint16_t productId; - - uint16_t bcdDeviceLow; - uint16_t bcdDeviceHigh; - - uint8_t deviceClass; - uint8_t deviceSubClass; - uint8_t deviceProtocol; -}; - -struct UsbPnpNotifyMatchInfoTable { - uint32_t usbDevAddr; - int32_t devNum; - int32_t busNum; - - struct UsbPnpNotifyDeviceInfo deviceInfo; - - uint8_t removeType; - uint8_t numInfos; - - struct UsbPnpNotifyInterfaceInfo interfaceInfo[USB_PNP_INFO_MAX_INTERFACES]; }; struct HdfDeviceInfo *HdfDeviceInfoNewInstance(void); diff --git a/core/shared/src/hdf_device_info.c b/core/shared/src/hdf_device_info.c index 29653af9f..9228d56fd 100755 --- a/core/shared/src/hdf_device_info.c +++ b/core/shared/src/hdf_device_info.c @@ -29,7 +29,6 @@ void HdfDeviceInfoConstruct(struct HdfDeviceInfo *deviceInfo) deviceInfo->svcName = NULL; deviceInfo->moduleName = NULL; deviceInfo->deviceMatchAttr = NULL; - deviceInfo->private = NULL; } struct HdfDeviceInfo *HdfDeviceInfoNewInstance() diff --git a/figures/architecture-of-the-hdf.png b/figures/architecture-of-the-hdf.png index 2bd6a1d84c8f3e284fb684a40bddca7286bbeb58..f4eb8c3cb2702c9f1c29b84448174648dbbe0114 100644 GIT binary patch literal 76207 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 XG|jJ72%YjI1OC)i@7~C|j_~~-A33$# literal 81696 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�Sh6LDlCPqb`@CIv4GRB3=zX=d|?( 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 MAX_NETDEVICE_COUNT) { HDF_LOGE("%s error because of not enough space!", __func__); @@ -68,7 +68,6 @@ static struct NetDeviceImpl *InitNetDeviceImpl(NetDevice *nd, NetIfCategory ifCa HDF_LOGE("%s fail: OsalMemCalloc fail!", __func__); return NULL; } - (void)memset_s(ndImpl, sizeof(struct NetDeviceImpl), 0, sizeof(struct NetDeviceImpl)); ndImpl->netDevice = nd; if (RegisterNetDeviceImpl(ndImpl) != HDF_SUCCESS) { @@ -100,6 +99,7 @@ static void DeInitNetDeviceImpl(struct NetDeviceImpl *netDeviceImpl) /* last release netDeviceImpl */ OsalMemFree(netDeviceImpl); + netDeviceImpl = NULL; HDF_LOGI("%s success!", __func__); return; } @@ -117,7 +117,7 @@ static struct NetDeviceImpl *GetImplByNetDevice(const struct NetDevice *netDevic } } } - HDF_LOGE("Don't Get Impl by netdevice"); + HDF_LOGE("%s Get Impl by netdevice failed", __func__); return ndImpl; } @@ -125,7 +125,7 @@ struct NetDevice *NetDeviceInit(const char *ifName, uint32_t len, NetIfCategory { NetDevice *netDevice = NULL; struct NetDeviceImpl *ndImpl = NULL; - int32_t index = 0; + uint32_t index = 0; int32_t ret; if ((ifName == NULL) || (strlen(ifName) != len) || (strlen(ifName) > IFNAMSIZ - 1)) { @@ -137,9 +137,8 @@ struct NetDevice *NetDeviceInit(const char *ifName, uint32_t len, NetIfCategory HDF_LOGE("%s fail: OsalMemCalloc fail!", __func__); return NULL; } - (void)memset_s(netDevice, sizeof(NetDevice), 0, sizeof(NetDevice)); - if (memcpy_s(netDevice->name, IFNAMSIZ, ifName, len + 1) != EOK) { - HDF_LOGE("%s fail: memcpy_s fail!", __func__); + if (strcpy_s(netDevice->name, IFNAMSIZ, ifName) != EOK) { + HDF_LOGE("%s fail: strcpy_s fail!", __func__); OsalMemFree(netDevice); return NULL; } @@ -318,7 +317,7 @@ static int32_t NetIfRxImpl(const struct NetDevice *netDevice, NetBuf *buff, Rece ProcessingResult ret = PROCESSING_CONTINUE; if (ndImpl == NULL || ndImpl->interFace == NULL || ndImpl->interFace->receive == NULL) { - HDF_LOGE("NetIfRxImpl fail : netdevice not exist!"); + HDF_LOGE("%s: NetIfRxImpl fail : netdevice not exist!", __func__); return HDF_ERR_INVALID_PARAM; } @@ -333,7 +332,7 @@ static int32_t NetIfRxImpl(const struct NetDevice *netDevice, NetBuf *buff, Rece HDF_LOGI("NetIfRxImpl specialEtherType Process not need TCP/IP stack!"); return HDF_SUCCESS; } else { - HDF_LOGE("NetIfRxImpl specialEtherType Process error"); + HDF_LOGE("%s: NetIfRxImpl specialEtherType Process error", __func__); return HDF_FAILURE; } } diff --git a/model/network/wifi/core/hdf_wifi_core.c b/model/network/wifi/core/hdf_wifi_core.c index 321790613..75c26ae92 100644 --- a/model/network/wifi/core/hdf_wifi_core.c +++ b/model/network/wifi/core/hdf_wifi_core.c @@ -39,13 +39,13 @@ int32_t HdfWifiGetBusIdx(void) * @brief as for now, we just support one wlan module in one board cause driver binds to wlan featere * due to that reason, once we detected one chip, we stop rescan. */ -int HdfWlanSdioScan(struct HdfWlanDevice *data, struct HdfConfigWlanBus *busConfig) +int32_t HdfWlanSdioScan(struct HdfWlanDevice *data, struct HdfConfigWlanBus *busConfig) { /* get config vendId, deviceId and chip-name which used in detect match process */ HdfWlanGetSdioTableByConfig(); HdfWlanSdioScanTriggerByBusIndex(busConfig->busIdx); - int ret = HdfWlanGetDetectedChip(data, busConfig); + int32_t ret = HdfWlanGetDetectedChip(data, busConfig); HdfWlanSdioDriverUnReg(); if (ret != HDF_SUCCESS) { return ret; @@ -54,7 +54,7 @@ int HdfWlanSdioScan(struct HdfWlanDevice *data, struct HdfConfigWlanBus *busConf return HDF_SUCCESS; } -static int HdfWifiDriverBind(struct HdfDeviceObject *dev) +static int32_t HdfWifiDriverBind(struct HdfDeviceObject *dev) { ErrorCode errCode; static struct IDeviceIoService wifiService = { @@ -179,7 +179,7 @@ static struct HdfChipDriverFactory *HdfWlanGetDriverFactory(const char *driverNa static int32_t HdfWlanDeinitInterface(struct HdfWlanDevice *device, const char *ifName, struct HdfChipDriverFactory *factory) { - int ret; + int32_t ret; struct NetDevice *netdev = NULL; struct HdfChipDriver *chipDriver = NULL; @@ -369,7 +369,7 @@ static struct HdfWlanDevice *ProbeDevice(struct HdfConfigWlanDevInst *deviceConf return device; } -int32_t DeinitDevice(struct HdfWlanDevice *device) +int32_t HdfWifiDeinitDevice(struct HdfWlanDevice *device) { struct HdfChipDriverFactory *chipDriverFact = NULL; int32_t ret; @@ -394,7 +394,7 @@ int32_t DeinitDevice(struct HdfWlanDevice *device) return HDF_SUCCESS; } -int32_t InitDevice(struct HdfWlanDevice *device) +int32_t HdfWifiInitDevice(struct HdfWlanDevice *device) { int32_t ret; struct HdfChipDriverFactory *chipDriverFact = NULL; @@ -424,7 +424,7 @@ int32_t InitDevice(struct HdfWlanDevice *device) /* thread callback function */ static int32_t HdfWlanInitThread(void *para) { - const uint32_t initDelaySec = 5; + const uint32_t initDelaySec = 15; struct HdfDeviceObject *device = (struct HdfDeviceObject *)para; struct SubscriberCallback callback = { NULL }; struct HdfConfigWlanDeviceList *devList = NULL; @@ -465,7 +465,7 @@ static int32_t HdfWlanInitThread(void *para) // Load chip driver (void)DevSvcManagerClntSubscribeService(wlanDevice->driverName, callback); - (void)InitDevice(wlanDevice); + (void)HdfWifiInitDevice(wlanDevice); } HDF_LOGV("%s:finished.", __func__); diff --git a/model/network/wifi/core/hdf_wifi_core.h b/model/network/wifi/core/hdf_wifi_core.h index c171fd618..78134dc5e 100644 --- a/model/network/wifi/core/hdf_wifi_core.h +++ b/model/network/wifi/core/hdf_wifi_core.h @@ -17,9 +17,9 @@ extern "C" { #endif int32_t HdfWifiGetBusIdx(void); -int32_t DeinitDevice(struct HdfWlanDevice *device); +int32_t HdfWifiDeinitDevice(struct HdfWlanDevice *device); -int32_t InitDevice(struct HdfWlanDevice *device); +int32_t HdfWifiInitDevice(struct HdfWlanDevice *device); #ifdef __cplusplus } diff --git a/support/platform/include/emmc_core.h b/support/platform/include/emmc_core.h index 55f835f23..d6730afb8 100644 --- a/support/platform/include/emmc_core.h +++ b/support/platform/include/emmc_core.h @@ -6,8 +6,8 @@ * See the LICENSE file in the root of this repository for complete details. */ -#ifndef emmc_CORE_H -#define emmc_CORE_H +#ifndef EMMC_CORE_H +#define EMMC_CORE_H #include "emmc_if.h" #include "hdf_base.h" @@ -39,7 +39,7 @@ struct EmmcCntlr { /** * @brief emmc host device operations. - * These methods need to be filled up by specific paltform. + * These methods need to be filled up by specific platform. */ struct EmmcMethod { int32_t (*getCid)(struct EmmcCntlr *, uint8_t *, uint32_t); diff --git a/support/platform/include/plat_common.h b/support/platform/include/plat_common.h index e10234ec2..6610dd579 100644 --- a/support/platform/include/plat_common.h +++ b/support/platform/include/plat_common.h @@ -13,4 +13,4 @@ bool PlatInIrqContext(void); -#endif +#endif /* PLATFORM_COMMON_H */ diff --git a/support/platform/include/plat_log.h b/support/platform/include/plat_log.h index 4de73d196..bc2d0671c 100644 --- a/support/platform/include/plat_log.h +++ b/support/platform/include/plat_log.h @@ -17,4 +17,4 @@ #define PLAT_LOGV(fmt, arg...) HDF_LOGV(fmt, ##arg) #endif -#endif +#endif /* PLATFORM_LOG_H */ diff --git a/support/platform/include/sdio_core.h b/support/platform/include/sdio_core.h index 92a8d7cb7..ef18b6c5c 100644 --- a/support/platform/include/sdio_core.h +++ b/support/platform/include/sdio_core.h @@ -38,7 +38,7 @@ struct SdioCntlr { /** * @brief sdio host device operations. - * These methods need to be filled up by specific paltform. + * These methods need to be filled up by specific platform. */ struct SdioMethod { int32_t (*incrAddrReadBytes)(struct SdioCntlr *, uint8_t *, uint32_t, uint32_t, uint32_t); diff --git a/support/platform/include/watchdog_core.h b/support/platform/include/watchdog_core.h index 43bb1de6d..846204735 100644 --- a/support/platform/include/watchdog_core.h +++ b/support/platform/include/watchdog_core.h @@ -45,7 +45,7 @@ struct WatchdogMethod { /** * @brief Add a new WatchdogCntlr to HDF. * - * @param cntlr The watchdog conroller to be added. + * @param cntlr The watchdog controller to be added. * * @return Returns 0 on success; returns a negative value otherwise. * @since 1.0 diff --git a/support/platform/src/gpio_core.c b/support/platform/src/gpio_core.c index eaca59078..7224aeb2b 100644 --- a/support/platform/src/gpio_core.c +++ b/support/platform/src/gpio_core.c @@ -212,7 +212,7 @@ static int32_t GpioIrqBridgeFunc(uint16_t local, void *data) (void)local; (void)OsalSpinLockIrqSave(&bridge->spin, &flags); - if (bridge->stop == false) { + if (!bridge->stop) { (void)OsalSemPost(&bridge->sem); } (void)OsalSpinUnlockIrqRestore(&bridge->spin, &flags); @@ -230,7 +230,7 @@ static int GpioIrqThreadWorker(void *data) if (ret != HDF_SUCCESS) { continue; } - if (bridge->stop == true) { + if (bridge->stop) { break; } PLAT_LOGV("GpioIrqThreadWorker: enter! gpio:%u-%u", bridge->cntlr->start, bridge->local); @@ -320,7 +320,7 @@ static void GpioIrqBridgeDestroy(struct GpioIrqBridge *bridge) #ifndef __KERNEL__ uint32_t flags; (void)OsalSpinLockIrqSave(&bridge->spin, &flags); - if (bridge->stop == false) { + if (!bridge->stop) { bridge->stop = true; (void)OsalSemPost(&bridge->sem); } diff --git a/support/platform/src/watchdog_if.c b/support/platform/src/watchdog_if.c index cf317f5f9..b67506eef 100644 --- a/support/platform/src/watchdog_if.c +++ b/support/platform/src/watchdog_if.c @@ -46,7 +46,6 @@ static struct Watchdog *WatchdogGetById(int16_t wdtId) return service; } - DevHandle WatchdogOpen(int16_t wdtId) { struct Watchdog *service = NULL; diff --git a/support/posix/src/osal_mutex.c b/support/posix/src/osal_mutex.c index 8ca666628..6769c9210 100644 --- a/support/posix/src/osal_mutex.c +++ b/support/posix/src/osal_mutex.c @@ -106,7 +106,7 @@ int32_t OsalMutexTimedLock(struct OsalMutex *mutex, uint32_t ms) if (ret == ETIMEDOUT) { return HDF_ERR_TIMEOUT; } else { - HDF_LOGE("%s time_out time:%d ret:%d", __func__, ms, ret); + HDF_LOGE("%s time_out time:%u ret:%d", __func__, ms, ret); return HDF_FAILURE; } } diff --git a/support/posix/src/osal_spinlock.c b/support/posix/src/osal_spinlock.c new file mode 100644 index 000000000..695623b83 --- /dev/null +++ b/support/posix/src/osal_spinlock.c @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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. + */ + +#include "osal_spinlock.h" +#include +#include "hdf_log.h" +#include "osal_mem.h" + +#define HDF_LOG_TAG osal_spinlock + +int32_t OsalSpinInit(OsalSpinlock *spinlock) +{ + pthread_spinlock_t *spinTmp = NULL; + int ret; + + if (spinlock == NULL) { + HDF_LOGE("%s invalid param", __func__); + return HDF_ERR_INVALID_PARAM; + } + + spinlock->realSpinlock = NULL; + + spinTmp = (pthread_spinlock_t *)OsalMemCalloc(sizeof(pthread_spinlock_t)); + if (spinTmp == NULL) { + HDF_LOGE("malloc fail"); + return HDF_ERR_MALLOC_FAIL; + } + + ret = pthread_spin_init(spinTmp, PTHREAD_PROCESS_PRIVATE); + if (ret != 0) { + HDF_LOGE("pthread_spin_init fail %d %d", ret, __LINE__); + OsalMemFree(spinTmp); + return HDF_FAILURE; + } + spinlock->realSpinlock = (void *)spinTmp; + + return HDF_SUCCESS; +} + +int32_t OsalSpinDestroy(OsalSpinlock *spinlock) +{ + int ret; + + if (spinlock == NULL || spinlock->realSpinlock == NULL) { + HDF_LOGE("%s invalid param", __func__); + return HDF_ERR_INVALID_PARAM; + } + + ret = pthread_spin_destroy((pthread_spinlock_t *)spinlock->realSpinlock); + if (ret != 0) { + HDF_LOGE("pthread_spin_destroy fail %d %d", ret, __LINE__); + return HDF_FAILURE; + } + + OsalMemFree(spinlock->realSpinlock); + spinlock->realSpinlock = NULL; + + return HDF_SUCCESS; +} + +int32_t OsalSpinLock(OsalSpinlock *spinlock) +{ + int ret; + + if (spinlock == NULL || spinlock->realSpinlock == NULL) { + HDF_LOGE("%s invalid param", __func__); + return HDF_ERR_INVALID_PARAM; + } + + ret = pthread_spin_lock((pthread_spinlock_t *)spinlock->realSpinlock); + if (ret != 0) { + HDF_LOGE("pthread_spin_lock fail %d %d", ret, __LINE__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t OsalSpinUnlock(OsalSpinlock *spinlock) +{ + int ret; + + if (spinlock == NULL || spinlock->realSpinlock == NULL) { + HDF_LOGE("%s invalid param", __func__); + return HDF_ERR_INVALID_PARAM; + } + + ret = pthread_spin_unlock((pthread_spinlock_t *)spinlock->realSpinlock); + if (ret != 0) { + HDF_LOGE("pthread_spin_unlock fail %d %d", ret, __LINE__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + diff --git a/support/posix/src/osal_thread.c b/support/posix/src/osal_thread.c index fc621b420..bdf5e16c4 100644 --- a/support/posix/src/osal_thread.c +++ b/support/posix/src/osal_thread.c @@ -12,8 +12,6 @@ #include "hdf_log.h" #include "osal_mem.h" -#define OSAL_PTHREAD_STACK_MIN 4096 - #define HDF_LOG_TAG osal_thread typedef void *(*PosixEntry)(void *data); @@ -75,7 +73,7 @@ int32_t OsalThreadCreate(struct OsalThread *thread, OsalThreadEntry threadEntry, int32_t OsalThreadDestroy(struct OsalThread *thread) { - if (thread->realThread != NULL) { + if (thread != NULL && thread->realThread != NULL) { OsalMemFree(thread->realThread); thread->realThread = NULL; } @@ -129,7 +127,7 @@ int32_t OsalThreadStart(struct OsalThread *thread, const struct OsalThreadParam size_t stackSize = param->stackSize; if (stackSize > 0) { - stackSize = (stackSize < OSAL_PTHREAD_STACK_MIN) ? OSAL_PTHREAD_STACK_MIN : stackSize; + stackSize = (stackSize < PTHREAD_STACK_MIN) ? PTHREAD_STACK_MIN : stackSize; resultCode = pthread_attr_setstacksize(&attribute, stackSize); if (resultCode != 0) { HDF_LOGE("pthread_attr_setstacksize errorno: %d", resultCode); diff --git a/test/unittest/ability/config/hcs_parser/unittest/hcs_config_test.c b/test/unittest/ability/config/hcs_parser/unittest/hcs_config_test.c index 654698f27..cb2ea0c12 100644 --- a/test/unittest/ability/config/hcs_parser/unittest/hcs_config_test.c +++ b/test/unittest/ability/config/hcs_parser/unittest/hcs_config_test.c @@ -258,7 +258,7 @@ int HcsTestGetUint8ArrayElemSuccess(void) { uint8_t data[DATA_TEST_ARRAY_LENGTH] = { 0 }; // the test data is 0, 1, 2, 3, 4, 5, 6, 7. - uint8_t testData[DATA_TEST_ARRAY_LENGTH] = {0, 1, 2, 3, 4, 5, 6, 7}; + uint8_t testData[DATA_TEST_ARRAY_LENGTH] = { 0, 1, 2, 3, 4, 5, 6, 7 }; uint32_t i; if (!TestGetRootNode()) { return HDF_FAILURE; @@ -272,7 +272,7 @@ int HcsTestGetUint8ArrayElemSuccess(void) int32_t ret = g_devResInstance->GetUint8ArrayElem(dataType, TEST_U8_ELEM_DATA, i, &data[i], DEFAULT_UINT8_MAX); if ((ret != HDF_SUCCESS) || (data[i] != testData[i])) { - HDF_LOGE("%s failed, line: %d, ret = %d, i = %d, data = %u", __FUNCTION__, __LINE__, ret, i, data[i]); + HDF_LOGE("%s failed, line: %d, ret = %d, i = %u, data = %u", __FUNCTION__, __LINE__, ret, i, data[i]); return HDF_FAILURE; } } @@ -303,7 +303,7 @@ int HcsTestGetUint8ArrayElemFail(void) for (i = 0; i < count; i++) { ret = g_devResInstance->GetUint8ArrayElem(dataType, READ_FOUR_DATA_TYPE, i, &data1[i], DEFAULT_UINT8_MAX); } - // the 0~3 represents the loction in array. + // the 0~3 represents the location in array. if ((ret == HDF_SUCCESS) || (data1[0] != U8_DATA) || (data1[1] != DEFAULT_UINT8_MAX) || (data1[2] != DEFAULT_UINT8_MAX) || (data1[3] != DEFAULT_UINT8_MAX)) { HDF_LOGE("%s failed, line: %d, ret = %d, data = %x", __FUNCTION__, __LINE__, ret, data); @@ -321,7 +321,7 @@ int HcsTestGetUint8ArraySuccess(void) const struct DeviceResourceNode *dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); int32_t ret = g_devResInstance->GetUint8Array(dataType, TEST_U8_ELEM_DATA, data, DATA_TEST_ARRAY_LENGTH, DEFAULT_UINT8_MAX); - // the 0~7 represents the loction in array or the value in hcs file. + // the 0~7 represents the location in array or the value in hcs file. if ((ret != HDF_SUCCESS) || (data[0] != 0) || (data[1] != 1) || (data[2] != 2) || (data[3] != 3) || (data[4] != 4) || (data[5] != 5) || (data[6] != 6) || (data[7] != 7)) { return HDF_FAILURE; @@ -337,13 +337,13 @@ int HcsTestGetUint8ArrayFail(void) } const struct DeviceResourceNode *dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); int32_t ret = g_devResInstance->GetUint8Array(dataType, READ_FOUR_DATA_TYPE, data, 0, DEFAULT_UINT8_MAX); - // the 0, 1, 2 represents the loction in array, the 0 of second param is defalut value. + // the 0, 1, 2 represents the location in array, the 0 of second param is default value. if ((ret == HDF_SUCCESS) || (data[0] != 0) || (data[1] != 0) || (data[2] != 0)) { return HDF_FAILURE; } ret = g_devResInstance->GetUint8Array(dataType, READ_FOUR_DATA_TYPE, data, DATA_TYPE_NUM_U64 + 1, DEFAULT_UINT8_MAX); - // the 0, 1, 2, 3, 4 represents the loction in array + // the 0, 1, 2, 3, 4 represents the location in array if ((ret == HDF_SUCCESS) || (data[0] != U8_DATA) || (data[1] != DEFAULT_UINT8_MAX) || (data[2] != DEFAULT_UINT8_MAX) || (data[3] != DEFAULT_UINT8_MAX) || (data[4] != DEFAULT_UINT8_MAX)) { return HDF_FAILURE; @@ -402,7 +402,7 @@ int HcsTestGetUint16ArrayElemSuccess(void) // the length of data is 8. uint16_t data[DATA_TEST_ARRAY_LENGTH] = { 0 }; // the test data is 0, 1, 2, 3, 4, 5, 256, 257. - uint16_t testData[DATA_TEST_ARRAY_LENGTH] = {0, 1, 2, 3, 4, 5, 256, 257}; + uint16_t testData[DATA_TEST_ARRAY_LENGTH] = { 0, 1, 2, 3, 4, 5, 256, 257 }; uint32_t i; if (!TestGetRootNode()) { return HDF_FAILURE; @@ -444,7 +444,7 @@ int HcsTestGetUint16ArrayElemFail(void) for (i = 0; i < count; i++) { ret = g_devResInstance->GetUint16ArrayElem(dataType, READ_FOUR_DATA_TYPE, i, &data1[i], DEFAULT_UINT16_MAX); } - // the 0~3 represents the loction in array. + // the 0~3 represents the location in array. if ((ret == HDF_SUCCESS) || (data1[0] != U8_DATA) || (data1[1] != U16_DATA) || (data1[2] != DEFAULT_UINT16_MAX) || (data1[3] != DEFAULT_UINT16_MAX)) { return HDF_FAILURE; @@ -461,7 +461,7 @@ int HcsTestGetUint16ArraySuccess(void) const struct DeviceResourceNode *dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); int32_t ret = g_devResInstance->GetUint16Array(dataType, TEST_U16_ELEM_DATA, data, DATA_TEST_ARRAY_LENGTH, DEFAULT_UINT16_MAX); - // the data[0~7] represents the loction in array, the test data is 0, 1, 2, 3, 4, 5, 256, 257. + // the data[0~7] represents the location in array, the test data is 0, 1, 2, 3, 4, 5, 256, 257. if ((ret != HDF_SUCCESS) || (data[0] != 0) || (data[1] != 1) || (data[2] != 2) || (data[3] != 3) || (data[4] != 4) || (data[5] != 5) || (data[6] != 256) || (data[7] != 257)) { return HDF_FAILURE; @@ -477,13 +477,13 @@ int HcsTestGetUint16ArrayFail(void) } const struct DeviceResourceNode *dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); int32_t ret = g_devResInstance->GetUint16Array(dataType, READ_FOUR_DATA_TYPE, data, 0, DEFAULT_UINT16_MAX); - // the 0, 1, 2 represents the loction in array, the 0 of second param is defalut value. + // the 0, 1, 2 represents the location in array, the 0 of second param is default value. if ((ret == HDF_SUCCESS) || (data[0] != 0) || (data[1] != 0) || (data[2] != 0)) { return HDF_FAILURE; } ret = g_devResInstance->GetUint16Array(dataType, READ_FOUR_DATA_TYPE, data, DATA_TYPE_NUM_U64 + 1, DEFAULT_UINT16_MAX); - // the 0, 1, 2, 3, 4 represents the loction in array + // the 0, 1, 2, 3, 4 represents the location in array if ((ret == HDF_SUCCESS) || (data[0] != U8_DATA) || (data[1] != U16_DATA) || (data[2] != DEFAULT_UINT16_MAX) || (data[3] != DEFAULT_UINT16_MAX) || (data[4] != DEFAULT_UINT16_MAX)) { return HDF_FAILURE; @@ -537,7 +537,7 @@ int HcsTestGetUint32AttrValueFail(void) int HcsTestGetUint32ArrayElemSuccess(void) { uint32_t data[DATA_TYPE_NUM_U32] = { 0 }; - uint32_t testData[DATA_TYPE_NUM_U32] = {U8_DATA, U16_DATA, U32_DATA}; + uint32_t testData[DATA_TYPE_NUM_U32] = { U8_DATA, U16_DATA, U32_DATA }; int32_t i; if (!TestGetRootNode()) { return HDF_FAILURE; @@ -578,7 +578,7 @@ int HcsTestGetUint32ArraySuccess(void) return HDF_FAILURE; } int32_t ret = g_devResInstance->GetUint32Array(g_testRoot, BOARD_ID, data, BOARDID_LENGTH, DEFAULT_UINT32_MAX); - // the 0, 1 represents the loction in array. + // the 0, 1 represents the location in array. if ((ret != HDF_SUCCESS) || (data[0] != U32_DATA) || (data[1] != U16_DATA)) { return HDF_FAILURE; } @@ -592,12 +592,12 @@ int HcsTestGetUint32ArrayFail(void) return HDF_FAILURE; } int32_t ret = g_devResInstance->GetUint32Array(g_testRoot, BOARD_ID, data, 0, DEFAULT_UINT32_MAX); - // the 0, 1, 2 represents the loction in array, the 0 of second param is defalut value. + // the 0, 1, 2 represents the location in array, the 0 of second param is default value. if ((ret == HDF_SUCCESS) || (data[0] != 0) || (data[1] != 0) || (data[2] != 0)) { return HDF_FAILURE; } ret = g_devResInstance->GetUint32Array(g_testRoot, BOARD_ID, data, DATA_TYPE_NUM_U32, DEFAULT_UINT32_MAX); - // the 0, 1, 2 represents the loction in array + // the 0, 1, 2 represents the location in array if ((ret == HDF_SUCCESS) || (data[0] != U32_DATA) || (data[1] != U16_DATA) || (data[2] != DEFAULT_UINT32_MAX)) { return HDF_FAILURE; } @@ -655,7 +655,7 @@ int HcsTestGetUint64AttrValueFail(void) int HcsTestGetUint64ArrayElemSuccess(void) { uint64_t data[DATA_TYPE_NUM_U64] = { 0 }; - uint64_t testData[DATA_TYPE_NUM_U64] = {U8_DATA, U16_DATA, U32_DATA, U64_DATA}; + uint64_t testData[DATA_TYPE_NUM_U64] = { U8_DATA, U16_DATA, U32_DATA, U64_DATA }; uint32_t i; if (!TestGetRootNode()) { return HDF_FAILURE; @@ -699,7 +699,7 @@ int HcsTestGetUint64ArraySuccess(void) const struct DeviceResourceNode *dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); int32_t ret = g_devResInstance->GetUint64Array(dataType, READ_FOUR_DATA_TYPE, data, DATA_TYPE_NUM_U64, DEFAULT_UINT64_MAX); - // the 0, 1, 2 represents the loction in array. + // the 0, 1, 2 represents the location in array. if ((ret != HDF_SUCCESS) || (data[0] != U8_DATA) || (data[1] != U16_DATA) || (data[2] != U32_DATA) || (data[3] != U64_DATA)) { return HDF_FAILURE; @@ -715,13 +715,13 @@ int HcsTestGetUint64ArrayFail(void) } const struct DeviceResourceNode *dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); int32_t ret = g_devResInstance->GetUint64Array(dataType, READ_FOUR_DATA_TYPE, data, 0, DEFAULT_UINT64_MAX); - // the 0, 1, 2 represents the loction in array, the 0 of second param is defalut value. + // the 0, 1, 2 represents the location in array, the 0 of second param is default value. if ((ret == HDF_SUCCESS) || (data[0] != 0) || (data[1] != 0) || (data[2] != 0)) { return HDF_FAILURE; } ret = g_devResInstance->GetUint64Array(dataType, READ_FOUR_DATA_TYPE, data, DATA_TYPE_NUM_U64 + 1, DEFAULT_UINT64_MAX); - // the 0, 1, 2, 3, 4 represents the loction in array + // the 0, 1, 2, 3, 4 represents the location in array if ((ret == HDF_SUCCESS) || (data[0] != U8_DATA) || (data[1] != U16_DATA) || (data[2] != U32_DATA) || (data[3] != U64_DATA) || (data[4] != DEFAULT_UINT64_MAX)) { return HDF_FAILURE; @@ -865,7 +865,7 @@ int HcsTestTraverseAttrInNodeFail(void) const struct DeviceResourceNode *childNode = NULL; DEV_RES_NODE_FOR_EACH_CHILD_NODE(fingerprintNode, childNode) { - if (childNode == NULL) { + if ((childNode == NULL) || (childNode->name == NULL)) { break; } if ((strcmp(childNode->name, "fingerprint_one") == 0) || (strcmp(childNode->name, "fingerprint_two") == 0)) { @@ -886,9 +886,9 @@ int HcsTestGetStringSuccess(void) return HDF_FAILURE; } const struct DeviceResourceNode *audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); - const char *ptype = NULL; - int32_t readString = g_devResInstance->GetString(audioNode, "cust_name", &ptype, NULL); - if ((readString != HDF_SUCCESS) || (ptype == NULL) || (strcmp(ptype, "audio_custom_v2") != HDF_SUCCESS)) { + const char *type = NULL; + int32_t readString = g_devResInstance->GetString(audioNode, "cust_name", &type, NULL); + if ((readString != HDF_SUCCESS) || (type == NULL) || (strcmp(type, "audio_custom_v2") != HDF_SUCCESS)) { return HDF_FAILURE; } return HDF_SUCCESS; @@ -900,17 +900,17 @@ int HcsTestGetStringFail(void) return HDF_FAILURE; } const struct DeviceResourceNode *audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); - const char *ptype = NULL; - int32_t testReadString = g_devResInstance->GetString(audioNode, INVALID_STRING, &ptype, STRING_ATTR_VALUE); - if ((testReadString == HDF_SUCCESS) || (ptype == NULL) || (strcmp(ptype, STRING_ATTR_VALUE) != HDF_SUCCESS)) { + const char *type = NULL; + int32_t testReadString = g_devResInstance->GetString(audioNode, INVALID_STRING, &type, STRING_ATTR_VALUE); + if ((testReadString == HDF_SUCCESS) || (type == NULL) || (strcmp(type, STRING_ATTR_VALUE) != HDF_SUCCESS)) { return HDF_FAILURE; } testReadString = g_devResInstance->GetString(audioNode, INVALID_STRING, NULL, STRING_ATTR_VALUE); - if ((testReadString == HDF_SUCCESS) || (ptype == NULL) || (strcmp(ptype, STRING_ATTR_VALUE) != HDF_SUCCESS)) { + if ((testReadString == HDF_SUCCESS) || (type == NULL) || (strcmp(type, STRING_ATTR_VALUE) != HDF_SUCCESS)) { return HDF_FAILURE; } - testReadString = g_devResInstance->GetString(audioNode, INVALID_STRING, &ptype, NULL); - if (testReadString == HDF_SUCCESS || ptype != NULL) { + testReadString = g_devResInstance->GetString(audioNode, INVALID_STRING, &type, NULL); + if ((testReadString == HDF_SUCCESS) || (type != NULL)) { return HDF_FAILURE; } return HDF_SUCCESS; @@ -923,17 +923,17 @@ int HcsTestGetStringArrayElemSuccess(void) } const char *rawDataDts = NULL; const struct DeviceResourceNode *fingerprintNode = g_devResInstance->GetChildNode(g_testRoot, FINGERPRINT_INFO); - // the third param is the loction in string_list_names array. + // the third param(0) is the location in string_list_names array. int32_t ret = g_devResInstance->GetStringArrayElem(fingerprintNode, STRING_LIST_NAMES, 0, &rawDataDts, NULL); if ((ret != HDF_SUCCESS) || (strcmp(rawDataDts, "first") != HDF_SUCCESS)) { return HDF_FAILURE; } - // the third param is the loction in string_list_names array. + // the third param(1) is the location in string_list_names array. ret = g_devResInstance->GetStringArrayElem(fingerprintNode, STRING_LIST_NAMES, 1, &rawDataDts, NULL); if ((ret != HDF_SUCCESS) || (strcmp(rawDataDts, "second") != HDF_SUCCESS)) { return HDF_FAILURE; } - // the second param is 2, indicates the index, the third param is the loction in string_list_names array. + // the third param(2) is the location in string_list_names array. ret = g_devResInstance->GetStringArrayElem(fingerprintNode, STRING_LIST_NAMES, 2, &rawDataDts, NULL); if ((ret != HDF_SUCCESS) || (strcmp(rawDataDts, "third") != HDF_SUCCESS)) { return HDF_FAILURE; @@ -948,14 +948,14 @@ int HcsTestGetStringArrayElemFail(void) } const char *rawDataDts = NULL; const struct DeviceResourceNode *fingerprintNode = g_devResInstance->GetChildNode(g_testRoot, FINGERPRINT_INFO); - // the third param(3) is the loction in string_list_names array. + // the third param(3) is the location in string_list_names array. int32_t ret = g_devResInstance->GetStringArrayElem(fingerprintNode, STRING_LIST_NAMES, 3, &rawDataDts, STRING_ATTR_VALUE); if ((ret == HDF_SUCCESS) || (strcmp(rawDataDts, STRING_ATTR_VALUE) != HDF_SUCCESS)) { return HDF_FAILURE; } - // the third param(1) is the loction in string_list_names array. + // the third param(1) is the location in string_list_names array. ret = g_devResInstance->GetStringArrayElem(fingerprintNode, READ_U32_INDEX, 1, &rawDataDts, STRING_ATTR_VALUE); if ((ret == HDF_SUCCESS) || (strcmp(rawDataDts, STRING_ATTR_VALUE) != HDF_SUCCESS)) { return HDF_FAILURE; diff --git a/test/unittest/common/hdf_common_test.c b/test/unittest/common/hdf_common_test.c index d3c9cf8bb..075d51a3b 100644 --- a/test/unittest/common/hdf_common_test.c +++ b/test/unittest/common/hdf_common_test.c @@ -69,7 +69,7 @@ int HdfTestSendMsgToService(struct HdfTestMsg *msg) } if (!HdfSbufReadBuffer(g_reply, (const void **)&testReply, &len)) { - printf("HdfTestSendMsgToService g_reply read failed\n\r"); + printf("HdfTestSendMsgToService g_reply read failed\n\r"); } if (testReply == NULL) { diff --git a/test/unittest/common/hdf_main_test.c b/test/unittest/common/hdf_main_test.c index 039fe9026..ee5e40088 100644 --- a/test/unittest/common/hdf_main_test.c +++ b/test/unittest/common/hdf_main_test.c @@ -127,7 +127,7 @@ static int32_t HdfTestCaseProcess(struct HdfDeviceIoClient *client, replyMsg.cmd = msg->cmd; replyMsg.subCmd = msg->subCmd; - HDF_LOGE("%s::Hdf test receive cmd: command[%d], subCommand[%d]", __func__, msg->cmd, msg->subCmd); + HDF_LOGE("%s::Hdf test receive cmd: command[%u], subCommand[%u]", __func__, msg->cmd, msg->subCmd); replyMsg.result = HDF_FAILURE; for (i = 0; i < sizeof(g_hdfTestFuncList) / sizeof(g_hdfTestFuncList[0]); ++i) { diff --git a/test/unittest/manager/sample_driver_test.c b/test/unittest/manager/sample_driver_test.c index eac190dce..bf69825f9 100644 --- a/test/unittest/manager/sample_driver_test.c +++ b/test/unittest/manager/sample_driver_test.c @@ -12,12 +12,10 @@ #define HDF_LOG_TAG sample_driver_test -#define SAMPLE_WRITE_READ 123 #ifndef INT32_MAX #define INT32_MAX 0x7fffffff #endif - void HdfSampleDriverRelease(struct HdfDeviceObject *deviceObject) { (void)deviceObject; diff --git a/test/unittest/model/network/wifi/unittest/net/hdf_netbuf_test.c b/test/unittest/model/network/wifi/unittest/net/hdf_netbuf_test.c index 76c57ff63..e82ab80d5 100644 --- a/test/unittest/model/network/wifi/unittest/net/hdf_netbuf_test.c +++ b/test/unittest/model/network/wifi/unittest/net/hdf_netbuf_test.c @@ -860,7 +860,7 @@ pTestCaseFunc g_hdfNetBufQueueTestCaseLists[] = { HdfNetBufQueueTest009, }; -// HDFNetBuf test canse Entry +// HDFNetBuf test case Entry int32_t HdfNetBufTest(void) { int32_t ret, i; @@ -879,7 +879,7 @@ int32_t HdfNetBufTest(void) return HDF_SUCCESS; } -// HdfNetBufQueue test canse Entry +// HdfNetBufQueue test case Entry int32_t HdfNetBufQueueTest(void) { int32_t ret, i; diff --git a/test/unittest/model/network/wifi/unittest/netdevice/net_device_test.c b/test/unittest/model/network/wifi/unittest/netdevice/net_device_test.c index d44f00367..5d47a211d 100644 --- a/test/unittest/model/network/wifi/unittest/netdevice/net_device_test.c +++ b/test/unittest/model/network/wifi/unittest/netdevice/net_device_test.c @@ -21,7 +21,10 @@ static bool WiFiNetDeviceTestEnv(void) { if (g_netDevice == NULL) { char devName[IFNAMSIZ] = {0}; - strncpy_s(devName, IFNAMSIZ, "wlan_test_0", strlen("wlan_test_0") + 1); + if (strncpy_s(devName, IFNAMSIZ, "wlan_test_0", strlen("wlan_test_0") + 1) != EOK) { + HDF_LOGE("%s: strcpy_s fail", __func__); + return false; + } g_netDevice = NetDeviceInit(devName, strlen(devName), LITE_OS); if (g_netDevice == NULL) { HDF_LOGE("%s fail ", __func__); @@ -117,6 +120,7 @@ int32_t WiFiNetDviceTestSetAddr(void) int32_t WiFiNetDviceTestRx(void) { NetBuf *buff = NULL; + int count = sizeof(g_filterData); buff = NetBufAlloc(count); if (buff == NULL) { diff --git a/test/unittest/model/network/wifi/unittest/qos/flow_control_test.c b/test/unittest/model/network/wifi/unittest/qos/flow_control_test.c index 1a4a0ba27..3b880ebf6 100644 --- a/test/unittest/model/network/wifi/unittest/qos/flow_control_test.c +++ b/test/unittest/model/network/wifi/unittest/qos/flow_control_test.c @@ -154,7 +154,7 @@ int32_t WiFiFlowControlTestSendData(void) return HDF_FAILURE; } if (g_flowControlInstance->interface == NULL) { - HDF_LOGE("%s interface =null!", __func__); + HDF_LOGE("%s interface = null!", __func__); return HDF_FAILURE; } id = g_flowControlInstance->interface->getQueueIdByEtherBuff(buff); diff --git a/test/unittest/osal/osal_all_test.c b/test/unittest/osal/osal_all_test.c index 1efe4a734..2fa37275b 100644 --- a/test/unittest/osal/osal_all_test.c +++ b/test/unittest/osal/osal_all_test.c @@ -158,7 +158,7 @@ int ThreadTest2(void *arg) OsalGetTime(&hdfTs2); OsalDiffTime(&hdfTs1, &hdfTs2, &hdfTsDiff); if (cnt % HDF_THREAD_TEST_MUX_CNT == 0) { - HDF_LOGE("%s %ds %dus", __func__, + HDF_LOGE("%s %us %uus", __func__, (uint32_t)hdfTsDiff.sec, (uint32_t)hdfTsDiff.usec); } if (g_testEndFlag) { @@ -345,7 +345,7 @@ static void OsaFWTest(int flag) (void)memset_s(&fw, sizeof(fw), 0, sizeof(fw)); ret = OsalRequestFirmware(&fw, name, NULL); UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_FW_REQUEST); - HDF_LOGE("%s %d", name, fw.fwSize); + HDF_LOGE("%s %u", name, fw.fwSize); (void)memset_s(&block, sizeof(block), 0, sizeof(block)); ret = OsalReadFirmware(&fw, &block); @@ -355,10 +355,10 @@ static void OsaFWTest(int flag) #if defined(__LITEOS__) ret = OsalSeekFirmware(&fw, HDF_FILE_SEEK_TEST); UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_FW_SEEK); - HDF_LOGE("%s %d %d", name, block.dataSize, block.curOffset); + HDF_LOGE("%s %u %d", name, block.dataSize, block.curOffset); ret = OsalReadFirmware(&fw, &block); UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_FW_READ); - HDF_LOGE("%s %d %d", name, block.dataSize, block.curOffset); + HDF_LOGE("%s %u %d", name, block.dataSize, block.curOffset); fwBuf += HDF_FILE_SEEK_TEST; UT_TEST_CHECK_RET(memcmp(block.data, fwBuf, block.dataSize) != 0, OSAL_FW_DATA_CHECK); #endif @@ -367,8 +367,6 @@ static void OsaFWTest(int flag) ret = OsalReadFirmware(&fw, &block); UT_TEST_CHECK_RET(ret == HDF_SUCCESS, OSAL_FW_READ_AFTER_RELEASE); HDF_LOGE("[OSAL_UT_TEST]%s end", __func__); - - return; } #define THREAD_TEST_TIMER_RUN 20 @@ -542,8 +540,6 @@ void OsaThreadTest1(void) UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_THREAD_CREATE); ret = OsalThreadStart(&thread, &threadCfg); UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_THREAD_CREATE); - - return; } void OsaThreadTest(void) @@ -601,27 +597,27 @@ static void OsaTimeTest(void) ret = OsalGetTime(&hdfTs2); UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_TIME_GETTIME); ret = OsalDiffTime(&hdfTs, &hdfTs2, &hdfTsDiff); - HDF_LOGE("%s %ds %dus", __func__, (uint32_t)hdfTsDiff.sec, (uint32_t)hdfTsDiff.usec); + HDF_LOGE("%s %us %uus", __func__, (uint32_t)hdfTsDiff.sec, (uint32_t)hdfTsDiff.usec); UT_TEST_CHECK_RET(!OsalCheckTime(&hdfTsDiff, TIME_TEST_SLEEP_S * HDF_KILO_UNIT), OSAL_TIME_DIFFTIME); OsalGetTime(&hdfTs); OsalUDelay(TIME_TEST_SLEEP_MS); (void)OsalGetTime(&hdfTs2); (void)OsalDiffTime(&hdfTs, &hdfTs2, &hdfTsDiff); - HDF_LOGE("%s %ds %dus", __func__, (uint32_t)hdfTsDiff.sec, (uint32_t)hdfTsDiff.usec); + HDF_LOGE("%s %us %uus", __func__, (uint32_t)hdfTsDiff.sec, (uint32_t)hdfTsDiff.usec); OsalGetTime(&hdfTs); OsalMDelay(TIME_TEST_SLEEP_MS); (void)OsalGetTime(&hdfTs2); (void)OsalDiffTime(&hdfTs, &hdfTs2, &hdfTsDiff); - HDF_LOGE("%s %ds %dus", __func__, (uint32_t)hdfTsDiff.sec, (uint32_t)hdfTsDiff.usec); + HDF_LOGE("%s %us %uus", __func__, (uint32_t)hdfTsDiff.sec, (uint32_t)hdfTsDiff.usec); OsalGetTime(&hdfTs); OsalMSleep(TIME_TEST_SLEEP_MS); ret = OsalGetTime(&hdfTs2); UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_TIME_GETTIME); ret = OsalDiffTime(&hdfTs, &hdfTs2, &hdfTsDiff); - HDF_LOGE("%s %ds %dus", __func__, (uint32_t)hdfTsDiff.sec, (uint32_t)hdfTsDiff.usec); + HDF_LOGE("%s %us %uus", __func__, (uint32_t)hdfTsDiff.sec, (uint32_t)hdfTsDiff.usec); UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_TIME_DIFFTIME); UT_TEST_CHECK_RET(!OsalCheckTime(&hdfTsDiff, TIME_TEST_SLEEP_MS), OSAL_TIME_DIFFTIME); } diff --git a/test/unittest/osal/osal_get_case_test.c b/test/unittest/osal/osal_get_case_test.c index 4a2db7350..25b87dffa 100644 --- a/test/unittest/osal/osal_get_case_test.c +++ b/test/unittest/osal/osal_get_case_test.c @@ -11,7 +11,7 @@ int OsalGetTestResult(uint32_t cmd) { - HDF_LOGD("[OSAL_UT_TEST]%s %d start", __func__, cmd); + HDF_LOGD("[OSAL_UT_TEST]%s %u start", __func__, cmd); return OSAL_TEST_CASE_CHECK(cmd); } diff --git a/test/unittest/osal/osal_test_entry.c b/test/unittest/osal/osal_test_entry.c index c53b33030..922e2f527 100644 --- a/test/unittest/osal/osal_test_entry.c +++ b/test/unittest/osal/osal_test_entry.c @@ -29,7 +29,7 @@ int32_t HdfOsalEntry(HdfTestMsg *msg) return HDF_FAILURE; } - HDF_LOGD("HdfTest:osal test result[%s-%d %d]", ((result != 0) ? "failed" : "pass"), result, msg->subCmd); + HDF_LOGD("HdfTest:osal test result[%s-%d %u]", ((result != 0) ? "failed" : "pass"), result, msg->subCmd); msg->result = (result != 0) ? HDF_FAILURE : HDF_SUCCESS; return HDF_SUCCESS; diff --git a/test/unittest/platform/common/emmc_test.c b/test/unittest/platform/common/emmc_test.c index 02dc29db6..9aaab3e40 100644 --- a/test/unittest/platform/common/emmc_test.c +++ b/test/unittest/platform/common/emmc_test.c @@ -46,7 +46,7 @@ static int32_t TestEmmcGetCid(struct EmmcTester *tester) ret = EmmcGetCid(tester->handle, cid, EMMC_CID_LEN); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: EmmcGetCid fail! ret=%d.", __func__, ret); + HDF_LOGE("%s: EmmcGetCid failed ret=%d.", __func__, ret); return HDF_FAILURE; } for (i = 0; i < EMMC_CID_LEN; i++) { @@ -62,7 +62,7 @@ struct EmmcTestFunc g_emmcTestFunc[] = { static int32_t EmmcTestEntry(struct EmmcTester *tester, int32_t cmd) { int32_t i; - int32_t ret; + int32_t ret = HDF_SUCCESS; bool isFind = false; if (tester == NULL) { @@ -71,7 +71,7 @@ static int32_t EmmcTestEntry(struct EmmcTester *tester, int32_t cmd) } tester->handle = EmmcTestGetHandle(tester); if (tester->handle == NULL) { - HDF_LOGE("%s: emmc test get handle fail", __func__); + HDF_LOGE("%s: emmc test get handle failed", __func__); return HDF_FAILURE; } for (i = 0; i < sizeof(g_emmcTestFunc) / sizeof(g_emmcTestFunc[0]); i++) { @@ -81,9 +81,9 @@ static int32_t EmmcTestEntry(struct EmmcTester *tester, int32_t cmd) break; } } - if (isFind == false) { + if (!isFind) { ret = HDF_ERR_NOT_SUPPORT; - HDF_LOGE("%s: cmd %d not support", __func__, cmd); + HDF_LOGE("%s: cmd %d not supported", __func__, cmd); } EmmcTestReleaseHandle(tester->handle); return ret; @@ -96,19 +96,19 @@ static int32_t EmmcTestFillConfig(struct EmmcTester *tester, const struct Device drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); if (drsOps == NULL || drsOps->GetUint32 == NULL) { - HDF_LOGE("%s: invalid drs ops fail!", __func__); + HDF_LOGE("%s: invalid drs ops", __func__); return HDF_FAILURE; } ret = drsOps->GetUint32(node, "busNum", &(tester->busNum), 0); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: fill bus num fail!", __func__); + HDF_LOGE("%s: fill bus num failed", __func__); return ret; } ret = drsOps->GetUint32(node, "hostId", &(tester->hostId), 0); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: fill hostId fail!", __func__); + HDF_LOGE("%s: fill hostId failed", __func__); return ret; } @@ -147,7 +147,7 @@ static int32_t EmmcTestInit(struct HdfDeviceObject *device) } ret = EmmcTestFillConfig(tester, device->property); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read config fail!", __func__); + HDF_LOGE("%s: read config failed", __func__); return ret; } tester->TestEntry = EmmcTestEntry; diff --git a/test/unittest/platform/common/gpio_test.c b/test/unittest/platform/common/gpio_test.c index 7600efd6d..658291b71 100644 --- a/test/unittest/platform/common/gpio_test.c +++ b/test/unittest/platform/common/gpio_test.c @@ -195,7 +195,7 @@ static int32_t TestCaseGpioIrq(struct GpioTester *tester, uint16_t mode, bool in } #endif if (tester->irqCnt <= 0) { - HDF_LOGE("%s: mode:%x on %u fail!", __func__, mode, tester->gpioIrq); + HDF_LOGE("%s: set mode:%x on %u failed", __func__, mode, tester->gpioIrq); return HDF_FAILURE; } return HDF_SUCCESS; diff --git a/test/unittest/platform/common/i2c_driver_test.c b/test/unittest/platform/common/i2c_driver_test.c index e5e285457..ed88adfbd 100644 --- a/test/unittest/platform/common/i2c_driver_test.c +++ b/test/unittest/platform/common/i2c_driver_test.c @@ -24,7 +24,7 @@ static int32_t I2cTestDispatch(struct HdfDeviceIoClient *client, int cmd, struct return HDF_ERR_INVALID_PARAM; } if (!HdfSbufWriteBuffer(reply, &g_config, sizeof(g_config))) { - HDF_LOGE("%s: writ reply fail!", __func__); + HDF_LOGE("%s: write reply failed", __func__); return HDF_ERR_IO; } } else { @@ -41,37 +41,37 @@ static int32_t I2cTestReadConfig(struct I2cTestConfig *config, const struct Devi drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); if (drsOps == NULL || drsOps->GetUint32 == NULL) { - HDF_LOGE("%s: invalid drs ops fail!", __func__); + HDF_LOGE("%s: invalid drs ops", __func__); return HDF_FAILURE; } ret = drsOps->GetUint16(node, "bus_num", &config->busNum, 0); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read bus num fail!", __func__); + HDF_LOGE("%s: read bus num failed", __func__); return ret; } ret = drsOps->GetUint16(node, "dev_addr", &config->devAddr, 0); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read dev addr fail!", __func__); + HDF_LOGE("%s: read dev addr failed", __func__); return ret; } ret = drsOps->GetUint16(node, "reg_len", &config->regLen, 1); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read reg len fail!", __func__); + HDF_LOGE("%s: read reg len failed", __func__); return ret; } ret = drsOps->GetUint16(node, "reg_addr", &config->regAddr, 0); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read reg addr fail!", __func__); + HDF_LOGE("%s: read reg addr failed", __func__); return ret; } ret = drsOps->GetUint16(node, "buf_size", &config->bufSize, 0); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read buf size fail!", __func__); + HDF_LOGE("%s: read buf size failed", __func__); return ret; } @@ -90,7 +90,7 @@ static int32_t I2cTestBind(struct HdfDeviceObject *device) ret = I2cTestReadConfig(&g_config, device->property); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read config fail!", __func__); + HDF_LOGE("%s: read config failed", __func__); return ret; } diff --git a/test/unittest/platform/common/i2c_test.c b/test/unittest/platform/common/i2c_test.c index 47801f6ed..cba586b29 100644 --- a/test/unittest/platform/common/i2c_test.c +++ b/test/unittest/platform/common/i2c_test.c @@ -23,7 +23,7 @@ #define I2C_TEST_BUF_SIZE_MAX 128 #define I2C_TEST_REG_LEN 2 #define I2C_TEST_MLTTHD_TIMES 1000 -#define I2C_TEST_STACK_SIZE (1024*100) +#define I2C_TEST_STACK_SIZE (1024 * 100) #define I2C_TEST_WAIT_TIMES 200 static struct I2cMsg g_msgs[I2C_TEST_MSG_NUM]; @@ -84,7 +84,7 @@ struct I2cTester *I2cTesterGet(void) static struct I2cTester tester; static bool hasInit = false; - if (hasInit == true) { + if (hasInit) { return &tester; } @@ -96,7 +96,7 @@ struct I2cTester *I2cTesterGet(void) tester.handle = I2cOpen(tester.config.busNum); if (tester.handle == NULL) { - HDF_LOGE("I2cTesterGet: open i2cBus:%u fail! handle:%p", tester.config.busNum, tester.handle); + HDF_LOGE("I2cTesterGet: open i2cBus:%u fail!", tester.config.busNum); return NULL; } @@ -217,14 +217,14 @@ int32_t I2cTestWriteRead(void) return HDF_SUCCESS; } -static int I2cTestThreadFunc(void *parm) +static int I2cTestThreadFunc(void *param) { int32_t i, ret; struct I2cTester *tester = NULL; tester = I2cTesterGet(); if (tester == NULL || tester->handle == NULL) { - *((int32_t *)parm) = 1; + *((int32_t *)param) = 1; return HDF_ERR_INVALID_OBJECT; } @@ -239,7 +239,7 @@ static int I2cTestThreadFunc(void *parm) } } - *((int32_t *)parm) = 1; + *((int32_t *)param) = 1; return HDF_SUCCESS; } diff --git a/test/unittest/platform/common/platform_driver_test.c b/test/unittest/platform/common/platform_driver_test.c index 55917a143..832be851f 100644 --- a/test/unittest/platform/common/platform_driver_test.c +++ b/test/unittest/platform/common/platform_driver_test.c @@ -24,7 +24,7 @@ static void DoAllPlatformTest(void) static int32_t PlatformTestBind(struct HdfDeviceObject *device) { - struct IDeviceIoService service; + static struct IDeviceIoService service; if (device == NULL) { HDF_LOGE("%s: device is null!", __func__); diff --git a/test/unittest/platform/common/sdio_test.c b/test/unittest/platform/common/sdio_test.c index 800afbf8e..f661c3fc2 100644 --- a/test/unittest/platform/common/sdio_test.c +++ b/test/unittest/platform/common/sdio_test.c @@ -60,13 +60,13 @@ static int32_t TestSdioIncrAddrReadAndWriteOtherBytes(struct SdioTester *tester) HDF_LOGE("%s: SdioReadBytes fail! ret=%d.", __func__, ret); return HDF_FAILURE; } - HDF_LOGE("%s: read, data[0]:%d\n", __func__, data[0]); + HDF_LOGE("%s: read, data[0]:%u\n", __func__, data[0]); ret = SdioWriteBytes(tester->handle, &data[0], addr, 1, 0); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: SdioWriteBytes fail! ret=%d.", __func__, ret); return HDF_FAILURE; } - HDF_LOGE("%s: write, data[0]:%d\n", __func__, data[0]); + HDF_LOGE("%s: write, data[0]:%u\n", __func__, data[0]); return HDF_SUCCESS; } @@ -98,7 +98,7 @@ static int32_t TestSdioIncrAddrReadAndWriteOneByte(struct SdioTester *tester) HDF_LOGE("%s: SdioReadBytes fail! ret=%d.", __func__, ret); return HDF_FAILURE; } - HDF_LOGE("%s: read, val:%d.", __func__, val); + HDF_LOGE("%s: read, val:%u.", __func__, val); /* read 1 bits */ addr++; ret = SdioReadBytes(tester->handle, &val, addr, 1, 0); @@ -106,7 +106,7 @@ static int32_t TestSdioIncrAddrReadAndWriteOneByte(struct SdioTester *tester) HDF_LOGE("%s: SdioReadBytes fail! ret=%d.", __func__, ret); return HDF_FAILURE; } - HDF_LOGE("%s: read, val:%d.", __func__, val); + HDF_LOGE("%s: read, val:%u.", __func__, val); return HDF_SUCCESS; } @@ -144,14 +144,14 @@ static int32_t TestSdioFixedAddrReadAndWriteOtherBytes(struct SdioTester *tester HDF_LOGE("%s: SdioReadBytesFromFixedAddr fail! ret=%d.", __func__, ret); return HDF_FAILURE; } - HDF_LOGE("%s: read, data[0]:%d, data[1]:%d\n", __func__, data[0], data[1]); + HDF_LOGE("%s: read, data[0]:%u, data[1]:%u\n", __func__, data[0], data[1]); /* write bits */ ret = SdioWriteBytes(tester->handle, &data[0], addr, 1, 0); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: SdioWriteBytesToFixedAddr fail! ret=%d.", __func__, ret); return HDF_FAILURE; } - HDF_LOGE("%s: write, data[0]:%d, data[1]:%d.", __func__, data[0], data[1]); + HDF_LOGE("%s: write, data[0]:%u, data[1]:%u.", __func__, data[0], data[1]); return ret; } @@ -250,7 +250,7 @@ static int32_t TestSdioFunc0ReadAndWriteBytes(struct SdioTester *tester) } SdioReleaseHost(tester->handle); - HDF_LOGE("%s: Func0 Read, val :%d.", __func__, val); + HDF_LOGE("%s: Func0 Read, val:%u.", __func__, val); return ret; } @@ -264,7 +264,7 @@ static int32_t TestSdioSetAndGetFuncInfo(struct SdioTester *tester) HDF_LOGE("%s: SdioGetCommonInfo fail! ret=%d.", __func__, ret); return ret; } - HDF_LOGE("%s: succ! Timeout=%d.", __func__, info.funcInfo.enTimeout); + HDF_LOGE("%s: succ! Timeout=%u.", __func__, info.funcInfo.enTimeout); info.funcInfo.enTimeout = TEST_TIME_OUT; ret = SdioSetCommonInfo(tester->handle, &info, SDIO_FUNC_INFO); @@ -278,7 +278,7 @@ static int32_t TestSdioSetAndGetFuncInfo(struct SdioTester *tester) HDF_LOGE("%s: SdioGetCommonInfo fail! ret=%d.", __func__, ret); return ret; } - HDF_LOGE("%s: again succ! Timeout=%d.", __func__, info.funcInfo.enTimeout); + HDF_LOGE("%s: again succ! Timeout=%u.", __func__, info.funcInfo.enTimeout); return HDF_SUCCESS; } @@ -355,7 +355,7 @@ struct SdioTestFunc g_sdioTestFunc[] = { static int32_t SdioTestEntry(struct SdioTester *tester, int32_t cmd) { int32_t i; - int32_t ret; + int32_t ret = HDF_SUCCESS; bool isFind = false; if (tester == NULL) { @@ -374,7 +374,7 @@ static int32_t SdioTestEntry(struct SdioTester *tester, int32_t cmd) break; } } - if (isFind == false) { + if (!isFind) { ret = HDF_ERR_NOT_SUPPORT; HDF_LOGE("%s: cmd %d not support", __func__, cmd); } @@ -415,8 +415,8 @@ static int32_t SdioTestFillConfig(struct SdioTester *tester, const struct Device return ret; } - HDF_LOGE("%s: busNum:%d, funcNum:%d, vendorId:0x%x, deviceId:0x%x.", __func__, - tester->busNum, tester->funcNum, tester->vendorId, tester->deviceId); + HDF_LOGE("%s: busNum:%u, funcNum:%u, vendorId:0x%x.", __func__, + tester->busNum, tester->funcNum, tester->vendorId); return HDF_SUCCESS; } diff --git a/test/unittest/platform/common/uart_test.c b/test/unittest/platform/common/uart_test.c index 8808232fe..ea7f59ffc 100644 --- a/test/unittest/platform/common/uart_test.c +++ b/test/unittest/platform/common/uart_test.c @@ -62,7 +62,7 @@ static int32_t UartGetBaudTest(struct UartTest *test) HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } - HDF_LOGE("%s: baud %d", __func__, baud); + HDF_LOGE("%s: baud %u", __func__, baud); HDF_LOGE("%s: success", __func__); return HDF_SUCCESS; } @@ -94,13 +94,13 @@ static int32_t UartGetAttributeTest(struct UartTest *test) HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } - HDF_LOGE("dataBits %d", attribute.dataBits); - HDF_LOGE("parity %d", attribute.parity); - HDF_LOGE("stopBits %d", attribute.stopBits); - HDF_LOGE("rts %d", attribute.rts); - HDF_LOGE("cts %d", attribute.cts); - HDF_LOGE("fifoRxEn %d", attribute.fifoRxEn); - HDF_LOGE("fifoTxEn %d", attribute.fifoTxEn); + HDF_LOGE("dataBits %u", attribute.dataBits); + HDF_LOGE("parity %u", attribute.parity); + HDF_LOGE("stopBits %u", attribute.stopBits); + HDF_LOGE("rts %u", attribute.rts); + HDF_LOGE("cts %u", attribute.cts); + HDF_LOGE("fifoRxEn %u", attribute.fifoRxEn); + HDF_LOGE("fifoTxEn %u", attribute.fifoTxEn); HDF_LOGE("%s: success", __func__); return HDF_SUCCESS; } diff --git a/test/unittest/platform/common/watchdog_test.c b/test/unittest/platform/common/watchdog_test.c index 7d76b86b2..ee2d92360 100644 --- a/test/unittest/platform/common/watchdog_test.c +++ b/test/unittest/platform/common/watchdog_test.c @@ -186,7 +186,7 @@ static int32_t TestCaseWatchdogReliability(struct WatchdogTester *tester) (void)WatchdogSetTimeout(NULL, WATCHDOG_TEST_TIMEOUT); /* invalid device handle */ (void)WatchdogGetTimeout(NULL, &timeout); - /* invalid timout pointer */ + /* invalid timeout pointer */ (void)WatchdogGetTimeout(tester->handle, NULL); HDF_LOGE("%s: test dfr for WatchdogFeed ...", __func__); diff --git a/test/unittest/platform/hdf_mipi_dsi_entry_test.c b/test/unittest/platform/hdf_mipi_dsi_entry_test.c index aab32cbfa..c4001c213 100644 --- a/test/unittest/platform/hdf_mipi_dsi_entry_test.c +++ b/test/unittest/platform/hdf_mipi_dsi_entry_test.c @@ -23,7 +23,7 @@ int32_t HdfMipiDsiEntry(HdfTestMsg *msg) test = MipiDsiTestServiceGet(); if (test == NULL) { - HDF_LOGE("%s: get servie fail!\n", __func__); + HDF_LOGE("%s: get service fail!", __func__); return HDF_FAILURE; } diff --git a/test/unittest/platform/hdf_rtc_entry_test.c b/test/unittest/platform/hdf_rtc_entry_test.c index 1285bf9cb..640bae98b 100644 --- a/test/unittest/platform/hdf_rtc_entry_test.c +++ b/test/unittest/platform/hdf_rtc_entry_test.c @@ -36,7 +36,7 @@ static int8_t g_rtcIrqCallback = HDF_FAILURE; int32_t RtcAlarmACallback(enum RtcAlarmIndex alarmIndex) { if (alarmIndex == RTC_ALARM_INDEX_A) { - HDF_LOGE("RtcAlarmACallback alarm a success"); + HDF_LOGE("RtcAlarmACallback: alarm a callback success"); g_rtcIrqCallback = HDF_SUCCESS; } else { g_rtcIrqCallback = HDF_FAILURE; @@ -87,14 +87,14 @@ static int32_t RtcReadWriteTimeTest(struct RtcTime *writeTime) } ret = RtcWriteTime(g_rtcHandle, writeTime); if (ret != 0) { - HDF_LOGE("RtcReadWriteTimeTest write fail"); + HDF_LOGE("RtcReadWriteTimeTest write failed"); return -1; } OsalMSleep(RTC_TEST_WR_WAIT_MS); ret = RtcReadTime(g_rtcHandle, &readTime); if (ret != 0) { - HDF_LOGE("RtcReadWriteTimeTest read fail"); + HDF_LOGE("RtcReadWriteTimeTest read failed"); return -1; } @@ -116,14 +116,14 @@ static int32_t RtcReadWriteAlarmTimeTest(struct RtcTime *writeTime) ret = RtcWriteAlarm(g_rtcHandle, RTC_ALARM_INDEX_A, writeTime); if (ret != 0) { - HDF_LOGE("RtcReadWriteAlarmTimeTest write fail"); + HDF_LOGE("RtcReadWriteAlarmTimeTest write failed"); return -1; } OsalMSleep(RTC_TEST_WR_WAIT_MS); ret = RtcReadAlarm(g_rtcHandle, RTC_ALARM_INDEX_A, &readTime); if (ret != 0) { - HDF_LOGE("RtcReadWriteAlarmTimeTest read fail"); + HDF_LOGE("RtcReadWriteAlarmTimeTest read failed"); return -1; } @@ -152,7 +152,7 @@ static int32_t RtcReadWriteTime(void) ret = RtcReadWriteTimeTest(&tm); if (ret != 0) { - HDF_LOGE("RtcReadWriteTime fail"); + HDF_LOGE("RtcReadWriteTime failed"); return -1; } @@ -176,7 +176,7 @@ static int32_t RtcReadWriteMaxTime(void) tm.weekday = weekday; ret = RtcReadWriteTimeTest(&tm); if (ret == 0) { - HDF_LOGE("RtcReadWriteMaxTime fail"); + HDF_LOGE("RtcReadWriteMaxTime failed"); return -1; } @@ -200,7 +200,7 @@ static int32_t RtcReadWriteMinTime(void) tm.weekday = weekday; ret = RtcReadWriteTimeTest(&tm); if (ret == 0) { - HDF_LOGE("RtcReadWriteMinTime fail"); + HDF_LOGE("RtcReadWriteMinTime failed"); return -1; } @@ -225,7 +225,7 @@ static int32_t RtcReadWriteAlarmTime(void) tm.weekday = weekday; ret = RtcReadWriteAlarmTimeTest(&tm); if (ret != 0) { - HDF_LOGE("RtcReadWriteAlarmTime read fail"); + HDF_LOGE("RtcReadWriteAlarmTime read failed"); return -1; } @@ -249,7 +249,7 @@ static int32_t RtcReadWriteMaxAlarmTime(void) tm.weekday = weekday; ret = RtcReadWriteAlarmTimeTest(&tm); if (ret == 0) { - HDF_LOGE("RtcReadWriteMaxAlarmTime read fail"); + HDF_LOGE("RtcReadWriteMaxAlarmTime read failed"); return -1; } @@ -273,7 +273,7 @@ static int32_t RtcReadWriteMinAlarmTime(void) time.weekday = weekday; ret = RtcReadWriteAlarmTimeTest(&time); if (ret == 0) { - HDF_LOGE("RtcReadWriteMinAlarmTime read fail"); + HDF_LOGE("RtcReadWriteMinAlarmTime read failed"); return -1; } @@ -299,12 +299,12 @@ static int32_t RtcAlarmEnable(void) tm.weekday = weekday; ret = RtcReadWriteAlarmTimeTest(&tm); if (ret != 0) { - HDF_LOGE("RtcReadWriteAlarmTime read fail"); + HDF_LOGE("RtcReadWriteAlarmTime read failed"); return -1; } ret = RtcAlarmInterruptEnable(g_rtcHandle, RTC_ALARM_INDEX_A, 1); if (ret != 0) { - HDF_LOGE("RtcAlarmInterruptEnable fail"); + HDF_LOGE("RtcAlarmInterruptEnable failed"); return -1; } return 0; @@ -323,17 +323,17 @@ static int32_t RtcAlarmIrqAttachConfig(void) ret = RtcRegisterAlarmCallback(g_rtcHandle, RTC_ALARM_INDEX_A, RtcAlarmACallback); if (ret != 0) { - HDF_LOGE("RtcRegisterAlarmCallback fail"); + HDF_LOGE("RtcRegisterAlarmCallback failed"); return -1; } ret = RtcSetFreq(g_rtcHandle, freq); if (ret != 0) { - HDF_LOGE("RtcSetFreq fail"); + HDF_LOGE("RtcSetFreq failed"); return -1; } ret = RtcAlarmInterruptEnable(g_rtcHandle, RTC_ALARM_INDEX_A, 1); if (ret != 0) { - HDF_LOGE("RtcAlarmInterruptEnable fail"); + HDF_LOGE("RtcAlarmInterruptEnable failed"); return -1; } return 0; @@ -361,24 +361,24 @@ static int32_t RtcAlarmIrq(void) time.weekday = weekday; ret = RtcAlarmIrqAttachConfig(); if (ret != 0) { - HDF_LOGE("RtcWriteTime fail"); + HDF_LOGE("RtcWriteTime failed"); return -1; } ret = RtcWriteTime(g_rtcHandle, &time); if (ret != 0) { - HDF_LOGE("RtcWriteTime fail"); + HDF_LOGE("RtcWriteTime failed"); return -1; } /* set alarm time 2020-08-08 Saturday 08:08:09 .000 */ time.second = RTC_TEST_TIME_SECOND + 1; ret = RtcWriteAlarm(g_rtcHandle, RTC_ALARM_INDEX_A, &time); if (ret != 0) { - HDF_LOGE("RtcWriteAlarm fail"); + HDF_LOGE("RtcWriteAlarm failed"); return -1; } OsalSleep(RTC_TEST_WAIT_TIME_S); if (g_rtcIrqCallback == HDF_FAILURE) { - HDF_LOGE("RtcWriteAlarm fail"); + HDF_LOGE("RtcWriteAlarm failed"); return -1; } g_rtcIrqCallback = HDF_FAILURE; @@ -394,7 +394,7 @@ static int32_t RtcRegisterCallback(void) } ret = RtcRegisterAlarmCallback(g_rtcHandle, RTC_ALARM_INDEX_A, RtcAlarmACallback); if (ret != 0) { - HDF_LOGE("RtcRegisterCallback fail"); + HDF_LOGE("RtcRegisterCallback failed"); return -1; } return 0; @@ -410,7 +410,7 @@ static int32_t RtcRegisterNullCallback(void) ret = RtcRegisterAlarmCallback(g_rtcHandle, RTC_ALARM_INDEX_A, NULL); if (ret == 0) { - HDF_LOGE("RtcRegisterCallback fail"); + HDF_LOGE("RtcRegisterCallback failed"); return -1; } return 0; @@ -426,7 +426,7 @@ static int32_t RtcSetNormalFreq(void) ret = RtcSetFreq(g_rtcHandle, RTC_TEST_FREQ); if (ret != 0) { - HDF_LOGE("RtcSetNormalFreq fail"); + HDF_LOGE("RtcSetNormalFreq failed"); return -1; } return 0; @@ -442,7 +442,7 @@ static int32_t RtcSetMaxFreq(void) ret = RtcSetFreq(g_rtcHandle, RTC_TEST_FREQ * RTC_TIME_UNIT); if (ret == 0) { - HDF_LOGE("RtcSetMaxFreq fail"); + HDF_LOGE("RtcSetMaxFreq failed"); return -1; } return 0; @@ -458,7 +458,7 @@ static int32_t RtcSetMinFreq(void) ret = RtcSetFreq(g_rtcHandle, 0); if (ret == 0) { - HDF_LOGE("RtcSetMinFreq fail"); + HDF_LOGE("RtcSetMinFreq failed"); return -1; } ret = RtcSetFreq(g_rtcHandle, RTC_TEST_FREQ); @@ -476,12 +476,12 @@ static int32_t RtcReadWriteUserReg(void) ret = RtcWriteReg(g_rtcHandle, 0, value); if (ret != 0) { - HDF_LOGE("RtcReadWriteUserReg write fail"); + HDF_LOGE("RtcReadWriteUserReg write failed"); return -1; } ret = RtcReadReg(g_rtcHandle, 0, &value); if (ret != 0) { - HDF_LOGE("RtcSetMinFreq read fail"); + HDF_LOGE("RtcSetMinFreq read failed"); return -1; } if (value != RTC_TEST_USER_VALUE) { @@ -501,12 +501,12 @@ static int32_t RtcReadWriteMaxUserIndex(void) ret = RtcWriteReg(g_rtcHandle, RTC_TEST_USER_MAX_INDEX, value); if (ret == 0) { - HDF_LOGE("RtcReadWriteUserReg write fail"); + HDF_LOGE("RtcReadWriteUserReg write failed"); return -1; } ret = RtcReadReg(g_rtcHandle, RTC_TEST_USER_MAX_INDEX, &value); if (ret == 0) { - HDF_LOGE("RtcSetMinFreq read fail"); + HDF_LOGE("RtcSetMinFreq read failed"); return -1; } return 0; diff --git a/test/unittest/platform/hdf_rtc_entry_test.h b/test/unittest/platform/hdf_rtc_entry_test.h index 98df0ef63..3f3997e1a 100644 --- a/test/unittest/platform/hdf_rtc_entry_test.h +++ b/test/unittest/platform/hdf_rtc_entry_test.h @@ -34,4 +34,4 @@ typedef enum { } HdfRtcTestCaseCmd; int32_t HdfRtcEntry(HdfTestMsg *msg); -#endif // HDF_RTC_ENTRY_TEST_H \ No newline at end of file +#endif /* HDF_RTC_ENTRY_TEST_H */ diff --git a/test/unittest/sensor/hdf_sensor_test.c b/test/unittest/sensor/hdf_sensor_test.c index 45526d456..09f5485d4 100644 --- a/test/unittest/sensor/hdf_sensor_test.c +++ b/test/unittest/sensor/hdf_sensor_test.c @@ -177,7 +177,7 @@ int32_t InitSensorDriverTest(struct HdfDeviceObject *device) struct SensorDeviceInfo deviceInfo = { .sensorInfo = { .sensorName = "sensor_test", - .vendorName = "huawei", + .vendorName = "default", .firmwareVersion = "1.0", .hardwareVersion = "1.0", .sensorTypeId = SENSOR_TAG_NONE, diff --git a/test/unittest/wifi/hdf_wifi_test.c b/test/unittest/wifi/hdf_wifi_test.c index 30f5053bb..4132c8fa9 100644 --- a/test/unittest/wifi/hdf_wifi_test.c +++ b/test/unittest/wifi/hdf_wifi_test.c @@ -54,10 +54,15 @@ int32_t HdfWifiEntry(HdfTestMsg *msg) { int32_t result, i; + if (msg == NULL) { + HDF_LOGE("%s is fail: HdfTestMsg is NULL!", __func__); + return HDF_SUCCESS; + } + for (i = 0; i < sizeof(g_hdfWiFiTestCaseList) / sizeof(g_hdfWiFiTestCaseList[0]); ++i) { if ((msg->subCmd == g_hdfWiFiTestCaseList[i].subCmd) && (g_hdfWiFiTestCaseList[i].testFunc != NULL)) { result = g_hdfWiFiTestCaseList[i].testFunc(); - HDF_LOGE("HdfTest:Wifi test result[%s-%d]", ((result == 0) ? "pass" : "fail"), msg->subCmd); + HDF_LOGE("HdfTest:Wifi test result[%s-%u]", ((result == 0) ? "pass" : "fail"), msg->subCmd); msg->result = (result == 0) ? HDF_SUCCESS : HDF_FAILURE; return HDF_SUCCESS; } diff --git a/test/unittest/wifi/hdf_wifi_test.h b/test/unittest/wifi/hdf_wifi_test.h index 3cf27f56c..294ecec4e 100644 --- a/test/unittest/wifi/hdf_wifi_test.h +++ b/test/unittest/wifi/hdf_wifi_test.h @@ -44,7 +44,6 @@ typedef enum { WIFI_MODULE_ADD_FEATURE, WIFI_MODULE_DELETE_FEATURE, WIFI_MODULE_END = 200, - /* message */ WIFI_MESSAGE_QUEUE_001 = WIFI_MODULE_END, WIFI_MESSAGE_QUEUE_002, diff --git a/tools/hc-gen/Makefile b/tools/hc-gen/Makefile index 3b75b8ee5..9dcdfae00 100644 --- a/tools/hc-gen/Makefile +++ b/tools/hc-gen/Makefile @@ -16,7 +16,7 @@ BOUNDS_CHECK_LIB := $(abspath ../../../../third_party/bounds_checking_function/) INCLUDE_DIR := ./include $(BOUNDS_CHECK_LIB)/include OUT_DIR := build -TEST_CASE := $(abspath ../../../adapter/khdf/liteos/test/tools/hc-gen/test/unittest) +TEST_CASE := $(abspath ../../../adapter/lite/khdf/test/tools/hc-gen/test/unittest) ORIGIN_SOURCES := $(wildcard src/*) ORIGIN_SOURCES += $(wildcard $(BOUNDS_CHECK_LIB)/src/*) diff --git a/tools/hc-gen/README.md b/tools/hc-gen/README.md index 7a56a9e8c..40a651712 100755 --- a/tools/hc-gen/README.md +++ b/tools/hc-gen/README.md @@ -1 +1 @@ -hc-gen compilation requires flex and bison, make sure that they are installed before compiling. +hc-gen compilation requires flex and bison, so make sure they are installed before you get start. \ No newline at end of file diff --git a/tools/hc-gen/bin/hc-gen b/tools/hc-gen/bin/hc-gen index 196de1293733a24442bb4937cf670066b108a76a..a759c47705c7acf92e7cc4111cd42104253c7546 100755 GIT binary patch literal 80360 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 N>Hp4&bcDCj{~vd%TnzvK literal 92808 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 -int32_t HcsBytecodeOutput(); -int32_t HcsTextCodeOutput(); +int32_t HcsBytecodeOutput(void); +int32_t HcsTextCodeOutput(void); int32_t HcsBinaryToHexdump(const char *inputFileName); #endif // HCS_COMPILER_GENER_H diff --git a/tools/hc-gen/include/hcs_log.h b/tools/hc-gen/include/hcs_log.h index bc71064a1..76b8ff80a 100644 --- a/tools/hc-gen/include/hcs_log.h +++ b/tools/hc-gen/include/hcs_log.h @@ -39,7 +39,7 @@ #define HCS_OBJECT_PR(prefix, object, fmt, args...) \ do { \ - HCS_LOG_PRINT (prefix": %s:%u\n\t" fmt"\n", \ + HCS_LOG_PRINT(prefix": %s:%u\n\t" fmt"\n", \ object ? ((ParserObjectBase*)object)->src : "unknown", \ object ? ((ParserObjectBase*)object)->lineno : 0, \ ##args); \ @@ -52,12 +52,20 @@ #define PRINTF_CHECK_AND_RETURN(printRes) \ do { \ if ((printRes) < 0) { \ - HCS_ERROR("Error:%s(%d), sprintf_s fail", \ + HCS_ERROR("Error:%s(%d), sprintf_s failed", \ + __FUNCTION__, __LINE__); \ + return EOUTPUT; \ + } \ + } while (0) + +#define OUTPUT_CHECK_AND_RETURN(printRes) \ + do { \ + if ((printRes) < 0) { \ + HCS_ERROR("Error:%s(%d), output write failed", \ __FUNCTION__, __LINE__); \ return EOUTPUT; \ } \ } while (0) -#define SPRINTF_ERROR_INFO "sprintf fail" #endif // HCS_COMPILER_LOG_H diff --git a/tools/hc-gen/include/hcs_opcode.h b/tools/hc-gen/include/hcs_opcode.h index 0c32eacba..1e8f1d654 100644 --- a/tools/hc-gen/include/hcs_opcode.h +++ b/tools/hc-gen/include/hcs_opcode.h @@ -27,7 +27,7 @@ typedef struct { const char *opStr; } OpCodeMapEntry; -const OpCodeMapEntry *HcsGetOpCodeMap(); +const OpCodeMapEntry *HcsGetOpCodeMap(void); const OpCodeMapEntry *HcsParserObjectTypeToByteCode(uint32_t objectType); diff --git a/tools/hc-gen/include/hcs_option.h b/tools/hc-gen/include/hcs_option.h index 034d940c4..9ec430e78 100644 --- a/tools/hc-gen/include/hcs_option.h +++ b/tools/hc-gen/include/hcs_option.h @@ -10,20 +10,20 @@ #define HCS_COMPILER_OPTION_H #include -bool HcsOptShouldAlign(); +bool HcsOptShouldAlign(void); void HcsOptSetAlign(bool align); -bool HcsOptShouldGenTextConfig(); +bool HcsOptShouldGenTextConfig(void); -bool HcsOptShouldGenByteCodeConfig(); +bool HcsOptShouldGenByteCodeConfig(void); -bool HcsOptDecompile(); +bool HcsOptDecompile(void); -bool HcsOptShouldGenHexdump(); +bool HcsOptShouldGenHexdump(void); -const char *HcsOptGetSymbolNamePrefix(); +const char *HcsOptGetSymbolNamePrefix(void); -bool HcsVerbosePrint(); +bool HcsVerbosePrint(void); #endif // HCS_COMPILER_OPTION_H diff --git a/tools/hc-gen/src/hcs_ast.c b/tools/hc-gen/src/hcs_ast.c index 5b2365f49..4348483a7 100644 --- a/tools/hc-gen/src/hcs_ast.c +++ b/tools/hc-gen/src/hcs_ast.c @@ -6,13 +6,13 @@ * See the LICENSE file in the root of this repository for complete details. */ +#include "hcs_ast.h" #include #include #include "hcs_file.h" #include "hcs_mem.h" #include "hcs_log.h" #include "hcs_option.h" -#include "hcs_ast.h" #define ANONYMOUS_OBJECT_NAME "|_" static ParserObject *g_parserRoot = NULL; @@ -24,14 +24,14 @@ bool HcsIsAnonymousObject(const ParserObject *obj) ParserObject *HcsAllocParserObject(void) { - ParserObject *new = (ParserObject *)HcsMemZalloc(sizeof(ParserObject)); - if (new == NULL) { - HCS_ERROR("%s %d %s OOM", __FILE__, __LINE__, __func__); + ParserObject *newObject = (ParserObject *)HcsMemZalloc(sizeof(ParserObject)); + if (newObject == NULL) { + HCS_ERROR("%s:%d OOM", __func__, __LINE__); return NULL; } - new->objectBase.src = HcsGetCurrentSourceName(); - new->objectBase.lineno = HcsGetCurrentSourceLine(); - return new; + newObject->objectBase.src = HcsGetCurrentSourceName(); + newObject->objectBase.lineno = HcsGetCurrentSourceLine(); + return newObject; } void HcsAstFreeObject(ParserObject *object) @@ -77,7 +77,7 @@ void HcsDeleteParserObjectTree(ParserObject *object) if (object == NULL) { return; } - /* delete current and subtree */ + /* delete current tree and subtree */ HcsAstFreeObjectAndSubtree(object); } @@ -89,7 +89,7 @@ ParserObject *HcsGetParserRoot(void) HCS_DEBUG("instance root node"); char *rootNodeName = strdup("root"); if (rootNodeName == NULL) { - HCS_ERROR("%s %d %s OOM", __FILE__, __LINE__, __func__); + HCS_ERROR("%s:%d OOM", __func__, __LINE__); return NULL; } g_parserRoot = HcsNewConfigNode(rootNodeName, CONFIG_NODE_NOREF, NULL); @@ -311,7 +311,7 @@ static ParserObject *HcsParserObjectClone(const ParserObject *object) } ParserObject *clone = HcsAllocParserObject(); if (clone == NULL) { - HCS_ERROR("%s %d %s OOM", __FILE__, __LINE__, __func__); + HCS_ERROR("%s:%d OOM", __func__, __LINE__); return NULL; } @@ -384,7 +384,7 @@ int32_t HcsAstCopyArray(const ParserObject *src, ParserObject *dst) while (arrayElement != NULL) { ParserObject *copy = HcsParserObjectClone(arrayElement); if (copy == NULL) { - HCS_ERROR("%s %d %s OOM", __FILE__, __LINE__, __func__); + HCS_ERROR("%s:%d OOM", __func__, __LINE__); return EOOM; } HcsAstAddChild(dst, copy); @@ -407,7 +407,7 @@ static int32_t HcsCopyObject(const ParserObject *src, ParserObject *dst) HcsMemFree(dst->objectBase.stringValue); dst->objectBase.stringValue = strdup(src->objectBase.stringValue); if (dst->objectBase.stringValue == NULL) { - HCS_ERROR("%s %d %s OOM", __FILE__, __LINE__, __func__); + HCS_ERROR("%s:%d OOM", __func__, __LINE__); return EOOM; } } else if (src->objectBase.type == PARSEROP_ARRAY) { @@ -442,7 +442,6 @@ static int32_t HcsAstCopyTree(ParserObject *src, ParserObject *dstTree, uint32_t } } else if (HcsOptShouldGenTextConfig() && HcsIsNumberObject(src) && dstExistObject->objectBase.type > src->objectBase.type) { - /* At template case, should do type upward transformation to template */ src->objectBase.type = dstExistObject->objectBase.type; } diff --git a/tools/hc-gen/src/hcs_bytecode_gen.c b/tools/hc-gen/src/hcs_bytecode_gen.c index 395122921..caf56b8b6 100644 --- a/tools/hc-gen/src/hcs_bytecode_gen.c +++ b/tools/hc-gen/src/hcs_bytecode_gen.c @@ -83,9 +83,9 @@ static int32_t ByteCodeWriteWalk(ParserObject *current, int32_t walkDepth) } int32_t ret = NOERR; switch (current->objectBase.opCode) { - case HCS_BYTE_OP: - case HCS_WORD_OP: - case HCS_DWORD_OP: + case HCS_BYTE_OP: /* fall-through */ + case HCS_WORD_OP: /* fall-through */ + case HCS_DWORD_OP: /* fall-through */ case HCS_QWORD_OP: { const OpCodeMapEntry *byteCodeMap = HcsGetOpCodeMap(); ret = HcsOutputWriteAlign(¤t->objectBase.integerValue, byteCodeMap[current->objectBase.type].size); @@ -103,7 +103,6 @@ static int32_t ByteCodeWriteWalk(ParserObject *current, int32_t walkDepth) } ret = HcsOutputWriteAlign(¤t->objectBase.subSize, sizeof(current->objectBase.subSize)); break; - /* fall-through */ case HCS_ARRAY_OP: { uint16_t size = HcsCountArraySize(current); ret = HcsOutputWriteAlign(&size, sizeof(size)); @@ -122,20 +121,20 @@ static int32_t ByteCodeWriteWalk(ParserObject *current, int32_t walkDepth) return ret; } -int32_t HcsBytecodeOutput() +int32_t HcsBytecodeOutput(void) { ParserObject *astRoot = HcsGetParserRoot(); if (astRoot == NULL) { return EFAIL; } - /* generate OpCode for every object on AST and calculate size for each */ + /* generate OpCode for every object on AST and calculate size for each object */ int32_t ret = HcsWalkAst(astRoot, AST_WALK_BACKEND, NULL, ByteCodeConvert); if (ret) { return ret; } - /* ast data is ready, do binder output */ + /* ast data is ready, do bindary output */ struct HcsFile *outputFIle = HcsOpenOutputFile(HCS_OUTPUT_FILE_SUFFIX); HbcHeader header = { @@ -181,7 +180,7 @@ int32_t HcsBytecodeOutput() HcsCloseOutput(outputFIle); HCS_DEBUG("Total size: %u ", astRoot->objectBase.size); if (ret == NOERR && HcsOptShouldGenHexdump()) { - ret = HcsBinaryToHexdump(HcsGetOutPutFileName()); + ret = HcsBinaryToHexdump(HcsGetOutPutFilePath()); } return ret; } diff --git a/tools/hc-gen/src/hcs_decompile_gen.c b/tools/hc-gen/src/hcs_decompile_gen.c index 5959fc52f..c253ff2b8 100644 --- a/tools/hc-gen/src/hcs_decompile_gen.c +++ b/tools/hc-gen/src/hcs_decompile_gen.c @@ -30,7 +30,7 @@ static char *HcsAssembleNodeRefName(char *buff, uint32_t buffSize, const char *n } char *str = strdup(buff); if (str == NULL) { - HCS_ERROR("%s %d %s OOM", __FILE__, __LINE__, __func__); + HCS_ERROR("%s:%d OOM", __func__, __LINE__); return NULL; } return str; @@ -83,65 +83,59 @@ static char *HcsGetNodeRefPath(uint64_t hash) return NULL; } -static int32_t HcsDecompilePrintBaseType(char *buffer, uint32_t bufferSize, const ParserObject *object); +static int32_t HcsDecompilePrintBaseType(const ParserObject *object); -static int32_t HcsDecompilePrintArrayType(char *buffer, uint32_t bufferSize, const ParserObject *object) +static int32_t HcsDecompilePrintArrayType(const ParserObject *object) { - int32_t res = sprintf_s(buffer, bufferSize, "["); - PRINTF_CHECK_AND_RETURN(res); + int32_t res; + PRINTF_CHECK_AND_RETURN(HcsFormatOutputWrite("[")); ParserObject *arrayElement = (ParserObject *)object->objectBase.child; while (arrayElement->objectBase.next) { - res = HcsDecompilePrintBaseType(buffer + strlen(buffer), bufferSize - strlen(buffer), arrayElement); + res = HcsDecompilePrintBaseType(arrayElement); if (res) { return EOUTPUT; } - res = sprintf_s(buffer + strlen(buffer), bufferSize - strlen(buffer), ", "); - PRINTF_CHECK_AND_RETURN(res); + PRINTF_CHECK_AND_RETURN(HcsFormatOutputWrite(", ")); arrayElement = (ParserObject *)arrayElement->objectBase.next; } - res = HcsDecompilePrintBaseType(buffer + strlen(buffer), bufferSize - strlen(buffer), arrayElement); + res = HcsDecompilePrintBaseType(arrayElement); if (res) { return EOUTPUT; } - res = sprintf_s(buffer + strlen(buffer), bufferSize - strlen(buffer), "]"); - PRINTF_CHECK_AND_RETURN(res); - return NOERR; + return HcsFormatOutputWrite("]"); } -static int32_t HcsDecompilePrintBaseType(char *buffer, uint32_t bufferSize, const ParserObject *object) +static int32_t HcsDecompilePrintBaseType(const ParserObject *object) { - int32_t res; + int32_t res = NOERR; switch (object->objectBase.type) { case PARSEROP_UINT8: case PARSEROP_UINT16: case PARSEROP_UINT32: case PARSEROP_UINT64: - res = sprintf_s(buffer, bufferSize, "0x%"PRIx64, object->objectBase.integerValue); - PRINTF_CHECK_AND_RETURN(res); + res = HcsFormatOutputWrite("0x%"PRIx64, object->objectBase.integerValue); break; case PARSEROP_STRING: - res = sprintf_s(buffer, bufferSize, "\"%s\"", object->objectBase.stringValue); - PRINTF_CHECK_AND_RETURN(res); + res = HcsFormatOutputWrite("\"%s\"", object->objectBase.stringValue); break; case PARSEROP_NODEREF: { char *refPath = HcsGetNodeRefPath(object->objectBase.value); if (refPath == NULL) { return EOUTPUT; } - res = sprintf_s(buffer, bufferSize, "&%s", refPath); + res = HcsFormatOutputWrite("&%s", refPath); HcsMemFree(refPath); - PRINTF_CHECK_AND_RETURN(res); } break; case PARSEROP_ARRAY: - return HcsDecompilePrintArrayType(buffer, bufferSize, object); + return HcsDecompilePrintArrayType(object); default: HCS_ERROR("unknown OpCode %u", object->objectBase.type); return EFAIL; } - return NOERR; + return res; } static int32_t HcsDecompileOutputWalk(ParserObject *current, int32_t walkDepth) @@ -151,41 +145,31 @@ static int32_t HcsDecompileOutputWalk(ParserObject *current, int32_t walkDepth) } int32_t res; - char writeBuffer[WRITE_BUFFER_LEN] = {'\0'}; int32_t tabSize = walkDepth * HCS_TAB_SIZE; if (walkDepth) { - res = sprintf_s(writeBuffer, WRITE_BUFFER_LEN, "%*c", tabSize, ' '); - PRINTF_CHECK_AND_RETURN(res); + PRINTF_CHECK_AND_RETURN(HcsFormatOutputWrite("%*c", tabSize, ' ')); } switch (current->objectBase.type) { case PARSEROP_CONFNODE: - res = sprintf_s(writeBuffer + strlen(writeBuffer), WRITE_BUFFER_LEN - strlen(writeBuffer), - "%s {\n", current->configNode.name); - PRINTF_CHECK_AND_RETURN(res); + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite("%s {\n", current->configNode.name)); if (current->objectBase.child == NULL) { - res = sprintf_s(writeBuffer + strlen(writeBuffer) - 1, - WRITE_BUFFER_LEN - strlen(writeBuffer) + 1, "}\n"); - PRINTF_CHECK_AND_RETURN(res); + return HcsFormatOutputWrite("%*c}\n", tabSize, ' '); } break; case PARSEROP_CONFTERM: - res = sprintf_s(writeBuffer + strlen(writeBuffer), WRITE_BUFFER_LEN - strlen(writeBuffer), - "%s = ", current->configNode.name); - PRINTF_CHECK_AND_RETURN(res); - res = HcsDecompilePrintBaseType(writeBuffer + strlen(writeBuffer), WRITE_BUFFER_LEN - strlen(writeBuffer), - (ParserObject *)current->configNode.child); + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite("%s = ", current->configNode.name)); + res = HcsDecompilePrintBaseType( + (ParserObject *) current->configNode.child); if (res) { return res; } - res = sprintf_s(writeBuffer + strlen(writeBuffer), WRITE_BUFFER_LEN - strlen(writeBuffer), ";\n"); - PRINTF_CHECK_AND_RETURN(res); - break; + return HcsFormatOutputWrite(";\n"); default: break; } - return HcsOutputWrite(writeBuffer, strlen(writeBuffer)); + return NOERR; } static int32_t HcsDecompileCloseBraceGen(ParserObject *current, int32_t walkDepth) @@ -193,22 +177,13 @@ static int32_t HcsDecompileCloseBraceGen(ParserObject *current, int32_t walkDept if (current->objectBase.type != PARSEROP_CONFNODE) { return NOERR; } - int32_t res; int32_t tabSize = walkDepth * HCS_TAB_SIZE; - char writeBuffer[WRITE_BUFFER_LEN] = {'\0'}; - - if (current != HcsGetParserRoot()) { - res = sprintf_s(writeBuffer, WRITE_BUFFER_LEN, "%*c}\n", tabSize, ' '); - PRINTF_CHECK_AND_RETURN(res); - } else { - res = sprintf_s(writeBuffer, WRITE_BUFFER_LEN, "}\n"); - PRINTF_CHECK_AND_RETURN(res); - } - return HcsOutputWrite(writeBuffer, strlen(writeBuffer)); + return current != HcsGetParserRoot() ? HcsFormatOutputWrite("%*c}\n", tabSize, ' ') : + HcsFormatOutputWrite("}\n"); } -int32_t HcsDecompileOutput() +int32_t HcsDecompileOutput(void) { ParserObject *astRoot = HcsGetParserRoot(); if (astRoot == NULL) { @@ -221,8 +196,7 @@ int32_t HcsDecompileOutput() goto OUT; } - const char *fileHeader = HCS_DECOMPILE_FILE_HEADER; - if (HcsOutputWrite(fileHeader, strlen(fileHeader))) { + if (HcsFormatOutputWrite(HCS_DECOMPILE_FILE_HEADER) != EOK) { goto OUT; } diff --git a/tools/hc-gen/src/hcs_decompiler.c b/tools/hc-gen/src/hcs_decompiler.c index 2aac4443e..f69414e12 100644 --- a/tools/hc-gen/src/hcs_decompiler.c +++ b/tools/hc-gen/src/hcs_decompiler.c @@ -6,14 +6,14 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include +#include "hcs_decompiler.h" +#include #include "hcs_option.h" #include "hcs_file.h" #include "hcs_opcode.h" #include "hcs_parser.h" #include "hcs_log.h" #include "hcs_compiler.h" -#include "hcs_decompiler.h" static ParserObject *RebuildObject(uint8_t opCode); @@ -42,7 +42,7 @@ static bool HcsVerifyHbcFile() } HCS_INFO("Build by hcs compile %u.%u", header.versionMajor, header.versionMinor); - HCS_INFO("hcb file total size: %u\n", header.totalSize); + HCS_INFO("hcb file total size: %d\n", header.totalSize); return true; } @@ -74,7 +74,7 @@ static char *ReadCString() } char *str = strdup(buff); if (str == NULL) { - HCS_ERROR("%s %d %s OOM", __FILE__, __LINE__, __func__); + HCS_ERROR("%s:%d OOM", __func__, __LINE__); return NULL; } return str; @@ -348,7 +348,7 @@ static bool RebuildAst() return true; } -int32_t HcsDoDecompile() +int32_t HcsDoDecompile(void) { struct HcsFile *source = NULL; uint32_t ret = HcsOpenSourceFile(HcsGetInputFileName(), &source, "rb"); diff --git a/tools/hc-gen/src/hcs_file.c b/tools/hc-gen/src/hcs_file.c index 34b50002f..e3cdedaa7 100644 --- a/tools/hc-gen/src/hcs_file.c +++ b/tools/hc-gen/src/hcs_file.c @@ -6,6 +6,7 @@ * See the LICENSE file in the root of this repository for complete details. */ +#include "hcs_file.h" #include #include #include @@ -15,11 +16,10 @@ #include "hcs_parser.h" #include "hcs_mem.h" #include "hcs_log.h" -#include "hcs_file.h" -static char *g_outputFilename = NULL; -static FILE *g_outputFIle = NULL; -const char *g_inputFileName = NULL; +static char *g_outputFileName = NULL; +static FILE *g_outputFile = NULL; +static const char *g_inputFileName = NULL; static bool g_dummyOutput = false; static uint32_t g_outputWriteCount = 0; static struct HcsFileQueue g_inputSourceFileQueue = { 0 }; @@ -30,20 +30,17 @@ void HcsSetInputFileName(const char *name) g_inputFileName = name; } -const char *HcsGetInputFileName() +const char *HcsGetInputFileName(void) { return g_inputFileName; } -/* - * Return: true - not exist, false - already exist and not overwrite - */ int32_t HcsSourceNameSetPush(const char *name) { if (g_sourceNameSetHead == NULL) { struct HcsSourceName *head = HcsMemZalloc(sizeof(*head)); if (head == NULL) { - HCS_ERROR("%s %d %s OOM", __FILE__, __LINE__, __func__); + HCS_ERROR("%s:%d OOM", __func__, __LINE__); return EOOM; } head->name = name; @@ -61,13 +58,13 @@ int32_t HcsSourceNameSetPush(const char *name) last = last->next; } - struct HcsSourceName *new = HcsMemZalloc(sizeof(struct HcsSourceName)); - if (new == NULL) { - HCS_ERROR("%s %d %s OOM", __FILE__, __LINE__, __func__); + struct HcsSourceName *newName = HcsMemZalloc(sizeof(struct HcsSourceName)); + if (newName == NULL) { + HCS_ERROR("%s:%d OOM", __func__, __LINE__); return EOOM; } - new->name = name; - pre->next = new; + newName->name = name; + pre->next = newName; return NOERR; } @@ -101,6 +98,9 @@ void HcsSourceNameSetClean(void) static const char *GetFileName(const char *path) { + if (path == NULL) { + return NULL; + } int32_t length = (int32_t)strlen(path); int32_t i = length - 1; for (; i >= 0; --i) { @@ -147,7 +147,7 @@ static int32_t CopyAndSaveFileName(const char *filePath, char **savedFileName, c } /* if no specified output file name, use input name */ - if (HcsGetOutPutFileName() == NULL && HcsSetOutPutNameWithCurrentWorkPath(fileName)) { + if (HcsGetOutPutFilePath() == NULL && HcsSetOutPutNameWithCurrentWorkPath(fileName)) { HcsMemFree((void *)fileName); return EOOM; } @@ -172,26 +172,25 @@ int32_t HcsOpenSourceFile(const char *path, struct HcsFile **file, const char *f char *realPath = realpath(path, pathBuf); #endif if (realPath == NULL) { - HCS_ERROR("fail to open source file: %s", path); + HCS_ERROR("failed to open source file: %s", path); return EINVALF; } /* push to name set and check reopen */ - int32_t ret = HcsSourceNameSetFind(realPath); - if (ret == true) { + if (HcsSourceNameSetFind(realPath)) { return EREOPENF; } HCS_DEBUG("source file path: %s", realPath); FILE *f = fopen(realPath, flag ? flag : "r"); if (f == NULL) { - HCS_ERROR("fail to open source file: %s", realPath); + HCS_ERROR("failed to open source file: %s", realPath); return EINVALF; } char *fileName = NULL; char *filePath = NULL; - ret = CopyAndSaveFileName(realPath, &fileName, &filePath); + int32_t ret = CopyAndSaveFileName(realPath, &fileName, &filePath); if (ret) { fclose(f); return EFAIL; @@ -200,6 +199,7 @@ int32_t HcsOpenSourceFile(const char *path, struct HcsFile **file, const char *f struct HcsFile *sourceFile = HcsMemZalloc(sizeof(struct HcsFile)); if (sourceFile == NULL) { HcsMemFree(fileName); + HcsMemFree(filePath); fclose(f); HCS_ERROR("oom"); return EOOM; @@ -272,17 +272,17 @@ int32_t HcsSetOutPutNameWithCurrentWorkPath(const char *name) int32_t HcsSetOutPutName(const char *name) { - if (g_outputFilename != NULL) { - HcsMemFree(g_outputFilename); + if (g_outputFileName != NULL) { + HcsMemFree(g_outputFileName); } - g_outputFilename = strdup(name); - if (g_outputFilename == NULL) { + g_outputFileName = strdup(name); + if (g_outputFileName == NULL) { HCS_ERROR("oom"); return EOOM; } #ifdef OS_WIN - char *temp = g_outputFilename; + char *temp = g_outputFileName; while (*temp != '\0') { if (*temp == UNIX_SEPARATOR) { *temp = WIN_SEPARATOR; @@ -296,13 +296,13 @@ int32_t HcsSetOutPutName(const char *name) bool HcsSetOutputFileSuffix(const char *suffix) { - const char *fileNameBefore = g_outputFilename; + const char *fileNameBefore = g_outputFileName; const char *fileNameWithoutSuffix = GetFileNameWithoutSuffix(fileNameBefore); if (fileNameWithoutSuffix == NULL) { return false; } - uint32_t newNameSize = strlen(g_outputFilename) + strlen(suffix) + 1; + uint32_t newNameSize = strlen(g_outputFileName) + strlen(suffix) + 1; char *newOutputFilename = HcsMemZalloc(newNameSize); if (newOutputFilename == NULL) { HcsMemFree((void *)fileNameWithoutSuffix); @@ -312,37 +312,58 @@ bool HcsSetOutputFileSuffix(const char *suffix) int32_t ret = strcpy_s(newOutputFilename, newNameSize, fileNameWithoutSuffix); HcsMemFree((void *)fileNameWithoutSuffix); if (ret) { - HCS_ERROR("string copy fail"); + HCS_ERROR("failed to copy string"); HcsMemFree(newOutputFilename); return false; } ret = strcat_s(newOutputFilename, newNameSize, suffix); if (ret) { - HCS_ERROR("string copy fail"); + HCS_ERROR("failed to copy string"); HcsMemFree(newOutputFilename); return false; } HcsMemFree((void *)fileNameBefore); - g_outputFilename = newOutputFilename; + g_outputFileName = newOutputFilename; return true; } // return output file name only -const char *HcsGetStripedOutputFileName() +const char *HcsGetOutputFileName(void) +{ + return GetFileName(g_outputFileName); +} + +char *HcsGetOutputFileNameWithoutSuffix(void) { - return GetFileName(g_outputFilename); + const char *fileName = HcsGetOutputFileName(); + if (fileName == NULL) { + return NULL; + } + + char *retName = strdup(fileName); + if (retName == NULL) { + HCS_ERROR("oom"); + return NULL; + } + + char *dot = strchr(retName, '.'); + if (dot != NULL) { + *dot = '\0'; + } + return retName; } + // return full path of output file -const char *HcsGetOutPutFileName() +const char *HcsGetOutPutFilePath(void) { - return g_outputFilename; + return g_outputFileName; } bool HcsOutputNameVerify() { - const char *fileName = g_outputFilename; + const char *fileName = g_outputFileName; char lastChar = fileName[strlen(fileName) - 1]; if (lastChar == OS_SEPARATOR) { HCS_ERROR("output name is DIR"); @@ -360,10 +381,10 @@ struct HcsFile *HcsOpenOutputFile(const char *suffix) if (!HcsSetOutputFileSuffix(suffix)) { return NULL; } - const char *outputFileName = HcsGetOutPutFileName(); - g_outputFIle = fopen(outputFileName, "wb"); - if (g_outputFIle == NULL) { - HCS_ERROR("fail to open output file: %s", outputFileName); + const char *outputFileName = HcsGetOutPutFilePath(); + g_outputFile = fopen(outputFileName, "wb"); + if (g_outputFile == NULL) { + HCS_ERROR("failed to open output file: %s", outputFileName); return NULL; } @@ -371,12 +392,12 @@ struct HcsFile *HcsOpenOutputFile(const char *suffix) struct HcsFile *outputFile = HcsMemZalloc(sizeof(struct HcsFile)); if (outputFile == NULL) { HCS_ERROR("oom"); - fclose(g_outputFIle); - g_outputFIle = NULL; + fclose(g_outputFile); + g_outputFile = NULL; return NULL; } outputFile->name = outputFileName; - outputFile->file = g_outputFIle; + outputFile->file = g_outputFile; outputFile->pos = 0; outputFile->fullPath = outputFileName; g_outputWriteCount = 0; @@ -404,15 +425,38 @@ int32_t HcsOutputWrite(const void *buffer, uint32_t length) return NOERR; } - uint32_t writeLen = fwrite(buffer, 1, length, g_outputFIle); + uint32_t writeLen = fwrite(buffer, 1, length, g_outputFile); if (writeLen != length) { - HCS_ERROR("output file write fail"); + HCS_ERROR("failed to write output file"); return EOUTPUT; } return NOERR; } +#define WRITE_MAX_PER_TIME 2048 + +int32_t HcsFormatOutputWrite(const char *format, ...) +{ + if (format == NULL) { + return EINVALARG; + } + static char writeBuffer[WRITE_MAX_PER_TIME] = {'\0'}; + + va_list argList; + + va_start(argList, format); + int length = vsprintf_s(writeBuffer, WRITE_MAX_PER_TIME, format, argList); + va_end(argList); + (void)argList; + + if (length < 0) { + HCS_ERROR("Output too long in one time"); + return EOUTPUT; + } + return HcsOutputWrite(writeBuffer, length); +} + int32_t HcsOutputWriteAlign(const void *buffer, uint32_t length) { static const uint8_t alignData[ALIGN_SIZE] = {0}; @@ -460,7 +504,7 @@ void HcsSourceQueuePush(struct HcsFile *sourceFile) sourceQueue->count++; } -void HcsSourceQueuePop() +void HcsSourceQueuePop(void) { struct HcsFileQueue *sourceQueue = &g_inputSourceFileQueue; if (sourceQueue->head == NULL) { @@ -470,17 +514,17 @@ void HcsSourceQueuePop() sourceQueue->count--; } -struct HcsFile *HcsSourceQueueTop() +struct HcsFile *HcsSourceQueueTop(void) { return g_inputSourceFileQueue.head; } -uint32_t HcsSourceQueueSize() +uint32_t HcsSourceQueueSize(void) { return g_inputSourceFileQueue.count; } -const char *HcsGetCurrentSourceName() +const char *HcsGetCurrentSourceName(void) { struct HcsFile *source = HcsSourceQueueTop(); return source ? source->fullPath : ""; @@ -488,19 +532,12 @@ const char *HcsGetCurrentSourceName() bool HcsFileCopyDir(char *dst, uint32_t dstBufferSize, const char *fullPath) { - const char *c = strlen(fullPath) + fullPath; - while (c >= fullPath) { - if (*c == OS_SEPARATOR) { - break; - } - c--; - } - int32_t len = (int32_t)(c - fullPath) + 1; - if (len <= 0) { + const char *c = strrchr(fullPath, OS_SEPARATOR); + if (c == NULL) { HCS_ERROR("%s: path '%s' not include dir", __func__, fullPath); return false; } - + int32_t len = (int32_t)(c - fullPath) + 1; int32_t ret = strncpy_s(dst, dstBufferSize, fullPath, len); if (ret) { HCS_ERROR("%s:string copy fail", __func__); diff --git a/tools/hc-gen/src/hcs_hexdump.c b/tools/hc-gen/src/hcs_hexdump.c index 59d634a5f..6ac7f9818 100644 --- a/tools/hc-gen/src/hcs_hexdump.c +++ b/tools/hc-gen/src/hcs_hexdump.c @@ -61,13 +61,14 @@ int32_t HcsBinaryToHexdump(const char *inputFileName) struct HcsFile *out = HcsOpenOutputFile(HCS_HEXDUMP_FILE_SUFFIX); if (out == NULL) { - HCS_ERROR("can not open %s", HcsGetOutPutFileName()); + HCS_ERROR("can not open %s", HcsGetOutPutFilePath()); + HcsCloseFile(source); return EINVALF; } int32_t ret = HcsHexdumpOutput(source->file, out->file); if (ret) { - HCS_ERROR("fail to gen bytecode hexdump in C style"); + HCS_ERROR("failed to gen bytecode hexdump in C style"); } HcsCloseFile(source); HcsCloseFile(out); diff --git a/tools/hc-gen/src/hcs_mem.c b/tools/hc-gen/src/hcs_mem.c index 410c66a2e..e5ec7cb86 100644 --- a/tools/hc-gen/src/hcs_mem.c +++ b/tools/hc-gen/src/hcs_mem.c @@ -6,11 +6,11 @@ * See the LICENSE file in the root of this repository for complete details. */ +#include "hcs_mem.h" #include #include #include -#include "hcs_mem.h" -#define MEM_MAX (1024*1024) +#define MEM_MAX (1024 * 1024) void *HcsMemAlloc(uint32_t size) { @@ -18,8 +18,7 @@ void *HcsMemAlloc(uint32_t size) return NULL; } - void *newMem = malloc(size); - return newMem; + return malloc(size); } void *HcsMemZalloc(uint32_t size) diff --git a/tools/hc-gen/src/hcs_middle.c b/tools/hc-gen/src/hcs_middle.c index 35301f84e..b281764d2 100644 --- a/tools/hc-gen/src/hcs_middle.c +++ b/tools/hc-gen/src/hcs_middle.c @@ -38,17 +38,14 @@ static ParserObject *HcsLookupAstObject(const ParserObject *current, const char ParserObject *object = HcsGetParserRoot(); while (nodeName != NULL) { object = HcsAstLookupObjectInChildren(object, nodeName); - if (object == NULL) + if (object == NULL) { break; + } nodeName = strtok(NULL, "."); } HcsMemFree(splitPath); - if (object != NULL) { - return object; - } - - return NULL; + return object; } static int32_t HcsExpandNodeRef(ParserObject *object) @@ -105,7 +102,7 @@ static int32_t HcsExpandNodeCopy(ParserObject *object) ParserObjectBase *copyChild = copyNode->objectBase.child; while (copyChild != NULL) { if (copyChild->type == PARSEROP_CONFNODE) { - HCS_OBJECT_ERROR(object, "Not allow copy node has child node when output text config, at %s:%d", + HCS_OBJECT_ERROR(object, "Not allow copy node has child node when output text config, at %s:%u", copyChild->src, copyChild->lineno); return EINVALARG; } @@ -340,12 +337,12 @@ static bool HcsApplyDelete(ParserObject *dst, ParserObject *src) static int32_t HcsMergeTree(ParserObject *dst, ParserObject *src) { if (strcmp(src->objectBase.name, dst->objectBase.name) != 0) { - HCS_OBJECT_ERROR(src, "merge different node to %s:%d", dst->objectBase.src, dst->objectBase.lineno); + HCS_OBJECT_ERROR(src, "merge different node to %s:%u", dst->objectBase.src, dst->objectBase.lineno); return EINVALARG; } if (src->objectBase.type != dst->objectBase.type) { - HCS_OBJECT_ERROR(src, "conflict type with %s:%d", dst->objectBase.src, dst->objectBase.lineno); + HCS_OBJECT_ERROR(src, "conflict type with %s:%u", dst->objectBase.src, dst->objectBase.lineno); return EINVALARG; } @@ -373,7 +370,7 @@ static int32_t HcsMergeTree(ParserObject *dst, ParserObject *src) ParserObject *childSrcNext = (ParserObject *)childSrc->objectBase.next; ParserObject *childDst = HcsAstLookupObjectInChildren(dst, childSrc->objectBase.name); if (childDst != NULL && childSrc->objectBase.type != childDst->objectBase.type) { - HCS_OBJECT_ERROR(childSrc, "overwrite with different type at %s:%d", childDst->objectBase.src, + HCS_OBJECT_ERROR(childSrc, "overwrite with different type at %s:%u", childDst->objectBase.src, childDst->objectBase.lineno); return EINVALARG; } @@ -435,7 +432,7 @@ static int32_t HcsMiddleMerge(ParserObject **mergedRoot) return NOERR; } -int32_t HcsDoOptimize() +int32_t HcsDoOptimize(void) { ParserObject *root = HcsGetParserRoot(); if (root == NULL) { diff --git a/tools/hc-gen/src/hcs_opcode.c b/tools/hc-gen/src/hcs_opcode.c index 3bfac2df2..22adaa652 100644 --- a/tools/hc-gen/src/hcs_opcode.c +++ b/tools/hc-gen/src/hcs_opcode.c @@ -6,8 +6,8 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include #include "hcs_opcode.h" +#include OpCodeMapEntry g_byteCodeMap[PARSEROP_COUNT] = { @@ -22,7 +22,7 @@ OpCodeMapEntry g_byteCodeMap[PARSEROP_COUNT] = { [PARSEROP_NODEREF] = {HCS_NODEREF_OP, DWORD_SIZE, "NodeRef"}, /* RefHashCode - DWORD */ }; -const OpCodeMapEntry *HcsGetOpCodeMap() +const OpCodeMapEntry *HcsGetOpCodeMap(void) { return g_byteCodeMap; } diff --git a/tools/hc-gen/src/hcs_option.c b/tools/hc-gen/src/hcs_option.c index 3958660b0..3442275e2 100644 --- a/tools/hc-gen/src/hcs_option.c +++ b/tools/hc-gen/src/hcs_option.c @@ -14,15 +14,15 @@ #define ARG_COUNT_MIN 2 #define USAGE(option, info) HCS_PRINT(" %-12s%s\n", option, info) -bool g_genTextConfigOutput = false; -bool g_genByteCodeConfigOutput = true; -bool g_genByteCodeHexdump = false; -bool g_verbosePrint = false; -bool g_decompile = false; -bool g_shouldAlign = false; -const char *g_symbolPrefix = NULL; - -bool HcsOptShouldAlign() +static bool g_genTextConfigOutput = false; +static bool g_genByteCodeConfigOutput = true; +static bool g_genByteCodeHexdump = false; +static bool g_verbosePrint = false; +static bool g_decompile = false; +static bool g_shouldAlign = false; +static const char *g_symbolPrefix = NULL; + +bool HcsOptShouldAlign(void) { return g_shouldAlign; } @@ -32,26 +32,27 @@ void HcsOptSetAlign(bool align) g_shouldAlign = align; } - -bool HcsOptShouldGenTextConfig() +bool HcsOptShouldGenTextConfig(void) { return g_genTextConfigOutput; } -bool HcsOptShouldGenByteCodeConfig() + +bool HcsOptShouldGenByteCodeConfig(void) { return g_genByteCodeConfigOutput; } -bool HcsOptDecompile() + +bool HcsOptDecompile(void) { return g_decompile; } -const char *HcsOptGetSymbolNamePrefix() +const char *HcsOptGetSymbolNamePrefix(void) { return g_symbolPrefix; } -bool HcsOptShouldGenHexdump() +bool HcsOptShouldGenHexdump(void) { return g_genByteCodeHexdump; } @@ -151,7 +152,7 @@ int32_t DoOption(int32_t argc, char *argv[]) return 0; } -bool HcsVerbosePrint() +bool HcsVerbosePrint(void) { return g_verbosePrint; } diff --git a/tools/hc-gen/src/hcs_parser.c b/tools/hc-gen/src/hcs_parser.c index 7e595cef9..40eb343f7 100644 --- a/tools/hc-gen/src/hcs_parser.c +++ b/tools/hc-gen/src/hcs_parser.c @@ -125,7 +125,7 @@ int32_t HcsProcessInclude(char *includePath, uint32_t lineNumber) return NOERR; } -int32_t HcsDoCompile() +int32_t HcsDoCompile(void) { struct HcsFile *source = NULL; char *forestName = strdup("ForestRoot"); diff --git a/tools/hc-gen/src/hcs_text_gen.c b/tools/hc-gen/src/hcs_text_gen.c index 00cce0705..9513c372e 100644 --- a/tools/hc-gen/src/hcs_text_gen.c +++ b/tools/hc-gen/src/hcs_text_gen.c @@ -18,20 +18,16 @@ #define TAB_SIZE 4 #define WRITE_BUFFER_LEN 256 -#define INCLUDE_PATH_MAX_LEN 128 #define VARIABLE_NAME_LEN 128 -#define GEN_CODE_MARGIN_SIZE 100 -#define GEN_ARRAY_SEP_SIZE 2 +#define ELEMENT_PER_LINE 16 #define HCS_CONFIG_FILE_HEADER "/*\n" \ - " * It's HDF config auto-gen file, do not modify it manually\n" \ + " * This is an automatically generated HDF config file. Do not modify it manually.\n" \ " */\n\n" #define HCS_CONFIG_INCLUDE_HEADER "#include \n\n" #define DEFAULT_PREFIX "HdfConfig" -#define HCS_CONFIG_INCLUDE_FUNC_DECLARATION "const struct %s%sRoot* HdfGet%sModuleConfigRoot(void);\n\n" - #define HCS_CONFIG_FUNC_IMPLEMENT "\nconst struct %s%sRoot* HdfGet%sModuleConfigRoot(void)\n" \ "{\n" \ " return &%s;\n" \ @@ -96,7 +92,7 @@ static int32_t InitConfigVariableNames() return EOOM; } if (strcpy_s(g_bigHumpModuleName, strlen(moduleName) + 1, moduleName) != EOK) { - HCS_ERROR("string copy fail"); + HCS_ERROR("failed to copy string"); return EFAIL; } ToUpperCamelString(g_bigHumpModuleName, strlen(g_bigHumpModuleName)); @@ -309,14 +305,16 @@ const char *g_typeMap[PARSEROP_COUNT] = { static int32_t GenConfigStructName(const ParserObject *node, char *name, uint32_t nameBuffLen) { char nameBuffer[OBJECT_NAME_MAX_LEN] = {'\0'}; - int32_t res = strcpy_s(nameBuffer, OBJECT_NAME_MAX_LEN, HcsGetModuleName()); - PRINTF_CHECK_AND_RETURN(res); + if (strcpy_s(nameBuffer, OBJECT_NAME_MAX_LEN, HcsGetModuleName()) != EOK) { + return EOUTPUT; + } ToUpperCamelString(nameBuffer, strlen(nameBuffer)); - res = sprintf_s(name, nameBuffLen, "%s%s", g_namePrefix, nameBuffer); + int32_t res = sprintf_s(name, nameBuffLen, "%s%s", g_namePrefix, nameBuffer); PRINTF_CHECK_AND_RETURN(res); - res = strcpy_s(nameBuffer, OBJECT_NAME_MAX_LEN, node->configNode.name); - PRINTF_CHECK_AND_RETURN(res); + if (strcpy_s(nameBuffer, OBJECT_NAME_MAX_LEN, node->configNode.name) != EOK) { + return EOUTPUT; + } ToUpperCamelString(nameBuffer, strlen(nameBuffer)); res = sprintf_s(name + strlen(name), nameBuffLen - strlen(name), "%s", nameBuffer); PRINTF_CHECK_AND_RETURN(res); @@ -329,7 +327,7 @@ static int32_t GenConfigArrayName(ParserObject *array, char *name, uint32_t name char buffer[OBJECT_NAME_MAX_LEN] = {'\0'}; if (strcpy_s(buffer, sizeof(buffer), array->objectBase.name) != EOK) { - HCS_ERROR("%s: string copy fail", __func__); + HCS_ERROR("%s: failed to copy string", __func__); return EOUTPUT; } ToUpperCamelString(buffer, strlen(buffer)); @@ -376,32 +374,27 @@ static int32_t GetArraySize(const ParserObject *array) return size; } -static int32_t HcsPrintTermDefinition(char *buffer, uint32_t bufferSize, const ParserObject *object) +static int32_t HcsPrintTermDefinition(const ParserObject *object) { ParserObject *termContext = (ParserObject *)object->objectBase.child; - int32_t res; + int32_t res = NOERR; switch (termContext->objectBase.type) { case PARSEROP_ARRAY: if (HcsIsInTemplateNode(object)) { - res = sprintf_s(buffer, bufferSize, "const %s *%s;\n", GetArrayType(termContext), - object->configTerm.name); - PRINTF_CHECK_AND_RETURN(res); - res = sprintf_s(buffer + strlen(buffer), bufferSize - strlen(buffer), "%*cuint32_t %sSize;\n", TAB_SIZE, - ' ', object->configTerm.name); + res = HcsFormatOutputWrite("const %s *%s;\n", GetArrayType(termContext), object->configTerm.name); + OUTPUT_CHECK_AND_RETURN(res); + res = HcsFormatOutputWrite("%*cuint32_t %sSize;\n", TAB_SIZE, ' ', object->configTerm.name); } else { - res = sprintf_s(buffer, bufferSize, "%s %s[%d];\n", GetArrayType(termContext), object->configTerm.name, + res = HcsFormatOutputWrite("%s %s[%d];\n", GetArrayType(termContext), object->configTerm.name, GetArraySize(termContext)); } - PRINTF_CHECK_AND_RETURN(res); break; case PARSEROP_UINT8: case PARSEROP_UINT16: case PARSEROP_UINT32: case PARSEROP_UINT64: case PARSEROP_STRING: - res = sprintf_s(buffer, bufferSize - strlen(buffer), "%s %s;\n", g_typeMap[termContext->objectBase.type], - object->configTerm.name); - PRINTF_CHECK_AND_RETURN(res); + res = HcsFormatOutputWrite("%s %s;\n", g_typeMap[termContext->objectBase.type], object->configTerm.name); break; case PARSEROP_NODEREF: { char refType[OBJECT_NAME_MAX_LEN] = {'\0'}; @@ -409,15 +402,13 @@ static int32_t HcsPrintTermDefinition(char *buffer, uint32_t bufferSize, const P if (res) { return res; } - res = sprintf_s(buffer, bufferSize - strlen(buffer), "const struct %s* %s;\n", refType, - object->configTerm.name); - PRINTF_CHECK_AND_RETURN(res); + res = HcsFormatOutputWrite("const struct %s* %s;\n", refType, object->configTerm.name); } break; default: break; } - return NOERR; + return res; } static int32_t HcsObjectDefinitionGen(const ParserObject *current) @@ -426,9 +417,8 @@ static int32_t HcsObjectDefinitionGen(const ParserObject *current) return NOERR; } - char writeBuffer[WRITE_BUFFER_LEN] = {'\0'}; - int32_t res = sprintf_s(writeBuffer, WRITE_BUFFER_LEN, "%*c", TAB_SIZE, ' '); - PRINTF_CHECK_AND_RETURN(res); + int res = NOERR; + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite("%*c", TAB_SIZE, ' ')); switch (current->objectBase.type) { case PARSEROP_CONFNODE: { char structName[OBJECT_NAME_MAX_LEN] = {'\0'}; @@ -438,32 +428,27 @@ static int32_t HcsObjectDefinitionGen(const ParserObject *current) } if (current->configNode.nodeType == CONFIG_NODE_TEMPLATE) { char nodeName[OBJECT_NAME_MAX_LEN] = {0}; - if (strcpy_s(nodeName, sizeof(nodeName), current->configNode.name)) { + if (strcpy_s(nodeName, sizeof(nodeName), current->configNode.name) != EOK) { return EOUTPUT; } ToLowerCamelString(nodeName, strlen(nodeName)); - res = sprintf_s(writeBuffer + TAB_SIZE, WRITE_BUFFER_LEN - strlen(writeBuffer), - "const struct %s* %s;\n", structName, nodeName); - PRINTF_CHECK_AND_RETURN(res); - res = sprintf_s(writeBuffer + strlen(writeBuffer), WRITE_BUFFER_LEN - strlen(writeBuffer), - "%*cuint16_t %sSize;\n", TAB_SIZE, ' ', nodeName); + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite("const struct %s* %s;\n", structName, nodeName)); + res = HcsFormatOutputWrite("%*cuint16_t %sSize;\n", TAB_SIZE, ' ', nodeName); } else if (current->configNode.nodeType == CONFIG_NODE_INHERIT) { return NOERR; } else { - res = sprintf_s(writeBuffer + TAB_SIZE, WRITE_BUFFER_LEN - strlen(writeBuffer), "struct %s %s;\n", - structName, current->configNode.name); + res = HcsFormatOutputWrite("struct %s %s;\n", structName, current->configNode.name); } - PRINTF_CHECK_AND_RETURN(res); break; } case PARSEROP_CONFTERM: - HcsPrintTermDefinition(writeBuffer + TAB_SIZE, WRITE_BUFFER_LEN - strlen(writeBuffer), current); + res = HcsPrintTermDefinition(current); break; default: break; } - return HcsOutputWrite(writeBuffer, strlen(writeBuffer)); + return res; } static int32_t HcsDuplicateCheckWalkCallBack(ParserObject *current, int32_t walkDepth) @@ -479,7 +464,6 @@ static int32_t HcsDuplicateCheckWalkCallBack(ParserObject *current, int32_t walk static int32_t HcsGenNormalNodeDefinition(ParserObject *object, int32_t walkDepth) { (void)walkDepth; - char writeBuffer[WRITE_BUFFER_LEN] = {'\0'}; char structName[OBJECT_NAME_MAX_LEN] = {'\0'}; int32_t res = GenConfigStructName(object, structName, OBJECT_NAME_MAX_LEN - 1); if (res) { @@ -491,11 +475,7 @@ static int32_t HcsGenNormalNodeDefinition(ParserObject *object, int32_t walkDept HcsSymbolTableAdd(structName, object); } - res = sprintf_s(writeBuffer, (WRITE_BUFFER_LEN - 1), "struct %s {\n", structName); - PRINTF_CHECK_AND_RETURN(res); - if (HcsOutputWrite(writeBuffer, strlen(writeBuffer))) { - return EOUTPUT; - } + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite("struct %s {\n", structName)); ParserObject *terms = (ParserObject *)object->objectBase.child; while (terms != NULL) { @@ -506,10 +486,7 @@ static int32_t HcsGenNormalNodeDefinition(ParserObject *object, int32_t walkDept terms = (ParserObject *)terms->objectBase.next; } - res = sprintf_s(writeBuffer, (WRITE_BUFFER_LEN - 1), "};\n\n"); - PRINTF_CHECK_AND_RETURN(res); - - return HcsOutputWrite(writeBuffer, strlen(writeBuffer)); + return HcsFormatOutputWrite("};\n\n"); } static int32_t HcsGenNodeTemplateDefinition(ParserObject *object, int32_t walkDepth) @@ -532,20 +509,18 @@ static int32_t HcsDefinitionGenWalkCallBack(ParserObject *current, int32_t walkD } } -static uint32_t HcsPrintTermValue(char *buffer, uint32_t buffSize, const ParserObject *object) +static uint32_t HcsPrintTermValue(const ParserObject *object) { - int32_t res = 0; + int32_t res = NOERR; switch (object->objectBase.type) { case PARSEROP_UINT8: /* fallthrough */ case PARSEROP_UINT16: /* fallthrough */ case PARSEROP_UINT32: /* fallthrough */ case PARSEROP_UINT64: - res = sprintf_s(buffer, buffSize, "0x%" PRIx64, object->objectBase.integerValue); - PRINTF_CHECK_AND_RETURN(res); + res = HcsFormatOutputWrite("0x%" PRIx64, object->objectBase.integerValue); break; case PARSEROP_STRING: - res = sprintf_s(buffer, buffSize, "\"%s\"", object->objectBase.stringValue); - PRINTF_CHECK_AND_RETURN(res); + res = HcsFormatOutputWrite("\"%s\"", object->objectBase.stringValue); break; default: break; @@ -603,19 +578,15 @@ static char *HcsBuildObjectPath(const ParserObject *refObject) return path; } -static int32_t HcsPrintArrayImplInSubClass(char *buffer, uint32_t bufferSize, ParserObject *object, uint8_t tabSize) +static int32_t HcsPrintArrayImplInSubClass(ParserObject *object, uint8_t tabSize) { - int32_t size = sprintf_s(buffer, bufferSize, "%*c.%s = ", tabSize, ' ', object->objectBase.name); - PRINTF_CHECK_AND_RETURN(size); - if (GenConfigArrayName(object, buffer + size, bufferSize - size)) { + char arrayName[VARIABLE_NAME_LEN] = {0}; + if (GenConfigArrayName(object, arrayName, VARIABLE_NAME_LEN)) { return EOUTPUT; } - size = sprintf_s(buffer + strlen(buffer), bufferSize - strlen(buffer), ",\n"); - PRINTF_CHECK_AND_RETURN(size); - size = sprintf_s(buffer + strlen(buffer), bufferSize - strlen(buffer), "%*c.%sSize = %d,\n", tabSize, ' ', - object->configTerm.name, GetArraySize((ParserObject *)object->objectBase.child)); - PRINTF_CHECK_AND_RETURN(size); - return HcsOutputWrite(buffer, strlen(buffer)); + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite(".%s = %s,\n", object->objectBase.name, arrayName)); + return HcsFormatOutputWrite("%*c.%sSize = %d,\n", tabSize, ' ', + object->configTerm.name, GetArraySize((ParserObject *)object->objectBase.child)); } static int32_t HcsPrintArrayContent(const ParserObject *object, int32_t tabSize) @@ -624,59 +595,44 @@ static int32_t HcsPrintArrayContent(const ParserObject *object, int32_t tabSize) return NOERR; } - char writeBuffer[WRITE_BUFFER_LEN] = {'\0'}; ParserObject *element = (ParserObject *)object->objectBase.child; - uint32_t writeSize = 0; + uint32_t elementCount = 0; while (element != NULL) { - int32_t size = HcsPrintTermValue(writeBuffer + writeSize, sizeof(writeBuffer) - writeSize, element); - writeBuffer[writeSize + size++] = ','; - writeBuffer[writeSize + size++] = ' '; - writeSize += size; - if (writeSize >= GEN_CODE_MARGIN_SIZE) { - writeSize -= 1; /* strip space at line end */ - size = sprintf_s(writeBuffer + writeSize, sizeof(writeBuffer) - writeSize, "\n%*c", tabSize, ' '); - PRINTF_CHECK_AND_RETURN(size); - writeSize += size; - if (HcsOutputWrite(writeBuffer, writeSize)) { - return EOUTPUT; - } - writeSize = 0; + if (HcsPrintTermValue(element) != NOERR) { + return EOUTPUT; + } + if (elementCount++ >= ELEMENT_PER_LINE) { + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite("\n%*c", tabSize, ' ')); } element = (ParserObject *)element->configTerm.next; + if (element != NULL) { + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite(", ")); + } } - return writeSize ? HcsOutputWrite(writeBuffer, writeSize - GEN_ARRAY_SEP_SIZE) : NOERR; + return NOERR; } -static int32_t HcsPrintArrayImplement(char *buffer, uint32_t bufferSize, ParserObject *object, uint8_t tabSize) +static int32_t HcsPrintArrayImplement(ParserObject *object, uint8_t tabSize) { if (HcsIsInSubClassNode(object)) { - return HcsPrintArrayImplInSubClass(buffer, bufferSize, object, tabSize); + return HcsPrintArrayImplInSubClass(object, tabSize); } ParserObject *termContext = (ParserObject *)object->objectBase.child; - int32_t res = sprintf_s(buffer + strlen(buffer), bufferSize - strlen(buffer), "%*c.%s = { ", tabSize, ' ', - object->configTerm.name); - PRINTF_CHECK_AND_RETURN(res); - if (HcsOutputWrite(buffer, strlen(buffer))) { - return EOUTPUT; - } + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite(".%s = { ", object->configTerm.name)); + if (HcsPrintArrayContent(termContext, tabSize + TAB_SIZE)) { HCS_ERROR("fail to write array content"); return EOUTPUT; } - res = sprintf_s(buffer, bufferSize, " },\n"); - PRINTF_CHECK_AND_RETURN(res); - if (HcsOutputWrite(buffer, strlen(buffer))) { - return EOUTPUT; - } - return NOERR; + return HcsFormatOutputWrite(" },\n"); } -static int32_t HcsPrintTermImplement(char *buffer, uint32_t bufferSize, ParserObject *object, int32_t tabSize) +static int32_t HcsPrintTermImplement(ParserObject *object, int32_t tabSize) { - int32_t res; - sprintf_s(buffer, bufferSize, "%*c", tabSize, ' '); + int32_t res = NOERR; + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite("%*c", tabSize, ' ')); ParserObject *termContext = (ParserObject *)object->objectBase.child; switch (termContext->objectBase.type) { case PARSEROP_UINT8: @@ -686,52 +642,43 @@ static int32_t HcsPrintTermImplement(char *buffer, uint32_t bufferSize, ParserOb case PARSEROP_UINT32: /* fall-through */ case PARSEROP_UINT64: - res = sprintf_s(buffer + strlen(buffer), bufferSize - strlen(buffer), ".%s = ", object->configTerm.name); - PRINTF_CHECK_AND_RETURN(res); - if (!HcsPrintTermValue(buffer + strlen(buffer), bufferSize - strlen(buffer), termContext)) { + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite(".%s = ", object->configTerm.name)); + if (HcsPrintTermValue(termContext) != NOERR) { return EOUTPUT; } - res = sprintf_s(buffer + strlen(buffer), bufferSize - strlen(buffer), ",\n"); - PRINTF_CHECK_AND_RETURN(res); + res = HcsFormatOutputWrite(",\n"); break; case PARSEROP_STRING: - res = sprintf_s(buffer + strlen(buffer), bufferSize - strlen(buffer), ".%s = ", object->configTerm.name); - PRINTF_CHECK_AND_RETURN(res); - if (!HcsPrintTermValue(buffer + strlen(buffer), bufferSize - strlen(buffer), termContext)) { + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite(".%s = ", object->configTerm.name)); + if (HcsPrintTermValue(termContext) != NOERR) { return EOUTPUT; } - res = sprintf_s(buffer + strlen(buffer), bufferSize - strlen(buffer), ",\n"); - PRINTF_CHECK_AND_RETURN(res); + res = HcsFormatOutputWrite(",\n"); break; case PARSEROP_ARRAY: - if (HcsPrintArrayImplement(buffer + strlen(buffer), bufferSize - strlen(buffer), object, tabSize)) { - return EOUTPUT; - } - buffer[0] = '\0'; + res = HcsPrintArrayImplement(object, tabSize); break; case PARSEROP_NODEREF: { char *refPath = HcsBuildObjectPath((ParserObject *)object->objectBase.child->value); if (refPath == NULL) { return EOUTPUT; } - res = sprintf_s(buffer + strlen(buffer), bufferSize - strlen(buffer), ".%s = &%s,\n", - object->configTerm.name, refPath); + res = HcsFormatOutputWrite(".%s = &%s,\n", object->configTerm.name, refPath); HcsMemFree(refPath); - PRINTF_CHECK_AND_RETURN(res); break; } default: break; } - return NOERR; + return res; } static int32_t HcsGenTemplateVariableName(ParserObject *object, char *nameBuff, uint32_t nameBufferSize) { char tempName[OBJECT_NAME_MAX_LEN] = {'\0'}; - if (strcpy_s(tempName, sizeof(tempName), object->objectBase.name)) { - HCS_ERROR("s: string copy fail"); + if (strcpy_s(tempName, sizeof(tempName), object->objectBase.name) != EOK) { + HCS_ERROR("failed to copy string"); return EOUTPUT; } ToUpperCamelString(tempName, sizeof(tempName)); @@ -756,24 +703,22 @@ static int32_t HcsGenTemplateVariableName(ParserObject *object, char *nameBuff, static int32_t HcsTemplateNodeImplGen(ParserObject *current, int32_t tabSize) { - char writeBuffer[WRITE_BUFFER_LEN] = {'\0'}; char templateVariableName[VARIABLE_NAME_LEN] = {'\0'}; if (HcsGenTemplateVariableName(current, templateVariableName, sizeof(templateVariableName))) { return EOUTPUT; } char nodeName[OBJECT_NAME_MAX_LEN] = {0}; - if (strcpy_s(nodeName, sizeof(nodeName), current->configNode.name)) { - HCS_ERROR("%s: string copy fail", __func__); + if (strcpy_s(nodeName, sizeof(nodeName), current->configNode.name) != EOK) { + HCS_ERROR("%s: failed to copy string", __func__); return EOUTPUT; } + ToLowerCamelString(nodeName, strlen(nodeName)); - int32_t res = sprintf_s(writeBuffer, WRITE_BUFFER_LEN, "%*c.%s = %s,\n", tabSize, ' ', nodeName, - current->configNode.inheritCount ? templateVariableName : "0"); - PRINTF_CHECK_AND_RETURN(res); - res = sprintf_s(writeBuffer + strlen(writeBuffer), WRITE_BUFFER_LEN - strlen(writeBuffer), "%*c.%sSize = %d,\n", + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite("%*c.%s = %s,\n", tabSize, ' ', nodeName, + current->configNode.inheritCount ? templateVariableName : "0")); + + return HcsFormatOutputWrite("%*c.%sSize = %d,\n", tabSize, ' ', nodeName, current->configNode.inheritCount); - PRINTF_CHECK_AND_RETURN(res); - return HcsOutputWrite(writeBuffer, strlen(writeBuffer)); } static int32_t HcsInheritObjectImplGen(ParserObject *current, int32_t tabSize) @@ -787,33 +732,26 @@ static int32_t HcsInheritObjectImplGen(ParserObject *current, int32_t tabSize) static int32_t HcsObjectImplementGen(ParserObject *current, int32_t tabSize) { - char writeBuffer[WRITE_BUFFER_LEN] = {'\0'}; - int32_t res; + int32_t res = NOERR; switch (current->objectBase.type) { - case PARSEROP_CONFNODE: { + case PARSEROP_CONFNODE: if (current->configNode.nodeType != CONFIG_NODE_NOREF) { res = HcsInheritObjectImplGen(current, tabSize); return res ? res : EASTWALKBREAK; } - res = sprintf_s(writeBuffer, WRITE_BUFFER_LEN, "%*c.%s = {\n", tabSize, ' ', current->configNode.name); - PRINTF_CHECK_AND_RETURN(res); + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite("%*c.%s = {\n", tabSize, ' ', current->configNode.name)); if (current->objectBase.child == NULL) { - res = sprintf_s(writeBuffer + strlen(writeBuffer) - 1, WRITE_BUFFER_LEN - strlen(writeBuffer) + 1, - "},\n"); - PRINTF_CHECK_AND_RETURN(res); + res = HcsFormatOutputWrite("%*c},\n", tabSize, ' '); } - } break; + break; case PARSEROP_CONFTERM: - res = HcsPrintTermImplement(writeBuffer, WRITE_BUFFER_LEN, current, tabSize); - if (res) { - return res; - } + res = HcsPrintTermImplement(current, tabSize); break; default: return NOERR; } - return HcsOutputWrite(writeBuffer, strlen(writeBuffer)); + return res; } static int32_t HcsImplementGenWalkCallBack(ParserObject *current, int32_t walkDepth) @@ -827,20 +765,17 @@ static int32_t HcsImplementGenWalkCallBack(ParserObject *current, int32_t walkDe } if (current == HcsGetParserRoot()) { - char writeBuffer[WRITE_BUFFER_LEN] = {'\0'}; char structName[OBJECT_NAME_MAX_LEN] = {'\0'}; int32_t res = GenConfigStructName(current, structName, OBJECT_NAME_MAX_LEN - 1); if (res) { return res; } - res = sprintf_s(writeBuffer, WRITE_BUFFER_LEN, "static const struct %s %s = {\n", structName, - GetConfigRootVariableName()); - PRINTF_CHECK_AND_RETURN(res); + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite("static const struct %s %s = {\n", + structName, GetConfigRootVariableName())); if (current->objectBase.child == NULL) { - res = sprintf_s(writeBuffer + strlen(writeBuffer), WRITE_BUFFER_LEN - strlen(writeBuffer), "};\n"); - PRINTF_CHECK_AND_RETURN(res); + res = HcsFormatOutputWrite("};\n"); } - return HcsOutputWrite(writeBuffer, strlen(writeBuffer)); + return res; } return HcsObjectImplementGen(current, walkDepth * TAB_SIZE); } @@ -856,18 +791,12 @@ static int32_t HcsImplementCloseBraceGen(ParserObject *current, int32_t walkDept } int32_t tabSize = walkDepth * TAB_SIZE; - char writeBuffer[WRITE_BUFFER_LEN] = {'\0'}; - int32_t res; if (current != HcsGetParserRoot()) { - res = sprintf_s(writeBuffer, WRITE_BUFFER_LEN, "%*c},\n", tabSize, ' '); - PRINTF_CHECK_AND_RETURN(res); + return HcsFormatOutputWrite("%*c},\n", tabSize, ' '); } else { - res = sprintf_s(writeBuffer, WRITE_BUFFER_LEN, "};\n"); - PRINTF_CHECK_AND_RETURN(res); + return HcsFormatOutputWrite("};\n"); } - - return HcsOutputWrite(writeBuffer, strlen(writeBuffer)); } static void ToUpperString(char *str, uint32_t strLen) @@ -877,118 +806,71 @@ static void ToUpperString(char *str, uint32_t strLen) } } -static void StripFileNameSuffix(char *fileName, uint32_t fileNameLen) -{ - for (uint32_t i = 0; i < fileNameLen; ++i) { - if (fileName[i] == '.') { - fileName[i] = '\0'; - break; - } - } -} - #define HCS_HEADER_MACRO_MAX_LEN 150 static char *GenHeaderProtectionMacro() { - const char *outPutFileName = HcsGetStripedOutputFileName(); - char *headerMacro = strdup(outPutFileName); - if (headerMacro == NULL) { - HCS_ERROR("oom"); + char *fileName = HcsGetOutputFileNameWithoutSuffix(); + if (fileName == NULL) { return NULL; } - StripFileNameSuffix(headerMacro, strlen(headerMacro)); - ToUpperString(headerMacro, strlen(headerMacro)); + ToUpperString(fileName, strlen(fileName)); char *macro = HcsMemZalloc(sizeof(char) * HCS_HEADER_MACRO_MAX_LEN); if (macro == NULL) { HCS_ERROR("oom"); - HcsMemFree(headerMacro); + HcsMemFree(fileName); return NULL; } - int32_t res = sprintf_s(macro, HCS_HEADER_MACRO_MAX_LEN, "HCS_CONFIG_%s_HEADER_H", headerMacro); + int32_t res = sprintf_s(macro, HCS_HEADER_MACRO_MAX_LEN, "HCS_CONFIG_%s_HEADER_H", fileName); + HcsMemFree(fileName); if (res <= 0) { - HcsMemFree(headerMacro); HcsMemFree(macro); return NULL; } - HcsMemFree(headerMacro); return macro; } static int32_t HcsWriteHeaderFileHead() { /* Write copyright info */ - const char *header = HCS_CONFIG_FILE_HEADER; - if (HcsOutputWrite(header, strlen(header))) { - return EOUTPUT; - } + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite(HCS_CONFIG_FILE_HEADER)); /* Write header protection macro */ char *headerProtectMacro = GenHeaderProtectionMacro(); if (headerProtectMacro == NULL) { return EOUTPUT; } - char writeBuffer[WRITE_BUFFER_LEN] = {'\0'}; - int32_t ret = sprintf_s(writeBuffer, WRITE_BUFFER_LEN, "#ifndef %s\n#define %s\n\n", - headerProtectMacro, headerProtectMacro); - HcsMemFree(headerProtectMacro); - if (ret <= 0) { - return EOUTPUT; - } - - if (HcsOutputWrite(writeBuffer, strlen(writeBuffer))) { - return EOUTPUT; - } + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite("#ifndef %s\n#define %s\n\n", + headerProtectMacro, headerProtectMacro)); /* Write include header file */ - header = HCS_CONFIG_INCLUDE_HEADER; - if (HcsOutputWrite(header, strlen(header))) { - return EOUTPUT; - } - - return NOERR; + return HcsFormatOutputWrite(HCS_CONFIG_INCLUDE_HEADER); } static int32_t HcsWriteHeaderFileEnd() { - char writeBuffer[WRITE_BUFFER_LEN] = {'\0'}; /* Write header protection macro */ char *headerMacro = GenHeaderProtectionMacro(); if (headerMacro == NULL) { return EOUTPUT; } - int32_t ret = sprintf_s(writeBuffer, (WRITE_BUFFER_LEN - 1), "#endif // %s", headerMacro); + int32_t ret = HcsFormatOutputWrite("\n\n#endif // %s", headerMacro); HcsMemFree(headerMacro); - if (ret <= 0) { - return EOUTPUT; - } - return HcsOutputWrite(writeBuffer, strlen(writeBuffer)); + return ret; } static int32_t HcsWriteFunctionDeclaration() { - char writeBuffer[WRITE_BUFFER_LEN] = {'\0'}; - int32_t ret = sprintf_s(writeBuffer, (WRITE_BUFFER_LEN - 1), HCS_CONFIG_INCLUDE_FUNC_DECLARATION, g_namePrefix, + return HcsFormatOutputWrite("const struct %s%sRoot* HdfGet%sModuleConfigRoot(void);", g_namePrefix, g_bigHumpModuleName, g_bigHumpModuleName); - if (ret <= 0) { - return EOUTPUT; - } - - return HcsOutputWrite(writeBuffer, strlen(writeBuffer)); } static int32_t HcsWriteFunctionImplement() { - char writeBuffer[WRITE_BUFFER_LEN] = {'\0'}; - int32_t ret = sprintf_s(writeBuffer, (WRITE_BUFFER_LEN - 1), HCS_CONFIG_FUNC_IMPLEMENT, g_namePrefix, + return HcsFormatOutputWrite(HCS_CONFIG_FUNC_IMPLEMENT, g_namePrefix, g_bigHumpModuleName, g_bigHumpModuleName, GetConfigRootVariableName()); - if (ret <= 0) { - return EOUTPUT; - } - - return HcsOutputWrite(writeBuffer, strlen(writeBuffer)); } static int32_t HcsOutputHeaderFile() @@ -1064,47 +946,33 @@ static int32_t HcsTemplateImplGenWalkCallBack(ParserObject *current, int32_t wal return NOERR; } - char writeBuffer[WRITE_BUFFER_LEN] = {'\0'}; char nameBuff[OBJECT_NAME_MAX_LEN] = {'\0'}; int32_t res = GenConfigStructName(current, nameBuff, OBJECT_NAME_MAX_LEN - 1); if (res) { return res; } - res = sprintf_s(writeBuffer, sizeof(writeBuffer), "static const struct %s ", nameBuff); - PRINTF_CHECK_AND_RETURN(res); + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite("static const struct %s ", nameBuff)); if (HcsGenTemplateVariableName(current, nameBuff, sizeof(nameBuff))) { return EOUTPUT; } - res = sprintf_s(writeBuffer + strlen(writeBuffer), sizeof(writeBuffer) - strlen(writeBuffer), - "%s[] = {\n", nameBuff); - PRINTF_CHECK_AND_RETURN(res); - HcsOutputWrite(writeBuffer, strlen(writeBuffer)); - /* Generate C global variables definition file */ + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite("%s[] = {\n", nameBuff)); + /* Generate C global variables definition file */ TemplateNodeInstance *subClasses = current->configNode.subClasses; g_baseTabsize = TAB_SIZE + TAB_SIZE; while (subClasses != NULL) { - res = sprintf_s(writeBuffer, sizeof(writeBuffer), "%*c[%d] = {\n", TAB_SIZE, ' ', - subClasses->nodeObject->inheritIndex); - PRINTF_CHECK_AND_RETURN(res); - if (HcsOutputWrite(writeBuffer, res)) { - return EOUTPUT; - } + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite("%*c[%d] = {\n", TAB_SIZE, ' ', + subClasses->nodeObject->inheritIndex)); + if (HcsTemplateVariableGen((ParserObject *)subClasses->nodeObject)) { return EOUTPUT; } - res = sprintf_s(writeBuffer, sizeof(writeBuffer), "%*c},\n", TAB_SIZE, ' '); - PRINTF_CHECK_AND_RETURN(res); - if (HcsOutputWrite(writeBuffer, strlen(writeBuffer))) { - return EOUTPUT; - } + OUTPUT_CHECK_AND_RETURN(HcsFormatOutputWrite("%*c},\n", TAB_SIZE, ' ')); subClasses = subClasses->next; } - res = sprintf_s(writeBuffer, sizeof(writeBuffer), "};\n\n"); - PRINTF_CHECK_AND_RETURN(res); - return HcsOutputWrite(writeBuffer, strlen(writeBuffer)); + return HcsFormatOutputWrite("};\n\n"); } static int32_t HcsArrayVariablesDeclareGen(ParserObject *term) @@ -1113,26 +981,21 @@ static int32_t HcsArrayVariablesDeclareGen(ParserObject *term) return NOERR; } - char writeBuffer[WRITE_BUFFER_LEN] = {'\0'}; char nameBuff[OBJECT_NAME_MAX_LEN] = {'\0'}; int32_t res = GenConfigArrayName(term, nameBuff, OBJECT_NAME_MAX_LEN - 1); if (res) { return res; } ParserObject *array = (ParserObject *)term->configTerm.child; - res = sprintf_s(writeBuffer, sizeof(writeBuffer), "\nstatic const %s %s[%d] = {\n%*c", GetArrayType(array), + res = HcsFormatOutputWrite("\nstatic const %s %s[%d] = {\n%*c", GetArrayType(array), nameBuff, GetArraySize(array), TAB_SIZE, ' '); - PRINTF_CHECK_AND_RETURN(res); - if (HcsOutputWrite(writeBuffer, strlen(writeBuffer))) { - return EOUTPUT; - } + OUTPUT_CHECK_AND_RETURN(res); + if (HcsPrintArrayContent(array, TAB_SIZE)) { HCS_ERROR("fail to write array content"); return EOUTPUT; } - res = sprintf_s(writeBuffer, sizeof(writeBuffer), "\n};\n"); - PRINTF_CHECK_AND_RETURN(res); - return HcsOutputWrite(writeBuffer, strlen(writeBuffer)); + return HcsFormatOutputWrite("\n};\n"); } static int32_t HcsTemplateVariablesDeclareGenWalk(ParserObject *current, int32_t walkDepth) @@ -1174,10 +1037,8 @@ static int32_t HcsTemplateVariablesDeclareGen(ParserObject *astRoot) /* if no template variable generated, should not output end line */ return NOERR; } - char writeBuffer[WRITE_BUFFER_LEN] = {'\0'}; - int32_t res = sprintf_s(writeBuffer, sizeof(writeBuffer), "\n"); - PRINTF_CHECK_AND_RETURN(res); - return HcsOutputWrite(writeBuffer, strlen(writeBuffer)); + const char *lineEnd = "\n"; + return HcsOutputWrite(lineEnd, strlen(lineEnd)); } static int32_t HcsOutputTemplateImplement(ParserObject *astRoot) @@ -1206,32 +1067,24 @@ static int32_t HcsOutputCFile() return EINVALF; } - const char *header = HCS_CONFIG_FILE_HEADER; - if (HcsOutputWrite(header, strlen(header))) { - HcsCloseOutput(outputFIle); - return EOUTPUT; - } - - char include[INCLUDE_PATH_MAX_LEN] = {'\0'}; - int32_t res = sprintf_s(include, INCLUDE_PATH_MAX_LEN, "#include \"%s", HcsGetStripedOutputFileName()); - if (res <= 0) { + if (HcsFormatOutputWrite(HCS_CONFIG_FILE_HEADER)) { HcsCloseOutput(outputFIle); return EOUTPUT; } - res = sprintf_s(include + strlen(include) - 1, WRITE_BUFFER_LEN - strlen(include), "h\"\n\n"); - if (res <= 0) { - HcsCloseOutput(outputFIle); + char *fileName = HcsGetOutputFileNameWithoutSuffix(); + if (fileName == NULL) { return EOUTPUT; } - - if (HcsOutputWrite(include, strlen(include))) { + int32_t res = HcsFormatOutputWrite("#include \"%s.h\"\n\n", fileName); + HcsMemFree(fileName); + if (res != NOERR) { HcsCloseOutput(outputFIle); return EOUTPUT; } res = HcsOutputTemplateImplement(astRoot); - if (res) { + if (res != NOERR) { HcsCloseOutput(outputFIle); return EOUTPUT; } @@ -1248,7 +1101,7 @@ static int32_t HcsOutputCFile() return res; } -int32_t HcsTextCodeOutput() +int32_t HcsTextCodeOutput(void) { int32_t ret = HcsSymbolTableInit(); if (ret) { -- Gitee From 4b0fe41f57bad8b53f16b0d60ee49768c8fa320e Mon Sep 17 00:00:00 2001 From: zianed Date: Wed, 19 May 2021 11:59:27 +0800 Subject: [PATCH 2/3] modify wlan --- model/network/common/netdevice/net_device.c | 23 +++++++++++---------- model/network/wifi/core/hdf_wifi_core.c | 16 +++++++------- model/network/wifi/core/hdf_wifi_core.h | 4 ++-- support/posix/src/osal_thread.c | 6 ++++-- 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/model/network/common/netdevice/net_device.c b/model/network/common/netdevice/net_device.c index 2a336b304..da504d16e 100644 --- a/model/network/common/netdevice/net_device.c +++ b/model/network/common/netdevice/net_device.c @@ -17,12 +17,12 @@ static struct NetDeviceImpl *g_netDeviceImplTable[MAX_NETDEVICE_COUNT] = {NULL}; -static bool FindAvailableTable(uint32_t *index) +static bool FindAvailableTable(int32_t *index) { - uint32_t i; + int32_t i; if (index == NULL) { - HDF_LOGE("%s Find Available table index error!", __func__); + HDF_LOGE("Find Available table index error!"); return false; } for (i = 0; i < MAX_NETDEVICE_COUNT; i++) { @@ -34,7 +34,7 @@ static bool FindAvailableTable(uint32_t *index) return false; } -static bool AddNetDeviceImplToTable(uint32_t index, struct NetDeviceImpl *netDeviceImpl) +static bool AddNetDeviceImplToTable(int32_t index, struct NetDeviceImpl *netDeviceImpl) { if (index >= MAX_NETDEVICE_COUNT) { HDF_LOGE("%s error because of not enough space!", __func__); @@ -68,6 +68,7 @@ static struct NetDeviceImpl *InitNetDeviceImpl(NetDevice *nd, NetIfCategory ifCa HDF_LOGE("%s fail: OsalMemCalloc fail!", __func__); return NULL; } + (void)memset_s(ndImpl, sizeof(struct NetDeviceImpl), 0, sizeof(struct NetDeviceImpl)); ndImpl->netDevice = nd; if (RegisterNetDeviceImpl(ndImpl) != HDF_SUCCESS) { @@ -99,7 +100,6 @@ static void DeInitNetDeviceImpl(struct NetDeviceImpl *netDeviceImpl) /* last release netDeviceImpl */ OsalMemFree(netDeviceImpl); - netDeviceImpl = NULL; HDF_LOGI("%s success!", __func__); return; } @@ -117,7 +117,7 @@ static struct NetDeviceImpl *GetImplByNetDevice(const struct NetDevice *netDevic } } } - HDF_LOGE("%s Get Impl by netdevice failed", __func__); + HDF_LOGE("Don't Get Impl by netdevice"); return ndImpl; } @@ -125,7 +125,7 @@ struct NetDevice *NetDeviceInit(const char *ifName, uint32_t len, NetIfCategory { NetDevice *netDevice = NULL; struct NetDeviceImpl *ndImpl = NULL; - uint32_t index = 0; + int32_t index = 0; int32_t ret; if ((ifName == NULL) || (strlen(ifName) != len) || (strlen(ifName) > IFNAMSIZ - 1)) { @@ -137,8 +137,9 @@ struct NetDevice *NetDeviceInit(const char *ifName, uint32_t len, NetIfCategory HDF_LOGE("%s fail: OsalMemCalloc fail!", __func__); return NULL; } - if (strcpy_s(netDevice->name, IFNAMSIZ, ifName) != EOK) { - HDF_LOGE("%s fail: strcpy_s fail!", __func__); + (void)memset_s(netDevice, sizeof(NetDevice), 0, sizeof(NetDevice)); + if (memcpy_s(netDevice->name, IFNAMSIZ, ifName, len + 1) != EOK) { + HDF_LOGE("%s fail: memcpy_s fail!", __func__); OsalMemFree(netDevice); return NULL; } @@ -317,7 +318,7 @@ static int32_t NetIfRxImpl(const struct NetDevice *netDevice, NetBuf *buff, Rece ProcessingResult ret = PROCESSING_CONTINUE; if (ndImpl == NULL || ndImpl->interFace == NULL || ndImpl->interFace->receive == NULL) { - HDF_LOGE("%s: NetIfRxImpl fail : netdevice not exist!", __func__); + HDF_LOGE("NetIfRxImpl fail : netdevice not exist!"); return HDF_ERR_INVALID_PARAM; } @@ -332,7 +333,7 @@ static int32_t NetIfRxImpl(const struct NetDevice *netDevice, NetBuf *buff, Rece HDF_LOGI("NetIfRxImpl specialEtherType Process not need TCP/IP stack!"); return HDF_SUCCESS; } else { - HDF_LOGE("%s: NetIfRxImpl specialEtherType Process error", __func__); + HDF_LOGE("NetIfRxImpl specialEtherType Process error"); return HDF_FAILURE; } } diff --git a/model/network/wifi/core/hdf_wifi_core.c b/model/network/wifi/core/hdf_wifi_core.c index 75c26ae92..321790613 100644 --- a/model/network/wifi/core/hdf_wifi_core.c +++ b/model/network/wifi/core/hdf_wifi_core.c @@ -39,13 +39,13 @@ int32_t HdfWifiGetBusIdx(void) * @brief as for now, we just support one wlan module in one board cause driver binds to wlan featere * due to that reason, once we detected one chip, we stop rescan. */ -int32_t HdfWlanSdioScan(struct HdfWlanDevice *data, struct HdfConfigWlanBus *busConfig) +int HdfWlanSdioScan(struct HdfWlanDevice *data, struct HdfConfigWlanBus *busConfig) { /* get config vendId, deviceId and chip-name which used in detect match process */ HdfWlanGetSdioTableByConfig(); HdfWlanSdioScanTriggerByBusIndex(busConfig->busIdx); - int32_t ret = HdfWlanGetDetectedChip(data, busConfig); + int ret = HdfWlanGetDetectedChip(data, busConfig); HdfWlanSdioDriverUnReg(); if (ret != HDF_SUCCESS) { return ret; @@ -54,7 +54,7 @@ int32_t HdfWlanSdioScan(struct HdfWlanDevice *data, struct HdfConfigWlanBus *bus return HDF_SUCCESS; } -static int32_t HdfWifiDriverBind(struct HdfDeviceObject *dev) +static int HdfWifiDriverBind(struct HdfDeviceObject *dev) { ErrorCode errCode; static struct IDeviceIoService wifiService = { @@ -179,7 +179,7 @@ static struct HdfChipDriverFactory *HdfWlanGetDriverFactory(const char *driverNa static int32_t HdfWlanDeinitInterface(struct HdfWlanDevice *device, const char *ifName, struct HdfChipDriverFactory *factory) { - int32_t ret; + int ret; struct NetDevice *netdev = NULL; struct HdfChipDriver *chipDriver = NULL; @@ -369,7 +369,7 @@ static struct HdfWlanDevice *ProbeDevice(struct HdfConfigWlanDevInst *deviceConf return device; } -int32_t HdfWifiDeinitDevice(struct HdfWlanDevice *device) +int32_t DeinitDevice(struct HdfWlanDevice *device) { struct HdfChipDriverFactory *chipDriverFact = NULL; int32_t ret; @@ -394,7 +394,7 @@ int32_t HdfWifiDeinitDevice(struct HdfWlanDevice *device) return HDF_SUCCESS; } -int32_t HdfWifiInitDevice(struct HdfWlanDevice *device) +int32_t InitDevice(struct HdfWlanDevice *device) { int32_t ret; struct HdfChipDriverFactory *chipDriverFact = NULL; @@ -424,7 +424,7 @@ int32_t HdfWifiInitDevice(struct HdfWlanDevice *device) /* thread callback function */ static int32_t HdfWlanInitThread(void *para) { - const uint32_t initDelaySec = 15; + const uint32_t initDelaySec = 5; struct HdfDeviceObject *device = (struct HdfDeviceObject *)para; struct SubscriberCallback callback = { NULL }; struct HdfConfigWlanDeviceList *devList = NULL; @@ -465,7 +465,7 @@ static int32_t HdfWlanInitThread(void *para) // Load chip driver (void)DevSvcManagerClntSubscribeService(wlanDevice->driverName, callback); - (void)HdfWifiInitDevice(wlanDevice); + (void)InitDevice(wlanDevice); } HDF_LOGV("%s:finished.", __func__); diff --git a/model/network/wifi/core/hdf_wifi_core.h b/model/network/wifi/core/hdf_wifi_core.h index 78134dc5e..c171fd618 100644 --- a/model/network/wifi/core/hdf_wifi_core.h +++ b/model/network/wifi/core/hdf_wifi_core.h @@ -17,9 +17,9 @@ extern "C" { #endif int32_t HdfWifiGetBusIdx(void); -int32_t HdfWifiDeinitDevice(struct HdfWlanDevice *device); +int32_t DeinitDevice(struct HdfWlanDevice *device); -int32_t HdfWifiInitDevice(struct HdfWlanDevice *device); +int32_t InitDevice(struct HdfWlanDevice *device); #ifdef __cplusplus } diff --git a/support/posix/src/osal_thread.c b/support/posix/src/osal_thread.c index bdf5e16c4..fc621b420 100644 --- a/support/posix/src/osal_thread.c +++ b/support/posix/src/osal_thread.c @@ -12,6 +12,8 @@ #include "hdf_log.h" #include "osal_mem.h" +#define OSAL_PTHREAD_STACK_MIN 4096 + #define HDF_LOG_TAG osal_thread typedef void *(*PosixEntry)(void *data); @@ -73,7 +75,7 @@ int32_t OsalThreadCreate(struct OsalThread *thread, OsalThreadEntry threadEntry, int32_t OsalThreadDestroy(struct OsalThread *thread) { - if (thread != NULL && thread->realThread != NULL) { + if (thread->realThread != NULL) { OsalMemFree(thread->realThread); thread->realThread = NULL; } @@ -127,7 +129,7 @@ int32_t OsalThreadStart(struct OsalThread *thread, const struct OsalThreadParam size_t stackSize = param->stackSize; if (stackSize > 0) { - stackSize = (stackSize < PTHREAD_STACK_MIN) ? PTHREAD_STACK_MIN : stackSize; + stackSize = (stackSize < OSAL_PTHREAD_STACK_MIN) ? OSAL_PTHREAD_STACK_MIN : stackSize; resultCode = pthread_attr_setstacksize(&attribute, stackSize); if (resultCode != 0) { HDF_LOGE("pthread_attr_setstacksize errorno: %d", resultCode); -- Gitee From 9e628b91d07395b0e9fbb9ba0bb7fe20b8db0a10 Mon Sep 17 00:00:00 2001 From: zianed Date: Wed, 19 May 2021 14:07:02 +0800 Subject: [PATCH 3/3] update support/posix/src/osal_thread.c. --- support/posix/src/osal_thread.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/support/posix/src/osal_thread.c b/support/posix/src/osal_thread.c index fc621b420..4fcfce157 100644 --- a/support/posix/src/osal_thread.c +++ b/support/posix/src/osal_thread.c @@ -12,7 +12,11 @@ #include "hdf_log.h" #include "osal_mem.h" +#ifndef PTHREAD_STACK_MIN #define OSAL_PTHREAD_STACK_MIN 4096 +#else +#define OSAL_PTHREAD_STACK_MIN PTHREAD_STACK_MIN +#endif #define HDF_LOG_TAG osal_thread -- Gitee