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

📄 stream.mx

📁 这个是内存数据库中的一个管理工具
💻 MX
📖 第 1 页 / 共 5 页
字号:
voidclose_stream(stream *s){	s->close(s);	s->destroy(s);}stream *stream_rstream(stream *s){#ifdef STREAM_DEBUG	printf("stream_rstream %s\n", s->name ? s->name : "<unnamed>");#endif	assert(s->access == ST_READ);	s->type = ST_BIN;	if (s->errnr == NO__ERROR)		s->read(s, (void *) &s->byteorder, sizeof(s->byteorder), 1);	return s;}stream *stream_wstream(stream *s){#ifdef STREAM_DEBUG	printf("stream_wstream %s\n", s->name ? s->name : "<unnamed>");#endif	assert(s->access == ST_WRITE);	s->type = ST_BIN;	if (s->errnr == NO__ERROR)		s->write(s, (void *) &s->byteorder, sizeof(s->byteorder), 1);	return s;}#define EXT_LEN 4static const char *get_extention(const char *file){	char *ext_start;	return (ext_start = strrchr(file, '.')) != NULL ? ext_start + 1 : "";}static voiddestroy(stream *s){	free(s->name);	free(s);}static char *error(stream *s){	char buf[BUFSIZ];	switch (s->errnr) {	case OPEN_ERROR:		snprintf(buf, BUFSIZ, "error could not open file %s\n", s->name);		return strdup(buf);	case READ_ERROR:		snprintf(buf, BUFSIZ, "error reading file %s\n", s->name);		return strdup(buf);	case WRITE_ERROR:		snprintf(buf, BUFSIZ, "error writing file %s\n", s->name);		return strdup(buf);	}	return strdup("Unknown error");}static stream *create_stream(const char *name){	stream *s;	if ((s = (stream *) malloc(sizeof(*s))) == NULL)		return NULL;	s->byteorder = 1234;	s->access = ST_READ;	s->type = ST_ASCII;	s->name = strdup(name);	s->stream_data.p = NULL;	s->errnr = NO__ERROR;	s->stream_data.p = NULL;	s->read = NULL;	s->readline = NULL;	s->write = NULL;	s->close = NULL;	s->error = error;	s->destroy = destroy;	s->flush = NULL;	s->fsync = NULL;#ifdef STREAM_DEBUG	printf("create_stream %s -> " PTRFMT "\n", name ? name : "<unnamed>", PTRFMTCAST s);#endif	return s;}static ssize_tfile_read(stream *s, void *buf, size_t elmsize, size_t cnt){	FILE *fp = (FILE *) s->stream_data.p;	size_t rc = 0;	if (!feof(fp)) {		rc = fread(buf, elmsize, cnt, fp);		if (ferror(fp))			s->errnr = READ_ERROR;	}	return rc;}static ssize_tfile_write(stream *s, const void *buf, size_t elmsize, size_t cnt){	if (elmsize && cnt) {		size_t rc = fwrite(buf, elmsize, cnt, (FILE *) s->stream_data.p);		if (rc < cnt)			s->errnr = WRITE_ERROR;		return (ssize_t) rc;	}	return cnt;}static voidfile_close(stream *s){	FILE *fp = (FILE *) s->stream_data.p;	if (!fp)		return;	if (fp != stdin && fp != stdout && fp != stderr)		fclose(fp);	else if (s->access == ST_WRITE)		fflush(fp);	s->stream_data.p = NULL;}static intfile_flush(stream *s){	FILE *fp = (FILE*)s->stream_data.p;	if (s->access == ST_WRITE && fflush(fp) < 0){		s->errnr = WRITE_ERROR;		return 1;	}	return 0;}static intfile_fsync(stream *s){	FILE *fp = (FILE*)s->stream_data.p;	if (s->access == ST_WRITE &&#ifdef NATIVE_WIN32	    _commit(_fileno(fp)) < 0#else	    fsync(fileno(fp)) < 0#endif		){		s->errnr = WRITE_ERROR;		return 1;	}	return 0;}static stream *open_stream(const char *filename, const char *flags){	stream *s;	FILE *fp;	if ((s = create_stream(filename)) == NULL)		return NULL;	if ((fp = fopen(filename, flags)) == NULL)		s->errnr = OPEN_ERROR;	s->read = file_read;	s->readline = NULL;	s->write = file_write;	s->close = file_close;	s->flush = file_flush;	s->fsync = file_fsync;	s->stream_data.p = (void *) fp;	return s;}#ifdef HAVE_LIBZstatic ssize_tstream_gzread(stream *s, void *buf, size_t elmsize, size_t cnt){	gzFile *fp = (gzFile *) s->stream_data.p;	int size = (int) (elmsize * cnt);	if (!gzeof(fp)) {		size = gzread(fp, buf, size);		if (size)			return size / elmsize;	}	return 0;}static ssize_tstream_gzwrite(stream *s, const void *buf, size_t elmsize, size_t cnt){	int size = (int) (elmsize * cnt);	if (size) {		size = gzwrite((gzFile *) s->stream_data.p, (void *) buf, size);		return size / elmsize;	}	return cnt;}static voidstream_gzclose(stream *s){	if (s->stream_data.p)		gzclose((gzFile *) s->stream_data.p);	s->stream_data.p = NULL;}static intstream_gzflush(stream *s){	if (s->access == ST_WRITE)		gzflush((gzFile *) s->stream_data.p, Z_SYNC_FLUSH);	return 0;}static stream *open_gzstream(const char *filename, const char *flags){	stream *s;	gzFile *fp;	if ((s = create_stream(filename)) == NULL)		return NULL;	if ((fp = gzopen(filename, flags)) == NULL)		s->errnr = OPEN_ERROR;	s->read = stream_gzread;	s->write = stream_gzwrite;	s->close = stream_gzclose;	s->flush = stream_gzflush;	s->stream_data.p = (void *) fp;	return s;}stream *open_gzrstream(const char *filename){	stream *s;	if ((s = open_gzstream(filename, "rb")) == NULL)		return NULL;	s->type = ST_BIN;	if (s->errnr == NO__ERROR)		gzread((gzFile *) s->stream_data.p, (void *) &s->byteorder, sizeof(s->byteorder));	return s;}static stream *open_gzwstream_(const char *filename, const char *mode){	stream *s;	if ((s = open_gzstream(filename, mode)) == NULL)		return NULL;	s->access = ST_WRITE;	s->type = ST_BIN;	if (s->errnr == NO__ERROR)		gzwrite((gzFile *) s->stream_data.p, (void *) &s->byteorder, sizeof(s->byteorder));	return s;}stream *open_gzwstream(const char *filename){	return open_gzwstream_(filename, "wb");}stream *open_gzrastream(const char *filename){	stream *s;	if ((s = open_gzstream(filename, "rb")) == NULL)		return NULL;	s->type = ST_ASCII;	return s;}static stream *open_gzwastream_(const char *filename, const char *mode){	stream *s;	if ((s = open_gzstream(filename, mode)) == NULL)		return NULL;	s->access = ST_WRITE;	s->type = ST_ASCII;	return s;}stream *open_gzwastream(const char *filename){	return open_gzwastream_(filename, "wb");}#endif#ifdef HAVE_LIBBZ2static ssize_tstream_bzread(stream *s, void *buf, size_t elmsize, size_t cnt){	int size = (int) (elmsize * cnt);	size = BZ2_bzread((BZFILE *) s->stream_data.p, buf, size);	if (size)		return size / elmsize;	return 0;}static ssize_tstream_bzwrite(stream *s, const void *buf, size_t elmsize, size_t cnt){	int size = (int) (elmsize * cnt);	if (size) {		size = BZ2_bzwrite((BZFILE *) s->stream_data.p, (void *) buf, size);		return size / elmsize;	}	return cnt;}static voidstream_bzclose(stream *s){	if (s->stream_data.p)		BZ2_bzclose((BZFILE *) s->stream_data.p);	s->stream_data.p = NULL;}static intstream_bzflush(stream *s){	if (s->access == ST_WRITE)		BZ2_bzflush((BZFILE *) s->stream_data.p);	return 0;}static stream *open_bzstream(const char *filename, const char *flags){	stream *s;	BZFILE *fp;	if ((s = create_stream(filename)) == NULL)		return NULL;	if ((fp = BZ2_bzopen(filename, flags)) == NULL)		s->errnr = OPEN_ERROR;	s->read = stream_bzread;	s->write = stream_bzwrite;	s->close = stream_bzclose;	s->flush = stream_bzflush;	s->stream_data.p = (void *) fp;	return s;}stream *open_bzrstream(const char *filename){	stream *s;	if ((s = open_bzstream(filename, "rb")) == NULL)		return NULL;	s->type = ST_BIN;	if (s->errnr == NO__ERROR)		BZ2_bzread((BZFILE *) s->stream_data.p, (void *) &s->byteorder, sizeof(s->byteorder));	return s;}static stream *open_bzwstream_(const char *filename, const char *mode){	stream *s;	if ((s = open_bzstream(filename, mode)) == NULL)		return NULL;	s->access = ST_WRITE;	s->type = ST_BIN;	if (s->errnr == NO__ERROR)		BZ2_bzwrite((BZFILE *) s->stream_data.p, (void *) &s->byteorder, sizeof(s->byteorder));	return s;}stream *open_bzwstream(const char *filename){	return open_bzwstream_(filename, "wb");}stream *open_bzrastream(const char *filename){	stream *s;	if ((s = open_bzstream(filename, "rb")) == NULL)		return NULL;	s->type = ST_ASCII;	return s;}static stream *open_bzwastream_(const char *filename, const char *mode){	stream *s;	if ((s = open_bzstream(filename, mode)) == NULL)		return NULL;	s->access = ST_WRITE;	s->type = ST_ASCII;	return s;}stream *open_bzwastream(const char *filename){	return open_bzwastream_(filename, "wb");}#endifstream *open_rstream(const char *filename){	stream *s;	const char *ext;#ifdef STREAM_DEBUG	printf("open_rstream %s\n", filename);#endif	ext = get_extention(filename);	if (strcmp(ext, "gz") == 0) {#ifdef HAVE_LIBZ		return open_gzrstream(filename);#else		if ((s = create_stream(filename)) != NULL)			s->errnr = OPEN_ERROR;		return s;#endif	}	if (strcmp(ext, "bz2") == 0) {#ifdef HAVE_LIBBZ2		return open_bzrstream(filename);#else		if ((s = create_stream(filename)) != NULL)			s->errnr = OPEN_ERROR;		return s;#endif	}	if ((s = open_stream(filename, "rb")) == NULL)		return NULL;	s->type = ST_BIN;	if (s->errnr == NO__ERROR) {		fread((void *) &s->byteorder, sizeof(s->byteorder), 1, (FILE *) s->stream_data.p);		if (ferror((FILE *) s->stream_data.p))			s->errnr = OPEN_ERROR;	}	return s;}static stream *open_wstream_(const char *filename, char *mode){	stream *s;	const char *ext;#ifdef STREAM_DEBUG	printf("open_wstream %s\n", filename);#endif	ext = get_extention(filename);	if (strcmp(ext, "gz") == 0) {#ifdef HAVE_LIBZ		return open_gzwstream_(filename, mode);#else		if ((s = create_stream(filename)) != NULL)			s->errnr = OPEN_ERROR;		return s;#endif	}	if (strcmp(ext, "bz2") == 0) {#ifdef HAVE_LIBBZ2		return open_bzwstream_(filename, mode);#else		if ((s = create_stream(filename)) != NULL)			s->errnr = OPEN_ERROR;		return s;#endif	}	if ((s = open_stream(filename, mode)) == NULL)		return NULL;	s->access = ST_WRITE;	s->type = ST_BIN;	if (s->errnr == NO__ERROR)		fwrite((void *) &s->byteorder, sizeof(s->byteorder), 1, (FILE *) s->stream_data.p);	return s;}stream *open_wstream(const char *filename){	return open_wstream_(filename, "wb");}stream *append_wstream(const char *filename){	return open_wstream_(filename, "ab");}stream *open_rastream(const char *filename){	stream *s;	const char *ext;#ifdef STREAM_DEBUG	printf("open_rastream %s\n", filename);#endif	ext = get_extention(filename);	if (strcmp(ext, "gz") == 0) {#ifdef HAVE_LIBZ		return open_gzrastream(filename);#else		if ((s = create_stream(filename)) != NULL)			s->errnr = OPEN_ERROR;		return s;#endif	}	if (strcmp(ext, "bz2") == 0) {#ifdef HAVE_LIBBZ2		return open_bzrastream(filename);#else		if ((s = create_stream(filename)) != NULL)			s->errnr = OPEN_ERROR;		return s;#endif	}	if ((s = open_stream(filename, "r")) == NULL)		return NULL;	s->type = ST_ASCII;	return s;}static stream *open_wastream_(const char *filename, char *mode){	stream *s;	const char *ext;#ifdef STREAM_DEBUG	printf("open_wastream %s\n", filename);#endif	ext = get_extention(filename);

⌨️ 快捷键说明

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