示例#1
0
BOOL iffgetchunk(strid_t stream, char *desttype, glui32 *ulength,
		 glui32 file_size)
{
  int i;
  glui32 c;
  unsigned char length[4];

  c = glk_stream_get_position(stream);
  if(c & 1) {
    glk_get_char_stream(stream);    /* Eat padding */
    c++;
  }

  if(glk_get_buffer_stream(stream, desttype, 4) != 4)
    return FALSE;
  if(glk_get_buffer_stream(stream, (char *) length, 4) != 4)
    return FALSE;

  *ulength = MSBdecode4(length);

  for(i = 0; i < 4; i++)
    if(desttype[i] < 0x20 || desttype[i] > 0x7e)
      return FALSE;

  c += 8;

  return ((c + *ulength) <= file_size);
}
示例#2
0
文件: struct.c 项目: BPaden/garglk
glui32 fillstruct(strid_t stream, const unsigned *info, glui32 *dest,
		  glui32 (*special)(strid_t))
{
  unsigned char buffer[4];
  unsigned e;
  glui32 len = 0;;

  for(e = 0; info[e]; e++) {
    if(info[e] == 0x8000) {
      *dest++ = special(stream);
      len++;
    }
    else if(info[e] > 4) {
      unsigned i;
      for(i = 0; i < info[e]; i++) {
	*dest++ = glk_get_char_stream(stream);
	len++;
      }
    } else {
      glk_get_buffer_stream(stream, (char *) buffer, info[e]);

      switch(info[e]) {
      case 1: *dest = MSBdecode1(buffer); break;
      case 2: *dest = MSBdecode2(buffer); break;
      case 3: *dest = MSBdecode3(buffer); break;
      case 4: *dest = MSBdecode4(buffer); break;
      }
      dest++;
      len+=info[e];
    }
  }
  return len;
}