/* * Check that the optional printf format in description matches * the type of the magic. */ static int check_format(RMagic *ms, struct r_magic *m) { char *ptr; for (ptr = m->desc; *ptr; ptr++) if (*ptr == '%') break; if (*ptr == '\0') { /* No format string; ok */ return 1; } if (file_nformats != file_nnames) { return -1; } if (m->type >= file_nformats) { file_magwarn(ms, "Internal error inconsistency between " "m->type and format strings"); return -1; } if (magic_file_formats[m->type] == FILE_FMT_NONE) { file_magwarn(ms, "No format string for `%s' with description " "`%s'", m->desc, magic_file_names[m->type]); return -1; } ptr++; if (ptr && check_format_type(ptr, magic_file_formats[m->type]) == -1) { /* * TODO: this error message is unhelpful if the format * string is not one character long */ file_magwarn(ms, "Printf format `%c' is not valid for type " "`%s' in description `%s'", ptr && *ptr ? *ptr : '?', magic_file_names[m->type], m->desc); return -1; } for (; *ptr; ptr++) { if (*ptr == '%') { file_magwarn (ms, "Too many format strings (should have at most one) " "for `%s' with description `%s'", magic_file_names[m->type], m->desc); return -1; } } return 0; }
void MetaEntryVisitor::check_format(std::map<std::string, std::string> & value) const { // It must contain an ID, Number, Type and Description check_key_is_present(FORMAT, ID, value.count(ID)); check_key_is_present(FORMAT, NUMBER, value.count(NUMBER)); check_key_is_present(FORMAT, TYPE, value.count(TYPE)); check_key_is_present(FORMAT, DESCRIPTION, value.count(DESCRIPTION)); check_format_or_info_number(value[NUMBER], FORMAT); check_format_type(value[TYPE]); if (entry.source->version == Version::v41 || entry.source->version == Version::v42) { check_predefined_tag(FORMAT, NUMBER, value, format_v41_v42); check_predefined_tag(FORMAT, TYPE, value, format_v41_v42); } else { check_predefined_tag(FORMAT, NUMBER, value, format_v43); check_predefined_tag(FORMAT, TYPE, value, format_v43); } }
static int check_command_line(struct modbus_params_t *params, int argc, char **argv) { (void)argc; #if LIBMODBUS_VERSION_MAJOR >= 3 if (params->host == NULL && params->serial == NULL && params->file == NULL) { ERR("Not provided or unable to parse host address/serial port name/filename: %s\n", argv[0]); return RESULT_WRONG_ARG; }; #else if (params->host == NULL && params->file == NULL) { ERR("Not provided or unable to parse host address or filename: %s\n", argv[0]); return RESULT_WRONG_ARG; }; #endif #if LIBMODBUS_VERSION_MAJOR >= 3 if (params->serial != NULL) { if (params->serial_mode != MODBUS_RTU_RS232 && params->serial_mode != MODBUS_RTU_RS485) { ERR("%s: Invalid value of serial port mode parameter!\n", argv[0]); return RESULT_WRONG_ARG; } if (check_serial_parity(params->serial_parity)) { ERR("%s: Invalid value of serial port parity mode parameter!\n", argv[0]); return RESULT_WRONG_ARG; } if (params->serial_data_bits < 5 || params->serial_data_bits > 8) { ERR("%s: Invalid value of serial port mode data length parameter!\n", argv[0]); return RESULT_WRONG_ARG; } if (params->serial_stop_bits < 1 || params->serial_stop_bits > 2) { ERR("%s: Invalid value of serial port stop bits parameter!\n", argv[0]); return RESULT_WRONG_ARG; } } #endif if (params->perf_data && (params->perf_label == NULL)) { ERR("Label parameter is required, when performance data is enabled\n"); return RESULT_WRONG_ARG; } if (params->dump_size > 127) { ERR("The maximal number of registers in one dump is 127\n"); return RESULT_WRONG_ARG; } if (check_swap_inverse(params)) return RESULT_WRONG_ARG; if (check_function_num(params)) return RESULT_WRONG_ARG; if (check_format_type(params)) return RESULT_WRONG_ARG; if (check_source(params)) return RESULT_WRONG_ARG; if (check_dump_param(params)) return RESULT_WRONG_ARG; if (dbg_chk_level(DBG_INFO)) print_settings(stdout, params); return RESULT_OK; }