1 
2 #ifndef INCLUDE_WINCE_COMPAT_H
3 #define INCLUDE_WINCE_COMPAT_H
4 
5 #ifdef __cplusplus
6 extern "C" {
7 #endif
8 
9 /*** ANSI C library ***/
10 
11 /* Missing ANSI C definitions */
12 
13 #define BUFSIZ 4096
14 
15 #define ENOMEM ERROR_NOT_ENOUGH_MEMORY
16 #define EBADF ERROR_INVALID_HANDLE
17 #define EINVAL ERROR_INVALID_PARAMETER
18 #define ENOENT ERROR_FILE_NOT_FOUND
19 #define ERANGE ERROR_INSUFFICIENT_BUFFER
20 #define EINTR WSAEINTR
21 
22 /*
23  *	Because we need a per-thread errno, we define a function
24  *	pointer that we can call to return a pointer to the errno
25  *	for the current thread.  Then we define a macro for errno
26  *	that dereferences this function's result.
27  *
28  *	This makes it syntactically just like the "real" errno.
29  *
30  *	Using a function pointer allows us to use a very fast
31  *	function when there are no threads running and a slower
32  *	function when there are multiple threads running.
33  */
34 void __WinCE_Errno_New_Thread(int *Errno_Pointer);
35 void __WinCE_Errno_Thread_Exit(void);
36 extern int *(*__WinCE_Errno_Pointer_Function)(void);
37 
38 #define	errno (*(*__WinCE_Errno_Pointer_Function)())
39 
40 char *strerror(int errnum);
41 
42 struct tm {
43 	int tm_sec;     /* seconds after the minute - [0,59] */
44 	int tm_min;     /* minutes after the hour - [0,59] */
45 	int tm_hour;    /* hours since midnight - [0,23] */
46 	int tm_mday;    /* day of the month - [1,31] */
47 	int tm_mon;     /* months since January - [0,11] */
48 	int tm_year;    /* years since 1900 */
49 	int tm_wday;    /* days since Sunday - [0,6] */
50 	int tm_yday;    /* days since January 1 - [0,365] */
51 	int tm_isdst;   /* daylight savings time flag */
52 };
53 
54 struct tm *gmtime(const time_t *TimeP); /* for future use */
55 struct tm *localtime(const time_t *TimeP);
56 time_t mktime(struct tm *tm);
57 time_t time(time_t *TimeP);
58 
59 size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *tim_p);
60 
61 int _wrename(const wchar_t *oldname, const wchar_t *newname);
62 int _wremove(const wchar_t *filename);
63 
64 /* Environment variables are not supported */
65 #define getenv(x) (NULL)
66 
67 /* Redefine fileno so that it returns an integer */
68 #undef fileno
69 #define fileno(f) (int)_fileno(f)
70 
71 /* Signals are not supported */
72 #define signal(num, handler) (0)
73 #define SIGTERM 0
74 #define SIGINT 0
75 
76 
77 /*** POSIX API ***/
78 
79 /* Missing POSIX definitions */
80 
81 #define FILENAME_MAX MAX_PATH
82 
83 struct _stat {
84 	unsigned long st_size;
85 	unsigned long st_ino;
86 	int st_mode;
87 	unsigned long st_atime;
88 	unsigned long st_mtime;
89 	unsigned long st_ctime;
90 	unsigned short st_dev;
91 	unsigned short st_nlink;
92 	unsigned short st_uid;
93 	unsigned short st_gid;
94 };
95 
96 #define S_IFMT   0170000
97 #define S_IFDIR  0040000
98 #define S_IFREG  0100000
99 #define S_IEXEC  0000100
100 #define S_IWRITE 0000200
101 #define S_IREAD  0000400
102 
103 #define _S_IFDIR S_IFDIR	/* MSVCRT compatibilit */
104 
105 int _fstat(int handle, struct _stat *buffer);
106 int _wstat(const wchar_t *path, struct _stat *buffer);
107 
108 #define stat _stat	/* NOTE: applies to _stat() and also struct _stat */
109 #define fstat _fstat
110 
111 #define	O_RDWR		(1<<0)
112 #define	O_RDONLY	(2<<0)
113 #define	O_WRONLY	(3<<0)
114 #define	O_MODE_MASK	(3<<0)
115 #define	O_TRUNC		(1<<2)
116 #define	O_EXCL		(1<<3)
117 #define	O_CREAT		(1<<4)
118 #define O_BINARY 0
119 
120 int _wopen(const wchar_t *filename, int oflag, ...);
121 int _close(int handle);
122 int _write(int handle, const void *buffer, unsigned int count);
123 int _read(int handle, void *buffer, unsigned int count);
124 long _lseek(int handle, long offset, int origin);
125 
126 #define close _close
127 #define write _write
128 #define read _read
129 #define lseek _lseek
130 
131 /* WinCE has only a Unicode version of this function */
132 FILE *fdopen(int handle, const char *mode);
133 
134 int _wmkdir(const wchar_t *dirname);
135 
136 /* WinCE has no concept of current directory so we return a constant path */
137 wchar_t *_wgetcwd(wchar_t *buffer, int maxlen);
138 
139 #define freopen(path, mode, stream) assert(0)
140 
141 #ifdef __cplusplus
142 }
143 #endif
144 
145 #endif /* INCLUDE_WINCE_COMPAT_H */
146