Browse Source

Merge branch 'master' of https://github.com/odin-lang/Odin

gingerBill 6 years ago
parent
commit
c197a27185
4 changed files with 80 additions and 24 deletions
  1. 35 0
      core/os/os_windows.odin
  2. 16 0
      core/sys/win32/general.odin
  3. 25 24
      core/sys/win32/kernel32.odin
  4. 4 0
      src/types.cpp

+ 35 - 0
core/os/os_windows.odin

@@ -287,4 +287,39 @@ _alloc_command_line_arguments :: proc() -> []string {
 	return arg_list;
 	return arg_list;
 }
 }
 
 
+get_windows_version_ansi :: proc() -> win32.OS_Version_Info_Ex_A {
+	osvi : win32.OS_Version_Info_Ex_A;
+	osvi.os_version_info_size = size_of(win32.OS_Version_Info_Ex_A);
+    win32.get_version(&osvi);
+    return osvi;
+}
+
+is_windows_xp :: proc() -> bool {
+	osvi := get_windows_version_ansi();
+	return (osvi.major_version == 5 && osvi.minor_version == 1);
+}
+
+is_windows_vista :: proc() -> bool {
+	osvi := get_windows_version_ansi();
+	return (osvi.major_version == 6 && osvi.minor_version == 0);
+}
+
+is_windows_7 :: proc() -> bool {
+	osvi := get_windows_version_ansi();
+	return (osvi.major_version == 6 && osvi.minor_version == 1);
+}
+
+is_windows_8 :: proc() -> bool {
+	osvi := get_windows_version_ansi();
+	return (osvi.major_version == 6 && osvi.minor_version == 2);
+}
+
+is_windows_8_1 :: proc() -> bool {
+	osvi := get_windows_version_ansi();
+	return (osvi.major_version == 6 && osvi.minor_version == 3);
+}
 
 
+is_windows_10 :: proc() -> bool {
+	osvi := get_windows_version_ansi();
+	return (osvi.major_version == 10 && osvi.minor_version == 0);
+}

+ 16 - 0
core/sys/win32/general.odin

@@ -298,6 +298,22 @@ File_Notify_Information :: struct {
   file_name:         [1]u16,
   file_name:         [1]u16,
 }
 }
 
 
+
+// https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-_osversioninfoexa
+OS_Version_Info_Ex_A :: struct {
+  os_version_info_size: u32,
+  major_version:        u32,
+  minor_version:        u32,
+  build_number:         u32,
+  platform_id :         u32,
+  service_pack_string:  [128]u8,
+  service_pack_major:   u16,
+  service_pack_minor:   u16,
+  suite_mask:           u16,
+  product_type:         u8,
+  reserved:             u8
+}
+
 MAPVK_VK_TO_VSC    :: 0;
 MAPVK_VK_TO_VSC    :: 0;
 MAPVK_VSC_TO_VK    :: 1;
 MAPVK_VSC_TO_VK    :: 1;
 MAPVK_VK_TO_CHAR   :: 2;
 MAPVK_VK_TO_CHAR   :: 2;

+ 25 - 24
core/sys/win32/kernel32.odin

@@ -5,38 +5,39 @@ foreign import "system:kernel32.lib"
 
 
 @(default_calling_convention = "std")
 @(default_calling_convention = "std")
 foreign kernel32 {
 foreign kernel32 {
-	@(link_name="GetLastError")              get_last_error              :: proc() -> i32 ---;
-	@(link_name="CreateProcessA")		     create_process_a		     :: proc(application_name, command_line: cstring,
+	@(link_name="GetLastError")              get_last_error               :: proc() -> i32 ---;
+	@(link_name="CreateProcessA")		     create_process_a		      :: proc(application_name, command_line: cstring,
 	                                                              				 process_attributes, thread_attributes: ^Security_Attributes,
 	                                                              				 process_attributes, thread_attributes: ^Security_Attributes,
 	                                                              				 inherit_handle: Bool, creation_flags: u32, environment: rawptr,
 	                                                              				 inherit_handle: Bool, creation_flags: u32, environment: rawptr,
 	                                                              				 current_direcotry: cstring, startup_info: ^Startup_Info,
 	                                                              				 current_direcotry: cstring, startup_info: ^Startup_Info,
 	                                                              				 process_information: ^Process_Information) -> Bool ---;
 	                                                              				 process_information: ^Process_Information) -> Bool ---;
-    @(link_name="CreateProcessW")            create_process_w            :: proc(application_name, command_line: Wstring,
+    @(link_name="CreateProcessW")            create_process_w             :: proc(application_name, command_line: Wstring,
                                                                                  process_attributes, thread_attributes: ^Security_Attributes,
                                                                                  process_attributes, thread_attributes: ^Security_Attributes,
                                                                                  inherit_handle: Bool, creation_flags: u32, environment: rawptr,
                                                                                  inherit_handle: Bool, creation_flags: u32, environment: rawptr,
                                                                                  current_direcotry: cstring, startup_info: ^Startup_Info,
                                                                                  current_direcotry: cstring, startup_info: ^Startup_Info,
                                                                                  process_information: ^Process_Information) -> Bool ---;
                                                                                  process_information: ^Process_Information) -> Bool ---;
-	@(link_name="GetExitCodeProcess")		 get_exit_code_process       :: proc(process: Handle, exit: ^u32) -> Bool ---;
-	@(link_name="ExitProcess")               exit_process                :: proc(exit_code: u32) ---;
-	@(link_name="GetModuleHandleA")          get_module_handle_a         :: proc(module_name: cstring) -> Hinstance ---;
-	@(link_name="GetModuleHandleW")          get_module_handle_w         :: proc(module_name: Wstring) -> Hinstance ---;
-	@(link_name="Sleep")                     sleep                       :: proc(ms: i32) -> i32 ---;
-	@(link_name="QueryPerformanceFrequency") query_performance_frequency :: proc(result: ^i64) -> i32 ---;
-	@(link_name="QueryPerformanceCounter")   query_performance_counter   :: proc(result: ^i64) -> i32 ---;
-	@(link_name="OutputDebugStringA")        output_debug_string_a       :: proc(c_str: cstring) ---;
-
-	@(link_name="GetCommandLineA")    get_command_line_a    :: proc() -> cstring ---;
-	@(link_name="GetCommandLineW")    get_command_line_w    :: proc() -> Wstring ---;
-	@(link_name="GetSystemMetrics")   get_system_metrics    :: proc(index: i32) -> i32 ---;
-	@(link_name="GetCurrentThreadId") get_current_thread_id :: proc() -> u32 ---;
-
-	@(link_name="GetSystemTimeAsFileTime") get_system_time_as_file_time :: proc(system_time_as_file_time: ^Filetime) ---;
-	@(link_name="FileTimeToLocalFileTime") file_time_to_local_file_time :: proc(file_time: ^Filetime, local_file_time: ^Filetime) -> Bool ---;
-	@(link_name="FileTimeToSystemTime")    file_time_to_system_time     :: proc(file_time: ^Filetime, system_time: ^Systemtime) -> Bool ---;
-	@(link_name="SystemTimeToFileTime")    system_time_to_file_time     :: proc(system_time: ^Systemtime, file_time: ^Filetime) -> Bool ---;
-
-	@(link_name="CloseHandle")  close_handle   :: proc(h: Handle) -> i32 ---;
-	@(link_name="GetStdHandle") get_std_handle :: proc(h: i32) -> Handle ---;
+	@(link_name="GetExitCodeProcess")		 get_exit_code_process        :: proc(process: Handle, exit: ^u32) -> Bool ---;
+	@(link_name="ExitProcess")               exit_process                 :: proc(exit_code: u32) ---;
+	@(link_name="GetModuleHandleA")          get_module_handle_a          :: proc(module_name: cstring) -> Hinstance ---;
+	@(link_name="GetModuleHandleW")          get_module_handle_w          :: proc(module_name: Wstring) -> Hinstance ---;
+	@(link_name="Sleep")                     sleep                        :: proc(ms: i32) -> i32 ---;
+	@(link_name="QueryPerformanceFrequency") query_performance_frequency  :: proc(result: ^i64) -> i32 ---;
+	@(link_name="QueryPerformanceCounter")   query_performance_counter    :: proc(result: ^i64) -> i32 ---;
+	@(link_name="OutputDebugStringA")        output_debug_string_a        :: proc(c_str: cstring) ---;
+
+	@(link_name="GetCommandLineA")           get_command_line_a           :: proc() -> cstring ---;
+	@(link_name="GetCommandLineW")           get_command_line_w           :: proc() -> Wstring ---;
+	@(link_name="GetSystemMetrics")          get_system_metrics           :: proc(index: i32) -> i32 ---;
+	@(link_name="GetVersionExA")             get_version                  :: proc(osvi: ^OS_Version_Info_Ex_A) ---;
+	@(link_name="GetCurrentThreadId")        get_current_thread_id        :: proc() -> u32 ---;
+
+	@(link_name="GetSystemTimeAsFileTime")   get_system_time_as_file_time :: proc(system_time_as_file_time: ^Filetime) ---;
+	@(link_name="FileTimeToLocalFileTime")   file_time_to_local_file_time :: proc(file_time: ^Filetime, local_file_time: ^Filetime) -> Bool ---;
+	@(link_name="FileTimeToSystemTime")      file_time_to_system_time     :: proc(file_time: ^Filetime, system_time: ^Systemtime) -> Bool ---;
+	@(link_name="SystemTimeToFileTime")      system_time_to_file_time     :: proc(system_time: ^Systemtime, file_time: ^Filetime) -> Bool ---;
+
+	@(link_name="CloseHandle")               close_handle                 :: proc(h: Handle) -> i32 ---;
+	@(link_name="GetStdHandle")              get_std_handle               :: proc(h: i32) -> Handle ---;
 
 
 	@(link_name="CreateFileA")
 	@(link_name="CreateFileA")
 	create_file_a :: proc(filename: cstring, desired_access, share_module: u32,
 	create_file_a :: proc(filename: cstring, desired_access, share_module: u32,

+ 4 - 0
src/types.cpp

@@ -1041,6 +1041,8 @@ bool is_type_integer_endian_big(Type *t) {
 		return build_context.endian_kind == TargetEndian_Big;
 		return build_context.endian_kind == TargetEndian_Big;
 	} else if (t->kind == Type_BitSet) {
 	} else if (t->kind == Type_BitSet) {
 		return is_type_integer_endian_big(bit_set_to_int(t));
 		return is_type_integer_endian_big(bit_set_to_int(t));
+	} else if (t->kind == Type_Pointer) {
+		return is_type_integer_endian_big(&basic_types[Basic_uintptr]);
 	} else {
 	} else {
 		GB_PANIC("Unsupported type: %s", type_to_string(t));
 		GB_PANIC("Unsupported type: %s", type_to_string(t));
 	}
 	}
@@ -1058,6 +1060,8 @@ bool is_type_integer_endian_little(Type *t) {
 		return build_context.endian_kind == TargetEndian_Little;
 		return build_context.endian_kind == TargetEndian_Little;
 	} else if (t->kind == Type_BitSet) {
 	} else if (t->kind == Type_BitSet) {
 		return is_type_integer_endian_little(bit_set_to_int(t));
 		return is_type_integer_endian_little(bit_set_to_int(t));
+	} else if (t->kind == Type_Pointer) {
+		return is_type_integer_endian_little(&basic_types[Basic_uintptr]);
 	} else {
 	} else {
 		GB_PANIC("Unsupported type: %s", type_to_string(t));
 		GB_PANIC("Unsupported type: %s", type_to_string(t));
 	}
 	}