7d55002014-11-24Martin Nilsson #pike __REAL_VERSION__ #pragma strict_types //! String buffer with the possibility to read and write data //! as they would be formatted in structs. inherit Stdio.Buffer;
73d2192014-11-24Martin Nilsson this_program add_hstring(string(8bit)|Stdio.Buffer str, int sz) { return [object(this_program)]::add_hstring(str,sz); }
3917072014-11-24Martin Nilsson this_program add_int(int i, int sz) { return [object(this_program)]::add_int(i,sz); }
1a43772014-11-25Martin Nilsson this_program add(string(8bit)|Stdio.Buffer str) { return [object(this_program)]::add(str); }
7d55002014-11-24Martin Nilsson //! Create a new buffer, optionally initialized with the //! value @[s].
af9ae22015-03-30Martin Nilsson protected void create(void|string(8bit)|Stdio.Buffer s)
7d55002014-11-24Martin Nilsson {
af9ae22015-03-30Martin Nilsson  if( s )
7d55002014-11-24Martin Nilsson  ::create(s); set_error_mode(.BufferError); } //! Appends an array of unsigned integers of width @[item_size] //! to the buffer, preceded with an unsigned integer @[len] declaring //! the size of the array in bytes.
16ce052014-11-25Martin Nilsson this_program add_int_array(array(int) data, int(0..) item_size, int(0..) len)
7d55002014-11-24Martin Nilsson { add_int(sizeof(data)*item_size, len ); return [object(this_program)]add_ints(data,item_size); } //! Appends an array of variable length strings with @[item_size] //! bytes hollerith coding, prefixed by a @[len] bytes large integer //! declaring the total size of the array in bytes.
16ce052014-11-25Martin Nilsson this_program add_string_array(array(string(8bit)) data, int(0..) item_size, int(0..) len)
7d55002014-11-24Martin Nilsson { Stdio.Buffer sub = Stdio.Buffer(); foreach(data, string(8bit) s) sub->add_hstring(s, item_size);
6af4c52014-11-25Martin Nilsson  return [object(this_program)]add_hstring(sub, len);
7d55002014-11-24Martin Nilsson }
16ce052014-11-25Martin Nilsson //! Reads an array of integers as written by @[add_int_array]
7d55002014-11-24Martin Nilsson //! from the buffer.
16ce052014-11-25Martin Nilsson array(int) read_int_array(int item_size, int len)
7d55002014-11-24Martin Nilsson { int size = read_int(len); int elems = size/item_size; if( elems*item_size != size ) throw(.BufferError("Impossible uint array length value.\n")); return read_ints(elems, item_size); }
91e9052015-07-06Henrik Grubbström (Grubba)  //! Reads an array of strings as written by @[add_string_array] //! from the buffer. array(string(8bit)) read_string_array(int(0..) item_size, int(0..) len) { Stdio.Buffer sub = read_hbuffer(len); array(string(8bit)) res = ({}); while (sizeof(sub)) { res += ({ sub->read_hstring(item_size) }); } return res; }