obstack.h

来自「这是完整的gcc源代码」· C头文件 代码 · 共 411 行 · 第 1/2 页

H
411
字号
#define obstack_begin(h, size) \  _obstack_begin ((h), (size), 0, obstack_chunk_alloc, obstack_chunk_free)#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar)#define obstack_blank_fast(h,n) ((h)->next_free += (n))#if defined (__GNUC__) && defined (__STDC__)/* For GNU C, if not -traditional,   we can define these macros to compute all args only once   without using a global variable.   Also, we can avoid using the `temp' slot, to make faster code.  */#define obstack_object_size(OBSTACK)					\  ({ struct obstack *__o = (OBSTACK);					\     (unsigned) (__o->next_free - __o->object_base); })#define obstack_room(OBSTACK)						\  ({ struct obstack *__o = (OBSTACK);					\     (unsigned) (__o->chunk_limit - __o->next_free); })#define obstack_grow(OBSTACK,where,length)				\({ struct obstack *__o = (OBSTACK);					\   int __len = (length);						\   ((__o->next_free + __len > __o->chunk_limit)				\    ? _obstack_newchunk (__o, __len) : 0);				\   bcopy (where, __o->next_free, __len);				\   __o->next_free += __len;						\   (void) 0; })#define obstack_grow0(OBSTACK,where,length)				\({ struct obstack *__o = (OBSTACK);					\   int __len = (length);						\   ((__o->next_free + __len + 1 > __o->chunk_limit)			\    ? _obstack_newchunk (__o, __len + 1) : 0),				\   bcopy (where, __o->next_free, __len),				\   __o->next_free += __len,						\   *(__o->next_free)++ = 0;						\   (void) 0; })#define obstack_1grow(OBSTACK,datum)					\({ struct obstack *__o = (OBSTACK);					\   ((__o->next_free + 1 > __o->chunk_limit)				\    ? _obstack_newchunk (__o, 1) : 0),					\   *(__o->next_free)++ = (datum);					\   (void) 0; })/* These assume that the obstack alignment is good enough for pointers or ints,   and that the data added so far to the current object   shares that much alignment.  */   #define obstack_ptr_grow(OBSTACK,datum)					\({ struct obstack *__o = (OBSTACK);					\   ((__o->next_free + sizeof (void *) > __o->chunk_limit)		\    ? _obstack_newchunk (__o, sizeof (void *)) : 0),			\   *((void **)__o->next_free)++ = ((void *)datum);			\   (void) 0; })#define obstack_int_grow(OBSTACK,datum)					\({ struct obstack *__o = (OBSTACK);					\   ((__o->next_free + sizeof (int) > __o->chunk_limit)			\    ? _obstack_newchunk (__o, sizeof (int)) : 0),			\   *((int *)__o->next_free)++ = ((int)datum);				\   (void) 0; })#define obstack_ptr_grow_fast(h,aptr) (*((void **)(h)->next_free)++ = (void *)aptr)#define obstack_int_grow_fast(h,aint) (*((int *)(h)->next_free)++ = (int)aint)#define obstack_blank(OBSTACK,length)					\({ struct obstack *__o = (OBSTACK);					\   int __len = (length);						\   ((__o->next_free + __len > __o->chunk_limit)				\    ? _obstack_newchunk (__o, __len) : 0);				\   __o->next_free += __len;						\   (void) 0; })#define obstack_alloc(OBSTACK,length)					\({ struct obstack *__h = (OBSTACK);					\   obstack_blank (__h, (length));					\   obstack_finish (__h); })#define obstack_copy(OBSTACK,where,length)				\({ struct obstack *__h = (OBSTACK);					\   obstack_grow (__h, (where), (length));				\   obstack_finish (__h); })#define obstack_copy0(OBSTACK,where,length)				\({ struct obstack *__h = (OBSTACK);					\   obstack_grow0 (__h, (where), (length));				\   obstack_finish (__h); })#define obstack_finish(OBSTACK)  					\({ struct obstack *__o = (OBSTACK);					\   void *value = (void *) __o->object_base;				\   __o->next_free							\     = __INT_TO_PTR ((__PTR_TO_INT (__o->next_free)+__o->alignment_mask)\		     & ~ (__o->alignment_mask));			\   ((__o->next_free - (char *)__o->chunk				\     > __o->chunk_limit - (char *)__o->chunk)				\    ? (__o->next_free = __o->chunk_limit) : 0);				\   __o->object_base = __o->next_free;					\   value; })#define obstack_free(OBSTACK, OBJ)					\({ struct obstack *__o = (OBSTACK);					\   void *__obj = (OBJ);							\   if (__obj >= (void *)__o->chunk && __obj < (void *)__o->chunk_limit) \     __o->next_free = __o->object_base = __obj;				\   else (obstack_free) (__o, __obj); })#else /* not __GNUC__ or not __STDC__ *//* The non-GNU macros copy the obstack-pointer into this global variable   to avoid multiple evaluation.  */extern struct obstack *_obstack;#define obstack_object_size(h) \ (unsigned) (_obstack = (h), (h)->next_free - (h)->object_base)#define obstack_room(h)		\ (unsigned) (_obstack = (h), (h)->chunk_limit - (h)->next_free)#define obstack_grow(h,where,length)					\( (h)->temp = (length),							\  (((h)->next_free + (h)->temp > (h)->chunk_limit)			\   ? _obstack_newchunk ((h), (h)->temp) : 0),				\  bcopy (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),				\  bcopy (where, (h)->next_free, (h)->temp),				\  (h)->next_free += (h)->temp,						\  *((h)->next_free)++ = 0)#define obstack_1grow(h,datum)						\( (((h)->next_free + 1 > (h)->chunk_limit)				\   ? _obstack_newchunk ((h), 1) : 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),			\  *((char **)(h)->next_free)++ = ((char *)datum))#define obstack_int_grow(h,datum)					\( (((h)->next_free + sizeof (int) > (h)->chunk_limit)			\   ? _obstack_newchunk ((h), sizeof (int)) : 0),			\  *((int *)(h)->next_free)++ = ((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)#define obstack_blank(h,length)						\( (h)->temp = (length),							\  (((h)->next_free + (h)->temp > (h)->chunk_limit)			\   ? _obstack_newchunk ((h), (h)->temp) : 0),				\  (h)->next_free += (h)->temp)#define obstack_alloc(h,length)						\ (obstack_blank ((h), (length)), obstack_finish ((h)))#define obstack_copy(h,where,length)					\ (obstack_grow ((h), (where), (length)), obstack_finish ((h)))#define obstack_copy0(h,where,length)					\ (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))#define obstack_finish(h)  						\( (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)->chunk_limit - (char *)(h)->chunk)				\   ? ((h)->next_free = (h)->chunk_limit) : 0),				\  (h)->object_base = (h)->next_free,					\  __INT_TO_PTR ((h)->temp))#ifdef __STDC__#define obstack_free(h,obj)						\( (h)->temp = (char *)(obj) - (char *) (h)->chunk,			\  (((h)->temp >= 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\   ? (int) ((h)->next_free = (h)->object_base				\	    = (h)->temp + (char *) (h)->chunk)				\   : ((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0)))#else#define obstack_free(h,obj)						\( (h)->temp = (char *)(obj) - (char *) (h)->chunk,			\  (((h)->temp >= 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\   ? (int) ((h)->next_free = (h)->object_base				\	    = (h)->temp + (char *) (h)->chunk)				\   : (int) _obstack_free ((h), (h)->temp + (char *) (h)->chunk)))#endif#endif /* not __GNUC__ or not __STDC__ */#endif /* not __OBSTACKS__ */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?