New Lexer:
; Get next/free Available File Name by toralf
; http://www.autohotkey.com/forum/viewtopic.php?t=6297

GetAvailableFileName( GivenFileName, GivenPath = "", StartID = 1 )
{
  ;check if GivenPath exist and add "\" if necessary
  If GivenPath is not space
    {
      StringRight, LastChar, GivenPath, 1
       If ( LastChar <> "\" )
        GivenPath = %GivenPath%\
      If ( InStr(FileExist(GivenPath), "D") = 0 )
        {
          ErrorLevel = The given path >%GivenPath%< doesn't exist.
          Return 0
        }
    }

  ;check if StartID is reasonable
  If ( StartID < 0 Or Mod(StartID, 1) <> 0 )
    {
      ErrorLevel =
        (LTrim
           The StartID >%StartID%< is smaller then zero or not an integer.
           It has to be a positive integer.
        )
      Return 0
    }

  ;split GivenFileName with #
  StringSplit, NameArray, GivenFileName, #
 
   ;if GivenFileName doesn't contain # ...
  If NameArray0 < 2
    {
      ;check if GivenFileName exists
      If FileExist(GivenPath . GivenFileName)
        {
          ErrorLevel =
            (LTrim
              The given file >%GivenFileName%< does exist
              in path >%GivenPath%<.
              (if path is empty, it's the path of the script/exe)
            )
          Return 0
        }
      Else
           Return GivenPath . GivenFileName
    }

  ;check if StartID isn't too large
  If ( StrLen(StartID) > NameArray0 - 1 )
    {
      ErrorLevel =
        (LTrim
           The StartID >%StartID%< is too large
           for the filename >%GivenFileName%<.
        )
      Return 0
    }
 
  ;Search from StartID ...
  Loop
     {
      Number := A_Index + StartID - 1
             
      ;untill number is too large ...
      If ( StrLen(Number) > NameArray0 - 1 )
        {
          ErrorLevel =
            (LTrim
              All files exist for >%GivenFileName%<
              with all # between %StartID% and %Number%.
            )
          Return 0
        }

      ;otherwise fill number with leading zeros
      Loop, % NameArray0 - 1 - StrLen(Number) ;%
           Number = 0%Number%
     
      ;split number in an array
      StringSplit, NumberArray, Number
     
       ;mix and concatenate the names array with the numbers array
      FileName =
      Loop, %NameArray0%
           FileName := FileName . NameArray%A_Index% . NumberArray%A_Index%
     
      ;check if GivenFileName doesn't exist
      If not FileExist(GivenPath . FileName)
          Return GivenPath . FileName
     }
}

GetAvailableFileName_fast( GivenFileName, GivenPath = "", StartID = 1 )
{
  StringSplit, NameArray, GivenFileName, #
   Loop
    {
      Number := A_Index + StartID - 1
      Loop, % NameArray0 - 1 - StrLen(Number) ;%
           Number = 0%Number%
      StringSplit, NumberArray, Number
       FileName =
      Loop, %NameArray0%
           FileName := FileName . NameArray%A_Index% . NumberArray%A_Index%
      If not FileExist(GivenPath . FileName)
          Return GivenPath . FileName
     }
}