⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tidsrt.c

📁 免费的Sql数据库系统
💻 C
字号:
/*  tidsrt.c - Functions dealing with sort a filter by tid's *             Kernel of GNU SQL-server. Sorter      * *  This file is a part of GNU SQL Server * *  Copyright (c) 1996, 1997, Free Software Foundation, Inc *  Developed at the Institute of System Programming *  This file is written by  Vera Ponomarenko * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * *  Contacts:   gss@ispras.ru * *//* $Id: tidsrt.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */#include "xmem.h"#include "dessrt.h"#include "f1f2decl.h"#include "fdclsrt.h"extern i4_t N, NB, NFP;extern i4_t pinit;extern char *nonsense;extern char *regakr;extern char *outasp;extern struct A *outpage;extern u2_t pnex, lastpnex, freesz;extern u2_t offset;extern i4_t EXNSSIZE;extern u2_t *arrpn;extern u2_t *cutfpn;extern u2_t outpn;extern char *masp[];extern struct A mpage[];extern char *akr;extern char **regpkr;extern i4_t segsize;extern i4_t need_free_pages;voidquick_sort_tid (i4_t M){  i4_t bstek[STEKSZ];  i4_t *stek, l, r, i, j, v;  char **ptp, *curpk;  ptp = (char **) regakr;  stek = bstek;  for (l = 1, r = N;;)    {      if ((r - l) < M)	{			/* The simple insertion sort */	  for (j = l + 1; j <= r; j++)	    {	      curpk = ptp[j];	      for (i = j - 1; i >= l;)		if ((v = cmp_tid (curpk, ptp[i])) < 0)		  {		    ptp[i + 1] = ptp[i];		    i--;		  }		else		  break;	      ptp[i + 1] = curpk;	    }	  if (stek == bstek)	    break;	  r = *stek--;	  l = *stek--;	  continue;	}      i = l;			/* quicksort */      j = r;      curpk = ptp[l];  m1:      for (v = -1; v < 0; j--)	v = cmp_tid (curpk, ptp[j]);      if (i >= j)	{	  ptp[i] = curpk;	  goto m3;	}      ptp[i++] = ptp[j];      for (v = -1; v < 0; i++)	v = cmp_tid (ptp[i], curpk);      if (i < j)	{	  ptp[j] = ptp[i];	  j--;	  goto m1;	}      ptp[j] = curpk;      i = j;    m3:if ((i - l) <= (r - i))	{	  *stek++ = i + 1;	  *stek++ = r;	  r = i - 1;	}      else	{	  *stek++ = l;	  *stek++ = i - 1;	  l = i + 1;	}    }}voidputs_tid (void){  char *asp, *a;  i4_t i;  u2_t off, fpn;  struct des_tid *tid;  asp = getnew (outpage, NRSNUM, pnex);  off = size4b;  a = asp + off;  fpn = pnex;    for (tid = (struct des_tid *) regakr, i = 0; i < N; i++, tid++)    {      if ((tidsize + off) > BD_PAGESIZE)	{	  ++pnex;	  if (pnex == lastpnex)	    addext ();	  t2bpack (pnex, asp);	  t2bpack (off, asp + size2b);	  putpage (outpage, 'm');	  asp = getnew (outpage, NRSNUM, pnex);	  off = size4b;	  a = asp + off;	}      bcopy ((char *) tid, a, tidsize);      a += tidsize;      off += tidsize;    }  t2bpack ((u2_t) ~ 0, asp);  t2bpack (off, asp + size2b);  putpage (outpage, 'm');  cutfpn[NB] = fpn;  NB++;  pnex++;  if (pnex == lastpnex)    addext ();  akr = regakr;  freesz = segsize;  }struct el_tree *ext_sort_tid (i4_t M, struct el_tree *tree){  i4_t i, l, j, i1, v, nbnum, cutcnt;  u2_t P;  struct el_tree *ptr1, *ptr2, *ptr3, *q;  quick_sort_tid (M);  puts_tid ();    need_free_pages = YES;  for (i = 0; pnex != lastpnex; i++)    {      arrpn[i] = pnex++;      if (i == NFP)	{	  NFP += EXNSSIZE;	  arrpn = (u2_t *) realloc ((void *) arrpn, (size_t) NFP * size2b);	}    }  for (; i < NFP; i++)    arrpn[i] = (u2_t) ~ 0;  q = NULL;  for (cutcnt = 0; ; cutcnt = 0)    {			/* The external sort by replacement selecting */      for (P = 0; P < NB;)	{	  if (NB > pinit)	    if (NB - P + cutcnt < pinit)	      {		for (i = P; P < NB; i++)		  cutfpn[cutcnt++] = cutfpn[i];		NB= cutcnt;	      }	  	  for (nbnum = 0; nbnum < pinit && P < NB; nbnum++, P++)	    if ((masp[nbnum] = getpage (&mpage[nbnum], NRSNUM, cutfpn[P])) == NULL)	      break;	  if (nbnum == 0)	    perror ("SRT.ext_sort_tid: No segments for key file pages");	  if (P == 1)	    {	      tree->pket = masp[0] + size4b;	      return (tree);	    }	  if (nbnum == 1)	    perror ("SRT.extsort: Serious error nbnum == 1");	    	  for (i = 0; i < nbnum; i++)	    {			/* initial tree */	      ptr1 = tree + i;	      ptr1->pket = masp[i] + phfsize;	      ptr1->fe = tree + (i + nbnum) / 2;	      ptr1->fi = tree + i / 2;	    }	  l = nbnum / 2;	  if (nbnum % 2 != 0)	    l++;	  for (j = nbnum - 1; j >= l; j--)	    {				      i = (2 * j) % nbnum;	/* j - node counter, i - tree index */	      i1 = i + 1;	      ptr1 = tree + i;	      ptr2 = tree + i1;	      ptr3 = tree + j;	      if ((v = cmp_tid (ptr1->pket, ptr2->pket)) <= 0)		{		  ptr3->lsr = ptr2;		  ptr3->first = ptr1;		}	      else		{		  ptr3->lsr = ptr1;		  ptr3->first = ptr2;		}	    }	  for (; j > 0; j--)	    {				      i = 2 * j;	      if ((i1 = i + 1) == nbnum)		i1 = 0;	      tree->first = tree;	      ptr1 = (tree + i)->first;	      ptr2 = (tree + i1)->first;	      ptr3 = tree + j;	      if ((v = cmp_tid (ptr1->pket, ptr2->pket)) <= 0)		{		  ptr3->lsr = ptr2;		  ptr3->first = ptr1;		}	      else		{		  ptr3->lsr = ptr1;		  ptr3->first = ptr2;		}	    }	  q = tree->lsr = (tree + 1)->first;	/* The new champion */	  if (NB <= pinit)	    {	      NB = nbnum;	      return (q);	    }	  getptmp ();	  outasp = getnew (outpage, NRSNUM, outpn);	  	  offset = size4b;	  cutfpn[cutcnt++] = outpn;		  	  push_tid (middle_put_tid, tree, q, nbnum);	  t2bpack ((u2_t) ~0, outasp);	  t2bpack (offset, outasp + size2b);	  putpage (outpage, 'm');		  	}      NB = cutcnt;    }}voidpush_tid (void (*pnt_puttid) (), struct el_tree *tree, struct el_tree *q, i4_t nbnum){  struct el_tree *ptree, *qq;  char *pkr, *asp, *a;  i4_t v;  u2_t off, size, pn;  struct A *ppage;  if (nbnum != 1)    {      for (;; )	{				/*To find a loser */	  (*pnt_puttid) (q->pket);		  nbnum = get_el_tr_tid (nbnum, q, q - tree);	  for (ptree = q->fe ;; ptree = ptree->fi)	    {	      if ((v = cmp_tid (ptree->lsr->pket, q->pket)) < 0)		{		  qq = q;		  q = ptree->lsr;		  ptree->lsr = qq;		}	      if (ptree == tree + 1)		break;	    }          if (nbnum == 1)            break;	}    }  v = q - tree;  a = masp[v];  off = t2bunpack (a + size2b);  pkr = q->pket;  pn = t2bunpack (a);  ppage = &mpage[v];  for (size = a + off - pkr; size != 0; size -= tidsize)    (*pnt_puttid) (pkr);  putpage (ppage, 'n');    for (; pn != (u2_t) ~ 0;)    {      asp = getpage (ppage, NRSNUM, pn);      pkr = asp + size4b;      size = t2bunpack (asp + size2b) - size4b;      for (; size != 0; size -= tidsize)	(*pnt_puttid) (pkr);      pn = t2bunpack (asp);            putpage (ppage, 'n');          }}intget_el_tr_tid (i4_t nbnum, struct el_tree *q, i4_t i){  char *pkr;  pkr = q->pket;  pkr += tidsize;  return (next_el_tree (nbnum, q, i, pkr));}intcmp_tid (char *pnt1, char *pnt2){  i4_t i, v;  for (i = 0; i < 2; i++)    {      if ((v = f2b (pnt1, pnt2, size2b, size2b)) != 0)	return (v);      pnt1 += size2b;      pnt2 += size2b;    }  return (0);}

⌨️ 快捷键说明

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