OSDN Git Service

* Make-lang.in (stmp-f2c.h): Don't configure the runtime
[pf3gnuchains/gcc-fork.git] / gcc / obstack.h
index a6a2e23..dd8e861 100644 (file)
@@ -1,25 +1,19 @@
 /* obstack.h - object stack macros
-   Copyright (C) 1988,89,90,91,92,93,94,96,97 Free Software Foundation, Inc.
+   Copyright (C) 1988,89,90,91,92,93,94,96 Free Software Foundation, Inc.
 
-   the C library, however.  The master source lives in /gd/gnu/lib.
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
 
-   NOTE: The canonical source of this file is maintained with the GNU C Library.
-   Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
 
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 2, or (at your option) any
-   later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-   USA.  */
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 /* Summary:
 
@@ -106,12 +100,8 @@ Summary:
 
 /* Don't do the contents of this file more than once.  */
 
-#ifndef _OBSTACK_H
-#define _OBSTACK_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#endif
+#ifndef __OBSTACK_H__
+#define __OBSTACK_H__
 \f
 /* We use subtraction of (char *) 0 instead of casting to int
    because on word-addressable machines a simple cast to int
@@ -148,17 +138,6 @@ extern "C" {
 #define PTR_INT_TYPE long
 #endif
 
-#if defined (_LIBC) || defined (HAVE_STRING_H)
-#include <string.h>
-#define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
-#else
-#ifdef memcpy
-#define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
-#else
-#define _obstack_memcpy(To, From, N) bcopy ((From), (To), (N))
-#endif
-#endif
-
 struct _obstack_chunk          /* Lives at front of each chunk. */
 {
   char  *limit;                        /* 1 past end of this chunk */
@@ -192,9 +171,7 @@ struct obstack              /* control current object in current chunk */
                                   chunk contains a zero-length object.  This
                                   prevents freeing the chunk if we allocate
                                   a bigger chunk to replace it. */
-  unsigned alloc_failed:1;     /* No longer used, as we now call the failed
-                                  handler on error, but retained for binary
-                                  compatibility.  */
+  unsigned alloc_failed:1;     /* chunk alloc func returned 0 */
 };
 
 /* Declare the external functions we use; they are in obstack.c.  */
@@ -207,13 +184,11 @@ extern int _obstack_begin (struct obstack *, int, int,
 extern int _obstack_begin_1 (struct obstack *, int, int,
                             void *(*) (void *, long),
                             void (*) (void *, void *), void *);
-extern int _obstack_memory_used (struct obstack *);
 #else
 extern void _obstack_newchunk ();
 extern void _obstack_free ();
 extern int _obstack_begin ();
 extern int _obstack_begin_1 ();
-extern int _obstack_memory_used ();
 #endif
 \f
 #if defined (__STDC__) && __STDC__
@@ -244,7 +219,6 @@ void * obstack_finish (struct obstack *obstack);
 int obstack_object_size (struct obstack *obstack);
 
 int obstack_room (struct obstack *obstack);
-void obstack_make_room (struct obstack *obstack, int size);
 void obstack_1grow_fast (struct obstack *obstack, int data_char);
 void obstack_ptr_grow_fast (struct obstack *obstack, void *data);
 void obstack_int_grow_fast (struct obstack *obstack, int data);
@@ -254,30 +228,17 @@ void * obstack_base (struct obstack *obstack);
 void * obstack_next_free (struct obstack *obstack);
 int obstack_alignment_mask (struct obstack *obstack);
 int obstack_chunk_size (struct obstack *obstack);
-int obstack_memory_used (struct obstack *obstack);
 
 #endif /* __STDC__ */
 
 /* Non-ANSI C cannot really support alternative functions for these macros,
    so we do not declare them.  */
-
-/* Error handler called when `obstack_chunk_alloc' failed to allocate
-   more memory.  This can be set to a user defined function.  The
-   default action is to print a message and abort.  */
-#if defined (__STDC__) && __STDC__
-extern void (*obstack_alloc_failed_handler) (void);
-#else
-extern void (*obstack_alloc_failed_handler) ();
-#endif
-
-/* Exit value used when `print_and_abort' is used.  */
-extern int obstack_exit_failure;
 \f
 /* Pointer to beginning of object being allocated or to be allocated next.
    Note that this might not be the final address of the object
    because a new chunk might be needed to hold the final size.  */
 
-#define obstack_base(h) ((h)->object_base)
+#define obstack_base(h) ((h)->alloc_failed ? 0 : (h)->object_base)
 
 /* Size for allocating ordinary chunks.  */
 
@@ -285,7 +246,7 @@ extern int obstack_exit_failure;
 
 /* Pointer to next byte not yet allocated in current chunk.  */
 
-#define obstack_next_free(h)   ((h)->next_free)
+#define obstack_next_free(h)   ((h)->alloc_failed ? 0 : (h)->next_free)
 
 /* Mask specifying low bits that should be clear in address of an object.  */
 
@@ -309,14 +270,13 @@ extern int obstack_exit_failure;
 
 #define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
   _obstack_begin_1 ((h), (size), (alignment), \
-                   (void *(*) (void *, long)) (chunkfun), \
-                   (void (*) (void *, void *)) (freefun), (arg))
+                   (void *(*) (long)) (chunkfun), (void (*) (void *)) (freefun), (arg))
 
 #define obstack_chunkfun(h, newchunkfun) \
-  ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun))
+  ((h) -> chunkfun = (struct _obstack_chunk *(*)(long)) (newchunkfun))
 
 #define obstack_freefun(h, newfreefun) \
-  ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun))
+  ((h) -> freefun = (void (*)(void *)) (newfreefun))
 
 #else
 
@@ -347,8 +307,6 @@ extern int obstack_exit_failure;
 #define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar)
 
 #define obstack_blank_fast(h,n) ((h)->next_free += (n))
-
-#define obstack_memory_used(h) _obstack_memory_used (h)
 \f
 #if defined (__GNUC__) && defined (__STDC__) && __STDC__
 /* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
@@ -366,6 +324,7 @@ extern int obstack_exit_failure;
 #define obstack_object_size(OBSTACK)                                   \
   __extension__                                                                \
   ({ struct obstack *__o = (OBSTACK);                                  \
+     __o->alloc_failed ? 0 :                                           \
      (unsigned) (__o->next_free - __o->object_base); })
 
 #define obstack_room(OBSTACK)                                          \
@@ -373,22 +332,17 @@ extern int obstack_exit_failure;
   ({ struct obstack *__o = (OBSTACK);                                  \
      (unsigned) (__o->chunk_limit - __o->next_free); })
 
-#define obstack_make_room(OBSTACK,length)                              \
-__extension__                                                          \
-({ struct obstack *__o = (OBSTACK);                                    \
-   int __len = (length);                                               \
-   if (__o->chunk_limit - __o->next_free < __len)                      \
-     _obstack_newchunk (__o, __len);                                   \
-   (void) 0; })
-
 #define obstack_grow(OBSTACK,where,length)                             \
 __extension__                                                          \
 ({ struct obstack *__o = (OBSTACK);                                    \
    int __len = (length);                                               \
    if (__o->next_free + __len > __o->chunk_limit)                      \
      _obstack_newchunk (__o, __len);                                   \
-   _obstack_memcpy (__o->next_free, (char *) (where), __len);          \
-   __o->next_free += __len;                                            \
+   if (!__o->alloc_failed)                                             \
+     {                                                                 \
+        bcopy ((char *) (where), __o->next_free, __len);               \
+       __o->next_free += __len;                                        \
+     }                                                                 \
    (void) 0; })
 
 #define obstack_grow0(OBSTACK,where,length)                            \
@@ -397,9 +351,12 @@ __extension__                                                              \
    int __len = (length);                                               \
    if (__o->next_free + __len + 1 > __o->chunk_limit)                  \
      _obstack_newchunk (__o, __len + 1);                               \
-   _obstack_memcpy (__o->next_free, (char *) (where), __len);          \
-   __o->next_free += __len;                                            \
-   *(__o->next_free)++ = 0;                                            \
+   if (!__o->alloc_failed)                                             \
+     {                                                                 \
+       bcopy ((char *) (where), __o->next_free, __len);                        \
+       __o->next_free += __len;                                                \
+       *(__o->next_free)++ = 0;                                                \
+     }                                                                 \
    (void) 0; })
 
 #define obstack_1grow(OBSTACK,datum)                                   \
@@ -407,7 +364,8 @@ __extension__                                                               \
 ({ struct obstack *__o = (OBSTACK);                                    \
    if (__o->next_free + 1 > __o->chunk_limit)                          \
      _obstack_newchunk (__o, 1);                                       \
-   *(__o->next_free)++ = (datum);                                      \
+   if (!__o->alloc_failed)                                             \
+     *(__o->next_free)++ = (datum);                                    \
    (void) 0; })
 
 /* These assume that the obstack alignment is good enough for pointers or ints,
@@ -419,7 +377,8 @@ __extension__                                                               \
 ({ struct obstack *__o = (OBSTACK);                                    \
    if (__o->next_free + sizeof (void *) > __o->chunk_limit)            \
      _obstack_newchunk (__o, sizeof (void *));                         \
-   *((void **)__o->next_free)++ = ((void *)datum);                     \
+   if (!__o->alloc_failed)                                             \
+     *((void **)__o->next_free)++ = ((void *)datum);                   \
    (void) 0; })
 
 #define obstack_int_grow(OBSTACK,datum)                                        \
@@ -427,7 +386,8 @@ __extension__                                                               \
 ({ struct obstack *__o = (OBSTACK);                                    \
    if (__o->next_free + sizeof (int) > __o->chunk_limit)               \
      _obstack_newchunk (__o, sizeof (int));                            \
-   *((int *)__o->next_free)++ = ((int)datum);                          \
+   if (!__o->alloc_failed)                                             \
+     *((int *)__o->next_free)++ = ((int)datum);                                \
    (void) 0; })
 
 #define obstack_ptr_grow_fast(h,aptr) (*((void **) (h)->next_free)++ = (void *)aptr)
@@ -439,7 +399,8 @@ __extension__                                                               \
    int __len = (length);                                               \
    if (__o->chunk_limit - __o->next_free < __len)                      \
      _obstack_newchunk (__o, __len);                                   \
-   __o->next_free += __len;                                            \
+   if (!__o->alloc_failed)                                             \
+     __o->next_free += __len;                                          \
    (void) 0; })
 
 #define obstack_alloc(OBSTACK,length)                                  \
@@ -466,16 +427,21 @@ __extension__                                                             \
 __extension__                                                          \
 ({ struct obstack *__o1 = (OBSTACK);                                   \
    void *value;                                                                \
-   value = (void *) __o1->object_base;                                 \
-   if (__o1->next_free == value)                                       \
-     __o1->maybe_empty_object = 1;                                     \
-   __o1->next_free                                                     \
-     = __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\
-                    & ~ (__o1->alignment_mask));                       \
-   if (__o1->next_free - (char *)__o1->chunk                           \
-       > __o1->chunk_limit - (char *)__o1->chunk)                      \
-     __o1->next_free = __o1->chunk_limit;                              \
-   __o1->object_base = __o1->next_free;                                        \
+   if (__o1->alloc_failed)                                             \
+     value = 0;                                                                \
+   else                                                                        \
+     {                                                                 \
+       value = (void *) __o1->object_base;                             \
+       if (__o1->next_free == value)                                   \
+         __o1->maybe_empty_object = 1;                                 \
+       __o1->next_free                                                 \
+        = __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\
+                        & ~ (__o1->alignment_mask));                   \
+       if (__o1->next_free - (char *)__o1->chunk                       \
+          > __o1->chunk_limit - (char *)__o1->chunk)                   \
+        __o1->next_free = __o1->chunk_limit;                           \
+       __o1->object_base = __o1->next_free;                            \
+      }                                                                        \
    value; })
 
 #define obstack_free(OBSTACK, OBJ)                                     \
@@ -489,7 +455,7 @@ __extension__                                                               \
 #else /* not __GNUC__ or not __STDC__ */
 
 #define obstack_object_size(h) \
- (unsigned) ((h)->next_free - (h)->object_base)
+ (unsigned) ((h)->alloc_failed ? 0 : (h)->next_free - (h)->object_base)
 
 #define obstack_room(h)                \
  (unsigned) ((h)->chunk_limit - (h)->next_free)
@@ -500,40 +466,40 @@ __extension__                                                             \
    Casting the third operand to void was tried before,
    but some compilers won't accept it.  */
 
-#define obstack_make_room(h,length)                                    \
-( (h)->temp = (length),                                                        \
-  (((h)->next_free + (h)->temp > (h)->chunk_limit)                     \
-   ? (_obstack_newchunk ((h), (h)->temp), 0) : 0))
-
 #define obstack_grow(h,where,length)                                   \
 ( (h)->temp = (length),                                                        \
   (((h)->next_free + (h)->temp > (h)->chunk_limit)                     \
    ? (_obstack_newchunk ((h), (h)->temp), 0) : 0),                     \
-  _obstack_memcpy ((h)->next_free, (char *) (where), (h)->temp),       \
-  (h)->next_free += (h)->temp)
+  ((h)->alloc_failed ? 0 :                                             \
+  (bcopy ((char *) (where), (h)->next_free, (h)->temp),                        \
+  (h)->next_free += (h)->temp)))
 
 #define obstack_grow0(h,where,length)                                  \
 ( (h)->temp = (length),                                                        \
   (((h)->next_free + (h)->temp + 1 > (h)->chunk_limit)                 \
    ? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0),                 \
-  _obstack_memcpy ((h)->next_free, (char *) (where), (h)->temp),       \
+  ((h)->alloc_failed ? 0 :                                             \
+  (bcopy ((char *) (where), (h)->next_free, (h)->temp),                        \
   (h)->next_free += (h)->temp,                                         \
-  *((h)->next_free)++ = 0)
+  *((h)->next_free)++ = 0)))
 
 #define obstack_1grow(h,datum)                                         \
 ( (((h)->next_free + 1 > (h)->chunk_limit)                             \
    ? (_obstack_newchunk ((h), 1), 0) : 0),                             \
-  (*((h)->next_free)++ = (datum)))
+ ((h)->alloc_failed ? 0 :                                              \
+  (*((h)->next_free)++ = (datum))))
 
 #define obstack_ptr_grow(h,datum)                                      \
 ( (((h)->next_free + sizeof (char *) > (h)->chunk_limit)               \
    ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0),               \
-  (*((char **) (((h)->next_free+=sizeof(char *))-sizeof(char *))) = ((char *) datum)))
+  ((h)->alloc_failed ? 0 :                                             \
+  (*((char **) (((h)->next_free+=sizeof(char *))-sizeof(char *))) = ((char *) datum))))
 
 #define obstack_int_grow(h,datum)                                      \
 ( (((h)->next_free + sizeof (int) > (h)->chunk_limit)                  \
    ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0),                  \
-  (*((int *) (((h)->next_free+=sizeof(int))-sizeof(int))) = ((int) datum)))
+  ((h)->alloc_failed ? 0 :                                             \
+  (*((int *) (((h)->next_free+=sizeof(int))-sizeof(int))) = ((int) datum))))
 
 #define obstack_ptr_grow_fast(h,aptr) (*((char **) (h)->next_free)++ = (char *) aptr)
 #define obstack_int_grow_fast(h,aint) (*((int *) (h)->next_free)++ = (int) aint)
@@ -542,7 +508,8 @@ __extension__                                                               \
 ( (h)->temp = (length),                                                        \
   (((h)->chunk_limit - (h)->next_free < (h)->temp)                     \
    ? (_obstack_newchunk ((h), (h)->temp), 0) : 0),                     \
-  ((h)->next_free += (h)->temp))
+  ((h)->alloc_failed ? 0 :                                             \
+  ((h)->next_free += (h)->temp)))
 
 #define obstack_alloc(h,length)                                                \
  (obstack_blank ((h), (length)), obstack_finish ((h)))
@@ -554,18 +521,19 @@ __extension__                                                             \
  (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
 
 #define obstack_finish(h)                                              \
-( ((h)->next_free == (h)->object_base                                  \
+( (h)->alloc_failed ? 0 :                                              \
+  (((h)->next_free == (h)->object_base                                 \
    ? (((h)->maybe_empty_object = 1), 0)                                        \
    : 0),                                                               \
   (h)->temp = __PTR_TO_INT ((h)->object_base),                         \
   (h)->next_free                                                       \
     = __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask)        \
                    & ~ ((h)->alignment_mask)),                         \
-  (((h)->next_free - (char *) (h)->chunk                               \
+  (((h)->next_free - (char *) (h)->chunk                                       \
     > (h)->chunk_limit - (char *) (h)->chunk)                          \
    ? ((h)->next_free = (h)->chunk_limit) : 0),                         \
   (h)->object_base = (h)->next_free,                                   \
-  __INT_TO_PTR ((h)->temp))
+  __INT_TO_PTR ((h)->temp)))
 
 #if defined (__STDC__) && __STDC__
 #define obstack_free(h,obj)                                            \
@@ -585,8 +553,4 @@ __extension__                                                               \
 
 #endif /* not __GNUC__ or not __STDC__ */
 
-#ifdef __cplusplus
-}      /* C++ */
-#endif
-
-#endif /* obstack.h */
+#endif /* not __OBSTACK_H__ */