diff options
author | Thiago de Arruda <tpadilha84@gmail.com> | 2014-06-02 11:24:02 -0300 |
---|---|---|
committer | Thiago de Arruda <tpadilha84@gmail.com> | 2014-06-02 11:24:02 -0300 |
commit | cab8cf970c09ea465d30e11eb356e2e5d37dc544 (patch) | |
tree | 5d274c892e4d53f5e976ae8f6f58aba030785e02 /src/nvim/spell.c | |
parent | 52a9a5b0b0c53a1481d901f39ed0d1e7e86c3853 (diff) | |
parent | 4aecb71b0e819aa84a430dacdab2146229c410a5 (diff) | |
download | rneovim-cab8cf970c09ea465d30e11eb356e2e5d37dc544.tar.gz rneovim-cab8cf970c09ea465d30e11eb356e2e5d37dc544.tar.bz2 rneovim-cab8cf970c09ea465d30e11eb356e2e5d37dc544.zip |
Merge pull request #710 'Automatically generate declarations'
Diffstat (limited to 'src/nvim/spell.c')
-rw-r--r-- | src/nvim/spell.c | 651 |
1 files changed, 224 insertions, 427 deletions
diff --git a/src/nvim/spell.c b/src/nvim/spell.c index 901115e55f..a3e104b160 100644 --- a/src/nvim/spell.c +++ b/src/nvim/spell.c @@ -716,20 +716,6 @@ typedef struct spelltab_S { char_u st_upper[256]; // chars: upper case } spelltab_T; -static spelltab_T spelltab; -static int did_set_spelltab; - -#define CF_WORD 0x01 -#define CF_UPPER 0x02 - -static void clear_spell_chartab(spelltab_T *sp); -static int set_spell_finish(spelltab_T *new_st); -static int spell_iswordp(char_u *p, win_T *wp); -static int spell_iswordp_nmw(char_u *p, win_T *wp); -static int spell_mb_isword_class(int cl, win_T *wp); -static int spell_iswordp_w(int *p, win_T *wp); -static int write_spell_prefcond(FILE *fd, garray_T *gap); - // For finding suggestions: At each node in the tree these states are tried: typedef enum { STATE_START = 0, // At start of node check for NUL bytes (goodword @@ -780,6 +766,230 @@ typedef struct trystate_S { // valid when "ts_flags" has TSF_DIDDEL } trystate_T; +// Structure used for the cookie argument of do_in_runtimepath(). +typedef struct spelload_S { + char_u sl_lang[MAXWLEN + 1]; // language name + slang_T *sl_slang; // resulting slang_T struct + int sl_nobreak; // NOBREAK language found +} spelload_T; + +#define SY_MAXLEN 30 +typedef struct syl_item_S { + char_u sy_chars[SY_MAXLEN]; // the sequence of chars + int sy_len; +} syl_item_T; + +#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. +typedef struct afffile_S { + char_u *af_enc; // "SET", normalized, alloc'ed string or NULL + int af_flagtype; // AFT_CHAR, AFT_LONG, AFT_NUM or AFT_CAPLONG + unsigned af_rare; // RARE ID for rare word + unsigned af_keepcase; // KEEPCASE ID for keep-case word + unsigned af_bad; // BAD ID for banned word + unsigned af_needaffix; // NEEDAFFIX ID + unsigned af_circumfix; // CIRCUMFIX ID + unsigned af_needcomp; // NEEDCOMPOUND ID + unsigned af_comproot; // COMPOUNDROOT ID + unsigned af_compforbid; // COMPOUNDFORBIDFLAG ID + unsigned af_comppermit; // COMPOUNDPERMITFLAG ID + unsigned af_nosuggest; // NOSUGGEST ID + int af_pfxpostpone; // postpone prefixes without chop string and + // without flags + hashtab_T af_pref; // hashtable for prefixes, affheader_T + hashtab_T af_suff; // hashtable for suffixes, affheader_T + hashtab_T af_comp; // hashtable for compound flags, compitem_T +} afffile_T; + +#define AFT_CHAR 0 // flags are one character +#define AFT_LONG 1 // flags are two characters +#define AFT_CAPLONG 2 // flags are one or two characters +#define AFT_NUM 3 // flags are numbers, comma separated + +typedef struct affentry_S affentry_T; +// 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_flags; // flags on the affix (can be NULL) + char_u *ae_cond; // condition (NULL for ".") + regprog_T *ae_prog; // regexp program for ae_cond or NULL + char ae_compforbid; // COMPOUNDFORBIDFLAG found + char ae_comppermit; // COMPOUNDPERMITFLAG found +}; + +# define AH_KEY_LEN 17 // 2 x 8 bytes + NUL + +// Affix header from ".aff" file. Used for af_pref and af_suff. +typedef struct affheader_S { + char_u ah_key[AH_KEY_LEN]; // key for hashtab == name of affix + unsigned ah_flag; // affix name as number, uses "af_flagtype" + int ah_newID; // prefix ID after renumbering; 0 if not used + int ah_combine; // suffix may combine with prefix + int ah_follows; // another affix block should be following + affentry_T *ah_first; // first affix entry +} affheader_T; + +#define HI2AH(hi) ((affheader_T *)(hi)->hi_key) + +// Flag used in compound items. +typedef struct compitem_S { + char_u ci_key[AH_KEY_LEN]; // key for hashtab == name of compound + unsigned ci_flag; // affix name as number, uses "af_flagtype" + int ci_newID; // affix ID after renumbering. +} compitem_T; + +#define HI2CI(hi) ((compitem_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, everything is freed all at +// once after ":mkspell" is done. +// Note: "sb_next" must be just before "sb_data" to make sure the alignment of +// "sb_data" is correct for systems where pointers must be aligned on +// pointer-size boundaries and sizeof(pointer) > sizeof(int) (e.g., Sparc). +#define SBLOCKSIZE 16000 // size of sb_data +typedef struct sblock_S sblock_T; +struct sblock_S { + int sb_used; // nr of bytes already in use + sblock_T *sb_next; // next block in list + char_u sb_data[1]; // data, actually longer +}; + +// A node in the tree. +typedef struct wordnode_S wordnode_T; +struct wordnode_S { + union // shared to save space + { + char_u hashkey[6]; // the hash key, only used while compressing + int index; // index in written nodes (valid after first + // round) + } wn_u1; + union // shared to save space + { + wordnode_T *next; // next node with same hash key + wordnode_T *wnode; // parent node that will write this node + } wn_u2; + wordnode_T *wn_child; // child (next byte in word) + wordnode_T *wn_sibling; // next sibling (alternate byte in word, + // always sorted) + int wn_refs; // Nr. of references to this node. Only + // relevant for first node in a list of + // siblings, in following siblings it is + // always one. + char_u wn_byte; // Byte for this node. NUL for word end + + // Info for when "wn_byte" is NUL. + // In PREFIXTREE "wn_region" is used for the prefcondnr. + // In the soundfolded word tree "wn_flags" has the MSW of the wordnr and + // "wn_region" the LSW of the wordnr. + char_u wn_affixID; // supported/required prefix ID or 0 + uint16_t wn_flags; // WF_ flags + short wn_region; // region mask + +#ifdef SPELL_PRINTTREE + int wn_nr; // sequence nr for printing +#endif +}; + +#define WN_MASK 0xffff // mask relevant bits of "wn_flags" + +#define HI2WN(hi) (wordnode_T *)((hi)->hi_key) + +// Info used while reading the spell files. +typedef struct spellinfo_S { + wordnode_T *si_foldroot; // tree with case-folded words + long si_foldwcount; // nr of words in si_foldroot + + wordnode_T *si_keeproot; // tree with keep-case words + long si_keepwcount; // nr of words in si_keeproot + + wordnode_T *si_prefroot; // tree with postponed prefixes + + long si_sugtree; // creating the soundfolding trie + + sblock_T *si_blocks; // memory blocks used + long si_blocks_cnt; // memory blocks allocated + int si_did_emsg; // TRUE when ran out of memory + + long si_compress_cnt; // words to add before lowering + // compression limit + wordnode_T *si_first_free; // List of nodes that have been freed during + // compression, linked by "wn_child" field. + long si_free_count; // number of nodes in si_first_free +#ifdef SPELL_PRINTTREE + int si_wordnode_nr; // sequence nr for nodes +#endif + buf_T *si_spellbuf; // buffer used to store soundfold word table + + int si_ascii; // handling only ASCII words + int si_add; // addition file + int si_clear_chartab; // when TRUE clear char tables + int si_region; // region mask + vimconv_T si_conv; // for conversion to 'encoding' + int si_memtot; // runtime memory used + int si_verbose; // verbose messages + int si_msg_count; // number of words added since last message + char_u *si_info; // info text chars or NULL + int si_region_count; // number of regions supported (1 when there + // are no regions) + char_u si_region_name[17]; // region names; used only if + // si_region_count > 1) + + garray_T si_rep; // list of fromto_T entries from REP lines + garray_T si_repsal; // list of fromto_T entries from REPSAL lines + garray_T si_sal; // list of fromto_T entries from SAL lines + char_u *si_sofofr; // SOFOFROM text + char_u *si_sofoto; // SOFOTO text + int si_nosugfile; // NOSUGFILE item found + int si_nosplitsugs; // NOSPLITSUGS item found + int si_followup; // soundsalike: ? + int si_collapse; // soundsalike: ? + hashtab_T si_commonwords; // hashtable for common words + time_t si_sugtime; // timestamp for .sug file + int si_rem_accents; // soundsalike: remove accents + garray_T si_map; // MAP info concatenated + char_u *si_midword; // MIDWORD chars or NULL + int si_compmax; // max nr of words for compounding + int si_compminlen; // minimal length for compounding + int si_compsylmax; // max nr of syllables for compounding + int si_compoptions; // COMP_ flags + garray_T si_comppat; // CHECKCOMPOUNDPATTERN items, each stored as + // a string + char_u *si_compflags; // flags used for compounding + char_u si_nobreak; // NOBREAK + char_u *si_syllable; // syllable string + garray_T si_prefcond; // table with conditions for postponed + // prefixes, each stored as a string + int si_newprefID; // current value for ah_newID + int si_newcompID; // current value for compound ID +} spellinfo_T; + +static spelltab_T spelltab; +static int did_set_spelltab; + +#define CF_WORD 0x01 +#define CF_UPPER 0x02 + +// structure used to store soundfolded words that add_sound_suggest() has +// handled already. +typedef struct { + short sft_score; // lowest score used + char_u sft_word[1]; // soundfolded word, actually longer +} sftword_T; + +typedef struct { + int badi; + int goodi; + int score; +} limitscore_T; + + +#ifdef INCLUDE_GENERATED_DECLARATIONS +# include "spell.c.generated.h" +#endif + // values for ts_isdiff #define DIFF_NONE 0 // no different byte (yet) #define DIFF_YES 1 // different byte found @@ -802,133 +1012,6 @@ typedef struct trystate_S { #define FIND_COMPOUND 3 // find case-folded compound word #define FIND_KEEPCOMPOUND 4 // find keep-case compound word -static slang_T *slang_alloc(char_u *lang); -static void slang_free(slang_T *lp); -static void slang_clear(slang_T *lp); -static void slang_clear_sug(slang_T *lp); -static void find_word(matchinf_T *mip, int mode); -static int match_checkcompoundpattern(char_u *ptr, int wlen, - garray_T *gap); -static int can_compound(slang_T *slang, char_u *word, char_u *flags); -static int can_be_compound(trystate_T *sp, slang_T *slang, char_u *compflags, - int flag); -static int match_compoundrule(slang_T *slang, char_u *compflags); -static int valid_word_prefix(int totprefcnt, int arridx, int flags, - char_u *word, slang_T *slang, - int cond_req); -static void find_prefix(matchinf_T *mip, int mode); -static int fold_more(matchinf_T *mip); -static int spell_valid_case(int wordflags, int treeflags); -static int no_spell_checking(win_T *wp); -static void spell_load_lang(char_u *lang); -static char_u *spell_enc(void); -static void int_wordlist_spl(char_u *fname); -static void spell_load_cb(char_u *fname, void *cookie); -static slang_T *spell_load_file(char_u *fname, char_u *lang, slang_T *old_lp, - int silent); -static char_u *read_cnt_string(FILE *fd, int cnt_bytes, int *lenp); -static int read_region_section(FILE *fd, slang_T *slang, int len); -static int read_charflags_section(FILE *fd); -static int read_prefcond_section(FILE *fd, slang_T *lp); -static int read_rep_section(FILE *fd, garray_T *gap, short *first); -static int read_sal_section(FILE *fd, slang_T *slang); -static int read_words_section(FILE *fd, slang_T *lp, int len); -static void count_common_word(slang_T *lp, char_u *word, int len, - int count); -static int score_wordcount_adj(slang_T *slang, int score, char_u *word, - int split); -static int read_sofo_section(FILE *fd, slang_T *slang); -static int read_compound(FILE *fd, slang_T *slang, int len); -static int byte_in_str(char_u *str, int byte); -static int init_syl_tab(slang_T *slang); -static int count_syllables(slang_T *slang, char_u *word); -static int set_sofo(slang_T *lp, char_u *from, char_u *to); -static void set_sal_first(slang_T *lp); -static int *mb_str2wide(char_u *s); -static int spell_read_tree(FILE *fd, char_u **bytsp, idx_T **idxsp, - int prefixtree, - int prefixcnt); -static idx_T read_tree_node(FILE *fd, char_u *byts, idx_T *idxs, - int maxidx, idx_T startidx, int prefixtree, - int maxprefcondnr); -static void clear_midword(win_T *buf); -static void use_midword(slang_T *lp, win_T *buf); -static int find_region(char_u *rp, char_u *region); -static int captype(char_u *word, char_u *end); -static int badword_captype(char_u *word, char_u *end); -static void spell_reload_one(char_u *fname, int added_word); -static void set_spell_charflags(char_u *flags, int cnt, char_u *upp); -static int set_spell_chartab(char_u *fol, char_u *low, char_u *upp); -static int spell_casefold(char_u *p, int len, char_u *buf, int buflen); -static int check_need_cap(linenr_T lnum, colnr_T col); -static void spell_find_suggest(char_u *badptr, int badlen, suginfo_T *su, - int maxcount, int banbadword, - int need_cap, - int interactive); -static void spell_suggest_expr(suginfo_T *su, char_u *expr); -static void spell_suggest_file(suginfo_T *su, char_u *fname); -static void spell_suggest_intern(suginfo_T *su, int interactive); -static void suggest_load_files(void); -static void tree_count_words(char_u *byts, idx_T *idxs); -static void spell_find_cleanup(suginfo_T *su); -static void onecap_copy(char_u *word, char_u *wcopy, int upper); -static void allcap_copy(char_u *word, char_u *wcopy); -static void suggest_try_special(suginfo_T *su); -static void suggest_try_change(suginfo_T *su); -static void suggest_trie_walk(suginfo_T *su, langp_T *lp, char_u *fword, - int soundfold); -static void go_deeper(trystate_T *stack, int depth, int score_add); -static int nofold_len(char_u *fword, int flen, char_u *word); -static void find_keepcap_word(slang_T *slang, char_u *fword, - char_u *kword); -static void score_comp_sal(suginfo_T *su); -static void score_combine(suginfo_T *su); -static int stp_sal_score(suggest_T *stp, suginfo_T *su, slang_T *slang, - char_u *badsound); -static void suggest_try_soundalike_prep(void); -static void suggest_try_soundalike(suginfo_T *su); -static void suggest_try_soundalike_finish(void); -static void add_sound_suggest(suginfo_T *su, char_u *goodword, - int score, - langp_T *lp); -static int soundfold_find(slang_T *slang, char_u *word); -static void make_case_word(char_u *fword, char_u *cword, int flags); -static void set_map_str(slang_T *lp, char_u *map); -static int similar_chars(slang_T *slang, int c1, int c2); -static void add_suggestion(suginfo_T *su, garray_T *gap, char_u *goodword, - int badlen, int score, - int altscore, int had_bonus, slang_T *slang, - int maxsf); -static void check_suggestions(suginfo_T *su, garray_T *gap); -static void add_banned(suginfo_T *su, char_u *word); -static void rescore_suggestions(suginfo_T *su); -static void rescore_one(suginfo_T *su, suggest_T *stp); -static int cleanup_suggestions(garray_T *gap, int maxscore, int keep); -static void spell_soundfold(slang_T *slang, char_u *inword, int folded, - char_u *res); -static void spell_soundfold_sofo(slang_T *slang, char_u *inword, - char_u *res); -static void spell_soundfold_sal(slang_T *slang, char_u *inword, - char_u *res); -static void spell_soundfold_wsal(slang_T *slang, char_u *inword, - char_u *res); -static int soundalike_score(char_u *goodsound, char_u *badsound); -static int spell_edit_score(slang_T *slang, char_u *badword, - char_u *goodword); -static int spell_edit_score_limit(slang_T *slang, char_u *badword, - char_u *goodword, - int limit); -static int spell_edit_score_limit_w(slang_T *slang, char_u *badword, - char_u *goodword, - int limit); -static void dump_word(slang_T *slang, char_u *word, char_u *pat, - int *dir, int round, int flags, - linenr_T lnum); -static linenr_T dump_prefixes(slang_T *slang, char_u *word, char_u *pat, - int *dir, int round, int flags, - linenr_T startlnum); -static buf_T *open_spellbuf(void); -static void close_spellbuf(buf_T *buf); // Use our own character-case definitions, because the current locale may // differ from what the .spl file uses. @@ -2198,13 +2281,6 @@ void spell_cat_line(char_u *buf, char_u *line, int maxlen) } } -// Structure used for the cookie argument of do_in_runtimepath(). -typedef struct spelload_S { - char_u sl_lang[MAXWLEN + 1]; // language name - slang_T *sl_slang; // resulting slang_T struct - int sl_nobreak; // NOBREAK language found -} spelload_T; - // Load word list(s) for "lang" from Vim spell file(s). // "lang" must be the language without the region: e.g., "en". static void spell_load_lang(char_u *lang) @@ -3252,12 +3328,6 @@ static int byte_in_str(char_u *str, int n) return FALSE; } -#define SY_MAXLEN 30 -typedef struct syl_item_S { - char_u sy_chars[SY_MAXLEN]; // the sequence of chars - int sy_len; -} syl_item_T; - // Truncate "slang->sl_syllable" at the first slash and put the following items // in "slang->sl_syl_items". static int init_syl_tab(slang_T *slang) @@ -4141,262 +4211,6 @@ spell_reload_one ( // Functions for ":mkspell". -#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. -typedef struct afffile_S { - char_u *af_enc; // "SET", normalized, alloc'ed string or NULL - int af_flagtype; // AFT_CHAR, AFT_LONG, AFT_NUM or AFT_CAPLONG - unsigned af_rare; // RARE ID for rare word - unsigned af_keepcase; // KEEPCASE ID for keep-case word - unsigned af_bad; // BAD ID for banned word - unsigned af_needaffix; // NEEDAFFIX ID - unsigned af_circumfix; // CIRCUMFIX ID - unsigned af_needcomp; // NEEDCOMPOUND ID - unsigned af_comproot; // COMPOUNDROOT ID - unsigned af_compforbid; // COMPOUNDFORBIDFLAG ID - unsigned af_comppermit; // COMPOUNDPERMITFLAG ID - unsigned af_nosuggest; // NOSUGGEST ID - int af_pfxpostpone; // postpone prefixes without chop string and - // without flags - hashtab_T af_pref; // hashtable for prefixes, affheader_T - hashtab_T af_suff; // hashtable for suffixes, affheader_T - hashtab_T af_comp; // hashtable for compound flags, compitem_T -} afffile_T; - -#define AFT_CHAR 0 // flags are one character -#define AFT_LONG 1 // flags are two characters -#define AFT_CAPLONG 2 // flags are one or two characters -#define AFT_NUM 3 // flags are numbers, comma separated - -typedef struct affentry_S affentry_T; -// 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_flags; // flags on the affix (can be NULL) - char_u *ae_cond; // condition (NULL for ".") - regprog_T *ae_prog; // regexp program for ae_cond or NULL - char ae_compforbid; // COMPOUNDFORBIDFLAG found - char ae_comppermit; // COMPOUNDPERMITFLAG found -}; - -# define AH_KEY_LEN 17 // 2 x 8 bytes + NUL - -// Affix header from ".aff" file. Used for af_pref and af_suff. -typedef struct affheader_S { - char_u ah_key[AH_KEY_LEN]; // key for hashtab == name of affix - unsigned ah_flag; // affix name as number, uses "af_flagtype" - int ah_newID; // prefix ID after renumbering; 0 if not used - int ah_combine; // suffix may combine with prefix - int ah_follows; // another affix block should be following - affentry_T *ah_first; // first affix entry -} affheader_T; - -#define HI2AH(hi) ((affheader_T *)(hi)->hi_key) - -// Flag used in compound items. -typedef struct compitem_S { - char_u ci_key[AH_KEY_LEN]; // key for hashtab == name of compound - unsigned ci_flag; // affix name as number, uses "af_flagtype" - int ci_newID; // affix ID after renumbering. -} compitem_T; - -#define HI2CI(hi) ((compitem_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, everything is freed all at -// once after ":mkspell" is done. -// Note: "sb_next" must be just before "sb_data" to make sure the alignment of -// "sb_data" is correct for systems where pointers must be aligned on -// pointer-size boundaries and sizeof(pointer) > sizeof(int) (e.g., Sparc). -#define SBLOCKSIZE 16000 // size of sb_data -typedef struct sblock_S sblock_T; -struct sblock_S { - int sb_used; // nr of bytes already in use - sblock_T *sb_next; // next block in list - char_u sb_data[1]; // data, actually longer -}; - -// A node in the tree. -typedef struct wordnode_S wordnode_T; -struct wordnode_S { - union // shared to save space - { - char_u hashkey[6]; // the hash key, only used while compressing - int index; // index in written nodes (valid after first - // round) - } wn_u1; - union // shared to save space - { - wordnode_T *next; // next node with same hash key - wordnode_T *wnode; // parent node that will write this node - } wn_u2; - wordnode_T *wn_child; // child (next byte in word) - wordnode_T *wn_sibling; // next sibling (alternate byte in word, - // always sorted) - int wn_refs; // Nr. of references to this node. Only - // relevant for first node in a list of - // siblings, in following siblings it is - // always one. - char_u wn_byte; // Byte for this node. NUL for word end - - // Info for when "wn_byte" is NUL. - // In PREFIXTREE "wn_region" is used for the prefcondnr. - // In the soundfolded word tree "wn_flags" has the MSW of the wordnr and - // "wn_region" the LSW of the wordnr. - char_u wn_affixID; // supported/required prefix ID or 0 - uint16_t wn_flags; // WF_ flags - short wn_region; // region mask - -#ifdef SPELL_PRINTTREE - int wn_nr; // sequence nr for printing -#endif -}; - -#define WN_MASK 0xffff // mask relevant bits of "wn_flags" - -#define HI2WN(hi) (wordnode_T *)((hi)->hi_key) - -// Info used while reading the spell files. -typedef struct spellinfo_S { - wordnode_T *si_foldroot; // tree with case-folded words - long si_foldwcount; // nr of words in si_foldroot - - wordnode_T *si_keeproot; // tree with keep-case words - long si_keepwcount; // nr of words in si_keeproot - - wordnode_T *si_prefroot; // tree with postponed prefixes - - long si_sugtree; // creating the soundfolding trie - - sblock_T *si_blocks; // memory blocks used - long si_blocks_cnt; // memory blocks allocated - int si_did_emsg; // TRUE when ran out of memory - - long si_compress_cnt; // words to add before lowering - // compression limit - wordnode_T *si_first_free; // List of nodes that have been freed during - // compression, linked by "wn_child" field. - long si_free_count; // number of nodes in si_first_free -#ifdef SPELL_PRINTTREE - int si_wordnode_nr; // sequence nr for nodes -#endif - buf_T *si_spellbuf; // buffer used to store soundfold word table - - int si_ascii; // handling only ASCII words - int si_add; // addition file - int si_clear_chartab; // when TRUE clear char tables - int si_region; // region mask - vimconv_T si_conv; // for conversion to 'encoding' - int si_memtot; // runtime memory used - int si_verbose; // verbose messages - int si_msg_count; // number of words added since last message - char_u *si_info; // info text chars or NULL - int si_region_count; // number of regions supported (1 when there - // are no regions) - char_u si_region_name[17]; // region names; used only if - // si_region_count > 1) - - garray_T si_rep; // list of fromto_T entries from REP lines - garray_T si_repsal; // list of fromto_T entries from REPSAL lines - garray_T si_sal; // list of fromto_T entries from SAL lines - char_u *si_sofofr; // SOFOFROM text - char_u *si_sofoto; // SOFOTO text - int si_nosugfile; // NOSUGFILE item found - int si_nosplitsugs; // NOSPLITSUGS item found - int si_followup; // soundsalike: ? - int si_collapse; // soundsalike: ? - hashtab_T si_commonwords; // hashtable for common words - time_t si_sugtime; // timestamp for .sug file - int si_rem_accents; // soundsalike: remove accents - garray_T si_map; // MAP info concatenated - char_u *si_midword; // MIDWORD chars or NULL - int si_compmax; // max nr of words for compounding - int si_compminlen; // minimal length for compounding - int si_compsylmax; // max nr of syllables for compounding - int si_compoptions; // COMP_ flags - garray_T si_comppat; // CHECKCOMPOUNDPATTERN items, each stored as - // a string - char_u *si_compflags; // flags used for compounding - char_u si_nobreak; // NOBREAK - char_u *si_syllable; // syllable string - garray_T si_prefcond; // table with conditions for postponed - // prefixes, each stored as a string - int si_newprefID; // current value for ah_newID - int si_newcompID; // current value for compound ID -} spellinfo_T; - -static afffile_T *spell_read_aff(spellinfo_T *spin, char_u *fname); -static int is_aff_rule(char_u **items, int itemcnt, char *rulename, - int mincount); -static void aff_process_flags(afffile_T *affile, affentry_T *entry); -static int spell_info_item(char_u *s); -static unsigned affitem2flag(int flagtype, char_u *item, char_u *fname, - int lnum); -static unsigned get_affitem(int flagtype, char_u **pp); -static void process_compflags(spellinfo_T *spin, afffile_T *aff, - char_u *compflags); -static void check_renumber(spellinfo_T *spin); -static int flag_in_afflist(int flagtype, char_u *afflist, unsigned flag); -static void aff_check_number(int spinval, int affval, char *name); -static void aff_check_string(char_u *spinval, char_u *affval, - char *name); -static int str_equal(char_u *s1, char_u *s2); -static void add_fromto(spellinfo_T *spin, garray_T *gap, char_u *from, - char_u *to); -static int sal_to_bool(char_u *s); -static void spell_free_aff(afffile_T *aff); -static int spell_read_dic(spellinfo_T *spin, char_u *fname, - afffile_T *affile); -static int get_affix_flags(afffile_T *affile, char_u *afflist); -static int get_pfxlist(afffile_T *affile, char_u *afflist, - char_u *store_afflist); -static void get_compflags(afffile_T *affile, char_u *afflist, - char_u *store_afflist); -static int store_aff_word(spellinfo_T *spin, char_u *word, char_u *afflist, - afffile_T *affile, hashtab_T *ht, - hashtab_T *xht, int condit, int flags, - char_u *pfxlist, - int pfxlen); -static int spell_read_wordfile(spellinfo_T *spin, char_u *fname); -static void *getroom(spellinfo_T *spin, size_t len, int align); -static char_u *getroom_save(spellinfo_T *spin, char_u *s); -static void free_blocks(sblock_T *bl); -static wordnode_T *wordtree_alloc(spellinfo_T *spin); -static int store_word(spellinfo_T *spin, char_u *word, int flags, - int region, char_u *pfxlist, - int need_affix); -static int tree_add_word(spellinfo_T *spin, char_u *word, - wordnode_T *tree, int flags, int region, - int affixID); -static wordnode_T *get_wordnode(spellinfo_T *spin); -static int deref_wordnode(spellinfo_T *spin, wordnode_T *node); -static void free_wordnode(spellinfo_T *spin, wordnode_T *n); -static void wordtree_compress(spellinfo_T *spin, wordnode_T *root); -static int node_compress(spellinfo_T *spin, wordnode_T *node, - hashtab_T *ht, - int *tot); -static int node_equal(wordnode_T *n1, wordnode_T *n2); -static int write_vim_spell(spellinfo_T *spin, char_u *fname); -static void clear_node(wordnode_T *node); -static int put_node(FILE *fd, wordnode_T *node, int idx, int regionmask, - int prefixtree); -static void spell_make_sugfile(spellinfo_T *spin, char_u *wfname); -static int sug_filltree(spellinfo_T *spin, slang_T *slang); -static int sug_maketable(spellinfo_T *spin); -static int sug_filltable(spellinfo_T *spin, wordnode_T *node, - int startwordnr, - garray_T *gap); -static int offset2bytes(int nr, char_u *buf); -static int bytes2offset(char_u **pp); -static void sug_write(spellinfo_T *spin, char_u *fname); -static void mkspell(int fcount, char_u **fnames, int ascii, - int over_write, - int added_word); -static void spell_message(spellinfo_T *spin, char_u *str); -static void init_spellfile(void); // In the postponed prefixes tree wn_flags is used to store the WFP_ flags, // but it must be negative to indicate the prefix tree to tree_add_word(). @@ -6779,8 +6593,6 @@ static int node_equal(wordnode_T *n1, wordnode_T *n2) return p1 == NULL && p2 == NULL; } -static int -rep_compare(const void *s1, const void *s2); // Function given to qsort() to sort the REP items on "from" string. static int rep_compare(const void *s1, const void *s2) @@ -11176,13 +10988,6 @@ stp_sal_score ( return soundalike_score(goodsound, pbad); } -// structure used to store soundfolded words that add_sound_suggest() has -// handled already. -typedef struct { - short sft_score; // lowest score used - char_u sft_word[1]; // soundfolded word, actually longer -} sftword_T; - static sftword_T dumsft; #define HIKEY2SFT(p) ((sftword_T *)(p - (dumsft.sft_word - (char_u *)&dumsft))) #define HI2SFT(hi) HIKEY2SFT((hi)->hi_key) @@ -11820,8 +11625,6 @@ static void rescore_one(suginfo_T *su, suggest_T *stp) } } -static int -sug_compare(const void *s1, const void *s2); // Function given to qsort() to sort the suggestions on st_score. // First on "st_score", then "st_altscore" then alphabetically. @@ -12801,12 +12604,6 @@ static int spell_edit_score(slang_T *slang, char_u *badword, char_u *goodword) return i; } -typedef struct { - int badi; - int goodi; - int score; -} limitscore_T; - // Like spell_edit_score(), but with a limit on the score to make it faster. // May return SCORE_MAXMAX when the score is higher than "limit". // |