text: /*
   * Copyright (c) 2018 - 2020 Nordic Semiconductor ASA
   *
   * SPDX-License-Identifier: Apache-2.0
   */
  
  #include <kernel.h>
  #include <stdarg.h>
  #include <stdio.h>
  
  #include <openthread/platform/logging.h>
  #include "openthread-core-zephyr-config.h"
  
  #define LOG_MODULE_NAME net_openthread
  #define LOG_LEVEL LOG_LEVEL_DBG
  #include <logging/log.h>
  LOG_MODULE_REGISTER(LOG_MODULE_NAME);
  
  #include "platform-zephyr.h"
  
  /* Convert OT log level to zephyr log level. */
  static inline int log_translate(otLogLevel aLogLevel)
  {
  	switch (aLogLevel) {
  	case OT_LOG_LEVEL_CRIT:
  		return LOG_LEVEL_ERR;
  	case OT_LOG_LEVEL_WARN:
  		return LOG_LEVEL_WRN;
  	case OT_LOG_LEVEL_NOTE:
  	case OT_LOG_LEVEL_INFO:
  		return LOG_LEVEL_INF;
  	case OT_LOG_LEVEL_DEBG:
  		return LOG_LEVEL_DBG;
  	default:
  		break;
  	}
  
  	return -1;
  }
  
  void otPlatLog(otLogLevel aLogLevel, otLogRegion aLogRegion,
  	       const char *aFormat, ...)
  {
  	/*
  	 * The following speed optimization have been used:
  	 * - arguments are counted at compile time
  	 * - for none arguments aFormat is not checked for %s
  	 * - for up to three arguments program uses fast path
  	 * - time consuming string formatting is posponed to idle time
  	 * TODO : add support for ll (problem for 32 bit processors)
  	 */
  
  
  #ifdef OPENTHREAD_CONFIG_PLAT_LOG_MACRO_NAME__COUNT_ARGS
  	/* The arguments number has been counted by macro at compile time,
  	 * and the value has been passed in unused (now) aLogRegion.
  	 * If LogRegion value from OT is needed, rewrite macro
  	 * OPENTHREAD_CONFIG_PLAT_LOG_MACRO_NAME__COUNT_ARGS and use higher
  	 * bits to pass args_num.
  	 */
  	uint32_t args_num = (uint32_t) aLogRegion;
  #else
  	ARG_UNUSED(aLogRegion);
  
  	uint32_t args_num = log_count_args(aFormat);
  #endif
  
  	va_list param_list;
  	int level = log_translate(aLogLevel);
  
  	if (level < 0) {
  		return;
  	}
  
  	va_start(param_list, aFormat);
  
  	/* We assume, that OT has no access to strdup utility,
  	 * and we are not obliged to check, if string has already
  	 * been duplicated. So, to save time, in Z_LOG_VA macro calls
  	 * we will use LOG_STRDUP_EXEC option.
  	 */
  	Z_LOG_VA(level, aFormat, param_list, args_num, LOG_STRDUP_EXEC);
  	va_end(param_list);
  }
  