At 19:53 16.03.2002, Wez Furlong wrote: >Damn; you're half right :-) > >Your seeker implementation should spot the offset=0 whence=SEEK_CUR >case and return the current position. >I've fixed the stdio stream implementation to do this. > >Please don't change the php_stream_ops structure, as there is no >need. > >How are your memory streams implemented? (I was about to start on >those!)
See them attached, i will commit them as soon as they work.... >--Wez. > >On 17/03/02, "Marcus Boerger" <[EMAIL PROTECTED]> wrote: > > At the moment i am working at memory-streams.... > > > > If have the following problem left: > > I must extend > > struct _php_stream_ops > > with ftell.... > > > > by the way php_stream_tell is wrong because it relies on seek and > > that does return either 0 on success or an erroecode.... > > > > regards > > marcus > > > > > > > > --------->>> mailto:[EMAIL PROTECTED] <<<------------ > > I don't want to start any blashphemous rumours > > but i think that god's got a sick sense of humor > > and when i die i expect to find him laughing. > > Depeche Mode > > --------------->>> http://www.marcus-boerger.de <<<------------------- > > > > >-- >PHP Development Mailing List <http://www.php.net/> >To unsubscribe, visit: http://www.php.net/unsub.php
/* +----------------------------------------------------------------------+ | PHP Version 4 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2002 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 2.02 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available at through the world-wide-web at | | http://www.php.net/license/2_02.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | [EMAIL PROTECTED] so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Marcus Boerger <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ #ifndef PHP_MEMORY_STREAM_H #define PHP_MEMORY_STREAM_H #include "php_streams.h" PHPAPI php_stream *php_memory_stream_create(); #endif /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: sw=4 ts=4 fdm=marker * vim<600: sw=4 ts=4 */
/* +----------------------------------------------------------------------+ | PHP Version 4 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2002 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 2.02 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available at through the world-wide-web at | | http://www.php.net/license/2_02.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | [EMAIL PROTECTED] so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: | | Marcus Boerger <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ #define _GNU_SOURCE #include "php.h" #include "php_streams.h" /* {{{ ------- MEMORY stream implementation -------*/ typedef struct { char *data; size_t fpos; size_t fsize; } php_memory_stream_data; static size_t php_memory_stream_write(php_stream *stream, const char *buf, size_t count) {/* {{{ */ php_memory_stream_data *ms; assert(stream != NULL); ms = stream->abstract; assert(ms != NULL); if ( ms->fpos + count > ms->fsize) { char *tmp = erealloc( ms->data, ms->fpos + count); if ( !tmp) { count = ms->fsize - ms->fpos + 1; } else { ms->data = tmp; } } if ( count) { assert(buf!= NULL); memcpy( (char*)buf, ms->data+ms->fpos, count); ms->fpos += count; } return count; } /* }}} */ static size_t php_memory_stream_read(php_stream *stream, char *buf, size_t count) {/* {{{ */ php_memory_stream_data *ms; assert(stream != NULL); ms = stream->abstract; assert(ms != NULL); if (buf == NULL && count == 0) { /* check for EOF condition */ if (ms->fpos >= ms->fsize) { return EOF; } return 0; } if ( ms->fpos + count > ms->fsize) { count = ms->fsize - ms->fpos + 1; } if ( count) { assert(buf!= NULL); memcpy( buf, ms->data+ms->fpos, count); ms->fpos += count; } return count; } /* }}} */ static int php_memory_stream_close(php_stream *stream, int close_handle) {/* {{{ */ php_memory_stream_data *ms; assert(stream != NULL); ms = stream->abstract; assert(ms != NULL); if (ms->data) { efree(ms->data); } ms->data = NULL; ms->fsize = 0; ms->fpos = 0; } /* }}} */ static int php_memory_stream_flush(php_stream *stream) {/* {{{ */ // nothing to do here return 0; } /* }}} */ static int php_memory_stream_seek(php_stream *stream, off_t offset, int whence) {/* {{{ */ php_memory_stream_data *ms; assert(stream != NULL); ms = stream->abstract; assert(ms != NULL); if (offset == 0 && whence == SEEK_CUR) return ms->fpos; switch( whence) { case SEEK_CUR: if ( offset < 0) { if ( ms->fpos < -offset) { ms->fpos = 0; /*return EINVAL;*/ } else { ms->fpos = ms->fpos + offset; } } else { if ( ms->fpos < offset) { ms->fpos = ms->fsize; /*return EINVAL;*/ } else { ms->fpos = ms->fpos + offset; } } return 0; case SEEK_SET: if ( offset > ms->fsize) { ms->fpos = ms->fsize; /*return EINVAL;*/ } else { ms->fpos = offset; } return 0; case SEEK_END: if ( offset > 0) { ms->fpos = ms->fsize; /*return EINVAL;*/ } else if ( ms->fpos < -offset) { ms->fpos = 0; /*return EINVAL;*/ } else { ms->fpos = ms->fsize + offset; } return 0; default: return 0; return /*EINVAL*/; } } /* }}} */ php_stream_ops php_stream_memory_ops = { php_memory_stream_write, php_memory_stream_read, php_memory_stream_close, php_memory_stream_flush, php_memory_stream_seek, NULL, NULL, "MEMORY" }; PHPAPI php_stream *php_memory_stream_create() {/* {{{ */ php_memory_stream_data *self; self = emalloc(sizeof(*self)); assert( self != NULL); self->data = NULL; self->fpos = 0; self->fsize = 0; return php_stream_alloc(&php_stream_memory_ops, self, 0, "rwb"); } /* }}} */ /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: noet sw=4 ts=4 fdm=marker * vim<600: noet sw=4 ts=4 */
-- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php