To: vim_dev@googlegroups.com Subject: Patch 8.0.1723 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.1723 Problem: Using one item array size declaration is misleading. Solution: Instead of using "[1]" and actually using a larger array, use "[]". This is to verify that this C99 feature works for all compilers. Files: src/structs.h, src/getchar.c *** ../vim-8.0.1722/src/structs.h 2018-04-10 15:59:04.295392601 +0200 --- src/structs.h 2018-04-16 14:45:10.504367039 +0200 *************** *** 511,517 **** struct buffblock { buffblock_T *b_next; /* pointer to next buffblock */ ! char_u b_str[1]; /* contents (actually longer) */ }; /* --- 511,517 ---- struct buffblock { buffblock_T *b_next; /* pointer to next buffblock */ ! char_u b_str[]; /* contents (flexible array) */ }; /* *************** *** 519,525 **** */ struct buffheader { ! buffblock_T bh_first; /* first (dummy) block of list */ buffblock_T *bh_curr; /* buffblock for appending */ int bh_index; /* index for reading */ int bh_space; /* space in bh_curr for appending */ --- 519,525 ---- */ struct buffheader { ! buffblock_T *bh_first; /* first block of the list */ buffblock_T *bh_curr; /* buffblock for appending */ int bh_index; /* index for reading */ int bh_space; /* space in bh_curr for appending */ *** ../vim-8.0.1722/src/getchar.c 2018-03-04 18:07:04.256592423 +0100 --- src/getchar.c 2018-04-16 14:38:22.299064897 +0200 *************** *** 40,48 **** #define MINIMAL_SIZE 20 /* minimal size for b_str */ ! static buffheader_T redobuff = {{NULL, {NUL}}, NULL, 0, 0}; ! static buffheader_T old_redobuff = {{NULL, {NUL}}, NULL, 0, 0}; ! static buffheader_T recordbuff = {{NULL, {NUL}}, NULL, 0, 0}; static int typeahead_char = 0; /* typeahead char that's not flushed */ --- 40,48 ---- #define MINIMAL_SIZE 20 /* minimal size for b_str */ ! static buffheader_T redobuff = {NULL, NULL, 0, 0}; ! static buffheader_T old_redobuff = {NULL, NULL, 0, 0}; ! static buffheader_T recordbuff = {NULL, NULL, 0, 0}; static int typeahead_char = 0; /* typeahead char that's not flushed */ *************** *** 138,149 **** { buffblock_T *p, *np; ! for (p = buf->bh_first.b_next; p != NULL; p = np) { np = p->b_next; vim_free(p); } ! buf->bh_first.b_next = NULL; } /* --- 138,150 ---- { buffblock_T *p, *np; ! for (p = buf->bh_first; p != NULL; p = np) { np = p->b_next; vim_free(p); } ! buf->bh_first = NULL; ! buf->bh_curr = NULL; } /* *************** *** 159,174 **** char_u *p = NULL; char_u *p2; char_u *str; ! buffblock_T *bp; /* compute the total length of the string */ ! for (bp = buffer->bh_first.b_next; bp != NULL; bp = bp->b_next) count += (long_u)STRLEN(bp->b_str); if ((count || dozero) && (p = lalloc(count + 1, TRUE)) != NULL) { p2 = p; ! for (bp = buffer->bh_first.b_next; bp != NULL; bp = bp->b_next) for (str = bp->b_str; *str; ) *p2++ = *str++; *p2 = NUL; --- 160,175 ---- char_u *p = NULL; char_u *p2; char_u *str; ! buffblock_T *bp; /* compute the total length of the string */ ! for (bp = buffer->bh_first; bp != NULL; bp = bp->b_next) count += (long_u)STRLEN(bp->b_str); if ((count || dozero) && (p = lalloc(count + 1, TRUE)) != NULL) { p2 = p; ! for (bp = buffer->bh_first; bp != NULL; bp = bp->b_next) for (str = bp->b_str; *str; ) *p2++ = *str++; *p2 = NUL; *************** *** 232,248 **** long slen) /* length of "s" or -1 */ { buffblock_T *p; ! long_u len; if (slen < 0) slen = (long)STRLEN(s); if (slen == 0) /* don't add empty strings */ return; ! if (buf->bh_first.b_next == NULL) /* first add to list */ { buf->bh_space = 0; ! buf->bh_curr = &(buf->bh_first); } else if (buf->bh_curr == NULL) /* buffer has already been read */ { --- 233,249 ---- long slen) /* length of "s" or -1 */ { buffblock_T *p; ! long_u len; if (slen < 0) slen = (long)STRLEN(s); if (slen == 0) /* don't add empty strings */ return; ! if (buf->bh_first == NULL) /* first add to list */ { buf->bh_space = 0; ! buf->bh_curr = NULL; } else if (buf->bh_curr == NULL) /* buffer has already been read */ { *************** *** 250,258 **** return; } else if (buf->bh_index != 0) ! mch_memmove(buf->bh_first.b_next->b_str, ! buf->bh_first.b_next->b_str + buf->bh_index, ! STRLEN(buf->bh_first.b_next->b_str + buf->bh_index) + 1); buf->bh_index = 0; if (buf->bh_space >= (int)slen) --- 251,259 ---- return; } else if (buf->bh_index != 0) ! mch_memmove(buf->bh_first->b_str, ! buf->bh_first->b_str + buf->bh_index, ! STRLEN(buf->bh_first->b_str + buf->bh_index) + 1); buf->bh_index = 0; if (buf->bh_space >= (int)slen) *************** *** 267,282 **** len = MINIMAL_SIZE; else len = slen; ! p = (buffblock_T *)lalloc((long_u)(sizeof(buffblock_T) + len), ! TRUE); if (p == NULL) return; /* no space, just forget it */ buf->bh_space = (int)(len - slen); vim_strncpy(p->b_str, s, (size_t)slen); ! p->b_next = buf->bh_curr->b_next; ! buf->bh_curr->b_next = p; ! buf->bh_curr = p; } return; } --- 268,292 ---- len = MINIMAL_SIZE; else len = slen; ! p = (buffblock_T *)lalloc((long_u)(sizeof(buffblock_T) + len + 1), ! TRUE); if (p == NULL) return; /* no space, just forget it */ buf->bh_space = (int)(len - slen); vim_strncpy(p->b_str, s, (size_t)slen); ! if (buf->bh_curr == NULL) ! { ! p->b_next = NULL; ! buf->bh_first = p; ! buf->bh_curr = p; ! } ! else ! { ! p->b_next = buf->bh_curr->b_next; ! buf->bh_curr->b_next = p; ! buf->bh_curr = p; ! } } return; } *************** *** 348,357 **** } /* First read ahead buffer. Used for translated commands. */ ! static buffheader_T readbuf1 = {{NULL, {NUL}}, NULL, 0, 0}; /* Second read ahead buffer. Used for redo. */ ! static buffheader_T readbuf2 = {{NULL, {NUL}}, NULL, 0, 0}; /* * Get one byte from the read buffers. Use readbuf1 one first, use readbuf2 --- 358,367 ---- } /* First read ahead buffer. Used for translated commands. */ ! static buffheader_T readbuf1 = {NULL, NULL, 0, 0}; /* Second read ahead buffer. Used for redo. */ ! static buffheader_T readbuf2 = {NULL, NULL, 0, 0}; /* * Get one byte from the read buffers. Use readbuf1 one first, use readbuf2 *************** *** 376,392 **** char_u c; buffblock_T *curr; ! if (buf->bh_first.b_next == NULL) /* buffer is empty */ return NUL; ! curr = buf->bh_first.b_next; c = curr->b_str[buf->bh_index]; if (advance) { if (curr->b_str[++buf->bh_index] == NUL) { ! buf->bh_first.b_next = curr->b_next; vim_free(curr); buf->bh_index = 0; } --- 386,402 ---- char_u c; buffblock_T *curr; ! if (buf->bh_first == NULL) /* buffer is empty */ return NUL; ! curr = buf->bh_first; c = curr->b_str[buf->bh_index]; if (advance) { if (curr->b_str[++buf->bh_index] == NUL) { ! buf->bh_first = curr->b_next; vim_free(curr); buf->bh_index = 0; } *************** *** 400,413 **** static void start_stuff(void) { ! if (readbuf1.bh_first.b_next != NULL) { ! readbuf1.bh_curr = &(readbuf1.bh_first); readbuf1.bh_space = 0; } ! if (readbuf2.bh_first.b_next != NULL) { ! readbuf2.bh_curr = &(readbuf2.bh_first); readbuf2.bh_space = 0; } } --- 410,423 ---- static void start_stuff(void) { ! if (readbuf1.bh_first != NULL) { ! readbuf1.bh_curr = readbuf1.bh_first; readbuf1.bh_space = 0; } ! if (readbuf2.bh_first != NULL) { ! readbuf2.bh_curr = readbuf2.bh_first; readbuf2.bh_space = 0; } } *************** *** 418,425 **** int stuff_empty(void) { ! return (readbuf1.bh_first.b_next == NULL ! && readbuf2.bh_first.b_next == NULL); } /* --- 428,435 ---- int stuff_empty(void) { ! return (readbuf1.bh_first == NULL ! && readbuf2.bh_first == NULL); } /* *************** *** 429,435 **** int readbuf1_empty(void) { ! return (readbuf1.bh_first.b_next == NULL); } /* --- 439,445 ---- int readbuf1_empty(void) { ! return (readbuf1.bh_first == NULL); } /* *************** *** 494,500 **** { free_buff(&old_redobuff); old_redobuff = redobuff; ! redobuff.bh_first.b_next = NULL; } } --- 504,510 ---- { free_buff(&old_redobuff); old_redobuff = redobuff; ! redobuff.bh_first = NULL; } } *************** *** 509,515 **** { free_buff(&redobuff); redobuff = old_redobuff; ! old_redobuff.bh_first.b_next = NULL; start_stuff(); while (read_readbuffers(TRUE) != NUL) ; --- 519,525 ---- { free_buff(&redobuff); redobuff = old_redobuff; ! old_redobuff.bh_first = NULL; start_stuff(); while (read_readbuffers(TRUE) != NUL) ; *************** *** 526,534 **** char_u *s; save_redo->sr_redobuff = redobuff; ! redobuff.bh_first.b_next = NULL; save_redo->sr_old_redobuff = old_redobuff; ! old_redobuff.bh_first.b_next = NULL; /* Make a copy, so that ":normal ." in a function works. */ s = get_buffcont(&save_redo->sr_redobuff, FALSE); --- 536,544 ---- char_u *s; save_redo->sr_redobuff = redobuff; ! redobuff.bh_first = NULL; save_redo->sr_old_redobuff = old_redobuff; ! old_redobuff.bh_first = NULL; /* Make a copy, so that ":normal ." in a function works. */ s = get_buffcont(&save_redo->sr_redobuff, FALSE); *************** *** 747,755 **** if (init) { if (old_redo) ! bp = old_redobuff.bh_first.b_next; else ! bp = redobuff.bh_first.b_next; if (bp == NULL) return FAIL; p = bp->b_str; --- 757,765 ---- if (init) { if (old_redo) ! bp = old_redobuff.bh_first; else ! bp = redobuff.bh_first; if (bp == NULL) return FAIL; p = bp->b_str; *************** *** 1372,1380 **** old_char = -1; tp->save_readbuf1 = readbuf1; ! readbuf1.bh_first.b_next = NULL; tp->save_readbuf2 = readbuf2; ! readbuf2.bh_first.b_next = NULL; # ifdef USE_INPUT_BUF tp->save_inputbuf = get_input_buf(); # endif --- 1382,1390 ---- old_char = -1; tp->save_readbuf1 = readbuf1; ! readbuf1.bh_first = NULL; tp->save_readbuf2 = readbuf2; ! readbuf2.bh_first = NULL; # ifdef USE_INPUT_BUF tp->save_inputbuf = get_input_buf(); # endif *** ../vim-8.0.1722/src/version.c 2018-04-15 23:45:12.982388377 +0200 --- src/version.c 2018-04-16 14:44:26.152663276 +0200 *************** *** 764,765 **** --- 764,767 ---- { /* Add new patch number below this line */ + /**/ + 1723, /**/ -- hundred-and-one symptoms of being an internet addict: 195. Your cat has its own home page. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///