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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  cs_link.c  -  library used by both client and server of GNU SQL compiler
  3.  *
  4.  *  NOTE:(!!)  This file does NOT compiled by itself. It's only included
  5.  *             by main routine of either client or server part of compiler.
  6.  *
  7.  * This file is a part of GNU SQL Server
  8.  *
  9.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  10.  *  Developed at the Institute of System Programming
  11.  *  This file is written by Michael Kimelman.
  12.  *
  13.  *  This program is free software; you can redistribute it and/or modify
  14.  *  it under the terms of the GNU General Public License as published by
  15.  *  the Free Software Foundation; either version 2 of the License, or
  16.  *  (at your option) any later version.
  17.  *
  18.  *  This program is distributed in the hope that it will be useful,
  19.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21.  *  GNU General Public License for more details.
  22.  *
  23.  *  You should have received a copy of the GNU General Public License
  24.  *  along with this program; if not, write to the Free Software
  25.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  26.  *
  27.  *  Contacts: gss@ispras.ru
  28.  *
  29.  */
  30. /* $Id: cs_link.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  31. #ifndef __CS_LINK_H__
  32. #define __CS_LINK_H__
  33. #if   !defined(__CLIENT__) && !defined(__SERVER__)
  34. #error File cs_link.c can`t be included here!!!!
  35. #endif
  36. #include "setup_os.h"
  37. #ifdef HAVE_UNISTD_H
  38. #include <unistd.h>
  39. #endif
  40. #ifdef STDC_HEADERS 
  41. #include <string.h>
  42. #else
  43. #include <strings.h>
  44. #endif
  45. #include "gsqltrn.h"           /* c/s interface structures */
  46. #ifdef __SERVER__
  47. static i4_t last_comp_pass = sizeof (compiler_passes) / sizeof (*compiler_passes) - 2;
  48. #endif
  49. #ifdef __SERVER__
  50. #define STD_FLS_PROC  { OP(STDERR,"err"); OP(STDOUT,"out"); }
  51. #else
  52. #define STD_FLS_PROC
  53. #endif
  54. #define PROCESS_FILES  {
  55.   i4_t i;
  56.   STD_FLS_PROC OP(sc_file,"Sc");             
  57.   for(i=0;compiler_passes[i].sname;i++)      
  58.     if(compiler_passes[i].dump)              
  59.       { OP(compiler_passes[i].dmp_file,compiler_passes[i].dumpext);} 
  60. }
  61. static i4_t is_open = 0;
  62. int
  63. open_file (FILE ** f, char *ext)
  64. {
  65.   FILE *F = NULL;
  66.   char b[120];
  67. #ifdef __SERVER__
  68. #define DBG under_dbg
  69. #else
  70. #define DBG 1
  71. #endif
  72.   if      ((bcmp(ext,"err",3)==0) && DBG)
  73.     F=stderr;
  74.   else if ((bcmp(ext,"out",3)==0) && DBG)
  75.     F=stdout;
  76.   else
  77.     {
  78.       strcpy (b, sql_prg);
  79.       strcat (b, ".");
  80.       strcat (b, ext);
  81.       remove (b);
  82. #ifdef __CLIENT__
  83.       F = fopen (b, "w");
  84. #else
  85.       F = fopen (b, "w+");
  86. #endif
  87.     }
  88.   if (F == NULL)
  89.     {
  90.       fprintf (STDERR, "Can not create file '%s'n", b);
  91.       return 0;
  92.     }
  93.   if ( f  && (*f != F))
  94.     *f = F;
  95.   return 1;
  96. #undef DBG
  97. }
  98. static void
  99. close_file (FILE ** f, char *ext)
  100. {
  101.   i4_t l = 1;
  102.   if (f)
  103.     {
  104.       if ( (*f) == stderr || (*f) == stdout)
  105. return;
  106.       if (*f)
  107. {
  108.           l = ftell(*f);
  109.   fclose (*f);
  110.   if (strcmp (ext, "err") == 0)
  111.     *f = stderr;
  112.           else if (strcmp (ext, "out") == 0)
  113.     *f = stdout;
  114.   else
  115.             *f = NULL;
  116. }
  117.     }
  118. #ifdef __CLIENT__ 
  119.   if ((errors && (strcmp(ext,"c")==0 || strcmp(ext,"Sc")==0 )) || /* if errors occured or    */
  120.       (l==0 &&   strcmp(ext,"c")     && strcmp(ext,"Sc") ) /*there is no output to some file */
  121.       )
  122. #endif
  123.   { /* remove it */
  124.     char b[120];
  125.     strcpy (b, sql_prg);
  126.     strcat (b, ".");
  127.     strcat (b, ext);
  128.     remove (b);
  129.   }
  130. }
  131. static i4_t 
  132. close_out_files (void)
  133. {
  134.   if(!is_open)
  135.     return 1;
  136. #define OP(f,ext)  close_file(&(f),ext);
  137.   PROCESS_FILES;
  138.   is_open = 0;
  139.   return 1;
  140. #undef OP
  141. }
  142. static void 
  143. close_out(void)
  144. {
  145.   close_out_files();
  146. }
  147. static i4_t 
  148. open_out_files (void)
  149. {
  150.   static i4_t done = 0;
  151.   if (done==0)
  152.     {
  153. #if HAVE_ATEXIT
  154.       atexit(close_out);
  155. #elif HAVE_ON_EXIT
  156.       on_exit(close_out);
  157. #endif  
  158.       done = 1;
  159.     }
  160.   close_out_files();
  161. #define OP(f,ext)  if(!open_file(&(f),ext)) return 0;
  162.   PROCESS_FILES;
  163. #undef OP
  164.   is_open = 1;
  165.   return 1;
  166. }
  167. #ifdef __SERVER__
  168. static file_buf_t *
  169. get_file_buf (file_buf_t *ptr,FILE * f, char *ext)
  170. {
  171.   register file_buf_t *p;
  172.   register i4_t        i;
  173.   if (f == NULL)
  174.     return ptr;
  175.   i = ftell (f);
  176.   if (i <= 0)
  177.     return ptr;
  178.   p =  (file_buf_t*)xmalloc(sizeof(file_buf_t));
  179.   p->text = (char*) xmalloc (i + 1);
  180.   fseek (f, SEEK_SET, 0);
  181.   fread (p->text, i, 1, f);
  182.   fseek (f, SEEK_SET, 0); /* and set write position to the top again */
  183.   p->text[i] = 0;
  184.   if (!ext) ext = "";
  185.   p->ext = (char*) xmalloc (strlen(ext) + 1);
  186.   strcpy(p->ext,ext);
  187.   p->next = ptr;
  188.   return p;
  189. }
  190. static file_buf_t *
  191. get_files_bufs (void)
  192. {
  193.   register file_buf_t *ptr = NULL;
  194.   
  195. #define OP(f,ext)   ptr = get_file_buf(ptr,f,ext)
  196.   PROCESS_FILES;
  197. #undef OP
  198.   return ptr;
  199. }
  200. #endif
  201. #ifdef __CLIENT__
  202. static i4_t 
  203. put_file_buf (file_buf_t *ptr,FILE * f, char *ext)
  204. {
  205.   if (!f)
  206.     return 0;
  207.   while(ptr)
  208.     if(bcmp(ptr->ext,ext,strlen(ext))!=0)
  209.       ptr=ptr->next;
  210.     else
  211.       {
  212.         fwrite (ptr->text, strlen (ptr->text), 1, f); /* or just fputs(bf,f);*/
  213.         break;
  214.       }
  215.   return 0;
  216. }
  217. static i4_t 
  218. put_files_bufs (file_buf_t * ptr)
  219. {
  220.   if (ptr == NULL)
  221.     return 0;
  222. #define OP(f,ext)   put_file_buf(ptr,f,ext)
  223.   PROCESS_FILES;
  224. #undef OP
  225.   while (ptr)
  226.     {
  227.       if(bcmp(ptr->ext,"err",3)==0)
  228.         fwrite (ptr->text, strlen (ptr->text), 1, stderr);
  229.       if(bcmp(ptr->ext,"out",3)==0)
  230.         fwrite (ptr->text, strlen (ptr->text), 1, stdout);
  231.       ptr=ptr->next;
  232.     }
  233.   return 0;
  234. }
  235. #endif
  236. #endif