-- Copyright (C) 1997-2016 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_gen_config.lua

	Given a series of set configuration values from the project definitions,
	this file contains a series of functions that generate valid preprocessor
	definitions to enable or disable various features of the SDL2 library. These
	definitions are pasted into a template SDL config header file, which is then
	saved in the local directory and referenced to in generated project files.

	This file depends on sdl_file.lua.
]]

-- The line that must exist in the template file in order to properly paste
-- the generated definitions.
local searchKey = "/%* Paste generated code here %*/\n"

local configFile, templateFileContents
local insertLocation

-- This function begins config header generation given the name of the generated
-- file and the name of the template file to use.
function startGeneration(file, template)
	configFile = fileopen(file, "w")
	templateFileContents = readfile(template, "r")
	insertLocation = templateFileContents:find(searchKey)
	if insertLocation then
		configFile:write(templateFileContents:sub(1, insertLocation - 1))
	end
end

-- Adds a table of configuration values to the generated file. Each
-- configuration line is wrapped around a preprocessor definition check, so they
-- can be manually overwritten by the developer if necessary. The definition
-- pastes string versions of both the key and the value on the line, where
-- either is allowed to be empty. That means the table stores key-value pairs.
function addConfig(tbl)
	-- if no insert location, don't paste anything
	if not insertLocation then return end
	for k,v in pairs(tbl) do
		configFile:print(0, "#ifndef " .. k)
		configFile:print(0, "#define " .. tostring(k) .. " " .. tostring(v))
		configFile:print(0, "#endif")
	end
end

-- Finishes the generation and writes the remains of the template file into the
-- generated config file.
function endGeneration()
	if insertLocation then
		configFile:write(templateFileContents:sub(insertLocation + #searchKey - 2))
	else -- write entire file since nothing is being pasted
		configFile:write(templateFileContents)
	end
	configFile:close()
end
