Advertisement
BigETI

repeat.cpp

Mar 4th, 2015
330
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.72 KB | None | 0 0
  1. // Required in g++-4.4
  2. //#define GLIBCXX_USE_NANOSLEEP
  3.  
  4. #include <iostream>
  5. #include <string.h>
  6. #include <thread>
  7.  
  8. #define USAGE_DEFAULT_STR   L"USAGE: repeat <params> <command(s) to execute>\r\n"
  9. #define USAGE_EXTENDED_STR  USAGE_DEFAULT_STR L"\r\nParams:\r\n\t-t<times>\tTimes to execute the command.\r\n\t\t\tUse \"-tI\" or \"-ti\" to execute it infinitely.\r\n\t-s<time>\tTime to sleep between command executions in ms.\r\n\t-f\t\tForce repeating while generating errors.\r\n\t-h\t\tCalls this help\r\n\r\n"
  10. #define USAGE_HINT_STR      L"\tType \"repeat -h\" for help\r\n\r\n"
  11. #define USAGE_STR           USAGE_DEFAULT_STR USAGE_HINT_STR
  12.  
  13. int main(int argc, char *argv[])
  14. {
  15.     int ret = 0, i, times = 0, sleep_time = 0;
  16.     std::string cmd;
  17.     bool cmd_flag = false, times_flag = false, sleep_time_flag = false, force_flag = false, first = true;
  18.     if (argc > 1)
  19.     {
  20.         for (i = 1; i < argc; i++)
  21.         {
  22.             if (cmd_flag)
  23.             {
  24.                 cmd.push_back(' ');
  25.                 cmd += argv[i];
  26.             }
  27.             else
  28.             {
  29.                 if (argv[i][0] == '-')
  30.                 {
  31.                     switch (argv[i][1])
  32.                     {
  33.                     case 't':
  34.                         if (times_flag)
  35.                         {
  36.                             std::wcout << L"Multiple \"-t\" arguments found\r\n" << USAGE_HINT_STR;
  37.                             return 0;
  38.                         }
  39.                         else
  40.                         {
  41.                             if ((argv[i][2] == 'I') || (argv[i][2] == 'i')) times = -1;
  42.                             else if ((argv[i][2] >= '0') && (argv[i][2] <= '9')) times = atoi(&(argv[i][2]));
  43.                             else
  44.                             {
  45.                                 std::cout << "Argument \"" << argv[i] << "\" is invalid\r\n";
  46.                                 std::wcout << USAGE_HINT_STR;
  47.                                 return 0;
  48.                             }
  49.                             times_flag = true;
  50.                         }
  51.                         break;
  52.                     case 's':
  53.                         if (sleep_time_flag)
  54.                         {
  55.                             std::wcout << L"Multiple \"-s\" arguments found\r\n" << USAGE_HINT_STR;
  56.                             return 0;
  57.                         }
  58.                         else
  59.                         {
  60.                             if (argv[i][2] == '\0')
  61.                             {
  62.                                 std::cout << "Argument \"" << argv[i] << "\" is invalid\r\n";
  63.                                 std::wcout << USAGE_HINT_STR;
  64.                                 return 0;
  65.                             }
  66.                             else
  67.                             {
  68.                                 if ((argv[i][2] >= '0') && (argv[i][2] <= '9'))
  69.                                 {
  70.                                     sleep_time = atoi(&(argv[i][2]));
  71.                                     sleep_time_flag = true;
  72.                                 }
  73.                                 else
  74.                                 {
  75.                                     std::cout << "Argument \"" << argv[i] << "\" is invalid\r\n";
  76.                                     std::wcout << USAGE_HINT_STR;
  77.                                     return 0;
  78.                                 }
  79.                             }
  80.                         }
  81.                         break;
  82.                     case 'f':
  83.                         if (force_flag)
  84.                         {
  85.                             std::wcout << L"Multiple \"-f\" arguments found\r\n" << USAGE_HINT_STR;
  86.                             return 0;
  87.                         }
  88.                         else
  89.                         {
  90.                             if (argv[i][2] == '\0') force_flag = true;
  91.                             else
  92.                             {
  93.                                 std::cout << "Argument \"" << argv[i] << "\" is invalid\r\n";
  94.                                 std::wcout << USAGE_HINT_STR;
  95.                                 return 0;
  96.                             }
  97.                         }
  98.                         break;
  99.                     case 'h':
  100.                         std::wcout << USAGE_EXTENDED_STR;
  101.                         return 0;
  102.                     }
  103.                 }
  104.                 else
  105.                 {
  106.                     cmd_flag = true;
  107.                     cmd += argv[i];
  108.                 }
  109.             }
  110.         }
  111.         if (cmd_flag)
  112.         {
  113.             if (times_flag)
  114.             {
  115.                 if (times == -1)
  116.                 {
  117.                     while (true)
  118.                     {
  119.                         if (sleep_time_flag)
  120.                         {
  121.                             if (first) first = false;
  122.                             else std::this_thread::sleep_for(std::chrono::milliseconds(sleep_time));
  123.                         }
  124.                         if (force_flag) system(cmd.c_str());
  125.                         else if (ret = system(cmd.c_str())) break;
  126.                     }
  127.                 }
  128.                 else
  129.                 {
  130.                     for (i = 0; i < times; i++)
  131.                     {
  132.                         if (sleep_time_flag)
  133.                         {
  134.                             if (first) first = false;
  135.                             else std::this_thread::sleep_for(std::chrono::milliseconds(sleep_time));
  136.                         }
  137.                         if (force_flag) system(cmd.c_str());
  138.                         else if (ret = system(cmd.c_str())) break;
  139.                     }
  140.                 }
  141.             }
  142.             else std::wcout << L"Parameter \"-t\" has to be defined\r\n" << USAGE_HINT_STR;
  143.         }
  144.         else std::wcout << USAGE_STR;
  145.     }
  146.     else std::wcout << USAGE_STR;
  147.     return ret;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement