1*c08cbc64SXin LI /* 2*c08cbc64SXin LI * divsufsort_private.h for libdivsufsort 3*c08cbc64SXin LI * Copyright (c) 2003-2008 Yuta Mori All Rights Reserved. 4*c08cbc64SXin LI * 5*c08cbc64SXin LI * Permission is hereby granted, free of charge, to any person 6*c08cbc64SXin LI * obtaining a copy of this software and associated documentation 7*c08cbc64SXin LI * files (the "Software"), to deal in the Software without 8*c08cbc64SXin LI * restriction, including without limitation the rights to use, 9*c08cbc64SXin LI * copy, modify, merge, publish, distribute, sublicense, and/or sell 10*c08cbc64SXin LI * copies of the Software, and to permit persons to whom the 11*c08cbc64SXin LI * Software is furnished to do so, subject to the following 12*c08cbc64SXin LI * conditions: 13*c08cbc64SXin LI * 14*c08cbc64SXin LI * The above copyright notice and this permission notice shall be 15*c08cbc64SXin LI * included in all copies or substantial portions of the Software. 16*c08cbc64SXin LI * 17*c08cbc64SXin LI * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18*c08cbc64SXin LI * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 19*c08cbc64SXin LI * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20*c08cbc64SXin LI * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 21*c08cbc64SXin LI * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 22*c08cbc64SXin LI * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 23*c08cbc64SXin LI * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 24*c08cbc64SXin LI * OTHER DEALINGS IN THE SOFTWARE. 25*c08cbc64SXin LI */ 26*c08cbc64SXin LI 27*c08cbc64SXin LI #ifndef _DIVSUFSORT_PRIVATE_H 28*c08cbc64SXin LI #define _DIVSUFSORT_PRIVATE_H 1 29*c08cbc64SXin LI 30*c08cbc64SXin LI #ifdef __cplusplus 31*c08cbc64SXin LI extern "C" { 32*c08cbc64SXin LI #endif /* __cplusplus */ 33*c08cbc64SXin LI 34*c08cbc64SXin LI #if HAVE_CONFIG_H 35*c08cbc64SXin LI # include "config.h" 36*c08cbc64SXin LI #endif 37*c08cbc64SXin LI #include <assert.h> 38*c08cbc64SXin LI #include <stdio.h> 39*c08cbc64SXin LI #if HAVE_STRING_H 40*c08cbc64SXin LI # include <string.h> 41*c08cbc64SXin LI #endif 42*c08cbc64SXin LI #if HAVE_STDLIB_H 43*c08cbc64SXin LI # include <stdlib.h> 44*c08cbc64SXin LI #endif 45*c08cbc64SXin LI #if HAVE_MEMORY_H 46*c08cbc64SXin LI # include <memory.h> 47*c08cbc64SXin LI #endif 48*c08cbc64SXin LI #if HAVE_STDDEF_H 49*c08cbc64SXin LI # include <stddef.h> 50*c08cbc64SXin LI #endif 51*c08cbc64SXin LI #if HAVE_STRINGS_H 52*c08cbc64SXin LI # include <strings.h> 53*c08cbc64SXin LI #endif 54*c08cbc64SXin LI #if HAVE_INTTYPES_H 55*c08cbc64SXin LI # include <inttypes.h> 56*c08cbc64SXin LI #else 57*c08cbc64SXin LI # if HAVE_STDINT_H 58*c08cbc64SXin LI # include <stdint.h> 59*c08cbc64SXin LI # endif 60*c08cbc64SXin LI #endif 61*c08cbc64SXin LI #if defined(BUILD_DIVSUFSORT64) 62*c08cbc64SXin LI # include "divsufsort64.h" 63*c08cbc64SXin LI # ifndef SAIDX_T 64*c08cbc64SXin LI # define SAIDX_T 65*c08cbc64SXin LI # define saidx_t saidx64_t 66*c08cbc64SXin LI # endif /* SAIDX_T */ 67*c08cbc64SXin LI # ifndef PRIdSAIDX_T 68*c08cbc64SXin LI # define PRIdSAIDX_T PRIdSAIDX64_T 69*c08cbc64SXin LI # endif /* PRIdSAIDX_T */ 70*c08cbc64SXin LI # define divsufsort divsufsort64 71*c08cbc64SXin LI # define divbwt divbwt64 72*c08cbc64SXin LI # define divsufsort_version divsufsort64_version 73*c08cbc64SXin LI # define bw_transform bw_transform64 74*c08cbc64SXin LI # define inverse_bw_transform inverse_bw_transform64 75*c08cbc64SXin LI # define sufcheck sufcheck64 76*c08cbc64SXin LI # define sa_search sa_search64 77*c08cbc64SXin LI # define sa_simplesearch sa_simplesearch64 78*c08cbc64SXin LI # define sssort sssort64 79*c08cbc64SXin LI # define trsort trsort64 80*c08cbc64SXin LI #else 81*c08cbc64SXin LI # include "divsufsort.h" 82*c08cbc64SXin LI #endif 83*c08cbc64SXin LI 84*c08cbc64SXin LI 85*c08cbc64SXin LI /*- Constants -*/ 86*c08cbc64SXin LI #if !defined(UINT8_MAX) 87*c08cbc64SXin LI # define UINT8_MAX (255) 88*c08cbc64SXin LI #endif /* UINT8_MAX */ 89*c08cbc64SXin LI #if defined(ALPHABET_SIZE) && (ALPHABET_SIZE < 1) 90*c08cbc64SXin LI # undef ALPHABET_SIZE 91*c08cbc64SXin LI #endif 92*c08cbc64SXin LI #if !defined(ALPHABET_SIZE) 93*c08cbc64SXin LI # define ALPHABET_SIZE (UINT8_MAX + 1) 94*c08cbc64SXin LI #endif 95*c08cbc64SXin LI /* for divsufsort.c */ 96*c08cbc64SXin LI #define BUCKET_A_SIZE (ALPHABET_SIZE) 97*c08cbc64SXin LI #define BUCKET_B_SIZE (ALPHABET_SIZE * ALPHABET_SIZE) 98*c08cbc64SXin LI /* for sssort.c */ 99*c08cbc64SXin LI #if defined(SS_INSERTIONSORT_THRESHOLD) 100*c08cbc64SXin LI # if SS_INSERTIONSORT_THRESHOLD < 1 101*c08cbc64SXin LI # undef SS_INSERTIONSORT_THRESHOLD 102*c08cbc64SXin LI # define SS_INSERTIONSORT_THRESHOLD (1) 103*c08cbc64SXin LI # endif 104*c08cbc64SXin LI #else 105*c08cbc64SXin LI # define SS_INSERTIONSORT_THRESHOLD (8) 106*c08cbc64SXin LI #endif 107*c08cbc64SXin LI #if defined(SS_BLOCKSIZE) 108*c08cbc64SXin LI # if SS_BLOCKSIZE < 0 109*c08cbc64SXin LI # undef SS_BLOCKSIZE 110*c08cbc64SXin LI # define SS_BLOCKSIZE (0) 111*c08cbc64SXin LI # elif 32768 <= SS_BLOCKSIZE 112*c08cbc64SXin LI # undef SS_BLOCKSIZE 113*c08cbc64SXin LI # define SS_BLOCKSIZE (32767) 114*c08cbc64SXin LI # endif 115*c08cbc64SXin LI #else 116*c08cbc64SXin LI # define SS_BLOCKSIZE (1024) 117*c08cbc64SXin LI #endif 118*c08cbc64SXin LI /* minstacksize = log(SS_BLOCKSIZE) / log(3) * 2 */ 119*c08cbc64SXin LI #if SS_BLOCKSIZE == 0 120*c08cbc64SXin LI # if defined(BUILD_DIVSUFSORT64) 121*c08cbc64SXin LI # define SS_MISORT_STACKSIZE (96) 122*c08cbc64SXin LI # else 123*c08cbc64SXin LI # define SS_MISORT_STACKSIZE (64) 124*c08cbc64SXin LI # endif 125*c08cbc64SXin LI #elif SS_BLOCKSIZE <= 4096 126*c08cbc64SXin LI # define SS_MISORT_STACKSIZE (16) 127*c08cbc64SXin LI #else 128*c08cbc64SXin LI # define SS_MISORT_STACKSIZE (24) 129*c08cbc64SXin LI #endif 130*c08cbc64SXin LI #if defined(BUILD_DIVSUFSORT64) 131*c08cbc64SXin LI # define SS_SMERGE_STACKSIZE (64) 132*c08cbc64SXin LI #else 133*c08cbc64SXin LI # define SS_SMERGE_STACKSIZE (32) 134*c08cbc64SXin LI #endif 135*c08cbc64SXin LI /* for trsort.c */ 136*c08cbc64SXin LI #define TR_INSERTIONSORT_THRESHOLD (8) 137*c08cbc64SXin LI #if defined(BUILD_DIVSUFSORT64) 138*c08cbc64SXin LI # define TR_STACKSIZE (96) 139*c08cbc64SXin LI #else 140*c08cbc64SXin LI # define TR_STACKSIZE (64) 141*c08cbc64SXin LI #endif 142*c08cbc64SXin LI 143*c08cbc64SXin LI 144*c08cbc64SXin LI /*- Macros -*/ 145*c08cbc64SXin LI #ifndef SWAP 146*c08cbc64SXin LI # define SWAP(_a, _b) do { t = (_a); (_a) = (_b); (_b) = t; } while(0) 147*c08cbc64SXin LI #endif /* SWAP */ 148*c08cbc64SXin LI #ifndef MIN 149*c08cbc64SXin LI # define MIN(_a, _b) (((_a) < (_b)) ? (_a) : (_b)) 150*c08cbc64SXin LI #endif /* MIN */ 151*c08cbc64SXin LI #ifndef MAX 152*c08cbc64SXin LI # define MAX(_a, _b) (((_a) > (_b)) ? (_a) : (_b)) 153*c08cbc64SXin LI #endif /* MAX */ 154*c08cbc64SXin LI #define STACK_PUSH(_a, _b, _c, _d)\ 155*c08cbc64SXin LI do {\ 156*c08cbc64SXin LI assert(ssize < STACK_SIZE);\ 157*c08cbc64SXin LI stack[ssize].a = (_a), stack[ssize].b = (_b),\ 158*c08cbc64SXin LI stack[ssize].c = (_c), stack[ssize++].d = (_d);\ 159*c08cbc64SXin LI } while(0) 160*c08cbc64SXin LI #define STACK_PUSH5(_a, _b, _c, _d, _e)\ 161*c08cbc64SXin LI do {\ 162*c08cbc64SXin LI assert(ssize < STACK_SIZE);\ 163*c08cbc64SXin LI stack[ssize].a = (_a), stack[ssize].b = (_b),\ 164*c08cbc64SXin LI stack[ssize].c = (_c), stack[ssize].d = (_d), stack[ssize++].e = (_e);\ 165*c08cbc64SXin LI } while(0) 166*c08cbc64SXin LI #define STACK_POP(_a, _b, _c, _d)\ 167*c08cbc64SXin LI do {\ 168*c08cbc64SXin LI assert(0 <= ssize);\ 169*c08cbc64SXin LI if(ssize == 0) { return; }\ 170*c08cbc64SXin LI (_a) = stack[--ssize].a, (_b) = stack[ssize].b,\ 171*c08cbc64SXin LI (_c) = stack[ssize].c, (_d) = stack[ssize].d;\ 172*c08cbc64SXin LI } while(0) 173*c08cbc64SXin LI #define STACK_POP5(_a, _b, _c, _d, _e)\ 174*c08cbc64SXin LI do {\ 175*c08cbc64SXin LI assert(0 <= ssize);\ 176*c08cbc64SXin LI if(ssize == 0) { return; }\ 177*c08cbc64SXin LI (_a) = stack[--ssize].a, (_b) = stack[ssize].b,\ 178*c08cbc64SXin LI (_c) = stack[ssize].c, (_d) = stack[ssize].d, (_e) = stack[ssize].e;\ 179*c08cbc64SXin LI } while(0) 180*c08cbc64SXin LI /* for divsufsort.c */ 181*c08cbc64SXin LI #define BUCKET_A(_c0) bucket_A[(_c0)] 182*c08cbc64SXin LI #if ALPHABET_SIZE == 256 183*c08cbc64SXin LI #define BUCKET_B(_c0, _c1) (bucket_B[((_c1) << 8) | (_c0)]) 184*c08cbc64SXin LI #define BUCKET_BSTAR(_c0, _c1) (bucket_B[((_c0) << 8) | (_c1)]) 185*c08cbc64SXin LI #else 186*c08cbc64SXin LI #define BUCKET_B(_c0, _c1) (bucket_B[(_c1) * ALPHABET_SIZE + (_c0)]) 187*c08cbc64SXin LI #define BUCKET_BSTAR(_c0, _c1) (bucket_B[(_c0) * ALPHABET_SIZE + (_c1)]) 188*c08cbc64SXin LI #endif 189*c08cbc64SXin LI 190*c08cbc64SXin LI 191*c08cbc64SXin LI /*- Private Prototypes -*/ 192*c08cbc64SXin LI /* sssort.c */ 193*c08cbc64SXin LI void 194*c08cbc64SXin LI sssort(const sauchar_t *Td, const saidx_t *PA, 195*c08cbc64SXin LI saidx_t *first, saidx_t *last, 196*c08cbc64SXin LI saidx_t *buf, saidx_t bufsize, 197*c08cbc64SXin LI saidx_t depth, saidx_t n, saint_t lastsuffix); 198*c08cbc64SXin LI /* trsort.c */ 199*c08cbc64SXin LI void 200*c08cbc64SXin LI trsort(saidx_t *ISA, saidx_t *SA, saidx_t n, saidx_t depth); 201*c08cbc64SXin LI 202*c08cbc64SXin LI 203*c08cbc64SXin LI #ifdef __cplusplus 204*c08cbc64SXin LI } /* extern "C" */ 205*c08cbc64SXin LI #endif /* __cplusplus */ 206*c08cbc64SXin LI 207*c08cbc64SXin LI #endif /* _DIVSUFSORT_PRIVATE_H */ 208