/* null.c */

#include <string.h>
#include <stdlib.h>

#include "wimplib.h"

#include "clibExtra.h"

#include "null.h"

static int nullCount = 0;

_kernel_oserror *null_register_handler
( ObjectId object, WimpEventHandler *handler, void *handle)
{ unsigned int mask;

  if( nullCount++ == 0 )
  { event_get_mask( &mask );
    event_set_mask( mask & ~1 );
  }
  return event_register_wimp_handler( object, 0, handler, handle );
}

_kernel_oserror *null_deregister_handler
( ObjectId object, WimpEventHandler *handler, void *handle)
{ unsigned int mask;

  if( --nullCount == 0 )
  { event_get_mask( &mask );
    event_set_mask( mask | 1 );
  }
  return event_deregister_wimp_handler( object, 0, handler, handle );
}

static char *keyBuffer = NULL;
static char *keyPointer = NULL;

static int keyHandler( int event, WimpPollBlock *e, IdBlock *id, void *h)
{ event = event; e = e; id = id; h = h;

  wimp_process_key( *keyPointer++ );
  if( *keyPointer == 0 )
  { free( keyBuffer );
    keyBuffer = keyPointer = NULL;
    null_deregister_handler( -1, keyHandler, 0);
  }
  return 0;
}
  
_kernel_oserror *null_process_key( char *text )
{ char *p;
  int l;
  _kernel_oserror *er = NULL;
  
  if( keyBuffer )
  { if( keyPointer != keyBuffer )
    { p = keyBuffer;
      while( *keyPointer ) *p++ = *keyPointer++;
      *p = 0;
    }
    l = strlen( keyPointer ) + strlen( text );
    keyBuffer = myRealloc( keyBuffer, l+1 );
    strcat( keyBuffer, text );
    keyPointer = keyBuffer;
  }
  else
  { er = null_register_handler( -1, keyHandler, 0);
    keyBuffer = strdup( text );
    keyPointer = keyBuffer;
  }
  return er;
}

/* end of null.c */
