示例#1
0
文件: lex_anal.cpp 项目: pyal/eos_cpp
StateResults StateNumber::CheckState(LexStateData &dat) {

    if(!dat.manip.GuessInChars(".0123456789", 11))
        return Continue;
    dat.manip.unget();
    int base = 10, ForceDouble = 0;
    if(dat.manip.GuessInChars("0", 1)) {
        if(dat.manip.GuessInChars("xX", 2))
            return ReadBase16(dat);   //{base=16;manip.UnfreezePos();manip.FreezePos();}
        if(dat.manip.GuessInChars("01234567", 8)) {
            dat.manip.unget();
            base = 8;
        }
    }
    dat.manip.FreezePos();
    while(dat.manip.GuessInChars("0123456789", 10))
        ;
    if(dat.manip.GuessInChars("uU", 2))
        return ConstructUnsigned(dat, base);
    if(!dat.manip.GuessInChars(".eE", 3))
        return ConstructSigned(dat, base);
    else
        dat.manip.unget();
    if(dat.manip.GuessInChars(".", 1)) {
        while(dat.manip.GuessInChars("0123456789", 10))
            ;
        ForceDouble = 1;
    }
    string str = dat.manip.UnfreezeToStr();
    dat.manip.FreezePos();
    if(dat.manip.GuessInChars("eE", 2)) {
        dat.manip.GuessInChars("+-", 2);
        if(!dat.manip.GuessInChars("0123456789", 10)) {
            dat.manip.RestorePos();
            if(ForceDouble)
                return ConstructDouble(dat, str);
            else
                return ConstructSigned(dat, str, base);
        }
        while(dat.manip.GuessInChars("0123456789", 10))
            ;
    }
    str = str + dat.manip.UnfreezeToStr();
    return ConstructDouble(dat, str);
}
示例#2
0
// load an Intel hex file into buffer
bool ReadHexFile(char *filename)
{
	FILE *fp;
	bool res = true;

	printf("\n");

	fp = fopen(filename, "r");
	if (fp == NULL)
	{
		printf("Unable to open %s.\n", filename);
		return false;
	}
	printf("Loading %s...\n", filename);

	memset(firmware_buffer, 0xFF, sizeof(firmware_buffer));
	uint32_t	base_addr = 0;

	int line_num = 0;
	while (feof(fp) != EOF)
	{
		line_num++;
		char line[1024];
		if (fgets(line, sizeof(line), fp) == NULL)
			break;
		//printf("%u:\t%s", line_num, line);

		if (line[0] != ':')
		{
			printf("Invalid line %d (missing colon)\n", line_num);
			res = false;
			break;
		}

		char *c = &line[1];
		uint8_t len = ReadBase16(c, 2);
		c += 2;
		uint16_t addr = ReadBase16(c, 4);
		c += 4;
		uint8_t type = ReadBase16(c, 2);
		c += 2;

		//printf("%u\t%X\t%u\n", len, addr, type);

		switch (type)
		{
		case 0:		// data record
			for (uint16_t i = 0; i < len; i++)
			{
				uint32_t absadr = base_addr + (addr++);
				if (absadr > FIRMWARE_BUFFER_SIZE)
				{
					printf("Firmware image too large for buffer (%X).\n", absadr);
					res = false;
					goto exit;
				}
				firmware_buffer[absadr] = ReadBase16(c, 2);
				c += 2;
				if (absadr > firmware_size)
					firmware_size = absadr;
			}
			break;

		case 2:		// extended segment address record
			if (len != 2)
			{
				printf("Invalid line %d (bad extended segment address length: %u)\n", line_num, len);
				res = false;
				break;
			}
			base_addr = ReadBase16(c, 4) << 4;
			//printf("%u:\tbase_addr = %X\n", line_num, base_addr);
			c += 4;
		}

		uint8_t checksum = ReadBase16(c, 2);
		// todo: check checksum

		if (res != true)
			break;
	}

	printf("Firmware size:\t%u bytes (0x%X)\n", firmware_size, firmware_size);

	// find embedded info
	uint32_t ptr = FindEmbeddedInfo();
	if (ptr == 0xFFFFFFFF)
	{
		printf("Embedded info struct not found.\n");
		fw_info = NULL;
		res = false;
		goto exit;
	}
	fw_info = (FW_INFO_t *)&firmware_buffer[ptr];
	if (fw_info->flash_size_b > FIRMWARE_BUFFER_SIZE)
	{
		printf("Embedded flash size greater than buffer size.\n");
		res = false;
		goto exit;
	}

	/*
	FW_INFO_t zzz;
	fw_info = &zzz;
	fw_info->flash_size_b = 0x40000;
	*/
	firmware_crc = xmega_nvm_crc32(firmware_buffer, fw_info->flash_size_b);
	printf("Firmware CRC:\t0x%lX\n", firmware_crc);

	printf("MCU ID:\t\t%02X%02X%02X\n", fw_info->mcu_signature[0], fw_info->mcu_signature[1], fw_info->mcu_signature[2]);
	printf("Flash size:\t%u bytes (0x%X)\n", fw_info->flash_size_b, fw_info->flash_size_b);
	printf("Page sise:\t%u bytes\n", fw_info->page_size_b);
	printf("Version:\t%u.%02u\n", fw_info->version_major, fw_info->version_minor);
	printf("\n");

exit:
	fclose(fp);
	return res;
}