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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  conv.c -  collection routines used by functions, generated by kitty.
  3.  *            It's part of 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.  *  Developed at the Institute of System Software
  9.  *  This file is written by Andrew Yahin.
  10.  *
  11.  *  This program is free software; you can redistribute it and/or modify
  12.  *  it under the terms of the GNU General Public License as published by
  13.  *  the Free Software Foundation; either version 2 of the License, or
  14.  *  (at your option) any later version.
  15.  *
  16.  *  This program is distributed in the hope that it will be useful,
  17.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  *  GNU General Public License for more details.
  20.  *
  21.  *  You should have received a copy of the GNU General Public License
  22.  *  along with this program; if not, write to the Free Software
  23.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  24.  *
  25.  *  Contacts: gss@ispras.ru
  26.  *
  27.  */
  28. /* $Id: conv.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  29. #include "global.h"
  30. #include <stdarg.h>
  31. #include "kitty.h"
  32. #include "cycler.h"
  33. #include <assert.h>
  34. void 
  35. arity_trn(TXTREF oper)
  36. {
  37.   TXTREF t;
  38.   i4_t i=0;
  39.   if(HAS_DOWN(oper))
  40.     {
  41.       for(i=0,t=DOWN_TRN(oper);t;t=RIGHT_TRN(t))
  42. i++;
  43.       ARITY_TRN(oper)=i;   
  44.     }
  45. }
  46. TXTREF
  47. rl_corrector(i4_t line,TXTREF node,TXTREF right_link)
  48. {
  49.   if(node)
  50.     {
  51.       register TXTREF n=node;
  52.       if(line)
  53. while(RIGHT_TRN(n))
  54.   n=RIGHT_TRN(n);
  55.       RIGHT_TRN(n)=right_link;
  56.       return node;
  57.     }
  58.   return right_link;
  59. }
  60. TXTREF 
  61. dl_corrector(i4_t line,TXTREF node,TXTREF addit_down_link)
  62. {
  63.   register TXTREF n=DOWN_TRN(node);
  64.   if(n && line)
  65.     {
  66.       while(RIGHT_TRN(n))
  67. n=RIGHT_TRN(n);
  68.       RIGHT_TRN(n)=addit_down_link;
  69.     }
  70.   else
  71.     DOWN_TRN(node)=addit_down_link;
  72.   arity_trn(node);
  73.   return node;
  74. }
  75. TXTREF
  76. del_op( TXTREF operand,TXTREF parent)
  77. {
  78.   register TXTREF t;
  79.   if(!operand) return parent;
  80.   t=DOWN_TRN(parent);
  81.   if(t==operand)
  82.     DOWN_TRN(parent)=RIGHT_TRN(operand);
  83.   else 
  84.     { 
  85.       while(t && RIGHT_TRN(t)!=operand)
  86. t=RIGHT_TRN(t);
  87.       if(!t)
  88. return parent;
  89.       RIGHT_TRN(t)=RIGHT_TRN(operand); 
  90.     }
  91.   ARITY_TRN(parent)--;
  92.   RIGHT_TRN(operand)=TNULL;
  93.   return parent;
  94. }
  95. TXTREF
  96. replace_node(TXTREF by,TXTREF what,TXTREF parent)
  97. {
  98.   TXTREF t = DOWN_TRN(parent);
  99.   if(!by)return parent;
  100.   if(what==t)
  101.     {
  102.       DOWN_TRN(parent)  = by;
  103.       RIGHT_TRN(by) = RIGHT_TRN(what);
  104.     }
  105.   else
  106.     {
  107.       while(t && RIGHT_TRN(t) != what)
  108. t=RIGHT_TRN(t);
  109.       if(t)
  110. {
  111.   RIGHT_TRN(t)  = by;
  112.   RIGHT_TRN(by) = RIGHT_TRN(what); 
  113. }
  114.     }
  115.   return parent;
  116. }
  117. /* 
  118.  * looking for image of node 'p' in tree 'dest'. This tree is the exact
  119.  * copy of tree 'src' where node 'p' is
  120.  */
  121. TXTREF
  122. image (TXTREF p,TXTREF dest,TXTREF src)
  123. {
  124.   
  125.   assert(trn_equal_p(src,dest));
  126.   if (src == TNULL)
  127.     return TNULL;
  128.   if(HAS_DOWN(src))
  129.     {
  130.       register TXTREF res = image (p,DOWN_TRN(dest),DOWN_TRN(src));
  131.       if (res) 
  132. return res;
  133.     }
  134.   return image (p, RIGHT_TRN(dest), RIGHT_TRN(src));
  135. }
  136. TXTREF
  137. insert_node(i4_t before,TXTREF in,TXTREF what,TXTREF where)
  138. {
  139.   TXTREF t=DOWN_TRN(in);
  140. #define after (!before)
  141.   
  142.   if ( after && where )
  143.     {
  144.       RIGHT_TRN(what)=RIGHT_TRN(where);
  145.       RIGHT_TRN(where)=what;
  146.     }
  147.   else if (before && (t==where || where==TNULL))
  148.     {
  149.       RIGHT_TRN(what) = t;
  150.       DOWN_TRN(in)    = what;
  151.     }
  152.   else
  153.     {
  154.       while(t && RIGHT_TRN(t)!=where)
  155. t=RIGHT_TRN(t);
  156.       /* we assume now that t.right_ptr --> 'where' or '0' */
  157.       assert(t); 
  158.       if (before || where==TNULL)
  159. {
  160.   RIGHT_TRN(what)=where;
  161.   RIGHT_TRN(t)=what;
  162. }
  163.       else /* where && after */
  164. {
  165.   RIGHT_TRN(what)=RIGHT_TRN(where);
  166.   RIGHT_TRN(where)=what;
  167. }
  168.     }
  169. #undef after 
  170.   ARITY_TRN(in)++;
  171.   return in;
  172. }