# encoding: ascii
# api: powershell
# title: hex2dec
# description: This script is analog of Sysinternals hex2dec but with additional feature – interactive mode. At last it has been wrote on command language, no C\C++.
# version: 1.10
# type: script
# author: greg zakharov
# license: CC0
# x-poshcode-id: 3729
# x-archived: 2012-11-04T00:12:00
# x-published: 2012-10-31T05:47:00
#
#
@echo off
 ::unequal symbols
 for %%i in ("!", "x") do if "%1" equ "%%~i" goto:error
 ::display help information args
 for %%i in ("-h", "/h", "-help", "/help") do (
   if "%1" equ "%%~i" goto:help
 )
 if "%1" equ "-?" goto:help
 if "%1" equ "/?" goto:help
 ::interactive mode
 if "%1" equ "" (
   if not defined run goto:interactive
   goto:error
 )
 ::parsing input data
 setlocal enabledelayedexpansion
  ::checking is arg hex or dec
  2>nul set /a "res=%1"
  if "%1" equ "%res%" goto:dec2hex
  ::patterns
  echo "%1" | findstr /r \x > nul
  set e1=%errorlevel%
  echo "%1" | findstr /r [0-9a-f] > nul
  set e2=%errorlevel%
  echo "%1" | findstr /r [g-wyz] > nul
  set e3=%errorlevel%
  ::parsing error codes
  if %e1% equ 0 if %e2% equ 0 if %e3% equ 1 set "k=%1"   & goto:hex2dec
  if %e1% equ 1 if %e2% equ 0 if %e3% equ 1 set "k=0x%1" & goto:hex2dec
  goto:error

  :dec2hex
  2>nul set /a "num=%1"
  set "map=0123456789ABCDEF"
  for /l %%i in (1, 1, 8) do (
    set /a "res=num & 15, num >>=4"
    for %%j in (!res!) do set "hex=!map:~%%j,1!!hex!"
  )
  for /f "tokens=* delims=0" %%i in ("!hex!") do set "hex=0x%%i"
  echo %1 = !hex! & goto:eof

  :hex2dec
  set "num=%k%"
  if "%num:~0,1%" equ "x" goto:error
  2>nul set /a "res=%k%"
  for /f "tokens=2,3" %%i in ('findstr "# " "%~dpnx0"') do set "num=!num:%%i=%%j!"
  if "%res%" neq "" (echo !num! = !res!) else goto:error
 endlocal
exit /b

:error
  if defined run echo =^>err & goto:eof
  echo Invalid data.
exit /b 1

:help
::Hex2dec v1.10 - converts hex to decimal and vice versa
::Copyright (C) 2012 Greg Zakharov
::forum.script-coding.com
::
::Usage: hex2dec [decimal | hexadecimal]
::
::Example 1:
::  C:\>hex2dec 0x017a
::  0x017A = 378
::
::Example 2:
::  C:\>hex2dec 13550
::  13550 = 0x34EE
::
::Example 3:
::  C:\>hex2dec 23f
::  0x23F = 575
for /f "tokens=* delims=:" %%i in ('findstr "^::" "%~dpnx0"') do echo.%%i
exit /b 0

rem :: Upper case chart ::
# a A
# b B
# c C
# d D
# e E
# f F
rem ::   End of chart   ::

:interactive
 ::interactive mode on
 echo Hex2dec v1.10 - converts hex to decimal and vice versa
 echo.
 setlocal
  ::marker - already launched
  set run=true
  :begin
  set /p "ask=>>> "
  cmd /c "%~dpnx0" %ask%
  if "%ask%" equ "clear" cls
  if "%ask%" equ "exit"  cls & goto:eof
  echo.
  goto:begin
 endlocal
exit /b
