fobops.c

来自「speech signal process tools」· C语言 代码 · 共 460 行

C
460
字号
/* LINTLIBRARY */#ifndef lint    static char rcsid[] = "$Header: /home/beldar/stan/sphere/RCS/fobops.c,v 1.2 1993/03/25 00:20:51 stan Exp stan $";#endif#include <stdio.h>#include <stdlib.h>#include <util/chars.h>#include <util/fob.h>#include <util/min.h>#include <util/mtrf.h>FOB * fob_create( fp )	FILE * fp;{	FOB * fobp;	fobp = (FOB *) mtrf_malloc( sizeof(FOB) );	if ( fobp == FOBPNULL )		return FOBPNULL;	fobp->fp = fp;	fobp->length = 0;		fobp->read_byte_swap = 0;	fobp->write_byte_swap = 0;	fobp->buf_swap = CNULL;	fobp->buf = CNULL;	return fobp;}int fob_destroy( fobp )	FOB * fobp;{	mtrf_free( (char *) fobp );	if (fobp->buf != CNULL)	    mtrf_free (fobp->buf);	if (fobp->buf_swap != CNULL)	    mtrf_free (fobp->buf_swap);	return 0;}int fob_fflush( fobp )FOB * fobp;{    if (fobp == FOBPNULL)	return -1;    if (fob_is_fp(fobp))	fflush(fobp->fp);}int fob_create2( fpin, fpout, fobpin, fobpout )	FILE * fpin;	FILE * fpout;	FOB ** fobpin;	FOB ** fobpout;{	FOB * new1;	FOB * new2;	new1 = fob_create( fpin );	if ( new1 == FOBPNULL )		return -1;	new2 = fob_create( fpout );	if ( new2 == FOBPNULL ) {		(void) fob_destroy( new1 );		return -1;	}	*fobpin = new1;	*fobpout = new2;	return 0;}int fob_destroy2( fobpin, fobpout )	FOB * fobpin;	FOB * fobpout;{	int n1;	int n2;	n1 = fob_destroy( fobpin );	n2 = fob_destroy( fobpout );	return ( n1 < 0 || n2 < 0 ) ? -1 : 0;}fob_read_byte_swap(f)FOB *f;{    f->read_byte_swap = 1;}fob_write_byte_swap(f)FOB *f;{    f->write_byte_swap = 1;}fob_bufinit( f, buf, len )	FOB * f;	char * buf;	int len;{	if ( len > 0 ) {		f->buf = buf;		f->pos = buf;		f->bufsize = len;	}}void fob_rewind( f )FOB * f;{    if (f->fp != FPNULL){	rewind(f->fp);	f->length = 0;    } else	f->pos = f->buf;}int fob_ftell( f )FOB * f;{    if (f->fp != FPNULL)	return(ftell(f->fp));    else	return(f->pos - f->buf);}int fob_is_fp( f )FOB * f;{    if (f->fp != FPNULL)	return(TRUE);    return(FALSE);}int fob_flush_to_fp( f , fp)FOB * f;FILE *fp;{    if (f == FOBPNULL)	return -1;    if (fp == FPNULL)	return -1;    printf("FOB: flushing %d chars\n",f->length);    if (fwrite(f->buf,1,f->length,fp) != f->length)		return -1;    return 0;}/* * Sets *len to length of output buffer * Sets *buf to output buffer if length is positive * Trims buffer to proper length using realloc(), since space *	is always allocated in large chunks */fob_bufcleanup( f, buf, len )	FOB * f;	char ** buf;	int * len;{	if ( f->buf == CNULL )		*len = 0;	else {		*len = f->pos - f->buf;		if ( *len > 0 ) {			*buf = realloc( f->buf, *len );			if ( *buf == CNULL )				return -1;			f->buf = CNULL;		}	}}int fob_bufput( fobp, p, len )	FOB * fobp;	char * p;	int len;{	int nb;	int space;	if ( fobp == FOBPNULL )		return -1;	if ( p == CNULL )		return -1;	if ( len <= 0 )		return -1;	if ( fobp->buf == CNULL ) {		/* need at least one block *//*		fobp->buf = mtrf_malloc( FOB_BUF_GRAN );		fobp->bufsize = FOB_BUF_GRAN;*/		if ((fobp->buf = mtrf_malloc( 300000 )) == CNULL)		    return(-1);		fobp->bufsize = 300000;		fobp->pos = fobp->buf;	}	nb = fobp->pos - fobp->buf;		/* #bytes stored */	space = fobp->bufsize - nb;		/* #bytes left */	if ( len > space ) {			/* if not enough space ... */		char * newbuf;		int newsize;		newsize = fobp->bufsize;		do {				/* calculate #bytes needed to store */			space += FOB_BUF_GRAN;			newsize += FOB_BUF_GRAN;		} while ( len > space );						/* allocate (possibly) new buffer */		newbuf = mtrf_realloc( fobp->buf, newsize );		if ( newbuf == CNULL )			return -1;		fobp->bufsize = newsize;	/* update buffer size */		if ( newbuf != fobp->buf ) {	/* if new buffer was allocated */			fobp->buf = newbuf;	/* reset buffer pointers */			fobp->pos = fobp->buf + nb;		}	}	memcpy( fobp->pos, p, len );		/* copy the data */	fobp->length += len;	fobp->pos += len;	return len;}int fob_bufget( fobp, p, len )	FOB * fobp;	char * p;	int len;{	int nbread;	int nbleft;	int nbret;	if ( fobp == FOBPNULL )		return -1;	if ( p == CNULL )		return -1;	if ( len <= 0 )		return -1;	nbread = fobp->pos - fobp->buf;		/* #bytes already read */#ifdef debug	nbleft = fobp->bufsize - nbread;	/* #bytes left to be read */	/* JGF,  I think that this is an error, the length should really be used here */#endif	nbleft = fobp->length - nbread;		/* #bytes left to be read */	nbret = MIN( len, nbleft );		/* #bytes to be returned */	if ( nbret > 0 ) {		memcpy( p, fobp->pos, nbret );	/* copy the data */		fobp->pos += nbret;	}	return nbret;}buffer_swap_bytes(mem,blen)char *mem;int blen;{    char c, *p;    for (p=mem; p<mem+blen; p+=2){        c= *p; *p = *(p+1); *(p+1) = c;    }}copy_buffer_swap_bytes(to,from,blen)char *to, *from;int blen;{    char *tp, *p;    for (p=from, tp=to; p<from+blen; p+=2, tp+=2){        *tp= *(p+1); *(tp+1) = *p;    }}int fob_fread( p, size, nitems, fobp )	char * p;	int size;	int nitems;	FOB * fobp;{	int n;	int bytes;	if ( p == CNULL )		return -1;	if ( fobp == FOBPNULL )		return -1;	if ( fobp->fp != FPNULL ) {		n = fread( p, size, nitems, fobp->fp );		if ( n > 0 )			fobp->length += n * size;	} else {		bytes = size * nitems;		n = fob_bufget( fobp, p, bytes );		if ( n > 0 )			n /= size;	}        if (fobp->read_byte_swap){/*            printf("Swapping bytes (%dx%d)  read %d\n",size,nitems,n); */                 if ((n*size > 0) && ((n*size % 2) != 0)) {/*                fprintf(stderr,"Error: tried to byte swap an odd length buffer of %d bytes\n",n); */                return -1;	    }            buffer_swap_bytes((char *)p,nitems*size);	}	return n;}int fob_fwrite( p, size, nitems, fobp )	char * p;	int size;	int nitems;	FOB * fobp;{	int n;	int bytes;	char * write_buf;	if ( p == CNULL )		return -1;	if ( fobp == FOBPNULL )		return -1;        if (fobp->write_byte_swap){	    /* alloc mem if it wasn't already done */            if (fobp->buf_swap == CNULL){		if ((fobp->buf_swap=(char *)mtrf_malloc(size*nitems)) == CNULL)		    return -1;		write_buf=fobp->buf_swap;	    } else {		write_buf=realloc(fobp->buf_swap,size*nitems);                if (write_buf == CNULL)		    return -1;		fobp->buf_swap = write_buf;		    }            if (((nitems*size) % 2) != 0) {                fprintf(stderr,"Error: tried to byte swap an odd byte length buffer\n");                return -1;	    }            copy_buffer_swap_bytes(write_buf,(char *)p,nitems*size);	} else	    write_buf = p;	if ( fobp->fp != FPNULL ) {		n = fwrite( write_buf, size, nitems, fobp->fp );		if ( n > 0 )			fobp->length += n * size;	} else {		bytes = size * nitems;		n = fob_bufput( fobp, write_buf, bytes );		if ( n > 0 )			n /= size;	}	return n;}int fob_putc( c , fobp)     char c;     FOB *fobp;{      return (fob_fwrite(&c,1,1,fobp) == (-1) ? EOF : 1);}int fob_getc( fobp)     FOB *fobp;{      unsigned char c;     if ( fob_fread(&c,1,1,fobp) == EOF)         return(EOF);     return ( (int)c );}int fob_getw( fobp)     FOB *fobp;{      int c;     if ( fob_fread(&c,sizeof(int),1,fobp) == EOF)         return(EOF);     return ( c );}int fob_ferror( fobp )	FOB * fobp;{	int n;	if ( fobp == FOBPNULL )		return -1;		if ( fobp->fp != FPNULL )		n = ferror( fobp->fp );	else		n = 0;	return n;}int fob_feof( fobp )FOB * fobp;{    int n;    if ( fobp == FOBPNULL )	return -1;	    if ( fobp->fp != FPNULL )	n = feof( fobp->fp );    else {	if (fobp->pos >= (fobp->buf + fobp->length))	    n = -1;	else	    n = 0;    }    return n;}

⌨️ 快捷键说明

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