@echo off
:4dosCheck
    if "%@eval[2+2]"=="4" loadbtm on
:Start
    if [%1]==[] goto Usage
    if [%1]==[/?] goto Help
    if [%2]==[] goto InputCheck
REM
REM This file is called F_NAME.BAT per default. Call it whatever you like.
REM
REM You need enough free environment space for this batch file.
REM If there's not enough free space, f_name.bat will give you a warning.
REM
REM While f_name.bat tries to test your free environment space, you'll
REM probably need to check your config.sys for the following line:
REM
REM     SHELL=C:\DOS\COMMAND.COM C:\DOS\ /E:1024 /p
REM
REM The '/E:1024' sets your environment space - it will probably need to
REM be 1024 or higher (unless you're really economical with env-space).
REM
REM If you are not sure about free space, set fp and fn with long dummy
REM strings in autoexec.bat to get enough free space, eg.:
REM
REM set fp=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
REM set fu=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
REM set fn=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
REM set fd=xx
REM set fe=xxxx
REM
REM Using dummy strings is necessary if you're going to execute
REM f_name.bat from a second command shell, eg. from Norton Commander.
REM In this case the total length reserved for f_name.bat should be up
REM to 192 bytes. My suggestion is, let the strings for fp, fu, and fn count
REM up to 186 bytes (eg. 62 each).
REM
REM Some releases of DOS (eg. some beta-releases/pre-releases of DOS 6.0
REM and some older DOS releases) does not support the batchcommand 'NOT'.
REM If you're still using such a release you cannot use this batchfile
REM since it uses this batchcommand.
REM
REM Please also note that f_name.bat cannot work properly if filespec is
REM longer than around 38 (? I don't know the exact length) characters. If
REM filespec is long, f_name.bat will fail at 'for %%x in ... do if ...'
REM lines.  The result of error is fairly unpredictable as DOS will try to
REM execute with a truncated batch command line.  So, please use the
REM batch file for short filespecs (< 38??). (On my DOS 6.22 using
REM strings above 38 chars gives me an endless loop, Claus Futtrup).
REM
REM For large batchfiles it is usually an advantage to use a
REM 'batch-compiler', which will convert the .bat file into a .com or
REM .exe file. With f_name.bat this could probably speed it up many
REM times, but it has not been possible to find a batch-compiler, which
REM will compile this batchfile. The compilers PWR14G.ZIP and
REM BAT2EX15.ZIP have been tested without success.
REM
REM This modified release is more solid when it comes to garbage input, it
REM is provided with help option, additional documentation and additional
REM checking for sufficient environment space and now remove the temporary
REM environment settings (P, Q, R, S, T) at the bottom of the batchfile. The
REM structure is changed a bit, but the basic still is made by Wonkoo Kim.
REM
REM Please do not distribute this file without the above documentation
REM included in the batch-file. If you change the file please add your
REM name as a "modifier" as done below + document your changes. We do
REM not intend to hold a copyright, though. You may use, misuse or abuse
REM this batchfile as you see fit.
REM
REM This file is provided to you on a free basis. The author/modifiers
REM do not want to be hold responsible to whatever this batchfile is
REM doing. Use of this batchfile is entirely at your own risk.
REM
REM Wonkoo Kim (wkim+@pitt.edu), August 11, 1995
REM Modified by Claus Futtrup (odie@csek.iprod.auc.dk), August 23. 1995
REM Modified by Werner Lemberg (wl@gnu.org), Jan. 10. 1996
REM   to run this batch file under 4DOS too (replacing all %%f with %%x
REM   and doubling the speed with the LOADBTM ON command)
REM Modified by Werner Lemberg (wl@gnu.org), Aug. 31. 1996
REM   to return unix-like paths additionally in the variable %fu%;
REM   the batch file will now parse e.g. \a.b\ correctly as a directory.
REM
:Usage
    echo.
    echo Usage: %0 filespec
    echo.
    echo Returns: fd (drive), fp (path), fu (unix path), fn (name), fe (extension)
    echo.
    echo Type %0 /? for additional help
    echo %0 is made by Wonkoo Kim, modified by C. Futtrup and W. Lemberg.
    echo.
    goto END
:Help
    cls
    echo %0 -- extracts the drive, path, name, and ext from file-path-name.
    echo.
    echo Return envs: FD (drive), FP (path), FU (unix path), FN (name), FE (ext)
    echo Temp envs:   P, Q, R, S, T
    echo.
    echo     INPUT FILE         fd        fp        fn        fe
    echo     ------------------ --------- --------- --------- ---------
    echo     abc                                    abc      
    echo     abc.tex                                abc       .tex
    echo     c:\abc.tex         c:        \         abc       .tex
    echo     c:tmp\abc.tex      c:        tmp\      abc       .tex
    echo     c:\tmp\abc.tex     c:        \tmp\     abc       .tex
    echo     c:tmp\tex\abc.tex  c:        tmp\tex\  abc       .tex
    echo     c:\tmp\tex\abc.tex c:        \tmp\tex\ abc       .tex
    echo.
    echo Please note this file isn't blazing fast + it needs a lot
    echo of environment space. See comments in %0 for more info.
    echo.
    echo Wonkoo Kim (wkim+@pitt.edu), August 11, 1995
    echo Modified by Claus Futtrup (odie@csek.iprod.auc.dk), August 23. 1995
    echo Modified by Werner Lemberg (wl@gnu.org), Aug 31. 1996
    goto END
:InputCheck
    for %%x in (%1) do if "%%x"=="%1" goto Okay
    echo *** ERROR: Please do not use wildcards in input file name.
    goto END
:Okay
    set p=
    set r=
    set fp=
    set fu=
    set fe=
    set fn=%1
    set s=XXXXXXXX%fn%
    set t=%fn%
    set s=
    if [%t%]==[%1] goto GetDrive
:EnvErr
    echo *** ERROR: Not enough environment space!
    echo *** See documentation at top of file '%0'
    goto END
:GetDrive
    for %%x in (/%t%) do set fn=%%x
    for %%x in (/%t%) do if not [%%x]==[%fn%] set fd=%%x
    if [%fn%]==[:] goto DriveOnly
    set t=%fn%
    for %%x in (/%t%) do set fn=%%x
    if [:%fn%]==[%t%] goto DriveFound
    set fd=
    set fn=%1
    goto GetPath
:DriveOnly
    set fn=
:DriveFound
    set fd=%fd%:
:GetPath
    set s=%fn%
:PathLoop
    set t=%s%
    for %%x in (/%t%) do set s=%%x
    set q=
    for %%x in (/%t%) do if not [%%x]==[%s%] set q=%%x
    if "\%s%"=="%t%" goto Separator
    set p=%p%%q%
    set r=%r%%q%
    if [%s%]==[%t%] goto PathCheck
    goto PathLoop
:Separator
    set fn=%s%
    set p=%p%\
    set r=%r%/
    set fp=%p%
    set fu=%r%
    goto PathLoop
:PathCheck
    if [%s%]==[\] goto NoFilename
    if not [%fn%]==[\] goto GetExt
    set fp=\
    set fu=/
    set fn=
    goto Done
:NoFilename
    set fp=%p%\
    set fu=%r%/
    set fn=
    goto Done
:GetExt
    set s=%fn%
    set fe=%fn%
    set fn=
:ExtLoop
    set t=%fe%
    for %%x in (/%t%) do set fe=%%x
    if ".%fe%"=="%t%" goto ExtFound
    if [%fe%]==[%t%] goto NoExt
    for %%x in (/%t%) do if not [%%x]==[%fe%] set fn=%fn%%%x
    goto ExtLoop
:ExtFound
    set fe=.%fe%
    goto Done
:NoExt
    if not [%fe%]==[.]  set fn=%s%
    set fe=
:Done
    echo DRIVE=%fd%  PATH=%fp%  UNIX_PATH=%fu%  NAME=%fn%  EXT=%fe%
:END
    set p=
    set q=
    set r=
    set s=
    set t=

