/*
 * Copyright (c) 2018-2019 Foundries.io
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef LWM2M_UTIL_H_
#define LWM2M_UTIL_H_

#include <zephyr/net/lwm2m.h>

/* convert float to binary format */
int lwm2m_float_to_b32(double *in, uint8_t *b32, size_t len);
int lwm2m_float_to_b64(double *in, uint8_t *b64, size_t len);

/* convert binary format to float */
int lwm2m_b32_to_float(uint8_t *b32, size_t len, double *out);
int lwm2m_b64_to_float(uint8_t *b64, size_t len, double *out);

/* convert string to float */
int lwm2m_atof(const char *input, double *out);
/* convert float to string */
int lwm2m_ftoa(double *input, char *out, size_t outlen, int8_t dec_limit);

uint16_t lwm2m_atou16(const uint8_t *buf, uint16_t buflen, uint16_t *len);

int lwm2m_string_to_path(const char *pathstr, struct lwm2m_obj_path *path, char delim);

bool lwm2m_obj_path_equal(const struct lwm2m_obj_path *a, const struct lwm2m_obj_path *b);

/**
 * @brief Used for debugging to print ip addresses.
 *
 * @param addr sockaddr for socket using ipv4 or ipv6
 * @return ip address in readable form
 */
char *lwm2m_sprint_ip_addr(const struct sockaddr *addr);

/**
 * @brief Converts the token to a printable format.
 *
 * @param[in] token Token to be printed
 * @param[in] tkl Lenghts of token
 * @return char buffer with the string representation of the token
 */
char *sprint_token(const uint8_t *token, uint8_t tkl);

#endif /* LWM2M_UTIL_H_ */
