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 }
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; }
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; }