#ifndef __tl_utils_h__
#define __tl_utils_h__

#include <string.h>

#include "tl_softsim_logic.h"
#include "tl_json.h"

#define GET_UINT32T_LE(b) \
    ((((b) & 0xff)<<24) + (((b)>>8 & 0xff)<<16) + (((b)>>16 & 0xff)<<8) + (((b) >>24 & 0xff)))

#define CHANGE_UINT32T_ENDIAN(b) \
    ((((b) & 0xff)<<24) + (((b)>>8 & 0xff)<<16) + (((b)>>16 & 0xff)<<8) + (((b) >>24 & 0xff)))

#define SET_UINT32T_LE(b) \
    (((b)>>24 & 0xff) + (((b)>>24 & 0xff)<<8) + (((b)>>8 & 0xff)<<16) + (((b) & 0xff)<<24))

#ifndef __FILE_NAME__
#define __FILE_NAME__      (tl_basename(__FILE__))
#endif /*__FILE_NAME__*/

// the item order MUST match spec from Net263
#define mk_functions_line(_func)  \
    _func(imsi);                  \
    _func(ki);                    \
    _func(opc);                   \
    _func(apn);                   \
    _func(spn);                   \
    _func(simType);               \
    _func(iccid);                 \
    plmn_##_func(fplmn);          \
    plmn_##_func(plmn);           \
    _func(msisdn);


extern uint8_t *get_buffer(uint8_t*, uint32_t*);
extern void dump_bytes(const char*, uint8_t*, uint32_t);
extern void dump_strings(const char *, const char*);
extern void tl_pack_usim_to_buffer(usim_info_t*, uint8_t*, uint32_t*);
extern void tl_pack_usim_to_buffer_be(usim_info_t*, uint8_t*, uint32_t*);
extern void tl_restore_usim_from_buffer(usim_info_t*, const char*, uint32_t*);
extern void tl_parse_usim(uint8_t*, usim_info_t*);
extern void tl_parse_imsi(uint8_t*, uint8_t*);
extern void dump_usim_info(usim_info_t*);
extern void dump_usim_info_in_bytes(usim_info_t*);
extern void tl_parse_encrypt_data(uint8_t*, uint8_t*, uint32_t*,
        uint8_t*, uint32_t*, uint8_t*, uint32_t*);
extern void tl_parse_decrypt_data(uint8_t*, uint8_t*, uint32_t*,
        uint8_t*, uint32_t*, uint8_t*, uint32_t*);
extern void tl_parse_decrypt_data_default_IV(uint8_t*, uint8_t*, uint32_t*,
        uint8_t*, uint32_t*);
extern char *tl_basename(char *);
extern void tl_bytes_to_hexstring(uint8_t*, uint32_t, char*);
#endif /*__tl_utils_h__*/
