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); }
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); }
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); } }
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); } } }
/*--------------------------------------------------------*/ 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); }