Beispiel #1
0
void insert(tttree *cur,int num)
	{
	if(cur==NULL)
		{
		cur=new tttree(num);
		root=cur;
		return;
		}
	if(num==cur->v1||(cur->type==3&&cur->v2==num))return;
	if(isleaf(cur))
		{
		if(cur->type==2)
			{
			cur->v2=num;
			cur->type=3;
			needswap(cur);
			}
		else if(cur->type==3)
			split(cur,num);
		return;
		}
	if(num<cur->v1)insert(cur->left,num);
	else if(cur->type==2&&num>cur->v1)insert(cur->right,num);
	else if(cur->type==3&&num>cur->v2)insert(cur->right,num);
	else	if(cur->type==3)insert(cur->mid,num);
	}
Beispiel #2
0
void split(tttree *cur,int num)
	{
	tttree *n1=new tttree(min(cur->v1,num,cur->v2));
	tttree *n2=new tttree(max(cur->v1,num,cur->v2));
	int x=cur->v1+num+cur->v2-n1->v1-n2->v1;
	
	tttree *p=NULL;
	if(cur->par==NULL)
		{
		p=new tttree(x);
		root=p;
		}
	else
		p=cur->par;
	n1->par=p;
	n2->par=p;
	if(x<p->v1)
		{
		p->left=n1;
		p->extra=n2;
		}
	else if((p->type==2&&x>p->v1)||(p->type==3&&x>p->v2))
		{
		p->right=n2;
		p->extra=n1;
		}
	else if(x!=p->v1)
		{
		p->mid=n1;
		p->extra=n2;
		}
	
	if(!isleaf(cur))
		{
		sort(cur);
		cur->left->par=n1;n1->left=cur->left;
		cur->mid->par=n1;n1->right=cur->mid;
		cur->right->par=n2;n2->left=cur->right;
		cur->extra->par=n2;n2->right=cur->extra;
		}
	delete cur;
	if(p->v1==x)
		{
		p->left=n1;  //!!!!FORGET
		p->right=n2; //!!!!FORGET
		return;
		}
	if(p->type==2)
		{
		p->mid=p->extra;  //!!!FORGET
		p->type=3;
		p->v2=x;
		needswap(p);
		}
	else
		split(p,x);
	}
Beispiel #3
0
void
readmach(Machine *m, int init)
{
	int n, i;
	uint64_t a[nelem(m->devsysstat)];
	char buf[32];

	if(m->remote && (m->disable || setjmp(catchalarm))){
		if (m->disable++ >= 5)
			m->disable = 0; /* give it another chance */
		memmove(m->devsysstat, m->prevsysstat, sizeof m->devsysstat);
		memmove(m->netetherstats, m->prevetherstats, sizeof m->netetherstats);
		return;
	}
	snprint(buf, sizeof buf, "%s", m->name);
	if (strcmp(m->name, buf) != 0){
		free(m->name);
		m->name = estrdup(buf);
		free(m->shortname);
		m->shortname = shortname(buf);
		if(display != nil)	/* else we're still initializing */
			eresized(0);
	}
	if(m->remote){
		notify(alarmed);
		alarm(5000);
	}
	if(needswap(init) && loadbuf(m, &m->swapfd) && readswap(m, a))
		memmove(m->devswap, a, sizeof m->devswap);
	if(needstat(init) && loadbuf(m, &m->statsfd)){
		memmove(m->prevsysstat, m->devsysstat, sizeof m->devsysstat);
		memset(m->devsysstat, 0, sizeof m->devsysstat);
		for(n=0; n<m->nproc && readnums(m, nelem(m->devsysstat), a, 0); n++)
			for(i=0; i<nelem(m->devsysstat); i++)
				m->devsysstat[i] += a[i];
	}
	if(needether(init) && loadbuf(m, &m->etherfd) && readnums(m, nelem(m->netetherstats), a, 1)){
		memmove(m->prevetherstats, m->netetherstats, sizeof m->netetherstats);
		memmove(m->netetherstats, a, sizeof m->netetherstats);
	}
	if(needsignal(init) && loadbuf(m, &m->ifstatsfd) && strncmp(m->buf, "Signal: ", 8)==0 && readnums(m, nelem(m->netetherifstats), a, 1)){
		memmove(m->netetherifstats, a, sizeof m->netetherifstats);
	}
	if(needbattery(init) && loadbuf(m, &m->batteryfd) && readnums(m, nelem(m->batterystats), a, 0))
		memmove(m->batterystats, a, sizeof(m->batterystats));
	if(needbattery(init) && loadbuf(m, &m->bitsybatfd) && readnums(m, 1, a, 0))
		memmove(m->batterystats, a, sizeof(m->batterystats));
	if(needtemp(init) && loadbuf(m, &m->tempfd))
		for(n=0; n < nelem(m->temp) && readnums(m, 2, a, 0); n++)
			 m->temp[n] = a[0];
	if(m->remote){
		alarm(0);
		notify(nil);
	}
}
Beispiel #4
0
void adns__isort(void *array, int nobjs, int sz, void *tempbuf,
		 int (*needswap)(void *context, const void *a, const void *b),
		 void *context) {
  byte *data= array;
  int i, place;

  for (i=0; i<nobjs; i++) {
    for (place= i;
	 place>0 && needswap(context, data + (place-1)*sz, data + i*sz);
	 place--);
    if (place != i) {
      memcpy(tempbuf, data + i*sz, (size_t) sz);
      memmove(data + (place+1)*sz, data + place*sz, (size_t) (i-place)*sz);
      memcpy(data + place*sz, tempbuf, (size_t) sz);
    }
  }
}
Beispiel #5
0
/*--------------------------------------------------------*/
int read_FITS_image(FILE *inf, char **header, int hsize, void **buf)
{
        void  *ptr;           /* data table pointer           */
        char  flag[9],        /* header entry flag            */
              hline[72];
        int   i,              /* loop numerator               */
              naxes,          /* image dimension              */
              *naxis,         /* table of sizes of axes       */
              pixnum,         /* number of image pixels       */
              bitpix,
              bytepix;

  if (get_FITS_key(hsize, header, "NAXIS", hline) == -1) return(0);
  sscanf(hline, "%d", &naxes);

  if (!(naxis=(int *)calloc(naxes, sizeof(int))))
    errmess("pfitsio: read_FITS_image - calloc(naxis)");

  for (i=0; i<naxes; i++)
  {
    sprintf(flag, "NAXIS%d", i+1);
    if (get_FITS_key(hsize, header, flag, hline) == -1) return(0);
    sscanf(hline, "%d", &naxis[i]);
  }

  pixnum=1;
  for (i=0; i<naxes; i++) pixnum*=naxis[i];

  free(naxis);

  if (get_FITS_key(hsize, header, "BITPIX", hline) == -1) return(0);
  sscanf(hline, "%d", &bitpix);
  bytepix=abs(bitpix)/8;

  if (!(ptr=(void *)malloc(pixnum*bytepix)))
    errmess("pfitsio: read_FITS_image - malloc(ptr)");

  if (fread(ptr, bytepix, pixnum, inf) != pixnum)
    errmess("pfitsio: read_FITS_image - reading data");

  if (needswap()) swap_bytes(ptr, pixnum, bytepix);

  *buf=ptr;

  return(pixnum);
}