/*
* Copyright (c) 2008-2022 Jonathan Schleifer <js@nil.im>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
* Alternatively, it may be distributed under the terms of the GNU General
* Public License, either version 2 or 3, which can be found in the file
* LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
* file.
*/
#import "macros.h"
#import "OFPBKDF2.h"
#import "OFScrypt.h"
#ifdef OF_MORPHOS
# include <ppcinline/macros.h>
# define OF_M68K_ARG(type, name, reg) type name = (type)REG_##reg;
#else
# define OF_M68K_ARG(type, name, reg) \
register type reg_##name __asm__(#reg); \
type name = reg_##name;
#endif
#ifdef OF_MORPHOS
# include <setjmp.h>
#endif
typedef void (*OFSignalHandler)(int);
struct OFLibC {
/*
* Needed by the runtime. Some of them are also used by ObjFW, but we
* need all of them to pass them along to the runtime.
*/
void *_Nullable (*_Nonnull malloc)(size_t);
void *_Nullable (*_Nonnull calloc)(size_t, size_t);
void *_Nullable (*_Nonnull realloc)(void *_Nullable, size_t);
void (*_Nonnull free)(void *_Nullable);
void (*_Nonnull abort)(void);
#ifdef HAVE_SJLJ_EXCEPTIONS
int (*_Nonnull _Unwind_SjLj_RaiseException)(void *_Nonnull);
#else
int (*_Nonnull _Unwind_RaiseException)(void *_Nonnull);
#endif
void (*_Nonnull _Unwind_DeleteException)(void *_Nonnull);
void *_Nullable (*_Nonnull _Unwind_GetLanguageSpecificData)(
void *_Nonnull);
uintptr_t (*_Nonnull _Unwind_GetRegionStart)(void *_Nonnull);
uintptr_t (*_Nonnull _Unwind_GetDataRelBase)(void *_Nonnull);
uintptr_t (*_Nonnull _Unwind_GetTextRelBase)(void *_Nonnull);
uintptr_t (*_Nonnull _Unwind_GetIP)(void *_Nonnull);
uintptr_t (*_Nonnull _Unwind_GetGR)(void *_Nonnull, int);
void (*_Nonnull _Unwind_SetIP)(void *_Nonnull, uintptr_t);
void (*_Nonnull _Unwind_SetGR)(void *_Nonnull, int, uintptr_t);
#ifdef HAVE_SJLJ_EXCEPTIONS
void (*_Nonnull _Unwind_SjLj_Resume)(void *_Nonnull);
#else
void (*_Nonnull _Unwind_Resume)(void *_Nonnull);
#endif
#ifdef OF_AMIGAOS_M68K
void (*_Nonnull __register_frame_info)(const void *_Nonnull,
void *_Nonnull);
void *_Nullable (*_Nonnull __deregister_frame_info)(
const void *_Nonnull);
#endif
#ifdef OF_MORPHOS
void (*_Nonnull __register_frame)(void *_Nonnull);
void (*_Nonnull __deregister_frame)(void *_Nonnull);
#endif
int *_Nonnull (*_Nonnull errNo)(void);
/* Needed only by ObjFW. */
#ifdef OF_MORPHOS
int (*_Nonnull vasprintf)(char *_Nonnull *_Nullable restrict,
const char *_Nonnull restrict, va_list);
#else
int (*_Nonnull vsnprintf)(char *_Nonnull restrict, size_t,
const char *_Nonnull restrict, va_list);
#endif
float (*_Nonnull strtof)(const char *_Nonnull,
char *_Nullable *_Nullable);
double (*_Nonnull strtod)(const char *_Nonnull,
char *_Nullable *_Nullable);
#ifdef OF_MORPHOS
struct tm *(*_Nonnull gmtime_r)(const time_t *_Nonnull,
struct tm *_Nonnull);
struct tm *(*_Nonnull localtime_r)(const time_t *_Nonnull,
struct tm *_Nonnull);
#endif
time_t (*_Nonnull mktime)(struct tm *_Nonnull);
int (*_Nonnull gettimeofday)(struct timeval *_Nonnull,
struct timezone *_Nullable);
size_t (*_Nonnull strftime)(char *_Nonnull, size_t,
const char *_Nonnull, const struct tm *_Nonnull);
void (*_Nonnull exit)(int);
int (*_Nonnull atexit)(void (*_Nonnull)(void));
OFSignalHandler _Nullable (*_Nonnull signal)(int, OFSignalHandler _Nullable);
char *_Nullable (*_Nonnull setlocale)(int, const char *_Nullable);
int (*_Nonnull _Unwind_Backtrace)(int (*_Nonnull)(void *_Nonnull,
void *_Null_unspecified), void *_Null_unspecified);
#ifdef OF_MORPHOS
int (*_Nonnull setjmp)(jmp_buf);
void __dead2 (*_Nonnull longjmp)(jmp_buf, int);
#endif
};
extern bool OFInit(unsigned int version, struct OFLibC *_Nonnull libC);
extern unsigned long *OFHashSeedRef(void);
extern void OFPBKDF2Wrapper(const OFPBKDF2Parameters *_Nonnull parameters);
extern void OFScryptWrapper(const OFScryptParameters *_Nonnull parameters);