| -- Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org> | |
| -- | |
| -- This software is provided 'as-is', without any express or implied | |
| -- warranty. In no event will the authors be held liable for any damages | |
| -- arising from the use of this software. | |
| -- | |
| -- Permission is granted to anyone to use this software for any purpose, | |
| -- including commercial applications, and to alter it and redistribute it | |
| -- freely. | |
| -- | |
| -- Meta-build system using premake created and maintained by | |
| -- Benjamin Henning <b.henning@digipen.edu> | |
| --[[ | |
| sdl_file.lua | |
| This function contains a wrapper for the I/O file operations, providing a few | |
| custom functions which simplify the file I/O process (especially useful for | |
| the vast amount of generation used by the meta-build system). | |
| ]] | |
| -- Given a filename and open mode (look at io.open for more information), opens | |
| -- the file with various contained functions for printing to the file, writing | |
| -- to the file, reading from the file, or closing the file. If the filename is | |
| -- nil, then this will open a file in a special text mode. In that case, the | |
| -- mode is ignored. Returned is an instanced table with all of the | |
| -- aforementioned functions. | |
| -- | |
| -- The print function is associated with textprint/fileprint, the write function | |
| -- with textwrite/filewrite, the read function with fileread, and the close | |
| -- function with textclose/fileclose. | |
| function fileopen(file, mode) | |
| if file == nil then | |
| return { texth = "", print = textprint, write = textwrite, read = nil, close = textclose } | |
| else | |
| return { fileh = io.open(file, mode), print = fileprint, write = filewrite, read = fileread, close = fileclose } | |
| end | |
| end | |
| -- Given a filename and file mode, reads the entire contents of the file and | |
| -- returns the contents as a string. | |
| function readfile(file, mode) | |
| local file = fileopen(file, mode) | |
| local content = file:read() | |
| file:close() | |
| return content | |
| end | |
| -- Given a file, the number of tabs to indent, and a line to print, append the | |
| -- line tabbed n times with an appended newline to the end of the input text. | |
| function textprint(f, tabs, line) | |
| for i = 0, tabs - 1, 1 do | |
| f.texth = f.texth .. "\t" | |
| end | |
| f.texth = f.texth .. line .. "\n" | |
| end | |
| -- Given a file, the number of tabs to indent, and a line to print, append the | |
| -- line tabbed n times with an appended newline to the end of the input file. | |
| function fileprint(f, tabs, line) | |
| for i = 0, tabs - 1, 1 do | |
| f.fileh:write("\t") | |
| end | |
| f.fileh:write(line .. "\n") | |
| end | |
| -- Given a file and some text, append the text to the end of the input text. | |
| function textwrite(f, text) | |
| f.texth = f.texth .. text | |
| end | |
| -- Given a file and some text, append the text to the end of the input file. | |
| function filewrite(f, text) | |
| f.fileh:write(text) | |
| end | |
| -- Given a file, read all the contents of the file and return them as a string. | |
| function fileread(file) | |
| return file.fileh:read("*all") | |
| end | |
| -- Given a file opened in text mode, return the result of the current file | |
| -- operations as a text string. | |
| function textclose(file) | |
| return file.texth | |
| end | |
| -- Given a file opened regularly, close the file handle resource, preventing | |
| -- any future I/O operations. | |
| function fileclose(file) | |
| file.fileh:close() | |
| end | |
| -- Given a source path, builds a table containing all directories and recursive | |
| -- subdirectories which contain files, and returns the table. Each entry in the | |
| -- table will have a '/' at the end of its path, plus they will all be relative | |
| -- to the parent source path. The table will contain a single entry with the | |
| -- value '/' to indicate the source path itself. | |
| function createDirTable(sourcePath) | |
| local dirs = os.matchdirs(sourcePath.."/**") | |
| for k,d in pairs(dirs) do | |
| dirs[k] = string.sub(d, #sourcePath + 1) .. "/" | |
| end | |
| table.insert(dirs, "/") | |
| return dirs | |
| end | |
| -- This works like os.pathsearch, but for directories. Look at the premake | |
| -- documentation for os.pathsearch for more information. | |
| os.dirpathsearch = function(subdir, path, path_delimiter) | |
| for i,p in ipairs(explode(path, path_delimiter)) do | |
| local needle = p .. "/" .. subdir | |
| if os.isdir(needle) then | |
| return needle | |
| end | |
| end | |
| return nil | |
| end | |
| -- Given a variable number of environmental variable names, this will join them | |
| -- together based on the current OS path delimeter and quietly ignoring those | |
| -- variables which do not exist on this system. The resulting path is always | |
| -- normalized for Unix-based path separators, regardless of the system. | |
| os.getenvpath = function(...) | |
| local path = "" | |
| local pathDelimeter = ":" | |
| if os.is("windows") then | |
| pathDelimeter = ";" | |
| end | |
| for i,a in ipairs(arg) do | |
| local value = os.getenv(a) | |
| if value then | |
| if #path > 0 then | |
| path = path .. pathDelimeter | |
| end | |
| path = path .. value | |
| end | |
| end | |
| -- normalize path to unix | |
| return path:gsub("\\", "/"):gsub("//", "/") | |
| end |