Advertisement
AlvinSeville7cf

chart.bat

Jan 24th, 2021 (edited)
395
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Batch 35.80 KB | None | 0 0
  1. @echo off
  2. setlocal
  3.  
  4. call :init
  5. set /a "init_error_level=%errorlevel%"
  6. if %init_error_level% gtr 0 exit /b %init_error_level%
  7.  
  8. call :clear_arguments args
  9.  
  10. set /a "i=0"
  11. :copy_options
  12.     set "option=%~1"
  13.     if defined option (
  14.         set "args[%i%]=%option%"
  15.         shift
  16.         set /a "i+=1"
  17.         goto copy_options
  18.     )
  19.  
  20. call :expand_sugar_options args
  21. set /a "temp_error_level=%errorlevel%"
  22. if %temp_error_level% gtr 0 exit /b %temp_error_level%
  23.  
  24. set /a "i=0"
  25. :main_loop
  26.     set /a "j=%i% + 1"
  27.     call set "option=%%args[%i%]%%"
  28.     call set "value=%%args[%j%]%%"
  29.  
  30.     set /a "is_help=%false%"
  31.     if "%option%" == "-h" set /a "is_help=%true%"
  32.     if "%option%" == "--help" set /a "is_help=%true%"
  33.  
  34.     if "%is_help%" == "%true%" (
  35.         call :help
  36.         exit /b %ec_success%
  37.     )
  38.  
  39.     set /a "is_version=%false%"
  40.     if "%option%" == "-v" set /a "is_version=%true%"
  41.     if "%option%" == "--version" set /a "is_version=%true%"
  42.  
  43.     if "%is_version%" == "%true%" (
  44.         call :version
  45.         exit /b %ec_success%
  46.     )
  47.  
  48.     set /a "is_interactive=%false%"
  49.     if "%option%" == "-i" set /a "is_interactive=%true%"
  50.     if "%option%" == "--interactive" set /a "is_interactive=%true%"
  51.  
  52.     if "%is_interactive%" == "%true%" (
  53.         call :interactive
  54.         exit /b %ec_success%
  55.     )
  56.  
  57.     set /a "is_width=%false%"
  58.     if "%option%" == "-w" set /a "is_width=%true%"
  59.     if "%option%" == "--width" set /a "is_width=%true%"
  60.  
  61.     if "%is_width%" == "%true%" (
  62.         set /a "width=%value%"
  63.         set /a "i+=2"
  64.         goto main_loop
  65.     )
  66.  
  67.     call :parse_chart_data i args data_value data_color data_char data_placeholder_char
  68.     set /a "temp_errorlevel=%errorlevel%"
  69.     if %temp_errorlevel% gtr 0 exit /b %temp_errorlevel%
  70.  
  71.     call :try_draw_chart data_value data_color data_char data_placeholder_char
  72.     set /a "temp_error_level=%errorlevel%"
  73.     if %temp_error_level% gtr 0 exit /b %temp_error_level%
  74.     exit /b %ec_success%
  75.  
  76. :init
  77.     set /a "ec_success=0"
  78.     set /a "ec_bc_not_found=10"
  79.  
  80.     set "em_bc_not_found=bc utility not found to perform calculations with float numbers."
  81.  
  82.     set /a "true=0"
  83.     set /a "false=1"
  84.  
  85.     set "prompt=>>> "
  86.     set "number_regex=^[0-9][0-9]*$"
  87.  
  88.     set /a "default_width=10"
  89.     set /a "width=%default_width%"
  90.  
  91.     set "default_char=-"
  92.     set "default_placeholder_char= "
  93.  
  94.     call :set_esc
  95.  
  96.     set "default_color_code=%esc%[0m"
  97.  
  98.     bc --version 2> nul > nul || (
  99.         echo %em_bc_not_found%
  100.         exit /b %ec_bc_not_found%
  101.     )
  102. exit /b %ec_success%
  103.  
  104. :help
  105.     echo Creates simple chart.
  106.     echo.
  107.     echo Syntax:
  108.     echo    chart [options] [value { [options] } [value { [options] }]...]
  109.     echo.
  110.     echo Options:
  111.     echo    -h^|--help - writes help and exits
  112.     echo    -v^|--version - writes version and exits
  113.     echo    -i^|--interactive - fall in interactive mode
  114.     echo    -w^|--width - chart item width
  115.     echo    -f^|--foreground - specifies --item-foreground for all chart items (user defined values take precedence)
  116.     echo        Available value set is: black, red, green, yellow, blue, purple, cyan, white, random, random-all.
  117.     echo    -b^|--background - specifies --item-background for all chart items (user defined values take precedence)
  118.     echo        Available value set is: black, red, green, yellow, blue, purple, cyan, white, random, random-all.
  119.     echo    -c^|--char - specifies --item-char for all chart items (user defined values take precedence)
  120.     echo    -pc^|--placeholder-char - specifies --item-placeholder-char for all chart items (user defined values take precedence)
  121.     echo.
  122.     echo Style options:
  123.     echo    -if^|--item-foreground - specifies chart item foreground color
  124.     echo    -ib^|--item-background - specifies chart item background color
  125.     echo    -ic^|--item-char - specifies chart item char used to display it
  126.     echo    -ipc^|--item-placeholder-char - specifies chart item placeholder char used to display it
  127.     echo.
  128.     echo Interactive mode commands:
  129.     echo    q^|quit - exits
  130.     echo    c^|clear - clears screen
  131.     echo    h^|help - writes help
  132.     echo.
  133.     echo Error codes:
  134.     echo    - 0 - Success
  135.     echo    - 10 - bc utility not found to perform calculations with float numbers.
  136.     echo    - 20 - Unexpected value instead of nonnegative number.
  137.     echo    - 30 - No data provided to draw chart.
  138.     echo    - 40 - Unexpected value instead of nonnegative number.
  139.     echo    - 50 - Missing opening curly brace ^({^).
  140.     echo    - 51 - Missing closing curly brace ^(}^).
  141.     echo    - 60 - Unexpected foreground color name. Valid color name set is: black, red, green, yellow, blue, purple, cyan, white, random.
  142.     echo    - 70 - Unexpected background color name. Valid color name set is: black, red, green, yellow, blue, purple, cyan, white, random.
  143.     echo.
  144.     echo Examples:
  145.     echo    - chart --help
  146.     echo    - chart 1 5 3
  147.     echo    - chart 1 { --item-foreground red } 5 { --item-foreground green } 3 { --item-foreground blue }
  148.     echo    - chart --foreground red 1 2 3 =^> is converted to =^> chart 1 { --item-foreground red } 2 { --item-foreground red } 3 { --item-foreground red }
  149.     echo    - chart --foreground random 1 2 3 =^> is converted to =^> chart --foreground ^<random-color^> 1 2 3 =^> is converted to =^> chart 1 { --item-foreground ^<random-color^> } 2 { --item-foreground ^<random-color^> } 3 { --item-foreground ^<random-color^> }
  150.     echo    - chart --foreground random-all 1 2 3 =^> is converted to =^> chart 1 { --item-foreground ^<random-color-for-1^> } 2 { --item-foreground ^<random-color-for-2^> } 3 { --item-foreground ^<random-color-for-3^> }
  151. exit /b %ec_success%
  152.  
  153. :version
  154.     echo 1.1 ^(c^) 2021 year
  155. exit /b %ec_success%
  156.  
  157. :interactive
  158.     set "i_em_help_option_is_not_available=--help option is not available in ineractive mode. You have to use help command."
  159.     set "i_em_version_option_is_not_available=--version option is not available in ineractive mode."
  160.     set "i_em_interactive_option_is_not_available=--interactive option is not available in ineractive mode."
  161.  
  162.     set /a "i_last_errorlevel=0"
  163.  
  164.     :interactive_loop
  165.         set /a "i_color_code=32"
  166.         if not %i_last_errorlevel% == 0 set /a "i_color_code=31"
  167.         set "i_command="
  168.         call :clear_arguments i_args
  169.         set /p "i_command=%esc%[%i_color_code%m%i_last_errorlevel% %prompt%%esc%[0m"
  170.        
  171.         if not defined i_command goto interactive_loop
  172.         if "%i_command: =%" == "" goto interactive_loop
  173.        
  174.         call :to_array i_args %i_command%
  175.  
  176.         set "i_first=%i_args[0]%"
  177.        
  178.         set "i_comment_regex=^#.*$"
  179.         echo %i_first%| findstr /r "%i_comment_regex%" 2> nul > nul && goto interactive_loop
  180.  
  181.         call set "i_command=%%i_command:!!=%i_previous_command%%%"
  182.         call :to_array i_args %i_command%
  183.  
  184.         set "i_first=%i_args[0]%"
  185.  
  186.         set /a "i_is_quit=%false%"
  187.         if "%i_first%" == "q" set /a "i_is_quit=%true%"
  188.         if "%i_first%" == "quit" set /a "i_is_quit=%true%"
  189.  
  190.         if "%i_is_quit%" == "%true%" exit /b %ec_success%
  191.    
  192.         set /a "i_is_clear=%false%"
  193.         if "%i_first%" == "c" set /a "i_is_clear=%true%"
  194.         if "%i_first%" == "clear" set /a "i_is_clear=%true%"
  195.  
  196.         if "%i_is_clear%" == "%true%" (
  197.             cls
  198.             goto interactive_loop
  199.         )
  200.  
  201.         set /a "i_is_help=%false%"
  202.         if "%i_first%" == "h" set /a "i_is_help=%true%"
  203.         if "%i_first%" == "help" set /a "i_is_help=%true%"
  204.  
  205.         if "%i_is_help%" == "%true%" (
  206.             call :help
  207.             goto interactive_loop
  208.         )
  209.  
  210.         call :expand_sugar_options i_args
  211.         set /a "i_temp_error_level=%errorlevel%"
  212.         if %i_temp_error_level% gtr 0 goto interactive_loop
  213.  
  214.         set "i_previous_command=%i_command%"
  215.  
  216.         set /a "i_i=0"
  217.         :i_main_loop
  218.             set /a "i_j=%i_i% + 1"
  219.             call set "i_option=%%i_args[%i_i%]%%"
  220.             call set "i_value=%%i_args[%i_j%]%%"
  221.  
  222.             set /a "i_is_help=%false%"
  223.             if "%i_option%" == "-h" set /a "i_is_help=%true%"
  224.             if "%i_option%" == "--help" set /a "i_is_help=%true%"
  225.  
  226.             if "%i_is_help%" == "%true%" (
  227.                 echo %i_em_help_option_is_not_available%
  228.                 goto interactive_loop
  229.             )
  230.  
  231.             set /a "i_is_version=%false%"
  232.             if "%i_option%" == "-v" set /a "i_is_version=%true%"
  233.             if "%i_option%" == "--version" set /a "i_is_version=%true%"
  234.  
  235.             if "%i_is_version%" == "%true%" (
  236.                 echo %i_em_version_option_is_not_available%
  237.                 goto interactive_loop
  238.             )
  239.  
  240.             set /a "i_is_interactive=%false%"
  241.             if "%i_option%" == "-i" set /a "i_is_interactive=%true%"
  242.             if "%i_option%" == "--interactive" set /a "i_is_interactive=%true%"
  243.  
  244.             if "%i_is_interactive%" == "%true%" (
  245.                 echo %i_em_interactive_option_is_not_available%
  246.                 goto interactive_loop
  247.             )
  248.  
  249.             set /a "i_is_width=%false%"
  250.             if "%i_option%" == "-w" set /a "i_is_width=%true%"
  251.             if "%i_option%" == "--width" set /a "i_is_width=%true%"
  252.  
  253.             if "%i_is_width%" == "%true%" (
  254.                 set /a "width=%i_value%"
  255.                 set /a "i_i+=2"
  256.                 goto i_main_loop
  257.             )
  258.  
  259.             call :parse_chart_data i_i i_args i_data_value i_data_color i_data_char i_data_placeholder_char
  260.             set /a "i_temp_errorlevel=%errorlevel%"
  261.             if %i_temp_errorlevel% gtr 0 goto interactive_loop
  262.  
  263.             call :try_draw_chart i_data_value i_data_color i_data_char i_data_placeholder_char
  264.             goto interactive_loop
  265. exit /b %ec_success%
  266.  
  267. :clear_arguments
  268.     set "ca_array_name=%~1"
  269.  
  270.     set /a "ca_i=0"
  271.     :ca_clear_arguments_loop
  272.         call set "ca_argument=%%%ca_array_name%[%ca_i%]%%"
  273.         if defined ca_argument (
  274.             set "%ca_array_name%[%ca_i%]="
  275.             set /a "ca_i+=1"
  276.             goto ca_clear_arguments_loop
  277.         )
  278. exit /b %ec_success%
  279.  
  280. :to_array
  281.     set "ta_array_name=%~1"
  282.  
  283.     shift
  284.     set /a "ta_i=0"
  285.     :ta_conversion_loop
  286.         set "ta_argument=%~1"
  287.         if defined ta_argument (
  288.             set "%ta_array_name%[%ta_i%]=%ta_argument%"
  289.             set /a "ta_i+=1"
  290.             shift
  291.             goto ta_conversion_loop
  292.         )
  293. exit /b %ec_success%
  294.  
  295. :expand_sugar_options
  296.     set /a "eso_ec_unexpected_value=20"
  297.  
  298.     set "eso_em_unexpected_value=Unexpected value instead of nonnegative number while expanding --foreground^|--background^|--char^|--placeholder-char."
  299.  
  300.     set "eso_args_array_name=%~1"
  301.  
  302.     set /a "eso_temp_errorlevel=%errorlevel%"
  303.     if %eso_temp_errorlevel% gtr 0 exit /b %eso_temp_errorlevel%
  304.  
  305.     set "eso_temp_foreground_value="
  306.     set "eso_temp_background_value="
  307.     set /a "eso_temp_foreground_value_is_random_for_all=%false%"
  308.     set /a "eso_temp_background_value_is_random_for_all=%false%"
  309.     set "eso_temp_char_value="
  310.     set "eso_temp_placeholder_char_value="
  311.  
  312.     set /a "eso_i=0"
  313.     :eso_expand_options_loop
  314.         set /a "eso_j=%eso_i% + 1"
  315.  
  316.         if not defined %eso_args_array_name%[%eso_i%] exit /b %ec_success%
  317.  
  318.         call set "eso_option=%%%eso_args_array_name%[%eso_i%]%%"
  319.         call set "eso_value=%%%eso_args_array_name%[%eso_j%]%%"
  320.  
  321.         set /a "eso_is_foreground=%false%"
  322.         if "%eso_option%" == "-f" set /a "eso_is_foreground=%true%"
  323.         if "%eso_option%" == "--foreground" set /a "eso_is_foreground=%true%"
  324.  
  325.         if "%eso_is_foreground%" == "%true%" goto eso_if_eso_is_foreground_equal_to_true
  326.  
  327.         set /a "eso_is_background=%false%"
  328.         if "%eso_option%" == "-b" set /a "eso_is_background=%true%"
  329.         if "%eso_option%" == "--background" set /a "eso_is_background=%true%"
  330.  
  331.         if "%eso_is_background%" == "%true%" goto eso_if_eso_is_background_equal_to_true
  332.  
  333.         set /a "eso_is_char=%false%"
  334.         if "%eso_option%" == "-c" set /a "eso_is_char=%true%"
  335.         if "%eso_option%" == "--char" set /a "eso_is_char=%true%"
  336.  
  337.         if "%eso_is_char%" == "%true%" (
  338.             set "eso_temp_char_value=%eso_value:~0,1%"
  339.  
  340.             call :remove_array_item "%eso_args_array_name%" "%eso_i%"
  341.             call :remove_array_item "%eso_args_array_name%" "%eso_i%"
  342.             goto eso_expand_options_loop
  343.         )
  344.  
  345.         set /a "eso_is_placeholder_char=%false%"
  346.         if "%eso_option%" == "-pc" set /a "eso_is_placeholder_char=%true%"
  347.         if "%eso_option%" == "--placeholder-char" set /a "eso_is_placeholder_char=%true%"
  348.  
  349.         if "%eso_is_placeholder_char%" == "%true%" (
  350.             set "eso_temp_placeholder_char_value=%eso_value:~0,1%"
  351.  
  352.             call :remove_array_item "%eso_args_array_name%" "%eso_i%"
  353.             call :remove_array_item "%eso_args_array_name%" "%eso_i%"
  354.             goto eso_expand_options_loop
  355.         )
  356.  
  357.         set /a "eso_is_skippable_option_with_value=%false%"
  358.         if "%eso_option%" == "-w" set /a "eso_is_skippable_option_with_value=%true%"
  359.         if "%eso_option%" == "--width" set /a "eso_is_skippable_option_with_value=%true%"
  360.  
  361.         if "%eso_is_skippable_option_with_value%" == "%true%" (
  362.             set /a "eso_i+=2"
  363.             goto eso_expand_options_loop
  364.         )
  365.  
  366.         set /a "eso_is_skippable_option_without_value=%false%"
  367.         if "%eso_option%" == "-h" set /a "eso_is_skippable_option_without_value=%true%"
  368.         if "%eso_option%" == "--help" set /a "eso_is_skippable_option_without_value=%true%"
  369.         if "%eso_option%" == "-v" set /a "eso_is_skippable_option_without_value=%true%"
  370.         if "%eso_option%" == "--version" set /a "eso_is_skippable_option_without_value=%true%"
  371.         if "%eso_option%" == "-i" set /a "eso_is_skippable_option_without_value=%true%"
  372.         if "%eso_option%" == "--interactive" set /a "eso_is_skippable_option_without_value=%true%"
  373.  
  374.         if "%eso_is_skippable_option_without_value%" == "%true%" (
  375.             set /a "eso_i+=1"
  376.             goto eso_expand_options_loop
  377.         )
  378.  
  379.         call set "eso_value=%%%eso_args_array_name%[%eso_i%]%%"
  380.         call set "eso_next_argument=%%%eso_args_array_name%[%eso_j%]%%"
  381.  
  382.         echo %eso_value%| findstr /r "%number_regex%" 2> nul > nul || (
  383.             echo %eso_em_unexpected_value%
  384.             exit /b %eso_ec_unexpected_value%
  385.         )
  386.  
  387.         if not "%eso_next_argument%" == "{" (
  388.             call :insert_array_item "%eso_args_array_name%" "}" "%eso_j%"
  389.             call :insert_array_item "%eso_args_array_name%" "{" "%eso_j%"
  390.         )
  391.  
  392.         set /a "eso_i+=2"
  393.  
  394.         set /a "eso_temp_random_foreground=0"
  395.         set /a "eso_temp_random_background=0"
  396.  
  397.         call :random_foreground_color_code eso_temp_random_foreground
  398.         call :random_background_color_code eso_temp_random_background
  399.  
  400.         if defined eso_temp_foreground_value (
  401.             if "%eso_temp_foreground_value_is_random_for_all%" == "%true%" (
  402.                 call :insert_array_item "%eso_args_array_name%" "%eso_temp_random_foreground%" "%eso_i%"
  403.             ) else (
  404.                 call :insert_array_item "%eso_args_array_name%" "%eso_temp_foreground_value%" "%eso_i%"
  405.             )
  406.             call :insert_array_item "%eso_args_array_name%" "--item-foreground" "%eso_i%"
  407.             set /a "eso_i+=2"
  408.         )
  409.         if defined eso_temp_background_value (
  410.             if "%eso_temp_background_value_is_random_for_all%" == "%true%" (
  411.                 call :insert_array_item "%eso_args_array_name%" "%eso_temp_random_background%" "%eso_i%"
  412.             ) else (
  413.                 call :insert_array_item "%eso_args_array_name%" "%eso_temp_background_value%" "%eso_i%"
  414.             )
  415.             call :insert_array_item "%eso_args_array_name%" "--item-background" "%eso_i%"
  416.             set /a "eso_i+=2"
  417.         )
  418.         if defined eso_temp_char_value (
  419.             call :insert_array_item "%eso_args_array_name%" "%eso_temp_char_value%" "%eso_i%"
  420.             call :insert_array_item "%eso_args_array_name%" "--item-char" "%eso_i%"
  421.             set /a "eso_i+=2"
  422.         )
  423.         if defined eso_temp_placeholder_char_value (
  424.             call :insert_array_item "%eso_args_array_name%" "%eso_temp_placeholder_char_value%" "%eso_i%"
  425.             call :insert_array_item "%eso_args_array_name%" "--item-placeholder-char" "%eso_i%"
  426.             set /a "eso_i+=2"
  427.         )
  428.  
  429.         :eso_move_to_closing_brace
  430.             call set "eso_argument=%%%eso_args_array_name%[%eso_i%]%%"
  431.             if not defined eso_argument exit /b %ec_success%
  432.             if not "%eso_argument%" == "}" (
  433.                 set /a "eso_i+=1"
  434.                 goto eso_move_to_closing_brace
  435.             )
  436.        
  437.         set /a "eso_i+=1"
  438.         goto eso_expand_options_loop
  439. exit /b %ec_success%
  440.  
  441. :eso_if_eso_is_foreground_equal_to_true
  442.     if "%eso_value%" == "random-all" (
  443.         set /a "eso_temp_foreground_value_is_random_for_all=%true%"
  444.         set /a "eso_temp_foreground_value=0"
  445.         goto eso_remove_array_items_for_foreground_color_option
  446.     )
  447.     call :to_foreground_color_code eso_temp_foreground_value "%eso_value%"
  448.     set /a "eso_temp_errorlevel=%errorlevel%"
  449.     if %eso_temp_errorlevel% gtr 0 exit /b %eso_temp_errorlevel%
  450.     set /a "eso_temp_foreground_value_is_random_for_all=%false%"
  451.  
  452.     :eso_remove_array_items_for_foreground_color_option
  453.     call :remove_array_item "%eso_args_array_name%" "%eso_i%"
  454.     call :remove_array_item "%eso_args_array_name%" "%eso_i%"
  455.     goto eso_expand_options_loop
  456.  
  457. :eso_if_eso_is_background_equal_to_true
  458.     if "%eso_value%" == "random-all" (
  459.         set /a "eso_temp_background_value_is_random_for_all=%true%"
  460.         set /a "eso_temp_background_value=0"
  461.         goto eso_remove_array_items_for_background_color_option
  462.     )
  463.     call :to_background_color_code eso_temp_background_value "%eso_value%"
  464.     set /a "eso_temp_errorlevel=%errorlevel%"
  465.     if %eso_temp_errorlevel% gtr 0 exit /b %eso_temp_errorlevel%
  466.     set /a "eso_temp_background_value_is_random_for_all=%false%"
  467.  
  468.     :eso_remove_array_items_for_background_color_option
  469.     call :remove_array_item "%eso_args_array_name%" "%eso_i%"
  470.     call :remove_array_item "%eso_args_array_name%" "%eso_i%"
  471.     goto eso_expand_options_loop
  472.  
  473. :expand_sugar_options_random_colors
  474.     set /a "esorc_ec_unexpected_value=20"
  475.  
  476.     set "esorc_em_unexpected_value=Unexpected value instead of nonnegative number while expanding random colors."
  477.  
  478.     set "esorc_args_array_name=%~1"
  479.  
  480.     set /a "esorc_i=0"
  481.     :esorc_expand_options_loop
  482.         set /a "esorc_j=%esorc_i% + 1"
  483.  
  484.         if not defined %esorc_args_array_name%[%esorc_i%] exit /b %ec_success%
  485.  
  486.         call set "esorc_option=%%%esorc_args_array_name%[%esorc_i%]%%"
  487.         call set "esorc_value=%%%esorc_args_array_name%[%esorc_j%]%%"
  488.  
  489.         set /a "esorc_is_foreground_or_item_foreground=%false%"
  490.         if "%esorc_option%" == "-f" set /a "esorc_is_foreground_or_item_foreground=%true%"
  491.         if "%esorc_option%" == "--foreground" set /a "esorc_is_foreground_or_item_foreground=%true%"
  492.         if "%esorc_option%" == "-if" set /a "esorc_is_foreground_or_item_foreground=%true%"
  493.         if "%esorc_option%" == "--item-foreground" set /a "esorc_is_foreground_or_item_foreground=%true%"
  494.  
  495.         if "%esorc_is_foreground_or_item_foreground%" == "%true%" (
  496.             if not "%esorc_value%" == "random-all" call :random_foreground_color_code "%esorc_args_array_name%[%esorc_j%]"
  497.  
  498.             set /a "esorc_i+=2"
  499.             goto esorc_expand_options_loop
  500.         )
  501.  
  502.         set /a "esorc_is_background_or_item_background=%false%"
  503.         if "%esorc_option%" == "-b" set /a "esorc_is_background_or_item_background=%true%"
  504.         if "%esorc_option%" == "--background" set /a "esorc_is_background_or_item_background=%true%"
  505.         if "%esorc_option%" == "-ib" set /a "esorc_is_background_or_item_background=%true%"
  506.         if "%esorc_option%" == "--item-background" set /a "esorc_is_background_or_item_background=%true%"
  507.  
  508.         if "%esorc_is_background_or_item_background%" == "%true%" (
  509.             if not "%esorc_value%" == "random-all" call :random_background_color_code "%esorc_args_array_name%[%esorc_j%]"
  510.  
  511.             set /a "esorc_i+=2"
  512.             goto esorc_expand_options_loop
  513.         )
  514.  
  515.         set /a "esorc_is_skippable_option_with_value=%false%"
  516.         if "%esorc_option%" == "-w" set /a "esorc_is_skippable_option_with_value=%true%"
  517.         if "%esorc_option%" == "--width" set /a "esorc_is_skippable_option_with_value=%true%"
  518.  
  519.         if "%esorc_is_skippable_option_with_value%" == "%true%" (
  520.             set /a "esorc_i+=2"
  521.             goto esorc_expand_options_loop
  522.         )
  523.  
  524.         set /a "esorc_is_skippable_option_without_value_or_brace=%false%"
  525.         if "%esorc_option%" == "-h" set /a "esorc_is_skippable_option_without_value_or_brace=%true%"
  526.         if "%esorc_option%" == "--help" set /a "esorc_is_skippable_option_without_value_or_brace=%true%"
  527.         if "%esorc_option%" == "-v" set /a "esorc_is_skippable_option_without_value_or_brace=%true%"
  528.         if "%esorc_option%" == "--version" set /a "esorc_is_skippable_option_without_value_or_brace=%true%"
  529.         if "%esorc_option%" == "-i" set /a "esorc_is_skippable_option_without_value_or_brace=%true%"
  530.         if "%esorc_option%" == "--interactive" set /a "esorc_is_skippable_option_without_value_or_brace=%true%"
  531.         if "%esorc_option%" == "{" set /a "esorc_is_skippable_option_without_value_or_brace=%true%"
  532.         if "%esorc_option%" == "}" set /a "esorc_is_skippable_option_without_value_or_brace=%true%"
  533.  
  534.         if "%esorc_is_skippable_option_without_value_or_brace%" == "%true%" (
  535.             set /a "esorc_i+=1"
  536.             goto esorc_expand_options_loop
  537.         )
  538.  
  539.         call set "esorc_value=%%%esorc_args_array_name%[%esorc_i%]%%"
  540.  
  541.         echo %esorc_value%| findstr /r "%number_regex%" 2> nul > nul || (
  542.             echo %esorc_em_unexpected_value%
  543.             exit /b %esorc_ec_unexpected_value%
  544.         )
  545.  
  546.         set /a "esorc_i+=1"
  547.         goto esorc_expand_options_loop
  548. exit /b %ec_success%
  549.  
  550. :try_draw_chart
  551.     set /a "tdc_ec_no_data_provided=30"
  552.  
  553.     set "tdc_em_no_data_provided=No data provided to draw chart."
  554.  
  555.     set "tdc_data_value_array_name=%~1"
  556.     set "tdc_data_color_array_name=%~2"
  557.     set "tdc_data_char_array_name=%~3"
  558.     set "tdc_data_placeholder_char_array_name=%~4"
  559.    
  560.     set "tdc_temp_file=tmp.txt"
  561.  
  562.     call find_max.bat tdc_max "%tdc_data_value_array_name%" 2> nul > nul || (
  563.         echo %tdc_em_no_data_provided%
  564.         exit /b %tdc_ec_no_data_provided%
  565.     )
  566.    
  567.     set /a "tdc_i=0"
  568.     :tdc_loop
  569.         call set "tdc_value=%%%tdc_data_value_array_name%[%tdc_i%]%%"
  570.         call set "tdc_color=%%%tdc_data_color_array_name%[%tdc_i%]%%"
  571.         call set "tdc_char=%%%tdc_data_char_array_name%[%tdc_i%]%%"
  572.         call set "tdc_placeholder_char=%%%tdc_data_placeholder_char_array_name%[%tdc_i%]%%"
  573.  
  574.         if not defined tdc_value exit /b %ec_success%
  575.  
  576.         echo scale=5; part=%tdc_value%/%tdc_max%*%width%; scale=0; part / 1 | bc > "%tdc_temp_file%"
  577.  
  578.         set /p tdc_item_length=<%tdc_temp_file%
  579.         set /a "tdc_space_count=%width% - %tdc_item_length%"
  580.        
  581.         call :repeat_string tdc_item "%tdc_char%" "%tdc_item_length%"
  582.         call :repeat_string tdc_space "%tdc_placeholder_char%" "%tdc_space_count%"
  583.  
  584.         echo %tdc_color%%tdc_item%%tdc_space% %tdc_value%%esc%[0m
  585.  
  586.         set /a "tdc_i+=1"
  587.         goto tdc_loop
  588. exit /b %ec_success%
  589.  
  590. :parse_chart_data
  591.     set /a "pcd_ec_unexpected_value=40"
  592.  
  593.     set "pcd_em_unexpected_value=Unexpected value instead of nonnegative number."
  594.  
  595.     set "pcd_index_variable_name=%~1"
  596.     set "pcd_args_array_name=%~2"
  597.     set "pcd_data_value_array_name=%~3"
  598.     set "pcd_data_color_array_name=%~4"
  599.     set "pcd_data_char_array_name=%~5"
  600.     set "pcd_data_placeholder_char_array_name=%~6"
  601.  
  602.     set /a "pcd_i=%pcd_index_variable_name%"
  603.     set /a "pcd_data_i=0"
  604.     :pcd_loop
  605.         set /a "pcd_j=%pcd_i% + 1"
  606.         call set "pcd_value=%%%pcd_args_array_name%[%pcd_i%]%%"
  607.         call set "pcd_style=%%%pcd_args_array_name%[%pcd_j%]%%"
  608.  
  609.         if not defined %pcd_args_array_name%[%pcd_i%] exit /b %ec_success%
  610.  
  611.         echo %pcd_value%| findstr /r "%number_regex%" 2> nul > nul || (
  612.             echo %pcd_em_unexpected_value%
  613.             exit /b %pcd_ec_unexpected_value%
  614.         )
  615.  
  616.         set "%pcd_data_value_array_name%[%pcd_data_i%]=%pcd_value%"
  617.  
  618.         set "pcd_color=%default_color_code%"
  619.         set "pcd_char=%default_char%"
  620.         set "pcd_placeholder_char=%default_placeholder_char%"
  621.        
  622.         if not "%pcd_style%" == "{" (
  623.             set "%pcd_data_color_array_name%[%pcd_data_i%]=%pcd_color%"
  624.             set "%pcd_data_char_array_name%[%pcd_data_i%]=%pcd_char%"
  625.             set "%pcd_data_placeholder_char_array_name%[%pcd_data_i%]=%pcd_placeholder_char%"
  626.  
  627.             set /a "pcd_data_i+=1"
  628.             set /a "pcd_i+=1"
  629.             goto pcd_loop
  630.         )
  631.  
  632.         set /a "pcd_i+=1"
  633.         call :skip_style_block pcd_i pcd_color pcd_char pcd_placeholder_char "%pcd_args_array_name%"
  634.         set /a "pcd_temp_errorlevel=%errorlevel%"
  635.         if %pcd_temp_errorlevel% gtr 0 exit /b %pcd_temp_errorlevel%
  636.        
  637.         set "%pcd_data_color_array_name%[%pcd_data_i%]=%pcd_color%"
  638.         set "%pcd_data_char_array_name%[%pcd_data_i%]=%pcd_char%"
  639.         set "%pcd_data_placeholder_char_array_name%[%pcd_data_i%]=%pcd_placeholder_char%"
  640.         set /a "pcd_data_i+=1"
  641.         goto pcd_loop
  642. exit /b %ec_success%
  643.  
  644. :skip_style_block
  645.     set /a "ssb_ec_missing_opening_curly_brace=50"
  646.     set /a "ssb_ec_missing_closing_curly_brace=51"
  647.  
  648.     set "ssb_em_missing_opening_curly_brace=Missing opening curly brace ^({^)."
  649.     set "ssb_em_missing_closing_curly_brace=Missing closing curly brace ^(}^)."
  650.  
  651.     set "ssb_index_variable_name=%~1"
  652.     set "ssb_result_color_variable_name=%~2"
  653.     set "ssb_result_char_variable_name=%~3"
  654.     set "ssb_result_placeholder_char_variable_name=%~4"
  655.     set "ssb_args_array_name=%~5"
  656.  
  657.     set /a "ssb_i=%ssb_index_variable_name%"
  658.  
  659.     set "ssb_item_foreground=0"
  660.     set "ssb_item_background=0"
  661.     set "ssb_item_char=%default_char%"
  662.     set "ssb_item_placeholder_char=%default_placeholder_char%"
  663.  
  664.     call set "ssb_option=%%%ssb_args_array_name%[%ssb_i%]%%"
  665.     if not "%ssb_option%" == "{" (
  666.         echo %ssb_em_missing_opening_curly_brace%
  667.         exit /b %ssb_ec_missing_opening_curly_brace%
  668.     )
  669.    
  670.     set /a "ssb_i+=1"
  671.     :ssb_loop
  672.         set /a "ssb_j=%ssb_i% + 1"
  673.         call set "ssb_option=%%%ssb_args_array_name%[%ssb_i%]%%"
  674.         call set "ssb_value=%%%ssb_args_array_name%[%ssb_j%]%%"
  675.  
  676.         set /a "ssb_is_item_foreground=%false%"
  677.         if "%ssb_option%" == "-if" set /a "ssb_is_item_foreground=%true%"
  678.         if "%ssb_option%" == "--item-foreground" set /a "ssb_is_item_foreground=%true%"
  679.  
  680.         if "%ssb_is_item_foreground%" == "%true%" (
  681.             set "ssb_item_foreground=%ssb_value%"
  682.             set /a "ssb_i+=2"
  683.             goto ssb_loop
  684.         )
  685.  
  686.         set /a "ssb_is_item_background=%false%"
  687.         if "%ssb_option%" == "-ib" set /a "ssb_is_item_background=%true%"
  688.         if "%ssb_option%" == "--item-background" set /a "ssb_is_item_background=%true%"
  689.  
  690.         if "%ssb_is_item_background%" == "%true%" (
  691.             set "ssb_item_background=%ssb_value%"
  692.             set /a "ssb_i+=2"
  693.             goto ssb_loop
  694.         )
  695.  
  696.         set /a "ssb_is_item_char=%false%"
  697.         if "%ssb_option%" == "-ic" set /a "ssb_is_item_char=%true%"
  698.         if "%ssb_option%" == "--item-char" set /a "ssb_is_item_char=%true%"
  699.  
  700.         if "%ssb_is_item_char%" == "%true%" (
  701.             set "ssb_item_char=%ssb_value:~0,1%"
  702.             set /a "ssb_i+=2"
  703.             goto ssb_loop
  704.         )
  705.  
  706.         set /a "ssb_is_item_placeholder_char=%false%"
  707.         if "%ssb_option%" == "-ipc" set /a "ssb_is_item_placeholder_char=%true%"
  708.         if "%ssb_option%" == "--item-placeholder-char" set /a "ssb_is_item_placeholder_char=%true%"
  709.  
  710.         if "%ssb_is_item_placeholder_char%" == "%true%" (
  711.             set "ssb_item_placeholder_char=%ssb_value:~0,1%"
  712.             set /a "ssb_i+=2"
  713.             goto ssb_loop
  714.         )
  715.  
  716.         if not "%ssb_option%" == "}" (
  717.             echo %ssb_em_missing_closing_curly_brace%
  718.             exit /b %ssb_ec_missing_closing_curly_brace%
  719.         )
  720.  
  721.         call :to_color_code "%ssb_result_color_variable_name%" "%ssb_item_foreground%" "%ssb_item_background%"
  722.         set /a "ssb_error_level=%errorlevel%"
  723.         if %ssb_error_level% gtr 0 exit /b %ssb_error_level%
  724.         set "%ssb_result_char_variable_name%=%ssb_item_char%"
  725.         set "%ssb_result_placeholder_char_variable_name%=%ssb_item_placeholder_char%"
  726.         set /a "%ssb_index_variable_name%=%ssb_i% + 1"
  727. exit /b %ec_success%
  728.  
  729. :to_color_code
  730.     set "tcc_variable_name=%~1"
  731.     set "tcc_foreground_color=%~2"
  732.     set "tcc_background_color=%~3"
  733.  
  734.     set "%tcc_variable_name%=%esc%[0m"
  735.  
  736.     call :to_foreground_color_code tcc_foreground_color "%tcc_foreground_color%"
  737.     set /a "tcc_error_level=%errorlevel%"
  738.     if %tcc_error_level% gtr 0 exit /b %tcc_error_level%
  739.  
  740.     call :to_background_color_code tcc_background_color "%tcc_background_color%"
  741.     set /a "tcc_error_level=%errorlevel%"
  742.     if %tcc_error_level% gtr 0 exit /b %tcc_error_level%
  743.  
  744.     if %tcc_foreground_color% neq 0 (
  745.         if %tcc_background_color% neq 0 (
  746.             set "%tcc_variable_name%=%esc%[%tcc_foreground_color%;%tcc_background_color%m"
  747.         ) else (
  748.             set "%tcc_variable_name%=%esc%[%tcc_foreground_color%m"
  749.         )
  750.     ) else (
  751.         if %tcc_background_color% neq 0 (
  752.             set "%tcc_variable_name%=%esc%[%tcc_background_color%m"
  753.         ) else (
  754.             set "%tcc_variable_name%=%default_color_code%"
  755.         )
  756.     )
  757.    
  758. exit /b %ec_success%
  759.  
  760. :to_foreground_color_code
  761.     set "tfcc_variable_name=%~1"
  762.     set "tfcc_color=%~2"
  763.  
  764.     echo %tfcc_color%| findstr /r "%number_regex%" 2> nul > nul && (
  765.         set "%tfcc_variable_name%=%tfcc_color%"
  766.         exit /b %ec_success%
  767.     )
  768.  
  769.     call :name_to_foreground_color_code "%tfcc_variable_name%" "%tfcc_color%"
  770.     set /a "tfcc_error_level=%errorlevel%"
  771.     if %tfcc_error_level% gtr 0 exit /b %tfcc_error_level%
  772. exit /b %ec_success%
  773.  
  774. :to_background_color_code
  775.     set "tbcc_variable_name=%~1"
  776.     set "tbcc_color=%~2"
  777.  
  778.     echo %tbcc_color%| findstr /r "%number_regex%" 2> nul > nul && (
  779.         set "%tbcc_variable_name%=%tbcc_color%"
  780.         exit /b %ec_success%
  781.     )
  782.  
  783.     call :name_to_background_color_code "%tbcc_variable_name%" "%tbcc_color%"
  784.     set /a "tbcc_error_level=%errorlevel%"
  785.     if %tbcc_error_level% gtr 0 exit /b %tbcc_error_level%
  786. exit /b %ec_success%
  787.  
  788. :name_to_foreground_color_code
  789.     set /a "ntfcc_ec_wrong_color_name=60"
  790.  
  791.     set "ntfcc_em_wrong_color_name=Unexpected foreground color name. Valid color name set is: black (default), red, green, yellow, blue, purple, cyan, white, random."
  792.  
  793.     set "ntfcc_variable_name=%~1"
  794.     set "ntfcc_color_name=%~2"
  795.  
  796.     set "ntfcc_default_color=30"
  797.  
  798.     if "%ntfcc_color_name%" == "black" set /a "%ntfcc_variable_name%=30" && exit /b %ec_success%
  799.     if "%ntfcc_color_name%" == "red" set /a "%ntfcc_variable_name%=31" && exit /b %ec_success%
  800.     if "%ntfcc_color_name%" == "green" set /a "%ntfcc_variable_name%=32" && exit /b %ec_success%
  801.     if "%ntfcc_color_name%" == "yellow" set /a "%ntfcc_variable_name%=33" && exit /b %ec_success%
  802.     if "%ntfcc_color_name%" == "blue" set /a "%ntfcc_variable_name%=34" && exit /b %ec_success%
  803.     if "%ntfcc_color_name%" == "purple" set /a "%ntfcc_variable_name%=35" && exit /b %ec_success%
  804.     if "%ntfcc_color_name%" == "cyan" set /a "%ntfcc_variable_name%=36" && exit /b %ec_success%
  805.     if "%ntfcc_color_name%" == "white" set /a "%ntfcc_variable_name%=37" && exit /b %ec_success%
  806.     if "%ntfcc_color_name%" == "default" set /a "%ntfcc_variable_name%=%ntfcc_default_color%" && exit /b %ec_success%
  807.     if "%ntfcc_color_name%" == "random" (
  808.         call :random_foreground_color_code "%ntfcc_variable_name%"
  809.         exit /b %ec_success%
  810.     )
  811.  
  812.     set /a "%ntfcc_variable_name%=0"
  813.     echo %ntfcc_em_wrong_color_name%
  814. exit /b %ntfcc_ec_wrong_color_name%
  815.  
  816. :name_to_background_color_code
  817.     set /a "ntbcc_ec_wrong_color_name=70"
  818.  
  819.     set "ntbcc_em_wrong_color_name=Unexpected background color name. Valid color name set is: black (default), red, green, yellow, blue, purple, cyan, white, random."
  820.  
  821.     set "ntbcc_variable_name=%~1"
  822.     set "ntbcc_color_name=%~2"
  823.  
  824.     set "ntbcc_default_color=40"
  825.  
  826.     if "%ntbcc_color_name%" == "black" set /a "%ntbcc_variable_name%=40" && exit /b %ec_success%
  827.     if "%ntbcc_color_name%" == "red" set /a "%ntbcc_variable_name%=41" && exit /b %ec_success%
  828.     if "%ntbcc_color_name%" == "green" set /a "%ntbcc_variable_name%=42" && exit /b %ec_success%
  829.     if "%ntbcc_color_name%" == "yellow" set /a "%ntbcc_variable_name%=43" && exit /b %ec_success%
  830.     if "%ntbcc_color_name%" == "blue" set /a "%ntbcc_variable_name%=44" && exit /b %ec_success%
  831.     if "%ntbcc_color_name%" == "purple" set /a "%ntbcc_variable_name%=45" && exit /b %ec_success%
  832.     if "%ntbcc_color_name%" == "cyan" set /a "%ntbcc_variable_name%=46" && exit /b %ec_success%
  833.     if "%ntbcc_color_name%" == "white" set /a "%ntbcc_variable_name%=47" && exit /b %ec_success%
  834.     if "%ntbcc_color_name%" == "default" set /a "%ntbcc_variable_name%=%ntbcc_default_color%" && exit /b %ec_success%
  835.     if "%ntbcc_color_name%" == "random" (
  836.         call :random_background_color_code "%ntbcc_variable_name%"
  837.         exit /b %ec_success%
  838.     )
  839.  
  840.     set /a "%ntbcc_variable_name%=0"
  841.     echo %ntbcc_em_wrong_color_name%
  842. exit /b %ntbcc_ec_wrong_color_name%
  843.  
  844. :random_foreground_color_code
  845.     set "rfcc_variable_name=%~1"
  846.  
  847.     set /a "%rfcc_variable_name%=30 + %random% %% 8"
  848. exit /b %ec_success%
  849.  
  850. :random_background_color_code
  851.     set "rbcc_variable_name=%~1"
  852.    
  853.     set /a "%rbcc_variable_name%=40 + %random% %% 8"
  854. exit /b %ec_success%
  855.  
  856. :insert_array_item
  857.     set "iai_array_name=%~1"
  858.     set "iai_item_value=%~2"
  859.     set /a "iai_item_index=%~3"
  860.  
  861.     set /a "iai_i=%iai_item_index%"
  862.     :iai_moving_to_last_item
  863.         set "iai_item_name=%iai_array_name%[%iai_i%]"
  864.         if defined %iai_item_name% (
  865.             set /a "iai_i+=1"
  866.             goto iai_moving_to_last_item
  867.         )
  868.    
  869.     :iai_shifting_items_to_right
  870.         set /a "iai_j=%iai_i% - 1"
  871.         set "iai_item_name=%iai_array_name%[%iai_i%]"
  872.         set "iai_previous_item_name=%iai_array_name%[%iai_j%]"
  873.  
  874.         if %iai_j% geq %iai_item_index% (
  875.             call set "%iai_item_name%=%%%iai_previous_item_name%%%"
  876.             set /a "iai_i-=1"
  877.             goto iai_shifting_items_to_right
  878.         )
  879.  
  880.     set "%iai_array_name%[%iai_i%]=%iai_item_value%"
  881. exit /b %ec_success%
  882.  
  883. :remove_array_item
  884.     set "rai_array_name=%~1"
  885.     set /a "rai_item_index=%~2"
  886.  
  887.     set /a "rai_i=%rai_item_index%"
  888.     :rai_remove_loop
  889.         set /a "rai_j=%rai_i% + 1"
  890.         set "rai_item_name=%rai_array_name%[%rai_i%]"
  891.         set "rai_next_item_name=%rai_array_name%[%rai_j%]"
  892.  
  893.         if defined %rai_item_name% (
  894.             call set "%rai_item_name%=%%%rai_next_item_name%%%"
  895.             set /a "rai_i+=1"
  896.             goto rai_remove_loop
  897.         )
  898. exit /b %ec_success%
  899.  
  900. :repeat_string
  901.     set "rs_variable_name=%~1"
  902.     set "rs_string=%~2"
  903.     set "rs_count=%~3"
  904.  
  905.     set /a "rs_i=0"
  906.     set "rs_string_result="
  907.  
  908.     :rs_repetition_loop
  909.         if %rs_i% lss %rs_count% (
  910.             set "rs_string_result=%rs_string_result%%rs_string%"
  911.             set /a "rs_i+=1"
  912.             goto rs_repetition_loop
  913.         )
  914.  
  915.     set "%rs_variable_name%=%rs_string_result%"
  916. exit /b %ec_success%
  917.  
  918. :set_esc
  919.     for /f "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
  920.         set "esc=%%b"
  921.         exit /b 0
  922.     )
  923. exit /b %ec_success%
  924.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement