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

📄 jas_stream.c

📁 DIGITAL IMAGERY is pervasive in our world today. Consequently, standards for the efficient represen
💻 C
📖 第 1 页 / 共 3 页
字号:
	int c;	/* The stream must not be in an error or EOF state. */	if ((stream->flags_ & (JAS_STREAM_ERRMASK)) != 0) {		return EOF;	}	/* The stream must be open for reading. */	if ((stream->openmode_ & JAS_STREAM_READ) == 0) {		return EOF;	}	/* Make a half-hearted attempt to confirm that the buffer is not	currently being used for writing.  This check is not intended	to be foolproof! */	assert((stream->bufmode_ & JAS_STREAM_WRBUF) == 0);	assert(stream->ptr_ - stream->bufstart_ <= stream->bufsize_);	/* Mark the buffer as being used for reading. */	stream->bufmode_ |= JAS_STREAM_RDBUF;	/* Read new data into the buffer. */	stream->ptr_ = stream->bufstart_;	if ((stream->cnt_ = (*stream->ops_->read_)(stream->obj_,	  (char *) stream->bufstart_, stream->bufsize_)) <= 0) {		if (stream->cnt_ < 0) {			stream->flags_ |= JAS_STREAM_ERR;		} else {			stream->flags_ |= JAS_STREAM_EOF;		}		stream->cnt_ = 0;		return EOF;	}	assert(stream->cnt_ > 0);	/* Get or peek at the first character in the buffer. */	c = (getflag) ? jas_stream_getc2(stream) : (*stream->ptr_);	return c;}int jas_stream_flushbuf(jas_stream_t *stream, int c){	int len;	int n;	/* The stream should not be in an error or EOF state. */	if ((stream->flags_ & (JAS_STREAM_ERRMASK)) != 0) {		return EOF;	}	/* The stream must be open for writing. */	if ((stream->openmode_ & (JAS_STREAM_WRITE | JAS_STREAM_APPEND)) == 0) {		return EOF;	}	/* The buffer should not currently be in use for reading. */	assert(!(stream->bufmode_ & JAS_STREAM_RDBUF));	/* Note: Do not use the quantity stream->cnt to determine the number	of characters in the buffer!  Depending on how this function was	called, the stream->cnt value may be "off-by-one". */	len = stream->ptr_ - stream->bufstart_;	if (len > 0) {		n = (*stream->ops_->write_)(stream->obj_, (char *)		  stream->bufstart_, len);		if (n != len) {			stream->flags_ |= JAS_STREAM_ERR;			return EOF;		}	}	stream->cnt_ = stream->bufsize_;	stream->ptr_ = stream->bufstart_;	stream->bufmode_ |= JAS_STREAM_WRBUF;	if (c != EOF) {		assert(stream->cnt_ > 0);		return jas_stream_putc2(stream, c);	}	return 0;}/******************************************************************************\* Miscellaneous code.\******************************************************************************/static int jas_strtoopenmode(const char *s){	int openmode = 0;	while (*s != '\0') {		switch (*s) {		case 'r':			openmode |= JAS_STREAM_READ;			break;		case 'w':			openmode |= JAS_STREAM_WRITE | JAS_STREAM_CREATE;			break;		case 'b':			openmode |= JAS_STREAM_BINARY;			break;		case 'a':			openmode |= JAS_STREAM_APPEND;			break;		case '+':			openmode |= JAS_STREAM_READ | JAS_STREAM_WRITE;			break;		default:			break;		}		++s;	}	return openmode;}int jas_stream_copy(jas_stream_t *out, jas_stream_t *in, int n){	int all;	int c;	int m;	all = (n < 0) ? 1 : 0;	m = n;	while (all || m > 0) {		if ((c = jas_stream_getc_macro(in)) == EOF) {			/* The next character of input could not be read. */			/* Return with an error if an I/O error occured			  (not including EOF) or if an explicit copy count			  was specified. */			return (!all || jas_stream_error(in)) ? (-1) : 0;		}		if (jas_stream_putc_macro(out, c) == EOF) {			return -1;		}		--m;	}	return 0;}long jas_stream_setrwcount(jas_stream_t *stream, long rwcnt){	int old;	old = stream->rwcnt_;	stream->rwcnt_ = rwcnt;	return old;}int jas_stream_display(jas_stream_t *stream, FILE *fp, int n){	unsigned char buf[16];	int i;	int j;	int m;	int c;	int display;	int cnt;	cnt = n - (n % 16);	display = 1;	for (i = 0; i < n; i += 16) {		if (n > 16 && i > 0) {			display = (i >= cnt) ? 1 : 0;		}		if (display) {			fprintf(fp, "%08x:", i);		}		m = JAS_MIN(n - i, 16);		for (j = 0; j < m; ++j) {			if ((c = jas_stream_getc(stream)) == EOF) {				abort();				return -1;			}			buf[j] = c;		}		if (display) {			for (j = 0; j < m; ++j) {				fprintf(fp, " %02x", buf[j]);			}			fputc(' ', fp);			for (; j < 16; ++j) {				fprintf(fp, "   ");			}			for (j = 0; j < m; ++j) {				if (isprint(buf[j])) {					fputc(buf[j], fp);				} else {					fputc(' ', fp);				}			}			fprintf(fp, "\n");		}	}	return 0;}long jas_stream_length(jas_stream_t *stream){	long oldpos;	long pos;	if ((oldpos = jas_stream_tell(stream)) < 0) {		return -1;	}	if (jas_stream_seek(stream, 0, SEEK_END) < 0) {		return -1;	}	if ((pos = jas_stream_tell(stream)) < 0) {		return -1;	}	if (jas_stream_seek(stream, oldpos, SEEK_SET) < 0) {		return -1;	}	return pos;}/******************************************************************************\* Memory stream object.\******************************************************************************/static int mem_read(jas_stream_obj_t *obj, char *buf, int cnt){	int n;	jas_stream_memobj_t *m = (jas_stream_memobj_t *)obj;	n = m->len_ - m->pos_;	cnt = JAS_MIN(n, cnt);	memcpy(buf, &m->buf_[m->pos_], cnt);	m->pos_ += cnt;	return cnt;}static int mem_resize(jas_stream_memobj_t *m, int bufsize){	unsigned char *buf;	assert(m->buf_);	if (!(buf = jas_realloc(m->buf_, bufsize * sizeof(unsigned char)))) {		return -1;	}	m->buf_ = buf;	m->bufsize_ = bufsize;	return 0;}static int mem_write(jas_stream_obj_t *obj, char *buf, int cnt){	int n;	int ret;	jas_stream_memobj_t *m = (jas_stream_memobj_t *)obj;	long newbufsize;	long newpos;	newpos = m->pos_ + cnt;	if (newpos > m->bufsize_ && m->growable_) {		newbufsize = m->bufsize_;		while (newbufsize < newpos) {			newbufsize <<= 1;			assert(newbufsize >= 0);		}		if (mem_resize(m, newbufsize)) {			return -1;		}	}	if (m->pos_ > m->len_) {		/* The current position is beyond the end of the file, so		  pad the file to the current position with zeros. */		n = JAS_MIN(m->pos_, m->bufsize_) - m->len_;		if (n > 0) {			memset(&m->buf_[m->len_], 0, n);			m->len_ += n;		}		if (m->pos_ != m->len_) {			/* The buffer is not big enough. */			return 0;		}	}	n = m->bufsize_ - m->pos_;	ret = JAS_MIN(n, cnt);	if (ret > 0) {		memcpy(&m->buf_[m->pos_], buf, ret);		m->pos_ += ret;	}	if (m->pos_ > m->len_) {		m->len_ = m->pos_;	}assert(ret == cnt);	return ret;}static long mem_seek(jas_stream_obj_t *obj, long offset, int origin){	jas_stream_memobj_t *m = (jas_stream_memobj_t *)obj;	long newpos;	switch (origin) {	case SEEK_SET:		newpos = offset;		break;	case SEEK_END:		newpos = m->len_ - offset;		break;	case SEEK_CUR:		newpos = m->pos_ + offset;		break;	default:		abort();		break;	}	if (newpos < 0) {		return -1;	}	m->pos_ = newpos;	return m->pos_;}static int mem_close(jas_stream_obj_t *obj){	jas_stream_memobj_t *m = (jas_stream_memobj_t *)obj;	if (m->myalloc_ && m->buf_) {		jas_free(m->buf_);		m->buf_ = 0;	}	jas_free(obj);	return 0;}/******************************************************************************\* File stream object.\******************************************************************************/static int file_read(jas_stream_obj_t *obj, char *buf, int cnt){	jas_stream_fileobj_t *fileobj = JAS_CAST(jas_stream_fileobj_t *, obj);	return read(fileobj->fd, buf, cnt);}static int file_write(jas_stream_obj_t *obj, char *buf, int cnt){	jas_stream_fileobj_t *fileobj = JAS_CAST(jas_stream_fileobj_t *, obj);	return write(fileobj->fd, buf, cnt);}static long file_seek(jas_stream_obj_t *obj, long offset, int origin){	jas_stream_fileobj_t *fileobj = JAS_CAST(jas_stream_fileobj_t *, obj);	return lseek(fileobj->fd, offset, origin);}static int file_close(jas_stream_obj_t *obj){	jas_stream_fileobj_t *fileobj = JAS_CAST(jas_stream_fileobj_t *, obj);	int ret;	ret = close(fileobj->fd);	if (fileobj->flags & JAS_STREAM_FILEOBJ_DELONCLOSE) {		unlink(fileobj->pathname);	}	jas_free(fileobj);	return ret;}/******************************************************************************\* Stdio file stream object.\******************************************************************************/static int sfile_read(jas_stream_obj_t *obj, char *buf, int cnt){	FILE *fp;	fp = JAS_CAST(FILE *, obj);	return fread(buf, 1, cnt, fp);}static int sfile_write(jas_stream_obj_t *obj, char *buf, int cnt){	FILE *fp;	fp = JAS_CAST(FILE *, obj);	return fwrite(buf, 1, cnt, fp);}static long sfile_seek(jas_stream_obj_t *obj, long offset, int origin){	FILE *fp;	fp = JAS_CAST(FILE *, obj);	return fseek(fp, offset, origin);}static int sfile_close(jas_stream_obj_t *obj){	FILE *fp;	fp = JAS_CAST(FILE *, obj);	return fclose(fp);}

⌨️ 快捷键说明

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