Merge #8845 from janlazo/vim-8.0.1490

This commit is contained in:
Justin M. Keyes 2018-08-10 20:08:18 +02:00 committed by GitHub
commit c30812be7b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 12 deletions

View File

@ -13,6 +13,9 @@
// Some places assume a word length fits in a // Some places assume a word length fits in a
// byte, thus it can't be above 255. // byte, thus it can't be above 255.
// Number of regions supported.
#define MAXREGIONS 8
// Type used for indexes in the word tree need to be at least 4 bytes. If int // Type used for indexes in the word tree need to be at least 4 bytes. If int
// is 8 bytes we could use something smaller, but what? // is 8 bytes we could use something smaller, but what?
typedef int idx_T; typedef int idx_T;
@ -124,7 +127,8 @@ struct slang_S {
char_u *sl_info; // infotext string or NULL char_u *sl_info; // infotext string or NULL
char_u sl_regions[17]; // table with up to 8 region names plus NUL char_u sl_regions[MAXREGIONS * 2 + 1];
// table with up to 8 region names plus NUL
char_u *sl_midword; // MIDWORD string or NULL char_u *sl_midword; // MIDWORD string or NULL

View File

@ -45,7 +45,8 @@
// website, etc) // website, etc)
// //
// sectionID == SN_REGION: <regionname> ... // sectionID == SN_REGION: <regionname> ...
// <regionname> 2 bytes Up to 8 region names: ca, au, etc. Lower case. // <regionname> 2 bytes Up to MAXREGIONS region names: ca, au, etc.
// Lower case.
// First <regionname> is region 1. // First <regionname> is region 1.
// //
// sectionID == SN_CHARFLAGS: <charflagslen> <charflags> // sectionID == SN_CHARFLAGS: <charflagslen> <charflags>
@ -460,7 +461,8 @@ typedef struct spellinfo_S {
char_u *si_info; // info text chars or NULL char_u *si_info; // info text chars or NULL
int si_region_count; // number of regions supported (1 when there int si_region_count; // number of regions supported (1 when there
// are no regions) // are no regions)
char_u si_region_name[17]; // region names; used only if char_u si_region_name[MAXREGIONS * 2 + 1];
// region names; used only if
// si_region_count > 1) // si_region_count > 1)
garray_T si_rep; // list of fromto_T entries from REP lines garray_T si_rep; // list of fromto_T entries from REP lines
@ -1003,7 +1005,7 @@ static char_u *read_cnt_string(FILE *fd, int cnt_bytes, int *cntp)
// Return SP_*ERROR flags. // Return SP_*ERROR flags.
static int read_region_section(FILE *fd, slang_T *lp, int len) static int read_region_section(FILE *fd, slang_T *lp, int len)
{ {
if (len > 16) { if (len > MAXREGIONS * 2) {
return SP_FORMERROR; return SP_FORMERROR;
} }
SPELL_READ_NONNUL_BYTES((char *)lp->sl_regions, (size_t)len, fd, ;); SPELL_READ_NONNUL_BYTES((char *)lp->sl_regions, (size_t)len, fd, ;);
@ -3612,10 +3614,10 @@ static int spell_read_wordfile(spellinfo_T *spin, char_u *fname)
fname, lnum, line); fname, lnum, line);
else { else {
line += 8; line += 8;
if (STRLEN(line) > 16) if (STRLEN(line) > MAXREGIONS * 2) {
smsg(_("Too many regions in %s line %d: %s"), smsg(_("Too many regions in %s line %d: %s"),
fname, lnum, line); fname, lnum, line);
else { } else {
spin->si_region_count = (int)STRLEN(line) / 2; spin->si_region_count = (int)STRLEN(line) / 2;
STRCPY(spin->si_region_name, line); STRCPY(spin->si_region_name, line);
@ -5077,7 +5079,7 @@ mkspell (
char_u *wfname; char_u *wfname;
char_u **innames; char_u **innames;
int incount; int incount;
afffile_T *(afile[8]); afffile_T *(afile[MAXREGIONS]);
int i; int i;
int len; int len;
bool error = false; bool error = false;
@ -5134,13 +5136,13 @@ mkspell (
spin.si_add = true; spin.si_add = true;
} }
if (incount <= 0) if (incount <= 0) {
EMSG(_(e_invarg)); // need at least output and input names EMSG(_(e_invarg)); // need at least output and input names
else if (vim_strchr(path_tail(wfname), '_') != NULL) } else if (vim_strchr(path_tail(wfname), '_') != NULL) {
EMSG(_("E751: Output file name must not have region name")); EMSG(_("E751: Output file name must not have region name"));
else if (incount > 8) } else if (incount > MAXREGIONS) {
EMSG(_("E754: Only up to 8 regions supported")); EMSGN(_("E754: Only up to %ld regions supported"), MAXREGIONS);
else { } else {
// Check for overwriting before doing things that may take a lot of // Check for overwriting before doing things that may take a lot of
// time. // time.
if (!over_write && os_path_exists(wfname)) { if (!over_write && os_path_exists(wfname)) {