]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c
CryptoPkg: Apply uncrustify changes
[mirror_edk2.git] / CryptoPkg / Library / BaseCryptLib / SysCall / CrtWrapper.c
... / ...
CommitLineData
1/** @file\r
2 C Run-Time Libraries (CRT) Wrapper Implementation for OpenSSL-based\r
3 Cryptographic Library.\r
4\r
5Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>\r
6SPDX-License-Identifier: BSD-2-Clause-Patent\r
7\r
8**/\r
9\r
10#include <CrtLibSupport.h>\r
11\r
12int errno = 0;\r
13\r
14FILE *stderr = NULL;\r
15FILE *stdin = NULL;\r
16FILE *stdout = NULL;\r
17\r
18typedef\r
19int\r
20(*SORT_COMPARE)(\r
21 IN VOID *Buffer1,\r
22 IN VOID *Buffer2\r
23 );\r
24\r
25//\r
26// Duplicated from EDKII BaseSortLib for qsort() wrapper\r
27//\r
28STATIC\r
29VOID\r
30QuickSortWorker (\r
31 IN OUT VOID *BufferToSort,\r
32 IN CONST UINTN Count,\r
33 IN CONST UINTN ElementSize,\r
34 IN SORT_COMPARE CompareFunction,\r
35 IN VOID *Buffer\r
36 )\r
37{\r
38 VOID *Pivot;\r
39 UINTN LoopCount;\r
40 UINTN NextSwapLocation;\r
41\r
42 ASSERT (BufferToSort != NULL);\r
43 ASSERT (CompareFunction != NULL);\r
44 ASSERT (Buffer != NULL);\r
45\r
46 if ((Count < 2) || (ElementSize < 1)) {\r
47 return;\r
48 }\r
49\r
50 NextSwapLocation = 0;\r
51\r
52 //\r
53 // Pick a pivot (we choose last element)\r
54 //\r
55 Pivot = ((UINT8 *)BufferToSort + ((Count - 1) * ElementSize));\r
56\r
57 //\r
58 // Now get the pivot such that all on "left" are below it\r
59 // and everything "right" are above it\r
60 //\r
61 for (LoopCount = 0; LoopCount < Count - 1; LoopCount++) {\r
62 //\r
63 // If the element is less than the pivot\r
64 //\r
65 if (CompareFunction ((VOID *)((UINT8 *)BufferToSort + ((LoopCount) * ElementSize)), Pivot) <= 0) {\r
66 //\r
67 // Swap\r
68 //\r
69 CopyMem (Buffer, (UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), ElementSize);\r
70 CopyMem ((UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), (UINT8 *)BufferToSort + ((LoopCount) * ElementSize), ElementSize);\r
71 CopyMem ((UINT8 *)BufferToSort + ((LoopCount) * ElementSize), Buffer, ElementSize);\r
72\r
73 //\r
74 // Increment NextSwapLocation\r
75 //\r
76 NextSwapLocation++;\r
77 }\r
78 }\r
79\r
80 //\r
81 // Swap pivot to its final position (NextSwapLocation)\r
82 //\r
83 CopyMem (Buffer, Pivot, ElementSize);\r
84 CopyMem (Pivot, (UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), ElementSize);\r
85 CopyMem ((UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), Buffer, ElementSize);\r
86\r
87 //\r
88 // Now recurse on 2 partial lists. Neither of these will have the 'pivot' element.\r
89 // IE list is sorted left half, pivot element, sorted right half...\r
90 //\r
91 QuickSortWorker (\r
92 BufferToSort,\r
93 NextSwapLocation,\r
94 ElementSize,\r
95 CompareFunction,\r
96 Buffer\r
97 );\r
98\r
99 QuickSortWorker (\r
100 (UINT8 *)BufferToSort + (NextSwapLocation + 1) * ElementSize,\r
101 Count - NextSwapLocation - 1,\r
102 ElementSize,\r
103 CompareFunction,\r
104 Buffer\r
105 );\r
106\r
107 return;\r
108}\r
109\r
110// ---------------------------------------------------------\r
111// Standard C Run-time Library Interface Wrapper\r
112// ---------------------------------------------------------\r
113\r
114//\r
115// -- String Manipulation Routines --\r
116//\r
117\r
118char *\r
119strchr (\r
120 const char *str,\r
121 int ch\r
122 )\r
123{\r
124 return ScanMem8 (str, AsciiStrSize (str), (UINT8)ch);\r
125}\r
126\r
127/* Scan a string for the last occurrence of a character */\r
128char *\r
129strrchr (\r
130 const char *str,\r
131 int c\r
132 )\r
133{\r
134 char *save;\r
135\r
136 for (save = NULL; ; ++str) {\r
137 if (*str == c) {\r
138 save = (char *)str;\r
139 }\r
140\r
141 if (*str == 0) {\r
142 return (save);\r
143 }\r
144 }\r
145}\r
146\r
147/* Compare first n bytes of string s1 with string s2, ignoring case */\r
148int\r
149strncasecmp (\r
150 const char *s1,\r
151 const char *s2,\r
152 size_t n\r
153 )\r
154{\r
155 int Val;\r
156\r
157 ASSERT (s1 != NULL);\r
158 ASSERT (s2 != NULL);\r
159\r
160 if (n != 0) {\r
161 do {\r
162 Val = tolower (*s1) - tolower (*s2);\r
163 if (Val != 0) {\r
164 return Val;\r
165 }\r
166\r
167 ++s1;\r
168 ++s2;\r
169 if (*s1 == '\0') {\r
170 break;\r
171 }\r
172 } while (--n != 0);\r
173 }\r
174\r
175 return 0;\r
176}\r
177\r
178/* Read formatted data from a string */\r
179int\r
180sscanf (\r
181 const char *buffer,\r
182 const char *format,\r
183 ...\r
184 )\r
185{\r
186 //\r
187 // Null sscanf() function implementation to satisfy the linker, since\r
188 // no direct functionality logic dependency in present UEFI cases.\r
189 //\r
190 return 0;\r
191}\r
192\r
193/* Maps errnum to an error-message string */\r
194char *\r
195strerror (\r
196 int errnum\r
197 )\r
198{\r
199 return NULL;\r
200}\r
201\r
202/* Computes the length of the maximum initial segment of the string pointed to by s1\r
203 which consists entirely of characters from the string pointed to by s2. */\r
204size_t\r
205strspn (\r
206 const char *s1,\r
207 const char *s2\r
208 )\r
209{\r
210 UINT8 Map[32];\r
211 UINT32 Index;\r
212 size_t Count;\r
213\r
214 for (Index = 0; Index < 32; Index++) {\r
215 Map[Index] = 0;\r
216 }\r
217\r
218 while (*s2) {\r
219 Map[*s2 >> 3] |= (1 << (*s2 & 7));\r
220 s2++;\r
221 }\r
222\r
223 if (*s1) {\r
224 Count = 0;\r
225 while (Map[*s1 >> 3] & (1 << (*s1 & 7))) {\r
226 Count++;\r
227 s1++;\r
228 }\r
229\r
230 return Count;\r
231 }\r
232\r
233 return 0;\r
234}\r
235\r
236/* Computes the length of the maximum initial segment of the string pointed to by s1\r
237 which consists entirely of characters not from the string pointed to by s2. */\r
238size_t\r
239strcspn (\r
240 const char *s1,\r
241 const char *s2\r
242 )\r
243{\r
244 UINT8 Map[32];\r
245 UINT32 Index;\r
246 size_t Count;\r
247\r
248 for (Index = 0; Index < 32; Index++) {\r
249 Map[Index] = 0;\r
250 }\r
251\r
252 while (*s2) {\r
253 Map[*s2 >> 3] |= (1 << (*s2 & 7));\r
254 s2++;\r
255 }\r
256\r
257 Map[0] |= 1;\r
258\r
259 Count = 0;\r
260 while (!(Map[*s1 >> 3] & (1 << (*s1 & 7)))) {\r
261 Count++;\r
262 s1++;\r
263 }\r
264\r
265 return Count;\r
266}\r
267\r
268//\r
269// -- Character Classification Routines --\r
270//\r
271\r
272/* Determines if a particular character is a decimal-digit character */\r
273int\r
274isdigit (\r
275 int c\r
276 )\r
277{\r
278 //\r
279 // <digit> ::= [0-9]\r
280 //\r
281 return (('0' <= (c)) && ((c) <= '9'));\r
282}\r
283\r
284/* Determine if an integer represents character that is a hex digit */\r
285int\r
286isxdigit (\r
287 int c\r
288 )\r
289{\r
290 //\r
291 // <hexdigit> ::= [0-9] | [a-f] | [A-F]\r
292 //\r
293 return ((('0' <= (c)) && ((c) <= '9')) ||\r
294 (('a' <= (c)) && ((c) <= 'f')) ||\r
295 (('A' <= (c)) && ((c) <= 'F')));\r
296}\r
297\r
298/* Determines if a particular character represents a space character */\r
299int\r
300isspace (\r
301 int c\r
302 )\r
303{\r
304 //\r
305 // <space> ::= [ ]\r
306 //\r
307 return ((c) == ' ');\r
308}\r
309\r
310/* Determine if a particular character is an alphanumeric character */\r
311int\r
312isalnum (\r
313 int c\r
314 )\r
315{\r
316 //\r
317 // <alnum> ::= [0-9] | [a-z] | [A-Z]\r
318 //\r
319 return ((('0' <= (c)) && ((c) <= '9')) ||\r
320 (('a' <= (c)) && ((c) <= 'z')) ||\r
321 (('A' <= (c)) && ((c) <= 'Z')));\r
322}\r
323\r
324/* Determines if a particular character is in upper case */\r
325int\r
326isupper (\r
327 int c\r
328 )\r
329{\r
330 //\r
331 // <uppercase letter> := [A-Z]\r
332 //\r
333 return (('A' <= (c)) && ((c) <= 'Z'));\r
334}\r
335\r
336//\r
337// -- Data Conversion Routines --\r
338//\r
339\r
340/* Convert strings to a long-integer value */\r
341long\r
342strtol (\r
343 const char *nptr,\r
344 char **endptr,\r
345 int base\r
346 )\r
347{\r
348 //\r
349 // Null strtol() function implementation to satisfy the linker, since there is\r
350 // no direct functionality logic dependency in present UEFI cases.\r
351 //\r
352 return 0;\r
353}\r
354\r
355/* Convert strings to an unsigned long-integer value */\r
356unsigned long\r
357strtoul (\r
358 const char *nptr,\r
359 char **endptr,\r
360 int base\r
361 )\r
362{\r
363 //\r
364 // Null strtoul() function implementation to satisfy the linker, since there is\r
365 // no direct functionality logic dependency in present UEFI cases.\r
366 //\r
367 return 0;\r
368}\r
369\r
370/* Convert character to lowercase */\r
371int\r
372tolower (\r
373 int c\r
374 )\r
375{\r
376 if (('A' <= (c)) && ((c) <= 'Z')) {\r
377 return (c - ('A' - 'a'));\r
378 }\r
379\r
380 return (c);\r
381}\r
382\r
383//\r
384// -- Searching and Sorting Routines --\r
385//\r
386\r
387/* Performs a quick sort */\r
388void\r
389qsort (\r
390 void *base,\r
391 size_t num,\r
392 size_t width,\r
393 int ( *compare )(const void *, const void *)\r
394 )\r
395{\r
396 VOID *Buffer;\r
397\r
398 ASSERT (base != NULL);\r
399 ASSERT (compare != NULL);\r
400\r
401 //\r
402 // Use CRT-style malloc to cover BS and RT memory allocation.\r
403 //\r
404 Buffer = malloc (width);\r
405 ASSERT (Buffer != NULL);\r
406\r
407 //\r
408 // Re-use PerformQuickSort() function Implementation in EDKII BaseSortLib.\r
409 //\r
410 QuickSortWorker (base, (UINTN)num, (UINTN)width, (SORT_COMPARE)compare, Buffer);\r
411\r
412 free (Buffer);\r
413 return;\r
414}\r
415\r
416//\r
417// -- Process and Environment Control Routines --\r
418//\r
419\r
420/* Get a value from the current environment */\r
421char *\r
422getenv (\r
423 const char *varname\r
424 )\r
425{\r
426 //\r
427 // Null getenv() function implementation to satisfy the linker, since there is\r
428 // no direct functionality logic dependency in present UEFI cases.\r
429 //\r
430 return NULL;\r
431}\r
432\r
433/* Get a value from the current environment */\r
434char *\r
435secure_getenv (\r
436 const char *varname\r
437 )\r
438{\r
439 //\r
440 // Null secure_getenv() function implementation to satisfy the linker, since\r
441 // there is no direct functionality logic dependency in present UEFI cases.\r
442 //\r
443 // From the secure_getenv() manual: 'just like getenv() except that it\r
444 // returns NULL in cases where "secure execution" is required'.\r
445 //\r
446 return NULL;\r
447}\r
448\r
449//\r
450// -- Stream I/O Routines --\r
451//\r
452\r
453/* Write data to a stream */\r
454size_t\r
455fwrite (\r
456 const void *buffer,\r
457 size_t size,\r
458 size_t count,\r
459 FILE *stream\r
460 )\r
461{\r
462 return 0;\r
463}\r
464\r
465//\r
466// -- Dummy OpenSSL Support Routines --\r
467//\r
468\r
469int\r
470BIO_printf (\r
471 void *bio,\r
472 const char *format,\r
473 ...\r
474 )\r
475{\r
476 return 0;\r
477}\r
478\r
479int\r
480BIO_snprintf (\r
481 char *buf,\r
482 size_t n,\r
483 const char *format,\r
484 ...\r
485 )\r
486{\r
487 return 0;\r
488}\r
489\r
490#ifdef __GNUC__\r
491\r
492typedef\r
493VOID\r
494(EFIAPI *NoReturnFuncPtr)(\r
495 VOID\r
496 ) __attribute__ ((__noreturn__));\r
497\r
498STATIC\r
499VOID\r
500EFIAPI\r
501NopFunction (\r
502 VOID\r
503 )\r
504{\r
505}\r
506\r
507void\r
508abort (\r
509 void\r
510 )\r
511{\r
512 NoReturnFuncPtr NoReturnFunc;\r
513\r
514 NoReturnFunc = (NoReturnFuncPtr)NopFunction;\r
515\r
516 NoReturnFunc ();\r
517}\r
518\r
519#else\r
520\r
521void\r
522abort (\r
523 void\r
524 )\r
525{\r
526 // Do nothing\r
527}\r
528\r
529#endif\r
530\r
531int\r
532fclose (\r
533 FILE *f\r
534 )\r
535{\r
536 return 0;\r
537}\r
538\r
539FILE *\r
540fopen (\r
541 const char *c,\r
542 const char *m\r
543 )\r
544{\r
545 return NULL;\r
546}\r
547\r
548size_t\r
549fread (\r
550 void *b,\r
551 size_t c,\r
552 size_t i,\r
553 FILE *f\r
554 )\r
555{\r
556 return 0;\r
557}\r
558\r
559uid_t\r
560getuid (\r
561 void\r
562 )\r
563{\r
564 return 0;\r
565}\r
566\r
567uid_t\r
568geteuid (\r
569 void\r
570 )\r
571{\r
572 return 0;\r
573}\r
574\r
575gid_t\r
576getgid (\r
577 void\r
578 )\r
579{\r
580 return 0;\r
581}\r
582\r
583gid_t\r
584getegid (\r
585 void\r
586 )\r
587{\r
588 return 0;\r
589}\r
590\r
591int\r
592printf (\r
593 char const *fmt,\r
594 ...\r
595 )\r
596{\r
597 return 0;\r
598}\r