# HG changeset patch # User vimboss # Date 1117922120 0 # Node ID 86cd0a77d2ae97648d1a8f7d47f195e13c872472 # Parent 2bfc2b7033147de9689cf2d651bd8ef36fdac68b updated for version 7.0079 diff --git a/runtime/doc/develop.txt b/runtime/doc/develop.txt --- a/runtime/doc/develop.txt +++ b/runtime/doc/develop.txt @@ -1,4 +1,4 @@ -*develop.txt* For Vim version 7.0aa. Last change: 2005 Mar 29 +*develop.txt* For Vim version 7.0aa. Last change: 2005 Jun 04 VIM REFERENCE MANUAL by Bram Moolenaar @@ -381,10 +381,10 @@ checking engine in Vim, for various reas fly (while redrawing), just like syntax highlighting. But the mechanisms used by other code are much slower. Myspell uses a simplistic hashtable, for example. -- For a program like aspell a communication mechanism would have to be setup. - That's complicated to do in a portable way (Unix-only would be relatively - simple, but that's not good enough). And performance will become a problem - (lots of process switching involved). +- For using an external program like aspell a communication mechanism would + have to be setup. That's complicated to do in a portable way (Unix-only + would be relatively simple, but that's not good enough). And performance + will become a problem (lots of process switching involved). - Missing support for words with non-word characters, such as "Etten-Leur" and "et al.", would require marking the pieces of them OK, lowering the reliability. diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt --- a/runtime/doc/map.txt +++ b/runtime/doc/map.txt @@ -1,4 +1,4 @@ -*map.txt* For Vim version 7.0aa. Last change: 2005 Mar 29 +*map.txt* For Vim version 7.0aa. Last change: 2005 Jun 03 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1032,6 +1032,7 @@ The valid escape sequences are If the first two characters of an escape sequence are "q-" (for example, ) then the value is quoted in such a way as to make it a valid value for use in an expression. This uses the argument as one single value. +When there is no argument is an empty string. To allow commands to pass their arguments on to a user-defined function, there is a special form ("function args"). This splits the command diff --git a/runtime/spell/en.utf-8.spl b/runtime/spell/en.utf-8.spl index 156c0979e9340220fbf160ec40a14145fd493a13..300f6ce8076de277c944a23c4de43ae4282ce2e0 GIT binary patch literal 562278 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 z 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
th=)AQbPApW1~`}} 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%0D0gV76jROXjKHmJ`fPt?c)`JU&3UN*;^9 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 P7f03H6itFDB!d3|Y<$`5 diff --git a/src/buffer.c b/src/buffer.c --- a/src/buffer.c +++ b/src/buffer.c @@ -854,11 +854,11 @@ do_bufdel(command, arg, addr_count, star if (deleted == 0) { if (command == DOBUF_UNLOAD) - sprintf((char *)IObuff, _("E515: No buffers were unloaded")); + STRCPY(IObuff, _("E515: No buffers were unloaded")); else if (command == DOBUF_DEL) - sprintf((char *)IObuff, _("E516: No buffers were deleted")); + STRCPY(IObuff, _("E516: No buffers were deleted")); else - sprintf((char *)IObuff, _("E517: No buffers were wiped out")); + STRCPY(IObuff, _("E517: No buffers were wiped out")); errormsg = IObuff; } else if (deleted >= p_report) @@ -2450,7 +2450,7 @@ buflist_list(eap) else home_replace(buf, buf->b_fname, NameBuff, MAXPATHL, TRUE); - sprintf((char *)IObuff, "%3d%c%c%c%c%c \"", + vim_snprintf((char *)IObuff, IOSIZE - 20, "%3d%c%c%c%c%c \"%s\"", buf->b_fnum, buf->b_p_bl ? ' ' : 'u', buf == curbuf ? '%' : @@ -2459,18 +2459,11 @@ buflist_list(eap) (buf->b_nwindows == 0 ? 'h' : 'a'), !buf->b_p_ma ? '-' : (buf->b_p_ro ? '=' : ' '), (buf->b_flags & BF_READERR) ? 'x' - : (bufIsChanged(buf) ? '+' : ' ') - ); - - len = (int)STRLEN(IObuff); - STRNCPY(IObuff + len, NameBuff, IOSIZE - 20 - len); - IObuff[IOSIZE - 20 - len] = NUL; /* make sure it's terminated */ - - len = (int)STRLEN(IObuff); - IObuff[len++] = '"'; + : (bufIsChanged(buf) ? '+' : ' '), + NameBuff); /* put "line 999" in column 40 or after the file name */ - IObuff[len] = NUL; + len = STRLEN(IObuff); i = 40 - vim_strsize(IObuff); do { diff --git a/src/getchar.c b/src/getchar.c --- a/src/getchar.c +++ b/src/getchar.c @@ -4342,7 +4342,7 @@ put_escstr(fd, strstart, what) if (p != NULL) { while (*p != NUL) - if (putc(*p++, fd) < 0) + if (fputc(*p++, fd) < 0) return FAIL; --str; continue; diff --git a/src/mark.c b/src/mark.c --- a/src/mark.c +++ b/src/mark.c @@ -1445,6 +1445,7 @@ removable(name) char_u *p; char_u part[51]; int retval = FALSE; + int n; name = home_replace_save(NULL, name); if (name != NULL) @@ -1452,11 +1453,14 @@ removable(name) for (p = p_viminfo; *p; ) { copy_option_part(&p, part, 51, ", "); - if (part[0] == 'r' - && MB_STRNICMP(part + 1, name, STRLEN(part + 1)) == 0) + if (part[0] == 'r') { - retval = TRUE; - break; + n = STRLEN(part + 1); + if (MB_STRNICMP(part + 1, name, n) == 0) + { + retval = TRUE; + break; + } } } vim_free(name); diff --git a/src/normal.c b/src/normal.c --- a/src/normal.c +++ b/src/normal.c @@ -2823,6 +2823,7 @@ do_mouse(oap, c, dir, count, fixindent) if ((mod_mask & MOD_MASK_MULTI_CLICK) == MOD_MASK_2CLICK) { pos_T *pos = NULL; + int gc; if (is_click) { @@ -2830,7 +2831,7 @@ do_mouse(oap, c, dir, count, fixindent) * not a word character, try finding a match and select a (), * {}, [], #if/#endif, etc. block. */ end_visual = curwin->w_cursor; - while (vim_iswhite(gchar_pos(&end_visual))) + while (gc = gchar_pos(&end_visual), vim_iswhite(gc)) inc(&end_visual); if (oap != NULL) oap->motion_type = MCHAR; diff --git a/src/proto/charset.pro b/src/proto/charset.pro --- a/src/proto/charset.pro +++ b/src/proto/charset.pro @@ -40,6 +40,7 @@ void getvvcol __ARGS((win_T *wp, pos_T * void getvcols __ARGS((win_T *wp, pos_T *pos1, pos_T *pos2, colnr_T *left, colnr_T *right)); char_u *skipwhite __ARGS((char_u *p)); char_u *skipdigits __ARGS((char_u *p)); +char_u *skiphex __ARGS((char_u *p)); char_u *skiptodigit __ARGS((char_u *p)); char_u *skiptohex __ARGS((char_u *p)); int vim_isdigit __ARGS((int c)); diff --git a/src/spell.c b/src/spell.c --- a/src/spell.c +++ b/src/spell.c @@ -10,25 +10,91 @@ /* * spell.c: code for spell checking * - * The basic spell checking mechanism is: - * 1. Isolate a word, up to the next non-word character. - * 2. Find the word in the hashtable of basic words. - * 3. If not found, look in the hashtable with "prewords". These are prefixes - * with a non-word character following a word character, e.g., "de-". - * 4. If still not found, for each matching a prefix try if the word matches - * without the prefix (and with the "chop" string added back). - * 5. If still still not found, for each matching suffix try if the word - * matches without the suffix (and with the "chop" string added back). + * The spell checking mechanism uses a tree (aka trie). Each node in the tree + * has a list of bytes that can appear (siblings). For each byte there is a + * pointer to the node with the byte that follows in the word (child). + * A NUL byte is used where the word may end. + * + * There are two trees: one with case-folded words and one with words in + * original case. The second one is only used for keep-case words and is + * usually small. + * + * Thanks to Olaf Seibert for providing an example implementation of this tree + * and the compression mechanism. * * Matching involves checking the caps type: Onecap ALLCAP KeepCap. - * After finding a matching word check for a leadstring (non-word characters - * before the word) and addstring (more text following, starting with a - * non-word character). * * Why doesn't Vim use aspell/ispell/myspell/etc.? * See ":help develop-spell". */ +/* + * Vim spell file format:

+ * + *
: ... + * + * + * 10 bytes "VIMspell05" + * 1 byte number of regions following (8 supported) + * 2 bytes Region name: ca, au, etc. + * First is region 1. + * + * 1 byte Number of bytes in (should be 128). + * N bytes List of flags (first one is for character 128): + * 0x01 word character + * 0x01 upper-case character + * 2 bytes Number of bytes in . + * N bytes Folded characters, first one is for character 128. + * + * + * : ... + * + * 4 bytes Length of in bytes, excluding + * . MSB first. + * To be defined. + * + * + * : + * + * : ... + * + * 4 bytes Number of nodes following. MSB first. + * + * : ... + * + * 1 byte Number of siblings in this node. The siblings + * follow in sorted order. + * + * : [ | []] + * + * 1 byte Byte value of the sibling. Special cases: + * BY_NOFLAGS: End of word without flags and for all + * regions. + * BY_FLAGS: End of word, follow. + * BY_INDEX: Child of sibling is shared, + * and follow. + * + * 3 bytes Index of child for this sibling, MSB first. + * + * 1 byte byte value of the sibling. + * + * 1 byte bitmask of: + * WF_ALLCAP word must have only capitals + * WF_ONECAP first char of word must be capital + * WF_RARE rare word + * WF_REGION follows + * + * 1 byte Bitmask for regions in which word is valid. When + * omitted it's valid in all regions. + * Lowest bit is for region 1. + * + * : + * + * + * All text characters are in 'encoding', but stored as single bytes. + * The region name is ASCII. + */ + #if defined(MSDOS) || defined(WIN16) || defined(WIN32) || defined(_WIN64) # include /* for lseek(), must be before vim.h */ #endif @@ -41,21 +107,20 @@ # include #endif -#define MAXWLEN 100 /* assume max. word len is this many bytes */ +#define MAXWLEN 250 /* assume max. word len is this many bytes */ -/* - * Structure that is used to store the structures and strings from the - * language file. This avoids the need to allocate space for each individual - * word. It's allocated in big chunks for speed. It's freed all at once when - * 'encoding' changes. - */ -#define SBLOCKSIZE 4096 /* default size of sb_data */ -typedef struct sblock_S sblock_T; -struct sblock_S -{ - sblock_T *sb_next; /* next block in list */ - char_u sb_data[1]; /* data, actually longer */ -}; +/* Flags used for a word. */ +#define WF_REGION 0x01 /* region byte follows */ +#define WF_ONECAP 0x02 /* word with one capital (or all capitals) */ +#define WF_ALLCAP 0x04 /* word must be all capitals */ +#define WF_RARE 0x08 /* rare word */ + +#define WF_KEEPCAP 0x100 /* keep-case word */ + +#define BY_NOFLAGS 0 /* end of word without flags or region */ +#define BY_FLAGS 1 /* end of word, flag byte follows */ +#define BY_INDEX 2 /* child is shared, index follows */ +#define BY_SPECIAL BY_INDEX /* hightest special byte value */ /* Info from "REP" entries in ".aff" file used in af_rep. * TODO: This is not used yet. Either use it or remove it. */ @@ -66,58 +131,33 @@ typedef struct repentry_S } repentry_T; /* - * Structure to store affix info. - */ -typedef struct affitem_S affitem_T; -struct affitem_S -{ - affitem_T *ai_next; /* next affix with same ai_add[] or NULL */ - short_u ai_nr; /* affix number */ - char_u ai_flags; /* AFF_ flags */ - char_u ai_choplen; /* length of chop string in bytes */ - char_u ai_addlen; /* length of ai_add in bytes */ - char_u ai_leadlen; /* for AFF_PREWORD: length of lead string */ - char_u ai_taillen; /* for AFF_PREWORD: length of tail string */ - char_u ai_add[1]; /* Text added to basic word. This stores: - * 0: word for AFF_PREWORD or whole addition - * ai_addlen + 1: chop string - * + ai_choplen + 1: lead string for AFF_PREWORD - * + ai_leadlen + 1: trail string f. AFF_PREWORD - */ -}; - -/* Get affitem_T pointer from hashitem that uses ai_add */ -static affitem_T dumai; -#define HI2AI(hi) ((affitem_T *)((hi)->hi_key - (dumai.ai_add - (char_u *)&dumai))) - -/* ai_flags: Affix item flags */ -#define AFF_COMBINE 0x01 /* prefix combines with suffix */ -#define AFF_PREWORD 0x02 /* prefix includes word */ - -/* * Structure used to store words and other info for one language, loaded from * a .spl file. - * The main access is through hashtable "sl_word", using the case-folded - * word as the key. This finds a linked list of fword_T. + * The main access is through the tree in "sl_fbyts/sl_fidxs", storing the + * case-folded words. "sl_kbyts/sl_kidxs" is for keep-case words. + * + * The "byts" array stores the possible bytes in each tree node, preceded by + * the number of possible bytes, sorted on byte value: + * ... + * The "idxs" array stores the index of the child node corresponding to the + * byte in "byts". + * Exception: when the byte is zero, the word may end here and "idxs" holds + * the flags and region for the word. There may be several zeros in sequence + * for alternative flag/region combinations. */ typedef struct slang_S slang_T; struct slang_S { slang_T *sl_next; /* next language */ char_u *sl_name; /* language name "en", "en.rare", "nl", etc. */ - hashtab_T sl_words; /* main word table, fword_T */ - int sl_prefcnt; /* number of prefix NRs */ - garray_T sl_preftab; /* list of hashtables to lookup prefixes */ - affitem_T *sl_prefzero; /* list of prefixes with zero add length */ - hashtab_T sl_prewords; /* prefixes that include a word */ - int sl_suffcnt; /* number of suffix NRs */ - garray_T sl_sufftab; /* list of hashtables to lookup suffixes */ - affitem_T *sl_suffzero; /* list of suffixes with zero add length */ + char_u *sl_fbyts; /* case-folded word bytes */ + int *sl_fidxs; /* case-folded word indexes */ + char_u *sl_kbyts; /* keep-case word bytes */ + int *sl_kidxs; /* keep-case word indexes */ char_u *sl_try; /* "TRY" from .aff file TODO: not used */ garray_T sl_rep; /* list of repentry_T entries from REP lines * TODO not used */ char_u sl_regions[17]; /* table with up to 8 region names plus NUL */ - sblock_T *sl_block; /* list with allocated memory blocks */ int sl_error; /* error while loading */ }; @@ -125,57 +165,6 @@ struct slang_S * languages. */ static slang_T *first_lang = NULL; -/* - * Structure to store an addition to a basic word. - * There are many of these, keep it small! - */ -typedef struct addword_S addword_T; -struct addword_S -{ - addword_T *aw_next; /* next addition */ - char_u aw_flags; /* ADD_ flags */ - char_u aw_region; /* region for word with this addition */ - char_u aw_leadlen; /* byte length of lead in aw_word */ - char_u aw_wordlen; /* byte length of first word in aw_word */ - char_u aw_saveb; /* saved byte where aw_word[] is truncated at - end of hashtable key; NUL when not using - hashtable */ - char_u aw_word[1]; /* text, actually longer: case-folded addition - plus, with ADD_KEEPCAP: keep-case addition */ -}; - -/* Get addword_T pointer from hashitem that uses aw_word */ -static addword_T dumaw; -#define HI2ADDWORD(hi) ((addword_T *)((hi)->hi_key - (dumaw.aw_word - (char_u *)&dumaw))) - -/* - * Structure to store a basic word. - * There are many of these, keep it small! - * The list of prefix and suffix NRs is stored after "fw_word" to avoid the - * need for two extra pointers. - */ -typedef struct fword_S fword_T; -struct fword_S -{ - fword_T *fw_next; /* same basic word with different caps and/or - * affixes */ - addword_T *fw_adds; /* first addword_T entry */ - short_u fw_flags; /* BWF_ flags */ - char_u fw_region; /* region bits */ - char_u fw_prefixcnt; /* number of prefix NRs */ - char_u fw_suffixcnt; /* number of suffix NRs */ - char_u fw_word[1]; /* actually longer: - * 0: case folded word or keep-case word when - * (flags & BWF_KEEPCAP) - * + word length + 1: list of prefix NRs - * + fw_prefixcnt [* 2]: list of suffix NRs - */ -}; - -/* Get fword_T pointer from hashitem that uses fw_word */ -static fword_T dumfw; -#define HI2FWORD(hi) ((fword_T *)((hi)->hi_key - (dumfw.fw_word - (char_u *)&dumfw))) - #define REGION_ALL 0xff @@ -195,39 +184,7 @@ typedef struct langp_S #define SP_RARE 2 #define SP_LOCAL 3 -/* flags used for basic words in the spell file */ -#define BWF_VALID 0x01 /* word is valid without additions */ -#define BWF_REGION 0x02 /* region byte follows */ -#define BWF_ONECAP 0x04 /* first letter must be capital */ -#define BWF_SUFFIX 0x08 /* has suffix NR list */ -#define BWF_SECOND 0x10 /* second flags byte follows */ - -#define BWF_ADDS 0x0100 /* there are additions */ -#define BWF_PREFIX 0x0200 /* has prefix NR list */ -#define BWF_ALLCAP 0x0400 /* all letters must be capital (not used - for single-letter words) */ -#define BWF_KEEPCAP 0x0800 /* Keep case as-is */ -#define BWF_ADDS_M 0x1000 /* there are more than 255 additions */ - -#define BWF_ADDHASH 0x8000 /* Internal: use hashtab for additions */ - -#define NOWC_KEY (char_u *)"x" /* hashtab key used for additions without - any word character */ - -/* flags used for addition in the spell file */ -#define ADD_REGION 0x02 /* region byte follows */ -#define ADD_ONECAP 0x04 /* first letter must be capital */ -#define ADD_LEADLEN 0x10 /* there is a leadlen byte */ -#define ADD_COPYLEN 0x20 /* there is a copylen byte */ -#define ADD_ALLCAP 0x40 /* all letters must be capital (not used - for single-letter words) */ -#define ADD_KEEPCAP 0x80 /* fixed case */ - -/* Translate ADD_ flags to BWF_ flags. - * (Needed to keep ADD_ flags in one byte.) */ -#define ADD2BWF(x) (((x) & 0x0f) | (((x) & 0xf0) << 4)) - -#define VIMSPELLMAGIC "VIMspell04" /* string at start of Vim spell file */ +#define VIMSPELLMAGIC "VIMspell05" /* string at start of Vim spell file */ #define VIMSPELLMAGICL 10 /* @@ -239,49 +196,33 @@ typedef struct matchinf_S slang_T *mi_slang; /* info for the language */ /* pointers to original text to be checked */ - char_u *mi_line; /* start of line containing word */ char_u *mi_word; /* start of word being checked */ - char_u *mi_end; /* first non-word char after mi_word */ - char_u *mi_wend; /* end of matching word (is mi_end - * or further) */ + char_u *mi_end; /* end of matching word */ char_u *mi_fend; /* next char to be added to mi_fword */ + char_u *mi_cend; /* char after what was used for + mi_capflags */ /* case-folded text */ char_u mi_fword[MAXWLEN + 1]; /* mi_word case-folded */ - int mi_fendlen; /* byte length of first word in - mi_fword */ - int mi_faddlen; /* byte length of text in mi_fword - after first word */ - char_u *mi_cword; /* word to check, points in mi_fword */ - char_u *mi_awend; /* after next word, to check for - addition (NULL when not done yet) */ - int mi_did_awend; /* did compute mi_awend */ + int mi_fwordlen; /* nr of valid bytes in mi_fword */ /* others */ int mi_result; /* result so far: SP_BAD, SP_OK, etc. */ - int mi_capflags; /* BWF_ONECAP BWF_ALLCAP BWF_KEEPCAP */ + int mi_capflags; /* WF_ONECAP WF_ALLCAP WF_KEEPCAP */ } matchinf_T; -static int word_match __ARGS((matchinf_T *mip)); -static int check_adds __ARGS((matchinf_T *mip, fword_T *fw, int req_pref, int req_suf)); -static void fill_awend __ARGS((matchinf_T *mip)); -static void fold_addchars __ARGS((matchinf_T *mip, int addlen)); -static int supports_affix __ARGS((int cnt, char_u *afflist, int afflistlen, int nr)); -static int prefix_match __ARGS((matchinf_T *mip)); -static int noprefix_match __ARGS((matchinf_T *mip, char_u *pword, char_u *cstart, affitem_T *ai)); -static int suffix_match __ARGS((matchinf_T *mip)); -static int match_caps __ARGS((int flags, char_u *caseword, matchinf_T *mip, char_u *cword, char_u *end)); static slang_T *slang_alloc __ARGS((char_u *lang)); static void slang_free __ARGS((slang_T *lp)); +static void find_word __ARGS((matchinf_T *mip, int keepcap)); static slang_T *spell_load_lang __ARGS((char_u *lang)); static void spell_load_file __ARGS((char_u *fname, void *cookie)); -static void *getroom __ARGS((slang_T *lp, int *bl_used, int len)); +static int read_tree __ARGS((FILE *fd, char_u *byts, int *idxs, int maxidx, int startidx)); static int find_region __ARGS((char_u *rp, char_u *region)); static int captype __ARGS((char_u *word, char_u *end)); /* * Main spell-checking function. - * "ptr" points to the start of a word. + * "ptr" points to a character that could be the start of a word. * "*attrp" is set to the attributes for a badly spelled word. For a non-word * or when it's OK it remains unchanged. * This must only be called when 'spelllang' is not empty. @@ -289,885 +230,328 @@ static int captype __ARGS((char_u *word, * caller can skip over the word. */ int -spell_check(wp, line, ptr, attrp) +spell_check(wp, ptr, attrp) win_T *wp; /* current window */ - char_u *line; /* start of line where "ptr" points into */ char_u *ptr; int *attrp; { matchinf_T mi; /* Most things are put in "mi" so that it can be passed to functions quickly. */ - /* Find the end of the word. We already know that *ptr is a word char. */ + /* Find the end of the word. */ mi.mi_word = ptr; mi.mi_end = ptr; - do - { - mb_ptr_adv(mi.mi_end); - } while (*mi.mi_end != NUL && spell_iswordc(mi.mi_end)); - - /* A word starting with a number is always OK. */ - if (*ptr >= '0' && *ptr <= '9') - return (int)(mi.mi_end - ptr); - - /* Make case-folded copy of the word. */ - (void)spell_casefold(ptr, mi.mi_end - ptr, mi.mi_fword, MAXWLEN + 1); - mi.mi_cword = mi.mi_fword; - mi.mi_fendlen = STRLEN(mi.mi_fword); - mi.mi_faddlen = 0; - mi.mi_fend = mi.mi_end; - - /* Check the caps type of the word. */ - mi.mi_capflags = captype(ptr, mi.mi_end); - - /* The word is bad unless we recognize it. */ - mi.mi_result = SP_BAD; - mi.mi_wend = mi.mi_end; - - mi.mi_awend = NULL; - mi.mi_did_awend = FALSE; - mi.mi_line = line; - /* - * Loop over the languages specified in 'spelllang'. - * We check them all, because a matching word may have additions that are - * longer than an already found matching word. - */ - for (mi.mi_lp = LANGP_ENTRY(wp->w_buffer->b_langp, 0); - mi.mi_lp->lp_slang != NULL; ++mi.mi_lp) + /* A word starting with a number is always OK. Also skip hexadecimal + * numbers 0xFF99 and 0X99FF. */ + if (*ptr >= '0' && *ptr <= '9') + { + if (*ptr == '0' && (ptr[1] == 'x' || ptr[2] == 'X')) + mi.mi_end = skiphex(ptr); + else + mi.mi_end = skipdigits(ptr); + } + else { - /* - * Check for a matching word. - * If not found or wrong region try removing prefixes (and then - * suffixes). - * If still not found or wrong region try removing suffixes. - */ - mi.mi_slang = mi.mi_lp->lp_slang; - if (!word_match(&mi) || mi.mi_result != SP_OK) - if (!prefix_match(&mi) || mi.mi_result != SP_OK) - suffix_match(&mi); - } + mi.mi_fend = ptr; + if (spell_iswordc(mi.mi_fend)) + { + /* Make case-folded copy of the characters until the next non-word + * character. */ + do + { + mb_ptr_adv(mi.mi_fend); + } while (*mi.mi_fend != NUL && spell_iswordc(mi.mi_fend)); - if (mi.mi_result != SP_OK) - { - if (mi.mi_result == SP_BAD) - *attrp = highlight_attr[HLF_SPB]; - else if (mi.mi_result == SP_RARE) - *attrp = highlight_attr[HLF_SPR]; - else - *attrp = highlight_attr[HLF_SPL]; - } + (void)spell_casefold(ptr, (int)(mi.mi_fend - ptr), mi.mi_fword, + MAXWLEN + 1); + mi.mi_fwordlen = STRLEN(mi.mi_fword); - return (int)(mi.mi_wend - ptr); -} + /* Check the caps type of the word. */ + mi.mi_capflags = captype(ptr, mi.mi_fend); -/* - * Check if the word "mip->mi_word" matches. - * "mip->mi_fword" is the same word case-folded; - * - * This checks the word as a whole and for prefixes that include a word. - * - * Note that when called mi_fword only contains the word up to mip->mi_end, - * but when checking additions it gets longer. - */ - static int -word_match(mip) - matchinf_T *mip; -{ - hash_T fhash = hash_hash(mip->mi_fword); - hashitem_T *hi; - fword_T *fw; - int valid = FALSE; - char_u *p; - char_u pword[MAXWLEN + 1]; - int charlen; - int capflags_save; - affitem_T *ai; - char_u *cstart; - int addlen; - int n; - char_u *save_end; - int cc; + /* We always use the characters up to the next non-word character, + * also for bad words. */ + mi.mi_end = mi.mi_fend; + } + else + { + /* No word characters. Don't case-fold anything, we may quickly + * find out this is not a word (but it could be!). */ + mi.mi_fwordlen = 0; + mi.mi_capflags = 0; + } - hi = hash_lookup(&mip->mi_slang->sl_words, mip->mi_fword, fhash); - if (!HASHITEM_EMPTY(hi)) - { - /* - * Find a basic word for which the case of "mi_word" is correct. - * If it is, check additions and use the longest one. - */ - for (fw = HI2FWORD(hi); fw != NULL; fw = fw->fw_next) - if (match_caps(fw->fw_flags, fw->fw_word, mip, - mip->mi_word, mip->mi_end)) - valid |= check_adds(mip, fw, -1, -1); - } + mi.mi_cend = mi.mi_fend; + + /* The word is bad unless we recognize it. */ + mi.mi_result = SP_BAD; - /* - * Try finding a matching preword for "mip->mi_word". These are - * prefixes that have a non-word character after a word character: - * "d'", "de-", "'s-", "l'de-". But not "'s". - * Also need to do this when a matching word was already found, because we - * might find a longer match this way (French: "qu" and "qu'a-t-elle"). - * The check above may have added characters to mi_fword, thus we need to - * truncate it after the basic word for the hash lookup. - */ - cc = mip->mi_fword[mip->mi_fendlen]; - mip->mi_fword[mip->mi_fendlen] = NUL; - hi = hash_lookup(&mip->mi_slang->sl_prewords, mip->mi_fword, fhash); - mip->mi_fword[mip->mi_fendlen] = cc; - if (!HASHITEM_EMPTY(hi)) - { - capflags_save = mip->mi_capflags; - - /* Go through the list of matching prewords. */ - for (ai = HI2AI(hi); ai != NULL; ai = ai->ai_next) + /* + * Loop over the languages specified in 'spelllang'. + * We check them all, because a matching word may be longer than an + * already found matching word. + */ + for (mi.mi_lp = LANGP_ENTRY(wp->w_buffer->b_langp, 0); + mi.mi_lp->lp_slang != NULL; ++mi.mi_lp) { - /* Check that the lead string matches before the word. */ - p = ai->ai_add + ai->ai_addlen + ai->ai_choplen + 2; - if (ai->ai_leadlen > 0) - { - if (mip->mi_word - mip->mi_line < ai->ai_leadlen - || STRNCMP(mip->mi_word - ai->ai_leadlen, p, - ai->ai_leadlen) != 0) - continue; - p += ai->ai_leadlen + 1; /* advance "p" to tail */ - } - else - ++p; /* advance "p" to tail */ + /* Check for a matching word in case-folded words. */ + find_word(&mi, FALSE); + + /* Try keep-case words. */ + find_word(&mi, TRUE); + } - /* Check that the tail string matches after the word. Need - * to fold case first. */ - if (ai->ai_taillen > 0) + if (mi.mi_result != SP_OK) + { + /* When we are at a non-word character there is no error, just + * skip over the character (try looking for a word after it). */ + if (!spell_iswordc(ptr)) { - if (ai->ai_taillen >= mip->mi_faddlen) - { - fold_addchars(mip, ai->ai_taillen); - if (ai->ai_taillen > mip->mi_faddlen) - continue; /* not enough chars, can't match */ - } - if (STRNCMP(mip->mi_fword + mip->mi_fendlen, - p, ai->ai_taillen) != 0) - continue; +#ifdef FEAT_MBYTE + if (has_mbyte) + return mb_ptr2len_check(ptr); +#endif + return 1; } - /* - * This preword matches. Remove the preword and check that - * the resulting word exits. - */ - - /* Find the place in the original word where the tail ends, - * needed for case checks. */ -#ifdef FEAT_MBYTE - charlen = mb_charlen(p); -#else - charlen = ai->ai_taillen; -#endif - cstart = mip->mi_end; - for (n = 0; n < charlen; ++n) - mb_ptr_adv(cstart); - - /* The new word starts with the chop. Then add up to the next - * non-word char. */ - mch_memmove(pword, ai->ai_add + ai->ai_addlen + 1, - ai->ai_choplen); - p = mip->mi_fword + mip->mi_fendlen + ai->ai_taillen; - addlen = ai->ai_taillen; - while (spell_iswordc(p)) - { - ++charlen; -#ifdef FEAT_MBYTE - addlen += (*mb_ptr2len_check)(p); -#else - ++addlen; -#endif - mb_ptr_adv(p); - if (addlen >= mip->mi_faddlen) - { - /* Get more folded characters in mip->mi_fword. */ - fold_addchars(mip, addlen); - if (addlen >= mip->mi_faddlen) - break; /* not enough chars, can't match */ - } - } - mch_memmove(pword + ai->ai_choplen, - mip->mi_fword + mip->mi_fendlen + ai->ai_taillen, - addlen - ai->ai_taillen); - pword[ai->ai_choplen + addlen - ai->ai_taillen] = NUL; - - /* Need to set mi_end to find additions. Also set mi_fendlen - * and mi_faddlen. */ - save_end = mip->mi_end; - while (--charlen >= 0) - mb_ptr_adv(mip->mi_end); - mip->mi_fendlen += addlen; - mip->mi_faddlen -= addlen; - - /* Find the word "pword", caseword "cstart". */ - n = noprefix_match(mip, pword, cstart, ai); - mip->mi_end = save_end; - mip->mi_fendlen -= addlen; - mip->mi_faddlen += addlen; - if (n) - valid = TRUE; - - /* If we found a valid word, we still need to try other - * suffixes, because it may have an addition that's longer. */ - } - - mip->mi_capflags = capflags_save; - } - - return valid; -} - -/* - * Check a matching basic word for additions. - * Return TRUE if we have a valid match. - */ - static int -check_adds(mip, fw, req_pref, req_suf) - matchinf_T *mip; - fword_T *fw; - int req_pref; /* required prefix nr, -1 if none */ - int req_suf; /* required suffix nr, -1 if none */ -{ - int valid = FALSE; - addword_T *aw; - addword_T *naw = NULL; - char_u *p; - int addlen; - int cc; - hashitem_T *hi; - char_u *cp = NULL; - int n; - - /* Check if required prefixes and suffixes are supported. These are on - * the basic word, not on each addition. */ - if (req_pref >= 0 || req_suf >= 0) - { - /* Prefix NRs are stored just after the word in fw_word. */ - cp = fw->fw_word + STRLEN(fw->fw_word) + 1; - if (req_pref >= 0 && !supports_affix(mip->mi_slang->sl_prefcnt, - cp, fw->fw_prefixcnt, req_pref)) - return FALSE; - if (req_suf >= 0) - { - /* Suffix NRs are stored just after the Prefix NRs. */ - if (fw->fw_prefixcnt > 0) - { - if (mip->mi_slang->sl_prefcnt > 256) - cp += fw->fw_prefixcnt * 2; - else - cp += fw->fw_prefixcnt; - } - if (!supports_affix(mip->mi_slang->sl_suffcnt, - cp, fw->fw_suffixcnt, req_suf)) - return FALSE; + if (mi.mi_result == SP_BAD) + *attrp = highlight_attr[HLF_SPB]; + else if (mi.mi_result == SP_RARE) + *attrp = highlight_attr[HLF_SPR]; + else + *attrp = highlight_attr[HLF_SPL]; } } - /* A word may be valid without an addition. */ - if (fw->fw_flags & BWF_VALID) - { - valid = TRUE; - if (mip->mi_result != SP_OK) - { - if ((fw->fw_region & mip->mi_lp->lp_region) == 0) - mip->mi_result = SP_LOCAL; - else - mip->mi_result = SP_OK; - } - /* Set word end, required when matching a word after a preword. */ - if (mip->mi_wend < mip->mi_end) - mip->mi_wend = mip->mi_end; - } - - /* - * Check additions, both before and after the word. - * This may make the word longer, thus we also need to check - * when we already found a matching word. - * When the BWF_ADDHASH flag is present then fw_adds points to a hashtable - * for quick lookup. Otherwise it points to the list of all possible - * additions. - */ - if (fw->fw_flags & BWF_ADDHASH) - { - /* Locate the text up to the next end-of-word. */ - if (!mip->mi_did_awend) - fill_awend(mip); - if (mip->mi_awend == NULL) - return valid; /* there is no next word */ - - cc = *mip->mi_awend; - *mip->mi_awend = NUL; - hi = hash_find((hashtab_T *)fw->fw_adds, - mip->mi_fword + mip->mi_fendlen); - *mip->mi_awend = cc; - if (HASHITEM_EMPTY(hi)) - return valid; /* no matching addition */ - aw = HI2ADDWORD(hi); - - /* Also check additions without word characters. If they are there, - * skip the first dummy entry. */ - hi = hash_find((hashtab_T *)fw->fw_adds, NOWC_KEY); - if (!HASHITEM_EMPTY(hi)) - naw = HI2ADDWORD(hi)->aw_next; - } - else - aw = fw->fw_adds; - - for ( ; ; aw = aw->aw_next) - { - if (aw == NULL) - { - /* At end of list: may also try additions without word chars. */ - if (naw == NULL) - break; - aw = naw; - naw = NULL; - } - - if (aw->aw_leadlen > 0) - { - /* There is a leader, verify that it matches. */ - if (aw->aw_leadlen > mip->mi_word - mip->mi_line - || STRNCMP(mip->mi_word - aw->aw_leadlen, - aw->aw_word, aw->aw_leadlen) != 0) - continue; - if (mip->mi_word - aw->aw_leadlen > mip->mi_line) - { - /* There must not be a word character just before the - * leader. */ - p = mip->mi_word - aw->aw_leadlen; - mb_ptr_back(mip->mi_line, p); - if (spell_iswordc(p)) - continue; - } - /* Leader matches. Addition is rest of "aw_word". */ - p = aw->aw_word + aw->aw_leadlen; - } - else - /* No leader, use whole of "aw_word" for addition. */ - p = aw->aw_word; - - addlen = aw->aw_wordlen - aw->aw_leadlen; - if (addlen > 0) - { - /* Check for matching addition and no word character after it. - * First make sure we have enough case-folded chars to compare - * with. */ - if (addlen >= mip->mi_faddlen) - fold_addchars(mip, addlen); - - /* Put back the saved char, if needed. */ - if (aw->aw_saveb != NUL) - { - cp = p + STRLEN(p); - *cp = aw->aw_saveb; - } - n = STRNCMP(mip->mi_fword + mip->mi_fendlen, p, addlen); - if (aw->aw_saveb != NUL) - *cp = NUL; - - if (n != 0 || (mip->mi_fword[mip->mi_fendlen + addlen] != NUL - && spell_iswordc(mip->mi_fword + mip->mi_fendlen + addlen))) - continue; - - /* Compute the length in the original word, before case folding. */ -#ifdef FEAT_MBYTE - if (has_mbyte) - { - int l; - - p = mip->mi_end; - for (l = 0; l < addlen; l += (*mb_ptr2len_check)(mip->mi_fword - + mip->mi_fendlen + l)) - mb_ptr_adv(p); - addlen = p - mip->mi_end; - } -#endif - - /* Check case of the addition. */ - if (!match_caps(ADD2BWF(aw->aw_flags), - aw->aw_word + aw->aw_wordlen + 1, mip, - mip->mi_end, mip->mi_end + addlen)) - continue; - } - - /* Match! Use the new length if it's longer. */ - if (mip->mi_wend < mip->mi_end + addlen) - mip->mi_wend = mip->mi_end + addlen; - - valid = TRUE; - if (mip->mi_result != SP_OK) - { - if ((aw->aw_region & mip->mi_lp->lp_region) == 0) - mip->mi_result = SP_LOCAL; - else - mip->mi_result = SP_OK; - } - } - - return valid; + return (int)(mi.mi_end - ptr); } /* - * Locate the text up to the next end-of-word after mip->mi_end. - */ - static void -fill_awend(mip) - matchinf_T *mip; -{ - char_u *p = mip->mi_end; - int addlen = 0; - int find_word = TRUE; - - mip->mi_did_awend = TRUE; - if (mip->mi_faddlen == 0) - fold_addchars(mip, 0); /* need to fold first char */ - - /* 1: find_word == TRUE: skip over non-word characters after mi_end. - * 2: find_word == FALSE: skip over following word characters. */ - for (p = mip->mi_fword + mip->mi_fendlen; *p != NUL; mb_ptr_adv(p)) - { - if (spell_iswordc(p) == find_word) - { - if (!find_word) - break; /* done */ - find_word = !find_word; - } -#ifdef FEAT_MBYTE - addlen += (*mb_ptr2len_check)(p); -#else - ++addlen; -#endif - if (addlen >= mip->mi_faddlen) - fold_addchars(mip, addlen); /* need to fold more chars */ - } - - /* If there are extra chars store the result. */ - if (addlen != 0) - mip->mi_awend = p; -} - -/* - * Fold enough characters of the checked text to be able to compare with an - * addition of length "addlen" plus one character (to be able to check the - * next character to be a non-word char). - * When there are not enough characters (end of line) mip->mi_faddlen will be - * smaller than "addlen". + * Check if the word at "mip->mi_word" is in the tree. + * When "keepcap" is TRUE check in keep-case word tree. + * + * For a match mip->mi_result is updated. */ static void -fold_addchars(mip, addlen) +find_word(mip, keepcap) matchinf_T *mip; - int addlen; + int keepcap; { - int l; - char_u *p = mip->mi_fword + mip->mi_fendlen; - - while (mip->mi_faddlen <= addlen) - { - if (*mip->mi_fend == NUL) /* end of the line */ - { - p[mip->mi_faddlen] = NUL; - break; - } + int arridx = 0; + int endlen[MAXWLEN]; /* length at possible word endings */ + int endidx[MAXWLEN]; /* possible word endings */ + int endidxcnt = 0; + int len; + int wlen = 0; + int flen; + int c; + char_u *ptr; + unsigned lo, hi, m; #ifdef FEAT_MBYTE - if (has_mbyte) - l = (*mb_ptr2len_check)(mip->mi_fend); - else + char_u *s; + char_u *p; #endif - l = 1; - (void)spell_casefold(mip->mi_fend, l, p + mip->mi_faddlen, - MAXWLEN - mip->mi_fendlen - mip->mi_faddlen); - mip->mi_fend += l; - mip->mi_faddlen += STRLEN(p + mip->mi_faddlen); - } -} + int res; + int valid; + slang_T *slang = mip->mi_lp->lp_slang; + unsigned flags; + char_u *byts; + int *idxs; -/* - * Return TRUE if affix "nr" appears in affix list "afflist[afflistlen]". - */ - static int -supports_affix(cnt, afflist, afflistlen, nr) - int cnt; /* total affix NR count */ - char_u *afflist; - int afflistlen; /* affix count in "afflist" */ - int nr; -{ - char_u *pc = afflist; - int i; - int nr_msb, nr_lsb; - - if (cnt <= 256) + if (keepcap) { - /* one byte affix numbers */ - for (i = afflistlen; --i >= 0; ) - if (*pc++ == nr) - return TRUE; + /* Check for word with matching case in keep-case tree. */ + ptr = mip->mi_word; + flen = 9999; /* no case folding, always enough bytes */ + byts = slang->sl_kbyts; + idxs = slang->sl_kidxs; } else { - /* two byte affix numbers, MSB first */ - nr_msb = (unsigned)nr >> 8; - nr_lsb = nr & 0xff; - for (i = afflistlen; --i >= 0; ) - { - if (*pc++ == nr_msb && *pc == nr_lsb) - return TRUE; - ++pc; - } - } - return FALSE; -} - -/* - * Try finding a match for "mip->mi_cword" by removing prefixes. - */ - static int -prefix_match(mip) - matchinf_T *mip; -{ - int len = 0; - int charlen = 0; - int cc; - affitem_T *ai; - char_u pword[MAXWLEN + 1]; - hashtab_T *ht; - hashitem_T *hi; - int found_valid = FALSE; - int cstart_charlen = 0; - char_u *cstart = mip->mi_word; - int capflags_save = mip->mi_capflags; - - /* - * Check for prefixes with different character lengths. - * Start with zero length (only chop off). - */ - for (charlen = 0; charlen <= mip->mi_slang->sl_preftab.ga_len; ++charlen) - { - if (charlen > 0) - { -#ifdef FEAT_MBYTE - if (has_mbyte) - len += (*mb_ptr2len_check)(mip->mi_cword + len); - else -#endif - len += 1; - } - if (mip->mi_cword[len] == NUL) /* end of word, no prefix possible */ - break; - - if (charlen == 0) - ai = mip->mi_slang->sl_prefzero; - else - { - /* Get pointer to hashtab for prefix of this many chars. */ - ht = ((hashtab_T *)mip->mi_slang->sl_preftab.ga_data) + charlen - 1; - if (ht->ht_used == 0) - continue; - - cc = mip->mi_cword[len]; - mip->mi_cword[len] = NUL; - hi = hash_find(ht, mip->mi_cword); - mip->mi_cword[len] = cc; - - if (HASHITEM_EMPTY(hi)) - ai = NULL; - else - ai = HI2AI(hi); - } - - /* Loop over all matching prefixes. */ - for ( ; ai != NULL; ai = ai->ai_next) - { - /* Create the basic word from the chop string and the word after - * the matching add string. */ - mch_memmove(pword, ai->ai_add + ai->ai_addlen + 1, ai->ai_choplen); - mch_memmove(pword + ai->ai_choplen, mip->mi_cword + ai->ai_addlen, - mip->mi_fendlen - ai->ai_addlen); - pword[mip->mi_fendlen - ai->ai_addlen] = NUL; - - /* Adjust the word start for case checks, we only check the - * part after the prefix. */ - while (cstart_charlen < charlen) - { - mb_ptr_adv(cstart); - ++cstart_charlen; - } - - /* Find the word "pword", caseword "cstart". */ - found_valid |= noprefix_match(mip, pword, cstart, ai); - - if (found_valid && mip->mi_result == SP_OK) - { - /* Found a valid word, no need to try other suffixes. */ - mip->mi_capflags = capflags_save; - return TRUE; - } - } - } - - mip->mi_capflags = capflags_save; - return FALSE; -} - -/* - * Check for matching word after removing a prefix. - * Return TRUE if found. - */ - static int -noprefix_match(mip, pword, cstart, ai) - matchinf_T *mip; - char_u *pword; /* case-folded word */ - char_u *cstart; /* original word after removed prefix */ - affitem_T *ai; /* the prefix item */ -{ - hashitem_T *hi; - fword_T *fw; - int found_valid = FALSE; - char_u *word; - int i; - int fendlen; - - /* Removing the prefix may change the caps, e.g. for - * "deAlf" removing "de" makes it ONECAP. */ - mip->mi_capflags = captype(cstart, mip->mi_end); - - /* Find the basic word. */ - hi = hash_find(&mip->mi_slang->sl_words, pword); - if (!HASHITEM_EMPTY(hi)) - { - /* Check if the word supports this prefix. */ - for (fw = HI2FWORD(hi); fw != NULL; fw = fw->fw_next) - if (match_caps(fw->fw_flags, fw->fw_word, mip, - cstart, mip->mi_end)) - found_valid |= check_adds(mip, fw, ai->ai_nr, -1); - - if (found_valid && mip->mi_result == SP_OK) - /* Found a valid word, no need to try other suffixes. */ - return TRUE; + /* Check for case-folded in case-folded tree. */ + ptr = mip->mi_fword; + flen = mip->mi_fwordlen; /* available case-folded bytes */ + byts = slang->sl_fbyts; + idxs = slang->sl_fidxs; } - /* No matching basic word without prefix. When combining is - * allowed try with suffixes. */ - if (ai->ai_flags & AFF_COMBINE) - { - /* Pass the word with prefix removed to suffix_match(). */ - mip->mi_cword = pword; - word = mip->mi_word; - mip->mi_word = cstart; - fendlen = mip->mi_fendlen; - mip->mi_fendlen = STRLEN(pword); - i = suffix_match(mip); - mip->mi_cword = mip->mi_fword; - mip->mi_word = word; - mip->mi_fendlen = fendlen; - if (i) - return TRUE; - } - - return FALSE; -} - -/* - * Try finding a match for "mip->mi_cword" by removing suffixes. - */ - static int -suffix_match(mip) - matchinf_T *mip; -{ - char_u *sufp; - char_u *endw = mip->mi_cword + mip->mi_fendlen; - int endw_c = *endw; - int charlen; - affitem_T *ai; - char_u pword[MAXWLEN + 1]; - fword_T *fw; - hashtab_T *ht; - hashitem_T *hi; - int tlen; - int cend_charlen = 0; - char_u *cend = mip->mi_end; - int found_valid = FALSE; - int capflags_save = mip->mi_capflags; + if (byts == NULL) + return; /* array is empty */ /* - * Try suffixes of different length, starting with an empty suffix (chop - * only, thus adds something). - * Stop checking if there are no suffixes with so many characters. + * Repeat advancing in the tree until there is a byte that doesn't match, + * we reach the end of the tree or we reach the end of the line. */ - sufp = endw; - *endw = NUL; /* truncate after possible suffix */ - - for (charlen = 0; charlen <= mip->mi_slang->sl_sufftab.ga_len; ++charlen) + for (;;) { - /* Move the pointer to the possible suffix back one character, unless - * doing the first round (empty suffix). */ - if (charlen > 0) - { - mb_ptr_back(mip->mi_cword, sufp); - if (sufp <= mip->mi_cword) /* start of word, no suffix possible */ - break; - } - - if (charlen == 0) - ai = mip->mi_slang->sl_suffzero; - else - { - /* Get pointer to hashtab for suffix of this many chars. */ - ht = ((hashtab_T *)mip->mi_slang->sl_sufftab.ga_data) + charlen - 1; - if (ht->ht_used == 0) - continue; - - hi = hash_find(ht, sufp); - if (HASHITEM_EMPTY(hi)) - ai = NULL; - else - ai = HI2AI(hi); - } - - if (ai != NULL) + if (flen == 0 && *mip->mi_fend != NUL) { - /* Found a list of matching suffixes. Now check that there is one - * we can use. */ - tlen = sufp - mip->mi_cword; /* length of word without suffix */ - mch_memmove(pword, mip->mi_cword, tlen); - *endw = endw_c; - - for ( ; ai != NULL; ai = ai->ai_next) - { - /* Found a matching suffix. Create the basic word by removing - * the suffix and adding the chop string. */ - if (ai->ai_choplen == 0) - pword[tlen] = NUL; - else - mch_memmove(pword + tlen, ai->ai_add + ai->ai_addlen + 1, - ai->ai_choplen + 1); - - /* Find the basic word. */ - hi = hash_find(&mip->mi_slang->sl_words, pword); - if (!HASHITEM_EMPTY(hi)) - { - /* Adjust the end for case checks, we only check the part - * before the suffix. */ - while (cend_charlen < charlen) - { - mb_ptr_back(mip->mi_word, cend); - ++cend_charlen; - } - - /* Removing the suffix may change the caps, e.g. for - * "UFOs" removing 's' makes it ALLCAP. */ - mip->mi_capflags = captype(mip->mi_word, cend); - - /* Check if the word supports this suffix. */ - for (fw = HI2FWORD(hi); fw != NULL; fw = fw->fw_next) - if (match_caps(fw->fw_flags, fw->fw_word, mip, - mip->mi_word, cend)) - found_valid |= check_adds(mip, fw, -1, ai->ai_nr); - - if (found_valid && mip->mi_result == SP_OK) - { - /* Found a valid word, no need to try other suffixes. */ - mip->mi_capflags = capflags_save; - return TRUE; - } - } - } - - *endw = NUL; /* truncate after possible suffix */ - } - } - - *endw = endw_c; - mip->mi_capflags = capflags_save; - return FALSE; -} - -/* - * Return TRUE if case of "cword" meets the requirements of case flags - * "flags". - */ - static int -match_caps(flags, caseword, mip, cword, end) - int flags; /* flags required by basic word or addition */ - char_u *caseword; /* word with case as required */ - matchinf_T *mip; - char_u *cword; /* word to compare against "caseword" */ - char_u *end; /* end of "cword" */ -{ - char_u *p; - int c; - int len; - int capflags = mip->mi_capflags; /* flags of checked word */ - int past_second; - - if ((capflags & BWF_KEEPCAP) == 0 && end > mip->mi_end) - { - /* If "end" is past "mip->mi_end" we need to adjust the caps type for - * characters after the basic word. */ -#ifdef FEAT_MBYTE - past_second = (mip->mi_word + (*mb_ptr2len_check)(mip->mi_word) - < mip->mi_end); -#else - past_second = mip->mi_word + 1 < mip->mi_end; -#endif - for (p = mip->mi_end; p < end; ) - { - if (!spell_iswordc(p)) - mb_ptr_adv(p); - else + /* Need to fold at least one more character. Do until next + * non-word character for efficiency. */ + do { #ifdef FEAT_MBYTE if (has_mbyte) - c = mb_ptr2char_adv(&p); + flen += mb_ptr2len_check(mip->mi_fend + flen); else #endif - c = *p++; - if (spell_isupper(c)) - { - if (capflags == 0 || (capflags & BWF_ONECAP)) - { - capflags = BWF_KEEPCAP; /* lU or UlU */ - break; - } - } - else - { - if (capflags & BWF_ALLCAP) - { - if (past_second) - { - capflags = BWF_KEEPCAP; /* UUl */ - break; - } - capflags = BWF_ONECAP; /* Uu */ - } - } - past_second = TRUE; + ++flen; + } while (spell_iswordc(mip->mi_fend + flen)); + + (void)spell_casefold(mip->mi_fend, flen, + mip->mi_fword + mip->mi_fwordlen, + MAXWLEN - mip->mi_fwordlen); + mip->mi_fend += flen; + flen = STRLEN(mip->mi_fword + mip->mi_fwordlen); + mip->mi_fwordlen += flen; + } + + len = byts[arridx++]; + + /* If the first possible byte is a zero the word could end here. + * Remember this index, we first check for the longest word. */ + if (byts[arridx] == 0) + { + endlen[endidxcnt] = wlen; + endidx[endidxcnt++] = arridx++; + --len; + + /* Skip over the zeros, there can be several flag/region + * combinations. */ + while (len > 0 && byts[arridx] == 0) + { + ++arridx; + --len; + } + if (len == 0) + break; /* no children, word must end here */ + } + + /* Stop looking at end of the line. */ + if (ptr[wlen] == NUL) + break; + + /* Perform a binary search in the list of accepted bytes. */ + c = ptr[wlen]; + lo = arridx; + hi = arridx + len - 1; + while (lo < hi) + { + m = (lo + hi) / 2; + if (byts[m] > c) + hi = m - 1; + else if (byts[m] < c) + lo = m + 1; + else + { + lo = hi = m; + break; } } + + /* Stop if there is no matching byte. */ + if (hi < lo || byts[lo] != c) + break; + + /* Continue at the child (if there is one). */ + arridx = idxs[lo]; + ++wlen; + --flen; } - if (capflags == BWF_ALLCAP) - return TRUE; /* All caps is always OK. */ + /* + * Verify that one of the possible endings is valid. Try the longest + * first. + */ + while (endidxcnt > 0) + { + --endidxcnt; + arridx = endidx[endidxcnt]; + wlen = endlen[endidxcnt]; - if (flags & BWF_KEEPCAP) - { - len = STRLEN(caseword); - return (len == end - cword && STRNCMP(caseword, cword, len) == 0); - } +#ifdef FEAT_MBYTE + if ((*mb_head_off)(ptr, ptr + wlen) > 0) + continue; /* not at first byte of character */ +#endif + if (spell_iswordc(ptr + wlen)) + continue; /* next char is a word character */ + +#ifdef FEAT_MBYTE + if (!keepcap && has_mbyte) + { + /* Compute byte length in original word, length may change + * when folding case. */ + p = mip->mi_word; + for (s = ptr; s < ptr + wlen; mb_ptr_adv(s)) + mb_ptr_adv(p); + wlen = p - mip->mi_word; + } +#endif - if (flags & BWF_ALLCAP) - return FALSE; /* need ALLCAP, already checked above */ + /* Check flags and region. Repeat this if there are more + * flags/region alternatives until there is a match. */ + res = SP_BAD; + for (len = byts[arridx - 1]; len > 0 && byts[arridx] == 0; --len) + { + flags = idxs[arridx]; + if (keepcap) + { + /* For "keepcap" tree the case is always right. */ + valid = TRUE; + } + else + { + /* Check that the word is in the required case. */ + if (mip->mi_cend != mip->mi_word + wlen) + { + /* mi_capflags was set for a different word + * length, need to do it again. */ + mip->mi_cend = mip->mi_word + wlen; + mip->mi_capflags = captype(mip->mi_word, + mip->mi_cend); + } + + valid = (mip->mi_capflags == WF_ALLCAP + || ((flags & WF_ALLCAP) == 0 + && ((flags & WF_ONECAP) == 0 + || mip->mi_capflags == WF_ONECAP))); + } - if (flags & BWF_ONECAP) - return capflags == BWF_ONECAP; + if (valid && res != SP_OK) + { + if (flags & WF_REGION) + { + /* Check region. */ + if ((mip->mi_lp->lp_region & (flags >> 8)) != 0) + res = SP_OK; + else + res = SP_LOCAL; + } + else if (flags & WF_RARE) + res = SP_RARE; + else + res = SP_OK; + } - return capflags != BWF_KEEPCAP; /* no case check, only KEEPCAP is bad */ + if (res == SP_OK) + break; + ++arridx; + } + + if (valid) + { + /* Valid word! Always use the longest match. */ + if (mip->mi_end < mip->mi_word + wlen) + mip->mi_end = mip->mi_word + wlen; + if (mip->mi_result != SP_OK) + mip->mi_result = res; + break; + } + } } + /* * Move to next spell error. * Return OK if found, FAIL otherwise. @@ -1181,8 +565,6 @@ spell_move_to(dir, allwords) pos_T found_pos; char_u *line; char_u *p; - int wc; - int nwc; int attr = 0; int len; int has_syntax = syntax_present(curbuf); @@ -1209,77 +591,69 @@ spell_move_to(dir, allwords) { line = ml_get(lnum); p = line; - wc = FALSE; while (*p != NUL) { - nwc = spell_iswordc(p); - if (!wc && nwc) - { - /* When searching backward don't search after the cursor. */ - if (dir == BACKWARD - && lnum == curwin->w_cursor.lnum - && (colnr_T)(p - line) >= curwin->w_cursor.col) - break; + /* When searching backward don't search after the cursor. */ + if (dir == BACKWARD + && lnum == curwin->w_cursor.lnum + && (colnr_T)(p - line) >= curwin->w_cursor.col) + break; - /* start of word */ - len = spell_check(curwin, line, p, &attr); + /* start of word */ + len = spell_check(curwin, p, &attr); - if (attr != 0) + if (attr != 0) + { + /* We found a bad word. Check the attribute. */ + /* TODO: check for syntax @Spell cluster. */ + if (allwords || attr == highlight_attr[HLF_SPB]) { - /* We found a bad word. Check the attribute. */ - /* TODO: check for syntax @Spell cluster. */ - if (allwords || attr == highlight_attr[HLF_SPB]) + /* When searching forward only accept a bad word after + * the cursor. */ + if (dir == BACKWARD + || lnum > curwin->w_cursor.lnum + || (lnum == curwin->w_cursor.lnum + && (colnr_T)(p - line) + > curwin->w_cursor.col)) { - /* When searching forward only accept a bad word after - * the cursor. */ - if (dir == BACKWARD - || lnum > curwin->w_cursor.lnum - || (lnum == curwin->w_cursor.lnum - && (colnr_T)(p - line) - > curwin->w_cursor.col)) + if (has_syntax) { - if (has_syntax) - { - col = p - line; - (void)syn_get_id(lnum, (colnr_T)col, - FALSE, &can_spell); + col = p - line; + (void)syn_get_id(lnum, (colnr_T)col, + FALSE, &can_spell); - /* have to get the line again, a multi-line - * regexp may make it invalid */ - line = ml_get(lnum); - p = line + col; - } - else - can_spell = TRUE; + /* have to get the line again, a multi-line + * regexp may make it invalid */ + line = ml_get(lnum); + p = line + col; + } + else + can_spell = TRUE; - if (can_spell) - { - found_pos.lnum = lnum; - found_pos.col = p - line; + if (can_spell) + { + found_pos.lnum = lnum; + found_pos.col = p - line; #ifdef FEAT_VIRTUALEDIT - found_pos.coladd = 0; + found_pos.coladd = 0; #endif - if (dir == FORWARD) - { - /* No need to search further. */ - curwin->w_cursor = found_pos; - return OK; - } + if (dir == FORWARD) + { + /* No need to search further. */ + curwin->w_cursor = found_pos; + return OK; } } } - attr = 0; } - p += len; - if (*p == NUL) - break; - nwc = FALSE; + attr = 0; } - /* advance to next character */ - mb_ptr_adv(p); - wc = nwc; + /* advance to character after the word */ + p += len; + if (*p == NUL) + break; } /* Advance to next line. */ @@ -1372,21 +746,11 @@ slang_alloc(lang) { slang_T *lp; - lp = (slang_T *)alloc(sizeof(slang_T)); + lp = (slang_T *)alloc_clear(sizeof(slang_T)); if (lp != NULL) { lp->sl_name = vim_strsave(lang); - hash_init(&lp->sl_words); - ga_init2(&lp->sl_preftab, sizeof(hashtab_T), 4); - hash_init(&lp->sl_prewords); - ga_init2(&lp->sl_sufftab, sizeof(hashtab_T), 4); - lp->sl_prefzero = NULL; - lp->sl_suffzero = NULL; - lp->sl_try = NULL; ga_init2(&lp->sl_rep, sizeof(repentry_T), 4); - lp->sl_regions[0] = NUL; - lp->sl_block = NULL; - lp->sl_error = FALSE; } return lp; } @@ -1398,44 +762,13 @@ slang_alloc(lang) slang_free(lp) slang_T *lp; { - sblock_T *sp; - int i; - fword_T *fw; - int todo; - hashitem_T *hi; - vim_free(lp->sl_name); - - /* The words themselves are in memory blocks referenced by "sl_block". - * Only the hashtables for additions need to be cleared. */ - todo = lp->sl_words.ht_used; - for (hi = lp->sl_words.ht_array; todo > 0; ++hi) - { - if (!HASHITEM_EMPTY(hi)) - { - --todo; - fw = HI2FWORD(hi); - if (fw->fw_flags & BWF_ADDHASH) - hash_clear((hashtab_T *)fw->fw_adds); - } - } - hash_clear(&lp->sl_words); - - for (i = 0; i < lp->sl_preftab.ga_len; ++i) - hash_clear(((hashtab_T *)lp->sl_preftab.ga_data) + i); - ga_clear(&lp->sl_preftab); - hash_clear(&lp->sl_prewords); - for (i = 0; i < lp->sl_sufftab.ga_len; ++i) - hash_clear(((hashtab_T *)lp->sl_sufftab.ga_data) + i); - ga_clear(&lp->sl_sufftab); + vim_free(lp->sl_fbyts); + vim_free(lp->sl_kbyts); + vim_free(lp->sl_fidxs); + vim_free(lp->sl_kidxs); ga_clear(&lp->sl_rep); vim_free(lp->sl_try); - while (lp->sl_block != NULL) - { - sp = lp->sl_block; - lp->sl_block = sp->sb_next; - vim_free(sp); - } vim_free(lp); } @@ -1451,41 +784,13 @@ spell_load_file(fname, cookie) slang_T *lp = cookie; FILE *fd; char_u buf[MAXWLEN + 1]; - char_u cbuf[MAXWLEN + 1]; - char_u fbuf[MAXWLEN + 1]; - char_u affixbuf[256 * 2 * 2]; /* max 2 * 256 affix nrs of 2 bytes */ char_u *p; - int itm; int i; - int affcount; - int affnr; - int affflags; - int affitemcnt; - int prefixcnt, suffixcnt; - int bl_used = SBLOCKSIZE; - int widx; - int prefm = 0; /* 1 if <= 256 prefixes, sizeof(short_u) otherw. */ - int suffm = 0; /* 1 if <= 256 suffixes, sizeof(short_u) otherw. */ - int wlen; - int flags; - affitem_T *ai, *ai2, **aip; + int len; int round; char_u *save_sourcing_name = sourcing_name; linenr_T save_sourcing_lnum = sourcing_lnum; int cnt, ccnt; - int choplen; - int addlen; - int leadlen; - int wordcount; - fword_T *fw, *fw2; - garray_T *gap; - hashtab_T *ht; - hashitem_T *hi; - hash_T hash; - int adds; - addword_T *aw, *naw; - int flen; - int xlen; char_u *fol; fd = fopen((char *)fname, "r"); @@ -1532,7 +837,7 @@ formerr: cnt = getc(fd); /* */ if (cnt > 0) { - p = (char_u *)getroom(lp, &bl_used, cnt); + p = alloc((unsigned)cnt); if (p == NULL) goto endFAIL; for (i = 0; i < cnt; ++i) @@ -1540,16 +845,25 @@ formerr: ccnt = (getc(fd) << 8) + getc(fd); /* */ if (ccnt <= 0) + { + vim_free(p); goto formerr; - fol = (char_u *)getroom(lp, &bl_used, ccnt + 1); + } + fol = alloc((unsigned)ccnt + 1); if (fol == NULL) + { + vim_free(p); goto endFAIL; + } for (i = 0; i < ccnt; ++i) fol[i] = getc(fd); /* */ fol[i] = NUL; /* Set the word-char flags and fill spell_isupper() table. */ - if (set_spell_charflags(p, cnt, fol) == FAIL) + i = set_spell_charflags(p, cnt, fol); + vim_free(p); + vim_free(fol); + if (i == FAIL) goto formerr; } else @@ -1560,196 +874,6 @@ formerr: goto formerr; } - /* round 1: : ... - * round 2: : ... */ - for (round = 1; round <= 2; ++round) - { - affcount = (getc(fd) << 8) + getc(fd); /* */ - if (affcount < 0) - goto truncerr; - if (round == 1) - { - gap = &lp->sl_preftab; - aip = &lp->sl_prefzero; - lp->sl_prefcnt = affcount; - prefm = affcount > 256 ? 2 : 1; - } - else - { - gap = &lp->sl_sufftab; - aip = &lp->sl_suffzero; - lp->sl_suffcnt = affcount; - suffm = affcount > 256 ? 2 : 1; - } - - /* - * For each affix NR there can be several affixes. - */ - for (affnr = 0; affnr < affcount; ++affnr) - { - /* : ... */ - affitemcnt = (getc(fd) << 8) + getc(fd); /* */ - if (affitemcnt < 0) - goto truncerr; - for (itm = 0; itm < affitemcnt; ++itm) - { - /* : - * */ - affflags = getc(fd); /* */ - choplen = getc(fd); /* */ - if (choplen < 0) - goto truncerr; - if (choplen >= MAXWLEN) - goto formerr; - for (i = 0; i < choplen; ++i) /* */ - buf[i] = getc(fd); - buf[i] = NUL; - addlen = getc(fd); /* */ - if (addlen < 0) - goto truncerr; - if (affflags & AFF_PREWORD) - xlen = addlen + 2; /* space for lead and trail string */ - else - xlen = 0; - - /* Get room to store the affitem_T, chop and add strings. */ - ai = (affitem_T *)getroom(lp, &bl_used, - sizeof(affitem_T) + addlen + choplen + 1 + xlen); - if (ai == NULL) - goto endFAIL; - - ai->ai_nr = affnr; - ai->ai_flags = affflags; - ai->ai_choplen = choplen; - ai->ai_addlen = addlen; - - /* Chop string is at ai_add[ai_addlen + 1]. */ - p = ai->ai_add + addlen + 1; - STRCPY(p, buf); - - p = ai->ai_add; - for (i = 0; i < addlen; ++i) /* */ - p[i] = getc(fd); - p[i] = NUL; - - if (affflags & AFF_PREWORD) - { - int l, leadoff, trailoff; - - /* - * A preword is a prefix that's recognized as a word: it - * contains a word characters folled by a non-word - * character. - * is the whole prefix. Separate lead and trail - * string, put the word itself at ai_add, so that it can - * be used as hashtable key. - */ - /* lead string: up to first word char */ - while (*p != NUL && !spell_iswordc(p)) - mb_ptr_adv(p); - ai->ai_leadlen = p - ai->ai_add; - leadoff = addlen + choplen + 2; - mch_memmove(ai->ai_add + leadoff, ai->ai_add, - ai->ai_leadlen); - ai->ai_add[leadoff + ai->ai_leadlen] = NUL; - - /* trail string: after last word char */ - while (*p != NUL && spell_iswordc(p)) - mb_ptr_adv(p); - trailoff = leadoff + ai->ai_leadlen + 1; - STRCPY(ai->ai_add + trailoff, p); - ai->ai_taillen = STRLEN(p); - - /* word itself */ - l = (p - ai->ai_add) - ai->ai_leadlen; - mch_memmove(ai->ai_add, ai->ai_add + ai->ai_leadlen, l); - ai->ai_add[l] = NUL; - hash = hash_hash(ai->ai_add); - hi = hash_lookup(&lp->sl_prewords, ai->ai_add, hash); - if (HASHITEM_EMPTY(hi)) - { - /* First preword with this word, add to hashtable. */ - hash_add_item(&lp->sl_prewords, hi, ai->ai_add, hash); - ai->ai_next = NULL; - } - else - { - /* There already is a preword with this word, link in - * the list. */ - ai2 = HI2AI(hi); - ai->ai_next = ai2->ai_next; - ai2->ai_next = ai; - } - } - else - { - /* - * Add the affix to a hashtable. Which one depends on the - * length of the added string in characters. - */ -#ifdef FEAT_MBYTE - /* Change "addlen" from length in bytes to length in - * chars. */ - if (has_mbyte) - addlen = mb_charlen(p); -#endif - if (addlen == 0) - { - /* Link in list of zero length affixes. */ - ai->ai_next = *aip; - *aip = ai; - } - else - { - if (gap->ga_len < addlen) - { - /* Longer affix, need more hashtables. */ - if (ga_grow(gap, addlen - gap->ga_len) == FAIL) - goto endFAIL; - - /* Re-allocating ga_data means that an ht_array - * pointing to ht_smallarray becomes invalid. We - * can recognize this: ht_mask is at its init - * value. */ - for (i = 0; i < gap->ga_len; ++i) - { - ht = ((hashtab_T *)gap->ga_data) + i; - if (ht->ht_mask == HT_INIT_SIZE - 1) - ht->ht_array = ht->ht_smallarray; - } - - /* Init the newly used hashtable(s). */ - while (gap->ga_len < addlen) - { - hash_init(((hashtab_T *)gap->ga_data) - + gap->ga_len); - ++gap->ga_len; - } - } - ht = ((hashtab_T *)gap->ga_data) + addlen - 1; - hash = hash_hash(p); - hi = hash_lookup(ht, p, hash); - if (HASHITEM_EMPTY(hi)) - { - /* First affix with this "ai_add", add to - * hashtable. */ - hash_add_item(ht, hi, p, hash); - ai->ai_next = NULL; - } - else - { - /* There already is an affix with this "ai_add", - * link in the list. */ - ai2 = HI2AI(hi); - ai->ai_next = ai2->ai_next; - ai2->ai_next = ai; - } - } - } - } - } - } - /* : ... */ /* TODO, just skip this for now */ i = (getc(fd) << 24) + (getc(fd) << 16) + (getc(fd) << 8) + getc(fd); @@ -1757,305 +881,48 @@ formerr: if (getc(fd) == EOF) /* */ goto truncerr; - /* : ... */ /* */ - wordcount = (getc(fd) << 24) + (getc(fd) << 16) + (getc(fd) << 8) - + getc(fd); - if (wordcount < 0) - goto truncerr; - - /* Init hashtable for this number of words, so that it doesn't need to - * reallocate the table halfway. */ - hash_lock_size(&lp->sl_words, wordcount); - - for (widx = 0; ; ++widx) + /* round 1: + * round 2: */ + for (round = 1; round <= 2; ++round) { - /* : [] - * [ ] - * [ ...] (prefixes) - * [ ...] (suffixes) - * [] - * [ ...] - */ - /* Use bytes from the previous word. */ - wlen = getc(fd); /* */ - if (wlen < 0) + /* The tree size was computed when writing the file, so that we can + * allocate it as one long block. */ + len = (getc(fd) << 24) + (getc(fd) << 16) + (getc(fd) << 8) + getc(fd); + if (len < 0) + goto truncerr; + if (len > 0) { - if (widx >= wordcount) /* normal way to end the file */ - break; - goto truncerr; - } + /* Allocate the byte array. */ + p = lalloc((long_u)len, TRUE); + if (p == NULL) + goto endFAIL; + if (round == 1) + lp->sl_fbyts = p; + else + lp->sl_kbyts = p; - /* Read further word bytes until one below 0x20, that one must be the - * flags. Keep this fast! */ - for (;;) - { - if ((buf[wlen] = getc(fd)) < 0x20) /* */ - break; - if (++wlen == MAXWLEN) + /* Allocate the index array. */ + p = lalloc_clear((long_u)(len * sizeof(int)), TRUE); + if (p == NULL) + goto endFAIL; + if (round == 1) + lp->sl_fidxs = (int *)p; + else + lp->sl_kidxs = (int *)p; + + + /* Read the tree and store it in the array. */ + i = read_tree(fd, + round == 1 ? lp->sl_fbyts : lp->sl_kbyts, + round == 1 ? lp->sl_fidxs : lp->sl_kidxs, + len, 0); + if (i == -1) + goto truncerr; + if (i < 0) goto formerr; } - flags = buf[wlen]; /* */ - buf[wlen] = NUL; - - /* Get more flags if they're there. */ - if (flags & BWF_SECOND) - flags += getc(fd) << 8; /* */ - - if (flags & BWF_KEEPCAP) - { - /* Read and first, its length may differ from - * the case-folded word. Note: this should only happen after the - * basic word without KEEPCAP! */ - wlen = getc(fd); - if (wlen < 0) - goto truncerr; - if (wlen >= MAXWLEN) - goto formerr; - for (i = 0; i < wlen; ++i) - cbuf[i] = getc(fd); - cbuf[i] = NUL; - } - - /* Optional prefixes */ - p = affixbuf; - if (flags & BWF_PREFIX) - { - cnt = getc(fd); /* */ - if (cnt < 0) - goto truncerr; - prefixcnt = cnt; - for (i = cnt * prefm; --i >= 0; ) /* */ - *p++ = getc(fd); - } - else - prefixcnt = 0; - - /* Optional suffixes */ - if (flags & BWF_SUFFIX) - { - cnt = getc(fd); /* */ - if (cnt < 0) - goto truncerr; - suffixcnt = cnt; - for (i = cnt * suffm; --i >= 0; ) /* */ - *p++ = getc(fd); - } - else - suffixcnt = 0; - - /* Find room to store the word in an fword_T. */ - fw = (fword_T *)getroom(lp, &bl_used, (int)sizeof(fword_T) + wlen - + (p - affixbuf)); - if (fw == NULL) - goto endFAIL; - mch_memmove(fw->fw_word, (flags & BWF_KEEPCAP) ? cbuf : buf, wlen + 1); - - /* Put the affix NRs just after the word, if any. */ - if (p > affixbuf) - mch_memmove(fw->fw_word + wlen + 1, affixbuf, p - affixbuf); - - fw->fw_flags = flags; - fw->fw_prefixcnt = prefixcnt; - fw->fw_suffixcnt = suffixcnt; - - /* We store the word in the hashtable case-folded. For a KEEPCAP word - * the entry must already exist, because fw_word can't be used as the - * key, it differs from "buf"! */ - hash = hash_hash(buf); - hi = hash_lookup(&lp->sl_words, buf, hash); - if (HASHITEM_EMPTY(hi)) - { - if (hash_add_item(&lp->sl_words, hi, fw->fw_word, hash) == FAIL) - goto endFAIL; - fw->fw_next = NULL; - } - else - { - /* Already have this basic word in the hashtable, this one will - * have different case flags and/or affixes. */ - fw2 = HI2FWORD(hi); - fw->fw_next = fw2->fw_next; - fw2->fw_next = fw; - --widx; /* don't count this one as a basic word */ - } - - if (flags & BWF_REGION) - fw->fw_region = getc(fd); /* */ - else - fw->fw_region = REGION_ALL; - - fw->fw_adds = NULL; - if (flags & BWF_ADDS) - { - if (flags & BWF_ADDS_M) - adds = (getc(fd) << 8) + getc(fd); /* */ - else - adds = getc(fd); /* */ - if (adds < 0) - goto formerr; - - if (adds > 30) - { - /* Use a hashtable to lookup the part until the next word end. - * Thus for "de-bur-die" "de" is the basic word, "-bur" is key - * in the addition hashtable, "-burdie" the whole - * addition and "aw_saveb" is '-'. - * This uses more memory and involves some overhead, thus only - * do it when there are many additions (e.g., for French). */ - ht = (hashtab_T *)getroom(lp, &bl_used, sizeof(hashtab_T)); - if (ht == NULL) - goto endFAIL; - hash_init(ht); - fw->fw_adds = (addword_T *)ht; - fw->fw_flags |= BWF_ADDHASH; - - /* Preset the size of the hashtable. It's never unlocked. */ - hash_lock_size(ht, adds + 1); - } - else - ht = NULL; + } - /* - * Note: uses cbuf[] to copy bytes from previous addition. - */ - while (--adds >= 0) - { - /* : [] [] - * [] [] */ - flags = getc(fd); /* */ - addlen = getc(fd); /* */ - if (addlen < 0) - goto truncerr; - if (addlen >= MAXWLEN) - goto formerr; - - if (flags & ADD_LEADLEN) - { - leadlen = getc(fd); /* */ - if (leadlen > addlen) - goto formerr; - } - else - leadlen = 0; - - if (addlen > 0) - { - if (flags & ADD_COPYLEN) - i = getc(fd); /* */ - else - i = 0; - for ( ; i < addlen; ++i) /* */ - cbuf[i] = getc(fd); - cbuf[i] = NUL; - } - - if (flags & ADD_KEEPCAP) - { - /* is in original case, need to get - * case-folded word too. */ - (void)spell_casefold(cbuf, addlen, fbuf, MAXWLEN); - flen = addlen - leadlen + 1; - addlen = STRLEN(fbuf); - } - else - flen = 0; - - aw = (addword_T *)getroom(lp, &bl_used, - sizeof(addword_T) + addlen + flen); - if (aw == NULL) - goto endFAIL; - - if (flags & ADD_KEEPCAP) - { - /* Put the addition in original case after the case-folded - * string. */ - STRCPY(aw->aw_word, fbuf); - STRCPY(aw->aw_word + addlen + 1, cbuf + leadlen); - } - else - STRCPY(aw->aw_word, cbuf); - - aw->aw_flags = flags; - aw->aw_wordlen = addlen; - aw->aw_leadlen = leadlen; - - if (flags & ADD_REGION) - aw->aw_region = getc(fd); /* */ - else - aw->aw_region = REGION_ALL; - - if (ht == NULL) - { - /* Using simple linked list, put it in front. */ - aw->aw_next = fw->fw_adds; - fw->fw_adds = aw; - aw->aw_saveb = NUL; - } - else - { - /* Put addition in hashtable. For key we use the part up - * to the next end-of-word. */ - if (leadlen == 0) - { - p = aw->aw_word; - while (*p != NUL && !spell_iswordc(p)) - mb_ptr_adv(p); - } - - if (leadlen != 0 || *p == NUL) - { - /* Only non-word characters in addition, add it to the - * list with the special key NOWC_KEY. Also do this - * when there is a leadstring, it would get too - * complicated. */ - hash = hash_hash(NOWC_KEY); - hi = hash_lookup(ht, NOWC_KEY, hash); - if (HASHITEM_EMPTY(hi)) - { - /* we use a dummy item as the list header */ - naw = (addword_T *)getroom(lp, &bl_used, - sizeof(addword_T) + STRLEN(NOWC_KEY)); - if (naw == NULL) - goto endFAIL; - STRCPY(naw->aw_word, NOWC_KEY); - hash_add_item(ht, hi, naw->aw_word, hash); - naw->aw_next = aw; - aw->aw_next = NULL; - } - else - { - naw = HI2ADDWORD(hi); - aw->aw_next = naw->aw_next; - naw->aw_next = aw; - } - aw->aw_saveb = NUL; - } - else - { - /* Truncate at next non-word character, store that - * byte in "aw_saveb". */ - while (*p != NUL && spell_iswordc(p)) - mb_ptr_adv(p); - aw->aw_saveb = *p; - *p = NUL; - hash = hash_hash(aw->aw_word); - hi = hash_lookup(ht, aw->aw_word, hash); - if (HASHITEM_EMPTY(hi)) - { - hash_add_item(ht, hi, aw->aw_word, hash); - aw->aw_next = NULL; - } - else - { - naw = HI2ADDWORD(hi); - aw->aw_next = naw->aw_next; - naw->aw_next = aw; - } - } - } - } - } - } goto endOK; endFAIL: @@ -2064,40 +931,97 @@ endFAIL: endOK: if (fd != NULL) fclose(fd); - hash_unlock(&lp->sl_words); sourcing_name = save_sourcing_name; sourcing_lnum = save_sourcing_lnum; } /* - * Get part of an sblock_T, at least "len" bytes long. - * Returns NULL when out of memory. + * Read one row of siblings from the spell file and store it in the byte array + * "byts" and index array "idxs". Recursively read the children. + * + * NOTE: The code here must match put_tree(). + * + * Returns the index follosing the siblings. + * Returns -1 if the file is shorter than expected. + * Returns -2 if there is a format error. */ - static void * -getroom(lp, bl_used, len) - slang_T *lp; /* lp->sl_block is current block or NULL */ - int *bl_used; /* used up from current block */ - int len; /* length needed */ + static int +read_tree(fd, byts, idxs, maxidx, startidx) + FILE *fd; + char_u *byts; + int *idxs; + int maxidx; /* size of arrays */ + int startidx; /* current index in "byts" and "idxs" */ { - char_u *p; - sblock_T *bl = lp->sl_block; + int len; + int i; + int n; + int idx = startidx; + int c; +#define SHARED_MASK 0x8000000 - if (bl == NULL || *bl_used + len > SBLOCKSIZE) + len = getc(fd); /* */ + if (len <= 0) + return -1; + + if (startidx + len >= maxidx) + return -2; + byts[idx++] = len; + + /* Read the byte values, flag/region bytes and shared indexes. */ + for (i = 1; i <= len; ++i) { - /* Allocate a block of memory. This is not freed until spell_reload() - * is called. */ - bl = (sblock_T *)alloc((unsigned)(sizeof(sblock_T) + SBLOCKSIZE)); - if (bl == NULL) - return NULL; - bl->sb_next = lp->sl_block; - lp->sl_block = bl; - *bl_used = 0; + c = getc(fd); /* */ + if (c < 0) + return -1; + if (c <= BY_SPECIAL) + { + if (c == BY_NOFLAGS) + { + /* No flags, all regions. */ + idxs[idx] = 0; + c = 0; + } + else if (c == BY_FLAGS) + { + /* Read flags and option region. */ + c = getc(fd); /* */ + if (c & WF_REGION) + c = (getc(fd) << 8) + c; /* */ + idxs[idx] = c; + c = 0; + } + else /* c == BY_INDEX */ + { + /* */ + n = (getc(fd) << 16) + (getc(fd) << 8) + getc(fd); + if (n < 0 || n >= maxidx) + return -2; + idxs[idx] = n + SHARED_MASK; + c = getc(fd); /* */ + } + } + byts[idx++] = c; } - p = bl->sb_data + *bl_used; - *bl_used += len; + /* Recursively read the children for non-shared siblings. + * Skip the end-of-word ones (zero byte value) and the shared ones (and + * remove SHARED_MASK) */ + for (i = 1; i <= len; ++i) + if (byts[startidx + i] != 0) + { + if (idxs[startidx + i] & SHARED_MASK) + idxs[startidx + i] &= ~SHARED_MASK; + else + { + idxs[startidx + i] = idx; + idx = read_tree(fd, byts, idxs, maxidx, idx); + if (idx < 0) + break; + } + } - return p; + return idx; } /* @@ -2226,9 +1150,9 @@ find_region(rp, region) /* * Return type of word: * w word 0 - * Word BWF_ONECAP - * W WORD BWF_ALLCAP - * WoRd wOrd BWF_KEEPCAP + * Word WF_ONECAP + * W WORD WF_ALLCAP + * WoRd wOrd WF_KEEPCAP */ static int captype(word, end) @@ -2268,19 +1192,19 @@ captype(word, end) { /* UUl -> KEEPCAP */ if (past_second && allcap) - return BWF_KEEPCAP; + return WF_KEEPCAP; allcap = FALSE; } else if (!allcap) /* UlU -> KEEPCAP */ - return BWF_KEEPCAP; + return WF_KEEPCAP; past_second = TRUE; } if (allcap) - return BWF_ALLCAP; + return WF_ALLCAP; if (firstcap) - return BWF_ONECAP; + return WF_ONECAP; return 0; } @@ -2316,20 +1240,6 @@ spell_reload() } # endif -/* - * Recognizing words uses a two-step mechanism: - * 1. Locate a basic word, made out of word characters only and separated by - * non-word characters. - * 2. When a basic word is found, check if (possibly required) additions - * before and after the word are present. - * - * Both mechanisms use affixes (prefixes and suffixes) to reduce the number of - * words. When no matching word was found in the hashtable the start of the - * word is checked for matching prefixes and the end of the word for matching - * suffixes. All matching affixes are removed and then the resulting word is - * searched for. If found it is checked if it supports the used affix. - */ - #if defined(FEAT_MBYTE) || defined(PROTO) /* @@ -2337,7 +1247,7 @@ spell_reload() * Only possible with the multi-byte feature. */ -#define MAXLINELEN 300 /* Maximum length in bytes of a line in a .aff +#define MAXLINELEN 500 /* Maximum length in bytes of a line in a .aff and .dic file. */ /* * Main structure to store the contents of a ".aff" file. @@ -2352,132 +1262,100 @@ typedef struct afffile_S } afffile_T; typedef struct affentry_S affentry_T; - -/* Affix header from ".aff" file. Used for af_pref and af_suff. */ -typedef struct affheader_S -{ - char_u ah_key[2]; /* key for hashtable == name of affix entry */ - int ah_combine; - affentry_T *ah_first; /* first affix entry */ - short_u ah_affnr; /* used in get_new_aff() */ -} affheader_T; - -#define HI2AH(hi) ((affheader_T *)(hi)->hi_key) - /* Affix entry from ".aff" file. Used for prefixes and suffixes. */ struct affentry_S { affentry_T *ae_next; /* next affix with same name/number */ char_u *ae_chop; /* text to chop off basic word (can be NULL) */ char_u *ae_add; /* text to add to basic word (can be NULL) */ - char_u *ae_add_nw; /* For a suffix: first non-word char in - * "ae_add"; for a prefix with only non-word - * chars: equal to "ae_add", for a prefix with - * word and non-word chars: first non-word - * char after word char. NULL otherwise. */ - char_u *ae_add_pw; /* For a prefix with both word and non-word - * chars: first word char. NULL otherwise. */ - char_u ae_preword; /* TRUE for a prefix with one word */ char_u *ae_cond; /* condition (NULL for ".") */ regprog_T *ae_prog; /* regexp program for ae_cond or NULL */ - short_u ae_affnr; /* for old affix: new affix number */ +}; + +/* Affix header from ".aff" file. Used for af_pref and af_suff. */ +typedef struct affheader_S +{ + char_u ah_key[2]; /* key for hashtable == name of affix entry */ + int ah_combine; /* suffix may combine with prefix */ + affentry_T *ah_first; /* first affix entry */ +} affheader_T; + +#define HI2AH(hi) ((affheader_T *)(hi)->hi_key) + +/* + * Structure that is used to store the items in the word tree. This avoids + * the need to keep track of each allocated thing, it's freed all at once + * after ":mkspell" is done. + */ +#define SBLOCKSIZE 16000 /* size of sb_data */ +typedef struct sblock_S sblock_T; +struct sblock_S +{ + sblock_T *sb_next; /* next block in list */ + int sb_used; /* nr of bytes already in use */ + char_u sb_data[1]; /* data, actually longer */ }; /* - * Structure to store a word from a ".dic" file. + * A node in the tree. */ -typedef struct dicword_S +typedef struct wordnode_S wordnode_T; +struct wordnode_S { - char_u *dw_affnm; /* original affix names */ - char_u dw_word[1]; /* actually longer: the word in 'encoding' */ -} dicword_T; - -static dicword_T dumdw; -#define HI2DW(hi) ((dicword_T *)((hi)->hi_key - (dumdw.dw_word - (char_u *)&dumdw))) - -/* - * Structure to store a basic word for the spell file. - * This is used for ":mkspell", not for spell checking. - */ -typedef struct basicword_S basicword_T; -struct basicword_S -{ - basicword_T *bw_next; /* next word with same basic word */ - basicword_T *bw_cnext; /* next word with same caps */ - int bw_flags; /* BWF_ flags */ - garray_T bw_prefix; /* table with prefix numbers */ - garray_T bw_suffix; /* table with suffix numbers */ - int bw_region; /* region bits */ - char_u *bw_caseword; /* keep-case word or NULL */ - char_u *bw_leadstring; /* must come before bw_word or NULL */ - char_u *bw_addstring; /* must come after bw_word or NULL */ - char_u bw_word[1]; /* actually longer: word case folded */ + char_u wn_hashkey[6]; /* room for the hash key */ + wordnode_T *wn_next; /* next node with same hash key */ + wordnode_T *wn_child; /* child (next byte in word) */ + wordnode_T *wn_sibling; /* next sibling (alternate byte in word, + always sorted) */ + wordnode_T *wn_wnode; /* parent node that will write this node */ + int wn_index; /* index in written nodes (valid after first + round) */ + char_u wn_byte; /* Byte for this node. NUL for word end */ + char_u wn_flags; /* when wn_byte is NUL: WF_ flags */ + char_u wn_region; /* when wn_byte is NUL: region mask */ }; -static basicword_T dumbw; -#define KEY2BW(p) ((basicword_T *)((p) - (dumbw.bw_word - (char_u *)&dumbw))) -#define HI2BW(hi) KEY2BW((hi)->hi_key) +#define HI2WN(hi) (wordnode_T *)((hi)->hi_key) -/* Store the affix number related with a certain string. */ -typedef struct affhash_S -{ - short_u as_nr; /* the affix nr */ - char_u as_word[1]; /* actually longer */ -} affhash_T; - -static affhash_T dumas; -#define HI2AS(hi) ((affhash_T *)((hi)->hi_key - (dumas.as_word - (char_u *)&dumas))) - -/* info for writing the spell file */ -typedef struct winfo_S +/* + * Info used while reading the spell files. + */ +typedef struct spellinfo_S { - FILE *wif_fd; - basicword_T *wif_prevbw; /* last written basic word */ - int wif_regionmask; /* regions supported */ - int wif_prefm; /* 1 or 2 bytes used for prefix NR */ - int wif_suffm; /* 1 or 2 bytes used for suffix NR */ - long wif_wcount; /* written word count */ - long wif_acount; /* written addition count */ - long wif_addmax; /* max number of additions on one word */ - char_u *wif_addmaxw; /* word with max additions */ -} winfo_T; + wordnode_T *si_foldroot; /* tree with case-folded words */ + wordnode_T *si_keeproot; /* tree with keep-case words */ + sblock_T *si_blocks; /* memory blocks used */ + int si_ascii; /* handling only ASCII words */ + int si_region; /* region mask */ + vimconv_T si_conv; /* for conversion to 'encoding' */ +} spellinfo_T; - -static afffile_T *spell_read_aff __ARGS((char_u *fname, vimconv_T *conv, int ascii)); -static void spell_free_aff __ARGS((afffile_T *aff)); +static afffile_T *spell_read_aff __ARGS((char_u *fname, spellinfo_T *spin)); static int has_non_ascii __ARGS((char_u *s)); -static int spell_read_dic __ARGS((hashtab_T *ht, char_u *fname, vimconv_T *conv, int ascii)); -static int get_new_aff __ARGS((hashtab_T *oldaff, garray_T *gap, int prefix)); -static void spell_free_dic __ARGS((hashtab_T *dic)); -static int same_affentries __ARGS((affheader_T *ah1, affheader_T *ah2)); -static void add_affhash __ARGS((hashtab_T *ht, char_u *key, int newnr)); -static void clear_affhash __ARGS((hashtab_T *ht)); -static void trans_affixes __ARGS((dicword_T *dw, basicword_T *bw, afffile_T *oldaff, hashtab_T *newwords)); -static int build_wordlist __ARGS((hashtab_T *newwords, hashtab_T *oldwords, afffile_T *oldaff, int regionmask)); -static basicword_T *get_basicword __ARGS((char_u *word, int asize)); -static void combine_regions __ARGS((hashtab_T *newwords)); -static int same_affixes __ARGS((basicword_T *bw, basicword_T *nbw)); -static int expand_affixes __ARGS((hashtab_T *newwords, garray_T *prefgap, garray_T *suffgap)); -static int expand_one_aff __ARGS((basicword_T *bw, garray_T *add_words, affentry_T *pae, affentry_T *sae)); -static int add_to_wordlist __ARGS((hashtab_T *newwords, basicword_T *bw)); -static void write_affix __ARGS((FILE *fd, affheader_T *ah)); -static void write_affixlist __ARGS((FILE *fd, garray_T *aff, int bytes)); -static void write_vim_spell __ARGS((char_u *fname, garray_T *prefga, garray_T *suffga, hashtab_T *newwords, int regcount, char_u *regchars, int ascii)); -static void write_bword __ARGS((winfo_T *wif, basicword_T *bw, int lowcap)); -static void free_wordtable __ARGS((hashtab_T *ht)); -static void free_basicword __ARGS((basicword_T *bw)); -static void free_affixentries __ARGS((affentry_T *first)); -static void free_affix_entry __ARGS((affentry_T *ap)); +static void spell_free_aff __ARGS((afffile_T *aff)); +static int spell_read_dic __ARGS((char_u *fname, spellinfo_T *spin, afffile_T *affile)); +static int store_aff_word __ARGS((char_u *word, spellinfo_T *spin, char_u *afflist, hashtab_T *ht, hashtab_T *xht, int comb)); +static int spell_read_wordfile __ARGS((char_u *fname, spellinfo_T *spin)); +static void *getroom __ARGS((sblock_T **blp, size_t len)); +static char_u *getroom_save __ARGS((sblock_T **blp, char_u *s)); +static void free_blocks __ARGS((sblock_T *bl)); +static wordnode_T *wordtree_alloc __ARGS((sblock_T **blp)); +static int store_word __ARGS((char_u *word, spellinfo_T *spin)); +static int tree_add_word __ARGS((char_u *word, wordnode_T *tree, int flags, int region, sblock_T **blp)); +static void wordtree_compress __ARGS((wordnode_T *root)); +static int node_compress __ARGS((wordnode_T *node, hashtab_T *ht, int *tot)); +static int node_equal __ARGS((wordnode_T *n1, wordnode_T *n2)); +static void write_vim_spell __ARGS((char_u *fname, spellinfo_T *spin, int regcount, char_u *regchars)); +static int put_tree __ARGS((FILE *fd, wordnode_T *node, int index, int regionmask)); /* * Read an affix ".aff" file. * Returns an afffile_T, NULL for failure. */ static afffile_T * -spell_read_aff(fname, conv, ascii) +spell_read_aff(fname, spin) char_u *fname; - vimconv_T *conv; /* info for encoding conversion */ - int ascii; /* Only accept ASCII characters */ + spellinfo_T *spin; { FILE *fd; afffile_T *aff; @@ -2495,6 +1373,9 @@ spell_read_aff(fname, conv, ascii) char_u *fol = NULL; char_u *upp = NULL; + /* + * Open the file. + */ fd = fopen((char *)fname, "r"); if (fd == NULL) { @@ -2505,7 +1386,10 @@ spell_read_aff(fname, conv, ascii) smsg((char_u *)_("Reading affix file %s..."), fname); out_flush(); - aff = (afffile_T *)alloc_clear((unsigned)sizeof(afffile_T)); + /* + * Allocate and init the afffile_T structure. + */ + aff = (afffile_T *)getroom(&spin->si_blocks, sizeof(afffile_T)); if (aff == NULL) return NULL; hash_init(&aff->af_pref); @@ -2526,9 +1410,9 @@ spell_read_aff(fname, conv, ascii) /* Convert from "SET" to 'encoding' when needed. */ vim_free(pc); - if (conv->vc_type != CONV_NONE) + if (spin->si_conv.vc_type != CONV_NONE) { - pc = string_convert(conv, rline, NULL); + pc = string_convert(&spin->si_conv, rline, NULL); if (pc == NULL) { smsg((char_u *)_("Conversion failure for word in %s line %d: %s"), @@ -2552,8 +1436,10 @@ spell_read_aff(fname, conv, ascii) ++p; if (*p == NUL) break; + if (itemcnt == 6) /* too many items */ + break; items[itemcnt++] = p; - while (*p > ' ') /* skip until white space or CR/NL */ + while (*p > ' ') /* skip until white space or CR/NL */ ++p; if (*p == NUL) break; @@ -2566,29 +1452,27 @@ spell_read_aff(fname, conv, ascii) if (STRCMP(items[0], "SET") == 0 && itemcnt == 2 && aff->af_enc == NULL) { - if (aff->af_enc != NULL) - smsg((char_u *)_("Duplicate SET line ignored in %s line %d: %s"), - fname, lnum, line); - else - { - /* Setup for conversion from "ENC" to 'encoding'. */ - aff->af_enc = enc_canonize(items[1]); - if (aff->af_enc != NULL && !ascii - && convert_setup(conv, aff->af_enc, p_enc) == FAIL) - smsg((char_u *)_("Conversion in %s not supported: from %s to %s"), - fname, aff->af_enc, p_enc); - } + /* Setup for conversion from "ENC" to 'encoding'. */ + aff->af_enc = enc_canonize(items[1]); + if (aff->af_enc != NULL && !spin->si_ascii + && convert_setup(&spin->si_conv, aff->af_enc, + p_enc) == FAIL) + smsg((char_u *)_("Conversion in %s not supported: from %s to %s"), + fname, aff->af_enc, p_enc); } else if (STRCMP(items[0], "TRY") == 0 && itemcnt == 2 && aff->af_try == NULL) - aff->af_try = vim_strsave(items[1]); + { + aff->af_try = getroom_save(&spin->si_blocks, items[1]); + } else if ((STRCMP(items[0], "PFX") == 0 || STRCMP(items[0], "SFX") == 0) && aff_todo == 0 && itemcnt == 4) { /* New affix letter. */ - cur_aff = (affheader_T *)alloc((unsigned)sizeof(affheader_T)); + cur_aff = (affheader_T *)getroom(&spin->si_blocks, + sizeof(affheader_T)); if (cur_aff == NULL) break; cur_aff->ah_key[0] = *items[1]; @@ -2598,27 +1482,22 @@ spell_read_aff(fname, conv, ascii) fname, lnum, items[1]); if (*items[2] == 'Y') cur_aff->ah_combine = TRUE; - else if (*items[2] == 'N') - cur_aff->ah_combine = FALSE; - else if (p_verbose > 0) - { - verbose_enter(); + else if (*items[2] != 'N') smsg((char_u *)_("Expected Y or N in %s line %d: %s"), fname, lnum, items[2]); - verbose_leave(); - } - cur_aff->ah_first = NULL; if (*items[0] == 'P') tp = &aff->af_pref; else tp = &aff->af_suff; + aff_todo = atoi((char *)items[3]); if (!HASHITEM_EMPTY(hash_find(tp, cur_aff->ah_key))) + { smsg((char_u *)_("Duplicate affix in %s line %d: %s"), fname, lnum, items[1]); + aff_todo = 0; + } else hash_add(tp, cur_aff->ah_key); - - aff_todo = atoi((char *)items[3]); } else if ((STRCMP(items[0], "PFX") == 0 || STRCMP(items[0], "SFX") == 0) @@ -2630,38 +1509,39 @@ spell_read_aff(fname, conv, ascii) /* New item for an affix letter. */ --aff_todo; - aff_entry = (affentry_T *)alloc_clear( - (unsigned)sizeof(affentry_T)); + aff_entry = (affentry_T *)getroom(&spin->si_blocks, + sizeof(affentry_T)); if (aff_entry == NULL) break; if (STRCMP(items[2], "0") != 0) - aff_entry->ae_chop = vim_strsave(items[2]); + aff_entry->ae_chop = getroom_save(&spin->si_blocks, + items[2]); if (STRCMP(items[3], "0") != 0) - aff_entry->ae_add = vim_strsave(items[3]); - if (STRCMP(items[4], ".") != 0) - { - char_u buf[MAXLINELEN]; + aff_entry->ae_add = getroom_save(&spin->si_blocks, + items[3]); - aff_entry->ae_cond = vim_strsave(items[4]); - if (*items[0] == 'P') - sprintf((char *)buf, "^%s", items[4]); - else - sprintf((char *)buf, "%s$", items[4]); - aff_entry->ae_prog = vim_regcomp(buf, RE_MAGIC + RE_STRING); - } - - if (ascii && (has_non_ascii(aff_entry->ae_chop) + /* Don't use an affix entry with non-ASCII characters when + * "spin->si_ascii" is TRUE. */ + if (!spin->si_ascii || !(has_non_ascii(aff_entry->ae_chop) || has_non_ascii(aff_entry->ae_add))) { - /* Don't use an affix entry with non-ASCII characters when - * "ascii" is TRUE. */ - free_affix_entry(aff_entry); - } - else - { aff_entry->ae_next = cur_aff->ah_first; cur_aff->ah_first = aff_entry; + + if (STRCMP(items[4], ".") != 0) + { + char_u buf[MAXLINELEN]; + + aff_entry->ae_cond = getroom_save(&spin->si_blocks, + items[4]); + if (*items[0] == 'P') + sprintf((char *)buf, "^%s", items[4]); + else + sprintf((char *)buf, "%s$", items[4]); + aff_entry->ae_prog = vim_regcomp(buf, + RE_MAGIC + RE_STRING); + } } } else if (STRCMP(items[0], "FOL") == 0 && itemcnt == 2) @@ -2698,26 +1578,21 @@ spell_read_aff(fname, conv, ascii) if (ga_grow(&aff->af_rep, 1) == FAIL) break; rp = ((repentry_T *)aff->af_rep.ga_data) + aff->af_rep.ga_len; - rp->re_from = vim_strsave(items[1]); - rp->re_to = vim_strsave(items[2]); + rp->re_from = getroom_save(&spin->si_blocks, items[1]); + rp->re_to = getroom_save(&spin->si_blocks, items[2]); ++aff->af_rep.ga_len; } - else if (p_verbose > 0) - { - verbose_enter(); + else smsg((char_u *)_("Unrecognized item in %s line %d: %s"), fname, lnum, items[0]); - verbose_leave(); - } } - } if (fol != NULL || low != NULL || upp != NULL) { /* Don't write a word table for an ASCII file, so that we don't check * for conflicts with a word table that matches 'encoding'. */ - if (!ascii) + if (!spin->si_ascii) { if (fol == NULL || low == NULL || upp == NULL) smsg((char_u *)_("Missing FOL/LOW/UPP line in %s"), fname); @@ -2762,13 +1637,12 @@ spell_free_aff(aff) hashtab_T *ht; hashitem_T *hi; int todo; - int i; - repentry_T *rp; affheader_T *ah; + affentry_T *ae; vim_free(aff->af_enc); - vim_free(aff->af_try); + /* All this trouble to foree the "ae_prog" items... */ for (ht = &aff->af_pref; ; ht = &aff->af_suff) { todo = ht->ht_used; @@ -2778,42 +1652,33 @@ spell_free_aff(aff) { --todo; ah = HI2AH(hi); - free_affixentries(ah->ah_first); - vim_free(ah); + for (ae = ah->ah_first; ae != NULL; ae = ae->ae_next) + vim_free(ae->ae_prog); } } if (ht == &aff->af_suff) break; } + hash_clear(&aff->af_pref); hash_clear(&aff->af_suff); - - for (i = 0; i < aff->af_rep.ga_len; ++i) - { - rp = ((repentry_T *)aff->af_rep.ga_data) + i; - vim_free(rp->re_from); - vim_free(rp->re_to); - } ga_clear(&aff->af_rep); - - vim_free(aff); } /* - * Read a dictionary ".dic" file. + * Read dictionary file "fname". * Returns OK or FAIL; - * Each entry in the hashtab_T is a dicword_T. */ static int -spell_read_dic(ht, fname, conv, ascii) - hashtab_T *ht; +spell_read_dic(fname, spin, affile) char_u *fname; - vimconv_T *conv; /* info for encoding conversion */ - int ascii; /* only accept ASCII words */ + spellinfo_T *spin; + afffile_T *affile; { + hashtab_T ht; char_u line[MAXLINELEN]; - char_u *p; - dicword_T *dw; + char_u *afflist; + char_u *dw; char_u *pc; char_u *w; int l; @@ -2821,7 +1686,13 @@ spell_read_dic(ht, fname, conv, ascii) hashitem_T *hi; FILE *fd; int lnum = 1; + int non_ascii = 0; + int retval = OK; + char_u message[MAXLINELEN + MAXWLEN]; + /* + * Open the file. + */ fd = fopen((char *)fname, "r"); if (fd == NULL) { @@ -2829,6 +1700,9 @@ spell_read_dic(ht, fname, conv, ascii) return FAIL; } + /* The hashtable is only used to detect duplicated words. */ + hash_init(&ht); + smsg((char_u *)_("Reading dictionary file %s..."), fname); out_flush(); @@ -2847,7 +1721,8 @@ spell_read_dic(ht, fname, conv, ascii) line_breakcheck(); ++lnum; - /* Remove CR, LF and white space from end. */ + /* Remove CR, LF and white space from the end. White space halfway + * the word is kept to allow e.g., "et al.". */ l = STRLEN(line); while (l > 0 && line[l - 1] <= ' ') --l; @@ -2855,19 +1730,35 @@ spell_read_dic(ht, fname, conv, ascii) continue; /* empty line */ line[l] = NUL; + /* This takes time, print a message now and then. */ + if ((lnum & 0x3ff) == 0) + { + vim_snprintf((char *)message, sizeof(message), + _("line %6d - %s"), lnum, line); + msg_start(); + msg_outtrans_attr(message, 0); + msg_clr_eos(); + msg_didout = FALSE; + msg_col = 0; + out_flush(); + } + /* Find the optional affix names. */ - p = vim_strchr(line, '/'); - if (p != NULL) - *p++ = NUL; + afflist = vim_strchr(line, '/'); + if (afflist != NULL) + *afflist++ = NUL; - /* Skip non-ASCII words when "ascii" is TRUE. */ - if (ascii && has_non_ascii(line)) + /* Skip non-ASCII words when "spin->si_ascii" is TRUE. */ + if (spin->si_ascii && has_non_ascii(line)) + { + ++non_ascii; continue; + } /* Convert from "SET" to 'encoding' when needed. */ - if (conv->vc_type != CONV_NONE) + if (spin->si_conv.vc_type != CONV_NONE) { - pc = string_convert(conv, line, NULL); + pc = string_convert(&spin->si_conv, line, NULL); if (pc == NULL) { smsg((char_u *)_("Conversion failure for word in %s line %d: %s"), @@ -2882,285 +1773,146 @@ spell_read_dic(ht, fname, conv, ascii) w = line; } - dw = (dicword_T *)alloc_clear((unsigned)sizeof(dicword_T) - + STRLEN(w)); + /* Store the word in the hashtable to be able to find duplicates. */ + dw = (char_u *)getroom_save(&spin->si_blocks, w); if (dw == NULL) - { - vim_free(pc); + retval = FAIL; + vim_free(pc); + if (retval == FAIL) break; - } - STRCPY(dw->dw_word, w); - vim_free(pc); - hash = hash_hash(dw->dw_word); - hi = hash_lookup(ht, dw->dw_word, hash); + hash = hash_hash(dw); + hi = hash_lookup(&ht, dw, hash); if (!HASHITEM_EMPTY(hi)) smsg((char_u *)_("Duplicate word in %s line %d: %s"), - fname, lnum, line); + fname, lnum, line); else - hash_add_item(ht, hi, dw->dw_word, hash); + hash_add_item(&ht, hi, dw, hash); + + /* Add the word to the word tree(s). */ + if (store_word(dw, spin) == FAIL) + retval = FAIL; - if (p != NULL) - dw->dw_affnm = vim_strsave(p); + if (afflist != NULL) + { + /* Find all matching suffixes and add the resulting words. + * Additionally do matching prefixes that combine. */ + if (store_aff_word(dw, spin, afflist, + &affile->af_suff, &affile->af_pref, FALSE) == FAIL) + retval = FAIL; + + /* Find all matching prefixes and add the resulting words. */ + if (store_aff_word(dw, spin, afflist, + &affile->af_pref, NULL, FALSE) == FAIL) + retval = FAIL; + } } + if (spin->si_ascii && non_ascii > 0) + smsg((char_u *)_("Ignored %d words with non-ASCII characters"), + non_ascii); + hash_clear(&ht); + fclose(fd); - return OK; + return retval; } /* - * Free the structure filled by spell_read_dic(). + * Apply affixes to a word and store the resulting words. + * "ht" is the hashtable with affentry_T that need to be applied, either + * prefixes or suffixes. + * "xht", when not NULL, is the prefix hashtable, to be used additionally on + * the resulting words for combining affixes. + * + * Returns FAIL when out of memory. */ - static void -spell_free_dic(dic) - hashtab_T *dic; + static int +store_aff_word(word, spin, afflist, ht, xht, comb) + char_u *word; /* basic word start */ + spellinfo_T *spin; /* spell info */ + char_u *afflist; /* list of names of supported affixes */ + hashtab_T *ht; + hashtab_T *xht; + int comb; /* only use affixes that combine */ { int todo; - dicword_T *dw; hashitem_T *hi; + affheader_T *ah; + affentry_T *ae; + regmatch_T regmatch; + char_u newword[MAXWLEN]; + int retval = OK; + int i; + char_u *p; - todo = dic->ht_used; - for (hi = dic->ht_array; todo > 0; ++hi) + todo = ht->ht_used; + for (hi = ht->ht_array; todo > 0 && retval == OK; ++hi) { if (!HASHITEM_EMPTY(hi)) { --todo; - dw = HI2DW(hi); - vim_free(dw->dw_affnm); - vim_free(dw); - } - } - hash_clear(dic); -} - -/* - * Take the affixes read by spell_read_aff() and add them to the new list. - * Attempts to re-use the same number for identical affixes (ignoring the - * condition, since we remove that). That is especially important when using - * multiple regions. - * Returns OK or FAIL; - */ - static int -get_new_aff(oldaff, gap, prefix) - hashtab_T *oldaff; /* hashtable with affheader_T */ - garray_T *gap; /* table with new affixes */ - int prefix; /* TRUE when doing prefixes, FALSE for - suffixes */ -{ - int oldtodo; - affheader_T *oldah, *newah, *gapah; - affentry_T *oldae, *newae; - hashitem_T *oldhi; - hashitem_T *hi; - hashtab_T condht; /* conditions already found */ - char_u condkey[MAXLINELEN]; - int newnr; - int gapnr; - int retval = OK; - char_u *p; - garray_T tga; - int preword; + ah = HI2AH(hi); - /* - * Loop over all the old affix names. - */ - oldtodo = oldaff->ht_used; - for (oldhi = oldaff->ht_array; oldtodo > 0 && retval == OK; ++oldhi) - { - if (!HASHITEM_EMPTY(oldhi)) - { - --oldtodo; - oldah = (affheader_T *)oldhi->hi_key; - - /* Put entries with the same condition under the same new affix - * nr in "tga". Use hashtable "condht" to find them. */ - ga_init2(&tga, sizeof(affheader_T), 10); - hash_init(&condht); - - /* - * Loop over all affixes with the same name. - * The affixes with the same condition will get the same number, - * since they can be used with the same words. - * 1. build the lists of new affentry_T, with the headers in "tga". - * 2. Check if some of the lists already exist in "gap", re-use - * their number. - * 3. Assign the new numbers to the old affixes. - */ - - /* 1. build the lists of new affentry_T. */ - for (oldae = oldah->ah_first; oldae != NULL && retval == OK; - oldae = oldae->ae_next) + /* Check that the affix combines, if required, and that the word + * supports this affix. */ + if ((!comb || ah->ah_combine) + && vim_strchr(afflist, *ah->ah_key) != NULL) { - preword = FALSE; - oldae->ae_add_nw = NULL; - oldae->ae_add_pw = NULL; - if (oldae->ae_add != NULL) + /* Loop over all affix entries with this name. */ + for (ae = ah->ah_first; ae != NULL; ae = ae->ae_next) { - /* Check for non-word characters in the affix. If there - * is one a suffix will be turned into an addition, a - * prefix may be turned into a leadstring. - * This is stored with the old affix, that is where - * trans_affixes() will check. */ - for (p = oldae->ae_add; *p != NUL; mb_ptr_adv(p)) - if (!spell_iswordc(p)) + /* Check the condition. It's not logical to match case + * here, but it is required for compatibility with + * Myspell. */ + regmatch.regprog = ae->ae_prog; + regmatch.rm_ic = FALSE; + if (ae->ae_prog == NULL + || vim_regexec(®match, word, (colnr_T)0)) + { + /* Match. Remove the chop and add the affix. */ + if (xht == NULL) { - oldae->ae_add_nw = p; - break; + /* prefix: chop/add at the start of the word */ + if (ae->ae_add == NULL) + *newword = NUL; + else + STRCPY(newword, ae->ae_add); + p = word; + if (ae->ae_chop != NULL) + /* Skip chop string. */ + for (i = mb_charlen(ae->ae_chop); i > 0; --i) + mb_ptr_adv(p); + STRCAT(newword, p); + } + else + { + /* suffix: chop/add at the end of the word */ + STRCPY(newword, word); + if (ae->ae_chop != NULL) + { + /* Remove chop string. */ + p = newword + STRLEN(newword); + for (i = mb_charlen(ae->ae_chop); i > 0; --i) + mb_ptr_back(newword, p); + *p = NUL; + } + if (ae->ae_add != NULL) + STRCAT(newword, ae->ae_add); } - if (prefix && oldae->ae_add_nw != NULL) - { - /* If a prefix has non-word characters special - * treatment is necessary: - * - If it has only non-word characters it becomes a - * leadstring. - * - If it has a sequence of word characters followed - * by a non-word char it becomes a "preword": "d'", - * "de-", "d'ai", etc. - * - if it has another mix of word and non-word - * characters the part before the last word char - * becomes a leadstring: "'d", etc. - */ - for (p = oldae->ae_add; *p != NUL; mb_ptr_adv(p)) - if (spell_iswordc(p)) - { - oldae->ae_add_pw = p; - break; - } - if (oldae->ae_add_pw != NULL) - { - /* Mixed prefix, set ae_add_nw to first non-word - * char after ae_add_pw (if there is one). */ - oldae->ae_add_nw = NULL; - for ( ; *p != NUL; mb_ptr_adv(p)) - if (!spell_iswordc(p)) - { - oldae->ae_add_nw = p; - break; - } - if (oldae->ae_add_nw != NULL) - { - preword = TRUE; - oldae->ae_add_pw = NULL; - oldae->ae_add_nw = NULL; - } - } - } - } + /* Store the modified word. */ + if (store_word(newword, spin) == FAIL) + retval = FAIL; - if (oldae->ae_cond == NULL) - /* hashtable requires a non-empty key */ - STRCPY(condkey, "---"); - else - STRCPY(condkey, oldae->ae_cond); - - /* Look for an existing list with this name and condition. */ - hi = hash_find(&condht, condkey); - if (!HASHITEM_EMPTY(hi)) - /* Match with existing affix, use that one. */ - newnr = HI2AS(hi)->as_nr; - else - { - /* Add a new affix number. */ - newnr = tga.ga_len; - if (ga_grow(&tga, 1) == FAIL) - retval = FAIL; - else - { - newah = ((affheader_T *)tga.ga_data) + newnr; - newah->ah_combine = oldah->ah_combine; - newah->ah_first = NULL; - ++tga.ga_len; - - /* Add the new list to the condht hashtable. */ - add_affhash(&condht, condkey, newnr); + /* When added a suffix and combining is allowed also + * try adding prefixes additionally. */ + if (xht != NULL && ah->ah_combine) + if (store_aff_word(newword, spin, afflist, + xht, NULL, TRUE) == FAIL) + retval = FAIL; } } - - /* Add the new affentry_T to the list. */ - newah = ((affheader_T *)tga.ga_data) + newnr; - newae = (affentry_T *)alloc_clear((unsigned)sizeof(affentry_T)); - if (newae == NULL) - retval = FAIL; - else - { - newae->ae_next = newah->ah_first; - newah->ah_first = newae; - if (oldae->ae_chop == NULL) - newae->ae_chop = NULL; - else - newae->ae_chop = vim_strsave(oldae->ae_chop); - if (oldae->ae_add == NULL) - newae->ae_add = NULL; - else - newae->ae_add = vim_strsave(oldae->ae_add); - newae->ae_preword = preword; - - /* The condition is not copied, since the new affix is - * only used for words where the condition matches. */ - } } - - /* 2. Check if some of the lists already exist, re-use their - * number. Otherwise add the list to "gap". */ - for (newnr = 0; newnr < tga.ga_len; ++newnr) - { - newah = ((affheader_T *)tga.ga_data) + newnr; - for (gapnr = 0; gapnr < gap->ga_len; ++gapnr) - { - gapah = ((affheader_T *)gap->ga_data) + gapnr; - if (newah->ah_combine == gapah->ah_combine - && same_affentries(newah, gapah)) - /* Found an existing affheader_T entry with same - * affentry_T list, use its number. */ - break; - } - - newah->ah_affnr = gapnr; - if (gapnr == gap->ga_len) - { - /* This is a new affentry_T list, add it. */ - if (ga_grow(gap, 1) == FAIL) - retval = FAIL; - else - { - *(((affheader_T *)gap->ga_data) + gap->ga_len) = *newah; - ++gap->ga_len; - } - } - else - { - /* free unused affentry_T list */ - free_affixentries(newah->ah_first); - } - } - - /* 3. Assign the new affix numbers to the old affixes. */ - for (oldae = oldah->ah_first; oldae != NULL && retval == OK; - oldae = oldae->ae_next) - { - if (oldae->ae_cond == NULL) - /* hashtable requires a non-empty key */ - STRCPY(condkey, "---"); - else - STRCPY(condkey, oldae->ae_cond); - - /* Look for an existing affix with this name and condition. */ - hi = hash_find(&condht, condkey); - if (!HASHITEM_EMPTY(hi)) - /* Match with existing affix, use that one. */ - newnr = HI2AS(hi)->as_nr; - else - { - EMSG(_(e_internal)); - retval = FAIL; - } - newah = ((affheader_T *)tga.ga_data) + newnr; - oldae->ae_affnr = newah->ah_affnr; - } - - ga_clear(&tga); - clear_affhash(&condht); } } @@ -3168,962 +1920,428 @@ get_new_aff(oldaff, gap, prefix) } /* - * Return TRUE if the affentry_T lists for "ah1" and "ah2" contain the same - * items, ignoring the order. - * Only compares the chop and add strings, not the condition. + * Read a file with a list of words. */ static int -same_affentries(ah1, ah2) - affheader_T *ah1; - affheader_T *ah2; +spell_read_wordfile(fname, spin) + char_u *fname; + spellinfo_T *spin; { - affentry_T *ae1, *ae2; + FILE *fd; + long lnum = 0; + char_u rline[MAXLINELEN]; + char_u *line; + char_u *pc = NULL; + int l; + int retval = OK; + int did_word = FALSE; + int non_ascii = 0; + char_u *enc; - /* Check the length of the lists first. */ - ae2 = ah2->ah_first; - for (ae1 = ah1->ah_first; ae1 != NULL; ae1 = ae1->ae_next) + /* + * Open the file. + */ + fd = fopen((char *)fname, "r"); + if (fd == NULL) { - if (ae2 == NULL) - return FALSE; /* "ah1" list is longer */ - ae2 = ae2->ae_next; - } - if (ae2 != NULL) - return FALSE; /* "ah2" list is longer */ - - /* Check that each entry in "ah1" appears in "ah2". */ - for (ae1 = ah1->ah_first; ae1 != NULL; ae1 = ae1->ae_next) - { - for (ae2 = ah2->ah_first; ae2 != NULL; ae2 = ae2->ae_next) - { - if ((ae1->ae_chop == NULL) == (ae2->ae_chop == NULL) - && (ae1->ae_add == NULL) == (ae2->ae_add == NULL) - && (ae1->ae_chop == NULL - || STRCMP(ae1->ae_chop, ae2->ae_chop) == 0) - && (ae1->ae_add == NULL - || STRCMP(ae1->ae_add, ae2->ae_add) == 0)) - break; - } - if (ae2 == NULL) - return FALSE; + EMSG2(_(e_notopen), fname); + return FAIL; } - return TRUE; + smsg((char_u *)_("Reading word file %s..."), fname); + out_flush(); + + /* + * Read all the lines in the file one by one. + */ + while (!vim_fgets(rline, MAXLINELEN, fd) && !got_int) + { + line_breakcheck(); + ++lnum; + + /* Skip comment lines. */ + if (*rline == '#') + continue; + + /* Remove CR, LF and white space from the end. */ + l = STRLEN(rline); + while (l > 0 && rline[l - 1] <= ' ') + --l; + if (l == 0) + continue; /* empty or blank line */ + rline[l] = NUL; + + /* Convert from "=encoding={encoding}" to 'encoding' when needed. */ + vim_free(pc); + if (spin->si_conv.vc_type != CONV_NONE) + { + pc = string_convert(&spin->si_conv, rline, NULL); + if (pc == NULL) + { + smsg((char_u *)_("Conversion failure for word in %s line %d: %s"), + fname, lnum, rline); + continue; + } + line = pc; + } + else + { + pc = NULL; + line = rline; + } + + if (*line == '=') + { + if (STRNCMP(line + 1, "encoding=", 9) == 0) + { + if (spin->si_conv.vc_type != CONV_NONE) + smsg((char_u *)_("Duplicate =encoding= line ignored in %s line %d: %s"), + fname, lnum, line); + else if (did_word) + smsg((char_u *)_("=encoding= line after word ignored in %s line %d: %s"), + fname, lnum, line); + else + { + /* Setup for conversion to 'encoding'. */ + enc = enc_canonize(line + 10); + if (enc != NULL && !spin->si_ascii + && convert_setup(&spin->si_conv, enc, + p_enc) == FAIL) + smsg((char_u *)_("Conversion in %s not supported: from %s to %s"), + fname, line + 10, p_enc); + vim_free(enc); + } + } + else + smsg((char_u *)_("= line ignored in %s line %d: %s"), + fname, lnum, line); + continue; + } + + /* Skip non-ASCII words when "spin->si_ascii" is TRUE. */ + if (spin->si_ascii && has_non_ascii(line)) + { + ++non_ascii; + continue; + } + + /* Normal word: store it. */ + if (store_word(line, spin) == FAIL) + { + retval = FAIL; + break; + } + did_word = TRUE; + } + + vim_free(pc); + fclose(fd); + + if (spin->si_ascii && non_ascii > 0) + smsg((char_u *)_("Ignored %d words with non-ASCII characters"), + non_ascii); + return retval; } /* - * Add a chop/add or cond hashtable entry. + * Get part of an sblock_T, "len" bytes long. + * This avoids calling free() for every little struct we use. + * The memory is cleared to all zeros. + * Returns NULL when out of memory. + */ + static void * +getroom(blp, len) + sblock_T **blp; + size_t len; /* length needed */ +{ + char_u *p; + sblock_T *bl = *blp; + + if (bl == NULL || bl->sb_used + len > SBLOCKSIZE) + { + /* Allocate a block of memory. This is not freed until much later. */ + bl = (sblock_T *)alloc_clear((unsigned)(sizeof(sblock_T) + SBLOCKSIZE)); + if (bl == NULL) + return NULL; + bl->sb_next = *blp; + *blp = bl; + bl->sb_used = 0; + } + + p = bl->sb_data + bl->sb_used; + bl->sb_used += len; + + return p; +} + +/* + * Make a copy of a string into memory allocated with getroom(). + */ + static char_u * +getroom_save(blp, s) + sblock_T **blp; + char_u *s; +{ + char_u *sc; + + sc = (char_u *)getroom(blp, STRLEN(s) + 1); + if (sc != NULL) + STRCPY(sc, s); + return sc; +} + + +/* + * Free the list of allocated sblock_T. */ static void -add_affhash(ht, key, newnr) - hashtab_T *ht; - char_u *key; - int newnr; +free_blocks(bl) + sblock_T *bl; { - affhash_T *as; + sblock_T *next; - as = (affhash_T *)alloc((unsigned)sizeof(affhash_T) + STRLEN(key)); - if (as != NULL) + while (bl != NULL) { - as->as_nr = newnr; - STRCPY(as->as_word, key); - hash_add(ht, as->as_word); + next = bl->sb_next; + vim_free(bl); + bl = next; } } /* - * Clear the chop/add hashtable used to detect identical affixes. + * Allocate the root of a word tree. */ - static void -clear_affhash(ht) - hashtab_T *ht; + static wordnode_T * +wordtree_alloc(blp) + sblock_T **blp; { - int todo; - hashitem_T *hi; - - todo = ht->ht_used; - for (hi = ht->ht_array; todo > 0; ++hi) - { - if (!HASHITEM_EMPTY(hi)) - { - --todo; - vim_free(HI2AS(hi)); - } - } - hash_clear(ht); + return (wordnode_T *)getroom(blp, sizeof(wordnode_T)); } /* - * Translate list of affix names for an old word to affix numbers in a new - * basic word. - * This checks if the conditions match with the old word. The result is that - * the new affix does not need to store the condition. - */ - static void -trans_affixes(dw, bw, oldaff, newwords) - dicword_T *dw; /* old word */ - basicword_T *bw; /* basic word */ - afffile_T *oldaff; /* affixes for "oldwords" */ - hashtab_T *newwords; /* table with words */ -{ - char_u key[2]; - char_u *p; - char_u *affnm; - garray_T *gap, *agap; - hashitem_T *aff_hi; - affheader_T *ah; - affentry_T *ae; - regmatch_T regmatch; - int i; - basicword_T *nbw; - int alen; - garray_T suffixga; /* list of words with non-word suffixes */ - garray_T prefixga; /* list of words with non-word prefixes */ - char_u nword[MAXWLEN]; - int flags; - int n; - - ga_init2(&suffixga, (int)sizeof(basicword_T *), 5); - ga_init2(&prefixga, (int)sizeof(basicword_T *), 5); - - /* Loop over all the affix names of the old word. */ - key[1] = NUL; - for (affnm = dw->dw_affnm; *affnm != NUL; ++affnm) - { - key[0] = *affnm; - aff_hi = hash_find(&oldaff->af_pref, key); - if (!HASHITEM_EMPTY(aff_hi)) - gap = &bw->bw_prefix; /* found a prefix */ - else - { - gap = &bw->bw_suffix; /* must be a suffix */ - aff_hi = hash_find(&oldaff->af_suff, key); - if (HASHITEM_EMPTY(aff_hi)) - { - smsg((char_u *)_("No affix entry '%s' for word %s"), - key, dw->dw_word); - continue; - } - } - - /* Loop over all the affix entries for this affix name. */ - ah = HI2AH(aff_hi); - for (ae = ah->ah_first; ae != NULL; ae = ae->ae_next) - { - /* Setup for regexp matching. Note that we don't ignore case. - * This is weird, because the rules in an .aff file don't care - * about case, but it's necessary for compatibility with Myspell. - */ - regmatch.regprog = ae->ae_prog; - regmatch.rm_ic = FALSE; - if (ae->ae_prog == NULL - || vim_regexec(®match, dw->dw_word, (colnr_T)0)) - { - if ((ae->ae_add_nw != NULL || ae->ae_add_pw != NULL) - && (gap != &bw->bw_suffix || bw->bw_addstring == NULL)) - { - /* - * Affix has a non-word character and isn't prepended to - * leader or appended to addition. Need to use another - * word with a leadstring and/or addstring. - */ - if (gap == &bw->bw_suffix || ae->ae_add_nw == NULL) - { - /* Suffix or prefix with only non-word chars. - * Build the new basic word in "nword": Remove chop - * string and append/prepend addition. */ - if (gap == &bw->bw_suffix) - { - /* suffix goes at the end of the word */ - STRCPY(nword, dw->dw_word); - if (ae->ae_chop != NULL) - { - /* Remove chop string. */ - p = nword + STRLEN(nword); - for (i = mb_charlen(ae->ae_chop); i > 0; --i) - mb_ptr_back(nword, p); - *p = NUL; - } - STRCAT(nword, ae->ae_add); - agap = &suffixga; - } - else - { - /* prefix goes before the word */ - STRCPY(nword, ae->ae_add); - p = dw->dw_word; - if (ae->ae_chop != NULL) - /* Skip chop string. */ - for (i = mb_charlen(ae->ae_chop); i > 0; --i) - mb_ptr_adv( p); - STRCAT(nword, p); - agap = &prefixga; - } - - /* Create a basicword_T from the word. */ - nbw = get_basicword(nword, 1); - if (nbw != NULL) - { - nbw->bw_region = bw->bw_region; - nbw->bw_flags |= bw->bw_flags - & ~(BWF_ONECAP | BWF_ALLCAP | BWF_KEEPCAP); - - if (STRCMP(bw->bw_word, nbw->bw_word) != 0) - /* Basic word differs, add new word entry. */ - (void)add_to_wordlist(newwords, nbw); - else - { - /* Basic word is the same, link "nbw" after - * "bw". */ - nbw->bw_next = bw->bw_next; - bw->bw_next = nbw; - } - - /* Remember this word, we need to set bw_prefix - * or bw_suffix later. */ - if (ga_grow(agap, 1) == OK) - ((basicword_T **)agap->ga_data) - [agap->ga_len++] = nbw; - } - } - else - { - /* Prefix with both non-word and word characters: Turn - * prefix into basic word, original word becomes an - * addstring. */ - - /* Fold-case the word characters in the prefix into - * nword[]. */ - alen = 0; - for (p = ae->ae_add_pw; p < ae->ae_add_nw; p += n) - { -#ifdef FEAT_MBYTE - n = (*mb_ptr2len_check)(p); -#else - n = 1; -#endif - (void)spell_casefold(p, n, nword + alen, - MAXWLEN - alen); - alen += STRLEN(nword + alen); - } - - /* Allocate a new word entry. */ - nbw = (basicword_T *)alloc((unsigned)( - sizeof(basicword_T) + alen + 1)); - if (nbw != NULL) - { - *nbw = *bw; - ga_init2(&nbw->bw_prefix, sizeof(short_u), 1); - ga_init2(&nbw->bw_suffix, sizeof(short_u), 1); - - mch_memmove(nbw->bw_word, nword, alen); - nbw->bw_word[alen] = NUL; - - /* Use the cap type of the prefix. */ - alen = ae->ae_add_nw - ae->ae_add_pw; - mch_memmove(nword, ae->ae_add_pw, alen); - nword[alen] = NUL; - flags = captype(nword, nword + STRLEN(nword)); - if (flags & BWF_KEEPCAP) - nbw->bw_caseword = vim_strsave(nword); - else - nbw->bw_caseword = NULL; - nbw->bw_flags &= ~(BWF_ONECAP | BWF_ALLCAP - | BWF_KEEPCAP); - nbw->bw_flags |= flags; - - /* The addstring is the prefix after the word - * characters, the original word excluding "chop", - * plus any addition. */ - STRCPY(nword, ae->ae_add_nw); - p = bw->bw_word; - if (ae->ae_chop != NULL) - p += STRLEN(ae->ae_chop); - STRCAT(nword, p); - if (bw->bw_addstring != NULL) - STRCAT(nword, bw->bw_addstring); - nbw->bw_addstring = vim_strsave(nword); - - if (ae->ae_add_pw > ae->ae_add) - nbw->bw_leadstring = vim_strnsave(ae->ae_add, - ae->ae_add_pw - ae->ae_add); - else - nbw->bw_leadstring = NULL; - - (void)add_to_wordlist(newwords, nbw); - - /* Remember this word, we need to set bw_suffix - * and bw_suffix later. */ - if (ga_grow(&prefixga, 1) == OK) - ((basicword_T **)prefixga.ga_data) - [prefixga.ga_len++] = nbw; - } - } - } - else - { - /* Affix applies to this word, add the related affix - * number. But only if it's not there yet. And keep the - * list sorted, so that we can compare it later. */ - for (i = 0; i < gap->ga_len; ++i) - { - n = ((short_u *)gap->ga_data)[i]; - if (n >= ae->ae_affnr) - { - if (n == ae->ae_affnr) - i = -1; - break; - } - } - if (i >= 0 && ga_grow(gap, 1) == OK) - { - if (i < gap->ga_len) - mch_memmove(((short_u *)gap->ga_data) + i + 1, - ((short_u *)gap->ga_data) + i, - sizeof(short_u) * (gap->ga_len - i)); - ((short_u *)gap->ga_data)[i] = ae->ae_affnr; - ++gap->ga_len; - } - } - } - } - } - - /* - * For the words that we added for suffixes with non-word characters: Use - * the prefix list of the main word. - */ - for (i = 0; i < suffixga.ga_len; ++i) - { - nbw = ((basicword_T **)suffixga.ga_data)[i]; - if (ga_grow(&nbw->bw_prefix, bw->bw_prefix.ga_len) == OK) - { - mch_memmove(nbw->bw_prefix.ga_data, bw->bw_prefix.ga_data, - bw->bw_prefix.ga_len * sizeof(short_u)); - nbw->bw_prefix.ga_len = bw->bw_prefix.ga_len; - } - } - - /* - * For the words that we added for prefixes with non-word characters: Use - * the suffix list of the main word. - */ - for (i = 0; i < prefixga.ga_len; ++i) - { - nbw = ((basicword_T **)prefixga.ga_data)[i]; - if (ga_grow(&nbw->bw_suffix, bw->bw_suffix.ga_len) == OK) - { - mch_memmove(nbw->bw_suffix.ga_data, bw->bw_suffix.ga_data, - bw->bw_suffix.ga_len * sizeof(short_u)); - nbw->bw_suffix.ga_len = bw->bw_suffix.ga_len; - } - } - - ga_clear(&suffixga); - ga_clear(&prefixga); -} - -/* - * Go over all words in "oldwords" and change the old affix names to the new - * affix numbers, check the conditions, fold case, extract the basic word and - * additions. + * Store a word in the tree(s). + * Always store it in the case-folded tree. + * For a keep-case word also store it in the keep-case tree. */ static int -build_wordlist(newwords, oldwords, oldaff, regionmask) - hashtab_T *newwords; /* basicword_T entries */ - hashtab_T *oldwords; /* dicword_T entries */ - afffile_T *oldaff; /* affixes for "oldwords" */ - int regionmask; /* value for bw_region */ +store_word(word, spin) + char_u *word; + spellinfo_T *spin; { - int todo; - hashitem_T *old_hi; - dicword_T *dw; - basicword_T *bw; - char_u message[MAXLINELEN + MAXWLEN]; - - todo = oldwords->ht_used; - for (old_hi = oldwords->ht_array; todo > 0; ++old_hi) - { - if (!HASHITEM_EMPTY(old_hi)) - { - --todo; - dw = HI2DW(old_hi); + int len = STRLEN(word); + int ct = captype(word, word + len); + char_u foldword[MAXWLEN]; + int res; - /* This takes time, print a message now and then. */ - if ((todo & 0x3ff) == 0 || todo == (int)oldwords->ht_used - 1) - { - sprintf((char *)message, _("%6d todo - %s"), - todo, dw->dw_word); - msg_start(); - msg_outtrans_attr(message, 0); - msg_clr_eos(); - msg_didout = FALSE; - msg_col = 0; - out_flush(); - ui_breakcheck(); - if (got_int) - break; - } - - bw = get_basicword(dw->dw_word, 10); - if (bw == NULL) - break; - bw->bw_region = regionmask; - - (void)add_to_wordlist(newwords, bw); - - /* Deal with any affix names on the old word, translate them - * into affix numbers. */ - if (dw->dw_affnm != NULL) - trans_affixes(dw, bw, oldaff, newwords); - } - } - if (todo > 0) - return FAIL; - return OK; + (void)spell_casefold(word, len, foldword, MAXWLEN); + res = tree_add_word(foldword, spin->si_foldroot, ct, spin->si_region, + &spin->si_blocks); + if (res == OK && ct == WF_KEEPCAP) + res = tree_add_word(word, spin->si_keeproot, ct, spin->si_region, + &spin->si_blocks); + return res; } /* - * Get a basicword_T from a word in original case. - * Caller must set bw_region. - * Returns NULL when something fails. - */ - static basicword_T * -get_basicword(word, asize) - char_u *word; - int asize; /* growsize for affix garray */ -{ - int dwlen; - char_u foldword[MAXLINELEN]; - int flags; - int clen; - int leadlen; - char_u *p; - char_u leadstring[MAXLINELEN]; - int addlen; - char_u addstring[MAXLINELEN]; - char_u *cp = NULL; - int l; - basicword_T *bw; - - /* The basic words are always stored with folded case. */ - dwlen = STRLEN(word); - (void)spell_casefold(word, dwlen, foldword, MAXLINELEN); - flags = captype(word, word + dwlen); - - /* Check for non-word characters before the word. */ - clen = 0; - leadlen = 0; - if (!spell_iswordc(foldword)) - { - p = foldword; - for (;;) - { - mb_ptr_adv(p); - ++clen; - if (*p == NUL) /* Only non-word chars (bad word!) */ - { - if (p_verbose > 0) - { - verbose_enter(); - smsg((char_u *)_("Warning: word without word characters: \"%s\""), - foldword); - verbose_leave(); - } - break; - } - if (spell_iswordc(p)) - { - /* Move the leader to "leadstring" and remove it from - * "foldword". */ - leadlen = p - foldword; - mch_memmove(leadstring, foldword, leadlen); - leadstring[leadlen] = NUL; - mch_memmove(foldword, p, STRLEN(p) + 1); - break; - } - } - } - - /* Check for non-word characters after word characters. */ - addlen = 0; - for (p = foldword; spell_iswordc(p); mb_ptr_adv(p)) - { - if (*p == NUL) - break; - ++clen; - } - if (*p != NUL) - { - /* Move the addition to "addstring" and truncate "foldword". */ - if (flags & BWF_KEEPCAP) - { - /* Preserve caps, need to skip the right number of - * characters in the original word (case folding may - * change the byte count). */ - l = 0; - for (cp = word; l < clen; mb_ptr_adv(cp)) - ++l; - addlen = STRLEN(cp); - mch_memmove(addstring, cp, addlen + 1); - } - else - { - addlen = STRLEN(p); - mch_memmove(addstring, p, addlen + 1); - } - *p = NUL; - } - - bw = (basicword_T *)alloc_clear((unsigned)sizeof(basicword_T) - + STRLEN(foldword)); - if (bw == NULL) - return NULL; - - STRCPY(bw->bw_word, foldword); - - if (leadlen > 0) - bw->bw_leadstring = vim_strsave(leadstring); - else - bw->bw_leadstring = NULL; - if (addlen > 0) - bw->bw_addstring = vim_strsave(addstring); - else - bw->bw_addstring = NULL; - - if (flags & BWF_KEEPCAP) - { - if (addlen == 0) - /* use the whole word */ - bw->bw_caseword = vim_strsave(word + leadlen); - else - /* use only up to the addition */ - bw->bw_caseword = vim_strnsave(word + leadlen, - cp - word - leadlen); - } - - bw->bw_flags = flags; - ga_init2(&bw->bw_prefix, sizeof(short_u), asize); - ga_init2(&bw->bw_suffix, sizeof(short_u), asize); - - return bw; -} - -/* - * Go through the list of words and combine the ones that are identical except - * for the region. - */ - static void -combine_regions(newwords) - hashtab_T *newwords; -{ - int todo; - hashitem_T *hi; - basicword_T *bw, *nbw, *pbw; - - /* Loop over all basic words in the words table. */ - todo = newwords->ht_used; - for (hi = newwords->ht_array; todo > 0; ++hi) - { - if (!HASHITEM_EMPTY(hi)) - { - --todo; - - /* Loop over the list of words for this basic word. Compare with - * each following word in the same list. */ - for (bw = HI2BW(hi); bw != NULL; bw = bw->bw_next) - { - pbw = bw; - for (nbw = pbw->bw_next; nbw != NULL; nbw = pbw->bw_next) - { - if (bw->bw_flags == nbw->bw_flags - && (bw->bw_leadstring == NULL) - == (nbw->bw_leadstring == NULL) - && (bw->bw_addstring == NULL) - == (nbw->bw_addstring == NULL) - && ((bw->bw_flags & BWF_KEEPCAP) == 0 - || bw->bw_caseword == NULL - || nbw->bw_caseword == NULL - || STRCMP(bw->bw_caseword, - nbw->bw_caseword) == 0) - && (bw->bw_leadstring == NULL - || STRCMP(bw->bw_leadstring, - nbw->bw_leadstring) == 0) - && (bw->bw_addstring == NULL - || STRCMP(bw->bw_addstring, - nbw->bw_addstring) == 0) - && same_affixes(bw, nbw) - ) - { - /* Match, combine regions and delete "nbw". */ - pbw->bw_next = nbw->bw_next; - bw->bw_region |= nbw->bw_region; - free_basicword(nbw); - } - else - /* No match, continue with next one. */ - pbw = nbw; - } - } - } - } -} - -/* - * Return TRUE when the prefixes and suffixes for "bw" and "nbw" are equal. - */ - static int -same_affixes(bw, nbw) - basicword_T *bw; - basicword_T *nbw; -{ - return (bw->bw_prefix.ga_len == nbw->bw_prefix.ga_len - && bw->bw_suffix.ga_len == nbw->bw_suffix.ga_len - && (bw->bw_prefix.ga_len == 0 - || vim_memcmp(bw->bw_prefix.ga_data, - nbw->bw_prefix.ga_data, - bw->bw_prefix.ga_len * sizeof(short_u)) == 0) - && (bw->bw_suffix.ga_len == 0 - || vim_memcmp(bw->bw_suffix.ga_data, - nbw->bw_suffix.ga_data, - bw->bw_suffix.ga_len * sizeof(short_u)) == 0)); -} - -/* - * For each basic word with additions turn the suffixes into other additions - * and/or new basic words. For each basic word with a leadstring turn the - * prefixes into other leadstrings and/or new basic words. - * The result is that no affixes apply to the additions or leadstring of a - * word. - * This is also needed when a word with an addition has a prefix and the word - * with prefix also exists. E.g., "blurp's/D" (D is prefix "de") and - * "deblurp". "deblurp" would match and no prefix would be tried. - * + * Add word "word" to a word tree at "root". * Returns FAIL when out of memory. */ static int -expand_affixes(newwords, prefgap, suffgap) - hashtab_T *newwords; - garray_T *prefgap; - garray_T *suffgap; -{ - int todo; - hashitem_T *hi; - basicword_T *bw; - int pi, si; - affentry_T *pae, *sae; - garray_T add_words; - int n; - char_u message[MAXLINELEN + MAXWLEN]; - int retval = OK; - - ga_init2(&add_words, sizeof(basicword_T *), 10); - - todo = newwords->ht_used; - for (hi = newwords->ht_array; todo > 0; ++hi) - { - if (!HASHITEM_EMPTY(hi)) - { - --todo; - - /* This takes time, print a message now and then. */ - if ((todo & 0x3ff) == 0 || todo == (int)newwords->ht_used - 1) - { - sprintf((char *)message, _("%6d todo - %s"), - todo, HI2BW(hi)->bw_word); - msg_start(); - msg_outtrans_attr(message, 0); - msg_clr_eos(); - msg_didout = FALSE; - msg_col = 0; - out_flush(); - ui_breakcheck(); - if (got_int) - break; - } - - for (bw = HI2BW(hi); bw != NULL; bw = bw->bw_next) - { - /* - * Need to fix affixes if there is a leader or addition and - * there are prefixes or suffixes. - */ - if ((bw->bw_leadstring != NULL || bw->bw_addstring != NULL) - && (bw->bw_prefix.ga_len != 0 - || bw->bw_suffix.ga_len != 0)) - { - /* Loop over all prefix numbers, but first without a - * prefix. */ - for (pi = -1; pi < bw->bw_prefix.ga_len; ++pi) - { - pae = NULL; - if (pi >= 0) - { - n = ((short_u *)bw->bw_prefix.ga_data)[pi]; - pae = ((affheader_T *)prefgap->ga_data + n) - ->ah_first; - } - - /* Loop over all entries for prefix "pi". Do it once - * when there is no prefix (pi == -1). */ - do - { - /* Skip prewords, they don't need to be expanded. */ - if (pae == NULL || !pae->ae_preword) - { - /* Loop over all suffix numbers. Do without a - * suffix first when there is a prefix. */ - for (si = (pi == -1 ? 0 : -1); - si < bw->bw_suffix.ga_len; ++si) - { - sae = NULL; - if (si >= 0) - { - n = ((short_u *)bw->bw_suffix.ga_data)[si]; - sae = ((affheader_T *)suffgap->ga_data + n) - ->ah_first; - } - - /* Loop over all entries for suffix "si". Do - * it once when there is no suffix (si == -1). - */ - do - { - /* Expand the word for this combination of - * prefixes and affixes. */ - if (expand_one_aff(bw, &add_words, - pae, sae) == FAIL) - { - retval = FAIL; - goto theend; - } - - /* Advance to next suffix entry, if there - * is one. */ - if (sae != NULL) - sae = sae->ae_next; - } while (sae != NULL); - } - } - - /* Advance to next prefix entry, if there is one. */ - if (pae != NULL) - pae = pae->ae_next; - } while (pae != NULL); - } - } - } - } - } - - /* - * Add the new words afterwards, can't change "newwords" while going over - * all its items. - */ - for (pi = 0; pi < add_words.ga_len; ++pi) - { - retval = add_to_wordlist(newwords, - ((basicword_T **)add_words.ga_data)[pi]); - if (retval == FAIL) - break; - } - -theend: - ga_clear(&add_words); - return retval; -} - -/* - * Add one word to "add_words" for basic word "bw" with additions, adding - * prefix "pae" and suffix "sae". Either "pae" or "sae" can be NULL. - * Don't do this when not necessary: - * - no leadstring and adding prefix doesn't result in existing word. - * Returns FAIL when out of memory. - */ - static int -expand_one_aff(bw, add_words, pae, sae) - basicword_T *bw; - garray_T *add_words; - affentry_T *pae; - affentry_T *sae; +tree_add_word(word, root, flags, region, blp) + char_u *word; + wordnode_T *root; + int flags; + int region; + sblock_T **blp; { - char_u word[MAXWLEN + 1]; - char_u caseword[MAXWLEN + 1]; - int l = 0; - int choplen = 0; - int ll; - basicword_T *nbw; - - /* Prepend prefix to the basic word if there is a prefix and there is no - * leadstring. */ - if (pae != NULL && bw->bw_leadstring == NULL) - { - if (pae->ae_add != NULL) - { - l = STRLEN(pae->ae_add); - mch_memmove(word, pae->ae_add, l); - } - if (pae->ae_chop != NULL) - choplen = STRLEN(pae->ae_chop); - } - - /* Copy the body of the word. */ - STRCPY(word + l, bw->bw_word + choplen); - - /* Do the same for bw_caseword, if it's there. */ - if ((bw->bw_flags & BWF_KEEPCAP) && bw->bw_caseword != NULL) - { - if (l > 0) - mch_memmove(caseword, pae->ae_add, l); - STRCPY(caseword + l, bw->bw_caseword + choplen); - } - - /* Append suffix to the basic word if there is a suffix and there is no - * addstring. */ - if (sae != 0 && bw->bw_addstring == NULL) - { - l = STRLEN(word); - if (sae->ae_chop != NULL) - l -= STRLEN(sae->ae_chop); - if (sae->ae_add == NULL) - word[l] = NUL; - else - STRCPY(word + l, sae->ae_add); - - if (bw->bw_flags & BWF_KEEPCAP) - { - /* Do the same for the caseword. */ - l = STRLEN(caseword); - if (sae->ae_chop != NULL) - l -= STRLEN(sae->ae_chop); - if (sae->ae_add == NULL) - caseword[l] = NUL; - else - STRCPY(caseword + l, sae->ae_add); - } - } - - nbw = (basicword_T *)alloc_clear((unsigned) - sizeof(basicword_T) + STRLEN(word)); - if (nbw == NULL) - return FAIL; - - /* Add the new word to the list of words to be added later. */ - if (ga_grow(add_words, 1) == FAIL) - { - vim_free(nbw); - return FAIL; - } - ((basicword_T **)add_words->ga_data)[add_words->ga_len++] = nbw; + wordnode_T *node = root; + wordnode_T *np; + wordnode_T **prev = NULL; + int i; - /* Copy the (modified) basic word, flags and region. */ - STRCPY(nbw->bw_word, word); - nbw->bw_flags = bw->bw_flags; - nbw->bw_region = bw->bw_region; - - /* Set the (modified) caseword. */ - if (bw->bw_flags & BWF_KEEPCAP) - nbw->bw_caseword = vim_strsave(caseword); - else - nbw->bw_caseword = NULL; - - if (bw->bw_leadstring != NULL) - { - if (pae != NULL) - { - /* Prepend prefix to leadstring. */ - ll = STRLEN(bw->bw_leadstring); - l = choplen = 0; - if (pae->ae_add != NULL) - l = STRLEN(pae->ae_add); - if (pae->ae_chop != NULL) - { - choplen = STRLEN(pae->ae_chop); - if (choplen > ll) /* TODO: error? */ - choplen = ll; - } - nbw->bw_leadstring = alloc((unsigned)(ll + l - choplen + 1)); - if (nbw->bw_leadstring != NULL) - { - if (l > 0) - mch_memmove(nbw->bw_leadstring, pae->ae_add, l); - STRCPY(nbw->bw_leadstring + l, bw->bw_leadstring + choplen); - } - } - else - nbw->bw_leadstring = vim_strsave(bw->bw_leadstring); - } - else if (bw->bw_prefix.ga_len > 0) + /* Add each byte of the word to the tree, including the NUL at the end. */ + for (i = 0; ; ++i) { - /* There is no leadstring, copy the list of possible prefixes. */ - ga_init2(&nbw->bw_prefix, sizeof(short_u), 1); - if (ga_grow(&nbw->bw_prefix, bw->bw_prefix.ga_len) == OK) + /* Look for the sibling that has the same character. They are sorted + * on byte value, thus stop searching when a sibling is found with a + * higher byte value. For zero bytes (end of word) check that the + * flags are equal, there is a separate zero byte for each flag value. + */ + while (node != NULL && (node->wn_byte < word[i] + || (node->wn_byte == 0 && node->wn_flags != flags))) { - mch_memmove(nbw->bw_prefix.ga_data, bw->bw_prefix.ga_data, - bw->bw_prefix.ga_len * sizeof(short_u)); - nbw->bw_prefix.ga_len = bw->bw_prefix.ga_len; + prev = &node->wn_sibling; + node = *prev; } - } - - if (bw->bw_addstring != NULL) - { - if (sae != NULL) + if (node == NULL || node->wn_byte != word[i]) { - /* Append suffix to addstring. */ - l = STRLEN(bw->bw_addstring); - if (sae->ae_chop != NULL) - { - l -= STRLEN(sae->ae_chop); - if (l < 0) /* TODO: error? */ - l = 0; - } - if (sae->ae_add == NULL) - ll = 0; - else - ll = STRLEN(sae->ae_add); - nbw->bw_addstring = alloc((unsigned)(ll + l - choplen + 1)); - if (nbw->bw_addstring != NULL) - { - STRCPY(nbw->bw_addstring, bw->bw_addstring); - if (sae->ae_add == NULL) - nbw->bw_addstring[l] = NUL; - else - STRCPY(nbw->bw_addstring + l, sae->ae_add); - } + /* Allocate a new node. */ + np = (wordnode_T *)getroom(blp, sizeof(wordnode_T)); + if (np == NULL) + return FAIL; + np->wn_byte = word[i]; + *prev = np; + np->wn_sibling = node; + node = np; } - else - nbw->bw_addstring = vim_strsave(bw->bw_addstring); + + if (word[i] == NUL) + { + node->wn_flags = flags; + node->wn_region |= region; + break; + } + prev = &node->wn_child; + node = *prev; } return OK; } /* - * Add basicword_T "*bw" to wordlist "newwords". + * Compress a tree: find tails that are identical and can be shared. + */ + static void +wordtree_compress(root) + wordnode_T *root; +{ + hashtab_T ht; + int n; + int tot = 0; + + if (root != NULL) + { + hash_init(&ht); + n = node_compress(root, &ht, &tot); + smsg((char_u *)_("Compressed %d of %d nodes; %d%% remaining"), + n, tot, (tot - n) * 100 / tot); + hash_clear(&ht); + } +} + +/* + * Compress a node, its siblings and its children, depth first. + * Returns the number of compressed nodes. */ static int -add_to_wordlist(newwords, bw) - hashtab_T *newwords; - basicword_T *bw; +node_compress(node, ht, tot) + wordnode_T *node; + hashtab_T *ht; + int *tot; /* total count of nodes before compressing, + incremented while going through the tree */ { + wordnode_T *np; + wordnode_T *tp; + wordnode_T *child; + hash_T hash; hashitem_T *hi; - basicword_T *bw2; - int retval = OK; + int len = 0; + unsigned nr, n; + int compressed = 0; - hi = hash_find(newwords, bw->bw_word); - if (HASHITEM_EMPTY(hi)) + /* + * Go through the list of siblings. Compress each child and then try + * finding an identical child to replace it. + * Note that with "child" we mean not just the node that is pointed to, + * but the whole list of siblings, of which the node is the first. + */ + for (np = node; np != NULL; np = np->wn_sibling) { - /* New entry, add to hashlist. */ - retval = hash_add(newwords, bw->bw_word); - bw->bw_next = NULL; + ++len; + if ((child = np->wn_child) != NULL) + { + /* Compress the child. This fills wn_hashkey. */ + compressed += node_compress(child, ht, tot); + + /* Try to find an identical child. */ + hash = hash_hash(child->wn_hashkey); + hi = hash_lookup(ht, child->wn_hashkey, hash); + tp = NULL; + if (!HASHITEM_EMPTY(hi)) + { + /* There are children with an identical hash value. Now check + * if there is one that is really identical. */ + for (tp = HI2WN(hi); tp != NULL; tp = tp->wn_next) + if (node_equal(child, tp)) + { + /* Found one! Now use that child in place of the + * current one. This means the current child is + * dropped from the tree. */ + np->wn_child = tp; + ++compressed; + break; + } + if (tp == NULL) + { + /* No other child with this hash value equals the child of + * the node, add it to the linked list after the first + * item. */ + tp = HI2WN(hi); + child->wn_next = tp->wn_next; + tp->wn_next = child; + } + } + else + /* No other child has this hash value, add it to the + * hashtable. */ + hash_add_item(ht, hi, child->wn_hashkey, hash); + } } - else + *tot += len; + + /* + * Make a hash key for the node and its siblings, so that we can quickly + * find a lookalike node. This must be done after compressing the sibling + * list, otherwise the hash key would become invalid by the compression. + */ + node->wn_hashkey[0] = len; + nr = 0; + for (np = node; np != NULL; np = np->wn_sibling) { - /* Existing entry, append to list of basic words. */ - bw2 = HI2BW(hi); - bw->bw_next = bw2->bw_next; - bw2->bw_next = bw; + if (np->wn_byte == NUL) + /* end node: only use wn_flags and wn_region */ + n = np->wn_flags + (np->wn_region << 8); + else + /* byte node: use the byte value and the child pointer */ + n = np->wn_byte + ((long_u)np->wn_child << 8); + nr = nr * 101 + n; } - return retval; + + /* Avoid NUL bytes, it terminates the hash key. */ + n = nr & 0xff; + node->wn_hashkey[1] = n == 0 ? 1 : n; + n = (nr >> 8) & 0xff; + node->wn_hashkey[2] = n == 0 ? 1 : n; + n = (nr >> 16) & 0xff; + node->wn_hashkey[3] = n == 0 ? 1 : n; + n = (nr >> 24) & 0xff; + node->wn_hashkey[4] = n == 0 ? 1 : n; + node->wn_hashkey[5] = NUL; + + return compressed; +} + +/* + * Return TRUE when two nodes have identical siblings and children. + */ + static int +node_equal(n1, n2) + wordnode_T *n1; + wordnode_T *n2; +{ + wordnode_T *p1; + wordnode_T *p2; + + for (p1 = n1, p2 = n2; p1 != NULL && p2 != NULL; + p1 = p1->wn_sibling, p2 = p2->wn_sibling) + if (p1->wn_byte != p2->wn_byte + || (p1->wn_byte == NUL + ? (p1->wn_flags != p2->wn_flags + || p1->wn_region != p2->wn_region) + : (p1->wn_child != p2->wn_child))) + break; + + return p1 == NULL && p2 == NULL; } /* @@ -4142,209 +2360,23 @@ put_bytes(fd, nr, len) } /* - * Write affix info. ... - */ - static void -write_affix(fd, ah) - FILE *fd; - affheader_T *ah; -{ - int i = 0; - affentry_T *ae; - char_u *p; - int round; - int flags; - - /* Count the number of entries. */ - for (ae = ah->ah_first; ae != NULL; ae = ae->ae_next) - ++i; - put_bytes(fd, (long_u)i, 2); /* */ - - /* : */ - for (ae = ah->ah_first; ae != NULL; ae = ae->ae_next) - { - flags = ah->ah_combine ? AFF_COMBINE : 0; - if (ae->ae_preword) - flags |= AFF_PREWORD; - fputc(flags, fd); /* */ - - for (round = 1; round <= 2; ++round) - { - p = round == 1 ? ae->ae_chop : ae->ae_add; - if (p == NULL) - putc(0, fd); /* / */ - else - { - putc(STRLEN(p), fd); /* / */ - /* / */ - fwrite(p, STRLEN(p), (size_t)1, fd); - } - } - } -} - -/* - * Write list of affix NRs: ... - */ - static void -write_affixlist(fd, aff, bytes) - FILE *fd; - garray_T *aff; - int bytes; -{ - int i; - - if (aff->ga_len > 0) - { - putc(aff->ga_len, fd); /* */ - for (i = 0; i < aff->ga_len; ++i) - put_bytes(fd, (long_u )((short_u *)aff->ga_data)[i], bytes); - } -} - -/* - * Vim spell file format:
- * - * - *
: ... - * - * - * 10 bytes "VIMspell04" - * 1 byte number of regions following (8 supported) - * 2 bytes Region name: ca, au, etc. - * First is region 1. - * - * 1 byte Number of bytes in (should be 128). - * N bytes List of flags (first one is for character 128): - * 0x01 word character - * 0x01 upper-case character - * 2 bytes Number of bytes in . - * N bytes Folded characters, first one is for character 128. - * - * - * : ... - * : ... - * list of possible affixes: prefixes and suffixes. - * - * 2 bytes Number of affixes (MSB comes first). - * When more than 256 an affixNR is 2 bytes. - * This is separate for prefixes and suffixes! - * First affixNR is 0. - * - * : ... - * - * 2 bytes Number of affixes with this affixNR (MSB first). - * - * : - * - * 1 byte 0x01: prefix combines with suffix, AFF_COMBINE - * 0x02: prefix includes word, AFF_PREWORD - * 0x04-0x80: unset - * 1 byte Length of in bytes. - * N bytes To be removed from basic word. - * 1 byte Length of in bytes. - * N bytes To be added to basic word. - * - * - * : ... - * - * 4 bytes Length of in bytes, excluding - * . MSB first. - * To be defined. - * - * - * : ... - * - * 4 bytes Number of following. MSB first. - * - * : [] - * [ ] - * [ ...] (prefixes) - * [ ...] (suffixes) - * [] - * [ ...] - * - * i 1 byte Number of bytes copied from previous word. - * N bytes Additional bytes for word, up to byte smaller than - * 0x20 (space). - * Must only contain case-folded word characters. - * 1 byte 0x01: word is valid without addition, BWF_VALID - * 0x02: has region byte, BWF_REGION - * 0x04: first letter must be upper-case, BWF_ONECAP - * 0x08: has suffixes, and follow - * BWF_SUFFIX - * 0x10: more flags, follows next, BWF_SECOND - * 0x20-0x80: can't be used, unset - * 1 byte 0x01: has additions, and follow, - * BWF_ADDS - * 0x02: has prefixes, and follow - * BWF_PREFIX - * 0x04: all letters must be upper-case, BWF_ALLCAP - * 0x08: case must match, BWF_KEEPCAP - * 0x10: has more than 255 additions, is two - * bytes, BWF_ADDS_M - * 0x10-0x80: unset - * 1 byte Length of . - * N bytes Word with matching case. - * 1 byte Number of affix NRs following. - * 1 or 2 byte Number of possible affix for this word. - * When using 2 bytes MSB comes first. - * 1 byte Bitmask for regions in which word is valid. When - * omitted it's valid in all regions. - * Lowest bit is for region 1. - * 1 or 2 byte Number of items following. - * - * : [] [] [] [] - * - * 1 byte 0x01: unset - * 0x02: has region byte, ADD_REGION - * 0x04: first letter must be upper-case, ADD_ONECAP - * 0x08: unset - * 0x10: has a , ADD_LEADLEN - * 0x20: has a , ADD_COPYLEN - * 0x40: all letters must be upper-case, ADD_ALLCAP - * 0x80: fixed case, is the whole word - * with matching case, ADD_KEEPCAP. - * 1 byte Length of in bytes. - * 1 byte Number of bytes at start of that must - * come before the start of the basic word. - * 1 byte Number of bytes copied from previous . - * N bytes Word characters, before/in/after the word. - * - * All text characters are in 'encoding': , , , - * > and . - * All other fields are ASCII: - * is always case-folded. - */ - -/* * Write the Vim spell file "fname". */ static void -write_vim_spell(fname, prefga, suffga, newwords, regcount, regchars, ascii) +write_vim_spell(fname, spin, regcount, regchars) char_u *fname; - garray_T *prefga; /* prefixes, affheader_T entries */ - garray_T *suffga; /* suffixes, affheader_T entries */ - hashtab_T *newwords; /* basic words, basicword_T entries */ + spellinfo_T *spin; int regcount; /* number of regions */ char_u *regchars; /* region names */ - int ascii; /* TRUE for ascii spell file */ { - winfo_T wif; - garray_T *gap; - hashitem_T *hi; - char_u **wtab; - int todo; - int flags, aflags; - basicword_T *bw, *bwf, *bw2 = NULL; - int i; + FILE *fd; + int regionmask; int round; - garray_T bwga; + wordnode_T *tree; + int nodecount; - vim_memset(&wif, 0, sizeof(winfo_T)); - - wif.wif_fd = fopen((char *)fname, "w"); - if (wif.wif_fd == NULL) + fd = fopen((char *)fname, "w"); + if (fd == NULL) { EMSG2(_(e_notopen), fname); return; @@ -4352,462 +2384,164 @@ write_vim_spell(fname, prefga, suffga, n /*
: ... * */ - fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, wif.wif_fd); /* */ + + /* */ + if (fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd) != 1) + EMSG(_(e_write)); /* write the region names if there is more than one */ if (regcount > 1) { - putc(regcount, wif.wif_fd); /* ... */ - fwrite(regchars, (size_t)(regcount * 2), (size_t)1, wif.wif_fd); - wif.wif_regionmask = (1 << regcount) - 1; + putc(regcount, fd); /* ... */ + fwrite(regchars, (size_t)(regcount * 2), (size_t)1, fd); + regionmask = (1 << regcount) - 1; } else { - putc(0, wif.wif_fd); - wif.wif_regionmask = 0; + putc(0, fd); + regionmask = 0; } /* Write the table with character flags and table for case folding. * * Skip this for ASCII, the table may conflict with the one used for * 'encoding'. */ - if (ascii) + if (spin->si_ascii) { - putc(0, wif.wif_fd); - putc(0, wif.wif_fd); - putc(0, wif.wif_fd); + putc(0, fd); + putc(0, fd); + putc(0, fd); } else - write_spell_chartab(wif.wif_fd); + write_spell_chartab(fd); - /* : ... - * : ... */ - for (round = 1; round <= 2; ++round) - { - gap = round == 1 ? prefga : suffga; - put_bytes(wif.wif_fd, (long_u)gap->ga_len, 2); /* */ - - for (i = 0; i < gap->ga_len; ++i) - write_affix(wif.wif_fd, (affheader_T *)gap->ga_data + i); - } - - /* Number of bytes used for affix NR depends on affix count. */ - wif.wif_prefm = (prefga->ga_len > 256) ? 2 : 1; - wif.wif_suffm = (suffga->ga_len > 256) ? 2 : 1; /* : ... * TODO. Only write a zero length for now. */ - put_bytes(wif.wif_fd, 0L, 4); /* */ - - /* - * : ... - */ - - /* number of basic words in 4 bytes */ - put_bytes(wif.wif_fd, newwords->ht_used, 4); /* */ + put_bytes(fd, 0L, 4); /* */ /* - * Sort the word list, so that we can copy as many bytes as possible from - * the previous word. + * */ - wtab = (char_u **)alloc((unsigned)(sizeof(char_u *) * newwords->ht_used)); - if (wtab != NULL) + for (round = 1; round <= 2; ++round) { - /* Make a table with pointers to each word. */ - todo = newwords->ht_used; - for (hi = newwords->ht_array; todo > 0; ++hi) - if (!HASHITEM_EMPTY(hi)) - wtab[--todo] = hi->hi_key; - - /* Sort. */ - sort_strings(wtab, (int)newwords->ht_used); - - /* Now write each basic word to the spell file. */ - ga_init2(&bwga, sizeof(basicword_T *), 10); - for (todo = 0; (long_u)todo < newwords->ht_used; ++todo) - { - bwf = KEY2BW(wtab[todo]); - - /* - * Reorder the list of basicword_T words: make a list for words - * with the same case-folded word. Put them together for same - * caps (ONECAP, ALLCAP and various KEEPCAP words) and same - * affixes. Each list will then be put as a basic word with - * additions. - * This won't take much space, since the basic word is the same - * every time, only its length is written. - */ - bwga.ga_len = 0; - for (bw = bwf; bw != NULL; bw = bw->bw_next) - { - flags = bw->bw_flags & (BWF_ONECAP | BWF_KEEPCAP | BWF_ALLCAP); + tree = (round == 1) ? spin->si_foldroot : spin->si_keeproot; - /* Go through the lists we found so far. Break when the case - * matches. */ - for (i = 0; i < bwga.ga_len; ++i) - { - bw2 = ((basicword_T **)bwga.ga_data)[i]; - aflags = bw2->bw_flags & (BWF_ONECAP | BWF_KEEPCAP - | BWF_ALLCAP); - if (flags == aflags - && ((flags & BWF_KEEPCAP) == 0 - || bw->bw_caseword == NULL - || bw2->bw_caseword == NULL - || STRCMP(bw->bw_caseword, - bw2->bw_caseword) == 0) - && same_affixes(bw, bw2)) - break; - } - if (i == bwga.ga_len) - { - /* No word with similar caps, make a new list. */ - if (ga_grow(&bwga, 1) == FAIL) - break; - ((basicword_T **)bwga.ga_data)[i] = bw; - bw->bw_cnext = NULL; - ++bwga.ga_len; - } - else - { - /* Add to list of words with similar caps. */ - bw->bw_cnext = bw2->bw_cnext; - bw2->bw_cnext = bw; - } - } + /* Count the number of nodes. Needed to be able to allocate the + * memory when reading the nodes. Also fills in the index for shared + * nodes. */ + nodecount = put_tree(NULL, tree, 0, regionmask); - /* Prefer the word with no caps to use as the first basic word. - * At least one without KEEPCAP. */ - bw = NULL; - for (i = 0; i < bwga.ga_len; ++i) - { - bw2 = ((basicword_T **)bwga.ga_data)[i]; - if (bw == NULL - || (bw2->bw_flags & (BWF_ONECAP | BWF_KEEPCAP - | BWF_ALLCAP)) == 0 - || (bw->bw_flags & BWF_KEEPCAP)) - bw = bw2; - } + /* number of nodes in 4 bytes */ + put_bytes(fd, (long_u)nodecount, 4); /* */ - /* Write first basic word. If it's KEEPCAP then we need a word - * without VALID flag first (makes it easier to read the list back - * in). */ - if (bw->bw_flags & BWF_KEEPCAP) - write_bword(&wif, bw, TRUE); - write_bword(&wif, bw, FALSE); - - /* Write other basic words, with different caps. */ - for (i = 0; i < bwga.ga_len; ++i) - { - bw2 = ((basicword_T **)bwga.ga_data)[i]; - if (bw2 != bw) - write_bword(&wif, bw2, FALSE); - } - } - - ga_clear(&bwga); - vim_free(wtab); + /* Write the nodes. */ + (void)put_tree(fd, tree, 0, regionmask); } - fclose(wif.wif_fd); - - /* Print a few statistics. */ - if (wif.wif_addmaxw == NULL) - wif.wif_addmaxw = (char_u *)""; - smsg((char_u *)_("Maximum number of adds on a word: %ld (%s)"), - wif.wif_addmax, wif.wif_addmaxw); - smsg((char_u *)_("Average number of adds on a word: %f"), - (float)wif.wif_acount / (float)wif.wif_wcount); -} - -/* - * Compare two basic words for their . - */ -static int -#ifdef __BORLANDC__ -_RTLENTRYF -#endif -bw_compare __ARGS((const void *s1, const void *s2)); - - static int -#ifdef __BORLANDC__ -_RTLENTRYF -#endif -bw_compare(s1, s2) - const void *s1; - const void *s2; -{ - basicword_T *bw1 = *(basicword_T **)s1; - basicword_T *bw2 = *(basicword_T **)s2; - int i = 0; - - /* compare the leadstrings */ - if (bw1->bw_leadstring == NULL) - { - if (bw2->bw_leadstring != NULL) - return 1; - } - else if (bw2->bw_leadstring == NULL) - return -1; - else - i = STRCMP(bw1->bw_leadstring, bw2->bw_leadstring); - - if (i == 0) - { - /* leadstrings are identical, compare the addstrings */ - if (bw1->bw_addstring == NULL) - { - if (bw2->bw_addstring != NULL) - return 1; - } - else if (bw2->bw_addstring == NULL) - return -1; - else - i = STRCMP(bw1->bw_addstring, bw2->bw_addstring); - } - return i; + fclose(fd); } /* - * Write basic word, followed by any additions. + * Dump a word tree at node "node". + * + * This first writes the list of possible bytes (siblings). Then for each + * byte recursively write the children. + * + * NOTE: The code here must match the code in read_tree(), since assumptions + * are made about the indexes (so that we don't have to write them in the + * file). * - * : [] - * [ ] - * [ ...] (prefixes) - * [ ...] (suffixes) - * [] - * [ ...] + * Returns the number of nodes used. */ - static void -write_bword(wif, bwf, lowcap) - winfo_T *wif; /* info for writing */ - basicword_T *bwf; - int lowcap; /* write KEEPKAP word as not-valid */ + static int +put_tree(fd, node, index, regionmask) + FILE *fd; /* NULL when only counting */ + wordnode_T *node; + int index; + int regionmask; { - FILE *fd = wif->wif_fd; + int newindex = index; + int siblingcount = 0; + wordnode_T *np; int flags; - int aflags; - int len; - int leadlen, addlen; - int copylen; - int clen; - int adds = 0; - int i; - int idx; - basicword_T *bw, *bw2; - basicword_T **wtab; - int count; - int l; + + /* If "node" is zero the tree is empty. */ + if (node == NULL) + return 0; + + /* Store the index where this node is written. */ + node->wn_index = index; - /* Check how many bytes can be copied from the previous word. */ - len = STRLEN(bwf->bw_word); - if (wif->wif_prevbw == NULL) - clen = 0; - else - for (clen = 0; clen < len - && wif->wif_prevbw->bw_word[clen] == bwf->bw_word[clen]; ++clen) - ; - putc(clen, fd); /* */ - wif->wif_prevbw = bwf; - /* */ - if (len > clen) - fwrite(bwf->bw_word + clen, (size_t)(len - clen), (size_t)1, fd); + /* Count the number of siblings. */ + for (np = node; np != NULL; np = np->wn_sibling) + ++siblingcount; - /* Try to find a word without additions to use first. */ - bw = bwf; - for (bw2 = bwf; bw2 != NULL; bw2 = bw2->bw_cnext) - { - if (bw2->bw_addstring != NULL || bw2->bw_leadstring != NULL) - ++adds; - else - bw = bw2; - } + /* Write the sibling count. */ + if (fd != NULL) + putc(siblingcount, fd); /* */ - /* Flags: If there is no leadstring and no addstring the basic word is - * valid, may have prefixes, suffixes and region. */ - flags = bw->bw_flags; - if (bw->bw_addstring == NULL && bw->bw_leadstring == NULL) + /* Write each sibling byte and optionally extra info. */ + for (np = node; np != NULL; np = np->wn_sibling) { - flags |= BWF_VALID; - - /* Flags: add the region byte if the word isn't valid in all - * regions. */ - if (wif->wif_regionmask != 0 && (bw->bw_region & wif->wif_regionmask) - != wif->wif_regionmask) - flags |= BWF_REGION; - } - /* Add the prefix/suffix list if there are prefixes/suffixes. */ - if (bw->bw_leadstring == NULL && bw->bw_prefix.ga_len > 0) - flags |= BWF_PREFIX; - if (bw->bw_addstring == NULL && bw->bw_suffix.ga_len > 0) - flags |= BWF_SUFFIX; - - /* Flags: may have additions. */ - if (adds > 0) - { - flags |= BWF_ADDS; - if (adds >= 256) - flags |= BWF_ADDS_M; - } + if (np->wn_byte == 0) + { + if (fd != NULL) + { + /* For a NUL byte (end of word) instead of the byte itself + * we write the flag/region items. */ + flags = np->wn_flags; + if (regionmask != 0 && np->wn_region != regionmask) + flags |= WF_REGION; + if (flags == 0) + { + /* word without flags or region */ + putc(BY_NOFLAGS, fd); /* */ + } + else + { + putc(BY_FLAGS, fd); /* */ + putc(flags, fd); /* */ + if (flags & WF_REGION) + putc(np->wn_region, fd); /* */ + } + } + } + else + { + if (np->wn_child->wn_index != 0 && np->wn_child->wn_wnode != node) + { + /* The child is written elsewhere, write the reference. */ + if (fd != NULL) + { + putc(BY_INDEX, fd); /* */ + /* */ + put_bytes(fd, (long_u)np->wn_child->wn_index, 3); + } + } + else if (np->wn_child->wn_wnode == NULL) + /* We will write the child below and give it an index. */ + np->wn_child->wn_wnode = node; - /* The dummy word before a KEEPCAP word doesn't have any flags, they are - * in the actual word that follows. */ - if (lowcap) - flags = 0; - - /* Flags: when the upper byte is not used we only write one flags - * byte, if it's used then set an extra flag in the first byte and - * also write the second byte. */ - if ((flags & 0xff00) == 0) - putc(flags, fd); /* */ - else - { - putc(flags | BWF_SECOND, fd); /* */ - putc((int)((unsigned)flags >> 8), fd); /* */ - } - - /* First dummy word doesn't need anything but flags. */ - if (lowcap) - return; - - if ((flags & BWF_KEEPCAP) && bw->bw_caseword != NULL) - { - len = STRLEN(bw->bw_caseword); - putc(len, fd); /* */ - for (i = 0; i < len; ++i) - putc(bw->bw_caseword[i], fd); /* */ + if (fd != NULL) + if (putc(np->wn_byte, fd) == EOF) /* or */ + { + EMSG(_(e_write)); + return 0; + } + } } - /* write prefix and suffix lists: ... */ - if (flags & BWF_PREFIX) - write_affixlist(fd, &bw->bw_prefix, wif->wif_prefm); - if (flags & BWF_SUFFIX) - write_affixlist(fd, &bw->bw_suffix, wif->wif_suffm); - - if (flags & BWF_REGION) - putc(bw->bw_region, fd); /* */ - - ++wif->wif_wcount; - - /* - * Additions. - */ - if (adds > 0) - { - if (adds >= 256) - put_bytes(fd, (long_u)adds, 2); /* 2 byte */ - else - putc(adds, fd); /* 1 byte */ - - /* statistics */ - wif->wif_acount += adds; - if (wif->wif_addmax < adds) - { - wif->wif_addmax = adds; - wif->wif_addmaxw = bw->bw_word; - } - - /* - * Sort the list of additions, so that we can copy as many bytes as - * possible from the previous addstring. - */ - - /* Make a table with pointers to each basic word that has additions. */ - wtab = (basicword_T **)alloc((unsigned)(sizeof(basicword_T *) * adds)); - if (wtab == NULL) - return; - count = 0; - for (bw = bwf; bw != NULL; bw = bw->bw_cnext) - if (bw->bw_leadstring != NULL || bw->bw_addstring != NULL) - wtab[count++] = bw; - - /* Sort. */ - qsort((void *)wtab, (size_t)count, sizeof(basicword_T *), bw_compare); - - /* Now write each basic word to the spell file. Copy bytes from the - * previous leadstring/addstring if possible. */ - bw2 = NULL; - for (idx = 0; idx < count; ++idx) - { - bw = wtab[idx]; + /* Space used in the array when reading: one for each sibling and one for + * the count. */ + newindex += siblingcount + 1; - /* : [] [] - * [] [] */ - copylen = 0; - if (bw->bw_leadstring == NULL) - leadlen = 0; - else - { - leadlen = STRLEN(bw->bw_leadstring); - if (bw2 != NULL && bw2->bw_leadstring != NULL) - for ( ; copylen < leadlen; ++copylen) - if (bw->bw_leadstring[copylen] - != bw2->bw_leadstring[copylen]) - break; - } - if (bw->bw_addstring == NULL) - addlen = 0; - else - { - addlen = STRLEN(bw->bw_addstring); - if (bw2 != NULL && copylen == leadlen - && bw2->bw_addstring != NULL) - { - for (i = 0; i < addlen; ++i) - if (bw->bw_addstring[i] != bw2->bw_addstring[i]) - break; - copylen += i; - } - } - - aflags = 0; - /* Only copy bytes when it's more than one, the length itself - * takes an extra byte. */ - if (copylen > 1) - aflags |= ADD_COPYLEN; - else - copylen = 0; + /* Recursively dump the children of each sibling. */ + for (np = node; np != NULL; np = np->wn_sibling) + if (np->wn_byte != 0 && np->wn_child->wn_wnode == node) + newindex = put_tree(fd, np->wn_child, newindex, regionmask); - if (bw->bw_flags & BWF_ONECAP) - aflags |= ADD_ONECAP; - if (bw->bw_flags & BWF_ALLCAP) - aflags |= ADD_ALLCAP; - if (bw->bw_flags & BWF_KEEPCAP) - aflags |= ADD_KEEPCAP; - if (wif->wif_regionmask != 0 && (bw->bw_region - & wif->wif_regionmask) != wif->wif_regionmask) - aflags |= ADD_REGION; - if (leadlen > 0) - aflags |= ADD_LEADLEN; - putc(aflags, fd); /* */ - - putc(leadlen + addlen, fd); /* */ - if (aflags & ADD_LEADLEN) - putc(leadlen, fd); /* */ - if (aflags & ADD_COPYLEN) - putc(copylen, fd); /* */ - - /* */ - if (leadlen > copylen && bw->bw_leadstring != NULL) - fwrite(bw->bw_leadstring + copylen, - (size_t)(leadlen - copylen), (size_t)1, fd); - if (leadlen + addlen > copylen && bw->bw_addstring != NULL) - { - if (copylen >= leadlen) - l = copylen - leadlen; - else - l = 0; - fwrite(bw->bw_addstring + l, - (size_t)(addlen - l), (size_t)1, fd); - } - - if (aflags & ADD_REGION) - putc(bw->bw_region, fd); /* */ - - bw2 = bw; - } - - vim_free(wtab); - } + return newindex; } @@ -4823,20 +2557,19 @@ ex_mkspell(eap) char_u fname[MAXPATHL]; char_u wfname[MAXPATHL]; afffile_T *(afile[8]); - hashtab_T dfile[8]; int i; int len; char_u region_name[16]; struct stat st; - int round; - vimconv_T conv; - int ascii = FALSE; char_u *arg = eap->arg; int error = FALSE; + spellinfo_T spin; + + vim_memset(&spin, 0, sizeof(spin)); if (STRNCMP(arg, "-ascii", 6) == 0) { - ascii = TRUE; + spin.si_ascii = TRUE; arg = skipwhite(arg + 6); } @@ -4852,7 +2585,7 @@ ex_mkspell(eap) /* Check for overwriting before doing things that may take a lot of * time. */ vim_snprintf((char *)wfname, sizeof(wfname), "%s.%s.spl", fnames[0], - ascii ? (char_u *)"ascii" : p_enc); + spin.si_ascii ? (char_u *)"ascii" : p_enc); if (!eap->forceit && mch_stat((char *)wfname, &st) >= 0) { EMSG(_(e_exists)); @@ -4871,7 +2604,7 @@ ex_mkspell(eap) for (i = 1; i < fcount; ++i) { afile[i - 1] = NULL; - hash_init(&dfile[i - 1]); + if (fcount > 2) { len = STRLEN(fnames[i]); @@ -4893,192 +2626,96 @@ ex_mkspell(eap) * used spell properties. */ init_spell_chartab(); + spin.si_foldroot = wordtree_alloc(&spin.si_blocks); + spin.si_keeproot = wordtree_alloc(&spin.si_blocks); + if (spin.si_foldroot == NULL || spin.si_keeproot == NULL) + { + error = TRUE; + goto theend; + } + /* * Read all the .aff and .dic files. * Text is converted to 'encoding'. + * Words are stored in the case-folded and keep-case trees. */ - for (i = 1; i < fcount; ++i) + for (i = 1; i < fcount && !error; ++i) { - /* Read the .aff file. Will init "conv" based on the "SET" line. */ - conv.vc_type = CONV_NONE; + spin.si_conv.vc_type = CONV_NONE; + spin.si_region = 1 << (i - 1); + vim_snprintf((char *)fname, sizeof(fname), "%s.aff", fnames[i]); - if ((afile[i - 1] = spell_read_aff(fname, &conv, ascii)) == NULL) - break; - - /* Read the .dic file. */ - vim_snprintf((char *)fname, sizeof(fname), "%s.dic", fnames[i]); - if (spell_read_dic(&dfile[i - 1], fname, &conv, ascii) == FAIL) - break; + if (mch_stat((char *)fname, &st) >= 0) + { + /* Read the .aff file. Will init "spin->si_conv" based on the + * "SET" line. */ + afile[i - 1] = spell_read_aff(fname, &spin); + if (afile[i - 1] == NULL) + error = TRUE; + else + { + /* Read the .dic file and store the words in the trees. */ + vim_snprintf((char *)fname, sizeof(fname), "%s.dic", + fnames[i]); + if (spell_read_dic(fname, &spin, afile[i - 1]) == FAIL) + error = TRUE; + } + } + else + { + /* No .aff file, try reading the file as a word list. Store + * the words in the trees. */ + if (spell_read_wordfile(fnames[i], &spin) == FAIL) + error = TRUE; + } /* Free any conversion stuff. */ - convert_setup(&conv, NULL, NULL); + convert_setup(&spin.si_conv, NULL, NULL); } - /* Process the data when all the files could be read. */ - if (i == fcount) + if (!error) { - garray_T prefga; - garray_T suffga; - garray_T *gap; - hashtab_T newwords; - /* - * Combine all the affixes into one new affix list. This is done - * for prefixes and suffixes separately. - * We need to do this for each region, try to re-use the same - * affixes. - * Since we number the new affix entries, a growarray will do. In - * the affheader_T the ah_key is unused. + * Remove the dummy NUL from the start of the tree root. */ - MSG(_("Combining affixes...")); - out_flush(); - for (round = 1; round <= 2; ++round) - { - gap = round == 1 ? &prefga : &suffga; - ga_init2(gap, sizeof(affheader_T), 50); - for (i = 1; i < fcount; ++i) - get_new_aff(round == 1 ? &afile[i - 1]->af_pref - : &afile[i - 1]->af_suff, - gap, round == 1); - } + spin.si_foldroot = spin.si_foldroot->wn_sibling; + spin.si_keeproot = spin.si_keeproot->wn_sibling; /* - * Go over all words and: - * - change the old affix names to the new affix numbers - * - check the conditions - * - fold case - * - extract the basic word and additions. - * Do this for each region. + * Combine tails in the tree. */ - MSG(_("Building word list...")); + MSG(_("Compressing word tree...")); out_flush(); - hash_init(&newwords); - - for (i = 1; i < fcount; ++i) - build_wordlist(&newwords, &dfile[i - 1], afile[i - 1], - 1 << (i - 1)); - - if (fcount > 2) - { - /* Combine words for the different regions into one. */ - MSG(_("Combining regions...")); - out_flush(); - combine_regions(&newwords); - } - - /* - * Affixes on a word with additions are clumsy, would require - * inefficient searching. Turn the affixes into additions and/or - * the expanded word. - */ - MSG(_("Processing words...")); - out_flush(); - error = expand_affixes(&newwords, &prefga, &suffga) == FAIL; - - if (!error) - { - /* Write the info in the spell file. */ - smsg((char_u *)_("Writing spell file %s..."), wfname); - out_flush(); - write_vim_spell(wfname, &prefga, &suffga, &newwords, - fcount - 1, region_name, ascii); - MSG(_("Done!")); - out_flush(); - } - - /* Free the allocated stuff. */ - free_wordtable(&newwords); - for (round = 1; round <= 2; ++round) - { - gap = round == 1 ? &prefga: &suffga; - for (i = 0; i < gap->ga_len; ++i) - free_affixentries(((affheader_T *)gap->ga_data + i) - ->ah_first); - ga_clear(gap); - } + wordtree_compress(spin.si_foldroot); + wordtree_compress(spin.si_keeproot); } - /* Free the .aff and .dic file structures. */ + if (!error) + { + /* + * Write the info in the spell file. + */ + smsg((char_u *)_("Writing spell file %s..."), wfname); + out_flush(); + write_vim_spell(wfname, &spin, fcount - 1, region_name); + MSG(_("Done!")); + out_flush(); + } + + /* Free the allocated memory. */ + free_blocks(spin.si_blocks); + + /* Free the .aff file structures. */ for (i = 1; i < fcount; ++i) - { if (afile[i - 1] != NULL) spell_free_aff(afile[i - 1]); - spell_free_dic(&dfile[i - 1]); - } } theend: FreeWild(fcount, fnames); } - static void -free_wordtable(ht) - hashtab_T *ht; -{ - int todo; - basicword_T *bw, *nbw; - hashitem_T *hi; - - todo = ht->ht_used; - for (hi = ht->ht_array; todo > 0; ++hi) - { - if (!HASHITEM_EMPTY(hi)) - { - --todo; - for (bw = HI2BW(hi); bw != NULL; bw = nbw) - { - nbw = bw->bw_next; - free_basicword(bw); - } - } - } -} - -/* - * Free a basicword_T and what it contains. - */ - static void -free_basicword(bw) - basicword_T *bw; -{ - ga_clear(&bw->bw_prefix); - ga_clear(&bw->bw_suffix); - vim_free(bw->bw_caseword); - vim_free(bw->bw_leadstring); - vim_free(bw->bw_addstring); - vim_free(bw); -} - -/* - * Free a list of affentry_T and what they contain. - */ - static void -free_affixentries(first) - affentry_T *first; -{ - affentry_T *ap, *an; - - for (ap = first; ap != NULL; ap = an) - { - an = ap->ae_next; - free_affix_entry(ap); - } -} - -/* - * Free one affentry_T and what it contains. - */ - static void -free_affix_entry(ap) - affentry_T *ap; -{ - vim_free(ap->ae_chop); - vim_free(ap->ae_add); - vim_free(ap->ae_cond); - vim_free(ap->ae_prog); - vim_free(ap); -} - #endif /* FEAT_MBYTE */ + #endif /* FEAT_SYN_HL */