static void
read_utf8_char4 (st_parameter_dt *dtp, void *p, int len, int width)
{
  gfc_char4_t *dest;
  int nbytes;
  int i, j;

  len = (width < len) ? len : width;

  dest = (gfc_char4_t *) p;

  /* Proceed with decoding one character at a time.  */
  for (j = 0; j < len; j++, dest++)
    {
      *dest = read_utf8 (dtp, &nbytes);

      /* Check for a short read and if so, break out.  */
      if (nbytes == 0)
	break;
    }

  /* If there was a short read, pad the remaining characters.  */
  for (i = j; i < len; i++)
    *dest++ = (gfc_char4_t) ' ';
  return;
}
int main(int argc, char * argv[])
{
	if (argc < 3) {
		printf("usage: %s [-s] [iterations] input_file\n", basename(argv[0]));
		printf("\n  -s = sort by position\n  Use - as input_file to read from stdin\n");
		return 0;
	}
	
	int iterations = atoi(argv[argc-2]);
	bool sort = (argc > 2 && strcmp(argv[1], "-s") == 0);
	
	FILE *stream = (strcmp(argv[argc-1], "-") == 0) ? stdin : fopen(argv[argc-1], "r");
	char *md_source = read_utf8(stream);
	
	double starttime = get_time();
	int i;
	for (i = 0; i < iterations; i++)
	{
		pmh_element **result;
		pmh_markdown_to_elements(md_source, pmh_EXT_NONE, &result);
		if (sort)
			pmh_sort_elements_by_pos(result);
	}
	double endtime = get_time();
	
	printf("%f\n", (endtime-starttime));
	
    return(0);
}
/* skip entries until found search or dict end. skipped does not include the found key */
bool TorrentBase::try_next_dict_entry(BufferString search, BufferString prev, bool &error, BufferString *skipped) {
	size_t start = m_buffer.pos();
	error = true;
	if (m_buffer.pos() >= m_buffer.m_len) return seterror("expected dict, found eof");

	BufferString cur;

	while (m_buffer.m_data[m_buffer.pos()] != 'e') {
		size_t curpos = m_buffer.pos();;
		if (!read_utf8(cur)) return errorcontext("parsing dict key failed");
		if (cur <= prev) return seterror("(previous) dict entries in wrong order");
		if (cur == search) {
			error = false;
			if (0 != skipped) *skipped = BufferString(m_buffer.data() + start, curpos - start);
			return true;
		}
		if (cur > search) {
			m_buffer.m_pos = curpos;
			error = false;
			if (0 != skipped) *skipped = BufferString(m_buffer.data() + start, m_buffer.pos() - start);
			return false;
		}
		prev = cur;
		if (m_buffer.pos() >= m_buffer.m_len) return seterror("expected dict value, found eof");
		if (!skip_value()) return errorcontext("parsing dict value failed");
		if (m_buffer.pos() >= m_buffer.m_len) return seterror("expected dict entry or 'e', found eof");
	}

	/* dict end found, don't skip the 'e' */
	error = false;
	if (0 != skipped) *skipped = BufferString(m_buffer.data() + start, m_buffer.pos() - start);
	return false;
}
static void
read_utf8_char1 (st_parameter_dt *dtp, char *p, int len, size_t width)
{
  gfc_char4_t c;
  char *dest;
  size_t nbytes;
  int i, j;

  len = ((int) width < len) ? len : (int) width;

  dest = (char *) p;

  /* Proceed with decoding one character at a time.  */
  for (j = 0; j < len; j++, dest++)
    {
      c = read_utf8 (dtp, &nbytes);

      /* Check for a short read and if so, break out.  */
      if (nbytes == 0)
	break;

      *dest = c > 255 ? '?' : (uchar) c;
    }

  /* If there was a short read, pad the remaining characters.  */
  for (i = j; i < len; i++)
    *dest++ = ' ';
  return;
}
bool TorrentBase::parse_announce_list() {
	std::string s;
	if (m_buffer.eof()) return seterror("expected announce-list, found eof");
	if (!m_buffer.isNext('l')) {
		if (!read_utf8(s)) return errorcontext("expected announce-list, neither list nor string found");
		std::cerr << "broken Announce-list, found single string" << std::endl;
		t_announce_list.push_back(std::vector<std::string>());
		t_announce_list.back().push_back(s);
	} else {
		bool warned1 = false;
		m_buffer.next();
		while (!m_buffer.eof() && !m_buffer.isNext('e')) {
			if (!m_buffer.isNext('l')) {
				if (!read_utf8(s)) return errorcontext("expected announce-list list, neither list nor string found");
				if (!warned1) {
					std::cerr << "broken announce-list, found string in list, should be in separate list" << std::endl;
					warned1 = true;
				}
				if (t_announce_list.empty()) t_announce_list.push_back(std::vector<std::string>());
				t_announce_list.back().push_back(s);
			} else {
				t_announce_list.push_back(std::vector<std::string>());
				m_buffer.next();
				while (!m_buffer.eof() && !m_buffer.isNext('e')) {
					if (!read_utf8(s)) return errorcontext("expected announce-list list entry");
					t_announce_list.back().push_back(s);
				}
				if (!m_buffer.isNext('e')) return seterror("expected announce-list list, found eof");
				m_buffer.next();
			}
		}
		if (!m_buffer.isNext('e')) return seterror("expected announce-list lists, found eof");
		m_buffer.next();
	}
	return true;
}
bool TorrentBase::skip_dict() {
	if (m_buffer.pos() >= m_buffer.m_len) return seterror("expected dict, found eof");
	if (m_buffer.m_data[m_buffer.pos()] != 'd') return seterror("expected 'd' for dict");

	m_buffer.next();
	if (m_buffer.pos() >= m_buffer.m_len) return seterror("expected dict entry or 'e', found eof");

	BufferString last, cur;

	while (m_buffer.m_data[m_buffer.pos()] != 'e') {
		if (!read_utf8(cur)) return errorcontext("parsing dict key failed");
		if (cur <= last) return seterror("(previous) dict entries in wrong order");
		last = cur;
		if (m_buffer.pos() >= m_buffer.m_len) return seterror("expected dict value, found eof");
		if (!skip_value()) return errorcontext("parsing dict value failed");
		if (m_buffer.pos() >= m_buffer.m_len) return seterror("expected dict entry or 'e', found eof");
	}
	m_buffer.next();

	return true;
}
/* skip entries until dict end */
bool TorrentBase::goto_dict_end(BufferString prev, BufferString *skipped) {
	size_t start = m_buffer.pos();
	if (m_buffer.pos() >= m_buffer.m_len) return seterror("expected dict entry or 'e', found eof");

	BufferString cur;

	while (m_buffer.m_data[m_buffer.pos()] != 'e') {
		if (!read_utf8(cur)) return errorcontext("parsing dict key failed");
		if (cur <= prev) {
			std::cerr << "dict entries wrong order: '" << cur << "' <= '" << prev << "'\n";
		}
		if (cur <= prev) return seterror("(previous) dict entries in wrong order");
		prev = cur;
		if (m_buffer.pos() >= m_buffer.m_len) return seterror("expected dict value, found eof");
		if (!skip_value()) return errorcontext("parsing dict value failed");
		if (m_buffer.pos() >= m_buffer.m_len) return seterror("expected dict entry or 'e', found eof");
	}
	m_buffer.next();

	if (0 != skipped) *skipped = BufferString(m_buffer.data() + start, m_buffer.pos() - start);

	return true;
}
Exemple #8
0
flac_status
flacdec_read_frame_header(BitstreamReader *bitstream,
                          struct flac_STREAMINFO *streaminfo,
                          struct flac_frame_header *header)
{
    unsigned block_size_bits;
    unsigned sample_rate_bits;
    uint8_t crc8 = 0;

    br_add_callback(bitstream, (bs_callback_f)flac_crc8, &crc8);

    /*read and verify sync code*/
    if (bitstream->read(bitstream, 14) != 0x3FFE) {
        return ERR_INVALID_SYNC_CODE;
    }

    /*read and verify reserved bit*/
    if (bitstream->read(bitstream, 1) != 0) {
        return ERR_INVALID_RESERVED_BIT;
    }

    header->blocking_strategy = bitstream->read(bitstream, 1);

    block_size_bits = bitstream->read(bitstream, 4);
    sample_rate_bits = bitstream->read(bitstream, 4);
    header->channel_assignment = bitstream->read(bitstream, 4);
    switch (header->channel_assignment) {
    case 0x8:
    case 0x9:
    case 0xA:
        header->channel_count = 2;
        break;
    default:
        header->channel_count = header->channel_assignment + 1;
        break;
    }

    switch (bitstream->read(bitstream, 3)) {
    case 0:
        header->bits_per_sample = streaminfo->bits_per_sample; break;
    case 1:
        header->bits_per_sample = 8; break;
    case 2:
        header->bits_per_sample = 12; break;
    case 4:
        header->bits_per_sample = 16; break;
    case 5:
        header->bits_per_sample = 20; break;
    case 6:
        header->bits_per_sample = 24; break;
    default:
        return ERR_INVALID_BITS_PER_SAMPLE;
    }
    bitstream->read(bitstream, 1); /*padding*/

    header->frame_number = read_utf8(bitstream);

    switch (block_size_bits) {
    case 0x0: header->block_size = streaminfo->maximum_block_size; break;
    case 0x1: header->block_size = 192; break;
    case 0x2: header->block_size = 576; break;
    case 0x3: header->block_size = 1152; break;
    case 0x4: header->block_size = 2304; break;
    case 0x5: header->block_size = 4608; break;
    case 0x6: header->block_size = bitstream->read(bitstream, 8) + 1; break;
    case 0x7: header->block_size = bitstream->read(bitstream, 16) + 1; break;
    case 0x8: header->block_size = 256; break;
    case 0x9: header->block_size = 512; break;
    case 0xA: header->block_size = 1024; break;
    case 0xB: header->block_size = 2048; break;
    case 0xC: header->block_size = 4096; break;
    case 0xD: header->block_size = 8192; break;
    case 0xE: header->block_size = 16384; break;
    case 0xF: header->block_size = 32768; break;
    }

    switch (sample_rate_bits) {
    case 0x0: header->sample_rate = streaminfo->sample_rate; break;
    case 0x1: header->sample_rate = 88200; break;
    case 0x2: header->sample_rate = 176400; break;
    case 0x3: header->sample_rate = 192000; break;
    case 0x4: header->sample_rate = 8000; break;
    case 0x5: header->sample_rate = 16000; break;
    case 0x6: header->sample_rate = 22050; break;
    case 0x7: header->sample_rate = 24000; break;
    case 0x8: header->sample_rate = 32000; break;
    case 0x9: header->sample_rate = 44100; break;
    case 0xA: header->sample_rate = 48000; break;
    case 0xB: header->sample_rate = 96000; break;
    case 0xC: header->sample_rate = bitstream->read(bitstream, 8) * 1000; break;
    case 0xD: header->sample_rate = bitstream->read(bitstream, 16); break;
    case 0xE: header->sample_rate = bitstream->read(bitstream, 16) * 10; break;
    case 0xF:
        return ERR_INVALID_SAMPLE_RATE;
    }

    /*check for valid CRC-8 value*/
    bitstream->read(bitstream, 8);
    br_pop_callback(bitstream, NULL);
    if (crc8 != 0)
        return ERR_INVALID_FRAME_CRC;

    /*Once we've read everything,
      ensure the values are compatible with STREAMINFO.*/

    if (streaminfo->sample_rate != header->sample_rate) {
        return ERR_SAMPLE_RATE_MISMATCH;
    }
    if (streaminfo->channels != header->channel_count) {
        return ERR_CHANNEL_COUNT_MISMATCH;
    }
    if (streaminfo->bits_per_sample != header->bits_per_sample) {
        return ERR_BITS_PER_SAMPLE_MISMATCH;
    }
    if (header->block_size > streaminfo->maximum_block_size) {
        return ERR_MAXIMUM_BLOCK_SIZE_EXCEEDED;
    }

    return OK;
}
Exemple #9
0
u8int read_constant_pool(FILE* f, u16int *i, u16int *cpcount, cp_info** cpinfo)
{

     u16int *j= (u16int*) malloc(sizeof(u16int));
	s32int* integer, *i2;
	u8int *raw = malloc(4), *raw2 = malloc(8);

     
     cp_info* info;

   
	debugmsg("Constant pool: \n");
	for(*i=0;*i < ((*cpcount)-1); (*i)++)
	{
        info = (cp_info*) malloc(sizeof(cp_info));
        memset(info, 0, sizeof(cp_info));
		info->tag = fgetc(f);
	
		switch(info->tag)
		{
			case CONSTANT_Class: 
			{
				read_class(f, j, info);
				debugmsg("#%d Class #%d\n", (*i)+1, MAKE_U16( ((CONSTANT_Class_info*) info->data)->name_index ));
				break;
			}
			
			case CONSTANT_Fieldref:
			{
				read_fieldref(f, j, info);
				 debugmsg("#%d Fieldref #%d.#%d\n", (*i)+1,
				MAKE_U16( ((CONSTANT_Fieldref_info*)info->data)->class_index  ),
				MAKE_U16( ((CONSTANT_Fieldref_info*)info->data)->name_and_type_index ));
				break;
			}
			case CONSTANT_Methodref:
			{
				read_methodref(f, j, info);
				 debugmsg("#%d Methodref #%d.#%d\n", (*i)+1,
				MAKE_U16( ((CONSTANT_Methodref_info*)info->data)->class_index ),
				MAKE_U16( ((CONSTANT_Methodref_info*)info->data)->name_and_type_index ));
				break;
			}
			case CONSTANT_InterfaceMethodref:
			{
				read_interfacemethodref(f, j, info);
				 debugmsg("#%d InterfaceMethodref #%d.#%d\n", (*i)+1,
				MAKE_U16( ((CONSTANT_InterfaceMethodref_info*)info->data)->class_index  ),
				MAKE_U16( ((CONSTANT_InterfaceMethodref_info*)info->data)->name_and_type_index  ));
				break;
			}
			case CONSTANT_String:
			{
				read_string(f, j, info);
				debugmsg("#%d String #%d\n", (*i)+1, MAKE_U16( ((CONSTANT_String_info*)info->data)->string_index));
				break;
			}
			case CONSTANT_Integer:
			{
				read_integer(f, j, info);
				
				MAKE_S32(raw, ((CONSTANT_Integer_info*)info->data)->bytes);
				integer = (s32int*) raw;
				debugmsg("#%d Integer %d\n", (*i) + 1, *integer);
				break;
			}
			case CONSTANT_Float:
			{	
				read_float(f, j, info);
				COPY_FLOAT(raw, ((CONSTANT_Float_info*)info->data)->bytes);
				debugmsg("#%d Float %f\n", (*i)+1, *((float32*) raw));
				break;
			}
			case CONSTANT_Long:
			{
				read_long(f, j, info);
				MAKE_S64(raw2, ((CONSTANT_Long_info*)info->data)->high_bytes );
				debugmsg("#%d Long %ld\n", (*i)+1,  *( (s64int*) raw2));
                    cpinfo[(*i)++] = NULL;
				break;
			}
			case CONSTANT_Double:
			{
				read_double(f, j, info);
				COPY_DOUBLE(raw2, ((CONSTANT_Double_info*) info->data)->high_bytes);
				debugmsg("#%d Double %f\n", (*i)+1, *( (float64*) raw2));
				cpinfo[(*i)++] = NULL;
				break;
			}
			case CONSTANT_NameAndType:
			{
				read_nameandtype(f, j, info);
				debugmsg("#%d NameAndType #%d.#%d\n", (*i)+1, MAKE_U16( ((CONSTANT_NameAndType_info*) info->data)->name_index) , MAKE_U16(((CONSTANT_NameAndType_info*) info->data)->descriptor_index ) );
				break;
			}
			case CONSTANT_Utf8:
			{
				read_utf8(f, j, info);
                    debugmsg("#%d Utf8 %s\n", (*i)+1, utf8_to_cstring(((CONSTANT_Utf8_info*) info->data)->bytes));
				break;
			}
               case CONSTANT_MethodHandle:
               {
                    read_methodhandle(f, j, info);
                    debugmsg("#%d MethodHandle Kind:%d #%d\n", *(i)+1, ((CONSTANT_MethodHandle_info*) info->data)->reference_kind, MAKE_U16(((CONSTANT_MethodHandle_info*) info->data)->reference_index));
                    break;
               }
               
               case CONSTANT_MethodType:
               {
                    read_methodtype(f, j, info);
                    debugmsg("#%d MethodType #%d\n", *(i)+1, MAKE_U16(((CONSTANT_MethodType_info*) info->data)->descriptor_index));
                    break;
               }
               
               case CONSTANT_InvokeDynamic:
               {
                    read_invokedynamic(f,j,info);
                    debugmsg("#%d InvokeDynamic #%d.#%d\n", *(i)+1, MAKE_U16(((CONSTANT_InvokeDynamic_info*) info->data)->bootstrap_method_attr_index),
                              MAKE_U16(((CONSTANT_InvokeDynamic_info*) info->data)->name_and_type_index));
                    break;
               }
               
			default: {
				debugerr("Unrecognized tag: %02X!\n", info->tag);
				free(info);
				return 0;
					}
		}
          cpinfo[(*i)] = info;       
	}
     
	 debugmsg("Done reading Constant Pool\n");
      

	free(j);
	free(raw);
	free(raw2);
     
     
	return 1;
}
bool TorrentBase::read_info_utf8(std::string &str) {
	return m_check_info_utf8 ? read_utf8(str) : read_string(str);
}
bool TorrentBase::skip_utf8() {
	BufferString tmp;
	return read_utf8(tmp);
}