Welcome to mirror list, hosted at ThFree Co, Russian Federation.

miscfuncs.h « local_includes « cygwin « winsup - cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: fc791c2aad6ab9ec317663040ebe0008fad2773d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/* miscfuncs.h: main Cygwin header file.

This file is part of Cygwin.

This software is a copyrighted work licensed under the terms of the
Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
details. */

#ifndef _MISCFUNCS_H
#define _MISCFUNCS_H

#include <dinput.h>

#define likely(X) __builtin_expect (!!(X), 1)
#define unlikely(X) __builtin_expect (!!(X), 0)

/* Check for Alt+Numpad keys in a console input record.  These are used to
   enter codepoints not available in the current keyboard layout  For details
   see http://www.fileformat.info/tip/microsoft/enter_unicode.htm */
static inline bool
is_alt_numpad_key (PINPUT_RECORD pirec)
{
  /* Remove lock key state from ControlKeyState.  Do not remove enhanced key
     state since it helps to distinguish between cursor (EK) and numpad keys
     (non-EK). */
  DWORD ctrl_state = pirec->Event.KeyEvent.dwControlKeyState
		     & ~(CAPSLOCK_ON | NUMLOCK_ON | SCROLLLOCK_ON);

  return pirec->Event.KeyEvent.uChar.UnicodeChar == 0
	 && ctrl_state == LEFT_ALT_PRESSED
	 && pirec->Event.KeyEvent.wVirtualScanCode >= DIK_NUMPAD7
	 && pirec->Event.KeyEvent.wVirtualScanCode <= DIK_NUMPAD0
	 && pirec->Event.KeyEvent.wVirtualScanCode != DIK_SUBTRACT;
}

/* Event for left Alt, with a non-zero character, comes from Alt+Numpad
   key sequence. e.g. <left-alt> 233 => &eacute;  This is typically handled
   as the key up event after releasing the Alt key. */
static inline bool
is_alt_numpad_event (PINPUT_RECORD pirec)
{
  return pirec->Event.KeyEvent.uChar.UnicodeChar != 0
	 && pirec->Event.KeyEvent.wVirtualKeyCode == VK_MENU
	 && pirec->Event.KeyEvent.wVirtualScanCode == 0x38;
}

int winprio_to_nice (DWORD);
DWORD nice_to_winprio (int &);

bool create_pipe (PHANDLE, PHANDLE, LPSECURITY_ATTRIBUTES, DWORD);

BOOL CreatePipeOverlapped (PHANDLE read_handle, PHANDLE write_handle,
			   LPSECURITY_ATTRIBUTES sa);
BOOL ReadPipeOverlapped (HANDLE h, PVOID buf, DWORD len,
			 LPDWORD ret_len, DWORD timeout);
BOOL WritePipeOverlapped (HANDLE h, LPCVOID buf, DWORD len,
			  LPDWORD ret_len, DWORD timeout);

/* class for per-line reading using native functions.  The caller provides
   the file as an POBJECT_ATTRIBUTES, and the buffer space. */
class NT_readline
{
  HANDLE fh;
  PCHAR buf;
  PCHAR got;
  PCHAR end;
  ULONG buflen;
  ULONG len;
  ULONG line;
public:
  NT_readline () : fh (NULL) {}
  bool init (POBJECT_ATTRIBUTES attr, char *buf, ULONG buflen);
  PCHAR gets ();
  void close () { if (fh) NtClose (fh); fh = NULL; }
  ~NT_readline () { close (); }
};

extern "C" void yield ();

#define import_address(x) __import_address ((void *)(x))
void * __import_address (void *);

#define caller_return_address() \
		__caller_return_address (__builtin_return_address (0))
void * __caller_return_address (void *);

void backslashify (const char *, char *, bool);
void slashify (const char *, char *, bool);
#define isslash(c) ((c) == '/')

extern void transform_chars (PWCHAR, PWCHAR);
extern inline void
transform_chars (PUNICODE_STRING upath, USHORT start_idx)
{
  transform_chars (upath->Buffer + start_idx,
		   upath->Buffer + upath->Length / sizeof (WCHAR) - 1);
}

PWCHAR transform_chars_af_unix (PWCHAR, const char *, __socklen_t);

/* Get handle count of an object. */
ULONG get_obj_handle_count (HANDLE h);

/* Memory checking */
int check_invalid_virtual_addr (const void *s, unsigned sz);

ssize_t check_iovec (const struct iovec *, int, bool);
#define check_iovec_for_read(a, b) check_iovec ((a), (b), false)
#define check_iovec_for_write(a, b) check_iovec ((a), (b), true)

extern PVOID create_new_main_thread_stack (PVOID &allocationbase);

extern "C" DWORD pthread_wrapper (PVOID arg);
extern "C" HANDLE CygwinCreateThread (LPTHREAD_START_ROUTINE thread_func,
				      PVOID thread_arg, PVOID stackaddr,
				      ULONG stacksize, ULONG guardsize,
				      DWORD creation_flags, LPDWORD thread_id);

void SetThreadName (DWORD dwThreadID, const char* threadName);

WORD __get_cpus_per_group (void);
WORD __get_group_count (void);

#endif /*_MISCFUNCS_H*/