#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdint.h>

#include <springbok_intrinsics.h>

void* __dso_handle = (void*) &__dso_handle;

extern "C" void *_sbrk(int nbytes) {
  extern char _sheap, _eheap;
  static char *_heap_ptr = &_sheap;

  if ((nbytes < 0) ||
      (_heap_ptr + nbytes > &_eheap)) {
    springbok_simprint(SPRINGBOK_SIMPRINT_ERROR, "_sbrk failed to allocate memory. Number of bytes requested:", nbytes);
    springbok_simprint(SPRINGBOK_SIMPRINT_ERROR, "Number of unallocated bytes remaining:", static_cast<int32_t>(&_eheap - _heap_ptr));
    errno = ENOMEM;
    return (void *)-1;
  }

  void *base = _heap_ptr;
  _heap_ptr += nbytes;
  return base;
}

extern "C" int _read(int file, char *ptr, int len) {
  if (file != STDIN_FILENO) {
    errno = EBADF;
    return -1;
  }

  return 0;
}

extern "C" int _write(int file, char *buf, int nbytes) {
  static int _write_line_buffer_len[2] = {0, 0};
  static char _write_line_buffer[2][256];

  if (file != STDOUT_FILENO && file != STDERR_FILENO) {
    errno = EBADF;
    return -1;
  }

  if (nbytes <= 0) {
    return 0;
  }

  if (buf == NULL) {
    errno = EFAULT;
    return -1;
  }

  const int buffer_num   = (file == STDOUT_FILENO)? 0 : 1;
  const int buffer_level = (file == STDOUT_FILENO)? SPRINGBOK_SIMPRINT_INFO : SPRINGBOK_SIMPRINT_ERROR;

  int bytes_read = 0;
  char c;
  do {
    int len = _write_line_buffer_len[buffer_num];
    c = *(buf++);
    bytes_read++;

    if ((c == '\n') || (c == '\0')) {
      _write_line_buffer[buffer_num][len] = '\0';
      springbok_simprint(buffer_level, _write_line_buffer[buffer_num], buffer_num);
      len = 0;
    } else {
      _write_line_buffer[buffer_num][len] = c;
      len++;

      if (len == 255) {
        _write_line_buffer[buffer_num][len] = '\0';
        springbok_simprint(buffer_level, _write_line_buffer[buffer_num], buffer_num);
        len = 0;
      }
    }

    _write_line_buffer_len[buffer_num] = len;
  } while (bytes_read < nbytes);

  return bytes_read;
}

extern "C" int _close(int file) {
  errno = EBADF;
  return -1;
}

extern "C" int _lseek(int file, int offset, int whence) {
  if (file != STDOUT_FILENO && file != STDERR_FILENO) {
    errno = EBADF;
    return -1;
  }

  return 0;
}

extern "C" int _fstat(int file, struct stat *st) {
  if (file != STDOUT_FILENO && file != STDERR_FILENO) {
    errno = EBADF;
    return -1;
  }

  if (st == NULL) {
    errno = EFAULT;
    return -1;
  }

  st->st_mode = S_IFCHR;
  return 0;
}

extern "C" int _isatty(int file) {
  if (file != STDOUT_FILENO && file != STDERR_FILENO) {
    errno = EBADF;
    return -1;
  }

  return 1;
}

void operator delete(void *p) noexcept {
  free(p);
}

extern "C" void operator delete(void *p, unsigned long c) noexcept {
  operator delete(p);
}
