Page 1 of 1

MagicEcho

Posted: 12 May 2015 10:46
by jeb
Inspired from Supress % (percent sign) escaping in a CMD file? I build a magicEcho that can echo any content behind it.

So when you write

Code: Select all

%magicEcho% "^!%path%<>" ^%!%<> ^

You get literally as output
Output wrote:"^!%path%<>" ^%!%<> ^


Obviously this shouldn't be possible :D

So here is the code.
I will explain it later (the explanation will be long), but for now you can find out how it works for yourself :wink:

Code: Select all

@echo off

call :magicEcho.init
%magicEcho% This is impossible %path% ^& | <> "^& | <>" ^
echo Or not?
exit /b

:magicEcho.init
set "magicEcho=call :gn & REM # #"
exit /b

:magicEcho
setlocal EnableDelayedExpansion
set /a skip=ln-2
setlocal DisableDelayedExpansion
FOR /F "usebackq skip=%skip% delims=" %%L in (`findstr /n "^" "%~f0"`) do (
    set "line=%%L"
    setlocal EnableDelayedExpansion
    set "line=!line:*:=!"
    set "line=!line:*echo%% =!"
    if defined line echo(!line!
    endlocal
    exit /b
)
exit /b

:gn
setlocal EnableDelayedExpansion
for %%F in ("%~f0") do set /a size=%%~zF
set "empty=."
for /L %%n in (1 1 13) DO set "empty=!empty:~0,4000!!empty:~0,4000!"

set LF=^


REM ***
set /a blockSizeHalf=4000, blockSize2=blockSizeHalf*2+2
copy "%~f0" "%~f0.tmp" > NUL && (
set /a charCount=0, lo=0, sl=0, preChars=0, lnr=0, cnt=0
for /F "usebackq delims=:" %%O in (`findstr /o "^" "%~f0"`) DO (
    set "offset=%%O"
    set /a lnr+=1
    set /a diff=offset-lo, lo=offset
    set /a charCount+=diff
    if !diff! GEQ 12 (
        set "output=%%#:#=!sl!,!preChars!%%"
        set "s=!output!#"
        set "len=0"
        for %%P in (16 8 4 2 1) do (
            if "!s:~%%P,1!" NEQ "" (
                set /a "len+=%%P"
                set "s=!s:~%%P!"
            )
        )
        set /a fill=charCount-len-1
        for /F %%L in ("!fill!") DO set "output=!output!!empty:~0,%%L!!LF!"               
        set /a cnt+=1
        set "line!cnt!=!output!"               
        set /a charCount=0, sl=lnr, preChars=offset
    )
)
(
    (
        for /L %%n in (1 1 !cnt!) DO (
            <nul set /p ".=!line%%n!"
        )
        (echo()
        echo :"
        echo (
        echo    setlocal EnableDelayedExpansion
        echo    FOR /F "tokens=1,2 delims=," %%%%A in ("^!offset^!"^) DO set /a line=%%%%A,label=%%%%B
        echo    copy "%~f0.tmp" "%~f0" > NUL
        echo    set /a size=%size%
        echo    set L=^^
        (echo()
        (echo()
        echo    for /L %%%%n in (1 1 13^) DO set "L=^!L:~0,%blockSizeHalf%^!^!L:~0,%blockSizeHalf%^!"
        echo    set /a remainSize=label-11, blocks=remainSize/%blockSize2%, remainSize=remainSize-%blockSize2%*blocks-2
        echo    if ^^!remainSize^^! LSS 2 set /a remainSize+=%blockSize2%, blocks-=1
        echo    FOR /F %%%%R in ("^!remainSize^!"^) DO set "lastBlock=^!L:~-%%%%R^!)"
        echo    (
        echo        (echo :#^)
        echo        (echo (%%%%#%%%%^)
        echo        FOR /L %%%%n in (1 1 ^^!blocks^^!^) DO (echo(^^!L^^!^)
        echo        (echo(^^!lastBlock^^!^)
        echo        echo(
        echo    ^) ^> "%~f0"
        echo    set ^^^^^"#=endlocal ^^^^^& (copy "%~f0.tmp" "%~f0" ^^^^^&^^^^^& del "%~f0.tmp"^^^^^) ^^^^^> nul ^^^^^& set "ln=^!line^!" ^^^^^& call :magicEcho"
        echo    goto :#
        echo ^)
    ) > "%~f0"

    endlocal
    set "#=<nul set offset=# & goto :":"
    exit /b
)
)
echo FAIL
exit /b



PS:
The code would be much easier if unlimited nested blocks where possible,
but they fail with a strange side effect Enabling the internal debug outputs of cmd.exe

Re: MagicEcho

Posted: 12 May 2015 12:08
by Squashman
Interesting

Code: Select all

for %%G in (1) DO %magicEcho% This is impossible %path% ^& | <> "^& | <>" ^ %%G

Output

Code: Select all

This is impossible %path% ^& | <> "^& | <>" ^ %%G


But some problems here.

Code: Select all

for %%G in (1 2) DO %magicEcho% This is impossible %path% ^& | <> "^& | <>" ^ %%G

Output

Code: Select all

The system cannot find the batch label specified - gn
This is impossible %path% ^& | <> "^& | <>" ^ %%G

Re: MagicEcho

Posted: 12 May 2015 12:26
by jeb
Squashman wrote:But some problems here.
Code:
for %%G in (1 2) DO %magicEcho% This is impossible %path% ^& | <> "^& | <>" ^ %%G

Ahh, yes, I didn't say it works in every setting :)

It doesn't work in code blocks (and therefore it can't work in FOR loops).

That's an inherent limitation by the technic I used.

Re: MagicEcho

Posted: 12 May 2015 12:38
by Squashman
Regardless of that it is still pretty cool.
Averages about .45 seconds on my old Duo Core machine.

Re: MagicEcho

Posted: 12 May 2015 16:24
by dbenham
:? :shock: :?: :!:

I haven't figured out how your code works yet. But couldn't you use a variation of your new technique to solve (or partially solve) How to get the current line number? :idea: :?:


Dave Benham

Re: MagicEcho

Posted: 12 May 2015 16:47
by jeb
dbenham wrote:I haven't figured out how your code works yet. But couldn't you use a variation of your new technique to solve (or partially solve) How to get the current line number? :idea: :?:

You got me :D
And you figured out enough of the code to see it.

Yes, the magicEcho is only an add on to the technic for determin the current line number.

But now it's too late in the night to explain all the stuff.