e576bb | 2002-10-11 | Martin Nilsson | | |
766bc8 | 2004-10-16 | Marcus Agehall | | || $Id: a_source_pikestring.c,v 1.10 2004/10/16 07:27:29 agehall Exp $
|
e576bb | 2002-10-11 | Martin Nilsson | | */
|
1b10db | 2002-10-08 | Martin Nilsson | |
|
dd3c38 | 2002-05-29 | Per Hedbor | | #include "global.h"
#include "stralloc.h"
#include "bignum.h"
#include "interpret.h"
#include "shuffler.h"
|
1b10db | 2002-10-08 | Martin Nilsson | |
|
90ac0c | 2002-05-29 | Per Hedbor | |
|
dd3c38 | 2002-05-29 | Per Hedbor | |
struct ps_source
{
struct source s;
struct pike_string *str;
int offset, len;
};
|
766bc8 | 2004-10-16 | Marcus Agehall | | static struct data get_data( struct source *_s, off_t len )
|
dd3c38 | 2002-05-29 | Per Hedbor | | {
struct ps_source *s = (struct ps_source *)_s;
struct data res;
res.do_free = 0;
res.off = 0;
res.data = s->str->str + s->offset;
if( len > s->len )
{
len = s->len;
s->s.eof = 1;
}
res.len = len;
s->len -= len;
s->offset += len;
return res;
}
static void free_source( struct source *_s )
{
free_string(((struct ps_source *)_s)->str);
}
struct source *source_pikestring_make( struct svalue *s,
INT64 start, INT64 len )
{
struct ps_source *res;
|
0d9bf2 | 2002-05-29 | Per Hedbor | | if( s->type != PIKE_T_STRING ) return 0;
if( s->u.string->size_shift ) return 0;
|
565043 | 2004-08-28 | Martin Nilsson | |
|
dd3c38 | 2002-05-29 | Per Hedbor | | res = malloc( sizeof( struct ps_source ) );
|
b2986f | 2002-07-05 | Per Hedbor | | debug_malloc_touch( res );
debug_malloc_touch( s );
|
dd3c38 | 2002-05-29 | Per Hedbor | | MEMSET( res, 0, sizeof( struct ps_source ) );
|
338732 | 2002-05-29 | Per Hedbor | | res->s.free_source = free_source;
|
dd3c38 | 2002-05-29 | Per Hedbor | | res->s.get_data = get_data;
|
50ea68 | 2003-03-14 | Henrik Grubbström (Grubba) | | copy_shared_string(res->str, s->u.string);
|
dd3c38 | 2002-05-29 | Per Hedbor | | res->offset = start;
if( len != -1 )
{
if( len > res->str->len-start )
{
|
50ea68 | 2003-03-14 | Henrik Grubbström (Grubba) | | sub_ref(res->str);
|
dd3c38 | 2002-05-29 | Per Hedbor | | free(res);
return 0;
}
else
res->len = len;
}
else
res->len = res->str->len-start;
if( res->len <= 0 )
{
|
50ea68 | 2003-03-14 | Henrik Grubbström (Grubba) | | sub_ref(res->str);
|
dd3c38 | 2002-05-29 | Per Hedbor | | free(res);
|
565043 | 2004-08-28 | Martin Nilsson | | return 0;
|
dd3c38 | 2002-05-29 | Per Hedbor | | }
return (struct source *)res;
}
void source_pikestring_init( )
{
}
void source_pikestring_exit( )
{
}
|