/** * @file bsort.h * @author Ambroz Bizjak * * @section LICENSE * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the author nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @section DESCRIPTION * * Sorting functions. */ #ifndef BADVPN_MISC_BSORT_H #define BADVPN_MISC_BSORT_H #include #include #include #include #include typedef int (*BSort_comparator) (const void *e1, const void *e2); static void BInsertionSort (void *arr, size_t count, size_t esize, BSort_comparator compatator, void *temp); void BInsertionSort (void *arr, size_t count, size_t esize, BSort_comparator compatator, void *temp) { ASSERT(esize > 0) for (size_t i = 0; i < count; i++) { size_t j = i; while (j > 0) { uint8_t *x = (uint8_t *)arr + (j - 1) * esize; uint8_t *y = (uint8_t *)arr + j * esize; int c = compatator(x, y); if (c <= 0) { break; } memcpy(temp, x, esize); memcpy(x, y, esize); memcpy(y, temp, esize); j--; } } } #endif