' Merge_Files.eba
' Merge Files in Folders

Declare import,SHBrowseForFolder(param1:uint),int
Declare import,SHGetPathFromIDList(param1:uint, param2:uint),int
Declare import,CoTaskMemFree(param1:int),int
Declare Import,RtlZeroMemory(dat:uint,length:int),int
Declare import,SendMessageA(hWnd:uint, message:uint, wParam:int, lparam:uint),uint

TYPE BROWSEINFO
	UINT hOwner
	UINT pidlRoot
	POINTER pszDisplayName
	POINTER lpszTitle
	UINT ulFlags
	UINT lpfn
	UINT lParam
	UINT iImage
ENDTYPE

CONST WM_USER = 0x400
CONST BFFM_SETSELECTION = WM_USER + 102
CONST BFFM_INITIALIZED = 1
CONST BFFM_VALIDATEFAILED = 3
CONST BIF_RETURNFSANCESTORS = 8
CONST BIF_RETURNONLYFSDIRS = 1
CONST BIF_NEWDIALOGSTYLE = 0x40
CONST BIF_DONTGOBELOWDOMAIN = 2

ISTRING dir[261]
STRING q, ext
OPENCONSOLE
IF FolderRequest(0, "get folder", dir, GetStartPath, 0x441)
	INPUT "Enter extension to Merge? ", ext
	MergeFiles(dir, ext)
ENDIF
PRINT "Done"
INPUT q
CLOSECONSOLE
END

'________________________________________________________________________________________
SUB FolderRequest(hWnd:uint, title:pointer, dir:pointer, initial:pointer, flags:uint),int
'________________________________________________________________________________________
INT r : r = FALSE
ISTRING buffer[261]
UINT item_list
BROWSEINFO bi
RtlZeroMemory(&bi, LEN(bi))
bi.hOwner = hWnd
bi.lpszTitle = title
bi.ulFlags = flags
IF flags = 0 THEN bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_DONTGOBELOWDOMAIN
bi.lpfn = &BrowseFolderCallback
bi.lParam = initial
' Display the browser.
item_list = SHBrowseForFolder(&bi)
IF item_list
	IF SHGetPathFromIDList(item_list, &buffer)
		IF MID$(buffer,LEN(buffer),1) <> "\\"
			#<STRING>dir = buffer + "\\"
		ELSE
			#<STRING>dir = buffer
		ENDIF
		r = TRUE
	ENDIF
	CoTaskMemFree(item_list)
ENDIF
RETURN r
ENDSUB

'___________________________________________________________________________
SUB BrowseFolderCallback(hWnd:uint, uMsg:uint, lParam:uint, lpData:uint),int
'___________________________________________________________________________
SELECT uMsg
	CASE BFFM_INITIALIZED
		SendMessageA( hWnd, BFFM_SETSELECTION, TRUE, lpData )
	CASE BFFM_VALIDATEFAILED
		RETURN 1
ENDSELECT
RETURN 0
ENDSUB

'______________________________________
SUB MergeFiles(path:STRING, ext:STRING)
'______________________________________
DEF dir,attrib:INT
DEF I_File, O_File:FILE
DEF filename, fullname:STRING
DEF File_Name_I:STRING
DEF line_in:string

if (openfile(O_File,path + "!Merged.XXX","W") = 0)
	dir = FINDOPEN(path + "*." + ext)
	IF(dir)
		DO
			filename = FINDNEXT(dir,attrib)
			IF len(filename)
				IF attrib & @FILE_DIRECTORY
					fullname = ""
				ELSE
					File_Name_I = path + filename
					print File_Name_I
					if (openfile(I_File,File_Name_I,"R") <> 0)
						print "File: ", File_Name_I, " Not able to Open Input"
						goto Aborted
					endif
					while (read(I_File,line_in) = 0)
						WRITE O_File, line_in
					endwhile
					closefile I_file
				ENDIF
			ENDIF
		UNTIL filename = ""
		FINDCLOSE dir
	ENDIF
ELSE
	print "File: ", path, "!Merged.XXX Not able to Open Output"
ENDIF
label Aborted
RETURN
ENDSUB