git » unicorn-sparkle-basic.git » master » tree

[master] / lines.c

/*
 * This file is part of Unicorn Sparkle Basic and is released under
 * CC0 1.0 Universal License.  See LICENSE.txt file or
 * https://creativecommons.org/publicdomain/zero/1.0/ for full license
 * text.
 */

#include "lines.h"

void lines_insert(struct node_tag ***lines, struct node_tag *line) {
  size_t low = 0, high = vector_size(*lines);
  while (low < high) {
    size_t mid = low + (high - low) / 2;
    if ((*lines)[mid]->data.line.linum < line->data.line.linum) {
      low = mid + 1;
    } else {
      high = mid;
    }
  }
  vector_insert(lines, low, line);
}

size_t lines_find_idx(struct node_tag **lines, double linum) {
  if (vector_size(lines) == 0) return SIZE_MAX;
  size_t low = 0, high = vector_size(lines);
  while (low < high) {
    size_t mid = low + (high - low) / 2;
    if (lines[mid]->data.line.linum < linum) {
      low = mid + 1;
    } else {
      high = mid;
    }
  }
  return lines[low]->data.line.linum == linum ? low : SIZE_MAX;
}

void lines_print(struct node_tag **lines) {
  printf("Size = %zu\n", vector_size(lines));
  for (size_t i = 0; i < vector_size(lines); i++) {
    printf("Line %g\n", lines[i]->data.line.linum);
  }
}