*/ void Clear_Series(REBSER *series) /* ** Clear an entire series to zero. Resets bias and tail. ** The tail is reset to zero. ** ***********************************************************************/ { series->tail = 0; if (SERIES_BIAS(series)) Reset_Bias(series); CLEAR(series->data, SERIES_SPACE(series)); }
*/ void Reset_Series(REBSER *series) /* ** Reset series to empty. Reset bias, tail, and termination. ** The tail is reset to zero. ** ***********************************************************************/ { series->tail = 0; if (SERIES_BIAS(series)) Reset_Bias(series); CLEAR(series->data, SERIES_WIDE(series)); // re-terminate }
*/ void Resize_Series(REBSER *series, REBCNT size) /* ** Reset series and expand it to required size. ** The tail is reset to zero. ** ***********************************************************************/ { series->tail = 0; if (SERIES_BIAS(series)) Reset_Bias(series); EXPAND_SERIES_TAIL(series, size); series->tail = 0; CLEAR(series->data, SERIES_WIDE(series)); // re-terminate }
*/ REBYTE *Reset_Buffer(REBSER *buf, REBCNT len) /* ** Setup to reuse a shared buffer. Expand it if needed. ** ** NOTE:The tail is set to the length position. ** ***********************************************************************/ { if (!buf) panic Error_0(RE_NO_BUFFER); RESET_TAIL(buf); if (SERIES_BIAS(buf)) Reset_Bias(buf); Expand_Series(buf, 0, len); // sets new tail return BIN_DATA(buf); }
*/ void Reset_Bias(REBSER *series) /* ** Reset series bias. ** ***********************************************************************/ { REBCNT len; REBYTE *data = series->data; len = SERIES_BIAS(series); SERIES_SET_BIAS(series, 0); SERIES_REST(series) += len; series->data -= SERIES_WIDE(series) * len; memmove(series->data, data, SERIES_USED(series)); }
*/ void Dump_Series(REBSER *series, REBYTE *memo) /* ***********************************************************************/ { if (!series) return; Debug_Fmt( Str_Dump[0], //"%s Series %x %s: Wide: %2d - Bias: %d Tail: %d Rest: %d Size: %6d" memo, series, (SERIES_LABEL(series) ? SERIES_LABEL(series) : "-"), SERIES_WIDE(series), SERIES_BIAS(series), SERIES_TAIL(series), SERIES_REST(series), SERIES_TOTAL(series) ); if (SERIES_WIDE(series) == sizeof(REBVAL)) Dump_Values(BLK_HEAD(series), SERIES_TAIL(series)); else Dump_Bytes(series->data, (SERIES_TAIL(series)+1) * SERIES_WIDE(series)); }
*/ void Remove_Series(REBSER *series, REBCNT index, REBINT len) /* ** Remove a series of values (bytes, longs, reb-vals) from the ** series at the given index. ** ***********************************************************************/ { REBCNT start; REBCNT length; REBYTE *data; if (len <= 0) return; // Optimized case of head removal: if (index == 0) { if ((REBCNT)len > series->tail) len = series->tail; SERIES_TAIL(series) -= len; if (SERIES_TAIL(series) == 0) { // Reset bias to zero: len = SERIES_BIAS(series); SERIES_SET_BIAS(series, 0); SERIES_REST(series) += len; series->data -= SERIES_WIDE(series) * len; CLEAR(series->data, SERIES_WIDE(series)); // terminate } else { // Add bias to head: REBCNT bias = SERIES_BIAS(series); if (REB_U32_ADD_OF(bias, len, &bias)) raise Error_0(RE_OVERFLOW); if (bias > 0xffff) { //bias is 16-bit, so a simple SERIES_ADD_BIAS could overflow it REBYTE *data = series->data; data += SERIES_WIDE(series) * len; series->data -= SERIES_WIDE(series) * SERIES_BIAS(series); SERIES_REST(series) += SERIES_BIAS(series); SERIES_SET_BIAS(series, 0); memmove(series->data, data, SERIES_USED(series)); } else { SERIES_SET_BIAS(series, bias); SERIES_REST(series) -= len; series->data += SERIES_WIDE(series) * len; if ((start = SERIES_BIAS(series))) { // If more than half biased: if (start >= MAX_SERIES_BIAS || start > SERIES_REST(series)) Reset_Bias(series); } } } return; } if (index >= series->tail) return; start = index * SERIES_WIDE(series); // Clip if past end and optimize the remove operation: if (len + index >= series->tail) { series->tail = index; CLEAR(series->data + start, SERIES_WIDE(series)); return; } length = (SERIES_LEN(series) + 1) * SERIES_WIDE(series); // include term. series->tail -= (REBCNT)len; len *= SERIES_WIDE(series); data = series->data + start; memmove(data, data + len, length - (start + len)); CHECK_MEMORY(5); }