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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  xmem.c - extended library for memory processing of GNU SQL compiler
  3.  *
  4.  *  This file is a part of GNU SQL Server
  5.  *
  6.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  7.  *  This code extracted from GNU CC and partially modified by Michael Kimelman
  8.  *
  9.  *  This program is free software; you can redistribute it and/or modify
  10.  *  it under the terms of the GNU General Public License as published by
  11.  *  the Free Software Foundation; either version 2 of the License, or
  12.  *  (at your option) any later version.
  13.  *
  14.  *  This program is distributed in the hope that it will be useful,
  15.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  *  GNU General Public License for more details.
  18.  *
  19.  *  You should have received a copy of the GNU General Public License
  20.  *  along with this program; if not, write to the Free Software
  21.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  22.  *
  23.  *  Contact:  gss@ispras.ru
  24.  *
  25.  */
  26. /* $Id: xmem.c,v 1.246 1997/03/31 11:02:42 kml Exp $ */
  27. #include "xmem.h"
  28. #ifdef HAVE_STDARG_H
  29. #include <stdarg.h>
  30. #endif
  31. #ifdef HAVE_UNISTD_H
  32. #include <unistd.h>
  33. #endif
  34. #include <setjmp.h>
  35. #include "sql_decl.h"
  36. catch_t *env_stack_ptr = NULL;
  37. void 
  38. fatal (char *str, char *arg)
  39. {
  40.   if (progname)
  41.     fprintf (STDERR, "n%s: ", progname);
  42.   fprintf (STDERR, str, arg);
  43.   fprintf (STDERR, "n");
  44.   EXCEPTION(FATAL_EXIT_CODE);
  45. }
  46. /* More 'friendly' abort that prints the line and file.
  47. config.h can #define abort fancy_abort if you like that sort of thing.  */
  48. void 
  49. fancy_abort (char *f,int l)
  50. {
  51.   fprintf (STDERR, "%s:%d: Internal gsqltrn abort.",f,l);
  52.   EXCEPTION(FATAL_EXIT_CODE);
  53. }
  54. void
  55. lperror(char *fmt, ...)
  56. {
  57.   extern int errno;
  58.   static char *comp_errlist[]= {
  59. #define  DEF_ERR(e,msg)  msg,
  60. #include   "errors.h"
  61. #undef   DEF_ERR
  62.     NULL};
  63.   
  64.   static i4_t comp_nerr = sizeof(comp_errlist)/sizeof(char*) - 1;
  65.   i4_t    rc = errno;
  66.   va_list va;
  67.   va_start(va,fmt);
  68.   if (progname && *progname)
  69.     fprintf (STDERR, "%s:", progname);
  70.   if (file_pos)
  71.     fprintf (STDERR, "%d:", (int)file_pos);
  72. #if defined(HAVE_VPRINTF)
  73.   vfprintf(STDERR,fmt,va);
  74. #elif defined(HAVE_DOPRNT)
  75. #  error put here correct '_doprnt' call
  76.   _doprnt(STDERR,fmt,va); <<-- check correctness 
  77. #else
  78. #  error Nether 'vprintf' nor 'doprnt' can be found -- fail
  79. #endif
  80.   if (-comp_nerr < rc && rc < 0)
  81.     fprintf (STDERR, "%s", comp_errlist[-errno]);
  82.   fprintf (STDERR, "n");
  83.   errors++;
  84.   
  85.   errno    = 0;
  86.   file_pos = 0;
  87. }
  88. void 
  89. perror_with_name (char *name)
  90. {
  91.   extern int sys_nerr;
  92.   errno = sys_nerr;
  93.   lperror(name);
  94. }
  95. void 
  96. pfatal_with_name (char *name)
  97. {
  98.   perror_with_name (name);
  99.   EXCEPTION(FATAL_EXIT_CODE);
  100. }
  101. void 
  102. memory_full (void)
  103. {
  104.   fatal ("Memory exhausted.", NULL);
  105. }
  106. static i4_t xxmalloc_flag = 0;
  107. void *
  108. xxmalloc (i4_t size, char *f, int l)
  109. {
  110.   xxmalloc_flag = 1;
  111.   if (size == 0)
  112.     {
  113.       fprintf (STDERR, "n Allocating memory (0) at %s.%dn", f, l);
  114.       return NULL;
  115.     }
  116.   return xmalloc (size);
  117. }
  118. #ifndef USE_XVM
  119. #define M_BORD_B 0
  120. #define M_BORD_A 100 * sizeof(double)
  121. void *
  122. xmalloc (i4_t size)
  123. {
  124.   register char *ptr = NULL;
  125.   if (size == 0)
  126.     {
  127.       if (!xxmalloc_flag)
  128. fprintf (STDERR, "n allocating memory (0) n");
  129.     }
  130.   else
  131.     {
  132.       ptr = malloc (size + M_BORD_B + M_BORD_A);
  133.       if (ptr == 0)
  134. memory_full ();
  135. #if 0
  136.       bzero (ptr, size + M_BORD_B + M_BORD_A);
  137.       ptr = (char*)ptr + M_BORD_B;
  138. #else
  139.       ptr = (char*)ptr + M_BORD_B;
  140.       bzero (ptr, size);
  141. #endif
  142.     }
  143.   xxmalloc_flag = 0;
  144.   return ptr;
  145. }
  146. void *
  147. xrealloc (void *old, i4_t size)
  148. {
  149.   register char *ptr;
  150.   if (old == NULL)
  151.     {
  152.       fprintf (STDERR, "n reallocating NULL memory ");
  153.       return xmalloc(size);
  154.     }
  155.   if (size == 0)
  156.     {
  157.       fprintf (STDERR, "n reallocating memory (0)");
  158.       xfree (old);
  159.       return NULL;
  160.     }
  161.   ptr = realloc ((char*)old - M_BORD_B, (size_t) (size + M_BORD_B + M_BORD_A)) ;
  162.   if (ptr == 0)
  163.     memory_full ();
  164.   return (char*)ptr + M_BORD_B;
  165. }
  166. void *
  167. xcalloc (i4_t number, i4_t size)
  168. {
  169.   register i4_t total = number * size;
  170.   return xmalloc (total);
  171. }
  172. void 
  173. xfree (void *ptr)
  174. {
  175.   if (ptr)
  176.     free ((char*)ptr - M_BORD_B);
  177. }
  178. #endif
  179. char *
  180. savestring (char *input)
  181. {
  182.   i4_t size = strlen (input);
  183.   char *output = xmalloc (size + 1);
  184.   bcopy(input,output,size + 1);
  185.   return output;
  186. }
  187. void 
  188. Bzero (register char *b, register i4_t length)
  189. {
  190.   while (length-- > 0)
  191.     *b++ = 0;
  192. }
  193. void 
  194. Bcopy (register char *src, register char *dest, register i4_t length)
  195. {
  196.   while (length-- > 0)
  197.     *dest++ = *src++;
  198. }
  199. int
  200. Bcmp (register char *b1, register char *b2, register i4_t length)
  201. {
  202.   while (length-- > 0)
  203.     if (*b1++ != *b2++)
  204.       return 1;
  205.   return 0;
  206. }
  207. char *
  208. buffer_string (str_buf * bf, char *sptr, i4_t l)
  209. {
  210.   i4_t bl;
  211.   if (bf->clear_buf)
  212.     {
  213.       if (bf->buf_len)
  214. bf->buffer[0] = 0;
  215.       bf->clear_buf = 0;
  216.     }
  217.   if (sptr == NULL)
  218.     {
  219.       if (bf->buffer && bf->buffer[0] == 0)
  220. {
  221.   bf->buf_len = 0;
  222.   xfree (bf->buffer);
  223.   bf->buffer = NULL;
  224. }
  225.       bf->clear_buf = 1;
  226.       return bf->buffer;
  227.     }
  228.   if (bf->buffer == NULL)
  229.     {
  230.       bf->buffer = xmalloc (bf->buf_len = l + 1);
  231.       bf->buffer[0] = 0;
  232.     }
  233.   if (bf->buf_len < (bl = strlen (bf->buffer) + l + 1))
  234.     bf->buffer = xrealloc (bf->buffer, bf->buf_len = bl);
  235.   bl = strlen (bf->buffer);
  236.   bcopy (sptr, bf->buffer + bl, l + 1);
  237.   return bf->buffer;
  238. }
  239. extern char *getlogin(void);
  240. extern char *cuserid(char *buf);
  241. char *current_user_login_name=NULL;
  242. char *
  243. get_user_name (void)
  244. {
  245.   char *s=NULL;
  246.   s = current_user_login_name;
  247. #ifdef HAVE_GETLOGIN
  248.   if ((s == NULL) || (*s == 0))
  249.     s= getlogin();
  250. #endif
  251. #ifdef HAVE_CUSERID
  252.   if ((s == NULL) || (*s == 0))
  253.     s= cuserid(NULL);
  254. #endif
  255.   if ((s == NULL) || (*s == 0))
  256.     s = getenv ("user");
  257.   if ((s == NULL) || (*s == 0))
  258.     s = getenv ("USER");
  259.   if ((s == NULL) || (*s == 0))
  260.     s = getenv ("LOGNAME");
  261.   if ((s == NULL) || (*s == 0))
  262.     s = "usr";
  263.   return s;
  264. }
  265. #include "totdecl.h"
  266. #ifdef PROC_PACK
  267. i4_t  t4bunpack(char *pnt)       { i4_t  n; TUPACK(pnt,n); return n; }
  268. void t4bpack(i4_t  n,char *pnt)  { TPACK(n,pnt); }
  269. u2_t t2bunpack(char *pnt)       { u2_t n; TUPACK(pnt,n); return n; }
  270. void t2bpack(u2_t n,char *pnt)  { TPACK(n,pnt); }
  271. #endif
  272. #ifndef NOT_DEBUG
  273. void
  274. wait_debugger(void)
  275. {
  276.   /* pause(); */
  277.   sleep (20000);
  278.   errors--;
  279.   lperror("let's meet breakpoint");
  280. }
  281. #endif