git
1/*
2Copyright 2020 Google LLC
3
4Use of this source code is governed by a BSD-style
5license that can be found in the LICENSE file or at
6https://developers.google.com/open-source/licenses/bsd
7*/
8
9#include "basics.h"10
11void put_be24(uint8_t *out, uint32_t i)12{
13out[0] = (uint8_t)((i >> 16) & 0xff);14out[1] = (uint8_t)((i >> 8) & 0xff);15out[2] = (uint8_t)(i & 0xff);16}
17
18uint32_t get_be24(uint8_t *in)19{
20return (uint32_t)(in[0]) << 16 | (uint32_t)(in[1]) << 8 |21(uint32_t)(in[2]);22}
23
24void put_be16(uint8_t *out, uint16_t i)25{
26out[0] = (uint8_t)((i >> 8) & 0xff);27out[1] = (uint8_t)(i & 0xff);28}
29
30size_t binsearch(size_t sz, int (*f)(size_t k, void *args), void *args)31{
32size_t lo = 0;33size_t hi = sz;34
35/* Invariants:36*
37* (hi == sz) || f(hi) == true
38* (lo == 0 && f(0) == true) || fi(lo) == false
39*/
40while (hi - lo > 1) {41size_t mid = lo + (hi - lo) / 2;42int ret = f(mid, args);43if (ret < 0)44return sz;45
46if (ret > 0)47hi = mid;48else49lo = mid;50}51
52if (lo)53return hi;54
55return f(0, args) ? 0 : 1;56}
57
58void free_names(char **a)59{
60char **p;61if (!a) {62return;63}64for (p = a; *p; p++) {65reftable_free(*p);66}67reftable_free(a);68}
69
70size_t names_length(const char **names)71{
72const char **p = names;73while (*p)74p++;75return p - names;76}
77
78void parse_names(char *buf, int size, char ***namesp)79{
80char **names = NULL;81size_t names_cap = 0;82size_t names_len = 0;83
84char *p = buf;85char *end = buf + size;86while (p < end) {87char *next = strchr(p, '\n');88if (next && next < end) {89*next = 0;90} else {91next = end;92}93if (p < next) {94REFTABLE_ALLOC_GROW(names, names_len + 1, names_cap);95names[names_len++] = xstrdup(p);96}97p = next + 1;98}99
100REFTABLE_REALLOC_ARRAY(names, names_len + 1);101names[names_len] = NULL;102*namesp = names;103}
104
105int names_equal(const char **a, const char **b)106{
107size_t i = 0;108for (; a[i] && b[i]; i++)109if (strcmp(a[i], b[i]))110return 0;111return a[i] == b[i];112}
113
114int common_prefix_size(struct strbuf *a, struct strbuf *b)115{
116int p = 0;117for (; p < a->len && p < b->len; p++) {118if (a->buf[p] != b->buf[p])119break;120}121
122return p;123}
124