Что нового

Как узнать что находится в скрипте в строке №?

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
inververs
Вот вариант преобразования исходника в формат компилированного скрипта:

Код:
#include <Array.au3>

_AU3_StripToRaw(@ScriptFullPath)

Func _AU3_StripToRaw($sSrcFile, $sSufix = 'raw_stripped')
	Local $sRaw = '', $aIncludes[1]
	Local $aRead, $iInclude, $sInclude
	Local $sSrc = FileRead($sSrcFile)
	Local $sScriptDir = StringRegExpReplace($sSrcFile, '\\[^\\]+$', '')
	
	While 1
		$aRead = StringSplit(StringStripCR($sSrc), @LF)
		$iInclude = 0
		
		For $i = 1 To $aRead[0]
			$sInclude = _AU3_IncludeToPath($aRead[$i], $sScriptDir)
			
			If Not @error Then
				For $j = 1 To $aIncludes[0]
					If $aIncludes[$j] = $sInclude Then
						ContinueLoop 2
					EndIf
				Next
				
				$iInclude = 1
				
				$aIncludes[0] += 1
				ReDim $aIncludes[$aIncludes[0] + 1]
				$aIncludes[$aIncludes[0]] = $sInclude
				
				$sRaw &= FileRead($sInclude) & @CRLF
			Else
				$sRaw &= $aRead[$i] & @CRLF
			EndIf
		Next
		
		If Not $iInclude Then
			ExitLoop
		EndIf
		
		$sSrc = $sRaw
		$sRaw = ''
	WEnd
	
	$sRaw = StringRegExpReplace($sRaw, '(?mi)\A\R+|(#cs((?s).*?)#ce\R*|#comments-start((?s).*?)#comments-end\R*|(?-s)^\h*#.*?$\R*|^\h*;[^\r\n]*$\R*|\h+\R\R*|\R(?=\R))*|\R+\z', '')
	$sSrcFile = StringRegExpReplace($sSrcFile, '(\.[^\.]+)$', '_' & $sSufix & '$1')
	
	$hFile = FileOpen($sSrcFile, 2)
	FileWrite($hFile, $sRaw)
	FileClose($hFile)
	
	Return $sRaw
EndFunc

Func _AU3_IncludeToPath($sInclude, $sScriptDir = @ScriptDir)
    Local $aRegExp = StringRegExp($sInclude, '(?i)^\h*#include\h+(<|"|'')([^>"'']+)(?:>|"|'')\h*$', 3)
    
	; Проверка на корректность формата строки
    If Not IsArray($aRegExp) Then Return SetError(1, 0, "")
    $sInclude = $aRegExp[1]

    If StringInStr($sInclude, "\") = 0 Then
        Local $sSYS, $sUDL, $aUDL, $sAU3 = $sScriptDir & "\" & $sInclude
        
		; Определение каталога системных библиотек
        $sSYS = StringRegExpReplace(@AutoItExe, "\\[^\\]+$", "")
        $sSYS &= "\Include\"& $sInclude
        
		; Чтение списка каталогов пользовательских библиотек
        $sUDL = RegRead("HKCU\Software\AutoIt v3\AutoIt", "Include")
        $aUDL = StringRegExp($sUDL, "([^;]+)(?:;|$)", 3)
        
		; Проверка типов 1 и 2 (до пользовательских библиотек)
        If $aRegExp[0] == '<' Then
            If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
        ElseIf $aRegExp[0] == '"' Or $aRegExp[0] == "'" Then
            If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
        EndIf
        
		; Проверка типа 3 (поиск среди пользовательских библиотек)
        If IsArray($aUDL) Then
            For $i = 0 To UBound($aUDL)-1
                $aUDL[$i] &= "\" & $sInclude
                If FileExists($aUDL[$i]) Then Return SetError(0, 3, $aUDL[$i])
            Next
        EndIf
        
		; Проверка типов 1 и 2 (после пользовательских библиотек)
        If $aRegExp[0] == '<' Then
            If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
        ElseIf $aRegExp[0] == '"' Or $aRegExp[0] == "'" Then
            If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
        EndIf
    Else
        ; Проверка типа 4 (файл с указанием полного пути)
        If FileExists($sInclude) Then Return SetError(0, 4, $sInclude)
	EndIf
	
    ; ОШИБКА: файл не найден
    Return SetError(2, 0, "")
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
CreatoR
код неверно формирует скрипт. в плане того, что
Код:
warning: $__UDFGUICONSTANT_WS_CHILD: possibly used before declaration
естественно, после компиляции код выдает ошибку.
пользуюсь официальным "полным" редактором. правда, версия autoit 3.3.12.0
использовал Au3Stripper из комплекта редактора - все нормально работает.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
CreatoR почти, но у меня тоже ошибки находятся. И еще пару моментов что я обнаружил:
Строки разделенные _ должны быть склеены в одну
#NoTrayIcon не должны вырезаться
# Такие коментарии
# тоже не должны
# вырезаться
#Region Global Variables and Constants - должны оставаться в скрипте
комментарии в конце строк должны убираться (что бы не мешали на дифах)
Ну и размер получившегося файла все же очень отличается от _stripped и от .. ну вы понял от которого.
Ваша утилита собрала файл в котором только 19200 строк.

Может разработчикам предложить сделать опцию в компиляторе - компилировать в один большой au3. Было бы полезно.

По поводу stripper и опции /mo : Just merges the Include files into the source and strips the Comments.
This is similar to aut2exe and helps finding the errorline.

Она тоже не правильно склеивает. В полученном файле в искомой строке нет ошибки.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
inververs
Я так понимаю что тут есть ещё один нюанс - в includ'ах пустые строки не удаляются?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Исправленная версия:

Код:
#include <Array.au3>

$sSrcFile = @ScriptFullPath
$sDstFile = StringRegExpReplace($sSrcFile, '(\.[^\.]+)$', '_stripped_raw$1')

_AU3_StripToRaw($sSrcFile, $sDstFile)

Func _AU3_StripToRaw($sSrcFile, $sDstFile)
	If Not FileExists($sSrcFile) Then
		Return SetError(1, 0, 0)
	EndIf
	
	Local $sRaw = '', $aIncludes[1]
	Local $aRead, $iInclude, $sInclude
	Local $sSrc = FileRead($sSrcFile)
	Local $sScriptDir = StringRegExpReplace($sSrcFile, '\\[^\\]+$', '')
	
	While 1
		$aRead = StringSplit(StringStripCR($sSrc), @LF)
		$iInclude = 0
		
		For $i = 1 To $aRead[0]
			$sInclude = _AU3_IncludeToPath($aRead[$i], $sScriptDir)
			
			If Not @error Then
				For $j = 1 To $aIncludes[0]
					If $aIncludes[$j] = $sInclude Then
						ContinueLoop 2
					EndIf
				Next
				
				$iInclude = 1
				
				$aIncludes[0] += 1
				ReDim $aIncludes[$aIncludes[0] + 1]
				$aIncludes[$aIncludes[0]] = $sInclude
				
				$sRaw &= FileRead($sInclude) & @CRLF
			Else
				$sRaw &= $aRead[$i] & @CRLF
			EndIf
		Next
		
		If Not $iInclude Then
			ExitLoop
		EndIf
		
		$sSrc = $sRaw
		$sRaw = ''
	WEnd
	
	$sRaw = StringRegExpReplace($sRaw, '(?mi)^\h*;[^\r\n]*$|^\h*#cs((?s).*?)#ce(\h+[^\r\n]*)?$|^\h*#comments-start((?s).*?)#comments-end(\h+[^\r\n]*)?$', '') ;Remove coments
	$sRaw = StringRegExpReplace($sRaw, '(?mi)^\h*#include-once\h*$|^\h*#pragma \h*compile\(.*?$', '') ;Remove #include-once & #pragma compile(...)
	$sRaw = StringRegExpReplace($sRaw, '(?m)\A\R+|^\h+\R\R*|\R(?=\R)|\R+\z', '') ;Remove empty lines
	$sRaw = StringRegExpReplace($sRaw, '(?m)\h*_\h*(?:;[^\r\n]+?)?\r?\n\h*([^\r\n]+?)\h*', '\1') ;Merge broke with "_" lines
	
	$hFile = FileOpen($sDstFile, 2)
	FileWrite($hFile, $sRaw)
	FileClose($hFile)
	
	Return $sRaw
EndFunc

Func _AU3_IncludeToPath($sInclude, $sScriptDir = @ScriptDir)
    Local $aRegExp = StringRegExp($sInclude, '(?i)^\h*#include\h+(<|"|'')([^>"'']+)(?:>|"|'')\h*$', 3)
    
	; Проверка на корректность формата строки
    If Not IsArray($aRegExp) Then Return SetError(1, 0, "")
    $sInclude = $aRegExp[1]

    If StringInStr($sInclude, "\") = 0 Then
        Local $sSYS, $sUDL, $aUDL, $sAU3 = $sScriptDir & "\" & $sInclude
        
		; Определение каталога системных библиотек
        $sSYS = StringRegExpReplace(@AutoItExe, "\\[^\\]+$", "")
        $sSYS &= "\Include\"& $sInclude
        
		; Чтение списка каталогов пользовательских библиотек
        $sUDL = RegRead("HKCU\Software\AutoIt v3\AutoIt", "Include")
        $aUDL = StringRegExp($sUDL, "([^;]+)(?:;|$)", 3)
        
		; Проверка типов 1 и 2 (до пользовательских библиотек)
        If $aRegExp[0] == '<' Then
            If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
        ElseIf $aRegExp[0] == '"' Or $aRegExp[0] == "'" Then
            If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
        EndIf
        
		; Проверка типа 3 (поиск среди пользовательских библиотек)
        If IsArray($aUDL) Then
            For $i = 0 To UBound($aUDL)-1
                $aUDL[$i] &= "\" & $sInclude
                If FileExists($aUDL[$i]) Then Return SetError(0, 3, $aUDL[$i])
            Next
        EndIf
        
		; Проверка типов 1 и 2 (после пользовательских библиотек)
        If $aRegExp[0] == '<' Then
            If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
        ElseIf $aRegExp[0] == '"' Or $aRegExp[0] == "'" Then
            If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
        EndIf
    Else
        ; Проверка типа 4 (файл с указанием полного пути)
        If FileExists($sInclude) Then Return SetError(0, 4, $sInclude)
	EndIf
	
    ; ОШИБКА: файл не найден
    Return SetError(2, 0, "")
EndFunc
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
CreatoR гляну, уже думал использовать. Но пока руки не дошли.


Добавлено:
Сообщение автоматически объединено:

CreatoR [?]
Исправленная версия:
Ваша версия собирает конечно все в один файл, но по порядку добавления includes совершенно не то. По крайней мере на моем скрипте.
Одно маленькое дополнение:
#pragma директивы нужно вырезать.



Добавлено:
Сообщение автоматически объединено:

И потеряла 214 строк
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
inververs [?]
по порядку добавления includes совершенно не то
Пример такого скрипта можно?
Или хотя бы его заголовок (там где includ'ы).

#pragma директивы нужно вырезать.
Исправил.

потеряла 214 строк
Мне нужно посмотреть на скрипт с которым это происходит.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
В общем вот ещё версия, поменял логику обработки (рекурсия :laugh:smile:.

Код:
#include <Array.au3>
#include <WinAPIFiles.au3>

$sSrc_File = @ScriptFullPath
$sDst_File = StringRegExpReplace($sSrc_File, '(\.[^\.]+)$', '_stripped_raw$1')

$sSrc_Raw = ''
_AU3_StripToRaw($sSrc_File, $sSrc_Raw)
$sSrc_Raw = StringStripWS($sSrc_Raw, 3)

$hFile = FileOpen($sDst_File, 2)
FileWrite($hFile, $sSrc_Raw)
FileClose($hFile)

Func _AU3_StripToRaw($sSrcFile, ByRef $sSrcRaw, $sIncludes = '|')
	If Not FileExists($sSrcFile) Then
		Return SetError(1, 0, 0)
	EndIf
	
	Local $sScriptDir = StringRegExpReplace($sSrcFile, '\\[^\\]+$', '')
	Local $aRead = StringSplit(StringStripCR(FileRead($sSrcFile)), @LF)
	Local $sInclude, $sInclude_Name
	Local $bComment_Started = False
	
	For $i = 1 To $aRead[0]
		If StringRegExp($aRead[$i], '(?i)^\h*#(cs|comments-started)') Then
			$bComment_Started = True
			ContinueLoop
		ElseIf StringRegExp($aRead[$i], '(?i)^\h*#(ce|comments-end)') Then
			$bComment_Started = False
			ContinueLoop
		EndIf
		
		If $bComment_Started Or StringStripWS($aRead[$i], 8) = '' Or StringRegExp($aRead[$i], '(?i)^\h*(;|#include-once|#pragma\h+compile\()') Then
			ContinueLoop
		EndIf
		
		$aRead[$i] = _AU3_StringRemoveComments($aRead[$i])
		
		If Not StringRegExp($aRead[$i], '(?i)^\h*#include\h+[<"'']') Then
			If StringRegExp($aRead[$i], '_\h*$') Then
				$sSrcRaw &= StringRegExpReplace($aRead[$i], '[_ ]+$', '')
				$i += 1
				
				While $i <= $aRead[0]
					$sSrcRaw &= StringRegExpReplace($aRead[$i], '[_ ]+$', '')
					If @extended = 0 Then ExitLoop
					
					$i += 1
				WEnd
				
				$sSrcRaw &= @CRLF
			Else
				$sSrcRaw &= $aRead[$i] & @CRLF
			EndIf
			
			ContinueLoop
		EndIf
		
		;MsgBox(64, $aRead[$i], $sScriptDir)
		
		$sInclude = _AU3_IncludeToPath($aRead[$i], $sScriptDir)
		
		If @error Or ($sInclude And StringInStr($sIncludes, '|' & $sInclude & '|')) Then
			;ConsoleWrite(@error & ':' & $aRead[$i] & ':' & $sScriptDir & @LF)
			ContinueLoop
		EndIf
		
		$sIncludes &= $sInclude & '|'
		$sIncludes = _AU3_StripToRaw($sInclude, $sSrcRaw, $sIncludes)
	Next
	
	Return $sIncludes
EndFunc

Func _AU3_IncludeToPath($sInclude, $sScriptDir = @ScriptDir)
	Local $aRegExp, $aRet, $sSYS, $sUDL, $aUDL, $sAU3, $sWorkDir
	Local $iError = 0, $sRet = ''
	
	$aRegExp = StringRegExp($sInclude, '(?i)^\h*#include\h+(<|"|'')([^>"'']+)(?:>|"|'')\h*(;.*?)?$', 3)
    
    If UBound($aRegExp) < 2 Then
		Return SetError(1, 0, '')
	EndIf
	
    $sInclude = $aRegExp[1]
	
	While 1
		;Check include type 4 (include with full path)
		If Not _WinAPI_PathIsRelative($sInclude) Then
			If FileExists($sInclude) Then
				$sRet = $sInclude
			Else
				$iError = 2
			EndIf
			
			ExitLoop
		EndIf
		
		$sAU3 = $sScriptDir & '\' & $sInclude
		
		;Get AutoIt Include folder
		$sSYS = StringRegExpReplace(@AutoItExe, '\\[^\\]+$', '') & '\Include\' & $sInclude
		
		;Get user include folders
		$sUDL = RegRead('HKCU\Software\AutoIt v3\AutoIt', 'Include')
		$aUDL = StringRegExp($sUDL, '([^;]+)(?:;|$)', 3)
		
		;Check include type 1 and 2 (before user includes check)
		If $aRegExp[0] == '<' Then
			If FileExists($sSYS) Then
				$sRet = $sSYS
				ExitLoop
			EndIf
		ElseIf $aRegExp[0] == '"' Or $aRegExp[0] == "'" Then
			If FileExists($sAU3) Then
				$sRet = $sAU3
				ExitLoop
			EndIf
		EndIf
		
		;Check include type 3 (search in user includes)
		For $i = 0 To UBound($aUDL) - 1
			$aUDL[$i] &= '\' & $sInclude
			
			If FileExists($aUDL[$i]) Then
				$sRet = $aUDL[$i]
				ExitLoop 2
			EndIf
		Next
		
		;Check include type 1 and 2 (after user includes check)
		If $aRegExp[0] == '<' Then
			If FileExists($sAU3) Then
				$sRet = $sAU3
				ExitLoop
			EndIf
		ElseIf $aRegExp[0] == '"' Or $aRegExp[0] == "'" Then
			If FileExists($sSYS) Then
				$sRet = $sSYS
				ExitLoop
			EndIf
		EndIf
		
		;Include file not found
		$iError = 3
		ExitLoop
	WEnd
	
	If Not $iError Then
		$sWorkDir = @WorkingDir
		FileChangeDir($sScriptDir)
		
		$sRet = _WinAPI_GetFullPathName($sRet)
		
		If @error Or $sRet = '' Then
			$iError = 4
		EndIf
		
		FileChangeDir($sWorkDir)
	EndIf
	
    Return SetError($iError, 0, $sRet)
EndFunc

Func _AU3_StringRemoveComments($sString)
	Local $aChars = StringSplit($sString, '')
	Local $sOpenStrChar = ''
	
	For $iChar = 1 To $aChars[0] - 1
		If $sOpenStrChar And $sOpenStrChar = $aChars[$iChar] Then
			If $aChars[$iChar] = $aChars[$iChar + 1] Then
				$iChar += 1
			Else
				$sOpenStrChar = ''
			EndIf
			
			ContinueLoop
		EndIf
		
		If Not $sOpenStrChar And ($aChars[$iChar] = '"' Or $aChars[$iChar] = "'") Then
			$sOpenStrChar = $aChars[$iChar]
			ContinueLoop
		EndIf
		
		If Not $sOpenStrChar And $aChars[$iChar] = ';' Then
			Return StringStripWS(StringLeft($sString, $iChar - 1), 2)
		EndIf
	Next
	
	If StringRight($sString, 1) = ';' Then
		Return StringTrimRight($sString, 1)
	EndIf
	
	Return SetError(1, 0, $sString)
EndFunc


Данный скрипт в точности делает то что делает компилятор, проверял на многих скриптах.
Нужно не забывать, что при компиляции наших скриптов, мы можем указывать разные параметры (wrapper'а и stripper'a), отсюда и несоответствия.

Кстати, Au3Stripper с параметром /mo не делает то что должен (он не склеивает скрипт так, как это делает компилятор).
Поэтому чтобы его использовать для вычисления проблемной строки, нужно и сам скрипт компилировать с такими же параметрами (/mo).



OffTopic:
P.S
Пока писал эту :Censored:, весь мозг сломал, видимо старею...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Ещё одна особенность которая может попортить результат - #include-once в библиотеках должна быть в самом верху, иначе компилятор будет брать из библиотеки всё что до этой директивы.
В моём "стриппере" повторяющие includ'ы не включаются вообще, отсюда и несоответствие. Нужно будет добавить поиск #include-once и брать всё что до него, тогда будет полное соответствие.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Оно обычно всегда в самом верху.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
inververs [?]
Оно обычно всегда в самом верху.
Иногда эту строку ставят внутри #Region, и как известно, #Region включается в скомпилированный скрипт.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Добавил проверку #include-once (повторно включается содержимое includ'а до первого нахождения #include-once - так, как это делает компилятор).

Код:
#include <WinAPIFiles.au3>

$sSrc_File = @ScriptFullPath
$sDst_File = StringRegExpReplace($sSrc_File, '(\.[^\.]+)$', '_stripped_raw$1')

$sSrc_Raw = _AU3_StripToRaw($sSrc_File)

$hFile = FileOpen($sDst_File, 2)
FileWrite($hFile, StringStripWS($sSrc_Raw, 3))
FileClose($hFile)

Func _AU3_StripToRaw($sSrcFile)
	If $sSrcFile = '' Or Not FileExists($sSrcFile) Then
		Return SetError(1, 0, 0)
	EndIf
	
	Local Static $sSrcRaw = ''
	Local Static $sIncludes = '|'
	
	Local $sInclude = ''
	Local $sScriptDir = StringRegExpReplace($sSrcFile, '\\[^\\]+$', '')
	Local $sRead = FileRead($sSrcFile)
	
	;!!! Strip comment block here (before checking #include-once)...
	_AU3_StringStripCommentBlocks($sRead)
	
	If StringRegExp($sRead, '(?mi)^\h*#include-once') Then
		If StringInStr($sIncludes, '|' & $sSrcFile & '|', 2) Then
			$sRead = StringRegExpReplace($sRead, '(?msi)\R?^\h*#include-once.*', '')
		Else
			$sIncludes &= '|' & $sSrcFile & '|'
		EndIf
	EndIf
	
	Local $aRead = StringSplit(StringStripCR($sRead), @LF)
	
	For $i = 1 To $aRead[0]
		If StringStripWS($aRead[$i], 8) = '' Or StringRegExp($aRead[$i], '(?i)^\h*(;|#include-once|#pragma\h+compile\()') Then
			ContinueLoop
		EndIf
		
		_AU3_StringStripComments($aRead[$i])
		
		If Not StringRegExp($aRead[$i], '(?i)^\h*#include\h+[<"'']') Then
			If StringRegExp($aRead[$i], '_\h*$') Then
				$sSrcRaw &= StringRegExpReplace($aRead[$i], '[_ ]+$', '')
				$i += 1
				
				While $i <= $aRead[0]
					_AU3_StringStripComments($aRead[$i])
					$sSrcRaw &= StringRegExpReplace($aRead[$i], '[_ ]+$', '')
					If @extended = 0 Then ExitLoop
					
					$i += 1
				WEnd
				
				$sSrcRaw &= @CRLF
			Else
				$sSrcRaw &= $aRead[$i] & @CRLF
			EndIf
			
			ContinueLoop
		EndIf
		
		$sInclude = _AU3_IncludeToPath($aRead[$i], $sScriptDir)
		
		If Not @error Then
			$sSrcRaw = _AU3_StripToRaw($sInclude)
		EndIf
	Next
	
	Return $sSrcRaw
EndFunc

Func _AU3_IncludeToPath($sInclude, $sScriptDir = @ScriptDir)
	Local $aRegExp, $aRet, $sSYS, $sAU3, $sWorkDir
	Local $iError = 0, $sRet = ''
	
	$aRegExp = StringRegExp($sInclude, '(?i)^\h*#include\h+(<|"|'')([^>"'']+)(?:>|"|'')\h*(;.*?)?$', 3)
    
    If UBound($aRegExp) < 2 Then
		Return SetError(1, 0, '')
	EndIf
	
    $sInclude = $aRegExp[1]
	
	;Get AutoIt Include folder
	Local Static $sAutoIt_Incl_Dir = StringRegExpReplace(@AutoItExe, '\\[^\\]+$', '') & '\Include'
	
	;Get User Include folders
	Local Static $aUDL = StringRegExp(RegRead('HKCU\Software\AutoIt v3\AutoIt', 'Include'), '([^;]+)(?:;|$)', 3)
	
	While 1
		;Check include type 4 (include with full path)
		If Not _WinAPI_PathIsRelative($sInclude) Then
			If FileExists($sInclude) Then
				$sRet = $sInclude
			Else
				$iError = 2
			EndIf
			
			ExitLoop
		EndIf
		
		;Set Current & AutoIt Include file
		$sAU3 = $sScriptDir & '\' & $sInclude
		$sSYS = $sAutoIt_Incl_Dir & '\' & $sInclude
		
		;Check include type 1 and 2 (before user includes check)
		If $aRegExp[0] == '<' Then
			If FileExists($sSYS) Then
				$sRet = $sSYS
				ExitLoop
			EndIf
		ElseIf $aRegExp[0] == '"' Or $aRegExp[0] == "'" Then
			If FileExists($sAU3) Then
				$sRet = $sAU3
				ExitLoop
			EndIf
		EndIf
		
		;Check include type 3 (search in user includes)
		For $i = 0 To UBound($aUDL) - 1
			$aUDL[$i] &= '\' & $sInclude
			
			If FileExists($aUDL[$i]) Then
				$sRet = $aUDL[$i]
				ExitLoop 2
			EndIf
		Next
		
		;Check include type 1 and 2 (after user includes check)
		If $aRegExp[0] == '<' Then
			If FileExists($sAU3) Then
				$sRet = $sAU3
				ExitLoop
			EndIf
		ElseIf $aRegExp[0] == '"' Or $aRegExp[0] == "'" Then
			If FileExists($sSYS) Then
				$sRet = $sSYS
				ExitLoop
			EndIf
		EndIf
		
		;Include file not found
		$iError = 3
		ExitLoop
	WEnd
	
	If Not $iError Then
		$sWorkDir = @WorkingDir
		
		If $sWorkDir <> $sScriptDir Then
			FileChangeDir($sScriptDir)
		EndIf
		
		$sRet = _WinAPI_GetFullPathName($sRet)
		
		If @error Or $sRet = '' Then
			$iError = 4
		EndIf
		
		If $sWorkDir <> $sScriptDir Then
			FileChangeDir($sWorkDir)
		EndIf
	Else
		$sRet = ''
	EndIf
	
    Return SetError($iError, 0, $sRet)
EndFunc

Func _AU3_StringStripCommentBlocks(ByRef $sString)
	Local $aSplit = StringSplit(StringStripCR($sString), @LF)
	Local $iCmntsStart_Count
	
	$sString = ''
	
	For $i = 1 To $aSplit[0]
		If StringRegExp($aSplit[$i], '(?i)^\h*#(cs|comments-start)([\h;].*)?$') Then
			$iCmntsStart_Count = 1
			
			While 1
				If $i + 1 >= $aSplit[0] Then
					ExitLoop
				EndIf
				
				$i += 1
				
				If StringRegExp($aSplit[$i], '(?i)^\h*#(cs|comments-start)([\h;].*)?') Then
					$iCmntsStart_Count += 1
					ContinueLoop
				EndIf
				
				If StringRegExp($aSplit[$i], '(?i)^\h*#(ce|comments-end)([\h;].*)?') Then
					$iCmntsStart_Count -= 1
					
					If $iCmntsStart_Count <= 0 Then
						ExitLoop
					EndIf
				EndIf
			WEnd
			
			ContinueLoop
		EndIf
		
		$sString &= $aSplit[$i] & @CRLF
	Next
EndFunc

Func _AU3_StringStripComments(ByRef $sString)
	Local $aChars = StringSplit($sString, '')
	Local $sOpenStrChar = ''
	
	For $iChar = 1 To $aChars[0] - 1
		If $sOpenStrChar And $sOpenStrChar = $aChars[$iChar] Then
			If $aChars[$iChar] = $aChars[$iChar + 1] Then
				$iChar += 1
			Else
				$sOpenStrChar = ''
			EndIf
			
			ContinueLoop
		EndIf
		
		If Not $sOpenStrChar And ($aChars[$iChar] = '"' Or $aChars[$iChar] = "'") Then
			$sOpenStrChar = $aChars[$iChar]
			ContinueLoop
		EndIf
		
		If Not $sOpenStrChar And $aChars[$iChar] = ';' Then
			$sString = StringStripWS(StringLeft($sString, $iChar - 1), 2)
			Return
		EndIf
	Next
	
	If StringRight($sString, 1) = ';' Then
		$sString = StringTrimRight($sString, 1)
	Else
		SetError(1)
	EndIf
EndFunc


Также обновил это в OnAutoItErrorRegister.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
В полезняшки бы это перенести, а то потеряется.
 
Верх