pike.git/
src/
builtin.cmod
Branch:
Tag:
Non-build tags
All tags
No tags
2014-08-27
2014-08-27 00:39:52 by Stephen R. van den Berg <srb@cuci.nl>
bd23ae91ed59da6cf04708d190ebe8b7b1040664 (
120
lines) (+
38
/-
82
)
[
Show
|
Annotate
]
Branch:
8.0
Simplify code, make the buffer itself non-optional.
2976:
PIKEFUN int _size_object() {
-
if( THIS->str.s )
+
RETURN THIS->str.malloced;
-
RETURN 0;
+
} void f_Buffer_get_copy( INT32 args );
2997:
PIKEFUN void create( int|void size ) { struct Buffer_struct *str = THIS;
-
if
(
size )
-
str->initial = MAXIMUM( size->u.integer, 512 )
;
-
else
-
str->initial = 256
;
+
init_string_builder_alloc
(
&str->str,
+
str->initial =
size ?
MAXIMUM( size->u.integer, 512 )
:
256
,
0)
;
} /*! @decl string _sprintf( int flag, mapping flags )
3016:
struct pike_string *res; struct Buffer_struct *str = THIS; push_text( "Buffer(%d /* %d */)" );
-
if( str->str.s )
-
{
+
push_int(str->str.s->len); push_int(str->str.malloced);
-
}
-
else
-
{
-
push_int( 0 );
-
push_int( 0 );
-
}
+
f_sprintf( 3 ); dmalloc_touch_svalue(Pike_sp-1); res = Pike_sp[-1].u.string;
3089:
{ struct Buffer_struct *str = THIS; struct pike_string *s = str->str.s;
-
unsigned len =
0
,shift =
0
;
-
void *p =
NULL
;
+
unsigned len =
s->len
,
shift =
s->size_shift
;
+
void *p =
s->str
;
-
if (s)
-
len = s->len, shift = s->size_shift, p = s->str;
-
+
if (args==1) { pop_n_elems(args); if (index<0)
3136:
{ struct Buffer_struct *str = THIS; struct pike_string *s = str->str.s;
-
unsigned len =
0
,shift =
0
;
-
void *p =
NULL
;
+
unsigned len =
s->len
,
shift =
s->size_shift
;
+
void *p =
s->str
;
pop_n_elems(args);
-
if (s)
-
len = s->len, shift = s->size_shift, p = s->str;
+
if (index<0) index += len;
3168:
struct object *res = fast_clone_object( Buffer_program ); str2 = OBJ2_BUFFER( res ); str2->initial = str->initial;
-
if( str->str.s )
+
init_string_builder_copy (&str2->str, &str->str); if( (Pike_fp->current_object->flags & OBJECT_CLEAR_ON_EXIT) ) res->flags |= OBJECT_CLEAR_ON_EXIT;
3191:
rawtype tFunc(tMixed, tInt01); { struct Buffer_struct *str = THIS;
-
struct pike_string *
s, *
a;
+
struct pike_string *a;
switch(TYPEOF(*other)) {
3206:
default: RETURN 0; }
-
RETURN !(
s =
str->str.s
) ? !a->len : !my_quick_strcmp(s
, a);
+
RETURN !
my_quick_strcmp
(str->str.s, a);
} /*! @decl int addat(int(0..) pos, string|Buffer ... data)
3249:
shift |= a->size_shift; }
-
if (!(
s = str->str.s
)) {
-
if ((sum + pos) <= str->initial)
-
sum = str->initial
;
-
else
-
sum <<= 1, sum += pos;
-
shift = shift & ~(shift >> 1);
-
-
init_string_builder_alloc(&str->str, sum, shift);
-
} else {
+
s = str->str.s;
sum += pos; shift |= str->str.known_shift; shift = shift & ~(shift >> 1);
3265:
string_build_mkspace(&str->str, sum - s->len, shift); else if (shift != str->str.known_shift) string_build_mkspace(&str->str, 0, shift);
-
}
+
s = str->str.s; /* We know it will be a string that really is this wide. */ str->str.known_shift = shift;
3306:
rawtype tFuncV(tNone, tOr(tString, tObjIs_BUFFER), tIntPos); { struct Buffer_struct *str = THIS;
-
push_int(str->str.s
? str
->
str.s->
len
: 0
);
+
push_int(str->str.s->len);
stack_revroll(++args); f_Buffer_addat(args); }
3316:
*/ PIKEFUN void putchar(int c) { struct Buffer_struct *str = THIS;
-
if(!str->str.s)
-
init_string_builder_alloc(&str->str, str->initial, 0);
+
string_builder_putchar(&str->str, c); }
3332:
{ // FIXME: Reset length on exception? struct Buffer_struct *str = THIS;
-
if(!str->str.s)
-
init_string_builder_alloc(&str->str, str->initial, 0);
+
low_f_sprintf(args, 0, &str->str); RETURN str->str.s->len; }
3350:
{ struct pike_string *str = THIS->str.s; ptrdiff_t len;
-
if(
str &&
(len = str->len) > 0 )
+
if((len = str->len) > 0 )
{ char *d = (char *)str->str; switch( str->size_shift )
3370:
RETURN str; } push_empty_string();
-
return;
+
} /*! @decl string get()
3386:
PIKEFUN string get( ) { struct Buffer_struct *str = THIS;
-
pop_n_elems(args);
-
if( str->str.s )
-
{
+
struct pike_string *s = finish_string_builder( &str->str ); str->str.malloced = 0; str->str.s = NULL;
3396:
s->flags |= STRING_CLEAR_ON_EXIT; push_string(s); }
-
else
-
push_empty_string();
-
}
+
/*! @decl Buffer|void cut(int index, int|void end_or_none,void|int discard) *!
3413:
struct Buffer_struct *str = THIS, *str2; struct object *res; struct pike_string *s = str->str.s;
-
unsigned len =
0
,shift =
0
;
-
void *p =
NULL
;
+
unsigned len =
s->len
,shift =
s->size_shift
;
+
void *p =
s->str
;
INT_TYPE end,vdiscard;
-
if (s)
-
len = s->len, shift = s->size_shift, p = s->str;
-
+
end = args==1 ? len-1 : end_or_none->u.integer; vdiscard = args==3 ? discard->u.integer : 0; pop_n_elems(args);
3469:
PIKEFUN void clear() { struct Buffer_struct *str = THIS;
-
if (str->str.s)
+
reset_string_builder(&str->str); }
3480:
PIKEFUN int _sizeof() { struct Buffer_struct *str = THIS;
-
RETURN str->str.s
? str
->
str.s->
len
: 0
;
+
RETURN str->str.s->len;
} INIT
3493:
gc_trivial; { struct Buffer_struct *str = THIS;
-
if( str->str.s )
-
{
+
if( Pike_fp->flags & OBJECT_CLEAR_ON_EXIT ) guaranteed_memset( str->str.s->str, 0, str->str.s->len ); free_string_builder( &str->str ); }
-
}
+
GC_RECURSE {
-
if (mc_count_bytes (Pike_fp->current_object)
&& THIS->str.s
)
+
if (mc_count_bytes (Pike_fp->current_object))
mc_counted_bytes += THIS->str.malloced; } }