xmem.h
上传用户:dgyhgb
上传日期:2007-01-07
资源大小:676k
文件大小:7k
源码类别:

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  xmem.h - interface of extended functions for memory processing of
  3.  *      GNU SQL compiler
  4.  *
  5.  *  This file is a part of GNU SQL Server
  6.  *
  7.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  8.  *  This code extracted from GNU CC and partially modified by Michael Kimelman
  9.  * 
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23.  *
  24.  *  Contact:  gss@ispras.ru
  25.  *
  26.  */
  27. #ifndef __XMEM_H__
  28. #define __XMEM_H__
  29. /* $Id: xmem.h,v 1.247 1997/04/24 17:42:06 kml Exp $ */
  30. #include "setup_os.h"
  31. #include <setjmp.h>
  32. #if STDC_HEADERS
  33. # include <string.h>
  34. #else
  35. # include <strings.h>
  36. #endif
  37. #define ALIGN(ptr,align_size)  
  38.    { if (ptr%align_size) ptr+=align_size-ptr%align_size; }
  39. #define TYP_ALLOC(num, type) ((type *) xmalloc (sizeof (type) * (num)))
  40. #define TYP_REALLOC(var, num, type) { var = (type *) xrealloc (var, sizeof (type) * (num)); }
  41. #define CHECK_ARR_SIZE(arr, old_cnt, new_cnt, type)        
  42.         CHECK_ARR_ELEM(arr, old_cnt, (new_cnt) - 1, 1, type)
  43. /* in the next definition : delta - number of elements are *
  44.  * being added to arr if its old size was <= el_num        *
  45.  * delta must be >= 1 if there is needed that after this   *
  46.  * operation arr contains element with number el_num       */
  47. #define CHECK_ARR_ELEM(arr, old_cnt, el_num, delta, type)       
  48.         if (old_cnt <= el_num)                                  
  49.           {                                                     
  50.             if (old_cnt) {                                      
  51.               TYP_REALLOC (arr, el_num + delta, type);          
  52.               bzero (((char*)arr) + sizeof (type) * (old_cnt),  
  53.                      (el_num + delta - old_cnt)*sizeof (type)); 
  54.     }                                                   
  55.             else                                                
  56.               arr = TYP_ALLOC (el_num + delta, type);           
  57.             old_cnt = el_num + delta;                           
  58.           }
  59. #if defined(HAVE_MEMCPY)
  60. # if 0
  61. #  define bzero(a,c)    Bzero((char*)(a),c)
  62. #  define bcopy(a,b,c)  Bcopy((char*)(a),(char*)(b),c)
  63. #  define bcmp(a,b,c)   Bcmp((char*)(a),(char*)(b),c)
  64. # else
  65. #  define bzero(a,c)    memset((char*)(a),0,c)
  66. #  define bcopy(s,d,n)  memcpy((char*)(d),(char*)(s),(n))
  67. #  define bcmp(a,b,n)   memcmp((char*)(a),(char*)(b),(n))
  68. # endif /* #if 0 */
  69. #endif /* defined(HAVE_MEMCPY) */
  70. #define TYP_COPY(a, b, num, type) bcopy (a, b, (num) * sizeof (type))
  71. #if 0
  72. void Bzero __P((register char *b,register i4_t length));
  73. void Bcopy __P((register char *src,register char *dest,register i4_t length));
  74. i4_t  Bcmp  __P((register char *b1,register char *b2,register i4_t length));
  75. #endif
  76. #define yyerror(s) perror_with_name(s)
  77. #define yyfatal(s) pfatal_with_name(s)
  78. extern char *current_user_login_name;
  79. char * get_user_name  __P((void));
  80. void   fatal  __P((char *str,char *arg));
  81. void   fancy_abort  __P((char *f, int l));
  82. void   lperror  __P((char *fmt,...));
  83. void   perror_with_name  __P((char *name));
  84. void   pfatal_with_name  __P((char *name));
  85. void   memory_full  __P((void));
  86. void * xmalloc  __P((i4_t size));
  87. void * xxmalloc  __P((i4_t size,char *f,int l));
  88. void * xrealloc  __P((void *old,i4_t size));
  89. void * xcalloc  __P((i4_t number,i4_t size));
  90. void   xfree  __P((void *ptr));
  91. char * savestring  __P((char *input));
  92. /*--------------------------------------------------------------------*/
  93. /*****************   Buffers processing   *****************************/
  94. /*--------------------------------------------------------------------*/
  95. typedef struct 
  96. {
  97.   i4_t   buf_len,clear_buf;
  98.   char *buffer;
  99. } str_buf;
  100. char  * buffer_string  __P((str_buf *bf,char *sptr,i4_t l));
  101. #define BUFFER_STRING(b,s)  buffer_string(&(b),s,(s?strlen(s):0))
  102. #define no_static
  103. #define ARR_DECL(name,typ,modifier)                 
  104.    modifier struct { typ *arr,*d,*u; i4_t count,limit; } name;
  105. #define ARR_PROC_PROTO(name,typ)        
  106. void name##_ini_check __P((void));
  107. void name##_ini __P((void));  
  108. void name##_put  __P((typ pn));
  109. #define ARR_PROC_DECL(name,typ,modifier)
  110. modifier void name##_ini_check(void)
  111. {
  112.   assert ( name.d   == name.arr);
  113.   assert ( name.u   == name.arr);
  114.   assert ( name.count == 0);
  115.   assert ( name.limit == 0);
  116. }
  117. modifier void name##_ini(void) 
  118. {
  119.   if (name.arr)
  120.     {
  121.       if (name.limit > 256)
  122.         {
  123.           xfree (name.arr);
  124.           name.arr = NULL;
  125.         }
  126.       name.d = name.u = name.arr;       
  127.       name.count = name.limit = 0;
  128.     }
  129.   else
  130.     name##_ini_check();
  131. }
  132. modifier void name##_put (typ pn)
  133. {
  134.   if (name.limit == name.count)
  135.     {
  136.       typ *old = name.arr;
  137.       name.limit += 64;
  138.       if (name.arr)
  139.         name.arr = (typ *) xrealloc ((void *) name.arr, (unsigned) name.limit * sizeof(typ)); 
  140.       else
  141.         name.arr = (u2_t *) xmalloc ((unsigned) name.limit * sizeof(typ)); 
  142.       name.d = name.arr + (i4_t)(name.d - old);
  143.       name.u = name.arr + (i4_t)(name.u - old);
  144.     }
  145.   name.arr[name.count++] = pn;
  146.   name.d++; /* point to the next hole */
  147.   assert(name.d == &(name.arr[name.count]));
  148. /*--------------------------------------------------------------------*/
  149. /************* EXCEPTION MACROPROCESSING ******************************/
  150. /*--------------------------------------------------------------------*/
  151. typedef struct catch
  152. {
  153.   char         *ident;
  154.   jmp_buf       env;
  155.   struct catch *next;
  156. } catch_t;
  157. extern catch_t *env_stack_ptr;
  158. #define EXCEPTION(code) {
  159.   if (env_stack_ptr)
  160.     longjmp (env_stack_ptr->env, code );
  161.   else
  162.     exit(code);
  163. }
  164. #define TRY
  165. {
  166.   catch_t catch_buffer;
  167.   i4_t     catch_buffer_rc;
  168.   catch_buffer.next = env_stack_ptr;
  169.   env_stack_ptr = & catch_buffer;
  170.   catch_buffer_rc = setjmp(catch_buffer.env);
  171.   if (catch_buffer_rc==0)
  172.     {
  173. #define CATCH
  174.       env_stack_ptr = catch_buffer.next;
  175.     }
  176.   else
  177.     {
  178.       env_stack_ptr = catch_buffer.next;
  179.       switch (catch_buffer_rc)
  180.         {
  181.       
  182. #define END_TRY
  183.           break;
  184.         END_TRY0
  185. #define END_TRY0
  186.           break;
  187.         }
  188.     }
  189. }
  190. #define TRY_CATCH(execute,catch_cases) TRY execute; CATCH catch_cases; END_TRY
  191. #endif