52 lines
1.6 KiB
C
52 lines
1.6 KiB
C
# define EXTERN(type, array) extern type array[]
|
|
typedef unsigned char uch;
|
|
typedef unsigned short ush;
|
|
EXTERN(uch, window);
|
|
EXTERN(ush, prev);
|
|
#ifndef WSIZE
|
|
# define WSIZE 0x8000
|
|
#endif
|
|
#define MIN_MATCH 3
|
|
#define MAX_MATCH 258
|
|
#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
|
|
#define MAX_DIST (WSIZE-MIN_LOOKAHEAD)
|
|
#define near
|
|
typedef unsigned IPos;
|
|
unsigned near max_chain_length;
|
|
extern unsigned near strstart;
|
|
unsigned int near prev_length;
|
|
#define NIL 0
|
|
unsigned near good_match;
|
|
int near nice_match;
|
|
#define WMASK (WSIZE-1)
|
|
int longest_match(IPos cur_match)
|
|
{
|
|
unsigned chain_length = max_chain_length;
|
|
register uch *scan = window + strstart;
|
|
register uch *match;
|
|
register int len;
|
|
int best_len = prev_length;
|
|
IPos limit = strstart > (IPos)MAX_DIST ? strstart - (IPos)MAX_DIST : NIL;
|
|
register uch *strend = window + strstart + MAX_MATCH;
|
|
register uch scan_end = scan[best_len];
|
|
if (prev_length >= good_match) {
|
|
}
|
|
do {
|
|
if (match[best_len] != scan_end ||
|
|
*++match != scan[1]) continue;
|
|
do {
|
|
} while (*++scan == *++match && *++scan == *++match &&
|
|
scan < strend);
|
|
len = MAX_MATCH - (int)(strend - scan);
|
|
if (len > best_len) {
|
|
best_len = len;
|
|
if (len >= nice_match) break;
|
|
}
|
|
} while ((cur_match = prev[cur_match & WMASK]) > limit
|
|
&& --chain_length != 0);
|
|
return best_len;
|
|
}
|
|
|
|
/* { dg-final { scan-tree-dump-times "number of SCoPs: 0" 1 "graphite"} } */
|
|
/* { dg-final { cleanup-tree-dump "graphite" } } */
|