Advertisement
AZJIO

IniVirtualSPE

Jan 8th, 2013
314
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 9.83 KB | None | 0 0
  1.  
  2. ; =======================================
  3. ; Title .........: IniVirtual
  4. ; AutoIt Version : 3.3.6.1 - 3.3.8.1
  5. ; Language ......: English + Русский
  6. ; Description ....: Операции с ini-файлом в памяти
  7. ; Author(s) .......: AZJIO
  8. ; =======================================
  9.  
  10. ; #CURRENT# =============================
  11. ; _IniVirtualSPE_Delete
  12. ; _IniVirtualSPE_IsDuplicateKeys
  13. ; _IniVirtualSPE_IsDuplicateSection
  14. ; _IniVirtualSPE_Read
  15. ; _IniVirtualSPE_ReadSection
  16. ; _IniVirtualSPE_ReadSectionNames
  17. ; _IniVirtualSPE_RenameSection
  18. ; _IniVirtualSPE_Write
  19. ; _IniVirtualSPE_WriteSection
  20. ; _SectionExists
  21. ; =======================================
  22.  
  23. Func _IniVirtualSPE_Read($s_INI_Text, $sSection, $sKey, $sDefault = '')
  24.     $sSection = StringRegExpReplace($sSection, '[][{}()*+?.\\^$|=<>#]', '\\$0')
  25.     Local $aSection = StringRegExp($s_INI_Text, '(?s)(?:\r\n|\A)\h*\[\h*' & $sSection & '\h*\]\h*\r\n\s*([^\[\s].*?)(?=\r\n\h*\[|\s*\z)', 1) ; извлечение контента секции
  26.     If @error Then Return $sDefault
  27.     $aSection = StringRegExp($aSection[0], '(?m)^\h*' & StringRegExpReplace($sKey, '[][{}()*+?.\\^$|=<>#]', '\\$0') & '\h*=\h*(.*?)\h*\r?$', 1) ; извлечение параметра
  28.     If @error Then Return $sDefault
  29.     Switch StringLeft($aSection[0], 1) & StringRight($aSection[0], 1) ; если параметры в кавычках, то удаление кавычек " и '
  30.         Case '""', "''"
  31.             $aSection[0] = StringTrimLeft(StringTrimRight($aSection[0], 1), 1)
  32.     EndSwitch
  33.     Return $aSection[0]
  34. EndFunc   ;==>_IniVirtualSPE_Read
  35.  
  36. Func _IniVirtualSPE_ReadSection($s_INI_Text, $sSection)
  37.     $sSection = StringRegExpReplace($sSection, '[][{}()*+?.\\^$|=<>#]', '\\$0')
  38.     Local $aSection = StringRegExp($s_INI_Text, '(?s)(?:\r\n|\A)\h*\[\h*' & $sSection & '\h*\]\h*\r\n\s*([^\[\s].*?)(?=\r\n\h*\[|\s*\z)', 1) ; извлечение контента секции
  39.     If @error Then Return SetError(1, 0, 0)
  40.     Return __GetKeysVal($aSection[0])
  41. EndFunc   ;==>_IniVirtualSPE_ReadSection
  42.  
  43. Func __GetKeysVal($vData)
  44.     $vData = StringRegExp($vData, '(?m)^\h*([^;].*?)\h*=\h*(["'']?)(.*?)\2\h*\r?$', 3) ; учитывает пробелы между элементами и обрамление кавычками
  45.     Local $d, $u = UBound($vData) ; 0 как индикатор ошибки
  46.     Local $aData2D[$u / 3 + 1][2] = [[$u / 3]]
  47.     For $i = 0 To $u - 1 Step 3
  48.         $d = Int($i / 3) + 1
  49.         $aData2D[$d][0] = $vData[$i]
  50.         $aData2D[$d][1] = $vData[$i + 2]
  51.     Next
  52.     Return $aData2D
  53. EndFunc   ;==>__GetKeysVal
  54.  
  55. Func _IniVirtualSPE_Delete(ByRef $s_INI_Text, $sSection, $sKey = Default)
  56.     If $sKey = Default Then
  57.         $sSection = StringRegExpReplace($sSection, '[][{}()*+?.\\^$|=<>#]', '\\$0')
  58.         $s_INI_Text = StringRegExpReplace($s_INI_Text, '(?s)(?:\r\n|\A)(\h*\[\h*' & $sSection & '\h*\]\h*(?:\r\n\s*[^\[\s].*?|))(?=\r\n\h*\[|\s*\z)', '') ; удаление секции
  59.         If @error Then
  60.             Return SetError(0, 1, 1)
  61.         Else
  62.             Return SetError(0, @extended, 1)
  63.         EndIf
  64.     Else
  65.         Local $aSection = StringRegExp($s_ini_Text, '(?s)(?:\r\n|\A)\h*\[\h*' & StringRegExpReplace($sSection, '[][{}()*+?.\\^$|=<>#]', '\\$0') & '\h*\]\h*(\r\n\s*[^\[\s].*?\h*)(\s*\[\h*.*?\h*\]|\s*\z)', 2) ; извлечение контента секции
  66.         If @error Then Return SetError(0, 1, 1)
  67.         Local $iEndSection = @extended - StringLen($aSection[2]) - 1 ; конец секции
  68.         Local $aKey = StringRegExp($aSection[1], '(?s)(\r\n\h*' & StringRegExpReplace($sKey, '[][{}()*+?.\\^$|=<>#]', '\\$0') & '\h*=\h*.*?\h*)(\s*\r\n|\s*\z)', 2) ; извлечение параметра
  69.         If @error Then Return SetError(0, 2, 1)
  70.         Local $iStart = @extended - StringLen($aKey[1]) - StringLen($aKey[2]) - 1 + $iEndSection - StringLen($aSection[1]) ; начало секции + начало параметра
  71.         $s_INI_Text = StringLeft($s_INI_Text, $iStart) & StringTrimLeft($s_INI_Text, $iStart + StringLen($aKey[1]))
  72.         Return 1
  73.     EndIf
  74. EndFunc   ;==>_IniVirtualSPE_Delete
  75.  
  76. Func _IniVirtualSPE_Write(ByRef $s_ini_Text, $sSection, $sKey, $sValue)
  77.     $sValue = StringRegExpReplace($sValue, '^([''"]).*\1\z', '"\0"')
  78.     ; Если значение содержит пробел справа или слева, то обрамляем в кавычки
  79.     If StringRegExp($sValue, '^\h|\h\z') Then $sValue = '"' & $sValue & '"'
  80.     Local $aSection = StringRegExp($s_ini_Text, '(?s)(?:\r\n|\A)\h*\[\h*' & StringRegExpReplace($sSection, '[][{}()*+?.\\^$|=<>#]', '\\$0') & '\h*\]\h*(\r\n\s*[^\[\s].*?\h*)(\s*\[\h*.*?\h*\]|\s*\z)', 2) ; извлечение контента секции
  81.     If @error Then
  82.         ; если не найдено, то запись в конец файла
  83.         $s_ini_Text &= @CRLF & @CRLF & '[' & $sSection & ']' & @CRLF & $sKey & '=' & $sValue; Добавление новой секции
  84.     Else
  85.         Local $iEndSection = @extended - StringLen($aSection[2]) - 1 ; конец секции
  86.         ; извлечение параметра
  87.         Local $aKey = StringRegExp($aSection[1], '(?s)\r\n\h*' & StringRegExpReplace($sKey, '[][{}()*+?.\\^$|=<>#]', '\\$0') & '\h*=\h*(.*?)(\s*\r\n|\s*\z)', 2)
  88.         If @error Then
  89.             ; если не найден ключ, то запись в конец секции
  90.             $s_ini_Text = StringLeft($s_ini_Text, $iEndSection) & @CRLF & $sKey & '=' & $sValue & StringTrimLeft($s_ini_Text, $iEndSection) ; Добавление нового параметра
  91.         Else
  92.             Local $iStart = @extended - StringLen($aKey[1]) - StringLen($aKey[2]) - 1 + $iEndSection - StringLen($aSection[1]) ; начало секции + начало параметра
  93.             $s_ini_Text = StringLeft($s_ini_Text, $iStart) & StringReplace(StringTrimLeft($s_ini_Text, $iStart), $aKey[1], $sValue, 1, 1) ; Замена значения
  94.         EndIf
  95.     EndIf
  96.     Return 1
  97. EndFunc   ;==>_IniVirtualSPE_Write
  98.  
  99. Func _IniVirtualSPE_WriteSection(ByRef $s_INI_Text, $sSection, $vData, $iIndex = 1)
  100.     Local $u = 0
  101.     If IsArray($vData) Then
  102.         If UBound($vData, 0) <> 2 Then Return SetError(1, 0, 0)
  103.         $u = UBound($vData)
  104.         If $iIndex > $u - 1 Or $iIndex < 0 Or Not StringIsDigit($iIndex) Then Return SetError(2, 0, 0)
  105.     EndIf
  106.     _IniVirtualSPE_Delete($s_INI_Text, $sSection) ; удаляем секцию на случай если она существует
  107.     If $u Then ; Если массив, то в цикле соединяем элементы в текстовые данные
  108.         Local $sData = ''
  109.         For $i = $iIndex To $u - 1
  110.             $vData[$i][1] = StringRegExpReplace($vData[$i][1], '^([''"]).*\1\z', '"\0"')
  111.             If StringRegExp($vData[$i][1], '^\h|\h\z') Then $vData[$i][1] = '"' & $vData[$i][1] & '"'
  112.             $sData &= $vData[$i][0] & '=' & $vData[$i][1] & @CRLF
  113.         Next
  114.         $vData = StringTrimRight($sData, 2)
  115.     EndIf
  116.     $s_INI_Text &= @CRLF & @CRLF & '[' & $sSection & ']' & @CRLF & StringRegExpReplace($vData, '(?<!\r)\n', @CRLF)
  117.     Return 1
  118. EndFunc   ;==>_IniVirtualSPE_WriteSection
  119.  
  120. Func _SectionExists($s_INI_Text, $sSection)
  121.     $sSection = StringRegExpReplace($sSection, '[][{}()*+?.\\^$|=<>#]', '\\$0')
  122.     Return StringRegExp($s_INI_Text, '(?s)(?:\r\n|\A)\h*\[\h*' & $sSection & '\h*\]\h*(?=\r\n|\s*\z)') ; извлечение контента секции
  123. EndFunc   ;==>_SectionExists
  124.  
  125. Func _IniVirtualSPE_RenameSection(ByRef $s_INI_Text, $sSection, $sNewName, $flag = 0)
  126.     If Not _SectionExists($s_INI_Text, $sSection) Then Return SetError(1, 0, 0) ; если старая секция не существует, то завершение функции
  127.     If $flag Then ; Если перезаписывать, то
  128.         _IniVirtualSPE_Delete($s_INI_Text, $sNewName) ; удаляем новую секцию на случай если она существует
  129.         $sSection = StringRegExpReplace($sSection, '[][{}()*+?.\\^$|=<>#]', '\\$0')
  130.         $s_INI_Text = StringRegExpReplace($s_INI_Text, '(?m)^(\h*\[\h*)(' & $sSection & ')(\h*\]\h*\r?)$', '\1' & $sNewName & '\3') ; переименование секции
  131.     Else
  132.         If _SectionExists($s_INI_Text, $sNewName) Then
  133.             Return SetError(2, 0, 0)
  134.         Else
  135.             $sSection = StringRegExpReplace($sSection, '[][{}()*+?.\\^$|=<>#]', '\\$0')
  136.             $s_INI_Text = StringRegExpReplace($s_INI_Text, '(?m)^(\h*\[\h*)(' & $sSection & ')(\h*\]\h*\r?)$', '\1' & $sNewName & '\3') ; переименование секции
  137.         EndIf
  138.     EndIf
  139.     Return 1
  140. EndFunc   ;==>_IniVirtualSPE_RenameSection
  141.  
  142. Func _IniVirtualSPE_ReadSectionNames($s_INI_Text)
  143.     $s_INI_Text = StringRegExp($s_INI_Text, '(?m)^\h*\[\h*(.*?)\h*\]\h*\r?$', 3) ; переименование секции
  144.     If @error Then Return SetError(1, 0, 0)
  145.     Local $u = UBound($s_INI_Text)
  146.     ReDim $s_INI_Text[$u + 1]
  147.     For $i = $u To 1 Step -1
  148.         $s_INI_Text[$i] = $s_INI_Text[$i - 1]
  149.     Next
  150.     $s_INI_Text[0] = $u
  151.     Return $s_INI_Text
  152. EndFunc   ;==>_IniVirtualSPE_ReadSectionNames
  153.  
  154. Func _IniVirtualSPE_IsDuplicateKeys($s_INI_Text, $sSection)
  155.     Local $aDuplicate[1] = [0]
  156.     $aKey = _IniVirtualSPE_ReadSection($s_INI_Text, $sSection)
  157.     If @error Then Return $aDuplicate
  158.     Local $s = Chr(1)
  159.     Assign($s, 1, 1)
  160.     For $i = 1 To $aKey[0][0]
  161.         If IsDeclared($aKey[$i][0] & $s) Then
  162.             $aDuplicate[0] += 1
  163.             ReDim $aDuplicate[$aDuplicate[0] + 1]
  164.             $aDuplicate[$aDuplicate[0]] = $aKey[$i][0]
  165.         Else
  166.             Assign($aKey[$i][0] & $s, 1, 1)
  167.         EndIf
  168.     Next
  169.     Return $aDuplicate
  170.     ; If $aDuplicate[0] Then
  171.         ; Return $aDuplicate
  172.     ; Else
  173.         ; Return True
  174.     ; EndIf
  175. EndFunc   ;==>_IniVirtualSPE_IsDuplicateKeys
  176.  
  177. Func _IniVirtualSPE_IsDuplicateSection($s_INI_Text)
  178.     Local $aDuplicate[1] = [0]
  179.     $aKey = _IniVirtualSPE_ReadSectionNames($s_INI_Text)
  180.     If @error Then Return $aDuplicate
  181.     Local $s = Chr(1)
  182.     Assign($s, 1, 1)
  183.     For $i = 1 To $aKey[0]
  184.         If IsDeclared($aKey[$i] & $s) Then
  185.             $aDuplicate[0] += 1
  186.             ReDim $aDuplicate[$aDuplicate[0] + 1]
  187.             $aDuplicate[$aDuplicate[0]] = $aKey[$i]
  188.         Else
  189.             Assign($aKey[$i] & $s, 1, 1)
  190.         EndIf
  191.     Next
  192.     Return $aDuplicate
  193.     ; If $aDuplicate[0] Then
  194.         ; Return $aDuplicate
  195.     ; Else
  196.         ; Return True
  197.     ; EndIf
  198. EndFunc   ;==>_IniVirtualSPE_IsDuplicateSection
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement