-- part of OpenGLAda, (c) 2017 Felix Krause -- released under the terms of the MIT license, see the file "COPYING" with Ada.Directories; with Ada.Direct_IO; with Ada.Unchecked_Deallocation; with Interfaces.C.Strings; with GL.API; with GL.Types; package body GL.Files is use GL.Types; procedure Load_Shader_Source_From_File (Object : Objects.Shaders.Shader; File_Name : String) is procedure Free is new Ada.Unchecked_Deallocation (C.char_array, C.Strings.char_array_access); File_Size : constant Int := Int (Ada.Directories.Size (File_Name)); -- File string *without* null termination subtype File_String is C.char_array (1 .. C.size_t (File_Size)); package File_String_IO is new Ada.Direct_IO (File_String); File : File_String_IO.File_Type; Raw_Contents : C.Strings.char_array_access := new C.char_array (1 .. C.size_t (File_Size + 1)); begin File_String_IO.Open (File, Mode => File_String_IO.In_File, Name => File_Name); File_String_IO.Read (File, Item => Raw_Contents.all (1 .. C.size_t (File_Size))); File_String_IO.Close (File); Raw_Contents.all (C.size_t (File_Size + 1)) := C.nul; API.Shader_Source (Object.Raw_Id, 1, (1 => Raw_Contents (1)'Unchecked_Access), (1 => File_Size)); Free (Raw_Contents); Raise_Exception_On_OpenGL_Error; end Load_Shader_Source_From_File; end GL.Files;