From 5d2c2b27a6323e2666378b986129b2a7c2c39e5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Sun, 6 Feb 2022 16:04:24 +0100 Subject: New upstream version 5.2.2GA --- app/bin/levenshtein.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 app/bin/levenshtein.c (limited to 'app/bin/levenshtein.c') diff --git a/app/bin/levenshtein.c b/app/bin/levenshtein.c new file mode 100644 index 0000000..8dc56aa --- /dev/null +++ b/app/bin/levenshtein.c @@ -0,0 +1,72 @@ +// `levenshtein.c` - levenshtein +// MIT licensed. +// Copyright (c) 2015 Titus Wormer + +#include +#include +#include +#include "include/levenshtein.h" + +// Returns a size_t, depicting the difference between `a` and `b`. +// See for more information. +size_t +levenshtein_n(const char *a, const size_t length, const char *b, const size_t bLength) { + // Shortcut optimizations / degenerate cases. + if (a == b) { + return 0; + } + + if (length == 0) { + return bLength; + } + + if (bLength == 0) { + return length; + } + + size_t *cache = calloc(length, sizeof(size_t)); + size_t index = 0; + size_t bIndex = 0; + size_t distance; + size_t bDistance; + size_t result; + char code; + + // initialize the vector. + while (index < length) { + cache[index] = index + 1; + index++; + } + + // Loop. + while (bIndex < bLength) { + code = b[bIndex]; + result = distance = bIndex++; + index = SIZE_MAX; + + while (++index < length) { + bDistance = code == a[index] ? distance : distance + 1; + distance = cache[index]; + + cache[index] = result = distance > result + ? bDistance > result + ? result + 1 + : bDistance + : bDistance > distance + ? distance + 1 + : bDistance; + } + } + + free(cache); + + return result; +} + +size_t +levenshtein(const char *a, const char *b) { + const size_t length = strlen(a); + const size_t bLength = strlen(b); + + return levenshtein_n(a, length, b, bLength); +} -- cgit v1.2.3