]> granicus.if.org Git - vim/commitdiff
patch 8.0.1735: flexible array member feature not supported by HP-UX v8.0.1735
authorBram Moolenaar <Bram@vim.org>
Wed, 18 Apr 2018 21:01:13 +0000 (23:01 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 18 Apr 2018 21:01:13 +0000 (23:01 +0200)
Problem:    Flexible array member feature not supported by HP-UX. (John
            Marriott)
Solution:   Do not use the flexible array member feature of C99.

runtime/doc/develop.txt
src/auto/configure
src/configure.ac
src/getchar.c
src/structs.h
src/version.c

index d90e4a3dd2bf401651e154f22e18e19acc6a43e9..2e00ccfa946cbbd525cc1883ee980163ebfe5493 100644 (file)
@@ -209,16 +209,6 @@ Types ~
 "long long" is allowed and can be expected to be 64 bits.  Use %lld in printf
 formats.  Also "long long unsigned" with %llu.
 
-Flexible array members ~
-
-This is an array without size, used as the last member of a struct.  Vim used
-to have an array of size one, which causes trouble with FORTIFY_SOURCE. Using
-an "unsized array" is the intended use, we will change all of them.
-       struct some_stuff {
-          size_t  length;
-          char    payload[];  // will have size "length"
-       };
-
 Not to be used ~
 
 These C99 features are not to be used, because not enough compilers support
@@ -228,6 +218,7 @@ them:
 - Variable length arrays (even in C11 this is an optional feature).
 - _Bool and _Complex types.
 - "inline" (it's hardly ever needed, let the optimizer do its work)
+- flexible array members: Not supported by HP-UX C compiler (John Marriott)
 
 
 USE OF COMMON FUNCTIONS                                        *style-functions*
index 6673de85a278faaefc6a53d0614f9278fc868664..7a65bec0aa7eed7f10f13f346a23d1528cda9ac1 100755 (executable)
@@ -4188,14 +4188,10 @@ int
 main ()
 {
 
-  struct with_flexible_member {
-    int count;  // comment
-    char text[]; // another comment
-  };
   enum {
-    one,
-    two,
-    three,
+    one,   // one comment
+    two,   // two comments
+    three, // three comments
   };
   long long int a = 1;
   long long unsigned b = 2;
index 4ae21a110e03f5e981a67803aed0668f3c219112..78023ad226b5cf146047183976a8967cbee0807b 100644 (file)
@@ -36,14 +36,10 @@ dnl - "long long int" and "long long unsigned"
 dnl - flexible array member
 AC_MSG_CHECKING(if the compiler can handle Vim code)
 AC_TRY_COMPILE([#include <stdio.h>], [
-  struct with_flexible_member {
-    int count;  // comment
-    char text[]; // another comment
-  };
   enum {
-    one,
-    two,
-    three,
+    one,   // one comment
+    two,   // two comments
+    three, // three comments
   };
   long long int a = 1;
   long long unsigned b = 2;
index 5a5041a65f2d1745c8ae6432e6baec9fdbbb2405..285d5d5d06b744b5b3950218366405f1deb6eeb2 100644 (file)
@@ -40,9 +40,9 @@
 
 #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 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 */
 
@@ -138,13 +138,12 @@ free_buff(buffheader_T *buf)
 {
     buffblock_T        *p, *np;
 
-    for (p = buf->bh_first; p != NULL; p = np)
+    for (p = buf->bh_first.b_next; p != NULL; p = np)
     {
        np = p->b_next;
        vim_free(p);
     }
-    buf->bh_first = NULL;
-    buf->bh_curr = NULL;
+    buf->bh_first.b_next = NULL;
 }
 
 /*
@@ -160,16 +159,16 @@ get_buffcont(
     char_u         *p = NULL;
     char_u         *p2;
     char_u         *str;
-    buffblock_T            *bp;
+    buffblock_T *bp;
 
     /* compute the total length of the string */
-    for (bp = buffer->bh_first; bp != NULL; bp = bp->b_next)
+    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; bp != NULL; bp = bp->b_next)
+       for (bp = buffer->bh_first.b_next; bp != NULL; bp = bp->b_next)
            for (str = bp->b_str; *str; )
                *p2++ = *str++;
        *p2 = NUL;
@@ -233,17 +232,17 @@ add_buff(
     long               slen)   /* length of "s" or -1 */
 {
     buffblock_T *p;
-    long_u     len;
+    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 */
+    if (buf->bh_first.b_next == NULL)  /* first add to list */
     {
        buf->bh_space = 0;
-       buf->bh_curr = NULL;
+       buf->bh_curr = &(buf->bh_first);
     }
     else if (buf->bh_curr == NULL)     /* buffer has already been read */
     {
@@ -251,9 +250,9 @@ add_buff(
        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);
+       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)
@@ -268,25 +267,16 @@ add_buff(
            len = MINIMAL_SIZE;
        else
            len = slen;
-       p = (buffblock_T *)lalloc((long_u)(sizeof(buffblock_T) + len + 1),
-                                                                        TRUE);
+       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);
 
-       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;
-       }
+       p->b_next = buf->bh_curr->b_next;
+       buf->bh_curr->b_next = p;
+       buf->bh_curr = p;
     }
     return;
 }
@@ -358,10 +348,10 @@ add_char_buff(buffheader_T *buf, int c)
 }
 
 /* First read ahead buffer. Used for translated commands. */
-static buffheader_T readbuf1 = {NULL, NULL, 0, 0};
+static buffheader_T readbuf1 = {{NULL, {NUL}}, NULL, 0, 0};
 
 /* Second read ahead buffer. Used for redo. */
-static buffheader_T readbuf2 = {NULL, NULL, 0, 0};
+static buffheader_T readbuf2 = {{NULL, {NUL}}, NULL, 0, 0};
 
 /*
  * Get one byte from the read buffers.  Use readbuf1 one first, use readbuf2
@@ -386,17 +376,17 @@ read_readbuf(buffheader_T *buf, int advance)
     char_u     c;
     buffblock_T        *curr;
 
-    if (buf->bh_first == NULL)  /* buffer is empty */
+    if (buf->bh_first.b_next == NULL)  /* buffer is empty */
        return NUL;
 
-    curr = buf->bh_first;
+    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 = curr->b_next;
+           buf->bh_first.b_next = curr->b_next;
            vim_free(curr);
            buf->bh_index = 0;
        }
@@ -410,14 +400,14 @@ read_readbuf(buffheader_T *buf, int advance)
     static void
 start_stuff(void)
 {
-    if (readbuf1.bh_first != NULL)
+    if (readbuf1.bh_first.b_next != NULL)
     {
-       readbuf1.bh_curr = readbuf1.bh_first;
+       readbuf1.bh_curr = &(readbuf1.bh_first);
        readbuf1.bh_space = 0;
     }
-    if (readbuf2.bh_first != NULL)
+    if (readbuf2.bh_first.b_next != NULL)
     {
-       readbuf2.bh_curr = readbuf2.bh_first;
+       readbuf2.bh_curr = &(readbuf2.bh_first);
        readbuf2.bh_space = 0;
     }
 }
@@ -428,8 +418,8 @@ start_stuff(void)
     int
 stuff_empty(void)
 {
-    return (readbuf1.bh_first == NULL
-        && readbuf2.bh_first == NULL);
+    return (readbuf1.bh_first.b_next == NULL
+        && readbuf2.bh_first.b_next == NULL);
 }
 
 /*
@@ -439,7 +429,7 @@ stuff_empty(void)
     int
 readbuf1_empty(void)
 {
-    return (readbuf1.bh_first == NULL);
+    return (readbuf1.bh_first.b_next == NULL);
 }
 
 /*
@@ -504,7 +494,7 @@ ResetRedobuff(void)
     {
        free_buff(&old_redobuff);
        old_redobuff = redobuff;
-       redobuff.bh_first = NULL;
+       redobuff.bh_first.b_next = NULL;
     }
 }
 
@@ -519,7 +509,7 @@ CancelRedo(void)
     {
        free_buff(&redobuff);
        redobuff = old_redobuff;
-       old_redobuff.bh_first = NULL;
+       old_redobuff.bh_first.b_next = NULL;
        start_stuff();
        while (read_readbuffers(TRUE) != NUL)
            ;
@@ -536,9 +526,9 @@ saveRedobuff(save_redo_T *save_redo)
     char_u     *s;
 
     save_redo->sr_redobuff = redobuff;
-    redobuff.bh_first = NULL;
+    redobuff.bh_first.b_next = NULL;
     save_redo->sr_old_redobuff = old_redobuff;
-    old_redobuff.bh_first = NULL;
+    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);
@@ -757,9 +747,9 @@ read_redo(int init, int old_redo)
     if (init)
     {
        if (old_redo)
-           bp = old_redobuff.bh_first;
+           bp = old_redobuff.bh_first.b_next;
        else
-           bp = redobuff.bh_first;
+           bp = redobuff.bh_first.b_next;
        if (bp == NULL)
            return FAIL;
        p = bp->b_str;
@@ -1382,9 +1372,9 @@ save_typeahead(tasave_T *tp)
     old_char = -1;
 
     tp->save_readbuf1 = readbuf1;
-    readbuf1.bh_first = NULL;
+    readbuf1.bh_first.b_next = NULL;
     tp->save_readbuf2 = readbuf2;
-    readbuf2.bh_first = NULL;
+    readbuf2.bh_first.b_next = NULL;
 # ifdef USE_INPUT_BUF
     tp->save_inputbuf = get_input_buf();
 # endif
index e3ad867dbf589aad7aad5fd2388935ef90c2ec7f..35433b1b24342c1c461012af671992c5b4096df0 100644 (file)
@@ -511,7 +511,7 @@ typedef struct buffheader buffheader_T;
 struct buffblock
 {
     buffblock_T        *b_next;        /* pointer to next buffblock */
-    char_u     b_str[];        /* contents (flexible array) */
+    char_u     b_str[1];       /* contents (actually longer) */
 };
 
 /*
@@ -519,7 +519,7 @@ struct buffblock
  */
 struct buffheader
 {
-    buffblock_T        *bh_first;      /* first block of the list */
+    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 */
index 3abe29a65c94216cdd29901694b57839ae9bedba..c2fc3f3bc741d85612baec3531edaa6777424767 100644 (file)
@@ -762,6 +762,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1735,
 /**/
     1734,
 /**/