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;
}
예제 #3
0
파일: bibf.cpp 프로젝트: ddast/bibf
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;
}
예제 #4
0
파일: libLM327com.c 프로젝트: asecking/TFG
    /* 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;
    }