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

📄 extsrt.c

📁 免费的Sql数据库系统
💻 C
字号:
/*  extsrt.c - External sorting *             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: extsrt.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */#include "setup_os.h"#include "dessrt.h"#include "fdclsrt.h"extern i4_t NB, NFP, pinit;extern u2_t pnex, lastpnex, outpn;extern u2_t *arrpn;extern u2_t *cutfpn;extern char *outasp;extern struct A *outpage;extern u2_t offset;extern char *masp[];extern struct A mpage[];extern i4_t EXNSSIZE;extern i4_t need_free_pages;struct el_tree *extsort (i4_t M, char prdbl, char *drctn, u2_t *afn,         struct des_field *df, struct el_tree *tree){  i4_t i, l, j, i1, v, nbnum, cutcnt;  u2_t P;  struct el_tree *ptr1, *ptr2, *ptr3, *q;  quicksort (M, prdbl, drctn, afn, df);  putkf ();    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 (; P < NB; P++)		    cutfpn[cutcnt++] = cutfpn[P];		  NB= cutcnt;		  P = 0;		}	  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.extsort: 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] + size4b;	      ptr1->fe = tree + (i + nbnum) / 2;	      ptr1->fi = tree + i / 2;	    }      m1:	  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 = cmpkey (afn, df, drctn, ptr1->pket, ptr2->pket)) <= 0)		{		  ptr3->lsr = ptr2;		  ptr3->first = ptr1;		}	      else		{		  ptr3->lsr = ptr1;		  ptr3->first = ptr2;		}	      if (prdbl == NODBL && v == 0)		{		  if ((nbnum = geteltr (nbnum, ptr2, i1)) == 1)		    goto m2;		  else		    goto m1;		}	    }	  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 = cmpkey (afn, df, drctn, ptr1->pket, ptr2->pket)) <= 0)		{		  ptr3->lsr = ptr2;		  ptr3->first = ptr1;		}	      else		{		  ptr3->lsr = ptr1;		  ptr3->first = ptr2;		}	      if (prdbl == NODBL && v == 0)		{		  if ((nbnum = geteltr (nbnum, ptr2, i1)) == 1)		    break;		  else		    goto m1;		}	    }      m2:	  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 (putkr, tree, q, prdbl, drctn, afn, df, nbnum);	/*Into key record file*/	  t2bpack ((u2_t) ~0, outasp);	  t2bpack (offset, outasp + size2b);	  putpage (outpage, 'm');	  	}      NB = cutcnt;    }}

⌨️ 快捷键说明

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