// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#include <emscripten.h>
#include <math.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>

struct MyStruct {
    double x;
    int16_t y;
} s = { 1.0, 2 }, a[10];

EMSCRIPTEN_KEEPALIVE
struct MyStruct* getStruct() {
    return &s;
}

EMSCRIPTEN_KEEPALIVE
void clearStruct(struct MyStruct* s) {
    s->x = 0.0;
    s->y = 0;
}

EMSCRIPTEN_KEEPALIVE
struct MyStruct* getNull() {
    return NULL;
}

EMSCRIPTEN_KEEPALIVE
bool isNull(struct MyStruct *ptr) {
    return ptr == NULL;
}

EMSCRIPTEN_KEEPALIVE
int64_t* allocateInt64(int64_t i) {
    int64_t *ptr = malloc(sizeof(int64_t));
    *ptr = i;
    return ptr;
}

EMSCRIPTEN_KEEPALIVE
int64_t** getPointerOfPointer() {
    int64_t *ptr = allocateInt64(123);
    int64_t **ptrOfPtr = malloc(sizeof(int64_t*));
    *ptrOfPtr = ptr;
    return ptrOfPtr;
}

EMSCRIPTEN_KEEPALIVE
void empty() {}

EMSCRIPTEN_KEEPALIVE
int8_t addInt8(int8_t a, int8_t b) {
    return a + b;
}

EMSCRIPTEN_KEEPALIVE
uint8_t addUint8(uint8_t a, uint8_t b) {
    return a + b;
}

EMSCRIPTEN_KEEPALIVE
int16_t addInt16(int16_t a, int16_t b) {
    return a + b;
}

EMSCRIPTEN_KEEPALIVE
uint16_t addUint16(uint16_t a, uint16_t b) {
    return a + b;
}

EMSCRIPTEN_KEEPALIVE
int32_t addInt32(int32_t a, int32_t b) {
    return a + b;
}

EMSCRIPTEN_KEEPALIVE
uint32_t addUint32(uint32_t a, uint32_t b) {
    return a + b;
}

EMSCRIPTEN_KEEPALIVE
int64_t addInt64(int64_t a, int64_t b) {
    return a + b;
}

EMSCRIPTEN_KEEPALIVE
uint64_t addUint64(uint64_t a, uint64_t b) {
    return a + b;
}

EMSCRIPTEN_KEEPALIVE
bool negateBool(bool a) {
    return !a;
}

static bool b = true;

EMSCRIPTEN_KEEPALIVE
void toggleBool() {
    b = !b;
}

EMSCRIPTEN_KEEPALIVE
bool boolReturn(int a) {
    if (a == 123) {
        return true;
    } else if (a == 456) {
        return false;
    } else {
        return b;
    }
}

EMSCRIPTEN_KEEPALIVE
char incrementChar(char a) {
    return a + 1;
}

EMSCRIPTEN_KEEPALIVE
unsigned char incrementUnsignedChar(unsigned char a) {
    return a + 1;
}

EMSCRIPTEN_KEEPALIVE
signed char incrementSignedChar(signed char a) {
    return a + 1;
}

EMSCRIPTEN_KEEPALIVE
short incrementShort(short a) {
    return a + 1;
}

EMSCRIPTEN_KEEPALIVE
unsigned short incrementUnsignedShort(unsigned short a) {
    return a + 1;
}

EMSCRIPTEN_KEEPALIVE
int incrementInt(int a) {
    return a + 1;
}

EMSCRIPTEN_KEEPALIVE
unsigned int incrementUnsignedInt(unsigned int a) {
    return a + 1;
}

EMSCRIPTEN_KEEPALIVE
long incrementLong(long a) {
    return a + 1;
}

EMSCRIPTEN_KEEPALIVE
unsigned long incrementUnsignedLong(unsigned long a) {
    return a + 1;
}

EMSCRIPTEN_KEEPALIVE
long long incrementLongLong(long long a) {
    return a + 1;
}

EMSCRIPTEN_KEEPALIVE
unsigned long long incrementUnsignedLongLong(unsigned long long a) {
    return a + 1;
}

EMSCRIPTEN_KEEPALIVE
intptr_t incrementIntPtr(intptr_t a) {
    return a + 1;
}

EMSCRIPTEN_KEEPALIVE
uintptr_t incrementUintPtr(uintptr_t a) {
    return a + 1;
}

EMSCRIPTEN_KEEPALIVE
size_t incrementSize(size_t a) {
    return a + 1;
}

EMSCRIPTEN_KEEPALIVE
wchar_t incrementWchar(wchar_t a) {
    return a + 1;
}

EMSCRIPTEN_KEEPALIVE
double sqrtDouble(double d) {
    return sqrt(d);
}

EMSCRIPTEN_KEEPALIVE
float sqrtFloat(float d) {
    return sqrtf(d);
}
