• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1-- Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
2--
3-- This software is provided 'as-is', without any express or implied
4-- warranty.  In no event will the authors be held liable for any damages
5-- arising from the use of this software.
6--
7-- Permission is granted to anyone to use this software for any purpose,
8-- including commercial applications, and to alter it and redistribute it
9-- freely.
10--
11-- Meta-build system using premake created and maintained by
12-- Benjamin Henning <b.henning@digipen.edu>
13
14--[[
15sdl_file.lua
16
17	This function contains a wrapper for the I/O file operations, providing a few
18	custom functions which simplify the file I/O process (especially useful for
19	the vast amount of generation used by the meta-build system).
20]]
21
22-- Given a filename and open mode (look at io.open for more information), opens
23-- the file with various contained functions for printing to the file, writing
24-- to the file, reading from the file, or closing the file. If the filename is
25-- nil, then this will open a file in a special text mode. In that case, the
26-- mode is ignored. Returned is an instanced table with all of the
27-- aforementioned functions.
28--
29-- The print function is associated with textprint/fileprint, the write function
30-- with textwrite/filewrite, the read function with fileread, and the close
31-- function with textclose/fileclose.
32function fileopen(file, mode)
33	if file == nil then
34		return { texth = "", print = textprint, write = textwrite, read = nil, close = textclose }
35	else
36		return { fileh = io.open(file, mode), print = fileprint, write = filewrite, read = fileread, close = fileclose }
37	end
38end
39
40-- Given a filename and file mode, reads the entire contents of the file and
41-- returns the contents as a string.
42function readfile(file, mode)
43	local file = fileopen(file, mode)
44	local content = file:read()
45	file:close()
46	return content
47end
48
49-- Given a file, the number of tabs to indent, and a line to print, append the
50-- line tabbed n times with an appended newline to the end of the input text.
51function textprint(f, tabs, line)
52	for i = 0, tabs - 1, 1 do
53		f.texth = f.texth .. "\t"
54	end
55	f.texth = f.texth .. line .. "\n"
56end
57
58-- Given a file, the number of tabs to indent, and a line to print, append the
59-- line tabbed n times with an appended newline to the end of the input file.
60function fileprint(f, tabs, line)
61	for i = 0, tabs - 1, 1 do
62		f.fileh:write("\t")
63	end
64	f.fileh:write(line .. "\n")
65end
66
67-- Given a file and some text, append the text to the end of the input text.
68function textwrite(f, text)
69	f.texth = f.texth .. text
70end
71
72-- Given a file and some text, append the text to the end of the input file.
73function filewrite(f, text)
74	f.fileh:write(text)
75end
76
77-- Given a file, read all the contents of the file and return them as a string.
78function fileread(file)
79	return file.fileh:read("*all")
80end
81
82-- Given a file opened in text mode, return the result of the current file
83-- operations as a text string.
84function textclose(file)
85	return file.texth
86end
87
88-- Given a file opened regularly, close the file handle resource, preventing
89-- any future I/O operations.
90function fileclose(file)
91	file.fileh:close()
92end
93
94-- Given a source path, builds a table containing all directories and recursive
95-- subdirectories which contain files, and returns the table. Each entry in the
96-- table will have a '/' at the end of its path, plus they will all be relative
97-- to the parent source path. The table will contain a single entry with the
98-- value '/' to indicate the source path itself.
99function createDirTable(sourcePath)
100	local dirs = os.matchdirs(sourcePath.."/**")
101	for k,d in pairs(dirs) do
102		dirs[k] = string.sub(d, #sourcePath + 1) .. "/"
103	end
104	table.insert(dirs, "/")
105	return dirs
106end
107
108-- This works like os.pathsearch, but for directories. Look at the premake
109-- documentation for os.pathsearch for more information.
110os.dirpathsearch = function(subdir, path, path_delimiter)
111	for i,p in ipairs(explode(path, path_delimiter)) do
112		local needle = p .. "/" .. subdir
113		if os.isdir(needle) then
114			return needle
115		end
116	end
117	return nil
118end
119
120-- Given a variable number of environmental variable names, this will join them
121-- together based on the current OS path delimeter and quietly ignoring those
122-- variables which do not exist on this system. The resulting path is always
123-- normalized for Unix-based path separators, regardless of the system.
124os.getenvpath = function(...)
125	local path = ""
126	local pathDelimeter = ":"
127	if os.is("windows") then
128		pathDelimeter = ";"
129	end
130	for i,a in ipairs(arg) do
131		local value = os.getenv(a)
132		if value then
133			if #path > 0 then
134				path = path .. pathDelimeter
135			end
136			path = path .. value
137		end
138	end
139	-- normalize path to unix
140	return path:gsub("\\", "/"):gsub("//", "/")
141end
142