示例#1
0
文件: bin.c 项目: bitursa/maos
/**
   read spint array of size len from file and do optional data conversion.
*/
void readspintdata(file_t *fp, uint32_t magic, spint *out, long len) {
    int size=0;
    switch(magic & 0xFFFF) {
    case M_INT64:
        size=8;
        break;
    case M_INT32:
        size=4;
        break;
    case M_DBL:/*saved by matlab. */
        size=-8;
        break;
    default:
        error("This is not a valid sparse spint file. magic=%x\n", magic);
    }
    if(sizeof(spint)==size) { /*Matched int. */
        zfread(out, sizeof(spint), len, fp);
    } else {
        size=abs(size);
        void *p=malloc(size*len);
        zfread(p, size, len, fp);
        switch(magic & 0xFFFF) {
        case M_INT64: {
            uint64_t *p2=p;
            for(unsigned long j=0; j<len; j++) {
                out[j]=(spint)p2[j];
            }
        }
        break;
        case M_INT32: {
            uint32_t *p2=p;
            for(unsigned long j=0; j<len; j++) {
                out[j]=(spint)p2[j];
            }
        }
        break;
        case M_DBL: {
            double *p2=p;
            for(unsigned long j=0; j<len; j++) {
                out[j]=(spint)p2[j];
            }
        }
        break;
        }
    }
}
示例#2
0
SDL_bool dr_load_section(unzFile *gz, SECTION s, Uint8 *current_buf) {
    LIST *l;
    for(l=s.item;l;l=l->next) {
	SECTION_ITEM *item=l->data;
    
	if (strcmp(item->filename,"-")!=0) {
	    /* nouveau fichier, on l'ouvre */
	    if (unzLocateFile(gz, item->filename, 2) == UNZ_END_OF_LIST_OF_FILE) {
		unzClose(gz);
		return SDL_FALSE;
	    }
	    if (unzOpenCurrentFile(gz) != UNZ_OK) {
		unzClose(gz);
		return SDL_FALSE;
	    }
	}
	create_progress_bar(item->filename);
	if (item->type==LD_ALTERNATE)
	    zfread_alternate(gz, current_buf + item->begin, item->size, 2);
	else
	    zfread(gz, current_buf + item->begin, item->size);
    }
    return SDL_TRUE;
}
示例#3
0
文件: bin.c 项目: bitursa/maos
/*
  Obtain the current magic number, string header, and array size from a bin
  format file. In file, the string header is located before the data magic.
*/
static int
read_bin_header(header_t *header, file_t *fp) {
    uint32_t magic,magic2;
    uint64_t nlen, nlen2;
    if(fp->isfits) error("fits file is not supported\n");
    while(1) {
        /*read the magic number.*/
        if(zfread_try(&magic, sizeof(uint32_t), 1, fp)) return -1;
        /*If it is hstr, read or skip it.*/
        if((magic&M_SKIP)==M_SKIP) {
            continue;
        } else if(magic==M_HEADER) {
            zfread(&nlen, sizeof(uint64_t), 1, fp);
            if(nlen>0) {
                /*zfseek failed in cygwin (gzseek). so we always read in the hstr instead.*/
                char hstr2[nlen];
                zfread(hstr2, 1, nlen, fp);
                hstr2[nlen-1]='\0'; /*make sure it is NULL terminated. */
                if(header->str) {
                    header->str=realloc(header->str,((header->str)?strlen(header->str):0)+strlen(hstr2)+1);
                    strncat(header->str, hstr2, nlen);
                } else {
                    header->str=strdup(hstr2);
                }
            }
            zfread(&nlen2, sizeof(uint64_t),1,fp);
            zfread(&magic2, sizeof(uint32_t),1,fp);
            if(magic!=magic2 || nlen!=nlen2) {
                info("magic=%u, magic2=%u, nlen=%lu, nlen2=%lu\n",
                     magic, magic2, (unsigned long)nlen, (unsigned long)nlen2);
                error("Header string verification failed\n");
            }
        } else { //Finish
            header->magic=magic;
            zfread(&header->nx, sizeof(uint64_t), 1, fp);
            zfread(&header->ny, sizeof(uint64_t), 1, fp);
            return 0;
        }
    }/*while*/
    return -1;
}
示例#4
0
bool ZCharacterItem::Load(ZFile *file, int nReplayVersion)
{
	enum MMatchCharItemParts_v0
	{
		MMCIP_HEAD_V0		= 0,
		MMCIP_CHEST_V0		= 1,
		MMCIP_HANDS_V0		= 2,
		MMCIP_LEGS_V0		= 3,
		MMCIP_FEET_V0		= 4,
		MMCIP_FINGERL_V0	= 5,
		MMCIP_FINGERR_V0	= 6,
		MMCIP_MELEE_V0		= 7,
		MMCIP_PRIMARY_V0	= 8,
		MMCIP_SECONDARY_V0	= 9,
		MMCIP_CUSTOM1_V0	= 10,
		MMCIP_CUSTOM2_V0	= 11,
		MMCIP_END_V0
	};

	struct Converter
	{
		static int v0_to_v6(int v0)
		{
			switch (v0)
			{
			case MMCIP_HEAD_V0:			return MMCIP_HEAD;
			case MMCIP_CHEST_V0:		return MMCIP_CHEST;
			case MMCIP_HANDS_V0:		return MMCIP_HANDS;
			case MMCIP_LEGS_V0:			return MMCIP_LEGS;
			case MMCIP_FEET_V0:			return MMCIP_FEET;
			case MMCIP_FINGERL_V0:		return MMCIP_FINGERL;
			case MMCIP_FINGERR_V0:		return MMCIP_FINGERR;
			case MMCIP_MELEE_V0:		return MMCIP_MELEE;
			case MMCIP_PRIMARY_V0:		return MMCIP_PRIMARY;
			case MMCIP_SECONDARY_V0:	return MMCIP_SECONDARY;
			case MMCIP_CUSTOM1_V0:		return MMCIP_CUSTOM1;
			case MMCIP_CUSTOM2_V0:		return MMCIP_CUSTOM2;
			}
			return MMCIP_END;
		}

		static int convert(int old, int nReplayVersion)
		{
			int curr = old;
			switch (nReplayVersion)
			{
			case 0:case 1:case 2:case 3:case 4:case 5:
				curr = v0_to_v6(curr);
			}
			return curr;
		}
	};

	int numCharItemParts = 0;
	if (0 <= nReplayVersion && nReplayVersion <= 5)
		numCharItemParts = MMCIP_END_V0;
	else
		numCharItemParts = MMCIP_END;

	size_t n;
	for(int i=0;i<numCharItemParts;i++)
	{
		int idxParts = Converter::convert(i, nReplayVersion);
		ZItem *pItem=GetItem(MMatchCharItemParts(idxParts));
		int nBullet;
		n=zfread(&nBullet,sizeof(nBullet),1,file);
		pItem->SetBulletSpare(nBullet);
		if(n!=1) return false;

		int nBulletCurrMagazine;
		n=zfread(&nBulletCurrMagazine,sizeof(nBulletCurrMagazine),1,file);
		pItem->SetBulletCurrMagazine(nBulletCurrMagazine);
		if(n!=1) return false;
	}

	return true;
}
示例#5
0
文件: read.c 项目: bitursa/maos
static mxArray *readdata(file_t *fp, mxArray **header, int start, int howmany){
    /*
      if start!=0 || howmany!=0 and data is cell, will only read cell from start to start+howmany
      if data is not cell and start==-1, will skip the data.
      Only the first call to readdata will possibly have howmany!=0
     */
    if(fp->eof) return NULL;
    header_t header2;
    if(read_header2(&header2, fp)){
	return NULL;
    }
    uint32_t magic=header2.magic & 0xFFFF;
    if(magic==0){//end of file or empty file
	fp->eof=1;
	return NULL;
    }
    if(header){
	if(header2.str)
	    *header=mxCreateString(header2.str);
	else
	    *header=mxCreateString("");
    }
    free(header2.str); header2.str=NULL;
    long nx=header2.nx;
    long ny=header2.ny;
    int start_save=start;
    if(iscell(magic)){
	if(start!=-1 && howmany==0){
	    if(start!=0){
		error("Invalid use\n");
	    }
	    howmany=nx*ny-start;
	}
    }else if(fp->isfits){
	if(howmany!=0){
	    /*first read of fits file. determine if we need it*/
	    if(start>0){
		start=-1;//skip this block.
	    }
	}
    }else{
	if((start!=0 && start!=-1) || howmany!=0){
	    error("invalid use");
	}
    }
    int iscell=0;
    if(fp->eof) return NULL;
    mxArray *out=NULL;
    switch(magic){
    case MCC_ANY:
    case MCC_DBL:
    case MCC_CMP:
    case MC_CSP:
    case MC_SP:
    case MC_DBL:
    case MC_CMP:
    case MC_INT32:
    case MC_INT64:
	{
	    iscell=1;
	    mwIndex ix;
	    if(fp->eof) return NULL;
	    if(nx*ny>1 && skip_unicell){
		out=mxCreateCellMatrix(nx,ny);
	    }
	    mxArray *header0=mxCreateCellMatrix(nx*ny+1,1);
	    for(ix=0; ix<nx*ny; ix++){
		int start2=0;
		if(start==-1 || ix<start || ix>=start+howmany){
		    start2=-1;
		}
		mxArray *header3=NULL;
		mxArray *tmp=readdata(fp, &header3, start2, 0);
		if(fp->eof){
		    break;
		}
		if(tmp && tmp!=SKIPPED){
		    if(nx*ny==1 && skip_unicell){//only one entry
			out=tmp;
		    }else{
			mxSetCell(out, ix, tmp);
		    }
		    if(header3){
			mxSetCell(header0, ix, header3);
		    }
		}
	    }
	    if(header){
		mxSetCell(header0, nx*ny, *header);
		*header=header0;
	    }
	}
	break;
    case M_SP64:
    case M_SP32:
	{
	    if(start==-1) error("Invalid use\n");
	    size_t size;
	    if(magic==M_SP32){
		size=4;
	    }else if(magic==M_SP64){
		size=8;
	    }else{
		size=0;
		error("Invalid magic\n");
	    }
	    uint64_t nzmax;
	    if(nx!=0 && ny!=0){
		zfread(&nzmax,sizeof(uint64_t),1,fp);
	    }else{
		nzmax=0;
	    }
	    if(fp->eof) return NULL;
	    out=mxCreateSparse(nx,ny,nzmax,mxREAL);
	    if(nx!=0 && ny!=0 && nzmax!=0){
		if(sizeof(mwIndex)==size){/*Match*/
		    zfread(mxGetJc(out), size,ny+1,fp);
		    zfread(mxGetIr(out), size,nzmax, fp);
		}else{
		    long i;
		    mwIndex *Jc0=mxGetJc(out);
		    mwIndex *Ir0=mxGetIr(out);
		    void *Jc=malloc(size*(ny+1));
		    void *Ir=malloc(size*nzmax);
		    zfread(Jc, size, ny+1, fp);
		    zfread(Ir, size, nzmax, fp);
		    if(size==4){
			uint32_t* Jc2=Jc;
			uint32_t* Ir2=Ir;
			for(i=0; i<ny+1; i++){
			    Jc0[i]=Jc2[i];
			}
			for(i=0; i<nzmax; i++){
			    Ir0[i]=Ir2[i];
			}
			free(Jc);
			free(Ir);
		    }else if(size==8){
			uint64_t* Jc2=Jc;
			uint64_t* Ir2=Ir;
			for(i=0; i<ny+1; i++){
			    Jc0[i]=Jc2[i];
			}
			for(i=0; i<nzmax; i++){
			    Ir0[i]=Ir2[i];
			}
			free(Jc);
			free(Ir);
		    }else{
			mexErrMsgTxt("Invalid sparse format\n");
		    }
		}
		zfread(mxGetPr(out), sizeof(double), nzmax, fp);
	    }
	}
	break;
    case M_CSP64:
    case M_CSP32:/*complex sparse*/
	{
	    if(start==-1) error("Invalid use\n");
	    size_t size;
	    switch(magic){
	    case M_CSP32:
		size=4;break;
	    case M_CSP64:
		size=8;break;
	    default:
		size=0;
	    }
	    uint64_t nzmax;
	    if(nx!=0 && ny!=0){
		zfread(&nzmax,sizeof(uint64_t),1,fp);
	    }else{
		nzmax=0;
	    }
	    if(fp->eof) return NULL;
	    out=mxCreateSparse(nx,ny,nzmax,mxCOMPLEX);
	    if(nx!=0 && ny!=0){
		long i;
		if(sizeof(mwIndex)==size){
		    zfread(mxGetJc(out), size,ny+1,fp);
		    zfread(mxGetIr(out), size,nzmax, fp);
		}else{
		    mwIndex *Jc0=mxGetJc(out);
		    mwIndex *Ir0=mxGetIr(out);
		    void *Jc=malloc(size*(ny+1));
		    void *Ir=malloc(size*nzmax);
		    zfread(Jc, size, ny+1, fp);
		    zfread(Ir, size, nzmax, fp);
		    if(size==4){
			uint32_t* Jc2=Jc;
			uint32_t* Ir2=Ir;
			for(i=0; i<ny+1; i++){
			    Jc0[i]=Jc2[i];
			}
			for(i=0; i<nzmax; i++){
			    Ir0[i]=Ir2[i];
			}
			free(Jc);
			free(Ir);
		    }else if(size==8){
			uint64_t* Jc2=Jc;
			uint64_t* Ir2=Ir;
			for(i=0; i<ny+1; i++){
			    Jc0[i]=Jc2[i];
			}
			for(i=0; i<nzmax; i++){
			    Ir0[i]=Ir2[i];
			}
			free(Jc);
			free(Ir);
		    }else{
			info("size=%lu\n", size);
			error("Invalid sparse format\n");
		    }
		}
		dcomplex *tmp=malloc(sizeof(dcomplex)*nzmax);
		zfread(tmp, sizeof(dcomplex), nzmax, fp);
		double *Pr=mxGetPr(out);
		double *Pi=mxGetPi(out);
		for(i=0; i<nzmax; i++){
		    Pr[i]=tmp[i].x;
		    Pi[i]=tmp[i].y;
		}
		free(tmp);
	    }
	}
	break;
    case M_DBL:/*double array*/
	if(start==-1){
	    if(zfseek(fp, sizeof(double)*nx*ny, SEEK_CUR)){
		error("Seek failed\n");
	    }
	    out=SKIPPED;
	}else{
	    out=mxCreateDoubleMatrix(nx,ny,mxREAL);
	    if(nx!=0 && ny!=0){
		zfread(mxGetPr(out), sizeof(double),nx*ny,fp);
	    }
	}
	break;
    case M_FLT:/*float array*/
	if(start==-1){
	    if(zfseek(fp, sizeof(float)*nx*ny, SEEK_CUR)){
		error("Seek failed\n");
	    }
	    out=SKIPPED;
	}else{
	    mwSize nxy[2]={nx,ny};
	    out=mxCreateNumericArray(2, nxy,mxSINGLE_CLASS, mxREAL);
	    if(nx!=0 && ny!=0){
		zfread((float*)mxGetPr(out), sizeof(float),nx*ny, fp);
	    }
	}break;
    case M_INT64:/*long array*/
    case M_INT32:
    case M_INT16:
    case M_INT8:
	{
	    int byte=0;
	    mxClassID id;
	    switch(magic){
	    case M_INT64: byte=8; id=mxINT64_CLASS; break;
	    case M_INT32: byte=4; id=mxINT32_CLASS; break;
	    case M_INT16: byte=2; id=mxINT16_CLASS; break;
	    case M_INT8:  byte=1; id=mxINT8_CLASS; break;
	    default: id=0;
	    }
	    if(start==-1){
		if(zfseek(fp, byte*nx*ny, SEEK_CUR)){
		    error("Seek failed\n");
		}
		out=SKIPPED;
	    }else{
		out=mxCreateNumericMatrix(nx,ny,id,mxREAL);
		if(nx!=0 && ny!=0){
		    /*Don't use sizeof(mxINT64_CLASS), it is just an integer, 
		      not a valid C type.*/
		    zfread(mxGetPr(out), byte,nx*ny,fp);
		}
	    }
	}
	break;
    case M_CMP:/*double complex array*/
	if(start==-1){
	    if(zfseek(fp, 16*nx*ny, SEEK_CUR)){
		error("Seek failed\n");
	    }
	    out=SKIPPED;
	}else{
	    out=mxCreateDoubleMatrix(nx,ny,mxCOMPLEX);
	    if(nx!=0 && ny!=0){
		dcomplex*tmp=malloc(sizeof(dcomplex)*nx*ny);
		zfread(tmp,sizeof(dcomplex),nx*ny,fp);
		double *Pr=mxGetPr(out);
		double *Pi=mxGetPi(out);
		long i;
		for(i=0; i<nx*ny; i++){
		    Pr[i]=tmp[i].x;
		    Pi[i]=tmp[i].y;
		}
		free(tmp);
	    }
	}
	break;
    case M_ZMP:/*float complex array. convert to double*/
	if(start==-1){
	    if(zfseek(fp, 8*nx*ny, SEEK_CUR)){
		error("Seek failed\n");
	    }
	    out=SKIPPED;
	}else{
	    mwSize nxy[2]={nx, ny};
	    out=mxCreateNumericArray(2, nxy,mxSINGLE_CLASS, mxCOMPLEX);
	    if(nx!=0 && ny!=0){
		fcomplex*tmp=malloc(sizeof(fcomplex)*nx*ny);
		zfread(tmp,sizeof(fcomplex),nx*ny,fp);
		float *Pr=(float*)mxGetPr(out);
		float *Pi=(float*)mxGetPi(out);
		long i;
		for(i=0; i<nx*ny; i++){
		    Pr[i]=tmp[i].x;
		    Pi[i]=tmp[i].y;
		}
		free(tmp);
	    }
	}
	break;
    case M_HEADER:
	break;
    default:
	fprintf(stderr,"magic=%x\n",magic);
	warning("Unrecognized file. Please recompile the mex routines in the newest code\n");
	out=NULL;
    }
    start=start_save;
    if(!iscell && fp->isfits==1){/*fits file may contain extra extensions.*/
	fp->isfits++;
	int icell=0;
	mxArray **outarr=NULL;
	mxArray **headerarr=NULL;
	while(out){
	    icell++;
	    outarr=realloc(outarr, sizeof(mxArray*)*icell);
	    headerarr=realloc(headerarr, sizeof(mxArray*)*icell);
	    if(out==SKIPPED) out=NULL;
	    outarr[icell-1]=out;
	    if(header) headerarr[icell-1]=*header;
	    int start2=0;
	    if(howmany!=0){//selective reading.
		if(icell<start || icell+1>start+howmany){
		    start2=-1;//don't read next data.
		}
	    }
	    out=readdata(fp, header, start2, 0);
	}
	if(icell>1){/*set output.*/
	    out=mxCreateCellMatrix(icell, 1);
	    if(header) *header=mxCreateCellMatrix(icell, 1);
	    int i;
	    for(i=0; i<icell; i++){
		mxSetCell(out, i, outarr[i]);
		if(header) mxSetCell(*header, i, headerarr[i]);
	    }
	    free(outarr);
	    free(headerarr);
	}else{
	    out=outarr[0];
	    if(header) *header=headerarr[0];
	}
    }
    if(!out){
	out=mxCreateDoubleMatrix(0,0,mxREAL);
    }
    return out;
}
示例#6
0
文件: bin.c 项目: bitursa/maos
/*
  Read fits header.
*/
static int
read_fits_header(header_t *header, file_t *fp) {
    //, char **str, uint32_t *magic, uint64_t *nx, uint64_t *ny){
    char line[82];//extra space for \n \0
    int end=0;
    int page=0;
    int bitpix=0;
    int naxis=0;
    while(!end) {
        int start=0;
        if(page==0) {
            if(zfread_try(line, 1, 80, fp)) return -1;
            line[80]='\0';
            if(strncmp(line, "SIMPLE", 6) && strncmp(line, "XTENSION= 'IMAGE", 16)) {
                warning("Garbage in fits file %s\n", fp->fn);
                return -1;
            }
            zfread(line, 1, 80, fp);
            line[80]='\0';
            if(sscanf(line+10, "%20d", &bitpix)!=1) error("Unable to determine bitpix\n");
            zfread(line, 1, 80, fp);
            line[80]='\0';
            if(sscanf(line+10, "%20d", &naxis)!=1) error("Unable to determine naxis\n");
            if(naxis>2) error("Data type not supported\n");
            if(naxis>0) {
                zfread(line, 1, 80, fp);
                line[80]='\0';
                if(sscanf(line+10, "%20lu", (unsigned long *)&header->nx)!=1) error("Unable to determine nx\n");
            } else {
                header->nx=0;
            }
            if(naxis>1) {
                zfread(line, 1, 80, fp);
                line[80]='\0';
                if(sscanf(line+10, "%20lu", (unsigned long *)&header->ny)!=1) error("Unable to determine ny\n");
            } else {
                header->ny=0;
            }
            start=3+naxis;
        }
        for(int i=start; i<36; i++) {
            zfread(line, 1, 80, fp);
            line[80]='\0';
            if(!strncmp(line, "END",3)) {
                end=1;
            } else {
                char *hh=line;
                int length=80;
                int newline=1;
                if(!strncmp(line, "COMMENT", 7)) {
                    hh=line+10;
                    length-=10;
                    newline=0;
                }
                //Remove trailing space.
                for(int j=length-1; j>=0; j--) {
                    if(isspace((int)hh[j])) {
                        hh[j]='\0';
                        length--;
                    } else {
                        if(newline) {
                            hh[j+1]='\n';
                            hh[j+2]='\0';
                        }
                        break;
                    }
                }
                if(length>0) {
                    if(header->str) {
                        header->str=realloc(header->str, strlen(header->str)+length+1+newline);
                    } else {
                        header->str=malloc(length+1+newline);
                        (header->str)[0]='\0';
                    }
                    strcat(header->str, hh);
                }
            }
        }
        page++;
    }
    switch(bitpix) {
    case -32:
        header->magic=M_FLT;
        break;
    case -64:
        header->magic=M_DBL;
        break;
    case 32:
        header->magic=M_INT32;
        break;
    case 16:
        header->magic=M_INT16;
        break;
    case 8:
        header->magic=M_INT8;
        break;
    default:
        error("Invalid\n");
    }
    return 0;
}