sdl_file.lua (4923B)
1-- Copyright (C) 1997-2014 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