w32common.h 2.76 KB
Newer Older
Daniel Colascione's avatar
Daniel Colascione committed
1
/* Common functions for Microsoft Windows builds of Emacs
Paul Eggert's avatar
Paul Eggert committed
2
   Copyright (C) 2012-2020 Free Software Foundation, Inc.
Daniel Colascione's avatar
Daniel Colascione committed
3 4 5 6 7

This file is part of GNU Emacs.

GNU Emacs is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
8 9
the Free Software Foundation, either version 3 of the License, or (at
your option) any later version.
Daniel Colascione's avatar
Daniel Colascione committed
10 11 12 13 14 15 16

GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
Paul Eggert's avatar
Paul Eggert committed
17
along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
18

Daniel Colascione's avatar
Daniel Colascione committed
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
*/

#ifndef W32COMMON_H
#define W32COMMON_H

#include <windows.h>

#define ROUND_UP(p, align)   (((DWORD_PTR)(p) + (align)-1) & ~((DWORD_PTR)(align)-1))
#define ROUND_DOWN(p, align) ((DWORD_PTR)(p) & ~((DWORD_PTR)(align)-1))

#define get_page_size()			sysinfo_cache.dwPageSize
#define get_allocation_unit()		sysinfo_cache.dwAllocationGranularity
#define get_processor_type()		sysinfo_cache.dwProcessorType
#define get_w32_major_version()  	w32_major_version
#define get_w32_minor_version()  	w32_minor_version

extern SYSTEM_INFO    sysinfo_cache;
extern OSVERSIONINFO  osinfo_cache;
37
extern DWORD_PTR      syspage_mask;
Daniel Colascione's avatar
Daniel Colascione committed
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

extern int    	      w32_major_version;
extern int    	      w32_minor_version;
extern int    	      w32_build_number;

enum {
  OS_9X = 1,
  OS_NT
};

extern int os_subtype;

/* Cache system info, e.g., the NT page size.  */
extern void cache_system_info (void);

53 54 55 56 57
typedef void (* VOIDFNPTR) (void);

/* Load a function address from a DLL.  Cast the result via VOIDFNPTR
   to pacify -Wcast-function-type in GCC 8.1.  The return value must
   be cast to the correct function pointer type.  */
58
INLINE VOIDFNPTR get_proc_addr (HINSTANCE, LPCSTR);
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
INLINE VOIDFNPTR
get_proc_addr (HINSTANCE handle, LPCSTR fname)
{
  return (VOIDFNPTR) GetProcAddress (handle, fname);
}

/* Define a function that will be loaded from a DLL.  The variable
   arguments should contain the argument list for the function, and
   optionally be followed by function attributes.  For example:
   DEF_DLL_FN (void, png_longjmp, (png_structp, int) PNG_NORETURN);
  */
#define DEF_DLL_FN(type, func, ...)                     \
  typedef type (CDECL *W32_PFN_##func) __VA_ARGS__;     \
  static W32_PFN_##func fn_##func

/* Load a function from the DLL.  */
#define LOAD_DLL_FN(lib, func)						\
  do									\
    {									\
      fn_##func = (W32_PFN_##func) get_proc_addr (lib, #func);		\
      if (!fn_##func)							\
	return false;							\
    }									\
  while (false)

84 85 86 87
#ifdef HAVE_HARFBUZZ
extern bool hbfont_init_w32_funcs (HMODULE);
#endif

Daniel Colascione's avatar
Daniel Colascione committed
88
#endif /* W32COMMON_H */