Linux + .config/NameProg

Linux specific forum
AZJIO
Addict
Addict
Posts: 2143
Joined: Sun May 14, 2017 1:48 am

Linux + .config/NameProg

Post by AZJIO »

In this way, I began to copy the settings of the program

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
Extract-test.pb

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
NameProg.pb

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"