if (sizeof (unsigned short int) == 2) { buffer->a[2] = 0x5; buffer->a[1] = 0xdeec; buffer->a[0] = 0xe66d; } else { buffer->a[2] = 0x5deecUL; buffer->a[1] = 0xe66d0000UL; buffer->a[0] = 0; }
__drand48_iterate (xsubi, buffer)     unsigned short int xsubi[3];     struct drand48_data *buffer;{  /* Be generous for the arguments, detect some errors.  */  if (xsubi == NULL || buffer == NULL)    {      errno = EFAULT;      return -1;    }  /* Initialize buffer, if not yet done.  */  if (!buffer->init)    {      if (sizeof (unsigned short int) == 2)	{	  buffer->a[2] = 0x5;	  buffer->a[1] = 0xdeec;	  buffer->a[0] = 0xe66d;	}      else	{	  buffer->a[2] = 0x5deecUL;	  buffer->a[1] = 0xe66d0000UL;	  buffer->a[0] = 0;	}      buffer->c = 0xb;      buffer->init = 1;    }  /* Do the real work.  We choose a data type which contains at least     48 bits.  Because we compute the modulus it does not care how     many bits really are computed.  */  if (sizeof (long int) >= 6)    {      /* The `long' data type is sufficent.  */      unsigned long int X, a, result;#define ONE_STEP							    \      if (sizeof (unsigned short int) == 2)				    \	{								    \	  X = (xsubi[2] << 16 | xsubi[1]) << 16 | xsubi[0];		    \	  a = (buffer->a[2] << 16 | buffer->a[1]) << 16 | buffer->a[0];	    \									    \	  result = X * a + buffer->c;					    \									    \	  xsubi[0] = result & 0xffff;					    \	  result >>= 16;						    \	  xsubi[1] = result & 0xffff;					    \	  result >>= 16;						    \	  xsubi[2] = result & 0xffff;					    \	}								    \      else								    \	{								    \	  X = xsubi[2] << 16 | xsubi[1] >> 16;				    \	  a = buffer->a[2] << 16 | buffer->a[1] >> 16;			    \									    \	  result = X * a + buffer->c;					    \									    \	  xsubi[0] = result >> 16 & 0xffffffffl;			    \	  xsubi[1] = result << 16 & 0xffff0000l;			    \	}      ONE_STEP;    }  else    {      /* We have to use the `long long' data type.  */      unsigned long long int X, a, result;      ONE_STEP;    }  return 0;}