#include "global.h" |
#include "stralloc.h" |
#include "bignum.h" |
#include "interpret.h" |
|
#include "shuffler.h" |
|
struct ps_source |
{ |
struct source s; |
|
struct pike_string *str; |
int offset, len; |
}; |
|
static struct data get_data( struct source *_s, int len ) |
{ |
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; |
|
if( s->type != PIKE_T_STRING ) |
return 0; |
|
res = malloc( sizeof( struct ps_source ) ); |
MEMSET( res, 0, sizeof( struct ps_source ) ); |
|
res->s.free = free_source; |
res->s.get_data = get_data; |
|
res->str = s->u.string; |
res->str->refs++; |
res->offset = start; |
|
if( len != -1 ) |
{ |
if( len > res->str->len-start ) |
{ |
res->str->refs--; |
free(res); |
return 0; |
} |
else |
res->len = len; |
} |
else |
res->len = res->str->len-start; |
|
if( res->len <= 0 ) |
{ |
res->str->refs--; |
free(res); |
} |
return (struct source *)res; |
} |
|
void source_pikestring_init( ) |
{ |
|
} |
|
void source_pikestring_exit( ) |
{ |
|
} |
|
|