3 SBUF* sbuf(FIXNUM capacity)
5 SBUF* sbuf = allot_object(SBUF_TYPE,sizeof(SBUF));
7 sbuf->string = string(capacity,'\0');
11 void primitive_sbufp(void)
13 check_non_empty(env.dt);
14 env.dt = tag_boolean(typep(SBUF_TYPE,env.dt));
17 void primitive_sbuf(void)
19 env.dt = tag_object(sbuf(to_fixnum(env.dt)));
22 void primitive_sbuf_length(void)
24 env.dt = tag_fixnum(untag_sbuf(env.dt)->top);
27 void primitive_set_sbuf_length(void)
29 SBUF* sbuf = untag_sbuf(env.dt);
30 FIXNUM length = to_fixnum(dpop());
33 range_error(env.dt,length,sbuf->top);
34 else if(length > sbuf->string->capacity)
35 sbuf->string = grow_string(sbuf->string,length,F);
36 env.dt = dpop(); /* don't forget this! */
39 void primitive_sbuf_nth(void)
41 SBUF* sbuf = untag_sbuf(env.dt);
42 CELL index = to_fixnum(dpop());
44 if(index < 0 || index >= sbuf->top)
45 range_error(env.dt,index,sbuf->top);
46 env.dt = string_nth(sbuf->string,index);
49 void sbuf_ensure_capacity(SBUF* sbuf, int top)
51 STRING* string = sbuf->string;
52 CELL capacity = string->capacity;
54 sbuf->string = grow_string(string,top * 2 + 1,F);
58 void set_sbuf_nth(SBUF* sbuf, CELL index, CHAR value)
61 range_error(tag_object(sbuf),index,sbuf->top);
62 else if(index >= sbuf->top)
63 sbuf_ensure_capacity(sbuf,index + 1);
65 /* the following does not check bounds! */
66 set_string_nth(sbuf->string,index,value);
69 void primitive_set_sbuf_nth(void)
71 SBUF* sbuf = untag_sbuf(env.dt);
72 FIXNUM index = to_fixnum(dpop());
74 check_non_empty(value);
76 set_sbuf_nth(sbuf,index,value);
78 env.dt = dpop(); /* don't forget this! */
81 void sbuf_append_string(SBUF* sbuf, STRING* string)
84 CELL strlen = string->capacity;
85 sbuf_ensure_capacity(sbuf,top + strlen);
86 memcpy((void*)((CELL)sbuf->string + sizeof(STRING) + top * CHARS),
87 (void*)((CELL)string + sizeof(STRING)),strlen * CHARS);
90 void primitive_sbuf_append(void)
92 SBUF* sbuf = untag_sbuf(env.dt);
94 check_non_empty(object);
96 switch(type_of(object))
100 set_sbuf_nth(sbuf,sbuf->top,to_fixnum(object));
103 sbuf_append_string(sbuf,untag_string(object));
106 type_error(STRING_TYPE,object);
111 STRING* sbuf_to_string(SBUF* sbuf)
113 STRING* string = allot_string(sbuf->top);
114 memcpy(string + 1,sbuf->string + 1,sbuf->top * CHARS);
119 void primitive_sbuf_to_string(void)
121 env.dt = tag_object(sbuf_to_string(untag_sbuf(env.dt)));
124 void fixup_sbuf(SBUF* sbuf)
126 sbuf->string = (STRING*)((CELL)sbuf->string
127 + (active->base - relocation_base));
130 void collect_sbuf(SBUF* sbuf)
132 sbuf->string = copy_untagged_object(sbuf->string,
133 sizeof(sbuf->string) + sbuf->string->capacity);