* regex.c (EXTEND_BUFFER): Adjust pointers within buffer by
authorJim Kingdon <jkingdon@engr.sgi.com>
Fri, 18 Mar 1994 18:34:36 +0000 (18:34 +0000)
committerJim Kingdon <jkingdon@engr.sgi.com>
Fri, 18 Mar 1994 18:34:36 +0000 (18:34 +0000)
computing their offset from the start of the old buffer and adding
to the new buffer, rather than by assuming we can add the
difference between the old buffer and the new buffer (it might not
fit in an int).  Merge in cosmetic differences from emacs regex.c
version of this macro.

gdb/ChangeLog
gdb/regex.c

index 6e0ec7821c68a776d5da6fd5fb69c41d92decab1..39b43703fe42c668f798e0aa558c7a7f04e19fd4 100644 (file)
@@ -1,3 +1,12 @@
+Fri Mar 18 10:25:55 1994  Jim Kingdon  (kingdon@lioth.cygnus.com)
+
+       * regex.c (EXTEND_BUFFER): Adjust pointers within buffer by
+       computing their offset from the start of the old buffer and adding
+       to the new buffer, rather than by assuming we can add the
+       difference between the old buffer and the new buffer (it might not
+       fit in an int).  Merge in cosmetic differences from emacs regex.c
+       version of this macro.
+
 Wed Mar 16 15:28:54 1994  Ian Lance Taylor  (ian@tweedledumb.cygnus.com)
 
        * Makefile.in (install-only): Fix use of program_transform_name.
index 78b1f478b0818fa3c2587b0b79d05f38099415cf..9b6dc5b9688e66f0d3284c72d53f0abf34d42379 100644 (file)
@@ -146,23 +146,40 @@ re_set_syntax (syntax)
 
 #define PATUNFETCH p--
 
-#define EXTEND_BUFFER \
-  { char *old_buffer = bufp->buffer; \
-    if (bufp->allocated == (1<<16)) goto too_big; \
-    bufp->allocated *= 2; \
-    if (bufp->allocated > (1<<16)) bufp->allocated = (1<<16); \
-    if (!(bufp->buffer = (char *) realloc (bufp->buffer, bufp->allocated))) \
-      goto memory_exhausted; \
-    c = bufp->buffer - old_buffer; \
-    b += c; \
-    if (fixup_jump) \
-      fixup_jump += c; \
-    if (laststart) \
-      laststart += c; \
-    begalt += c; \
-    if (pending_exact) \
-      pending_exact += c; \
-  }
+/* This is not an arbitrary limit: the arguments which represent offsets
+   into the pattern are two bytes long.  So if 2^16 bytes turns out to
+   be too small, many things would have to change.  */
+#define MAX_BUF_SIZE (1 << 16)
+
+
+/* Extend the buffer by twice its current size via realloc and
+   reset the pointers that pointed into the old block to point to the
+   correct places in the new one.  If extending the buffer results in it
+   being larger than MAX_BUF_SIZE, then flag memory exhausted.  */
+#define EXTEND_BUFFER                                                 \
+  do {                                                                  \
+    char *old_buffer = bufp->buffer;                           \
+    if (bufp->allocated == MAX_BUF_SIZE)                                \
+      goto too_big;                                                 \
+    bufp->allocated <<= 1;                                              \
+    if (bufp->allocated > MAX_BUF_SIZE)                                 \
+      bufp->allocated = MAX_BUF_SIZE;                                   \
+    bufp->buffer = (char *) realloc (bufp->buffer, bufp->allocated);\
+    if (bufp->buffer == NULL)                                           \
+      goto memory_exhausted;                                                \
+    /* If the buffer moved, move all the pointers into it.  */          \
+    if (old_buffer != bufp->buffer)                                     \
+      {                                                                 \
+        b = (b - old_buffer) + bufp->buffer;                            \
+        begalt = (begalt - old_buffer) + bufp->buffer;                  \
+        if (fixup_jump)                                             \
+          fixup_jump = (fixup_jump - old_buffer) + bufp->buffer;\
+        if (laststart)                                                  \
+          laststart = (laststart - old_buffer) + bufp->buffer;          \
+        if (pending_exact)                                              \
+          pending_exact = (pending_exact - old_buffer) + bufp->buffer;  \
+      }                                                                 \
+  } while (0)
 
 static void store_jump (), insert_jump ();