Pike v8.0 release 1738

Method Stdio.Buffer()->set_error_mode()


Method set_error_mode

Buffer set_error_mode(int m)
Buffer set_error_mode(program m)

Description

Set the error mode of this buffer to m.

If true operations that would normally return 0 (like trying to read too much) will instead throw an error. If m is a program a clone of it will be thrown on error.

This is useful when parsing received data, you do not have to verify that each and every read operation suceeds.

However, the non-error mode is more useful when checking to see if a packet/segment/whatever has arrived.

The thrown error object will have the constant buffer_error set to a non-false value.

Example
void read_callback(int i, string new_data)
{
  inbuffer->add( new_data );

  while( Buffer packet = inbuffer->read_hbuffer(2) )
  {
    packet->set_error_mode(Buffer.THROW_ERROR);
    if( mixed e = catch( handle_packet( packet ) ) )
      if( e->buffer_error )
        protocol_error(); // illegal data in packet
      else
        throw(e); // the other code did something bad
   }
}

void handle_packet( Buffer pack )
{
  switch( pack->read_int8() )
  {
    ...
  case HEADER_FRAME:
    int num_headers = pack->read_int32();
    for( int i = 0; i<num_headers; i++ )
     headers[pack->read_hstring(2)] = pack->read_hstring(2);
    ...
  }
}