📄 gbx_stream_arch.c
字号:
/*************************************************************************** stream_arch.c The archive stream management routines (c) 2000-2004 Beno顃 Minisini <gambas@users.sourceforge.net> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.***************************************************************************/#define __STREAM_IMPL_C#include "gb_common.h"#include "gb_error.h"#include "gbx_value.h"#include "gb_limit.h"#include <fcntl.h>#include <unistd.h>#include <sys/mman.h>#include <sys/stat.h>#include <sys/types.h>#include <errno.h>#include "gbx_archive.h"#include "gbx_stream.h"static int stream_open(STREAM *stream, const char *path, int mode){ ARCH_FIND find; if (ARCH_get(path, 0, &find)) { errno = ENOENT; return TRUE; } if ((mode & ST_ACCESS) != ST_READ) { errno = EACCES; return TRUE; } stream->arch.arch = find.arch; stream->arch.size = find.len; stream->arch.start = find.pos; stream->arch.pos = 0; return FALSE;}static int stream_close(STREAM *stream){ return FALSE;}static int stream_read(STREAM *stream, char *buffer, long len){ boolean strip = FALSE; long max; max = stream->arch.size - stream->arch.pos; if (len > max) { strip = TRUE; len = max; } if (ARCH_read(stream->arch.arch, stream->arch.start + stream->arch.pos, buffer, len)) strip = TRUE; stream->arch.pos += len; STREAM_eff_read = len; return strip;}static int stream_write(STREAM *stream, char *buffer, long len){ return TRUE;}static int stream_seek(STREAM *stream, long pos, int whence){ long new_pos; switch(whence) { case SEEK_SET: new_pos = pos; break; case SEEK_CUR: new_pos = stream->arch.pos + pos; break; case SEEK_END: new_pos = stream->arch.size - pos; break; default: return TRUE; } if (new_pos < 0 || new_pos > stream->memory.size) return TRUE; stream->arch.pos = new_pos; return FALSE;}static int stream_tell(STREAM *stream, long *pos){ *pos = stream->arch.pos; return FALSE;}static int stream_flush(STREAM *stream){ return FALSE;}static int stream_eof(STREAM *stream){ return (stream->arch.pos >= stream->arch.size);}static int stream_lof(STREAM *stream, long *len){ *len = stream->arch.size; return FALSE;}static int stream_handle(STREAM *stream){ return -1;}DECLARE_STREAM(STREAM_arch);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -