blob: c3fc39951fd030590f1337c7e20d9ed5f9442b58 [file] [log] [blame]
Evan Lloydd342d742017-05-25 19:16:53 +01001/*
2 * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef __WINPOSIX_H__
8# define __WINPOSIX_H__
9
10# define _CRT_SECURE_NO_WARNINGS
11
12# include <direct.h>
13# include <io.h>
14# include <stdint.h>
15# include <stdlib.h>
16# include <string.h>
17# include <sys/stat.h>
18
19# include "uuid.h"
20
21
22/* Derive or provide Windows equivalents of Posix/GCC/Unix stuff. */
23# ifndef PATH_MAX
24# ifdef MAX_PATH
25# define PATH_MAX MAX_PATH
26# else
27# ifdef _MAX_PATH
28# define MAX_PATH _MAX_PATH
29# define PATH_MAX _MAX_PATH
30# else
31# define PATH_MAX 260
32# endif
33# endif
34# endif
35
36# ifndef _CRT_SECURE_NO_WARNINGS
37# define _CRT_SECURE_NO_WARNINGS 1
38# endif
39
40/*
41 * Platform specific names.
42 *
43 * Visual Studio deprecates a number of POSIX functions and only provides
44 * ISO C++ compliant alternatives (distinguished by their '_' prefix).
45 * These macros help provide a stopgap for that.
46 */
47
48/* fileno cannot be an inline function, because _fileno is a macro. */
49# define fileno(fileptr) _fileno(fileptr)
50
51/* _fstat uses the _stat structure, not stat. */
52# define BLD_PLAT_STAT _stat
53
54/* Define flag values for _access. */
55# define F_OK 0
56
57
58/* getopt implementation for Windows: Data. */
59
60/* Legitimate values for option.has_arg. */
61enum has_arg_values {
62 no_argument, /* No argument value required */
63 required_argument, /* value must be specified. */
64 optional_argument /* value may be specified. */
65};
66
67/* Long option table entry for get_opt_long. */
68struct option {
69 /* The name of the option. */
70 const char *name;
71
72 /*
73 * Indicates whether the option takes an argument.
74 * Possible values: see has_arg_values above.
75 */
76 int has_arg;
77
78 /* If not null, when option present, *flag is set to val. */
79 int *flag;
80
81 /*
82 * The value associated with this option to return
83 * (and save in *flag when not null)
84 */
85 int val;
86};
87
88/*
89 * This variable is set by getopt to point at the value of the option
90 * argument, for those options that accept arguments.
91 */
92extern char *optarg;
93
94/*
95 * When this variable is not zero, getopt emits an error message to stderr
96 * if it encounters an unspecified option, or a missing argument.
97 * Otherwise no message is reported.
98 */
99extern const int opterr; /* const as NOT used in this implementation. */
100
101/*
102 * This variable is set by getopt to the index of the next element of the
103 * argv array to be processed. Once getopt has found all of the option
104 * arguments, you can use this variable to determine where the remaining
105 * non-option arguments begin. The initial value of this variable is 1.
106 */
107extern int optind;
108
109/*
110 * When getopt encounters an unknown option character or an option with a
111 * missing required argument, it stores that option character in this
112 * variable.
113 */
114extern int optopt;
115
116
117/*
118 * Platform specific names.
119 *
120 * Visual Studio deprecates a number of POSIX functions and only provides
121 * ISO C++ compliant alternatives (distinguished by their '_' prefix).
122 * These inline functions provide a stopgap for that.
123 */
124
125inline int access(const char *path, int mode)
126{
127 return _access(path, mode);
128}
129
130inline int chdir(const char *s)
131{
132 return _chdir(s);
133}
134
135inline int fstat(int fd, struct _stat *buffer)
136{
137 return _fstat(fd, buffer);
138}
139
140inline char *strdup(const char *s)
141{
142 return _strdup(s);
143}
144
145/*
146 * getopt implementation for Windows: Functions.
147 *
148 * Windows does not have the getopt family of functions, as it normally
149 * uses '/' instead of '-' as the command line option delimiter.
150 * These functions provide a Windows version that uses '-', which precludes
151 * using '-' as the intial letter of a program argument.
152 * This is not seen as a problem in the specific instance of fiptool,
153 * and enables existing makefiles to work on a Windows build environment.
154 */
155
156/*
157 * The getopt function gets the next option argument from the argument list
158 * specified by the argv and argc arguments.
159 */
160int getopt(int argc,
161 char *argv[],
162 char *options);
163
164/*
165 * getopt_long gets the next option argument from the argument list
166 * specified by the argv and argc arguments. Options may be either short
167 * (single letter) as for getopt, or longer names (preceded by --).
168 */
169int getopt_long(int argc,
170 char *argv[],
171 const char *shortopts,
172 const struct option *longopts,
173 int *indexptr);
174
175/*
176 * getopt_long_only gets the next option argument from the argument list
177 * specified by the argv and argc arguments. Options may be either short
178 * or long as for getopt_long, but the long names may have a single '-'
179 * prefix, too.
180 */
181int getopt_long_only(int argc,
182 char *argv[],
183 const char *shortopts,
184 const struct option *longopts,
185 int *indexptr);
186
187#endif /* __WINPOSIX_H__ */