Packer.pb
Code: Select all
EnableExplicit
; wilbert
; https://www.purebasic.fr/english/viewtopic.php?p=486382#p486382
Procedure SplitL(String.s, List StringList.s(), Separator.s = " ")
Protected S.String, *S.Integer = @S
Protected.i p, slen
slen = Len(Separator)
ClearList(StringList())
*S\i = @String
Repeat
AddElement(StringList())
p = FindString(S\s, Separator)
StringList() = PeekS(*S\i, p - 1)
*S\i + (p + slen - 1) << #PB_Compiler_Unicode
Until p = 0
*S\i = 0
EndProcedure
Procedure FileSearch_find(List Files.s(), sPath.s, Mask$ = "*")
Protected tmp, printf$, Len, Result.string, *Point;, shell$, comstr$, string$
printf$ = "-printf '%P\n"
tmp = RunProgram("bash", ~"-c \"find '" + sPath + "' -type f " + printf$ + ~"' 2>&1\"", "", #PB_Program_Open | #PB_Program_Read)
If tmp
While ProgramRunning(tmp)
If AvailableProgramOutput(tmp)
If AddElement(Files())
Files() = ReadProgramString(tmp)
EndIf
EndIf
Wend
CloseProgram(tmp)
; Подсчитываем размер
ForEach Files()
Len + Len(Files())
Next
Len+ListSize(Files()) ; добавляем число переносов строк #CR$ по количеству данных
Result\s = Space(Len)
*Point = @Result\s
ForEach Files()
CopyMemoryString(Files()+Chr(2), @*Point)
Next
Result\s = Left(Result\s, Len(Result\s) - 1) ; заранее известен лишний символ добавляемый в перечислении CopyMemoryString()
; внутри функции Files() очищается и заполняется новыми данными
SplitL(Result\s, Files(), Chr(2))
If ListSize(Files()) = 1 And Files() = ""
ClearList(Files())
EndIf
EndIf
EndProcedure
UseBriefLZPacker()
Define Path$ = "/media/windows/PureBasic/Source/NameProg/Linux/config/My_Notepad_Sci/"
Define NewList Files.s()
FileSearch_find(Files(), Path$)
Debug ListSize(Files())
; Создаём архивный файл
If CreatePack(0, "config-archive-BriefLZ.blz", #PB_PackerPlugin_BriefLZ)
ForEach Files()
AddPackFile(0, Path$ + Files(), Files())
Next
ClosePack(0)
EndIf
Code: Select all
UseBriefLZPacker()
; ts-soft (+AZJIO)
; https://www.purebasic.fr/english/viewtopic.php?p=317830#p317830
Procedure ForceDirectories(Dir.s)
Static tmpDir.s, Init
Protected result
If Asc(Dir)
If Not Init
tmpDir = Dir
Init = #True
EndIf
If (Right(Dir, 1) = #PS$)
Dir = Left(Dir, Len(Dir) - 1)
EndIf
If (Len(Dir) < 3) Or FileSize(Dir) = -2 Or GetPathPart(Dir) = Dir
If FileSize(tmpDir) = -2
result = #True
EndIf
tmpDir = ""
Init = #False
ProcedureReturn result
EndIf
ForceDirectories(GetPathPart(Dir))
ProcedureReturn CreateDirectory(Dir)
Else
ProcedureReturn #False
EndIf
EndProcedure
Define path.s = "/home/user/.config/NameProg/"
If OpenPack(0, "config-archive-BriefLZ.blz")
If ExaminePack(0)
While NextPackEntry(0)
If UncompressPackFile(0, path + PackEntryName(0), PackEntryName(0)) = -1 And ForceDirectories(GetPathPart(path + PackEntryName(0)))
UncompressPackFile(0, path + PackEntryName(0), PackEntryName(0))
EndIf
Wend
EndIf
ClosePack(0)
EndIf
Code: Select all
;- ini
PathConfig$ = GetPathPart(ProgramFilename())
If FileSize(PathConfig$ + "NameProg.ini") = -1
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
PathConfig$ = GetHomeDirectory() + "AppData\Roaming\NameProg\"
CompilerCase #PB_OS_Linux
PathConfig$ = GetHomeDirectory() + ".config/NameProg/"
If FileSize(PathConfig$) = -1 And FileSize("/usr/share/Author/NameProg/config-archive-BriefLZ.blz") > 0
#Archive = 0
If OpenPack(#Archive, "/usr/share/Author/NameProg/config-archive-BriefLZ.blz")
If ExaminePack(#Archive)
While NextPackEntry(#Archive)
If UncompressPackFile(#Archive, PathConfig$ + PackEntryName(#Archive), PackEntryName(#Archive)) = -1 And ForceDirectories(GetPathPart(PathConfig$ + PackEntryName(#Archive)))
UncompressPackFile(#Archive, PathConfig$ + PackEntryName(#Archive), PackEntryName(#Archive))
EndIf
Wend
EndIf
ClosePack(#Archive)
EndIf
EndIf
; CompilerCase #PB_OS_MacOS
; PathConfig$ = GetHomeDirectory() + "Library/Application Support/NameProg/"
CompilerEndSelect
; Else
; isPortable = 1
EndIf
ini$ = PathConfig$ + "NameProg.ini"