Example #1
0
int prompt_read_line(const char* prompt, char* line, int maxlen)
{
#if defined(WIN32) && !defined(__CYGWIN__)
    CONSOLE_SCREEN_BUFFER_INFO csbi;

    // Change text color
	GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
	SetConsoleTextAttribute(
        GetStdHandle(STD_OUTPUT_HANDLE), 
        FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);

    printf(prompt);

    // Restore text color
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), csbi.wAttributes);
	
    if (fgets(line, maxlen, stdin) == NULL)
        return -1;

    strip_whitespaces(line);
	return 0;
#else
	char* sz;
	
	sz = readline(prompt);
	if (sz == NULL)
		return -1;
    if (*sz)
		add_history(sz);
    strip_whitespaces(sz);
    strncpy(line, sz, maxlen);
	free(sz);
	return 0;
#endif
}
Example #2
0
int mcs_file::load(const char* name)
{
    FILE *f;
    int rc = -1;
    char line[256];
	struct stat st;
	int len, type, addr;
	unsigned char buff[64];
	int addr_offs = 0;
	u32 max_length;

    if (data || length)
        // Call clear() first
        return -1;

	if (stat(name, &st) < 0)
	{
		msgf(STR_UNABLE_TO_OPEN_FILE);
        return -1;
	}
    
    f = fopen(name, "rt");
    if (f == NULL)
	{
		msgf(STR_UNABLE_TO_OPEN_FILE);
        return -1;
	}

	// This size must be enough!
	max_length = st.st_size / 2;
	data = (u8*)malloc(max_length);
	if (data == NULL)
		goto cleanup;

	memset(data, 0xFF, max_length);
	length = 0;
  
    // Read lines
    while(!feof(f))
    {
        if (fgets(line, sizeof(line), f) == NULL)
			break;

		strip_whitespaces(line);

		if (parse_record(line, &len, &addr, &type, buff, sizeof(buff)))
		{
			msgf(STR_INVALID_FILE_FORMAT);
			goto cleanup;
		}

		if (type == RECORD_DATA)
		{
			if ((u32)(addr_offs + addr + len) > max_length)
			{
				msgf(STR_INVALID_FILE_FORMAT);
				goto cleanup;
			}
			
			memcpy(data + addr_offs + addr, buff, len);
			
			if ((u32)(addr_offs + addr + len) > length)
				length = (u32)(addr_offs + addr + len);
		}
		else
		if (type == RECORD_ADDRESS)
			addr_offs = (buff[0] << 24) + (buff[1] << 16);
		else
		if (type == RECORD_EOF)
			// EOF
			break;
    }

	rc = 0;

cleanup:

	if (rc)
		clear();

    if (f)
        fclose(f);

    return rc;
}
Example #3
0
int load_config_file(const char *config)
{
	int rc = -1, line_index = 0;
    FILE* f;
	char line[256];
    chip_family* family = NULL;
    char* name;
    char* param;
    int argc;
    char** argv = NULL;
    int id, mask;
    int ir_length;

	f = fopen(config, "rt");
	if (f == NULL)
	{
        msgf(STR_FAILED_TO_OPEN_CONFIG_FILE);
		return -1;
	}

	for (line_index = 1; !feof(f); line_index++)
	{
		if (fgets(line, sizeof(line), f) == NULL)
			break;

        strip_whitespaces(line);

        // Empty
        if (*line == 0)
            continue;

        // Comment
        if (line[0] == ';' || line[0] == '#')
            continue;

        if (strcasecmp(line, "BEGIN_FAMILY") == 0)
        {
            if (family != NULL)
                goto cleanup;
            family = new chip_family;
            if (family == NULL)
                goto cleanup;
        }
        else
        if (strcasecmp(line, "END_FAMILY") == 0)
        {
            if (family == NULL)
                goto cleanup;

            // Check if NAME, DESC, TYPE exist
            if (family->vars.exists(strNAME) < 0)
                goto cleanup;
            if (family->vars.exists(strDESC) < 0)
                goto cleanup;
            if (family->vars.exists(strTYPE) < 0)
                goto cleanup;

            // Add family to chip database
            g.chips.push_back(family);
            family = NULL;
        }
        else
        {
            name = line;
            param = strchr(line, '=');
            *param = 0;
            param++;

            strip_whitespaces(name);
            strip_whitespaces(param);

            if (*name == 0)
                goto cleanup;

            parse_cmdline_args(param, &argc, &argv);
    
            if (family)
            {
                if (strcasecmp(name, "CHIP") == 0)
                {
                    if (argc != 4)
                        goto cleanup;

                    if (str2num(argv[1], &id) ||
                        str2num(argv[2], &mask) ||
                        str2num(argv[3], &ir_length))
                        goto cleanup;
                    
                    family->push_back(chip(argv[0], id, mask, ir_length, family));
                }
                else
                if (argc > 0)
                    family->vars.add(name, argv[0]);
            }
            else
				g.vars.add(name, param);

            free(argv);
            argv = NULL;
        }
	}
    
    rc = 0;
	
cleanup:

	if (f)
		fclose(f);

    if (family)
        delete family;

    if (argv)
        free(argv);

    if (rc)
        msgf(STR_INVALID_CONFIG_FILE, line_index);

	return rc;
}