OverviewFilesCommitsIssuesDocsReleasesPeers

ollama_semantic_function_calling / ollamatools-new / keet / node_modules / quickbit-native / binding.c

188 lines · c ref:
#include <node_api.h>
#include <quickbit.h>
#include <stdlib.h>

#include "macros.h"

static inline void
quickbit_napi_argv_chunks (napi_env env, napi_value napi_chunks, quickbit_chunk_t **chunks, uint32_t *len) {
  napi_get_array_length(env, napi_chunks, len);

  *chunks = calloc(*len, sizeof(quickbit_chunk_t));

  for (uint32_t i = 0; i < *len; i++) {
    napi_value napi_chunk;
    napi_get_element(env, napi_chunks, i, &napi_chunk);

    napi_value napi_field;
    napi_get_named_property(env, napi_chunk, "field", &napi_field);

    napi_value napi_offset;
    napi_get_named_property(env, napi_chunk, "offset", &napi_offset);

    uint8_t *field;
    size_t len;
    napi_get_buffer_info(env, napi_field, (void **) &field, &len);

    uint32_t offset;
    napi_get_value_uint32(env, napi_offset, &offset);

    (*chunks)[i] = (quickbit_chunk_t){
      .field = field,
      .len = len,
      .offset = offset,
    };
  }
}

NAPI_METHOD(quickbit_napi_get) {
  NAPI_ARGV(2);
  NAPI_ARGV_BUFFER_CAST(uint8_t *, field, 0);
  NAPI_ARGV_INT32(bit, 1);

  NAPI_RETURN_UINT32(quickbit_get(field, field_len, bit))
}

NAPI_METHOD(quickbit_napi_set) {
  NAPI_ARGV(3);
  NAPI_ARGV_BUFFER_CAST(uint8_t *, field, 0);
  NAPI_ARGV_INT32(bit, 1);
  NAPI_ARGV_UINT32(value, 2);

  NAPI_RETURN_UINT32(quickbit_set(field, field_len, bit, value))
}

NAPI_METHOD(quickbit_napi_fill) {
  NAPI_ARGV(4);
  NAPI_ARGV_BUFFER_CAST(uint8_t *, field, 0);
  NAPI_ARGV_UINT32(value, 1);
  NAPI_ARGV_INT32(start, 2);
  NAPI_ARGV_INT32(end, 3);

  quickbit_fill(field, field_len, value, start, end);

  return NULL;
}

NAPI_METHOD(quickbit_napi_clear) {
  NAPI_ARGV(2);
  NAPI_ARGV_BUFFER_CAST(uint8_t *, field, 0);

  quickbit_chunk_t *chunks;
  uint32_t len;
  quickbit_napi_argv_chunks(env, argv[1], &chunks, &len);

  for (size_t i = 0; i < len; i++) {
    quickbit_clear(field, field_len, &chunks[i]);
  }

  free(chunks);

  return NULL;
}

NAPI_METHOD(quickbit_napi_find_first) {
  NAPI_ARGV(3);
  NAPI_ARGV_BUFFER_CAST(uint8_t *, field, 0);
  NAPI_ARGV_UINT32(value, 1);
  NAPI_ARGV_INT32(position, 2);

  NAPI_RETURN_INT32(quickbit_find_first(field, field_len, value, position))
}

NAPI_METHOD(quickbit_napi_find_last) {
  NAPI_ARGV(3);
  NAPI_ARGV_BUFFER_CAST(uint8_t *, field, 0);
  NAPI_ARGV_UINT32(value, 1);
  NAPI_ARGV_INT32(position, 2);

  NAPI_RETURN_INT32(quickbit_find_last(field, field_len, value, position))
}

NAPI_METHOD(quickbit_napi_index_init) {
  NAPI_ARGV(2);
  NAPI_ARGV_BUFFER_CAST(uint8_t *, index, 0);
  NAPI_ARGV_BUFFER_CAST(uint8_t *, field, 1);

  quickbit_index_init(index, field, field_len);

  return NULL;
}

NAPI_METHOD(quickbit_napi_index_init_sparse) {
  NAPI_ARGV(2);
  NAPI_ARGV_BUFFER_CAST(uint8_t *, index, 0);

  quickbit_chunk_t *chunks;
  uint32_t len;
  quickbit_napi_argv_chunks(env, argv[1], &chunks, &len);

  quickbit_index_init_sparse(index, chunks, len);

  free(chunks);

  return NULL;
}

NAPI_METHOD(quickbit_napi_index_update) {
  NAPI_ARGV(3);
  NAPI_ARGV_BUFFER_CAST(uint8_t *, index, 0);
  NAPI_ARGV_BUFFER_CAST(uint8_t *, field, 1);
  NAPI_ARGV_INT32(bit, 2);

  NAPI_RETURN_UINT32(quickbit_index_update(index, field, field_len, bit))
}

NAPI_METHOD(quickbit_napi_index_update_sparse) {
  NAPI_ARGV(4);
  NAPI_ARGV_BUFFER_CAST(uint8_t *, index, 0);
  NAPI_ARGV_BUFFER_CAST(uint8_t *, field, 1);
  NAPI_ARGV_UINT32(offset, 2);
  NAPI_ARGV_INT32(bit, 3);

  quickbit_chunk_t chunk = {
    .field = field,
    .len = field_len,
    .offset = offset,
  };

  NAPI_RETURN_UINT32(quickbit_index_update_sparse(index, &chunk, 1, bit))
}

NAPI_METHOD(quickbit_napi_skip_first) {
  NAPI_ARGV(4);
  NAPI_ARGV_BUFFER_CAST(uint8_t *, index, 0);
  NAPI_ARGV_UINT32(len, 1);
  NAPI_ARGV_UINT32(value, 2);
  NAPI_ARGV_INT32(position, 3);

  NAPI_RETURN_UINT32(quickbit_skip_first(index, len, value, position))
}

NAPI_METHOD(quickbit_napi_skip_last) {
  NAPI_ARGV(4);
  NAPI_ARGV_BUFFER_CAST(uint8_t *, index, 0);
  NAPI_ARGV_UINT32(len, 1);
  NAPI_ARGV_UINT32(value, 2);
  NAPI_ARGV_INT32(position, 3);

  NAPI_RETURN_UINT32(quickbit_skip_last(index, len, value, position))
}

NAPI_INIT() {
  NAPI_EXPORT_SIZEOF(quickbit_index_t)

  NAPI_EXPORT_FUNCTION(quickbit_napi_get)
  NAPI_EXPORT_FUNCTION(quickbit_napi_set)
  NAPI_EXPORT_FUNCTION(quickbit_napi_fill)
  NAPI_EXPORT_FUNCTION(quickbit_napi_clear)
  NAPI_EXPORT_FUNCTION(quickbit_napi_find_first)
  NAPI_EXPORT_FUNCTION(quickbit_napi_find_last)
  NAPI_EXPORT_FUNCTION(quickbit_napi_index_init)
  NAPI_EXPORT_FUNCTION(quickbit_napi_index_init_sparse)
  NAPI_EXPORT_FUNCTION(quickbit_napi_index_update)
  NAPI_EXPORT_FUNCTION(quickbit_napi_index_update_sparse)
  NAPI_EXPORT_FUNCTION(quickbit_napi_skip_first)
  NAPI_EXPORT_FUNCTION(quickbit_napi_skip_last)
}