/* * divsufsort_private.h for libdivsufsort * Copyright (c) 2003-2008 Yuta Mori All Rights Reserved. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ #ifndef _DIVSUFSORT_PRIVATE_H #define _DIVSUFSORT_PRIVATE_H 1 #define HAVE_CONFIG_H 1 #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #if HAVE_STRING_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_MEMORY_H # include #endif #if HAVE_STDDEF_H # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # endif #endif #if defined(BUILD_DIVSUFSORT64) # include "divsufsort64.h" # ifndef SAIDX_T # define SAIDX_T # define saidx_t saidx64_t # endif /* SAIDX_T */ # ifndef PRIdSAIDX_T # define PRIdSAIDX_T PRIdSAIDX64_T # endif /* PRIdSAIDX_T */ # define divsufsort divsufsort64 # define divbwt divbwt64 # define divsufsort_version divsufsort64_version # define bw_transform bw_transform64 # define inverse_bw_transform inverse_bw_transform64 # define sufcheck sufcheck64 # define sa_search sa_search64 # define sa_simplesearch sa_simplesearch64 # define sssort sssort64 # define trsort trsort64 #else # include "divsufsort.h" #endif /*- Constants -*/ #if !defined(UINT8_MAX) # define UINT8_MAX (255) #endif /* UINT8_MAX */ #if defined(ALPHABET_SIZE) && (ALPHABET_SIZE < 1) # undef ALPHABET_SIZE #endif #if !defined(ALPHABET_SIZE) # define ALPHABET_SIZE (UINT8_MAX + 1) #endif /* for divsufsort.c */ #define BUCKET_A_SIZE (ALPHABET_SIZE) #define BUCKET_B_SIZE (ALPHABET_SIZE * ALPHABET_SIZE) /* for sssort.c */ #if defined(SS_INSERTIONSORT_THRESHOLD) # if SS_INSERTIONSORT_THRESHOLD < 1 # undef SS_INSERTIONSORT_THRESHOLD # define SS_INSERTIONSORT_THRESHOLD (1) # endif #else # define SS_INSERTIONSORT_THRESHOLD (8) #endif #if defined(SS_BLOCKSIZE) # if SS_BLOCKSIZE < 0 # undef SS_BLOCKSIZE # define SS_BLOCKSIZE (0) # elif 32768 <= SS_BLOCKSIZE # undef SS_BLOCKSIZE # define SS_BLOCKSIZE (32767) # endif #else # define SS_BLOCKSIZE (1024) #endif /* minstacksize = log(SS_BLOCKSIZE) / log(3) * 2 */ #if SS_BLOCKSIZE == 0 # if defined(BUILD_DIVSUFSORT64) # define SS_MISORT_STACKSIZE (96) # else # define SS_MISORT_STACKSIZE (64) # endif #elif SS_BLOCKSIZE <= 4096 # define SS_MISORT_STACKSIZE (16) #else # define SS_MISORT_STACKSIZE (24) #endif #if defined(BUILD_DIVSUFSORT64) # define SS_SMERGE_STACKSIZE (64) #else # define SS_SMERGE_STACKSIZE (32) #endif /* for trsort.c */ #define TR_INSERTIONSORT_THRESHOLD (8) #if defined(BUILD_DIVSUFSORT64) # define TR_STACKSIZE (96) #else # define TR_STACKSIZE (64) #endif /*- Cross-checking -*/ #ifdef ENABLE_CROSSCHECK extern FILE *CROSSCHECK_FILE; #define crosscheck(...) \ do { \ fprintf(CROSSCHECK_FILE, __VA_ARGS__); \ fprintf(CROSSCHECK_FILE, "\n"); \ } while (0) #define SA_dump(SA, start, len, label) \ do { \ fprintf(CROSSCHECK_FILE, ":: %s\n", label); \ for (int z = 0; z < len; z++) { \ fprintf(CROSSCHECK_FILE, "%d ", SA[start+z]); \ if ((z+1)%25==0) { \ fprintf(CROSSCHECK_FILE, "\n"); \ } \ } \ fprintf(CROSSCHECK_FILE, "\n"); \ } while (0); // #define SA_dump(SA, label) \ // do { \ // fprintf(CROSSCHECK_FILE, ":: %s\n", label); \ // fprintf(CROSSCHECK_FILE, "SA = ["); \ // for (int z = 0; z < n; z++) { \ // if (z == n - 1) { \ // fprintf(CROSSCHECK_FILE, "%d", SA[z]); \ // } else { \ // fprintf(CROSSCHECK_FILE, "%d, ", SA[z]); \ // } \ // } \ // fprintf(CROSSCHECK_FILE, "]\n"); \ // } while (0); #define A_dump(A, label) \ do { \ fprintf(CROSSCHECK_FILE, ":: %s\n", label); \ fprintf(CROSSCHECK_FILE, "A = ["); \ for (int z = 0; z < BUCKET_A_SIZE; z++) { \ if (z == BUCKET_A_SIZE - 1) { \ fprintf(CROSSCHECK_FILE, "%d", BUCKET_A(z)); \ } else { \ fprintf(CROSSCHECK_FILE, "%d, ", BUCKET_A(z)); \ } \ } \ fprintf(CROSSCHECK_FILE, "]\n"); \ } while (0); #define BSTAR_dump(label) \ do { \ crosscheck("%s B* dump:", label); \ for (int ii = 0; ii < ALPHABET_SIZE; ii++) { \ for (int jj = 0; jj < ALPHABET_SIZE; jj++) { \ crosscheck("%s B*[%d,%d]=%d", label, ii, jj, BUCKET_BSTAR(ii, jj)); \ } \ } \ } while (0); #else #define crosscheck(...) #define SA_dump(SA, start, len, label) #define A_dump(A, label) #define BSTAR_dump(label) #endif // ENABLE_CROSSCHECK else /*- Macros -*/ #ifndef SWAP # define SWAP(_a, _b) do { t = (_a); (_a) = (_b); (_b) = t; } while(0) #endif /* SWAP */ #ifndef MIN # define MIN(_a, _b) (((_a) < (_b)) ? (_a) : (_b)) #endif /* MIN */ #ifndef MAX # define MAX(_a, _b) (((_a) > (_b)) ? (_a) : (_b)) #endif /* MAX */ #define STACK_PUSH(_a, _b, _c, _d)\ do {\ assert(ssize < STACK_SIZE);\ stack[ssize].a = (_a), stack[ssize].b = (_b),\ stack[ssize].c = (_c), stack[ssize++].d = (_d);\ } while(0) #define STACK_PUSH5(_a, _b, _c, _d, _e)\ do {\ assert(ssize < STACK_SIZE);\ stack[ssize].a = (_a), stack[ssize].b = (_b),\ stack[ssize].c = (_c), stack[ssize].d = (_d), stack[ssize++].e = (_e);\ } while(0) #define STACK_POP(_a, _b, _c, _d)\ do {\ assert(0 <= ssize);\ if(ssize == 0) { return; }\ (_a) = stack[--ssize].a, (_b) = stack[ssize].b,\ (_c) = stack[ssize].c, (_d) = stack[ssize].d;\ } while(0) #define STACK_POP5(_a, _b, _c, _d, _e)\ do {\ assert(0 <= ssize);\ if(ssize == 0) { return; }\ (_a) = stack[--ssize].a, (_b) = stack[ssize].b,\ (_c) = stack[ssize].c, (_d) = stack[ssize].d, (_e) = stack[ssize].e;\ } while(0) /* for divsufsort.c */ #define BUCKET_A(_c0) bucket_A[(_c0)] #if ALPHABET_SIZE == 256 #define BUCKET_B(_c0, _c1) (bucket_B[((_c1) << 8) | (_c0)]) #define BUCKET_BSTAR(_c0, _c1) (bucket_B[((_c0) << 8) | (_c1)]) #else #define BUCKET_B(_c0, _c1) (bucket_B[(_c1) * ALPHABET_SIZE + (_c0)]) #define BUCKET_BSTAR(_c0, _c1) (bucket_B[(_c0) * ALPHABET_SIZE + (_c1)]) #endif /*- Private Prototypes -*/ /* sssort.c */ void sssort(const sauchar_t *Td, const saidx_t *PA, saidx_t *first, saidx_t *last, saidx_t *buf, saidx_t bufsize, saidx_t depth, saidx_t n, saint_t lastsuffix); /* trsort.c */ void trsort(saidx_t *ISA, saidx_t *SA, saidx_t n, saidx_t depth); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif /* _DIVSUFSORT_PRIVATE_H */