static bool resolve_express_is_function(const string express) { split_result split(split_string(express,"(")); string function_name(split.first),function_arg(separate_string(express,"(",")")); if (resolve_express_is_function_name(function_name) && !function_arg.empty()) return true; return false; }
string resolve_express_function(const string express) { if (!resolve_express_is_function(express)) return ""; split_result split(split_string(express,"|")); string function(split.first),next_function(split.second); left_move_string(next_function,1); string result; while (!function.empty()) { if (!resolve_express_is_function(function)) return function; split=split_string(function,"("); string function_name(upper_string(split.first)),function_arg(separate_string(function,"(",")")); if (function_rnd==function_name) { function_arg=separate_string(function_arg,"[","]"); string down,up; split=split_string(function_arg,"-"); if (1<count_string(function_arg,"-")) { left_move_string(split.second,1); if (resolve_express_is_function(split.second)) { down=split.first; up=split.second; left_move_string(up,1); } else { split=split_string(function_arg,")"); down=split.first; down+=")"; left_move_string(split.second,1); split=split_string(split.second,"-"); left_move_string(split.second,1); up=split.second; } } else { down=split.first; up=split.second; left_move_string(up,1); } if (down.empty() || up.empty()) return ""; if (resolve_express_is_function(down)) down=resolve_express_function(down); if (resolve_express_is_function(up)) up=resolve_express_function(up); long down_=string_to_number(down),up_=string_to_number(up); long rnd=ramdon(down_,up_); result+=number_to_string(rnd); } else if (function_time==function_name) { } else if (function_base64==function_name) { if (!resolve_express_is_function(function_arg)) { return base64_encode(function_arg.c_str(),function_arg.length()); } else { string encode_string(resolve_express_function(function_arg)); return base64_encode(encode_string.c_str(),encode_string.length()); } } else if (function_len==function_name) { unsigned int length=function_arg.length(); return number_to_string(length); } split=split_string(next_function,","); function=split.first; next_function=split.second; left_move_string(next_function,1); } return result; }
int main(int argc, char* argv[]) { try { // set language localize_strings(); // visible command line options po::options_description visible(Strings::tr(Strings::OPT_USAGE)); visible.add_options() ("output,o", po::value<std::string>(), Strings::tr(Strings::OPT_OUTPUT).c_str()) ("create-keys,c", Strings::tr(Strings::OPT_CREATE).c_str()) ("only,O", po::value<std::string>(), Strings::tr(Strings::OPT_ONLY).c_str()) ("sort-bib,s", po::value<std::string>(), Strings::tr(Strings::OPT_SORT_BIB).c_str()) ("sort-elements,S", Strings::tr(Strings::OPT_SORT_ELEMENTS).c_str()) ("erase-field,e", po::value<std::string>(), Strings::tr(Strings::OPT_ERASE_FIELD).c_str()) ("show-missing,m", po::value<char>()->implicit_value('R'), Strings::tr(Strings::OPT_SHOW_MISSING).c_str()) ("missing-fields,M", po::value<std::string>(), Strings::tr(Strings::OPT_MISSING_FIELDS).c_str()) ("change-case", po::value<std::string>()->default_value("L"), Strings::tr(Strings::OPT_CHANGE_CASE).c_str()) ("linebreak", po::value<unsigned int>(), Strings::tr(Strings::OPT_LINEBREAK).c_str()) ("intendation", po::value<std::string>(), Strings::tr(Strings::OPT_INTENDATION).c_str()) ("delimiter", po::value<char>(), Strings::tr(Strings::OPT_DELIMITER).c_str()) ("align-left", Strings::tr(Strings::OPT_ALIGN_LEFT).c_str()) ("abbrev-month", Strings::tr(Strings::OPT_ABBREV_MONTH).c_str()) ("new-entry,n", Strings::tr(Strings::OPT_NEW_ENTRY).c_str()) ("help", Strings::tr(Strings::OPT_HELP).c_str()) ("version", Strings::tr(Strings::OPT_VERSION).c_str()) ; // hidden command line options po::options_description hidden; hidden.add_options() ("input-files", po::value< std::vector<std::string> >(), Strings::tr(Strings::OPT_INPUT).c_str()) ; // positional options are interpreted as input-file po::positional_options_description pod; pod.add("input-files", -1); // all options po::options_description opts; opts.add(visible).add(hidden); // create variables map po::variables_map vm; po::store(po::command_line_parser(argc, argv). options(opts).positional(pod).run(), vm); po::notify(vm); // help message if (vm.count("help")) { std::cout << visible << "\n"; return 0; } // version message if (vm.count("version")) { std::cout << Strings::tr(Strings::OUT_VERSION); return 0; } // create empty Bibliography Bibliography bib; // input file if (vm.count("input-files")) { std::vector<std::string> filenames = vm["input-files"].as< std::vector<std::string> >(); for (std::string &filename : filenames) { std::ifstream bibFile(filename.c_str()); bib.add(bibFile); bibFile.close(); } } else if (vm.count("new-entry")) { bib.create_entry(); } else { bib.add(std::cin); } // set output file std::ofstream out; if (vm.count("output")) { out.open(vm["output"].as<std::string>()); } // change case of field ids if (vm.count("change-case")) { std::string cases = vm["change-case"].as<std::string>(); if (cases.length() == 1) bib.change_case(cases[0], cases[0]); else if (cases.length() == 2) bib.change_case(cases[0], cases[1]); else { std::cerr << Strings::tr(Strings::ERR_CHANGE_CASE); return 1; } } // linebreak if (vm.count("linebreak")) bib.set_linebreak(vm["linebreak"].as<unsigned int>()); // intendation if (vm.count("intendation")) bib.set_intendation(vm["intendation"].as<std::string>()); // delimiter if (vm.count("delimiter")) { char delim = vm["delimiter"].as<char>(); if ((delim == '{') || (delim == '}')) bib.set_field_delimiter('{', '}'); else if (delim == '"') bib.set_field_delimiter('"', '"'); else std::cerr << Strings::tr(Strings::ERR_DELIMITER) << delim << "\n"; } // alignment if (vm.count("align-left")) { bool right_aligned = false; bib.set_alignment(right_aligned); } // abbreviate months if (vm.count("abbrev-month")) bib.abbreviate_month(); // erase fields if (vm.count("erase-field")) { std::vector<std::string> erase_vec = separate_string(vm["erase-field"].as<std::string>()); for (const std::string &erase : erase_vec) bib.erase_field(erase); } // sort bibliography if (vm.count("sort-bib")) { std::vector<std::string> sort = separate_string( vm["sort-bib"].as<std::string>() ); bib.sort_bib(sort); } // sort elements if (vm.count("sort-elements")) { bib.sort_elements(); } // create keys if (vm.count("create-keys")) bib.create_keys(); // show missing fields if (vm.count("show-missing")) { char mode = vm["show-missing"].as<char>(); bool only_required = true; if (mode == 'O') only_required = false; bib.show_missing_fields(only_required); return 0; } // show user defined missing fields if (vm.count("missing-fields")) { std::vector<std::string> fields = separate_string( vm["missing-fields"].as<std::string>() ); bib.show_missing_fields(fields); return 0; } // print only given fields if (vm.count("only")) { std::vector<std::string> only = separate_string(vm["only"].as<std::string>()); if (out.is_open()) bib.print_bib( only, out); else bib.print_bib(only, std::cout); return 0; } // standard action, print bib if (out.is_open()) bib.print_bib(out); else bib.print_bib(std::cout); // close output stream if (out.is_open()) out.close(); } catch(std::exception& e) { std::cerr << "error: " << e.what() << "\n"; return 1; } catch(...) { std::cerr << "Unknown exception.\n"; return 1; } return EXIT_SUCCESS; }
/* This function takes the command which you want to know the information * from, writes it into the OBD, reads the answer, translates it into human * readable information. * Arguments: * fd: file descriptor. * i: number of the desired parameter. * answer: where the final value is going to be stored. * value: a pointer to a OBD_value structure with OBD data. * Return value: * r: characters read not including EOL nor final zero. * n: number of bytes written. * OBD_EMPTY: non block input returned inmediately when using non * blocking input. * OBD_CLOSED: fd is closed. * OBD_TIMEOUT: blocking input didn't answer before specified timeout. * OBD_ERROR: other errors. * OBD_FIELDS: Error when getting the answer. * OBD_COMMAND: Error matching answer with command. */ int read_parameter(int fd, int i, char *answer, OBD_value *value) { unsigned int n, r, A, B, C, D, commandACK; char buffer[HEXLENGTH], vinstring[OBDV_MAXSTR]; int fields; sprintf(buffer, "%04X", obd_parameters[i].obdp_code); n = write_obdmsg(fd, buffer); if (n == OBD_WRITE) return OBD_WRITE; if (obd_parameters[i].obdp_code != 0x0902) { r = read_msg(fd, answer, MAX_ANSWER, 0); if (r <= 0) return r; fields = separate_string(answer, &commandACK, &A, &B, &C, &D); if (fields < 2) { perror("read_parameter: unexpected error when getting answer\n"); return OBD_FIELDS; } else { if (obd_parameters[i].obdp_code != commandACK) { perror("read_parameter: error matching command with answer\n"); return OBD_COMMAND; } value->obdv_parameter = obd_parameters[i].obdp_code; value->obdv_ts = time(NULL); strncpy(value->obdv_value.str, "", OBDV_MAXSTR); switch (obd_parameters[i].obdp_code) { case 0x0104: //Calculated engine load value->obdv_value.w = 100 * A / 255; sprintf(answer, "%f", value->obdv_value.w); break; case 0x0105: //Engine coolant temperature value->obdv_value.i = A - 40; sprintf(answer, "%d", value->obdv_value.i); break; case 0x010B: //Intake manifold absolute pressure value->obdv_value.i = A; sprintf(answer, "%d", value->obdv_value.i); break; case 0x010C: //Engine RPM value->obdv_value.w = (256 * A + B) / 4; sprintf(answer, "%f", value->obdv_value.w); break; case 0x010D: //Vehicle speed value->obdv_value.i = A; sprintf(answer, "%d", value->obdv_value.i); break; case 0x010F: //Intake air temperature value->obdv_value.i = A - 40; sprintf(answer, "%d", value->obdv_value.i); break; case 0x0110: //MAF air flow rate value->obdv_value.w = (256 * A + B) / 100; sprintf(answer, "%f", value->obdv_value.w); break; case 0x0111: //Throttle position value->obdv_value.w = 100 * A / 255; sprintf(answer, "%f", value->obdv_value.w); break; case 0x011F: //Run time since engine start value->obdv_value.i = 256 * A + B; sprintf(answer, "%d", value->obdv_value.i); break; case 0x0123: //Fuel Rail Gauge Pressure value->obdv_value.i = 10 * (256 * A + B); sprintf(answer, "%d", value->obdv_value.i); break; case 0x0133: //Absolute Barometric Pressure value->obdv_value.i = A; sprintf(answer, "%d", value->obdv_value.i); break; case 0x0134: //Oxygen Sensor 1 Fuel–Air Equivalence Ratio value->obdv_value.w = 2 * (256 * A + B) / 65536; sprintf(answer, "%f", value->obdv_value.w); break; case 0x0145: //Relative throttle position value->obdv_value.w = (100 * A) / 255; sprintf(answer, "%f", value->obdv_value.w); break; case 0x0146: //Ambient air temperature value->obdv_value.i = A - 40; sprintf(answer, "%d", value->obdv_value.i); break; case 0x0149: //Accelerator pedal position D value->obdv_value.w = (100 * A) / 255; sprintf(answer, "%f", value->obdv_value.w); break; case 0x014A: //Accelerator pedal position E value->obdv_value.i = (100 * A) / 255; sprintf(answer, "%d", value->obdv_value.i); break; case 0x014C: //Commanded throttle actuator value->obdv_value.i = (100 * A) / 255; sprintf(answer, "%d", value->obdv_value.i); break; case -1: return OBD_END; } } } else { r = read_VINmsg(fd, answer, MAX_ANSWER, 0); printf("Hola el answer es :%s\n", answer); //TODO eliminar es solo chequeo fields = separate_VINstring(answer, &commandACK, vinstring); //TODO defininar lo del 2 de fields puts(vinstring); //printf("\n Command: %d", commandACK); if (fields < 2) { perror("read_parameter: unexpected error when getting VIN answer\n"); return OBD_FIELDS; } else { if (obd_parameters[i].obdp_code != commandACK) { perror("read_parameter: error matching command with VIN answer\n"); return OBD_COMMAND; } value->obdv_parameter = obd_parameters[i].obdp_code; value->obdv_ts = time(NULL); strncpy(value->obdv_value.str, vinstring, OBDV_MAXSTR); } } return r; }