/*
// Full copyright information is available in the file ../doc/CREDITS
*/
#define NATIVE_MODULE "$buffer"
#include "cdc.h"
NATIVE_METHOD(buflen) {
Int val;
INIT_1_ARG(BUFFER);
val = buffer_len(BUF1);
CLEAN_RETURN_INTEGER(val);
}
NATIVE_METHOD(buf_replace) {
cBuf * buf;
Int pos, ch;
INIT_3_ARGS(BUFFER, INTEGER, INTEGER);
pos = INT2 - 1;
if (pos < 0)
THROW((range_id, "Position (%d) is less than one.", pos + 1))
else if (pos >= buffer_len(BUF1))
THROW((range_id, "Position (%d) is greater than buffer length (%d).",
pos + 1, buffer_len(BUF1)))
ch = INT3;
buf = buffer_dup(BUF1);
anticipate_assignment();
CLEAN_RETURN_BUFFER(buffer_replace(buf, pos, ch));
}
NATIVE_METHOD(subbuf) {
Int start,
len,
blen;
cBuf * buf;
INIT_2_OR_3_ARGS(BUFFER, INTEGER, INTEGER);
blen = BUF1->len;
start = INT2 - 1;
len = (argc == 3) ? INT3 : blen - start;
if (start < 0)
THROW((range_id, "Start (%d) is less than one.", start + 1))
else if (len < 0)
THROW((range_id, "Length (%d) is less than zero.", len))
else if (start + len > blen)
THROW((range_id,
"The subrange extends to %d, past the end of the buffer (%d).",
start + len, blen))
buf = buffer_dup(BUF1);
anticipate_assignment();
CLEAN_RETURN_BUFFER(buffer_subrange(buf, start, len));
}
NATIVE_METHOD(buf_to_str) {
cBuf * buf;
INIT_1_ARG(BUFFER);
buf = buffer_dup(BUF1);
CLEAN_RETURN_STRING(buf_to_string(buf));
}
NATIVE_METHOD(buf_to_strings) {
cList * list;
cBuf * sep;
INIT_1_OR_2_ARGS(BUFFER, BUFFER);
sep = (argc == 2) ? BUF2 : NULL;
list = buf_to_strings(BUF1, sep);
CLEAN_RETURN_LIST(list);
}
NATIVE_METHOD(str_to_buf) {
cBuf * buf;
INIT_1_ARG(STRING);
anticipate_assignment();
buf = buffer_from_string(STR1);
CLEAN_RETURN_BUFFER(buf);
}
NATIVE_METHOD(strings_to_buf) {
cData * d;
Int i;
cBuf * sep,
* buf;
cList * list;
INIT_1_OR_2_ARGS(LIST, BUFFER);
list = LIST1;
sep = (argc == 2) ? BUF2 : NULL;
for (d = list_first(list), i=0; d; d = list_next(list, d),i++) {
if (d->type != STRING)
THROW((type_id, "List element %d (%D) not a string.", i + 1, d))
}
buf = buffer_from_strings(list, sep);
CLEAN_RETURN_BUFFER(buf);
}