diff --git a/AppPkg/AppPkg.dsc b/AppPkg/AppPkg.dsc new file mode 100644 index 0000000000..ffa4b0f69c --- /dev/null +++ b/AppPkg/AppPkg.dsc @@ -0,0 +1,157 @@ +## @file +# Intel(r) UEFI Application Development Kit for EDK II. +# This package contains applications which depend upon Standard Libraries +# from the StdLib package. +# +# See the comments in the [LibraryClasses.IA32] and [BuildOptions] sections +# for important information about configuring this package for your +# environment. +# +# Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license. +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +## + +[Defines] + PLATFORM_NAME = AppPkg + PLATFORM_GUID = 0458dade-8b6e-4e45-b773-1b27cbda3e06 + PLATFORM_VERSION = 0.01 + DSC_SPECIFICATION = 0x00010006 + OUTPUT_DIRECTORY = Build/AppPkg + SUPPORTED_ARCHITECTURES = IA32|IPF|X64 + BUILD_TARGETS = DEBUG|RELEASE + SKUID_IDENTIFIER = DEFAULT + +[PcdsFeatureFlag] + +[PcdsFixedAtBuild] + gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x0f + gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000000 + +[PcdsFixedAtBuild.IPF] + +[LibraryClasses] + # + # Entry Point Libraries + # + UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf + ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf + # + # Common Libraries + # + BaseLib|MdePkg/Library/BaseLib/BaseLib.inf + BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf + UefiLib|MdePkg/Library/UefiLib/UefiLib.inf + PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf + PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf + MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf + UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf + UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf + DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf + DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf + PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf + IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf + PciLib|MdePkg/Library/BasePciLibCf8/BasePciLibCf8.inf + PciCf8Lib|MdePkg/Library/BasePciCf8Lib/BasePciCf8Lib.inf + SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf + UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf + HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf + UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf + PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf + HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf + ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf + FileHandleLib|ShellPkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf + SortLib|ShellPkg/Library/UefiSortLib/UefiSortLib.inf + + # + # C Standard Libraries + # + LibC|StdLib/LibC/LibC.inf + LibStdLib|StdLib/LibC/StdLib/StdLib.inf + LibString|StdLib/LibC/String/String.inf + LibWchar|StdLib/LibC/Wchar/Wchar.inf + LibCType|StdLib/LibC/Ctype/Ctype.inf + LibTime|StdLib/LibC/Time/Time.inf + LibStdio|StdLib/LibC/Stdio/Stdio.inf + LibGdtoa|StdLib/LibC/gdtoa/gdtoa.inf + LibLocale|StdLib/LibC/Locale/Locale.inf + LibUefi|StdLib/LibC/Uefi/Uefi.inf + LibMath|StdLib/LibC/Math/Math.inf + LibSignal|StdLib/LibC/Signal/Signal.inf + LibNetUtil|StdLib/LibC/NetUtil/NetUtil.inf + +[LibraryClasses.IA32] + TimerLib|PerformancePkg/Library/DxeTscTimerLib/DxeTscTimerLib.inf + ## Comment out the above line and un-comment the line below for running under Nt32 emulation. +# TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf + +[LibraryClasses.X64] + TimerLib|PerformancePkg/Library/DxeTscTimerLib/DxeTscTimerLib.inf + +[LibraryClasses.IPF] + PalLib|MdePkg/Library/UefiPalLib/UefiPalLib.inf + TimerLib|MdePkg/Library/SecPeiDxeTimerLibCpu/SecPeiDxeTimerLibCpu.inf + +################################################################################################### +# +# Components Section - list of the modules and components that will be processed by compilation +# tools and the EDK II tools to generate PE32/PE32+/Coff image files. +# +# Note: The EDK II DSC file is not used to specify how compiled binary images get placed +# into firmware volume images. This section is just a list of modules to compile from +# source into UEFI-compliant binaries. +# It is the FDF file that contains information on combining binary files into firmware +# volume images, whose concept is beyond UEFI and is described in PI specification. +# Binary modules do not need to be listed in this section, as they should be +# specified in the FDF file. For example: Shell binary (Shell_Full.efi), FAT binary (Fat.efi), +# Logo (Logo.bmp), and etc. +# There may also be modules listed in this section that are not required in the FDF file, +# When a module listed here is excluded from FDF file, then UEFI-compliant binary will be +# generated for it, but the binary will not be put into any firmware volume. +# +################################################################################################### + +[Components] +# BaseLib and BaseMemoryLib need to be built with the /GL- switch when using the Microsoft +# tool chain. This is required so that the library functions can be resolved during +# the second pass of the linker during Link-time-code-generation. +### + MdePkg/Library/BaseLib/BaseLib.inf { + + MSFT:*_*_*_CC_FLAGS = /X /Zc:wchar_t /GL- + } + + MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf { + + MSFT:*_*_*_CC_FLAGS = /X /Zc:wchar_t /GL- + } + +#### Sample Applications. + AppPkg/Applications/Hello/Hello.inf # No LibC includes or functions. + AppPkg/Applications/Main/Main.inf # Simple invocation. No other LibC functions. + AppPkg/Applications/Enquire/Enquire.inf + +################################################################ +# +# See the additional comments below if you plan to run applications under the +# Nt32 emulation environment. +# + +[BuildOptions] + INTEL:*_*_*_CC_FLAGS = /Qfreestanding + MSFT:*_*_*_CC_FLAGS = /X /Zc:wchar_t + GCC:*_*_*_CC_FLAGS = -ffreestanding -nostdinc -nostdlib + +# The Build Options, below, are only used when building the C library +# to be run under the NT32 emulation. They disable the clock() system call +# which is currently incompatible with the NT32 environment. +# Just uncomment the lines below and select the correct TimerLib instance, above. + + # INTEL:*_*_IA32_CC_FLAGS = /D NT32dvm + # MSFT:*_*_IA32_CC_FLAGS = /D NT32dvm + # GCC:*_*_IA32_CC_FLAGS = -DNT32dvm diff --git a/AppPkg/Applications/Enquire/Enquire.c b/AppPkg/Applications/Enquire/Enquire.c new file mode 100644 index 0000000000..1e1db69a57 --- /dev/null +++ b/AppPkg/Applications/Enquire/Enquire.c @@ -0,0 +1,3377 @@ +/** @file + Every thing you wanted to know about your compiler but didn't know whom to ask. + + COPYRIGHT(c) 1993-9 Steven Pemberton, CWI. All rights reserved. + Steven Pemberton, CWI, Amsterdam; "Steven.Pemberton@cwi.nl" + Used with permission. + + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ + #pragma warning ( disable : 4018 ) + #pragma warning ( disable : 4055 ) + #pragma warning ( disable : 4116 ) + #pragma warning ( disable : 4130 ) + #pragma warning ( disable : 4189 ) + #pragma warning ( disable : 4244 ) + #pragma warning ( disable : 4723 ) +#endif /* defined(_MSC_VER) */ + +//#define NO_SC 1 // Compiler doesn't support signed char +//#define NO_UC 1 // Compiler doesn't support unsigned char +//#define NO_UI 1 // Compiler doesn't support unsigned short and long +//#define NO_VOID 1 // Compiler doesn't support void +//#define NO_SIG 1 // Compiler doesn't support signal() or setjmp/longjmp() + +/* Some compilers can't cope with "#ifdef __FILE__". Use + either the FILENAME or BAD_CPP macro as described below. +*/ +/* If your C preprocessor doesn't have the predefined __FILE__ +macro, and you don't want to call this file enquire.c but, say, +tell.c, uncomment the following and change enquire.c to tell.c. +*/ +//#define FILENAME "enquire.c" + +/* Some compilers won't accept the line "#include FILENAME". Uncomment + the following macro. In that case, this file *must* be called enquire.c. +*/ +//#define BAD_CPP 1 + +/* Some naughty compilers define __STDC__, but don't really + support it. Some define it as 0, in which case we ignore it. + But if your compiler defines it, and isn't really ANSI C, + uncomment the BAD_STDC macro. (To those compiler writers: for shame). +*/ +//#define BAD_STDC 1 + +/* Some naughty compilers define __STDC__, but don't have the + stddef.h include file. Uncomment the BAD_STDDEF macro. (Gcc needs this on + some machines, due to clashes between stddef.h and other include files.) +*/ +//#define BAD_STDDEF 1 + +/* Some systems crash when you try to malloc all store. To save users of such + defective systems too much grief, they may uncomment the BAD_MALLOC macro, + which ignores that bit of the code. +*/ +//#define BAD_MALLOC 1 + + + +#ifndef PROGRAM +#define PROGRAM enquire.c +#define VERSION "5.1a" +#define PURPOSE Everything you wanted to know about your machine and C compiler +#define BUT didnt know who to ask +#define FOR Any OS, any C compiler +#define AUTHOR Steven Pemberton, CWI, Amsterdam; "Steven.Pemberton@cwi.nl" +#define COPYRIGHT(c) 1993-9 Steven Pemberton, CWI. All rights reserved. +#define NOTE Improvements gratefully received. Please mention the version. +#define COMPILE On Unix compile with: "sh enquire.c"; see below for details +#define WEB "http://www.cwi.nl/~steven/enquire.html" +#endif + +#ifdef NOTDEFINED /* This is how you compile it; see below for details */ + case $0 in + *.c) ;; + sh) echo 'Use "sh enquire.c", not "sh < enquire.c"' >&2; exit 1;; + *) echo 'Filename must end in ".c"' >&2; exit 1;; + esac + if test -r test.c + then echo Would overwrite test.c - try it somewhere safer >&2; exit 1 + fi + CFLAGS= + echo Testing for needed CFLAGS ... + echo "main(){char c; c=0;}" > test.c + if ${CC=cc} ${1+"$@"} -o enquire test.c $LIBS + then : + else + echo '*** "'$CC ${1+"$@"} -o enquire test.c $LIBS'" failed' + echo '*** Giving up' + /bin/rm -f test.c + exit 1 + fi + echo "main(){signed char c; c=0;}" > test.c + if $CC ${1+"$@"} -o enquire test.c $LIBS 2>/dev/null + then echo " Signed char ok" + else + CFLAGS=-DNO_SC + echo " Signed char not accepted; using $CFLAGS" + fi + echo "main(){unsigned char c; c=0;}" > test.c + if $CC ${1+"$@"} -o enquire test.c $LIBS 2>/dev/null + then echo " Unsigned char ok" + else + CFLAGS="$CFLAGS -DNO_UC" + echo " Unsigned char not accepted; using $CFLAGS" + fi + echo "main(){unsigned short s;unsigned long l;s=0;l=0;}" > test.c + if $CC ${1+"$@"} -o enquire test.c $LIBS 2>/dev/null + then echo " Unsigned short and long ok" + else + CFLAGS="$CFLAGS -DNO_UI" + echo " Unsigned short or long not accepted; using $CFLAGS" + fi + echo "void foo(){} main(){foo();}" > test.c + if $CC ${1+"$@"} -o enquire test.c $LIBS 2>/dev/null + then echo " Void ok" + else + CFLAGS="$CFLAGS -DNO_VOID" + echo " Void not accepted; using $CFLAGS" + fi + /bin/rm -f test.c a.out + + echo Compiling $0 ... + case $# in + 0) : check bug in interpreting "$@" in some shells, if no parameters + case `echo 1 "$@" 2` in + "1 2") echo ' *** There is a bug in your shell expanding "$@"!' + echo ' *** Taking remedial action' ;; + "1 2") ;; + esac + esac + case $ID in + "") echo " $CC" $CFLAGS "$@" $0 -o enquire $LIBS + $CC $CFLAGS ${1+"$@"} $0 -o enquire $LIBS || + { echo '***' Try setting some CFLAGS; exit 1; } + ;; + *) echo " $CC" $CFLAGS "$@" -DID="\"$ID\"" $0 -o enquire $LIBS + $CC $CFLAGS ${1+"$@"} -DID="\"$ID\"" $0 -o enquire $LIBS || + { echo '***' Try setting some CFLAGS; exit 1; } + esac + echo "Producing enquire.out limits.h and float.h ..." + echo " enquire > enquire.out" + ./enquire > enquire.out || echo ' *** Some problems: see enquire.out' + echo " enquire -l > limits.h" + ./enquire -l > limits.h || echo ' *** Some problems: see limits.h' + echo " enquire -f > float.h" + ./enquire -f > float.h || echo ' *** Some problems: see float.h' + echo "Verifying the contents of limits.h and float.h ..." + echo " $CC" -DVERIFY $CFLAGS "$@" $0 -o verify $LIBS + $CC -DVERIFY $CFLAGS ${@+"$@"} $0 -o verify $LIBS || + { echo '***' Failed; exit 1; } + echo " verify -fl > verify.out" + ./verify -fl > verify.out || + echo ' *** Some problems: see verify.out' + echo Done + exit 0 +#endif + +/* + PURPOSE + This is a program that determines many properties of the C + compiler and machine that it is run on, such as minimum and + maximum [un]signed char/int/long, many properties of float/ [long] + double, and so on. + + As an option it produces the ANSI C float.h and limits.h files. + + As a further option, it even checks that the compiler reads the + header files correctly. + + It is a good test-case for compilers, since it exercises them with + many limiting values, such as the minimum and maximum floating-point + numbers. + + COMPILING AND RUNNING ON UNIX MACHINES + With luck and a following wind, on Unix systems just the following + will work: + sh enquire.c (or whatever filename you chose). + Any parameters are passed to the C compiler, so if the compilation + fails for any reason curable as explained below, you can do the following: + sh enquire.c -DBAD_CPP + + If you do get compilation errors, check the line in question. + Very often there is a comment attached saying which define to set. + + You can use a different C compiler than the default cc by setting CC: + CC=gcc sh enquire.c -ansi + You can load extra libraries by setting LIBS: + CC=gcc LIBS=-lflong sh enquire.c -ansi + Add ID="string" for the string to be added to the output; for instance: + ID="`hostname` cc -ansi" sh enquire.c -ansi + + Compiling may give messages about unreachable code. These you can ignore. + + Some compilers offer various flags for different floating point + modes; it's worth trying all possible combinations of these. + + Don't say I haven't tried to make life easy for you... + + COMPILING AND RUNNING ON NON-UNIX SYSTEMS + On non-Unix systems, you must say (the equivalent of): + cc enquire.c -o enquire + enquire > enquire.out + enquire -l > limits.h + enquire -f > float.h + cc -DVERIFY enquire.c -o verify #this includes limits.h and float.h + verify -fl > verify.out + + If your compiler doesn't support: add flag: + signed char (eg pcc) -DNO_SC + unsigned char -DNO_UC + unsigned short and long -DNO_UI + void -DNO_VOID + signal(), or setjmp/longjmp() -DNO_SIG + + Try to compile first with no flags, and see if you get any errors + - you might be surprised. (Most non-ANSI compilers need -DNO_SC, + though.) Some compilers need a -f flag for floating point. + + Don't use any optimisation flags: the program may not work if you + do. Though "while (a+1.0-a-1.0 == 0.0)" may look like "while(1)" + to an optimiser, to a floating-point unit there's a world of difference. + + Compiling may give messages about unreachable code. These you can ignore. + + Some compilers offer various flags for different floating point + modes; it's worth trying all possible combinations of these. + + FAULTY COMPILERS + Because of bugs and/or inadequacies, some compilers need the following + defines: + + - If your C preprocessor doesn't have the predefined __FILE__ + macro, and you don't want to call this file enquire.c but, say, + tell.c, add the flag -DFILENAME=\"tell.c\" . + + - Some compilers won't accept the line "#include FILENAME". Add + flag -DBAD_CPP. In that case, this file *must* be called + enquire.c. + + - Some compilers can't cope with "#ifdef __FILE__". Use + -DFILENAME= or -DBAD_CPP as above. + + - Some naughty compilers define __STDC__, but don't really + support it. Some define it as 0, in which case we ignore it. + But if your compiler defines it, and isn't really ANSI C, add + flag -DBAD_STDC. (To those compiler writers: for shame). + + - Some naughty compilers define __STDC__, but don't have the + stddef.h include file. Add flag -DBAD_STDDEF. (Gcc needs this + on some machines, due to clashes between stddef.h and other + include files.) + + - Some systems crash when you try to malloc all store. To save + users of such defective systems too much grief, they may + compile with -DBAD_MALLOC, which ignores that bit of the code. + + Summary of naughty-compiler flags: + If your compiler doesn't support: add flag: + __FILE__ (and you changed the filename) -DFILENAME=\"name.c\" + #ifdef __FILE__ -DBAD_CPP or -DFILENAME=... + #include FILENAME -DBAD_CPP + __STDC__ (properly) -DBAD_STDC + stddef.h -DBAD_STDDEF + malloc(LOTS) == NULL -DBAD_MALLOC + + While it is not our policy to support defective compilers, pity has been + taken on people with compilers that can't produce object files bigger than + 32k (especially since it was an easy addition). Compile the program + into separate parts like this: + cc -c -DSEP -DPASS0 -o p0.o enquire.c + cc -c -DSEP -DPASS1 -o p1.o enquire.c + cc -c -DSEP -DPASS2 -o p2.o enquire.c + cc -c -DSEP -DPASS3 -o p3.o enquire.c + cc -o enquire p0.o p1.o p2.o p3.o + + SYSTEM DEPENDENCIES + You may possibly need to add some calls to signal() for other sorts of + exception on your machine than SIGFPE, SIGOVER, SIGBUS, and SIGSEGV. + See lines beginning #ifdef SIGxxx (and communicate the differences to me!). + + OUTPUT + Running without argument gives the information as English text. If run + with argument -l (e.g. enquire -l), output is a series of #define's for + the ANSI standard limits.h include file, excluding MB_MAX_CHAR. If run + with argument -f, output is a series of #define's for the ANSI standard + float.h include file (according to ANSI C Draft of Dec 7, 1988). + Flag -v gives verbose output: output includes the English text above + as C comments. The program exit(0)'s if everything went ok, otherwise + it exits with a positive number, telling how many problems there were. + + VERIFYING THE COMPILER + If, having produced the float.h and limits.h header files, you want to + verify that the compiler reads them back correctly (there are a lot of + boundary cases, of course, like minimum and maximum numbers), you can + recompile enquire.c with -DVERIFY set (plus the other flags that you used + when compiling the version that produced the header files). This then + recompiles the program so that it #includes "limits.h" and "float.h", + and checks that the constants it finds there are the same as the + constants it produces. Run the resulting program with enquire -fl. + Many compilers fail this test. + NB: You *must* recompile with the same compiler and flags, otherwise + you may get odd results. + + You can also use this option if your compiler already has both files, + and you want to confirm that this program produces the right results. + + TROUBLESHOOTING. + This program is now quite trustworthy, and suspicious and wrong output + may well be caused by bugs in the compiler, not in the program (however + of course, this is not guaranteed, and no responsibility can be + accepted, etc.) + + The program only works if overflows are ignored by the C system or + are catchable with signal(). + + If the program fails to run to completion (often with the error message + "Unexpected signal at point x"), this often turns out to be a bug in the + C compiler's run-time system. Check what was about to be printed, and + try to narrow the problem down. + + Another possible problem is that you have compiled the program to produce + loss-of-precision arithmetic traps. The program cannot cope with these, + and you should re-compile without them. (They should never be the default). + + Make sure you compiled with optimisation turned off. + + Output preceded by *** WARNING: identifies behaviour of the C system + deemed incorrect by the program. Likely problems are that printf or + scanf don't cope properly with certain boundary numbers: this program + goes to a lot of trouble to calculate its values, and these values + are mostly boundary numbers. Experience has shown that often printf + cannot cope with these values, and so in an attempt to increase + confidence in the output, for each float and double that is printed, + the printed value is checked by using sscanf to read it back. + Care is taken that numbers are printed with enough digits to uniquely + identify them, and therefore that they can be read back identically. + If the number read back is different, then there is probably a bug in + printf or sscanf, and the program prints the warning message. + If the two numbers in the warning look identical, then printf is more + than likely rounding the last digit(s) incorrectly. To put you at ease + that the two really are different, the bit patterns of the two numbers + are also printed. The difference is very likely in the last bit. + Many scanf's read the minimum double back as 0.0, and similarly cause + overflow when reading the maximum double. This program quite ruthlessly + declares all these behaviours faulty. The point is that if you get + one of these warnings, the output may be wrong, so you should check + the result carefully if you intend to use the results. Of course, printf + and sscanf may both be wrong, and cancel each other out, so you should + check the output carefully anyway. + + The warning that "a cast didn't work" refers to cases like this: + + float f; + #define C 1.234567890123456789 + f= C; + if (f != (float) C) printf ("Wrong!"); + + A faulty compiler will widen f to double and ignore the cast to float, + and because there is more accuracy in a double than a float, fail to + recognise that they are the same. In the actual case in point, f and C + are passed as parameters to a function that discovers they are not equal, + so it's just possible that the error was in the parameter passing, + not in the cast (see function Verify()). + For ANSI C, which has float constants, the error message is "constant has + wrong precision". + + REPORTING PROBLEMS + If the program doesn't work for you for any reason that can't be + narrowed down to a problem in the C compiler, or it has to be + changed in order to get it to compile, or it produces suspicious + output (like a very low maximum float, for instance), please mail + the problem and an example of the incorrect output to + Steven.Pemberton@cwi.nl so that improvements can be worked into + future versions. Try to give as much information as possible; + DON'T FORGET TO MENTION THE VERSION NUMBER! + + The program tries to catch and diagnose bugs in the compiler/run-time + system. I would be especially pleased to have reports of failures so + that I can improve this service. + + I apologise unreservedly for the contorted use of the preprocessor... + but it was fun! + + NEW VERSIONS + Worried that you may not have the latest version? Ftp to + ftp.cwi.nl, and look in directory pub/steven/enquire + for file enquireXX.c; XX is the version number. Or look at + http://www.cwi.nl/~steven/enquire.html + + HOW DOES ENQUIRE WORK? + There is an article that explains a lot of the workings: The + Ergonomics of Portability; available from the above addresses as file + enquire.ps. + + THE SMALL PRINT + This is not a public domain program; nor is any other program that + carries a copyright notice. It is however freely copyable under the + following conditions: + + You may copy and distribute verbatim copies of this source file. + You may modify this source file, and copy and distribute such + modified versions, provided that you leave the copyright notice + at the top of the file and also cause the modified file to carry + prominent notices stating that you changed the files and the + date of any change; and cause the whole of any work that you + distribute or publish, that in whole or in part contains or is a + derivative of this program or any part thereof, to be licensed + at no charge to all third parties on terms identical to those + here. + + While every effort has been taken to make this program as reliable as + possible, no responsibility can be taken for the correctness of the + output, nor suitability for any particular use. + + If you do have a fix to any problem, please send it to me, so that + other people can have the benefits. + + This program is an offshoot of a project funded by public funds. + If you use this program for research or commercial use (i.e. more + than just for the fun of knowing about your compiler) mailing a short + note of acknowledgement may help keep enquire.c supported. + + ACKNOWLEDGEMENTS + Many people have given time and ideas to making this program what it is. + To all of them thanks, and apologies for not mentioning them by name. + + HISTORY + Originally started as a program to generate configuration constants + for a large piece of software we were writing, which later took on + a life of its own... + 1.0 Length 6658!; end 1984? + Unix only. Only printed a dozen maximum int/double values. + 2.0 Length 10535; Spring 1985 + Prints values as #defines (about 20 of them) + More extensive floating point, using Cody and Waite + Handles signals better + Programs around optimisations + Handles Cybers + 3.0 Length 12648; Aug 1987; prints about 42 values + Added PASS stuff, so treats float as well as double + 4.0 Length 33891; Feb 1989; prints around 85 values + First GNU version (for gcc, where they called it hard-params.c) + Generates float.h and limits.h files + Handles long double + Generates warnings for dubious output + 4.1 Length 47738; April 1989 + Added VERIFY and TEST + 4.2 Length 63442; Feb 1990 + Added SEP + Fixed eps/epsneg + Added check for pseudo-unsigned chars + Added description for each #define output + Added check for absence of defines during verify + Added prototypes + Added BAD_STDC and BAD_CPP + Fixed alignments output + 4.3 Length 75000; Oct 1990; around 114 lines of output + Function xmalloc defined, Richard Stallman, June 89. + Alignments computed from member offsets rather than structure sizes, + Richard Stallman, Oct 89 + Print whether char* and int* pointers have the same format; + also char * and function * + Update to Draft C version Dec 7, 1988 + - types of constants produced in limits.h + (whether to put a U after unsigned shorts and chars and + whether to output -1024 as (-1023-1)) + - values of SCHAR_MIN/MAX + - values of *_EPSILON (not the smallest but the effective smallest) + Added FILENAME, since ANSI C doesn't allow #define __FILE__ + Renamed from config.c to enquire.c + Added size_t and ptrdiff_t enquiries + Added promotion enquiries + Added type checks of #defines + Added BAD_STDDEF + Changed endian to allow for cases where not all bits are used + Sanity check for max integrals + Fixed definition of setjmp for -DNO_SIG + Moved #define ... 0.0L inside #ifdef STDC, in case some cpp's tokenize + Added BAD_MALLOC + 5.0 Length 88228; February 1993; around 120 lines of output + (depends on what you count) + Added the 'sh enquire.c' horror/delight: thanks David Mankins@think + Added checks for long names: thanks Steve Simon@leeds-poly + Added FPE signal checks: thanks Leonid A. Broukhis + Added check for dereferencing NULL + Added TESTI + Added LIBS, fixed showtype: thanks Rainer Orth@TechFak.Uni-Bielefeld.DE + Added a free(): thanks nickc@perihelion.co.uk + Added signal catching to the malloc part + Renamed naughty-compiler defines to BAD_* + Renamed and altered Verify() to better check faulty compilers + Shut some compilers up from giving incorrect warnings. + Fixed sign_of(): thanks Hugh Redelmeier@redvax + Fixed USHRT_MAX for sizeof(short)=sizeof(int) but INT_MAX > SHRT_MAX + Fixed NO_UI + Fixed -DSEP: thanks Mike Black@seismo + Fixed the case where stdio.h includes limits.h: thanks rms@gnu + Fixed exponent(): thanks Christophe BINOT + + 5.0a Aug 1997 + Made handling of ID= easier + Improved the reporting of use of bits in Floating values. + 5.1 Length 88739; Sep 1998 + Fixed detection of infinity for machines with no overflow trap + Speeded up search for max char (first 32 bit char machine turned up...) + 5.1a Length 88832; Feb 1999 + Changed identification message + 5.1b Length 88926; Oct 2002 + Fixed a missing \n in an output line; thanks Leonid Broukhis again +*/ + +/* Set FILENAME to the name of this file */ +#ifndef FILENAME +#ifdef BAD_CPP +#define FILENAME "enquire.c" +#else +#ifdef __FILE__ /* It's a compiler bug if this fails. Define BAD_CPP */ +#define FILENAME __FILE__ +#else +#define FILENAME "enquire.c" +#endif /* __FILE__ */ +#endif /* BAD_CPP */ +#endif /* FILENAME */ + +/* This file is read three times (it #includes itself), to generate + otherwise identical code for each of short+float, int+double, + long+long double. If PASS isn't defined, then this is the first pass. + Code bracketed by 'PASS0' is for stuff independent of all three, + but is read during the first pass. +*/ +#ifndef PASS +#ifdef SEP /* so we're only interested if this is pass 1 or not */ +#ifdef PASS1 +#define PASS 1 +#else +#define PASS 0 +#endif +#else /* no SEP, so this is the first pass */ +#define PASS 1 +#define PASS0 1 +#define PASS1 1 +#endif /* SEP */ + +/* Void just marks the functions that don't return a result */ +#ifdef NO_VOID +#define Void int +#else +#define Void void +#endif + +/* Set STDC to whether this is *really* an ANSI C compiler. + Some bad compilers define __STDC__, when they don't support it. + Compile with -DBAD_STDC to get round this. +*/ +#ifndef BAD_STDC +#ifdef __STDC__ +#if __STDC__ /* If __STDC__ is 0, assume it isn't supported */ +#define STDC +#endif +#endif +#endif + +/* Stuff different for ANSI C, and old C: + ARGS and NOARGS are used for function prototypes. + Volatile is used to reduce the chance of optimisation, + and to prevent variables being put in registers (when setjmp/longjmp + wouldn't work as we want) + Long_double is the longest floating point type available. + stdc is used in tests like "if (stdc)", which is less ugly than #ifdef. + U is output after unsigned constants. + */ +#ifdef STDC + +#define ARGS(x) x +#define NOARGS (void) +#define Volatile volatile +#define Long_double long double +#define stdc 1 +#define U "U" + +#else /* Old style C */ + +#define ARGS(x) () +#define NOARGS () +#define Volatile static +#define Long_double double +#define stdc 0 +#define U "" + +#endif /* STDC */ + +/* include files */ +#include +#include + +#ifdef STDC +#ifndef BAD_STDDEF +#include /* for size_t: if this fails, define BAD_STDDEF */ +#endif +#endif + +#ifdef NO_SIG +#define jmp_buf int +#else +#include /* if this fails, define NO_SIG */ +#include /* if this fails, define NO_SIG */ +#endif +//#ifndef NO_SIG +//#include /* if this fails, define NO_SIG */ +//#include /* if this fails, define NO_SIG */ +//#endif + +/* Kludge around the possiblity that includes */ +#ifdef CHAR_BIT +#undef CHAR_BIT +#undef CHAR_MAX +#undef CHAR_MIN +#undef SCHAR_MAX +#undef SCHAR_MIN +#undef UCHAR_MAX +#undef UCHAR_MIN +#endif + +#ifdef VERIFY +#include "limits.h" +#include "float.h" +#endif + +/* The largest unsigned type */ +#ifdef NO_UI +#define ulong unsigned int +#else +#define ulong unsigned long +#endif + +/* Some shorthands */ +#define Vprintf if (V) printf +#define Unexpected(place) if (setjmp(lab)!=0) croak(place) +#define fabs(x) (((x)<0.0)?(-x):(x)) + +#endif /* PASS */ + +/* A description of the ANSI constants */ +#define D_CHAR_BIT "Number of bits in a storage unit" +#define D_CHAR_MAX "Maximum char" +#define D_CHAR_MIN "Minimum char" +#define D_SCHAR_MAX "Maximum signed char" +#define D_SCHAR_MIN "Minimum signed char" +#define D_UCHAR_MAX "Maximum unsigned char (minimum is always 0)" + +#define D_INT_MAX "Maximum %s" +#define D_INT_MIN "Minimum %s" +#define D_UINT_MAX "Maximum unsigned %s (minimum is always 0)" + +#define D_FLT_ROUNDS "Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown" +#define D_FLT_RADIX "Radix of exponent representation" +#define D_MANT_DIG "Number of base-FLT_RADIX digits in the significand of a %s" +#define D_DIG "Number of decimal digits of precision in a %s" +#define D_MIN_EXP "Minimum int x such that FLT_RADIX**(x-1) is a normalised %s" +#define D_MIN_10_EXP "Minimum int x such that 10**x is a normalised %s" +#define D_MAX_EXP "Maximum int x such that FLT_RADIX**(x-1) is a representable %s" +#define D_MAX_10_EXP "Maximum int x such that 10**x is a representable %s" +#define D_MAX "Maximum %s" +#define D_EPSILON "Difference between 1.0 and the minimum %s greater than 1.0" +#define D_MIN "Minimum normalised %s" + +#ifdef PASS0 + +/* Prototypes for what's to come: */ + +int false NOARGS; + +#ifdef BAD_STDDEF +char *malloc (); /* Old style prototype, since we don't know what size_t is */ +#else +char *malloc ARGS((size_t size)); +#endif +Void free ARGS((char *p)); /* Syntax error here? Try -DNO_VOID */ + +Void exit ARGS((int status)); + +char *f_rep ARGS((int precision, Long_double val)); + +int maximum_int NOARGS; +int cprop NOARGS; +int basic NOARGS; +Void sprop NOARGS; +Void iprop NOARGS; +Void lprop NOARGS; +Void usprop NOARGS; +Void uiprop NOARGS; +Void ulprop NOARGS; +int fprop ARGS((int byte_size)); +int dprop ARGS((int byte_size)); +int ldprop ARGS((int byte_size)); +Void efprop ARGS((int fprec, int dprec, int lprec)); +Void edprop ARGS((int fprec, int dprec, int lprec)); +Void eldprop ARGS((int fprec, int dprec, int lprec)); + +int setmode ARGS((char *s)); +Void farewell ARGS((int bugs)); +Void describe ARGS((char *description, char *extra)); +Void missing ARGS((char *s)); +Void fmissing ARGS((char *s)); +Void check_defines NOARGS; +Void bitpattern ARGS((char *p, unsigned int size)); +int ceil_log ARGS((int base, Long_double x)); +Void croak ARGS((int place)); +Void trap1 ARGS((int sig)); +Void eek_a_bug ARGS((char *problem)); +Void endian ARGS((int byte_size)); +int exponent ARGS((Long_double x, Long_double *fract, int *exp)); +int floor_log ARGS((int base, Long_double x)); +Void f_define ARGS((char *desc, char *extra, char *sort, char *name, + int prec, Long_double val, char *mark)); +Void i_define ARGS((char *desc, char *extra, char *sort, char *name, + long val, long lim, long req, char *mark)); +Void u_define ARGS((char *desc, char *extra, char *sort, char *name, + ulong val, ulong req, char *mark)); + +#ifdef NO_SIG /* There's no signal(), or setjmp/longjmp() */ + + /* Dummy routines instead */ + typedef int jmp_buf; + + int setjmp ARGS((jmp_buf lab)); + + jmp_buf lab, mlab; + int setjmp(jmp_buf lab) { return(0); } + void longjmp(jmp_buf lab, int val) { return; } + + Void signal(int i, void (*p)()) {} + +#else + jmp_buf lab, mlab; + Void overflow(int sig) + { /* what to do on over/underflow */ + signal(sig, overflow); + longjmp(lab, 1); + } + + Void address(int sig) + { /* what to do on an address error */ + signal(sig, address); + longjmp(mlab, 1); + } + +#endif /*NO_SIG*/ + +int V= 0, /* verbose */ + L= 0, /* produce limits.h */ + F= 0, /* produce float.h */ + bugs=0; /* The number of (possible) bugs in the output */ + +char co[4], oc[4]; /* Comment starter and ender symbols */ + +int bits_per_byte; /* the number of bits per unit returned by sizeof() */ +int flt_rounds; /* The calculated value of FLT_ROUNDS */ +int flt_radix; /* The calculated value of FLT_RADIX */ +Volatile int trapped; /* For testing FPE traps */ + +#ifdef TEST +/* Set the fp modes on a SUN with 68881 chip, to check that different + rounding modes etc. get properly detected. + Compile with -f68881 for cc, -m68881 for gcc, and with additional flag + -DTEST. Run with additional parameter +hex-number, to set the 68881 mode + register to hex-number +*/ + +/* Bits 0x30 = rounding mode */ +#define ROUND_BITS 0x30 +#define TO_NEAREST 0x00 +#define TO_ZERO 0x10 +#define TO_MINUS_INF 0x20 +#define TO_PLUS_INF 0x30 /* The SUN FP user's guide seems to be wrong here */ + +/* Bits 0xc0 = extended rounding */ +#define EXT_BITS 0xc0 +#define ROUND_EXTENDED 0x00 +#define ROUND_SINGLE 0x40 +#define ROUND_DOUBLE 0x80 + +/* Enabled traps */ +#define EXE_INEX1 0x100 +#define EXE_INEX2 0x200 +#define EXE_DZ 0x400 +#define EXE_UNFL 0x800 +#define EXE_OVFL 0x1000 +#define EXE_OPERR 0x2000 +#define EXE_SNAN 0x4000 +#define EXE_BSUN 0x8000 + +/* Only used for testing, on a Sun with 68881 chip */ +/* Print the FP mode */ +printmode(new) unsigned new; { + fpmode_(&new); + printf("New fp mode:\n"); + printf(" Round toward "); + switch (new & ROUND_BITS) { + case TO_NEAREST: printf("nearest"); break; + case TO_ZERO: printf("zero"); break; + case TO_MINUS_INF: printf("minus infinity"); break; + case TO_PLUS_INF: printf("plus infinity"); break; + default: printf("???"); break; + } + + printf("\n Extended rounding precision: "); + + switch (new & EXT_BITS) { + case ROUND_EXTENDED: printf("extended"); break; + case ROUND_SINGLE: printf("single"); break; + case ROUND_DOUBLE: printf("double"); break; + default: printf("???"); break; + } + + printf("\n Enabled exceptions:"); + if (new & (unsigned) EXE_INEX1) printf(" inex1"); + if (new & (unsigned) EXE_INEX2) printf(" inex2"); + if (new & (unsigned) EXE_DZ) printf(" divz"); + if (new & (unsigned) EXE_UNFL) printf(" unfl"); + if (new & (unsigned) EXE_OVFL) printf(" ovfl"); + if (new & (unsigned) EXE_OPERR) printf(" operr"); + if (new & (unsigned) EXE_SNAN) printf(" snan"); + if (new & (unsigned) EXE_BSUN) printf(" bsun"); + printf("\n"); +} + +/* Only used for testing, on a Sun with 68881 chip */ +/* Set the FP mode */ +int setmode(s) char *s; { + unsigned mode=0, dig; + char c; + + while (*s) { + c= *s++; + if (c>='0' && c<='9') dig= c-'0'; + else if (c>='a' && c<='f') dig= c-'a'+10; + else if (c>='A' && c<='F') dig= c-'A'+10; + else return 1; + mode= mode<<4 | dig; + } + printmode(mode); + return 0; +} +#define SETMODE +#endif + +#ifdef TESTI /* Test mode using SunOs IEEE routines */ + +#include + +int setmode(char *s) { + char *dummy, c, *cmd, *val; + while (*s) { + switch (c= *s++) { + case '=': cmd= "direction"; val= "nearest"; break; + case '0': cmd= "direction"; val= "tozero"; break; + case '+': cmd= "direction"; val= "positive"; break; + case '-': cmd= "direction"; val= "negative"; break; + case '1': cmd= "precision"; val= "single"; break; + case '2': cmd= "precision"; val= "double"; break; + case '3': cmd= "precision"; val= "extended"; break; + case '~': cmd= "exception"; val= "inexact"; break; + case '/': cmd= "exception"; val= "division"; break; + case '>': cmd= "exception"; val= "overflow"; break; + case '<': cmd= "exception"; val= "underflow"; break; + default: + printf("Bad setmode character: %c\n", c); + return 1; + break; + } + printf("Set %s %s", cmd, val); + if (ieee_flags("set", cmd, val, &dummy)) { + printf(": failed\n"); + return 1; + } + printf("\n"); + } + return 0; +} +#define SETMODE +#endif + +#ifndef SETMODE +/* ARGSUSED */ +int +setmode(char *s) +{ + fprintf(stderr, "Can't set mode: not compiled with TEST\n"); + return(1); +} +#endif + +int +memeq( + char *p1, + int size1, + char *p2, + int size2 + ) +{ + /* See if two blocks of store are identical */ + int i; + if (size1 != size2) return 0; + for (i=1; i<=size1; i++) { + if (*p1++ != *p2++) return 0; + } + return 1; +} + +Void +farewell(int bugs) +{ + if (bugs == 0) exit(0); + printf("\n%sFor hints on dealing with the ", co); + if (bugs == 1) printf("problem"); + else printf("%d problems", bugs); + printf(" above\n see the section 'TROUBLESHOOTING' in the file "); + printf("%s%s\n", FILENAME, oc); + exit(bugs); +} + +/* The program has received a signal where it wasn't expecting one */ +Void +croak(int place) +{ + printf("*** Unexpected signal at point %d\n", place); + farewell(bugs+1); /* An exit isn't essential here, but avoids loops */ +} + +/* This is here in case alloca.c is used, which calls this. */ +char * +xmalloc(unsigned size) +{ + char *value = malloc(size); + if (value == 0) { + fprintf(stderr, "Virtual memory exceeded\n"); + exit(bugs+1); + } + return value; +} + +int maxint; + +int +maximum_int( void ) +{ + /* Find the maximum integer */ + Volatile int newi, int_max, two=2; + + /* Calculate maxint ***********************************/ + /* Calculate 2**n-1 until overflow - then use the previous value */ + + newi=1; int_max=0; + + if (setjmp(lab)==0) { /* Yields int_max */ + while(newi>int_max) { + int_max=newi; + newi=newi*two+1; + } + } + Unexpected(0); + return int_max; +} + +/* How long are my identifiers? I could go further here, but some compilers + have line length limits that I don't want to break. +*/ + +int zzzzzzzzz1zzzzzzzzz2zzzzzzzzz3zzzzzzzzz4zzzzzzzzz5zzzzzzzzz6zzzz=64; + +int +name_len( void ) +{ + int zzzzzzzzz1zzzzzzzzz2zzzzzzzzz3zz=32; + { int zzzzzzzzz1zzzzzz=16; + { int zzzzzzzz=8; + { int zzzzzzz=7; + { int zzzzzz=6; + return + zzzzzzzzz1zzzzzzzzz2zzzzzzzzz3zzzzzzzzz4zzzzzzzzz5zzzzzzzzz6zzzz; + } + } + } + } +} + +#define aaaaaaaaa1aaaaaaaaa2aaaaaaaaa3aaaaaaaaa4aaaaaaaaa5aaaaaaaaa6aaaa 64 +#define LENGTH 64 + +#ifdef aaaaaaaaa1aaaaaaaaa2aaaaaaaaa3aa +#undef LENGTH +#define LENGTH 32 +#endif + +#ifdef aaaaaaaaa1aaaaaa +#undef LENGTH +#define LENGTH 16 +#endif + +#ifdef aaaaaaaa +#undef LENGTH +#define LENGTH 8 +#endif + +#undef aaaaaaaaa1aaaaaaaaa2aaaaaaaaa3aaaaaaaaa4aaaaaaaaa5aaaaaaaaa6aaaa + +Void long_names() +{ + int l= name_len(); + Vprintf("Compiler names are at least %d chars long", l); + if (l != 64) + Vprintf(" (but less than %d)", l*2); + Vprintf("\n"); + Vprintf("Preprocessor names are at least %d long", LENGTH); + if (LENGTH != 64) + Vprintf(" (but less than %d)", LENGTH*2); + Vprintf("\n\n"); +} + +/* Used by FPROP to see if FP traps are generated, and if they may return */ + +Void +trap2(int sig) +{ + longjmp(lab, 1); +} + +Void +trap1(int sig) +{ + trapped= 1; /* A global */ + signal(sig, trap2); +} + +Void +setsignals( void ) +{ +#ifdef SIGFPE + signal(SIGFPE, overflow); +#endif +#ifdef SIGOVER + signal(SIGOVER, overflow); +#endif +#ifdef SIGBUS + signal(SIGBUS, address); +#endif +#ifdef SIGSEGV + signal(SIGSEGV, address); +#endif + /* Add more calls as necessary */ +} + +#undef LENGTH + +int +main(int argc, char *argv[]) +{ + int dprec, fprec, lprec; + int i; + wchar_t *s; + int bad; + + setsignals(); + Unexpected(1); + + bad=0; + for (i=1; i < argc; i++) { + s = (wchar_t *)(argv[i]); + if (*s == L'-') { + s++; + while (*s) { + switch (*(s++)) { + case L'v': V=1; break; + case L'l': L=1; break; + case L'f': F=1; break; + default: bad=1; break; + } + } + } else if (*s == L'+') { + s++; + bad = setmode((char *)s); + } else bad= 1; + } + if (bad) { + fprintf(stderr, + "Usage: %ls [-vlf]\n v=Verbose l=Limits.h f=Float.h\n", + (wchar_t *)(argv[0])); + exit(1); + } + if (L || F) { + co[0]= '/'; oc[0]= ' '; + co[1]= '*'; oc[1]= '*'; + co[2]= ' '; oc[2]= '/'; + co[3]= '\0'; oc[3]= '\0'; + } else { + co[0]= '\0'; oc[0]= '\0'; + V=1; + } + + if (L) printf("%slimits.h%s\n", co, oc); + if (F) printf("%sfloat.h%s\n", co, oc); +#ifdef ID + printf("%sProduced by enquire version %s (%s), CWI, Amsterdam\n %s\n", + co, VERSION, ID, WEB, oc); +#else + printf("%sProduced by enquire version %s, CWI, Amsterdam\n %s %s\n", + co, VERSION, WEB, oc); +#endif + +#ifdef VERIFY + printf("%sVerification phase%s\n", co, oc); +#endif + +#ifdef NO_SIG + Vprintf("%sCompiled without signal(): %s%s\n", + co, + "there's nothing that can be done if overflow occurs", + oc); +#endif +#ifdef NO_SC + Vprintf("%sCompiled without signed char%s\n", co, oc); +#endif +#ifdef NO_UC + Vprintf("%sCompiled without unsigned char%s\n", co, oc); +#endif +#ifdef NO_UI + Vprintf("%sCompiled without unsigned short or long%s\n", co, oc); +#endif +#ifdef __STDC__ + Vprintf("%sCompiler claims to be ANSI C level %d%s\n", + co, __STDC__, oc); +#else + Vprintf("%sCompiler does not claim to be ANSI C%s\n", co, oc); +#endif + printf("\n"); + + long_names(); + check_defines(); + + maxint= maximum_int(); + bits_per_byte= basic(); + Vprintf("\n"); + if (F||V) { + fprec= fprop(bits_per_byte); + dprec= dprop(bits_per_byte); + lprec= ldprop(bits_per_byte); + efprop(fprec, dprec, lprec); + edprop(fprec, dprec, lprec); + eldprop(fprec, dprec, lprec); + } +#ifndef BAD_MALLOC + if (V) { + /* An extra goody: the approximate amount of data-space */ + /* Allocate store until no more available */ + /* Different implementations have a different argument type + to malloc. Here we assume that it's the same type as + that which sizeof() returns */ + unsigned int size; + Volatile long total; + char kmg, *ptr, *save; + char **link; + + save= NULL; + size=maximum_int()/4; + total=0; + while (size!=0) { + if (setjmp(mlab) == 0) { + while ((ptr= malloc((false()?sizeof(int):size))) != (char *)NULL) { + //if (save == NULL) save= ptr; /* save the biggest chunk */ + link = (char **)ptr; + if (save == NULL) { + // Save pointer to first allocated chunk + save= ptr; + *link = NULL; + } + else { + // Build list of all subsequently allocated chunks, LIFO + *link = save; + save = ptr; + } + total+=(size/2); + } + } else { + eek_a_bug("Trying to malloc all store generates a trap"); + } + size/=2; + } + if (setjmp(mlab)!=0) croak(-1); + + //if (save != NULL) free(save); + while(save != NULL) { + link = (char **)save; + ptr = *link; + free(save); + save = ptr; + } + + total= (total+511)/512; /* Sic */ kmg= 'K'; + if (total > 10000) { + total= (total+999)/1000; kmg= 'M'; + } + if (total > 10000) { + total= (total+999)/1000; kmg= 'G'; + } + if (total > 10000) { + total= (total+999)/1000; kmg= 'T'; + } + Vprintf("%sMemory mallocatable ~= %ld %cbytes%s\n", + co, total, kmg, oc); + } +#endif + farewell(bugs); + return bugs; /* To keep compilers and lint happy */ +} + +Void +eek_a_bug(char *problem) +{ + /* The program has discovered a problem */ + printf("\n%s*** WARNING: %s%s\n", co, problem, oc); + bugs++; +} + +Void +describe(char *description, char *extra) +{ + /* Produce the description for a #define */ + printf(" %s", co); + printf(description, extra); + printf("%s\n", oc); +} + +Void +i_define( + char *desc, + char *extra, + char *sort, + char *name, + long val, + long lim, + long req, + char *mark + ) +{ + /* Produce a #define for a signed int type */ + describe(desc, extra); + if (val >= 0) { + printf("#define %s%s %ld%s\n", sort, name, val, mark); + } else if (val + lim < 0) { + /* We may not produce a constant like -1024 if the max + allowable value is 1023. It has then to be output as + -1023-1. lim is the max allowable value. */ + printf("#define %s%s (%ld%s%ld%s)\n", + sort, name, -lim, mark, val+lim, mark); + } else { + printf("#define %s%s (%ld%s)\n", sort, name, val, mark); + } + /* If VERIFY is not set, val and req are just the same value; + if it is set, val is the value as calculated, and req is + the #defined constant + */ + if (val != req) { + printf("%s*** Verify failed for above #define!\n", co); + printf(" Compiler has %ld for value%s\n\n", req, oc); + bugs++; + } + Vprintf("\n"); +} + +Void +u_define( + char *desc, + char *extra, + char *sort, + char *name, + ulong val, + ulong req, + char *mark + ) +{ + /* Produce a #define for an unsigned value */ + describe(desc, extra); + printf("#define %s%s %lu%s%s\n", sort, name, val, U, mark); + if (val != req) { + printf("%s*** Verify failed for above #define!\n", co); + printf(" Compiler has %lu for value%s\n\n", req, oc); + bugs++; + } + Vprintf("\n"); +} + +Void f_define( + char *desc, + char *extra, + char *sort, + char *name, + int precision, + Long_double val, + char *mark + ) +{ + /* Produce a #define for a float/double/long double */ + describe(desc, extra); + if (stdc) { + printf("#define %s%s %s%s\n", + sort, name, f_rep(precision, val), mark); + } else if (*mark == 'F') { + /* non-ANSI C has no float constants, so cast the constant */ + printf("#define %s%s ((float)%s)\n", + sort, name, f_rep(precision, val)); + } else { + printf("#define %s%s %s\n", sort, name, f_rep(precision, val)); + } + Vprintf("\n"); +} + +int +floor_log(int base, Long_double x) +{ + /* return floor(log base(x)) */ + int r=0; + while (x>=base) { r++; x/=base; } + return r; +} + +int +ceil_log(int base, Long_double x) +{ + int r=0; + while (x>1.0) { r++; x/=base; } + return r; +} + +int +exponent(Long_double x, Long_double *fract, int *exp) +{ + /* Split x into a fraction and a power of ten; + returns 0 if x is unusable, 1 otherwise. + Only used for error messages about faulty output. + */ + int r=0, neg=0; + Long_double old; + *fract=0.0; *exp=0; + if (x<0.0) { + x= -x; + neg= 1; + } + if (x==0.0) return 1; + if (x>=10.0) { + while (x>=10.0) { + old=x; r++; x/=10.0; + if (old==x) return 0; + } + } else { + while (x<1.0) { + old=x; r--; x*=10.0; + if (old==x) return 0; + } + } + if (neg) *fract= -x; + else *fract= x; + *exp=r; + return 1; +} + +char * +f_rep(int precision, Long_double val) +{ + /* Return the floating representation of val */ + static char buf[1024]; + char *f1; + if (sizeof(double) == sizeof(Long_double)) { + /* Assume they're the same, and use non-stdc format */ + /* This is for stdc compilers using non-stdc libraries */ + f1= "%.*e"; + } else { + /* It had better support Le then */ + f1= "%.*Le"; + } + sprintf(buf, f1, precision, val); + return buf; +} + +Void +bitpattern(char *p, unsigned int size) +{ + /* Printf the bit-pattern of p */ + char c; + unsigned int i; + int j; + + for (i=1; i<=size; i++) { + c= *p; + p++; + for (j=bits_per_byte-1; j>=0; j--) + printf("%c", (c>>j)&1 ? '1' : '0'); + if (i!=size) printf(" "); + } +} + +Void +fill(char *p, int size) +{ + char *ab= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int i; + + for (i=0; i>(byte_size*(sizeof(x)-i)))&mask);\ + putchar(c==0 ? '?' : (char)c); }\ + printf("%s\n", oc); + +Void +endian(int byte_size) +{ + /* Printf the byte-order used on this machine */ + /*unsigned*/ short s=0; + /*unsigned*/ int j=0; + /*unsigned*/ long l=0; + + unsigned int mask, i, c; + + mask=0; + for (i=1; i<=(unsigned)byte_size; i++) mask= (mask<<1)|1; + + if (V) { + printf("%sCHARACTER ORDER%s\n", co, oc); + Order(s, "short:"); + Order(j, "int: "); + Order(l, "long: "); + } +} + +Void +missing(char *s) +{ + printf("%s*** #define %s missing from limits.h%s\n", co, s, oc); + bugs++; +} + +Void +fmissing(char *s) +{ + printf("%s*** #define %s missing from float.h%s\n", co, s, oc); + bugs++; +} + +/* To try and fool optimisers */ +int false( void ) { return 0; } + +#define Promoted(x) (false()?(x):(-1)) +#define is_signed(x) (Promoted(x) < 0) +#define sign_of(x) (is_signed(x)?"signed":"unsigned") +#define Signed 1 +#define Unsigned 0 +#define sgn(x) ((is_signed(x))?Signed:Unsigned) + +#define showtype(t, x) Vprintf("%s%s %s %s%s\n", co, t, sign_of(x), type_of((int)sizeof(x)), oc) + +char *type_of(int x) +{ + if (x == sizeof(char)) { + if (sizeof(char) == sizeof(int)) return "char/short/int"; + if (sizeof(char) == sizeof(short)) return "char/short"; + return "char"; + } + if (x == sizeof(short)) { + if (sizeof(short) == sizeof(int)) return "short/int"; + return "short"; + } + if (x == sizeof(int)) { + if (sizeof(int) == sizeof(long)) return "int/long"; + return "int"; + } + if (x == sizeof(long)) return "long"; + return "unknown-type"; +} + +char *ftype_of(int x) +{ + if (x == sizeof(float)) { + return "float"; + } + if (x == sizeof(double)) { + if (sizeof(double) == sizeof(Long_double)) + return "(long)double"; + return "double"; + } + if (x == sizeof(Long_double)) { + return "long double"; + } + return "unknown-type"; +} + +Void typerr(char *name, int esign, int esize, int sign, int size) +{ + Vprintf("*** %s has wrong type: expected %s %s, found %s %s\n", + name, sign_of(esign), type_of(esize), + sign_of(sign), type_of(size)); +} + +Void ftyperr(char *name, int esize, int size) +{ + Vprintf("*** %s has wrong type: expected %s, found %s\n", + name, ftype_of(esize), ftype_of(size)); +} + +Void promotions( void ) +{ + int si; long sl; + unsigned int ui; + short ss; + +#ifndef NO_UI + unsigned long ul; /* if this fails, define NO_UI */ + unsigned short us; /* if this fails, define NO_UI */ + + ul=0; us=0; +#endif + /* Shut compiler warnings up: */ + si=0; sl=0; ui=0; ss=0; + + Vprintf("\n%sPROMOTIONS%s\n", co, oc); + + /* Sanity checks. Possible warnings here; should be no problem */ + if (is_signed(ui)) + eek_a_bug("unsigned int promotes to signed!\n"); + if (!is_signed(si)) + eek_a_bug("signed int promotes to unsigned!\n"); + if (!is_signed(sl)) + eek_a_bug("signed long promotes to unsigned!\n"); + if (sizeof(Promoted(si)) != sizeof(int)) + eek_a_bug("int doesn't promote to int!\n"); + if (sizeof(Promoted(sl)) != sizeof(long)) + eek_a_bug("long doesn't promote to long!\n"); + if (sizeof(Promoted(ss)) != sizeof(int)) + eek_a_bug("short doesn't promote to int!\n"); + if (sizeof(Promoted(ui)) != sizeof(int)) + eek_a_bug("unsigned int doesn't promote to int!\n"); +#ifndef NO_UI + if (sizeof(Promoted(ul)) != sizeof(long)) + eek_a_bug("unsigned long doesn't promote to long!\n"); + if (is_signed(ul)) + eek_a_bug("unsigned long promotes to signed!\n"); +#endif + +#ifndef NO_UI + showtype("unsigned short promotes to", Promoted(us)); +#endif + showtype("long+unsigned gives", sl+ui); +} + +#define checktype(x, n, s, t) if((sgn(x)!=s)||(sizeof(x)!=sizeof(t))) typerr(n, s, (int)sizeof(t), sgn(x), (int)sizeof(x)); + +#define fchecktype(x, n, t) if (sizeof(x) != sizeof(t)) ftyperr(n, (int)sizeof(x), (int)sizeof(t)); + +Void check_defines( void ) +{ + /* ensure that all #defines are present and have the correct type */ +#ifdef VERIFY + int usign; + +#ifdef NO_UI + usign= Signed; +#else + /* Implementations promote unsigned short differently */ + usign= is_signed((unsigned short)0); +#endif + + if (L) { +#ifdef CHAR_BIT + checktype(CHAR_BIT, "CHAR_BIT", Signed, int); +#else + missing("CHAR_BIT"); +#endif +#ifdef CHAR_MAX + checktype(CHAR_MAX, "CHAR_MAX", Signed, int); +#else + missing("CHAR_MAX"); +#endif +#ifdef CHAR_MIN + checktype(CHAR_MIN, "CHAR_MIN", Signed, int); +#else + missing("CHAR_MIN"); +#endif +#ifdef SCHAR_MAX + checktype(SCHAR_MAX, "SCHAR_MAX", Signed, int); +#else + missing("SCHAR_MAX"); +#endif +#ifdef SCHAR_MIN + checktype(SCHAR_MIN, "SCHAR_MIN", Signed, int); +#else + missing("SCHAR_MIN"); +#endif +#ifdef UCHAR_MAX + checktype(UCHAR_MAX, "UCHAR_MAX", Signed, int); +#else + missing("UCHAR_MAX"); +#endif +#ifdef SHRT_MAX + checktype(SHRT_MAX, "SHRT_MAX", Signed, int); +#else + missing("SHRT_MAX"); +#endif +#ifdef SHRT_MIN + checktype(SHRT_MIN, "SHRT_MIN", Signed, int); +#else + missing("SHRT_MIN"); +#endif +#ifdef INT_MAX + checktype(INT_MAX, "INT_MAX", Signed, int); +#else + missing("INT_MAX"); +#endif +#ifdef INT_MIN + checktype(INT_MIN, "INT_MIN", Signed, int); +#else + missing("INT_MIN"); +#endif +#ifdef LONG_MAX + checktype(LONG_MAX, "LONG_MAX", Signed, long); +#else + missing("LONG_MAX"); +#endif +#ifdef LONG_MIN + checktype(LONG_MIN, "LONG_MIN", Signed, long); +#else + missing("LONG_MIN"); +#endif +#ifdef USHRT_MAX + checktype(USHRT_MAX, "USHRT_MAX", usign, int); +#else + missing("USHRT_MAX"); +#endif +#ifdef UINT_MAX + checktype(UINT_MAX, "UINT_MAX", Unsigned, int); +#else + missing("UINT_MAX"); +#endif +#ifdef ULONG_MAX + checktype(ULONG_MAX, "ULONG_MAX", Unsigned, long); +#else + missing("ULONG_MAX"); +#endif + } /* if (L) */ + + if (F) { +#ifdef FLT_RADIX + checktype(FLT_RADIX, "FLT_RADIX", Signed, int); +#else + fmissing("FLT_RADIX"); +#endif +#ifdef FLT_MANT_DIG + checktype(FLT_MANT_DIG, "FLT_MANT_DIG", Signed, int); +#else + fmissing("FLT_MANT_DIG"); +#endif +#ifdef FLT_DIG + checktype(FLT_DIG, "FLT_DIG", Signed, int); +#else + fmissing("FLT_DIG"); +#endif +#ifdef FLT_ROUNDS + checktype(FLT_ROUNDS, "FLT_ROUNDS", Signed, int); +#else + fmissing("FLT_ROUNDS"); +#endif +#ifdef FLT_EPSILON + fchecktype(FLT_EPSILON, "FLT_EPSILON", float); +#else + fmissing("FLT_EPSILON"); +#endif +#ifdef FLT_MIN_EXP + checktype(FLT_MIN_EXP, "FLT_MIN_EXP", Signed, int); +#else + fmissing("FLT_MIN_EXP"); +#endif +#ifdef FLT_MIN + fchecktype(FLT_MIN, "FLT_MIN", float); +#else + fmissing("FLT_MIN"); +#endif +#ifdef FLT_MIN_10_EXP + checktype(FLT_MIN_10_EXP, "FLT_MIN_10_EXP", Signed, int); +#else + fmissing("FLT_MIN_10_EXP"); +#endif +#ifdef FLT_MAX_EXP + checktype(FLT_MAX_EXP, "FLT_MAX_EXP", Signed, int); +#else + fmissing("FLT_MAX_EXP"); +#endif +#ifdef FLT_MAX + fchecktype(FLT_MAX, "FLT_MAX", float); +#else + fmissing("FLT_MAX"); +#endif +#ifdef FLT_MAX_10_EXP + checktype(FLT_MAX_10_EXP, "FLT_MAX_10_EXP", Signed, int); +#else + fmissing("FLT_MAX_10_EXP"); +#endif +#ifdef DBL_MANT_DIG + checktype(DBL_MANT_DIG, "DBL_MANT_DIG", Signed, int); +#else + fmissing("DBL_MANT_DIG"); +#endif +#ifdef DBL_DIG + checktype(DBL_DIG, "DBL_DIG", Signed, int); +#else + fmissing("DBL_DIG"); +#endif +#ifdef DBL_EPSILON + fchecktype(DBL_EPSILON, "DBL_EPSILON", double); +#else + fmissing("DBL_EPSILON"); +#endif +#ifdef DBL_MIN_EXP + checktype(DBL_MIN_EXP, "DBL_MIN_EXP", Signed, int); +#else + fmissing("DBL_MIN_EXP"); +#endif +#ifdef DBL_MIN + fchecktype(DBL_MIN, "DBL_MIN", double); +#else + fmissing("DBL_MIN"); +#endif +#ifdef DBL_MIN_10_EXP + checktype(DBL_MIN_10_EXP, "DBL_MIN_10_EXP", Signed, int); +#else + fmissing("DBL_MIN_10_EXP"); +#endif +#ifdef DBL_MAX_EXP + checktype(DBL_MAX_EXP, "DBL_MAX_EXP", Signed, int); +#else + fmissing("DBL_MAX_EXP"); +#endif +#ifdef DBL_MAX + fchecktype(DBL_MAX, "DBL_MAX", double); +#else + fmissing("DBL_MAX"); +#endif +#ifdef DBL_MAX_10_EXP + checktype(DBL_MAX_10_EXP, "DBL_MAX_10_EXP", Signed, int); +#else + fmissing("DBL_MAX_10_EXP"); +#endif +#ifdef STDC +#ifdef LDBL_MANT_DIG + checktype(LDBL_MANT_DIG, "LDBL_MANT_DIG", Signed, int); +#else + fmissing("LDBL_MANT_DIG"); +#endif +#ifdef LDBL_DIG + checktype(LDBL_DIG, "LDBL_DIG", Signed, int); +#else + fmissing("LDBL_DIG"); +#endif +#ifdef LDBL_EPSILON + fchecktype(LDBL_EPSILON, "LDBL_EPSILON", long double); +#else + fmissing("LDBL_EPSILON"); +#endif +#ifdef LDBL_MIN_EXP + checktype(LDBL_MIN_EXP, "LDBL_MIN_EXP", Signed, int); +#else + fmissing("LDBL_MIN_EXP"); +#endif +#ifdef LDBL_MIN + fchecktype(LDBL_MIN, "LDBL_MIN", long double); +#else + fmissing("LDBL_MIN"); +#endif +#ifdef LDBL_MIN_10_EXP + checktype(LDBL_MIN_10_EXP, "LDBL_MIN_10_EXP", Signed, int); +#else + fmissing("LDBL_MIN_10_EXP"); +#endif +#ifdef LDBL_MAX_EXP + checktype(LDBL_MAX_EXP, "LDBL_MAX_EXP", Signed, int); +#else + fmissing("LDBL_MAX_EXP"); +#endif +#ifdef LDBL_MAX + fchecktype(LDBL_MAX, "LDBL_MAX", long double); +#else + fmissing("LDBL_MAX"); +#endif +#ifdef LDBL_MAX_10_EXP + checktype(LDBL_MAX_10_EXP, "LDBL_MAX_10_EXP", Signed, int); +#else + fmissing("LDBL_MAX_10_EXP"); +#endif +#endif /* STDC */ + } /* if (F) */ +#endif /* VERIFY */ +} + +#ifdef VERIFY +#ifndef SCHAR_MAX +#define SCHAR_MAX char_max +#endif +#ifndef SCHAR_MIN +#define SCHAR_MIN char_min +#endif +#ifndef UCHAR_MAX +#define UCHAR_MAX char_max +#endif +#endif /* VERIFY */ + +#ifndef CHAR_BIT +#define CHAR_BIT char_bit +#endif +#ifndef CHAR_MAX +#define CHAR_MAX char_max +#endif +#ifndef CHAR_MIN +#define CHAR_MIN char_min +#endif +#ifndef SCHAR_MAX +#define SCHAR_MAX char_max +#endif +#ifndef SCHAR_MIN +#define SCHAR_MIN char_min +#endif +#ifndef UCHAR_MAX +#define UCHAR_MAX char_max +#endif + +int cprop( void ) +{ + /* Properties of type char */ + Volatile char c, char_max, char_min; + Volatile int byte_size, c_signed; + long char_bit; + + Unexpected(2); + + /* Calculate number of bits per character *************************/ + c=1; byte_size=0; + do { c=c<<1; byte_size++; } while(c!=0); + c= (char)(-1); + if (((int)c)<0) c_signed=1; + else c_signed=0; + Vprintf("%schar = %d bits, %ssigned%s\n", + co, (int)sizeof(c)*byte_size, (c_signed?"":"un"), oc); + char_bit=(long)(sizeof(c)*byte_size); + if (L) i_define(D_CHAR_BIT, "", "CHAR", "_BIT", + char_bit, 0L, (long) CHAR_BIT, ""); + + c=0; char_max=0; + c++; + if (setjmp(lab)==0) { /* Yields char_max */ + while (c>char_max) { + char_max=c; + c=(char)(c*2+1); + } + } else { + Vprintf("%sCharacter overflow generates a trap!%s\n", co, oc); + } + c=0; char_min=0; + c--; + if (cchar_max) { + char_max=c1; + c1++; + } + } + Unexpected(4); + if (sizeof(char) == sizeof(int)) { + u_define(D_UCHAR_MAX, "", "UCHAR", "_MAX", + (ulong) char_max, + (ulong) UCHAR_MAX, ""); + } else { + i_define(D_UCHAR_MAX, "", "UCHAR", "_MAX", + (long) char_max, 0L, + (long) UCHAR_MAX, ""); + } +#endif + } else { +#ifndef NO_SC +/* Syntax error? Define NO_SC */ Volatile signed char c1, char_max, char_min; + c1=0; char_max=0; + c1++; + if (setjmp(lab)==0) { /* Yields char_max */ + while (c1>char_max) { + char_max=c1; + c1++; + } + } + c1=0; char_min=0; + c1--; + if (setjmp(lab)==0) { /* Yields char_min */ + while (c1sizeof(int)?" BEWARE! larger than int!":"", + oc); + Vprintf("%sint* =%d bits%s%s\n", + co, (int)sizeof(int *)*byte_size, + sizeof(int *)>sizeof(int)?" BEWARE! larger than int!":"", + oc); + Vprintf("%sfunc*=%d bits%s%s\n", + co, (int)sizeof(function *)*byte_size, + sizeof(function *)>sizeof(int)?" BEWARE! larger than int!":"", + oc); + + showtype("Type size_t is", sizeof(0)); +#ifdef STDC + showtype("Type wchar_t is", L'x'); +#endif + + /* Alignment constants ********************************************/ + +#define alignment(TYPE) \ + ((long)((char *)&((struct{char c; TYPE d;}*)0)->d - (char *)0)) + + Vprintf("\n%sALIGNMENTS%s\n", co, oc); + + Vprintf("%schar=%ld short=%ld int=%ld long=%ld%s\n", + co, + alignment(char), alignment(short), + alignment(int), alignment(long), + oc); + + Vprintf("%sfloat=%ld double=%ld%s\n", + co, + alignment(float), alignment(double), + oc); + + if (stdc) { + Vprintf("%slong double=%ld%s\n", + co, + alignment(Long_double), + oc); + } + Vprintf("%schar*=%ld int*=%ld func*=%ld%s\n", + co, + alignment(char *), alignment(int *), alignment(function *), + oc); + + Vprintf("\n"); + + /* Ten little endians *********************************************/ + + endian(byte_size); + + /* Pointers *******************************************************/ + + Vprintf("\n%sPROPERTIES OF POINTERS%s\n", co, oc); + cp= (char *) &variable; + ip= (int *) &variable; + fp= (function *) &variable; + + Vprintf("%sChar and int pointer formats ", co); + if (memeq((char *) &cp, sizeof(cp), (char *) &ip, sizeof(ip))) { + Vprintf("seem identical%s\n", oc); + } else { + Vprintf("are different%s\n", oc); + } + Vprintf("%sChar and function pointer formats ", co); + if (memeq((char *) &cp, sizeof(cp), (char *) &fp, sizeof(fp))) { + Vprintf("seem identical%s\n", oc); + } else { + Vprintf("are different%s\n", oc); + } + + if (V) { + if ((VOID *)"abcd" == (VOID *)"abcd") + printf("%sStrings are shared%s\n", co, oc); + else printf("%sStrings are not shared%s\n", co, oc); + } + + p=0; q=0; + showtype("Type ptrdiff_t is", p-q); + + //if (setjmp(mlab) == 0) { + // variable= *p; + // Vprintf("%sBEWARE! Dereferencing NULL doesn't cause a trap%s\n", + // co, oc); + //} else { + // Vprintf("%sDereferencing NULL causes a trap%s\n", co, oc); + //} + if (setjmp(mlab)!=0) croak(-2); + + Vprintf("\n%sPROPERTIES OF INTEGRAL TYPES%s\n", co, oc); + + sprop(); + iprop(); + lprop(); + usprop(); + uiprop(); + ulprop(); + + promotions(); + + Unexpected(6); + + return byte_size; +} + +#else /* not PASS0 */ + +#ifdef SEP +/* The global variables used by several passes */ +extern jmp_buf lab; +extern int V, L, F, bugs, bits_per_byte; +extern int maxint, flt_radix, flt_rounds; +extern Volatile int trapped; +extern char co[], oc[]; +extern char *f_rep(); +extern Void trap1(); +#endif /* SEP */ +#endif /* ifdef PASS0 */ + +/* As I said, I apologise for the contortions below. The functions are + expanded by the preprocessor twice or three times (for float and double, + and maybe for long double, and for short, int and long). That way, + I never make a change to one that I forget to make to the other. + You can look on it as C's fault for not supporting multi-line macros. + This whole file is read 3 times by the preprocessor, with PASSn set for + n=1, 2 or 3, to decide which parts to reprocess. +*/ + +/* #undef on an already undefined thing is (wrongly) flagged as an error + by some compilers, therefore the #ifdef that follows: +*/ +#ifdef Number +#undef Number +#undef THING +#undef Thing +#undef thing +#undef FPROP +#undef Fname +#undef Store +#undef Sum +#undef Diff +#undef Mul +#undef Div +#undef ZERO +#undef HALF +#undef ONE +#undef TWO +#undef THREE +#undef FOUR +#undef Self +#undef F_check +#undef Verify +#undef EPROP +#undef MARK + +/* These are the float.h constants */ +#undef F_RADIX +#undef F_MANT_DIG +#undef F_DIG +#undef F_ROUNDS +#undef F_EPSILON +#undef F_MIN_EXP +#undef F_MIN +#undef F_MIN_10_EXP +#undef F_MAX_EXP +#undef F_MAX +#undef F_MAX_10_EXP +#endif + +#ifdef Integer +#undef Integer +#undef INT +#undef IPROP +#undef Iname +#undef UPROP +#undef Uname +#undef OK_UI +#undef IMARK + +#undef I_MAX +#undef I_MIN +#undef U_MAX +#endif + +#ifdef PASS1 + +/* Define the things we're going to use this pass */ + +#define Number float +#define THING "FLOAT" +#define Thing "Float" +#define thing "float" +#define Fname "FLT" +#define FPROP fprop +#define Store fStore +#define Sum fSum +#define Diff fDiff +#define Mul fMul +#define Div fDiv +#define ZERO 0.0 +#define HALF 0.5 +#define ONE 1.0 +#define TWO 2.0 +#define THREE 3.0 +#define FOUR 4.0 +#define Self fSelf +#define F_check fCheck +#define MARK "F" +#ifdef VERIFY +#define Verify fVerify +#endif + +#define EPROP efprop + +#define Integer short +#define INT "short" +#define IPROP sprop +#define Iname "SHRT" +#ifndef NO_UI +#define OK_UI 1 +#endif +#define IMARK "" + +#define UPROP usprop +#define Uname "USHRT" + +#ifdef VERIFY +#ifdef SHRT_MAX +#define I_MAX SHRT_MAX +#endif +#ifdef SHRT_MIN +#define I_MIN SHRT_MIN +#endif +#ifdef USHRT_MAX +#define U_MAX USHRT_MAX +#endif + +#ifdef FLT_RADIX +#define F_RADIX FLT_RADIX +#endif +#ifdef FLT_MANT_DIG +#define F_MANT_DIG FLT_MANT_DIG +#endif +#ifdef FLT_DIG +#define F_DIG FLT_DIG +#endif +#ifdef FLT_ROUNDS +#define F_ROUNDS FLT_ROUNDS +#endif +#ifdef FLT_EPSILON +#define F_EPSILON FLT_EPSILON +#endif +#ifdef FLT_MIN_EXP +#define F_MIN_EXP FLT_MIN_EXP +#endif +#ifdef FLT_MIN +#define F_MIN FLT_MIN +#endif +#ifdef FLT_MIN_10_EXP +#define F_MIN_10_EXP FLT_MIN_10_EXP +#endif +#ifdef FLT_MAX_EXP +#define F_MAX_EXP FLT_MAX_EXP +#endif +#ifdef FLT_MAX +#define F_MAX FLT_MAX +#endif +#ifdef FLT_MAX_10_EXP +#define F_MAX_10_EXP FLT_MAX_10_EXP +#endif +#endif /* VERIFY */ + +#endif /* PASS1 */ + +#ifdef PASS2 + +#define Number double +#define THING "DOUBLE" +#define Thing "Double" +#define thing "double" +#define Fname "DBL" +#define FPROP dprop +#define Store dStore +#define Sum dSum +#define Diff dDiff +#define Mul dMul +#define Div dDiv +#define ZERO 0.0 +#define HALF 0.5 +#define ONE 1.0 +#define TWO 2.0 +#define THREE 3.0 +#define FOUR 4.0 +#define Self dSelf +#define F_check dCheck +#define MARK "" +#ifdef VERIFY +#define Verify dVerify +#endif + +#define EPROP edprop + +#define Integer int +#define INT "int" +#define IPROP iprop +#define Iname "INT" +#define OK_UI 1 /* Unsigned int is always possible */ +#define IMARK "" + +#define UPROP uiprop +#define Uname "UINT" + +#ifdef VERIFY +#ifdef INT_MAX +#define I_MAX INT_MAX +#endif +#ifdef INT_MIN +#define I_MIN INT_MIN +#endif +#ifdef UINT_MAX +#define U_MAX UINT_MAX +#endif + +#ifdef DBL_MANT_DIG +#define F_MANT_DIG DBL_MANT_DIG +#endif +#ifdef DBL_DIG +#define F_DIG DBL_DIG +#endif +#ifdef DBL_EPSILON +#define F_EPSILON DBL_EPSILON +#endif +#ifdef DBL_MIN_EXP +#define F_MIN_EXP DBL_MIN_EXP +#endif +#ifdef DBL_MIN +#define F_MIN DBL_MIN +#endif +#ifdef DBL_MIN_10_EXP +#define F_MIN_10_EXP DBL_MIN_10_EXP +#endif +#ifdef DBL_MAX_EXP +#define F_MAX_EXP DBL_MAX_EXP +#endif +#ifdef DBL_MAX +#define F_MAX DBL_MAX +#endif +#ifdef DBL_MAX_10_EXP +#define F_MAX_10_EXP DBL_MAX_10_EXP +#endif +#endif /* VERIFY */ + +#endif /* PASS2 */ + +#ifdef PASS3 + +#ifdef STDC +#define Number long double + +#define ZERO 0.0L +#define HALF 0.5L +#define ONE 1.0L +#define TWO 2.0L +#define THREE 3.0L +#define FOUR 4.0L +#endif + +#define THING "LONG DOUBLE" +#define Thing "Long double" +#define thing "long double" +#define Fname "LDBL" +#define FPROP ldprop +#define Store ldStore +#define Sum ldSum +#define Diff ldDiff +#define Mul ldMul +#define Div ldDiv +#define Self ldSelf +#define F_check ldCheck +#define MARK "L" +#ifdef VERIFY +#define Verify ldVerify +#endif + +#define EPROP eldprop + +#define Integer long +#define INT "long" +#define IPROP lprop +#define Iname "LONG" +#ifndef NO_UI +#define OK_UI 1 +#endif +#define IMARK "L" + +#define UPROP ulprop +#define Uname "ULONG" + +#ifdef VERIFY +#ifdef LONG_MAX +#define I_MAX LONG_MAX +#endif +#ifdef LONG_MIN +#define I_MIN LONG_MIN +#endif +#ifdef ULONG_MAX +#define U_MAX ULONG_MAX +#endif + +#ifdef LDBL_MANT_DIG +#define F_MANT_DIG LDBL_MANT_DIG +#endif +#ifdef LDBL_DIG +#define F_DIG LDBL_DIG +#endif +#ifdef LDBL_EPSILON +#define F_EPSILON LDBL_EPSILON +#endif +#ifdef LDBL_MIN_EXP +#define F_MIN_EXP LDBL_MIN_EXP +#endif +#ifdef LDBL_MIN +#define F_MIN LDBL_MIN +#endif +#ifdef LDBL_MIN_10_EXP +#define F_MIN_10_EXP LDBL_MIN_10_EXP +#endif +#ifdef LDBL_MAX_EXP +#define F_MAX_EXP LDBL_MAX_EXP +#endif +#ifdef LDBL_MAX +#define F_MAX LDBL_MAX +#endif +#ifdef LDBL_MAX_10_EXP +#define F_MAX_10_EXP LDBL_MAX_10_EXP +#endif +#endif /* VERIFY */ + +#endif /* PASS3 */ + +/* The rest of the file gets read all three times; + the differences are encoded in the things #defined above. +*/ + +#ifndef I_MAX +#define I_MAX int_max +#endif +#ifndef I_MIN +#define I_MIN int_min +#endif +#ifndef U_MAX +#define U_MAX u_max +#endif + +#ifndef F_RADIX +#define F_RADIX f_radix +#endif +#ifndef F_MANT_DIG +#define F_MANT_DIG f_mant_dig +#endif +#ifndef F_DIG +#define F_DIG f_dig +#endif +#ifndef F_ROUNDS +#define F_ROUNDS f_rounds +#endif +#ifndef F_EPSILON +#define F_EPSILON f_epsilon +#endif +#ifndef F_MIN_EXP +#define F_MIN_EXP f_min_exp +#endif +#ifndef F_MIN +#define F_MIN f_min +#endif +#ifndef F_MIN_10_EXP +#define F_MIN_10_EXP f_min_10_exp +#endif +#ifndef F_MAX_EXP +#define F_MAX_EXP f_max_exp +#endif +#ifndef F_MAX +#define F_MAX f_max +#endif +#ifndef F_MAX_10_EXP +#define F_MAX_10_EXP f_max_10_exp +#endif + +#ifndef VERIFY +#define Verify(prec, val, req, same, same1) {;} +#endif + +#ifdef Integer + +Void IPROP( void ) +{ + /* the properties of short, int, and long */ + Volatile Integer newi, int_max, maxeri, int_min, minneri; + Volatile int ibits, ipower, two=2; + + /* Calculate max short/int/long ***********************************/ + /* Calculate 2**n-1 until overflow - then use the previous value */ + + newi=1; int_max=0; + + if (setjmp(lab)==0) { /* Yields int_max */ + for(ipower=0; newi>int_max; ipower++) { + int_max=newi; + newi=newi*two+1; + } + Vprintf("%sOverflow of a%s %s does not generate a trap%s\n", + co, INT[0]=='i'?"n":"", INT, oc); + } else { + Vprintf("%sOverflow of a%s %s generates a trap%s\n", + co, INT[0]=='i'?"n":"", INT, oc); + } + Unexpected(7); + + /* Minimum value: assume either two's or one's complement *********/ + int_min= -int_max; + if (setjmp(lab)==0) { /* Yields int_min */ + if (int_min-1 < int_min) int_min--; + } + Unexpected(8); + + /* Now for those daft Cybers */ + + maxeri=0; newi=int_max; + + if (setjmp(lab)==0) { /* Yields maxeri */ + for(ibits=ipower; newi>maxeri; ibits++) { + maxeri=newi; + newi=newi+newi+1; + } + } + Unexpected(9); + + minneri= -maxeri; + if (setjmp(lab)==0) { /* Yields minneri */ + if (minneri-1 < minneri) minneri--; + } + Unexpected(10); + + Vprintf("%sMaximum %s = %ld (= 2**%d-1)%s\n", + co, INT, (long)int_max, ipower, oc); + Vprintf("%sMinimum %s = %ld%s\n", co, INT, (long)int_min, oc); + + if (L) i_define(D_INT_MAX, INT, Iname, "_MAX", + (long) int_max, 0L, + (long) I_MAX, IMARK); + if (L) i_define(D_INT_MIN, INT, Iname, "_MIN", + (long) int_min, (long) (PASS==1?maxint:int_max), + (long) I_MIN, IMARK); + + if(int_max < 0) { /* It has happened (on a Cray) */ + eek_a_bug("signed integral comparison faulty?"); + } + + if (maxeri>int_max) { + Vprintf("%sThere is a larger %s, %ld (= 2**%d-1), %s %s%s\n", + co, INT, (long)maxeri, ibits, + "but only for addition, not multiplication", + "(I smell a Cyber!)", + oc); + } + + if (minneriu_max) { + u_max=newi; + newi=newi*two+1; + } + } + Unexpected(11); + Vprintf("%sMaximum unsigned %s = %lu%s\n", + co, INT, (unsigned long) u_max, oc); + + /* Oh woe: new standard C defines value preserving promotions: + 3.2.1.1: "If an int can represent all values of the original type, + the value is converted to an int; + otherwise it is converted to an unsigned int." + */ + if (L) { + if (PASS == 1 /* we're dealing with short */ + && u_max <= maxint /* an int can represent all values */ + ) + { /* the value is converted to an int */ + i_define(D_UINT_MAX, INT, Uname, "_MAX", + (long) u_max, 0L, + (long) U_MAX, IMARK); + } else { /* it is converted to an unsigned int */ + u_define(D_UINT_MAX, INT, Uname, "_MAX", + (unsigned long) u_max, + (unsigned long) U_MAX, IMARK); + } + } +#endif +} + +#endif /* Integer */ + +#ifdef Number + +/* The following routines are intended to defeat any attempt at optimisation + or use of extended precision, and to defeat faulty narrowing casts. + The weird prototypes are because of widening incompatibilities. +*/ +#if defined(STDC) || defined(_MSC_VER) +#define ARGS1(A, a) (A a) +#define ARGS2(A, a, B, b) (A a, B b) +#define ARGS5(A, a, B, b, C, c, D, d, E, e) (A a, B b, C c, D d, E e) +#else +#define ARGS1(A, a) (a) A a; +#define ARGS2(A, a, B, b) (a, b) A a; B b; +#define ARGS5(A, a, B, b, C, c, D, d, E, e) (a,b,c,d,e)A a; B b; C c; D d; E e; +#endif + +Void Store ARGS2(Number, a, Number *, b) { *b=a; } +Number Sum ARGS2(Number, a, Number, b) {Number r; Store(a+b, &r); return r; } +Number Diff ARGS2(Number, a, Number, b){Number r; Store(a-b, &r); return r; } +Number Mul ARGS2(Number, a, Number, b) {Number r; Store(a*b, &r); return r; } +Number Div ARGS2(Number, a, Number, b) {Number r; Store(a/b, &r); return r; } +Number Self ARGS1(Number, a) {Number r; Store(a, &r); return r; } + +Void F_check ARGS((int precision, Long_double val1)); + +Void F_check(int precision, Long_double val1) +{ + /* You don't think I'm going to go to all the trouble of writing + a program that works out what all sorts of values are, only to + have printf go and print the wrong values out, do you? + No, you're right, so this function tries to see if printf + has written the right value, by reading it back again. + This introduces a new problem of course: suppose printf writes + the correct value, and scanf reads it back wrong... oh well. + But I'm adamant about this: the precision given is enough + to uniquely identify the printed number, therefore I insist + that sscanf read the number back identically. Harsh yes, but + sometimes you've got to be cruel to be kind. + */ + Long_double new1, rem; + Number val, new, diff; + int e; + char *rep, *f2; + + if (sizeof(double) == sizeof(Long_double)) { + /* Assume they're the same, and use non-stdc format */ + /* This is for stdc compilers using non-stdc libraries */ + f2= "%le"; /* Input */ + } else { + /* It had better support Le then */ + f2= "%Le"; + } + val= (Number) val1; + rep= f_rep(precision, (Long_double) val); + if (setjmp(lab)==0) { + sscanf(rep, f2, &new1); + } else { + eek_a_bug("sscanf caused a trap"); + printf("%s scanning: %s format: %s%s\n\n", co, rep, f2, oc); + Unexpected(12); + return; + } + + if (setjmp(lab)==0) { /* See if new is usable */ + new= new1; + if (new != 0.0) { + diff= val/new - 1.0; + if (diff < 0.1) diff= 1.0; + /* That should be enough to generate a trap */ + } + } else { + eek_a_bug("sscanf returned an unusable number"); + printf("%s scanning: %s with format: %s%s\n\n", + co, rep, f2, oc); + Unexpected(13); + return; + } + + Unexpected(14); + if (new != val) { + eek_a_bug("Possibly bad output from printf above"); + if (!exponent((Long_double)val, &rem, &e)) { + printf("%s but value was an unusable number%s\n\n", + co, oc); + return; + } + printf("%s expected value around ", co); + //if (sizeof(double) == sizeof(Long_double)) { + /* Assume they're the same, and use non-stdc format */ + /* This is for stdc compilers using non-stdc libraries */ + //printf("%.*fe%d, bit pattern:\n ", precision, rem, e); + //} else { + /* It had better support Lfe then */ + printf("%.*Lfe%d, bit pattern:\n ", precision, rem, e); + //} + bitpattern((char *) &val, (unsigned)sizeof(val)); + printf ("%s\n", oc); + printf("%s sscanf gave %s, bit pattern:\n ", + co, f_rep(precision, (Long_double) new)); + bitpattern((char *) &new, (unsigned)sizeof(new)); + printf ("%s\n", oc); + if (setjmp(lab) == 0) { + diff= val-new; + printf("%s difference= %s%s\n\n", + co, f_rep(precision, (Long_double) diff), oc); + } /* else forget it */ + Unexpected(15); + } +} + +#ifdef VERIFY +Void Verify ARGS5(int, prec, Number, val, Number, req, int, same, int, same1) +{ + /* Check that the compiler has read a #define value correctly */ + Unexpected(16); + if (!same) { + printf("%s*** Verify failed for above #define!\n", co); + if (setjmp(lab) == 0) { /* for the case that req == nan */ + printf(" Compiler has %s for value\n", + f_rep(prec, req)); + } else { + printf(" Compiler has %s for value\n", + "an unusable number"); + } + if (setjmp(lab) == 0) { + F_check(prec, (Long_double) req); + } /*else forget it*/ + if (setjmp(lab) == 0) { + if (req > 0.0 && val > 0.0) { + printf(" difference= %s\n", + f_rep(prec, val-req)); + } + } /*else forget it*/ + Unexpected(17); + printf("%s\n", oc); + bugs++; + } else if (!same1) { + if (stdc) eek_a_bug("constant has the wrong precision"); + else eek_a_bug("the cast didn't work"); + printf("\n"); + } +} +#endif /* VERIFY */ + +int FPROP(int byte_size) +{ + /* Properties of floating types, using algorithms by Cody and Waite + from MA Malcolm, as modified by WM Gentleman and SB Marovich. + Further extended by S Pemberton. + + Returns the number of digits in the fraction. + */ + + Volatile int + i, f_radix, iexp, irnd, mrnd, f_rounds, f_mant_dig, + iz, k, inf, machep, f_max_exp, f_min_exp, mx, negeps, + mantbits, digs, f_dig, trap, + hidden, normal, f_min_10_exp, f_max_10_exp; + Volatile Number + a, b, base, basein, basem1, f_epsilon, epsneg, + eps, epsp1, etop, ebot, + f_max, newxmax, f_min, xminner, y, y1, z, z1, z2; + + Unexpected(18); + + Vprintf("%sPROPERTIES OF %s%s\n", co, THING, oc); + + /* Base and size of significand **************************************/ + /* First repeatedly double until adding 1 has no effect. */ + /* For instance, if base is 10, with 3 significant digits */ + /* it will try 1, 2, 4, 8, ... 512, 1024, and stop there, */ + /* since 1024 is only representable as 1020. */ + a=1.0; + if (setjmp(lab)==0) { /* inexact trap? */ + do { a=Sum(a, a); } + while (Diff(Diff(Sum(a, ONE), a), ONE) == ZERO); + } else { + fprintf(stderr, "*** Program got loss-of-precision trap!\n"); + /* And supporting those is just TOO much trouble! */ + farewell(bugs+1); + } + Unexpected(19); + /* Now double until you find a number that can be added to the */ + /* above number. For 1020 this is 8 or 16, depending whether the */ + /* result is rounded or truncated. */ + /* In either case the result is 1030. 1030-1020= the base, 10. */ + b=1.0; + do { b=Sum(b, b); } while ((base=Diff(Sum(a, b), a)) == ZERO); + f_radix=base; + Vprintf("%sBase = %d%s\n", co, f_radix, oc); + + /* Sanity check; if base<2, I can't guarantee the rest will work */ + if (f_radix < 2) { + eek_a_bug("Function return or parameter passing faulty? (This is a guess.)"); + printf("\n"); + return(0); + } + + if (PASS == 1) { /* only for FLT */ + flt_radix= f_radix; + if (F) i_define(D_FLT_RADIX, "", "FLT", "_RADIX", + (long) f_radix, 0L, (long) F_RADIX, ""); + } else if (f_radix != flt_radix) { + printf("\n%s*** WARNING: %s %s (%d) %s%s\n", + co, thing, "arithmetic has a different radix", + f_radix, "from float", oc); + bugs++; + } + + /* Now the number of digits precision */ + f_mant_dig=0; b=1.0; + do { f_mant_dig++; b=Mul(b, base); } + while (Diff(Diff(Sum(b, ONE), b), ONE) == ZERO); + f_dig=floor_log(10, (Long_double)(b/base)) + (base==10?1:0); + Vprintf("%sSignificant base digits = %d %s %d %s%s\n", + co, f_mant_dig, "(= at least", f_dig, "decimal digits)", oc); + if (F) i_define(D_MANT_DIG, thing, Fname, "_MANT_DIG", + (long) f_mant_dig, 0L, (long) F_MANT_DIG, ""); + if (F) i_define(D_DIG, thing, Fname, "_DIG", + (long) f_dig, 0L, (long) F_DIG, ""); + digs= ceil_log(10, (Long_double)b); /* the number of digits to printf */ + + /* Rounding *******************************************************/ + basem1=Diff(base, HALF); + if (Diff(Sum(a, basem1), a) != ZERO) { + if (f_radix == 2) basem1=0.375; + else basem1=1.0; + if (Diff(Sum(a, basem1), a) != ZERO) irnd=2; /* away from 0 */ + else irnd=1; /* to nearest */ + } else irnd=0; /* towards 0 */ + + basem1=Diff(base, HALF); + + if (Diff(Diff(-a, basem1), -a) != ZERO) { + if (f_radix == 2) basem1=0.375; + else basem1=1.0; + if (Diff(Diff(-a, basem1), -a) != ZERO) mrnd=2; /* away from 0*/ + else mrnd=1; /* to nearest */ + } else mrnd=0; /* towards 0 */ + + f_rounds= -1; /* Unknown rounding */ + if (irnd==0 && mrnd==0) f_rounds=0; /* zero = chops */ + if (irnd==1 && mrnd==1) f_rounds=1; /* nearest */ + if (irnd==2 && mrnd==0) f_rounds=2; /* +inf */ + if (irnd==0 && mrnd==2) f_rounds=3; /* -inf */ + + if (f_rounds != -1) { + Vprintf("%sArithmetic rounds towards ", co); + switch (f_rounds) { + case 0: Vprintf("zero (i.e. it chops)"); break; + case 1: Vprintf("nearest"); break; + case 2: Vprintf("+infinity"); break; + case 3: Vprintf("-infinity"); break; + default: Vprintf("???"); break; + } + Vprintf("%s\n", oc); + } else { /* Hmm, try to give some help here */ + Vprintf("%sArithmetic rounds oddly: %s\n", co, oc); + Vprintf("%s Negative numbers %s%s\n", + co, mrnd==0 ? "towards zero" : + mrnd==1 ? "to nearest" : + "away from zero", + oc); + Vprintf("%s Positive numbers %s%s\n", + co, irnd==0 ? "towards zero" : + irnd==1 ? "to nearest" : + "away from zero", + oc); + } + /* An extra goody */ + if (f_radix == 2 && f_rounds == 1) { + if (Diff(Sum(a, ONE), a) != ZERO) { + Vprintf("%s Tie breaking rounds up%s\n", co, oc); + } else if (Diff(Sum(a, THREE), a) == FOUR) { + Vprintf("%s Tie breaking rounds to even%s\n", co, oc); + } else { + Vprintf("%s Tie breaking rounds down%s\n", co, oc); + } + } + if (PASS == 1) { /* only for FLT */ + flt_rounds= f_rounds; + if (F) + i_define(D_FLT_ROUNDS, "", "FLT", "_ROUNDS", + (long) f_rounds, 1L, (long) F_ROUNDS, ""); + } else if (f_rounds != flt_rounds) { + printf("\n%s*** WARNING: %s %s (%d) %s%s\n\n", + co, thing, "arithmetic rounds differently", + f_rounds, "from float", oc); + bugs++; + } + + /* Various flavours of epsilon ************************************/ + negeps=f_mant_dig+f_mant_dig; + basein=1.0/base; + a=1.0; + for(i=1; i<=negeps; i++) a*=basein; + + b=a; + while (Diff(Diff(ONE, a), ONE) == ZERO) { + a*=base; + negeps--; + } + negeps= -negeps; + Vprintf("%sSmallest x such that 1.0-base**x != 1.0 = %d%s\n", + co, negeps, oc); + + etop = ONE; + ebot = ZERO; + eps = Sum(ebot, Div(Diff(etop, ebot), TWO)); + /* find the smallest epsneg (1-epsneg != 1) by binary search. + ebot and etop are the current bounds */ + while (eps != ebot && eps != etop) { + epsp1 = Diff(ONE, eps); + if (epsp1 < ONE) etop = eps; + else ebot = eps; + eps = Sum(ebot, Div(Diff(etop, ebot), TWO)); + } + eps= etop; + /* Sanity check */ + if (Diff(ONE, etop) >= ONE || Diff(ONE, ebot) != ONE) { + eek_a_bug("internal error calculating epsneg"); + } + Vprintf("%sSmallest x such that 1.0-x != 1.0 = %s%s\n", + co, f_rep(digs, (Long_double) eps), oc); + if (V) F_check(digs, (Long_double) eps); + + epsneg=a; + if ((f_radix!=2) && irnd) { + /* a=(a*(1.0+a))/(1.0+1.0); => */ + a=Div(Mul(a, Sum(ONE, a)), Sum(ONE, ONE)); + /* if ((1.0-a)-1.0 != 0.0) epsneg=a; => */ + if (Diff(Diff(ONE, a), ONE) != ZERO) epsneg=a; + } + /* epsneg is used later */ + Unexpected(20); + + machep= -f_mant_dig-f_mant_dig; + a=b; + while (Diff(Sum(ONE, a), ONE) == ZERO) { a*=base; machep++; } + Vprintf("%sSmallest x such that 1.0+base**x != 1.0 = %d%s\n", + co, machep, oc); + + etop = ONE; + ebot = ZERO; + eps = Sum(ebot, Div(Diff(etop, ebot), TWO)); + /* find the smallest eps (1+eps != 1) by binary search. + ebot and etop are the current bounds */ + while (eps != ebot && eps != etop) { + epsp1 = Sum(ONE, eps); + if (epsp1 > ONE) etop = eps; + else ebot = eps; + eps = Sum(ebot, Div(Diff(etop, ebot), TWO)); + } + /* Sanity check */ + if (Sum(ONE, etop) <= ONE || Sum(ONE, ebot) != ONE) { + eek_a_bug("internal error calculating eps"); + } + f_epsilon=etop; + + Vprintf("%sSmallest x such that 1.0+x != 1.0 = %s%s\n", + co, f_rep(digs, (Long_double) f_epsilon), oc); + + f_epsilon= Diff(Sum(ONE, f_epsilon), ONE); /* New C standard defn */ + Vprintf("%s(Above number + 1.0) - 1.0 = %s%s\n", + co, f_rep(digs, (Long_double) (f_epsilon)), oc); + + /* Possible loss of precision warnings here from non-stdc compilers */ + if (F) f_define(D_EPSILON, thing, + Fname, "_EPSILON", digs, (Long_double) f_epsilon, MARK); + if (V || F) F_check(digs, (Long_double) f_epsilon); + Unexpected(21); + if (F) Verify(digs, f_epsilon, F_EPSILON, + f_epsilon == Self(F_EPSILON), + (Long_double) f_epsilon == (Long_double) F_EPSILON); + Unexpected(22); + + /* Extra chop info *************************************************/ + if (f_rounds == 0) { + if (Diff(Mul(Sum(ONE,f_epsilon),ONE),ONE) != ZERO) { + Vprintf("%sAlthough arithmetic chops, it uses guard digits%s\n", co, oc); + } + } + + /* Size of and minimum normalised exponent ************************/ + y=0; i=0; k=1; z=basein; z1=(1.0+f_epsilon)/base; + + /* Coarse search for the largest power of two */ + if (setjmp(lab)==0) { /* for underflow trap */ /* Yields i, k, y, y1 */ + do { + y=z; y1=z1; + z=Mul(y,y); z1=Mul(z1, y); + a=Mul(z,ONE); + z2=Div(z1,y); + if (z2 != y1) break; + if ((Sum(a,a) == ZERO) || (fabs(z) >= y)) break; + i++; + k+=k; + } while(1); + } else { + Vprintf("%s%s underflow generates a trap%s\n", co, Thing, oc); + } + Unexpected(23); + + if (f_radix != 10) { + iexp=i+1; /* for the sign */ + mx=k+k; + } else { + iexp=2; + iz=f_radix; + while (k >= iz) { iz*=f_radix; iexp++; } + mx=iz+iz-1; + } + + /* Fine tune starting with y and y1 */ + if (setjmp(lab)==0) { /* for underflow trap */ /* Yields k, f_min */ + do { + f_min=y; z1=y1; + y=Div(y,base); y1=Div(y1,base); + a=Mul(y,ONE); + z2=Mul(y1,base); + if (z2 != z1) break; + if ((Sum(a,a) == ZERO) || (fabs(y) >= f_min)) break; + k++; + } while (1); + } + Unexpected(24); + + f_min_exp=(-k)+1; + + if ((mx <= k+k-3) && (f_radix != 10)) { mx+=mx; iexp+=1; } + Vprintf("%sNumber of bits used for exponent = %d%s\n", co, iexp, oc); + Vprintf("%sMinimum normalised exponent = %d%s\n", co, f_min_exp-1, oc); + if (F) + i_define(D_MIN_EXP, thing, Fname, "_MIN_EXP", + (long) f_min_exp, (long) maxint, (long) F_MIN_EXP, ""); + + if (setjmp(lab)==0) { + Vprintf("%sMinimum normalised positive number = %s%s\n", + co, f_rep(digs, (Long_double) f_min), oc); + } else { + eek_a_bug("printf can't print the smallest normalised number"); + printf("\n"); + } + Unexpected(25); + /* Possible loss of precision warnings here from non-stdc compilers */ + if (setjmp(lab) == 0) { + if (F) f_define(D_MIN, thing, + Fname, "_MIN", digs, (Long_double) f_min, MARK); + if (V || F) F_check(digs, (Long_double) f_min); + } else { + eek_a_bug("xxx_MIN caused a trap"); + printf("\n"); + } + + if (setjmp(lab) == 0) { + if (F) Verify(digs, f_min, F_MIN, + f_min == Self(F_MIN), + (Long_double) f_min == (Long_double) F_MIN); + } else { + printf("%s*** Verify failed for above #define!\n %s %s\n\n", + co, "Compiler has an unusable number for value", oc); + bugs++; + } + Unexpected(26); + + a=1.0; f_min_10_exp=0; + while (a > f_min*10.0) { a/=10.0; f_min_10_exp--; } + if (F) i_define(D_MIN_10_EXP, thing, Fname, "_MIN_10_EXP", + (long) f_min_10_exp, (long) maxint, + (long) F_MIN_10_EXP, ""); + + /* Minimum exponent ************************************************/ + if (setjmp(lab)==0) { /* for underflow trap */ /* Yields xminner */ + do { + xminner=y; + y=Div(y,base); + a=Mul(y,ONE); + if ((Sum(a,a) == ZERO) || (fabs(y) >= xminner)) break; + } while (1); + } + Unexpected(27); + + if (xminner != 0.0 && xminner != f_min) { + normal= 0; + Vprintf("%sThe smallest numbers are not kept normalised%s\n", + co, oc); + if (setjmp(lab)==0) { + Vprintf("%sSmallest unnormalised positive number = %s%s\n", + co, f_rep(digs, (Long_double) xminner), oc); + if (V) F_check(digs, (Long_double) xminner); + } else { + eek_a_bug("printf can't print the smallest unnormalised number."); + printf("\n"); + } + Unexpected(28); + } else { + normal= 1; + Vprintf("%sThe smallest numbers are normalised%s\n", co, oc); + } + + /* Maximum exponent ************************************************/ + f_max_exp=2; f_max=1.0; newxmax=base+1.0; + inf=0; trap=0; + while (f_max f_max) inf=1; /* ieee infinity */ + break; + } + f_max_exp++; + } + Unexpected(29); + Vprintf("%sMaximum exponent = %d%s\n", co, f_max_exp, oc); + if (F) i_define(D_MAX_EXP, thing, Fname, "_MAX_EXP", + (long) f_max_exp, 0L, (long) F_MAX_EXP, ""); + + /* Largest number ***************************************************/ + f_max=Diff(ONE, epsneg); + if (Mul(f_max,ONE) != f_max) f_max=Diff(ONE, Mul(base,epsneg)); + for (i=1; i<=f_max_exp; i++) f_max=Mul(f_max, base); + + if (setjmp(lab)==0) { + Vprintf("%sMaximum number = %s%s\n", + co, f_rep(digs, (Long_double) f_max), oc); + } else { + eek_a_bug("printf can't print the largest double."); + printf("\n"); + } + if (setjmp(lab)==0) { + /* Possible loss of precision warnings here from non-stdc compilers */ + if (F) f_define(D_MAX, thing, + Fname, "_MAX", digs, (Long_double) f_max, MARK); + if (V || F) F_check(digs, (Long_double) f_max); + } else { + eek_a_bug("xxx_MAX caused a trap"); + printf("\n"); + } + if (setjmp(lab)==0) { + if (F) Verify(digs, f_max, F_MAX, + f_max == Self(F_MAX), + (Long_double) f_max == (Long_double) F_MAX); + } else { + printf("%s*** Verify failed for above #define!\n %s %s\n\n", + co, "Compiler has an unusable number for value", oc); + bugs++; + } + Unexpected(30); + + a=1.0; f_max_10_exp=0; + while (a < f_max/10.0) { a*=10.0; f_max_10_exp++; } + if (F) i_define(D_MAX_10_EXP, thing, Fname, "_MAX_10_EXP", + (long) f_max_10_exp, 0L, (long) F_MAX_10_EXP, ""); + + /* Traps and infinities ********************************************/ + if (trap) { + Vprintf("%sOverflow generates a trap%s\n", co, oc); + } else { + Vprintf("%sOverflow doesn't seem to generate a trap%s\n", + co, oc); + } + + if (inf) { Vprintf("%sThere is an 'infinite' value%s\n", co, oc); } + +#ifdef SIGFPE + signal(SIGFPE, trap1); +#endif + if (setjmp(lab) == 0) { + trapped= 0; /* A global variable */ + b= 0.0; + a= (1.0/b)/b; + if (!trapped) { + Vprintf("%sDivide by zero doesn't generate a trap%s\n", + co, oc); + } else { + Vprintf("%sDivide by zero generates a trap%s\n", + co, oc); + Vprintf("%sFP signal handlers return safely%s\n", + co, oc); + } + } else { + Vprintf("%sDivide by zero generates a trap%s\n", co, oc); + Vprintf("%sBEWARE! FP signal handlers can NOT return%s\n", + co, oc); + } + setsignals(); + Unexpected(31); + + /* Hidden bit + sanity check ****************************************/ + if (f_radix != 10) { + hidden=0; + mantbits=floor_log(2, (Long_double)f_radix)*f_mant_dig; + if (mantbits+iexp == (int)sizeof(Number)*byte_size) { + hidden=1; + Vprintf("%sArithmetic uses a hidden bit%s\n", co, oc); + } else if (mantbits+iexp+1 == (int)sizeof(Number)*byte_size) { + Vprintf("%sArithmetic doesn't use a hidden bit%s\n", + co, oc); + } else if (mantbits+iexp+1 < (int)sizeof(Number)*byte_size) { + Vprintf("%sOnly %d of the %d bits of a %s %s%s\n", + co, + mantbits+iexp, + (int)sizeof(Number)*byte_size, + thing, + "are actually used", + oc); + } else { + printf("\n%s%s\n %s (%d) %s (%d) %s %s (%d)!%s\n\n", + co, + "*** Something fishy here!", + "Exponent size", + iexp, + "+ significand size", + mantbits, + "doesn't match with the size of a", + thing, + (int)sizeof(Number)*byte_size, + oc); + } + if (hidden && f_radix == 2 && f_max_exp+f_min_exp==3) { + Vprintf("%sIt looks like %s length IEEE format%s\n", + co, f_mant_dig==24 ? "single" : + f_mant_dig==53 ? "double" : + f_mant_dig >53 ? "extended" : + "some", oc); + if (f_rounds != 1 || normal) { + Vprintf("%s though ", co); + if (f_rounds != 1) { + Vprintf("the rounding is unusual"); + if (normal) { Vprintf(" and "); } + } + if (normal) { + Vprintf("the normalisation is unusual"); + } + Vprintf("%s\n", oc); + } + } else { + Vprintf("%sIt doesn't look like IEEE format%s\n", + co, oc); + } + } + printf("\n"); /* regardless of verbosity */ + return f_mant_dig; +} + +Void EPROP(int fprec, int dprec, int lprec) +{ + /* See if expressions are evaluated in extended precision. + Some compilers optimise even if you don't want it, + and then this function fails to produce the right result. + We try to diagnose this if it happens. + */ + Volatile int eprec; + Volatile double a, b, base, old; + Volatile Number d, oldd, dbase, one, zero; + Volatile int bad=0; + + /* Size of significand **************************************/ + a=1.0; + if (setjmp(lab) == 0) { /* Yields nothing */ + do { old=a; a=a+a; } + while ((((a+1.0)-a)-1.0) == 0.0 && a>old); + } else bad=1; + if (!bad && a <= old) bad=1; + + if (!bad) { + b=1.0; + if (setjmp(lab) == 0) { /* Yields nothing */ + do { old=b; b=b+b; } + while ((base=((a+b)-a)) == 0.0 && b>old); + if (b <= old) bad=1; + } else bad=1; + } + + if (!bad) { + eprec=0; d=1.0; dbase=base; one=1.0; zero=0.0; + if (setjmp(lab) == 0) { /* Yields nothing */ + do { eprec++; oldd=d; d=d*dbase; } + while ((((d+one)-d)-one) == zero && d>oldd); + if (d <= oldd) bad=1; + } else bad=1; + } + + Unexpected(32); + + if (bad) { + Vprintf("%sCan't determine precision for %s expressions:\n%s%s\n", + co, thing, " check that you compiled without optimisation!", + oc); + } else if (eprec==dprec) { + Vprintf("%s%s expressions are evaluated in double precision%s\n", + co, Thing, oc); + } else if (eprec==fprec) { + Vprintf("%s%s expressions are evaluated in float precision%s\n", + co, Thing, oc); + } else if (eprec==lprec) { + Vprintf("%s%s expressions are evaluated in long double precision%s\n", + co, Thing, oc); + } else { + Vprintf("%s%s expressions are evaluated in a %s %s %d %s%s\n", + co, Thing, eprec>dprec ? "higher" : "lower", + "precision than double,\n using", + eprec, "base digits", + oc); + } +} + +#else /* not Number */ + +#ifdef FPROP /* Then create dummy routines for long double */ +/* ARGSUSED */ +int FPROP(int byte_size) { return 0; } +#endif +#ifdef EPROP +/* ARGSUSED */ +Void EPROP(int fprec, int dprec, int lprec) {} +#endif + +#endif /* ifdef Number */ + +/* Increment the pass number */ +#undef PASS + +#ifdef PASS2 +#undef PASS2 +#define PASS 3 +#define PASS3 1 +#endif + +#ifdef PASS1 +#undef PASS1 +#define PASS 2 +#define PASS2 1 +#endif + +#ifdef PASS0 +#undef PASS0 +#endif + +#ifndef SEP +#ifdef PASS /* then rescan this file */ +#ifdef BAD_CPP +#include "enquire.c" +#else +#include FILENAME /* if this line fails to compile, define BAD_CPP */ +#endif +#endif /* PASS */ +#endif /* SEP */ diff --git a/AppPkg/Applications/Enquire/Enquire.inf b/AppPkg/Applications/Enquire/Enquire.inf new file mode 100644 index 0000000000..b0a0a29320 --- /dev/null +++ b/AppPkg/Applications/Enquire/Enquire.inf @@ -0,0 +1,53 @@ +## @file +# Enquire application for system integer and floating point characteristics +# enquiry. +# +# Due to the level of hardware introspection, this application MUST be built +# with optimizations disabled. +# +# COPYRIGHT(c) 1993-9 Steven Pemberton, CWI. All rights reserved. +# NOTE: Improvements gratefully received. Please mention the version. +# "http://www.cwi.nl/~steven/enquire.html" +# +# Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license. +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = Enquire + FILE_GUID = 42f58b27-5dc3-4fa7-844d-5a7dbff06432 + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 0.1 + ENTRY_POINT = ShellCEntryLib + +# +# VALID_ARCHITECTURES = IA32 X64 IPF +# + +[Sources] + Enquire.c + +[Packages] + StdLib/StdLib.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + UefiLib + LibC + LibString + LibStdio + LibGdtoa + LibWchar + +[BuildOptions] + INTEL:*_*_*_CC_FLAGS = /Qdiag-disable:181,186 + MSFT:*_*_*_CC_FLAGS = /Od + GCC:*_*_*_CC_FLAGS = -O0 -Wno-unused-variable diff --git a/AppPkg/Applications/Hello/Hello.c b/AppPkg/Applications/Hello/Hello.c new file mode 100644 index 0000000000..a16b27633d --- /dev/null +++ b/AppPkg/Applications/Hello/Hello.c @@ -0,0 +1,37 @@ +/** @file + A simple, basic, EDK II native, "hello" application to verify that + we can build applications without LibC. + + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include +#include +#include + +/*** + Print a welcoming message. + + Establishes the main structure of the application. + + @retval 0 The application exited normally. + @retval Other An error occurred. +***/ +INTN +EFIAPI +ShellAppMain ( + IN UINTN Argc, + IN CHAR16 **Argv + ) +{ + Print(L"Hello there fellow Programmer.\n"); + Print(L"Welcome to the world of EDK II.\n"); + + return(0); +} diff --git a/AppPkg/Applications/Hello/Hello.inf b/AppPkg/Applications/Hello/Hello.inf new file mode 100644 index 0000000000..739478b443 --- /dev/null +++ b/AppPkg/Applications/Hello/Hello.inf @@ -0,0 +1,36 @@ +## @file +# A simple, basic, EDK II native, "hello" application. +# +# Copyright (c) 2010, Intel Corporation. All rights reserved.
+# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license. +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = Hello + FILE_GUID = a912f198-7f0e-4803-b908-b757b806ec83 + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 0.1 + ENTRY_POINT = ShellCEntryLib + +# +# VALID_ARCHITECTURES = IA32 X64 IPF +# + +[Sources] + Hello.c + +[Packages] + MdePkg/MdePkg.dec + ShellPkg/ShellPkg.dec + +[LibraryClasses] + UefiLib + ShellCEntryLib diff --git a/AppPkg/Applications/Main/Main.c b/AppPkg/Applications/Main/Main.c new file mode 100644 index 0000000000..c2762d57d6 --- /dev/null +++ b/AppPkg/Applications/Main/Main.c @@ -0,0 +1,46 @@ +/** @file + A simple, basic, application showing how the Hello application could be + built using the "Standard C Libraries" from StdLib. + + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +//#include +//#include +//#include + +#include + +/*** + Demonstrates basic workings of the main() function by displaying a + welcoming message. + + Note that the UEFI command line is composed of 16-bit UCS2 wide characters. + The easiest way to access the command line parameters is to cast Argv as: + wchar_t **wArgv = (wchar_t **)Argv; + + @param[in] Argc Number of argument tokens pointed to by Argv. + @param[in] Argv Array of Argc pointers to command line tokens. + + @retval 0 The application exited normally. + @retval Other An error occurred. +***/ +int +EFIAPI +main ( + IN int Argc, + IN char **Argv + ) +{ + + puts("Hello there fellow Programmer."); + puts("Welcome to the world of EDK II."); + + return 0; +} diff --git a/AppPkg/Applications/Main/Main.inf b/AppPkg/Applications/Main/Main.inf new file mode 100644 index 0000000000..750cf55d55 --- /dev/null +++ b/AppPkg/Applications/Main/Main.inf @@ -0,0 +1,42 @@ +## @file +# A simple, basic, application showing how the Hello application could be +# built using the "Standard C Libraries" from StdLib. +# +# Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license. +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = Main + FILE_GUID = 4ea97c46-7491-4dfd-b442-747010f3ce5f + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 0.1 + ENTRY_POINT = ShellCEntryLib + +# +# VALID_ARCHITECTURES = IA32 X64 IPF +# + +[Sources] + Main.c + +[Packages] + StdLib/StdLib.dec + MdePkg/MdePkg.dec + ShellPkg/ShellPkg.dec + +[LibraryClasses] + LibC + LibStdio +# UefiLib +# ShellCEntryLib + +[BuildOptions] + MSFT:*_*_IA32_CC_FLAGS = /Oi- diff --git a/AppPkg/ReadMe.pdf b/AppPkg/ReadMe.pdf new file mode 100644 index 0000000000..2baca31f68 Binary files /dev/null and b/AppPkg/ReadMe.pdf differ diff --git a/StdLib/Include/Arm/machine/_math.h b/StdLib/Include/Arm/machine/_math.h new file mode 100644 index 0000000000..67cf98c30d --- /dev/null +++ b/StdLib/Include/Arm/machine/_math.h @@ -0,0 +1,18 @@ +/** + +Copyright (c) 2010, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. +The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php. + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _MACHINE_MATH_H +#define _MACHINE_MATH_H + +//#define __HUGE_VAL ???????????.????????????? + +#endif /* _MACHINE_MATH_H */ diff --git a/StdLib/Include/Arm/machine/ansi.h b/StdLib/Include/Arm/machine/ansi.h new file mode 100644 index 0000000000..e06f111355 --- /dev/null +++ b/StdLib/Include/Arm/machine/ansi.h @@ -0,0 +1,106 @@ +/* $NetBSD: ansi.h,v 1.7 2006/10/04 13:51:59 tnozaki Exp $ */ + +/* + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)ansi.h 8.2 (Berkeley) 1/4/94 + */ + +#ifndef _ANSI_H_ +#define _ANSI_H_ + +#include + +#include + +/* + * Types which are fundamental to the implementation and may appear in + * more than one standard header are defined here. Standard headers + * then use: + * #ifdef _BSD_SIZE_T_ + * typedef _BSD_SIZE_T_ size_t; + * #undef _BSD_SIZE_T_ + * #endif + */ +#ifdef __ELF__ +#define _BSD_CLOCK_T_ unsigned int /* clock() */ +#define _BSD_PTRDIFF_T_ long int /* ptr1 - ptr2 */ +#define _BSD_SIZE_T_ unsigned long int /* sizeof() */ +#define _BSD_SSIZE_T_ long int /* byte count or error */ +#define _BSD_TIME_T_ int /* time() */ +#else +#define _BSD_CLOCK_T_ unsigned long /* clock() */ +#define _BSD_PTRDIFF_T_ int /* ptr1 - ptr2 */ +#define _BSD_SIZE_T_ unsigned int /* sizeof() */ +#define _BSD_SSIZE_T_ int /* byte count or error */ +#define _BSD_TIME_T_ long /* time() */ +#endif +#if __GNUC_PREREQ__(2, 96) +#define _BSD_VA_LIST_ __builtin_va_list /* GCC built-in type */ +#else +#define _BSD_VA_LIST_ char * /* va_list */ +#endif +#define _BSD_CLOCKID_T_ int /* clockid_t */ +#define _BSD_TIMER_T_ int /* timer_t */ +#define _BSD_SUSECONDS_T_ int /* suseconds_t */ +#define _BSD_USECONDS_T_ unsigned int /* useconds_t */ + +/* + * NOTE: rune_t is not covered by ANSI nor other standards, and should not + * be instantiated outside of lib/libc/locale. use wchar_t. + * + * Runes (wchar_t) is declared to be an ``int'' instead of the more natural + * ``unsigned long'' or ``long''. Two things are happening here. It is not + * unsigned so that EOF (-1) can be naturally assigned to it and used. Also, + * it looks like 10646 will be a 31 bit standard. This means that if your + * ints cannot hold 32 bits, you will be in trouble. The reason an int was + * chosen over a long is that the is*() and to*() routines take ints (says + * ANSI C), but they use _RUNE_T_ instead of int. By changing it here, you + * lose a bit of ANSI conformance, but your programs will still work. + * + * Note that _WCHAR_T_ and _RUNE_T_ must be of the same type. When wchar_t + * and rune_t are typedef'd, _WCHAR_T_ will be undef'd, but _RUNE_T remains + * defined for ctype.h. + */ +#define _BSD_WCHAR_T_ int /* wchar_t */ +#define _BSD_WINT_T_ int /* wint_t */ +#define _BSD_RUNE_T_ int /* rune_t */ +#define _BSD_WCTRANS_T_ void * /* wctrans_t */ +#define _BSD_WCTYPE_T_ void * /* wctype_t */ + +/* + * mbstate_t is an opaque object to keep conversion state, during multibyte + * stream conversions. The content must not be referenced by user programs. + */ +typedef union { + __int64_t __mbstateL; /* for alignment */ + char __mbstate8[128]; +} __mbstate_t; +#define _BSD_MBSTATE_T_ __mbstate_t /* mbstate_t */ + +#endif /* _ANSI_H_ */ diff --git a/StdLib/Include/Arm/machine/asm.h b/StdLib/Include/Arm/machine/asm.h new file mode 100644 index 0000000000..b15698eb9f --- /dev/null +++ b/StdLib/Include/Arm/machine/asm.h @@ -0,0 +1,167 @@ +/* $NetBSD: asm.h,v 1.8 2006/01/20 22:02:40 christos Exp $ */ + +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)asm.h 5.5 (Berkeley) 5/7/91 + */ + +#ifndef _ARM32_ASM_H_ +#define _ARM32_ASM_H_ + +#ifdef __ELF__ +# define _C_LABEL(x) x +#else +# ifdef __STDC__ +# define _C_LABEL(x) _ ## x +# else +# define _C_LABEL(x) _/**/x +# endif +#endif +#define _ASM_LABEL(x) x + +#ifdef __STDC__ +# define __CONCAT(x,y) x ## y +# define __STRING(x) #x +#else +# define __CONCAT(x,y) x/**/y +# define __STRING(x) "x" +#endif + +#ifndef _ALIGN_TEXT +# define _ALIGN_TEXT .align 0 +#endif + +/* + * gas/arm uses @ as a single comment character and thus cannot be used here + * Instead it recognised the # instead of an @ symbols in .type directives + * We define a couple of macros so that assembly code will not be dependant + * on one or the other. + */ +#define _ASM_TYPE_FUNCTION #function +#define _ASM_TYPE_OBJECT #object +#define _ENTRY(x) \ + .text; _ALIGN_TEXT; .globl x; .type x,_ASM_TYPE_FUNCTION; x: + +#ifdef GPROF +# ifdef __ELF__ +# define _PROF_PROLOGUE \ + mov ip, lr; bl __mcount +# else +# define _PROF_PROLOGUE \ + mov ip,lr; bl mcount +# endif +#else +# define _PROF_PROLOGUE +#endif + +#define ENTRY(y) _ENTRY(_C_LABEL(y)); _PROF_PROLOGUE +#define ENTRY_NP(y) _ENTRY(_C_LABEL(y)) +#define ASENTRY(y) _ENTRY(_ASM_LABEL(y)); _PROF_PROLOGUE +#define ASENTRY_NP(y) _ENTRY(_ASM_LABEL(y)) + +#define ASMSTR .asciz + +#if defined(__ELF__) && defined(PIC) +#ifdef __STDC__ +#define PIC_SYM(x,y) x ## ( ## y ## ) +#else +#define PIC_SYM(x,y) x/**/(/**/y/**/) +#endif +#else +#define PIC_SYM(x,y) x +#endif + +#ifdef __ELF__ +#define RCSID(x) .section ".ident"; .asciz x +#else +#define RCSID(x) .text; .asciz x +#endif + +#ifdef __ELF__ +#define WEAK_ALIAS(alias,sym) \ + .weak alias; \ + alias = sym +#endif + +/* + * STRONG_ALIAS: create a strong alias. + */ +#define STRONG_ALIAS(alias,sym) \ + .globl alias; \ + alias = sym + +#ifdef __STDC__ +#define WARN_REFERENCES(sym,msg) \ + .stabs msg ## ,30,0,0,0 ; \ + .stabs __STRING(_C_LABEL(sym)) ## ,1,0,0,0 +#elif defined(__ELF__) +#define WARN_REFERENCES(sym,msg) \ + .stabs msg,30,0,0,0 ; \ + .stabs __STRING(sym),1,0,0,0 +#else +#define WARN_REFERENCES(sym,msg) \ + .stabs msg,30,0,0,0 ; \ + .stabs __STRING(_/**/sym),1,0,0,0 +#endif /* __STDC__ */ + +#if defined (__ARM_ARCH_6__) || defined (__ARM_ARCH_6J__) +#define _ARM_ARCH_6 +#endif + +#if defined (_ARM_ARCH_6) || defined (__ARM_ARCH_5__) || \ + defined (__ARM_ARCH_5T__) || defined (__ARM_ARCH_5TE__) || \ + defined (__ARM_ARCH_5TEJ__) +#define _ARM_ARCH_5 +#endif + +#if defined (_ARM_ARCH_5) || defined (__ARM_ARCH_4T__) +#define _ARM_ARCH_4T +#endif + + +#if defined (_ARM_ARCH_4T) +# define RET bx lr +# ifdef __STDC__ +# define RETc(c) bx##c lr +# else +# define RETc(c) bx/**/c lr +# endif +#else +# define RET mov pc, lr +# ifdef __STDC__ +# define RETc(c) mov##c pc, lr +# else +# define RETc(c) mov/**/c pc, lr +# endif +#endif + +#endif /* !_ARM_ASM_H_ */ diff --git a/StdLib/Include/Arm/machine/atomic.h b/StdLib/Include/Arm/machine/atomic.h new file mode 100644 index 0000000000..ffd83c7375 --- /dev/null +++ b/StdLib/Include/Arm/machine/atomic.h @@ -0,0 +1,102 @@ +/* $NetBSD: atomic.h,v 1.5 2005/12/28 19:09:29 perry Exp $ */ + +/* + * Copyright (C) 1994-1997 Mark Brinicombe + * Copyright (C) 1994 Brini + * All rights reserved. + * + * This code is derived from software written for Brini by Mark Brinicombe + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Brini. + * 4. The name of Brini may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL BRINI BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _ARM_ATOMIC_H_ +#define _ARM_ATOMIC_H_ + +#ifndef ATOMIC_SET_BIT_NONINLINE_REQUIRED + +#if defined(__PROG26) || defined(ATOMIC_SET_BIT_NOINLINE) +#define ATOMIC_SET_BIT_NONINLINE_REQUIRED +#endif + +#endif /* ATOMIC_SET_BIT_NONINLINE_REQUIRED */ + + +#ifndef _LOCORE + +#include +#include /* I32_bit */ + +#ifdef ATOMIC_SET_BIT_NONINLINE_REQUIRED +void atomic_set_bit( u_int *, u_int ); +void atomic_clear_bit( u_int *, u_int ); +#endif + +#ifdef __PROG32 +#define __with_interrupts_disabled(expr) \ + do { \ + u_int cpsr_save, tmp; \ + \ + __asm volatile( \ + "mrs %0, cpsr;" \ + "orr %1, %0, %2;" \ + "msr cpsr_all, %1;" \ + : "=r" (cpsr_save), "=r" (tmp) \ + : "I" (I32_bit) \ + : "cc" ); \ + (expr); \ + __asm volatile( \ + "msr cpsr_all, %0" \ + : /* no output */ \ + : "r" (cpsr_save) \ + : "cc" ); \ + } while(0) + +static __inline void +inline_atomic_set_bit( u_int *address, u_int setmask ) +{ + __with_interrupts_disabled( *address |= setmask ); +} + +static __inline void +inline_atomic_clear_bit( u_int *address, u_int clearmask ) +{ + __with_interrupts_disabled( *address &= ~clearmask ); +} + +#if !defined(ATOMIC_SET_BIT_NOINLINE) + +#define atomic_set_bit(a,m) inline_atomic_set_bit(a,m) +#define atomic_clear_bit(a,m) inline_atomic_clear_bit(a,m) + +#endif + +#endif /* __PROG32 */ + +#undef __with_interrupts_disabled + +#endif /* _LOCORE */ +#endif /* _ARM_ATOMIC_H_ */ diff --git a/StdLib/Include/Arm/machine/cpufunc.h b/StdLib/Include/Arm/machine/cpufunc.h new file mode 100644 index 0000000000..c94a30a9e7 --- /dev/null +++ b/StdLib/Include/Arm/machine/cpufunc.h @@ -0,0 +1,558 @@ +/* $NetBSD: cpufunc.h,v 1.37.24.1 2007/02/21 18:36:02 snj Exp $ */ + +/* + * Copyright (c) 1997 Mark Brinicombe. + * Copyright (c) 1997 Causality Limited + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Causality Limited. + * 4. The name of Causality Limited may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY CAUSALITY LIMITED ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL CAUSALITY LIMITED BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * RiscBSD kernel project + * + * cpufunc.h + * + * Prototypes for cpu, mmu and tlb related functions. + */ + +#ifndef _ARM32_CPUFUNC_H_ +#define _ARM32_CPUFUNC_H_ + +#ifdef _KERNEL + +#include +#include + +struct cpu_functions { + + /* CPU functions */ + + u_int (*cf_id) __P((void)); + void (*cf_cpwait) __P((void)); + + /* MMU functions */ + + u_int (*cf_control) __P((u_int, u_int)); + void (*cf_domains) __P((u_int)); + void (*cf_setttb) __P((u_int)); + u_int (*cf_faultstatus) __P((void)); + u_int (*cf_faultaddress) __P((void)); + + /* TLB functions */ + + void (*cf_tlb_flushID) __P((void)); + void (*cf_tlb_flushID_SE) __P((u_int)); + void (*cf_tlb_flushI) __P((void)); + void (*cf_tlb_flushI_SE) __P((u_int)); + void (*cf_tlb_flushD) __P((void)); + void (*cf_tlb_flushD_SE) __P((u_int)); + + /* + * Cache operations: + * + * We define the following primitives: + * + * icache_sync_all Synchronize I-cache + * icache_sync_range Synchronize I-cache range + * + * dcache_wbinv_all Write-back and Invalidate D-cache + * dcache_wbinv_range Write-back and Invalidate D-cache range + * dcache_inv_range Invalidate D-cache range + * dcache_wb_range Write-back D-cache range + * + * idcache_wbinv_all Write-back and Invalidate D-cache, + * Invalidate I-cache + * idcache_wbinv_range Write-back and Invalidate D-cache, + * Invalidate I-cache range + * + * Note that the ARM term for "write-back" is "clean". We use + * the term "write-back" since it's a more common way to describe + * the operation. + * + * There are some rules that must be followed: + * + * I-cache Synch (all or range): + * The goal is to synchronize the instruction stream, + * so you may beed to write-back dirty D-cache blocks + * first. If a range is requested, and you can't + * synchronize just a range, you have to hit the whole + * thing. + * + * D-cache Write-Back and Invalidate range: + * If you can't WB-Inv a range, you must WB-Inv the + * entire D-cache. + * + * D-cache Invalidate: + * If you can't Inv the D-cache, you must Write-Back + * and Invalidate. Code that uses this operation + * MUST NOT assume that the D-cache will not be written + * back to memory. + * + * D-cache Write-Back: + * If you can't Write-back without doing an Inv, + * that's fine. Then treat this as a WB-Inv. + * Skipping the invalidate is merely an optimization. + * + * All operations: + * Valid virtual addresses must be passed to each + * cache operation. + */ + void (*cf_icache_sync_all) __P((void)); + void (*cf_icache_sync_range) __P((vaddr_t, vsize_t)); + + void (*cf_dcache_wbinv_all) __P((void)); + void (*cf_dcache_wbinv_range) __P((vaddr_t, vsize_t)); + void (*cf_dcache_inv_range) __P((vaddr_t, vsize_t)); + void (*cf_dcache_wb_range) __P((vaddr_t, vsize_t)); + + void (*cf_idcache_wbinv_all) __P((void)); + void (*cf_idcache_wbinv_range) __P((vaddr_t, vsize_t)); + + /* Other functions */ + + void (*cf_flush_prefetchbuf) __P((void)); + void (*cf_drain_writebuf) __P((void)); + void (*cf_flush_brnchtgt_C) __P((void)); + void (*cf_flush_brnchtgt_E) __P((u_int)); + + void (*cf_sleep) __P((int mode)); + + /* Soft functions */ + + int (*cf_dataabt_fixup) __P((void *)); + int (*cf_prefetchabt_fixup) __P((void *)); + + void (*cf_context_switch) __P((void)); + + void (*cf_setup) __P((char *)); +}; + +extern struct cpu_functions cpufuncs; +extern u_int cputype; + +#define cpu_id() cpufuncs.cf_id() +#define cpu_cpwait() cpufuncs.cf_cpwait() + +#define cpu_control(c, e) cpufuncs.cf_control(c, e) +#define cpu_domains(d) cpufuncs.cf_domains(d) +#define cpu_setttb(t) cpufuncs.cf_setttb(t) +#define cpu_faultstatus() cpufuncs.cf_faultstatus() +#define cpu_faultaddress() cpufuncs.cf_faultaddress() + +#define cpu_tlb_flushID() cpufuncs.cf_tlb_flushID() +#define cpu_tlb_flushID_SE(e) cpufuncs.cf_tlb_flushID_SE(e) +#define cpu_tlb_flushI() cpufuncs.cf_tlb_flushI() +#define cpu_tlb_flushI_SE(e) cpufuncs.cf_tlb_flushI_SE(e) +#define cpu_tlb_flushD() cpufuncs.cf_tlb_flushD() +#define cpu_tlb_flushD_SE(e) cpufuncs.cf_tlb_flushD_SE(e) + +#define cpu_icache_sync_all() cpufuncs.cf_icache_sync_all() +#define cpu_icache_sync_range(a, s) cpufuncs.cf_icache_sync_range((a), (s)) + +#define cpu_dcache_wbinv_all() cpufuncs.cf_dcache_wbinv_all() +#define cpu_dcache_wbinv_range(a, s) cpufuncs.cf_dcache_wbinv_range((a), (s)) +#define cpu_dcache_inv_range(a, s) cpufuncs.cf_dcache_inv_range((a), (s)) +#define cpu_dcache_wb_range(a, s) cpufuncs.cf_dcache_wb_range((a), (s)) + +#define cpu_idcache_wbinv_all() cpufuncs.cf_idcache_wbinv_all() +#define cpu_idcache_wbinv_range(a, s) cpufuncs.cf_idcache_wbinv_range((a), (s)) + +#define cpu_flush_prefetchbuf() cpufuncs.cf_flush_prefetchbuf() +#define cpu_drain_writebuf() cpufuncs.cf_drain_writebuf() +#define cpu_flush_brnchtgt_C() cpufuncs.cf_flush_brnchtgt_C() +#define cpu_flush_brnchtgt_E(e) cpufuncs.cf_flush_brnchtgt_E(e) + +#define cpu_sleep(m) cpufuncs.cf_sleep(m) + +#define cpu_dataabt_fixup(a) cpufuncs.cf_dataabt_fixup(a) +#define cpu_prefetchabt_fixup(a) cpufuncs.cf_prefetchabt_fixup(a) +#define ABORT_FIXUP_OK 0 /* fixup succeeded */ +#define ABORT_FIXUP_FAILED 1 /* fixup failed */ +#define ABORT_FIXUP_RETURN 2 /* abort handler should return */ + +#define cpu_setup(a) cpufuncs.cf_setup(a) + +int set_cpufuncs __P((void)); +#define ARCHITECTURE_NOT_PRESENT 1 /* known but not configured */ +#define ARCHITECTURE_NOT_SUPPORTED 2 /* not known */ + +void cpufunc_nullop __P((void)); +int cpufunc_null_fixup __P((void *)); +int early_abort_fixup __P((void *)); +int late_abort_fixup __P((void *)); +u_int cpufunc_id __P((void)); +u_int cpufunc_control __P((u_int, u_int)); +void cpufunc_domains __P((u_int)); +u_int cpufunc_faultstatus __P((void)); +u_int cpufunc_faultaddress __P((void)); + +#ifdef CPU_ARM3 +u_int arm3_control __P((u_int, u_int)); +void arm3_cache_flush __P((void)); +#endif /* CPU_ARM3 */ + +#if defined(CPU_ARM6) || defined(CPU_ARM7) +void arm67_setttb __P((u_int)); +void arm67_tlb_flush __P((void)); +void arm67_tlb_purge __P((u_int)); +void arm67_cache_flush __P((void)); +void arm67_context_switch __P((void)); +#endif /* CPU_ARM6 || CPU_ARM7 */ + +#ifdef CPU_ARM6 +void arm6_setup __P((char *)); +#endif /* CPU_ARM6 */ + +#ifdef CPU_ARM7 +void arm7_setup __P((char *)); +#endif /* CPU_ARM7 */ + +#ifdef CPU_ARM7TDMI +int arm7_dataabt_fixup __P((void *)); +void arm7tdmi_setup __P((char *)); +void arm7tdmi_setttb __P((u_int)); +void arm7tdmi_tlb_flushID __P((void)); +void arm7tdmi_tlb_flushID_SE __P((u_int)); +void arm7tdmi_cache_flushID __P((void)); +void arm7tdmi_context_switch __P((void)); +#endif /* CPU_ARM7TDMI */ + +#ifdef CPU_ARM8 +void arm8_setttb __P((u_int)); +void arm8_tlb_flushID __P((void)); +void arm8_tlb_flushID_SE __P((u_int)); +void arm8_cache_flushID __P((void)); +void arm8_cache_flushID_E __P((u_int)); +void arm8_cache_cleanID __P((void)); +void arm8_cache_cleanID_E __P((u_int)); +void arm8_cache_purgeID __P((void)); +void arm8_cache_purgeID_E __P((u_int entry)); + +void arm8_cache_syncI __P((void)); +void arm8_cache_cleanID_rng __P((vaddr_t, vsize_t)); +void arm8_cache_cleanD_rng __P((vaddr_t, vsize_t)); +void arm8_cache_purgeID_rng __P((vaddr_t, vsize_t)); +void arm8_cache_purgeD_rng __P((vaddr_t, vsize_t)); +void arm8_cache_syncI_rng __P((vaddr_t, vsize_t)); + +void arm8_context_switch __P((void)); + +void arm8_setup __P((char *)); + +u_int arm8_clock_config __P((u_int, u_int)); +#endif + +#ifdef CPU_SA110 +void sa110_setup __P((char *)); +void sa110_context_switch __P((void)); +#endif /* CPU_SA110 */ + +#if defined(CPU_SA1100) || defined(CPU_SA1110) +void sa11x0_drain_readbuf __P((void)); + +void sa11x0_context_switch __P((void)); +void sa11x0_cpu_sleep __P((int)); + +void sa11x0_setup __P((char *)); +#endif + +#if defined(CPU_SA110) || defined(CPU_SA1100) || defined(CPU_SA1110) +void sa1_setttb __P((u_int)); + +void sa1_tlb_flushID_SE __P((u_int)); + +void sa1_cache_flushID __P((void)); +void sa1_cache_flushI __P((void)); +void sa1_cache_flushD __P((void)); +void sa1_cache_flushD_SE __P((u_int)); + +void sa1_cache_cleanID __P((void)); +void sa1_cache_cleanD __P((void)); +void sa1_cache_cleanD_E __P((u_int)); + +void sa1_cache_purgeID __P((void)); +void sa1_cache_purgeID_E __P((u_int)); +void sa1_cache_purgeD __P((void)); +void sa1_cache_purgeD_E __P((u_int)); + +void sa1_cache_syncI __P((void)); +void sa1_cache_cleanID_rng __P((vaddr_t, vsize_t)); +void sa1_cache_cleanD_rng __P((vaddr_t, vsize_t)); +void sa1_cache_purgeID_rng __P((vaddr_t, vsize_t)); +void sa1_cache_purgeD_rng __P((vaddr_t, vsize_t)); +void sa1_cache_syncI_rng __P((vaddr_t, vsize_t)); + +#endif + +#ifdef CPU_ARM9 +void arm9_setttb __P((u_int)); + +void arm9_tlb_flushID_SE __P((u_int)); + +void arm9_icache_sync_all __P((void)); +void arm9_icache_sync_range __P((vaddr_t, vsize_t)); + +void arm9_dcache_wbinv_all __P((void)); +void arm9_dcache_wbinv_range __P((vaddr_t, vsize_t)); +void arm9_dcache_inv_range __P((vaddr_t, vsize_t)); +void arm9_dcache_wb_range __P((vaddr_t, vsize_t)); + +void arm9_idcache_wbinv_all __P((void)); +void arm9_idcache_wbinv_range __P((vaddr_t, vsize_t)); + +void arm9_context_switch __P((void)); + +void arm9_setup __P((char *)); + +extern unsigned arm9_dcache_sets_max; +extern unsigned arm9_dcache_sets_inc; +extern unsigned arm9_dcache_index_max; +extern unsigned arm9_dcache_index_inc; +#endif + +#if defined(CPU_ARM9E) || defined(CPU_ARM10) +void arm10_tlb_flushID_SE __P((u_int)); +void arm10_tlb_flushI_SE __P((u_int)); + +void arm10_context_switch __P((void)); + +void arm10_setup __P((char *)); +#endif + +#ifdef CPU_ARM11 +void arm11_setttb __P((u_int)); + +void arm11_tlb_flushID_SE __P((u_int)); +void arm11_tlb_flushI_SE __P((u_int)); + +void arm11_context_switch __P((void)); + +void arm11_setup __P((char *string)); +void arm11_tlb_flushID __P((void)); +void arm11_tlb_flushI __P((void)); +void arm11_tlb_flushD __P((void)); +void arm11_tlb_flushD_SE __P((u_int va)); + +void arm11_drain_writebuf __P((void)); +#endif + +#if defined(CPU_ARM9E) || defined (CPU_ARM10) +void armv5_ec_setttb __P((u_int)); + +void armv5_ec_icache_sync_all __P((void)); +void armv5_ec_icache_sync_range __P((vaddr_t, vsize_t)); + +void armv5_ec_dcache_wbinv_all __P((void)); +void armv5_ec_dcache_wbinv_range __P((vaddr_t, vsize_t)); +void armv5_ec_dcache_inv_range __P((vaddr_t, vsize_t)); +void armv5_ec_dcache_wb_range __P((vaddr_t, vsize_t)); + +void armv5_ec_idcache_wbinv_all __P((void)); +void armv5_ec_idcache_wbinv_range __P((vaddr_t, vsize_t)); +#endif + +#if defined (CPU_ARM10) || defined (CPU_ARM11) +void armv5_setttb __P((u_int)); + +void armv5_icache_sync_all __P((void)); +void armv5_icache_sync_range __P((vaddr_t, vsize_t)); + +void armv5_dcache_wbinv_all __P((void)); +void armv5_dcache_wbinv_range __P((vaddr_t, vsize_t)); +void armv5_dcache_inv_range __P((vaddr_t, vsize_t)); +void armv5_dcache_wb_range __P((vaddr_t, vsize_t)); + +void armv5_idcache_wbinv_all __P((void)); +void armv5_idcache_wbinv_range __P((vaddr_t, vsize_t)); + +extern unsigned armv5_dcache_sets_max; +extern unsigned armv5_dcache_sets_inc; +extern unsigned armv5_dcache_index_max; +extern unsigned armv5_dcache_index_inc; +#endif + +#if defined(CPU_ARM9) || defined(CPU_ARM9E) || defined(CPU_ARM10) || \ + defined(CPU_SA110) || defined(CPU_SA1100) || defined(CPU_SA1110) || \ + defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \ + defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) + +void armv4_tlb_flushID __P((void)); +void armv4_tlb_flushI __P((void)); +void armv4_tlb_flushD __P((void)); +void armv4_tlb_flushD_SE __P((u_int)); + +void armv4_drain_writebuf __P((void)); +#endif + +#if defined(CPU_IXP12X0) +void ixp12x0_drain_readbuf __P((void)); +void ixp12x0_context_switch __P((void)); +void ixp12x0_setup __P((char *)); +#endif + +#if defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \ + defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) +void xscale_cpwait __P((void)); + +void xscale_cpu_sleep __P((int)); + +u_int xscale_control __P((u_int, u_int)); + +void xscale_setttb __P((u_int)); + +void xscale_tlb_flushID_SE __P((u_int)); + +void xscale_cache_flushID __P((void)); +void xscale_cache_flushI __P((void)); +void xscale_cache_flushD __P((void)); +void xscale_cache_flushD_SE __P((u_int)); + +void xscale_cache_cleanID __P((void)); +void xscale_cache_cleanD __P((void)); +void xscale_cache_cleanD_E __P((u_int)); + +void xscale_cache_clean_minidata __P((void)); + +void xscale_cache_purgeID __P((void)); +void xscale_cache_purgeID_E __P((u_int)); +void xscale_cache_purgeD __P((void)); +void xscale_cache_purgeD_E __P((u_int)); + +void xscale_cache_syncI __P((void)); +void xscale_cache_cleanID_rng __P((vaddr_t, vsize_t)); +void xscale_cache_cleanD_rng __P((vaddr_t, vsize_t)); +void xscale_cache_purgeID_rng __P((vaddr_t, vsize_t)); +void xscale_cache_purgeD_rng __P((vaddr_t, vsize_t)); +void xscale_cache_syncI_rng __P((vaddr_t, vsize_t)); +void xscale_cache_flushD_rng __P((vaddr_t, vsize_t)); + +void xscale_context_switch __P((void)); + +void xscale_setup __P((char *)); +#endif /* CPU_XSCALE_80200 || CPU_XSCALE_80321 || __CPU_XSCALE_PXA2XX || CPU_XSCALE_IXP425 */ + +#define tlb_flush cpu_tlb_flushID +#define setttb cpu_setttb +#define drain_writebuf cpu_drain_writebuf + +/* + * Macros for manipulating CPU interrupts + */ +#ifdef __PROG32 +static __inline u_int32_t __set_cpsr_c(u_int bic, u_int eor) __attribute__((__unused__)); + +static __inline u_int32_t +__set_cpsr_c(u_int bic, u_int eor) +{ + u_int32_t tmp, ret; + + __asm volatile( + "mrs %0, cpsr\n" /* Get the CPSR */ + "bic %1, %0, %2\n" /* Clear bits */ + "eor %1, %1, %3\n" /* XOR bits */ + "msr cpsr_c, %1\n" /* Set the control field of CPSR */ + : "=&r" (ret), "=&r" (tmp) + : "r" (bic), "r" (eor) : "memory"); + + return ret; +} + +#define disable_interrupts(mask) \ + (__set_cpsr_c((mask) & (I32_bit | F32_bit), \ + (mask) & (I32_bit | F32_bit))) + +#define enable_interrupts(mask) \ + (__set_cpsr_c((mask) & (I32_bit | F32_bit), 0)) + +#define restore_interrupts(old_cpsr) \ + (__set_cpsr_c((I32_bit | F32_bit), (old_cpsr) & (I32_bit | F32_bit))) +#else /* ! __PROG32 */ +#define disable_interrupts(mask) \ + (set_r15((mask) & (R15_IRQ_DISABLE | R15_FIQ_DISABLE), \ + (mask) & (R15_IRQ_DISABLE | R15_FIQ_DISABLE))) + +#define enable_interrupts(mask) \ + (set_r15((mask) & (R15_IRQ_DISABLE | R15_FIQ_DISABLE), 0)) + +#define restore_interrupts(old_r15) \ + (set_r15((R15_IRQ_DISABLE | R15_FIQ_DISABLE), \ + (old_r15) & (R15_IRQ_DISABLE | R15_FIQ_DISABLE))) +#endif /* __PROG32 */ + +#ifdef __PROG32 +/* Functions to manipulate the CPSR. */ +u_int SetCPSR(u_int, u_int); +u_int GetCPSR(void); +#else +/* Functions to manipulate the processor control bits in r15. */ +u_int set_r15(u_int, u_int); +u_int get_r15(void); +#endif /* __PROG32 */ + +/* + * Functions to manipulate cpu r13 + * (in arm/arm32/setstack.S) + */ + +void set_stackptr __P((u_int, u_int)); +u_int get_stackptr __P((u_int)); + +/* + * Miscellany + */ + +int get_pc_str_offset __P((void)); + +/* + * CPU functions from locore.S + */ + +void cpu_reset __P((void)) __attribute__((__noreturn__)); + +/* + * Cache info variables. + */ + +/* PRIMARY CACHE VARIABLES */ +extern int arm_picache_size; +extern int arm_picache_line_size; +extern int arm_picache_ways; + +extern int arm_pdcache_size; /* and unified */ +extern int arm_pdcache_line_size; +extern int arm_pdcache_ways; + +extern int arm_pcache_type; +extern int arm_pcache_unified; + +extern int arm_dcache_align; +extern int arm_dcache_align_mask; + +#endif /* _KERNEL */ +#endif /* _ARM32_CPUFUNC_H_ */ + +/* End of cpufunc.h */ diff --git a/StdLib/Include/Arm/machine/float.h b/StdLib/Include/Arm/machine/float.h new file mode 100644 index 0000000000..4bd79b3a3d --- /dev/null +++ b/StdLib/Include/Arm/machine/float.h @@ -0,0 +1,31 @@ +/* $NetBSD: float.h,v 1.6 2005/12/11 12:16:47 christos Exp $ */ + +#ifndef _ARM_FLOAT_H_ +#define _ARM_FLOAT_H_ + +#ifndef __VFP_FP__ +#define LDBL_MANT_DIG 64 +#define LDBL_EPSILON 1.0842021724855044340E-19L +#define LDBL_DIG 18 +#define LDBL_MIN_EXP (-16381) +#define LDBL_MIN 1.6810515715560467531E-4932L +#define LDBL_MIN_10_EXP (-4931) +#define LDBL_MAX_EXP 16384 +#define LDBL_MAX 1.1897314953572317650E+4932L +#define LDBL_MAX_10_EXP 4932 +#endif + +#include + +#ifndef __VFP_FP__ +#if !defined(_ANSI_SOURCE) && !defined(_POSIX_C_SOURCE) && \ + !defined(_XOPEN_SOURCE) || \ + ((__STDC_VERSION__ - 0) >= 199901L) || \ + ((_POSIX_C_SOURCE - 0) >= 200112L) || \ + ((_XOPEN_SOURCE - 0) >= 600) || \ + defined(_ISOC99_SOURCE) || defined(_NETBSD_SOURCE) +#define DECIMAL_DIG 21 +#endif /* !defined(_ANSI_SOURCE) && ... */ +#endif /* !__VFP_FP__ */ + +#endif /* !_ARM_FLOAT_H_ */ diff --git a/StdLib/Include/Arm/machine/frame.h b/StdLib/Include/Arm/machine/frame.h new file mode 100644 index 0000000000..1037a9ff8d --- /dev/null +++ b/StdLib/Include/Arm/machine/frame.h @@ -0,0 +1,123 @@ +/* $NetBSD: frame.h,v 1.8 2005/12/11 12:16:47 christos Exp $ */ + +/* + * Copyright (c) 1994-1997 Mark Brinicombe. + * Copyright (c) 1994 Brini. + * All rights reserved. + * + * This code is derived from software written for Brini by Mark Brinicombe + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Brini. + * 4. The name of the company nor the name of the author may be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +/* + * arm/frame.h - Stack frames structures common to arm26 and arm32 + */ + +#ifndef _ARM_FRAME_H_ +#define _ARM_FRAME_H_ + +#ifndef _LOCORE + +#include +#include +#include + +/* + * Trap frame. Pushed onto the kernel stack on a trap (synchronous exception). + */ + +typedef struct trapframe { + register_t tf_spsr; /* Zero on arm26 */ + register_t tf_r0; + register_t tf_r1; + register_t tf_r2; + register_t tf_r3; + register_t tf_r4; + register_t tf_r5; + register_t tf_r6; + register_t tf_r7; + register_t tf_r8; + register_t tf_r9; + register_t tf_r10; + register_t tf_r11; + register_t tf_r12; + register_t tf_usr_sp; + register_t tf_usr_lr; + register_t tf_svc_sp; /* Not used on arm26 */ + register_t tf_svc_lr; /* Not used on arm26 */ + register_t tf_pc; +} trapframe_t; + +/* Register numbers */ +#define tf_r13 tf_usr_sp +#define tf_r14 tf_usr_lr +#define tf_r15 tf_pc + +/* + * Signal frame. Pushed onto user stack before calling sigcode. + */ +#ifdef COMPAT_16 +struct sigframe_sigcontext { + struct sigcontext sf_sc; +}; +#endif + +/* the pointers are use in the trampoline code to locate the ucontext */ +struct sigframe_siginfo { + siginfo_t sf_si; /* actual saved siginfo */ + ucontext_t sf_uc; /* actual saved ucontext */ +}; + +/* + * Scheduler activations upcall frame. Pushed onto user stack before + * calling an SA upcall. + */ + +struct saframe { +#if 0 /* in registers on entry to upcall */ + int sa_type; + struct sa_t ** sa_sas; + int sa_events; + int sa_interrupted; +#endif + void * sa_arg; +}; + +#ifdef _KERNEL +__BEGIN_DECLS +void sendsig_sigcontext(const ksiginfo_t *, const sigset_t *); +void *getframe(struct lwp *, int, int *); +__END_DECLS +#define process_frame(l) ((l)->l_addr->u_pcb.pcb_tf) +#endif + +#endif /* _LOCORE */ + +#endif /* _ARM_FRAME_H_ */ + +/* End of frame.h */ diff --git a/StdLib/Include/Arm/machine/ieee.h b/StdLib/Include/Arm/machine/ieee.h new file mode 100644 index 0000000000..5e6b4d9165 --- /dev/null +++ b/StdLib/Include/Arm/machine/ieee.h @@ -0,0 +1,13 @@ +/* $NetBSD: ieee.h,v 1.9 2005/12/11 12:16:47 christos Exp $ */ + +#include + +/* + * A NaN is a `signalling NaN' if its QUIETNAN bit is clear in its + * high fraction; if the bit is set, it is a `quiet NaN'. + */ + +#if 0 +#define SNG_QUIETNAN (1 << 22) +#define DBL_QUIETNAN (1 << 19) +#endif diff --git a/StdLib/Include/Arm/machine/lock.h b/StdLib/Include/Arm/machine/lock.h new file mode 100644 index 0000000000..be11a470ab --- /dev/null +++ b/StdLib/Include/Arm/machine/lock.h @@ -0,0 +1,89 @@ +/* $NetBSD: lock.h,v 1.7 2005/12/28 19:09:29 perry Exp $ */ + +/*- + * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jason R. Thorpe. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Machine-dependent spin lock operations. + * + * NOTE: The SWP insn used here is available only on ARM architecture + * version 3 and later (as well as 2a). What we are going to do is + * expect that the kernel will trap and emulate the insn. That will + * be slow, but give us the atomicity that we need. + */ + +#ifndef _ARM_LOCK_H_ +#define _ARM_LOCK_H_ + +static __inline int +__swp(int __val, volatile int *__ptr) +{ + + __asm volatile("swp %0, %1, [%2]" + : "=r" (__val) : "r" (__val), "r" (__ptr) : "memory"); + return __val; +} + +static __inline void __attribute__((__unused__)) +__cpu_simple_lock_init(__cpu_simple_lock_t *alp) +{ + + *alp = __SIMPLELOCK_UNLOCKED; +} + +static __inline void __attribute__((__unused__)) +__cpu_simple_lock(__cpu_simple_lock_t *alp) +{ + + while (__swp(__SIMPLELOCK_LOCKED, alp) != __SIMPLELOCK_UNLOCKED) + continue; +} + +static __inline int __attribute__((__unused__)) +__cpu_simple_lock_try(__cpu_simple_lock_t *alp) +{ + + return (__swp(__SIMPLELOCK_LOCKED, alp) == __SIMPLELOCK_UNLOCKED); +} + +static __inline void __attribute__((__unused__)) +__cpu_simple_unlock(__cpu_simple_lock_t *alp) +{ + + *alp = __SIMPLELOCK_UNLOCKED; +} + +#endif /* _ARM_LOCK_H_ */ diff --git a/StdLib/Include/Arm/machine/math.h b/StdLib/Include/Arm/machine/math.h new file mode 100644 index 0000000000..7eca11187b --- /dev/null +++ b/StdLib/Include/Arm/machine/math.h @@ -0,0 +1,3 @@ +/* $NetBSD: math.h,v 1.2 2002/02/19 13:08:14 simonb Exp $ */ + +#define __HAVE_NANF diff --git a/StdLib/Include/Arm/machine/mcontext.h b/StdLib/Include/Arm/machine/mcontext.h new file mode 100644 index 0000000000..0f450c43c1 --- /dev/null +++ b/StdLib/Include/Arm/machine/mcontext.h @@ -0,0 +1,114 @@ +/* $NetBSD: mcontext.h,v 1.5 2005/12/11 12:16:47 christos Exp $ */ + +/*- + * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Klaus Klein and by Jason R. Thorpe of Wasabi Systems, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _ARM_MCONTEXT_H_ +#define _ARM_MCONTEXT_H_ + +/* + * General register state + */ +#define _NGREG 17 +typedef unsigned int __greg_t; +typedef __greg_t __gregset_t[_NGREG]; + +#define _REG_R0 0 +#define _REG_R1 1 +#define _REG_R2 2 +#define _REG_R3 3 +#define _REG_R4 4 +#define _REG_R5 5 +#define _REG_R6 6 +#define _REG_R7 7 +#define _REG_R8 8 +#define _REG_R9 9 +#define _REG_R10 10 +#define _REG_R11 11 +#define _REG_R12 12 +#define _REG_R13 13 +#define _REG_R14 14 +#define _REG_R15 15 +#define _REG_CPSR 16 +/* Convenience synonyms */ +#define _REG_FP _REG_R11 +#define _REG_SP _REG_R13 +#define _REG_LR _REG_R14 +#define _REG_PC _REG_R15 + +/* + * Floating point register state + */ +/* Note: the storage layout of this structure must be identical to ARMFPE! */ +typedef struct { + unsigned int __fp_fpsr; + struct { + unsigned int __fp_exponent; + unsigned int __fp_mantissa_hi; + unsigned int __fp_mantissa_lo; + } __fp_fr[8]; +} __fpregset_t; + +typedef struct { + unsigned int __vfp_fpscr; + unsigned int __vfp_fstmx[33]; + unsigned int __vfp_fpsid; +} __vfpregset_t; + +typedef struct { + __gregset_t __gregs; + union { + __fpregset_t __fpregs; + __vfpregset_t __vfpregs; + } __fpu; +} mcontext_t; + +/* Machine-dependent uc_flags */ +#define _UC_ARM_VFP 0x00010000 /* FPU field is VFP */ + +/* used by signal delivery to indicate status of signal stack */ +#define _UC_SETSTACK 0x00020000 +#define _UC_CLRSTACK 0x00040000 + +#define _UC_MACHINE_PAD 3 /* Padding appended to ucontext_t */ + +#define _UC_MACHINE_SP(uc) ((uc)->uc_mcontext.__gregs[_REG_SP]) +#define _UC_MACHINE_PC(uc) ((uc)->uc_mcontext.__gregs[_REG_PC]) +#define _UC_MACHINE_INTRV(uc) ((uc)->uc_mcontext.__gregs[_REG_R0]) + +#define _UC_MACHINE_SET_PC(uc, pc) _UC_MACHINE_PC(uc) = (pc) + +#endif /* !_ARM_MCONTEXT_H_ */ diff --git a/StdLib/Include/Arm/machine/proc.h b/StdLib/Include/Arm/machine/proc.h new file mode 100644 index 0000000000..14718611d3 --- /dev/null +++ b/StdLib/Include/Arm/machine/proc.h @@ -0,0 +1,55 @@ +/* $NetBSD: proc.h,v 1.6 2003/03/05 11:28:14 agc Exp $ */ + +/* + * Copyright (c) 1994 Mark Brinicombe. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the RiscBSD team. + * 4. The name "RiscBSD" nor the name of the author may be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY RISCBSD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL RISCBSD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _ARM32_PROC_H_ +#define _ARM32_PROC_H_ + +/* + * Machine-dependent part of the proc structure for arm. + */ + +struct trapframe; +struct lwp; + +struct mdlwp { + int md_dummy; /* must have at least one member */ +}; + +struct mdproc { + void (*md_syscall)(struct trapframe *, struct lwp *, u_int32_t); + int pmc_enabled; /* bitfield of enabled counters */ + void *pmc_state; /* port-specific pmc state */ +}; + +#endif /* _ARM32_PROC_H_ */ diff --git a/StdLib/Include/Arm/machine/signal.h b/StdLib/Include/Arm/machine/signal.h new file mode 100644 index 0000000000..d42ca13e08 --- /dev/null +++ b/StdLib/Include/Arm/machine/signal.h @@ -0,0 +1,22 @@ +/** +Copyright (c) 2010, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. +The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php. + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _MACHINE_SIGNAL_H +#define _MACHINE_SIGNAL_H +#include + +/** The type sig_atomic_t is the (possibly volatile-qualified) integer type of + an object that can be accessed as an atomic entity, even in the presence + of asynchronous interrupts. +**/ +typedef INTN sig_atomic_t; + +#endif /* _MACHINE_SIGNAL_H */ diff --git a/StdLib/Include/Ia32/machine/_math.h b/StdLib/Include/Ia32/machine/_math.h new file mode 100644 index 0000000000..67cf98c30d --- /dev/null +++ b/StdLib/Include/Ia32/machine/_math.h @@ -0,0 +1,18 @@ +/** + +Copyright (c) 2010, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. +The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php. + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _MACHINE_MATH_H +#define _MACHINE_MATH_H + +//#define __HUGE_VAL ???????????.????????????? + +#endif /* _MACHINE_MATH_H */ diff --git a/StdLib/Include/Ia32/machine/ansi.h b/StdLib/Include/Ia32/machine/ansi.h new file mode 100644 index 0000000000..5872eb3694 --- /dev/null +++ b/StdLib/Include/Ia32/machine/ansi.h @@ -0,0 +1,94 @@ +/* $NetBSD: ansi.h,v 1.19 2006/10/04 13:52:00 tnozaki Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ansi.h 8.2 (Berkeley) 1/4/94 + */ + +#ifndef _ANSI_H_ +#define _ANSI_H_ + +#include + +#include + +/* + * Types which are fundamental to the implementation and may appear in + * more than one standard header are defined here. Standard headers + * then use: + * #ifdef _BSD_SIZE_T_ + * typedef _BSD_SIZE_T_ size_t; + * #undef _BSD_SIZE_T_ + * #endif + */ +#define _BSD_CLOCK_T_ _EFI_CLOCK_T /* clock() */ +#define _BSD_PTRDIFF_T_ _EFI_PTRDIFF_T_ /* ptr1 - ptr2 */ +#define _BSD_SIZE_T_ _EFI_SIZE_T_ /* sizeof() */ +#define _BSD_SSIZE_T_ INTN /* byte count or error */ +#define _BSD_TIME_T_ _EFI_TIME_T /* time() */ +#define _BSD_VA_LIST_ VA_LIST +#define _BSD_CLOCKID_T_ INT64 /* clockid_t */ +#define _BSD_TIMER_T_ INT64 /* timer_t */ +#define _BSD_SUSECONDS_T_ INT64 /* suseconds_t */ +#define _BSD_USECONDS_T_ UINT64 /* useconds_t */ + +/* + * NOTE: rune_t is not covered by ANSI nor other standards, and should not + * be instantiated outside of lib/libc/locale. use wchar_t. + * + * Runes (wchar_t) is declared to be an ``int'' instead of the more natural + * ``unsigned long'' or ``long''. Two things are happening here. It is not + * unsigned so that EOF (-1) can be naturally assigned to it and used. Also, + * it looks like 10646 will be a 31 bit standard. This means that if your + * ints cannot hold 32 bits, you will be in trouble. The reason an int was + * chosen over a long is that the is*() and to*() routines take ints (says + * ANSI C), but they use _RUNE_T_ instead of int. By changing it here, you + * lose a bit of ANSI conformance, but your programs will still work. + * + * Note that _WCHAR_T_ and _RUNE_T_ must be of the same type. When wchar_t + * and rune_t are typedef'd, _WCHAR_T_ will be undef'd, but _RUNE_T remains + * defined for ctype.h. + */ +#define _BSD_WCHAR_T_ _EFI_WCHAR_T /* wchar_t */ +#define _BSD_WINT_T_ _EFI_WINT_T /* wint_t */ +#define _BSD_RUNE_T_ _EFI_WCHAR_T /* rune_t */ +#define _BSD_WCTRANS_T_ void * /* wctrans_t */ +#define _BSD_WCTYPE_T_ unsigned int /* wctype_t */ + +/* + * mbstate_t is an opaque object to keep conversion state, during multibyte + * stream conversions. The content must not be referenced by user programs. + */ +typedef union { + __int64_t __mbstateL; /* for alignment */ + char __mbstate8[128]; +} __mbstate_t; +#define _BSD_MBSTATE_T_ __mbstate_t /* mbstate_t */ + +#endif /* _ANSI_H_ */ diff --git a/StdLib/Include/Ia32/machine/asm.h b/StdLib/Include/Ia32/machine/asm.h new file mode 100644 index 0000000000..3d8f11f16c --- /dev/null +++ b/StdLib/Include/Ia32/machine/asm.h @@ -0,0 +1,208 @@ +/* $NetBSD: asm.h,v 1.30 2006/01/20 22:02:40 christos Exp $ */ + +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)asm.h 5.5 (Berkeley) 5/7/91 + */ + +#ifndef _I386_ASM_H_ +#define _I386_ASM_H_ + +#ifdef _KERNEL_OPT +#include "opt_multiprocessor.h" +#endif + +#ifdef PIC +#define PIC_PROLOGUE \ + pushl %ebx; \ + call 1f; \ +1: \ + popl %ebx; \ + addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx +#define PIC_EPILOGUE \ + popl %ebx +#define PIC_PLT(x) x@PLT +#define PIC_GOT(x) x@GOT(%ebx) +#define PIC_GOTOFF(x) x@GOTOFF(%ebx) +#else +#define PIC_PROLOGUE +#define PIC_EPILOGUE +#define PIC_PLT(x) x +#define PIC_GOT(x) x +#define PIC_GOTOFF(x) x +#endif + +#ifdef __ELF__ +# define _C_LABEL(x) x +#else +# ifdef __STDC__ +# define _C_LABEL(x) _ ## x +# else +# define _C_LABEL(x) _/**/x +# endif +#endif +#define _ASM_LABEL(x) x + +#define CVAROFF(x, y) _C_LABEL(x) + y + +#ifdef __STDC__ +# define __CONCAT(x,y) x ## y +# define __STRING(x) #x +#else +# define __CONCAT(x,y) x/**/y +# define __STRING(x) "x" +#endif + +/* let kernels and others override entrypoint alignment */ +#if !defined(_ALIGN_TEXT) && !defined(_KERNEL) +# ifdef __ELF__ +# define _ALIGN_TEXT .align 4 +# else +# define _ALIGN_TEXT .align 2 +# endif +#endif + +#define _ENTRY(x) \ + .text; _ALIGN_TEXT; .globl x; .type x,@function; x: + +#ifdef _KERNEL + +#if defined(MULTIPROCESSOR) +#define CPUVAR(off) %fs:__CONCAT(CPU_INFO_,off) +#else +#define CPUVAR(off) _C_LABEL(cpu_info_primary)+__CONCAT(CPU_INFO_,off) +#endif /* MULTIPROCESSOR */ + +/* XXX Can't use __CONCAT() here, as it would be evaluated incorrectly. */ +#ifdef __ELF__ +#ifdef __STDC__ +#define IDTVEC(name) \ + ALIGN_TEXT; .globl X ## name; .type X ## name,@function; X ## name: +#else +#define IDTVEC(name) \ + ALIGN_TEXT; .globl X/**/name; .type X/**/name,@function; X/**/name: +#endif /* __STDC__ */ +#else +#ifdef __STDC__ +#define IDTVEC(name) \ + ALIGN_TEXT; .globl _X ## name; .type _X ## name,@function; _X ## name: +#else +#define IDTVEC(name) \ + ALIGN_TEXT; .globl _X/**/name; .type _X/**/name,@function; _X/**/name: +#endif /* __STDC__ */ +#endif /* __ELF__ */ + +#ifdef __ELF__ +#define ALIGN_DATA .align 4 +#define ALIGN_TEXT .align 4,0x90 /* 4-byte boundaries, NOP-filled */ +#define SUPERALIGN_TEXT .align 16,0x90 /* 16-byte boundaries better for 486 */ +#else +#define ALIGN_DATA .align 2 +#define ALIGN_TEXT .align 2,0x90 /* 4-byte boundaries, NOP-filled */ +#define SUPERALIGN_TEXT .align 4,0x90 /* 16-byte boundaries better for 486 */ +#endif /* __ELF__ */ + +#define _ALIGN_TEXT ALIGN_TEXT + +#ifdef GPROF +#ifdef __ELF__ +#define MCOUNT_ASM call _C_LABEL(__mcount) +#else /* __ELF__ */ +#define MCOUNT_ASM call _C_LABEL(mcount) +#endif /* __ELF__ */ +#else /* GPROF */ +#define MCOUNT_ASM /* nothing */ +#endif /* GPROF */ + +#endif /* _KERNEL */ + + + +#ifdef GPROF +# ifdef __ELF__ +# define _PROF_PROLOGUE \ + pushl %ebp; movl %esp,%ebp; call PIC_PLT(__mcount); popl %ebp +# else +# define _PROF_PROLOGUE \ + pushl %ebp; movl %esp,%ebp; call PIC_PLT(mcount); popl %ebp +# endif +#else +# define _PROF_PROLOGUE +#endif + +#define ENTRY(y) _ENTRY(_C_LABEL(y)); _PROF_PROLOGUE +#define NENTRY(y) _ENTRY(_C_LABEL(y)) +#define ASENTRY(y) _ENTRY(_ASM_LABEL(y)); _PROF_PROLOGUE + +#define ASMSTR .asciz + +#ifdef __ELF__ +#define RCSID(x) .section ".ident"; .asciz x +#else +#define RCSID(x) .text; .asciz x +#endif + +#ifdef NO_KERNEL_RCSIDS +#define __KERNEL_RCSID(_n, _s) /* nothing */ +#else +#define __KERNEL_RCSID(_n, _s) RCSID(_s) +#endif + +#ifdef __ELF__ +#define WEAK_ALIAS(alias,sym) \ + .weak alias; \ + alias = sym +#endif +/* + * STRONG_ALIAS: create a strong alias. + */ +#define STRONG_ALIAS(alias,sym) \ + .globl alias; \ + alias = sym + +#ifdef __STDC__ +#define WARN_REFERENCES(sym,msg) \ + .stabs msg ## ,30,0,0,0 ; \ + .stabs __STRING(_C_LABEL(sym)) ## ,1,0,0,0 +#elif defined(__ELF__) +#define WARN_REFERENCES(sym,msg) \ + .stabs msg,30,0,0,0 ; \ + .stabs __STRING(sym),1,0,0,0 +#else +#define WARN_REFERENCES(sym,msg) \ + .stabs msg,30,0,0,0 ; \ + .stabs __STRING(_/**/sym),1,0,0,0 +#endif /* __STDC__ */ + + + +#endif /* !_I386_ASM_H_ */ diff --git a/StdLib/Include/Ia32/machine/bswap.h b/StdLib/Include/Ia32/machine/bswap.h new file mode 100644 index 0000000000..7016f7ca29 --- /dev/null +++ b/StdLib/Include/Ia32/machine/bswap.h @@ -0,0 +1,13 @@ +/* $NetBSD: bswap.h,v 1.3 2006/01/31 07:49:18 dsl Exp $ */ + +/* Written by Manuel Bouyer. Public domain */ + +#ifndef _MACHINE_BSWAP_H_ +#define _MACHINE_BSWAP_H_ + +#include + +#define __BSWAP_RENAME +#include + +#endif /* !_MACHINE_BSWAP_H_ */ diff --git a/StdLib/Include/Ia32/machine/byte_swap.h b/StdLib/Include/Ia32/machine/byte_swap.h new file mode 100644 index 0000000000..db16c97b2e --- /dev/null +++ b/StdLib/Include/Ia32/machine/byte_swap.h @@ -0,0 +1,79 @@ +/* $NetBSD: byte_swap.h,v 1.10 2006/01/30 22:46:36 dsl Exp $ */ + +/*- + * Copyright (c) 1998 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Charles M. Hannum. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _I386_BYTE_SWAP_H_ +#define _I386_BYTE_SWAP_H_ + +#include + +#if defined(_KERNEL_OPT) +#include "opt_cputype.h" +#endif + +#ifdef __GNUC__ +#include +__BEGIN_DECLS + +#define __BYTE_SWAP_U32_VARIABLE __byte_swap_u32_variable +static __inline uint32_t __byte_swap_u32_variable(uint32_t); +static __inline uint32_t +__byte_swap_u32_variable(uint32_t x) +{ + __asm volatile ( +#if defined(_KERNEL) && !defined(_LKM) && !defined(I386_CPU) + "bswap %1" +#else + "rorw $8, %w1\n\trorl $16, %1\n\trorw $8, %w1" +#endif + : "=r" (x) : "0" (x)); + return (x); +} + +#define __BYTE_SWAP_U16_VARIABLE __byte_swap_u16_variable +static __inline uint16_t __byte_swap_u16_variable(uint16_t); +static __inline uint16_t +__byte_swap_u16_variable(uint16_t x) +{ + __asm volatile ("rorw $8, %w1" : "=r" (x) : "0" (x)); + return (x); +} + +__END_DECLS +#endif + +#endif /* !_I386_BYTE_SWAP_H_ */ diff --git a/StdLib/Include/Ia32/machine/endian.h b/StdLib/Include/Ia32/machine/endian.h new file mode 100644 index 0000000000..8c2cfd12a1 --- /dev/null +++ b/StdLib/Include/Ia32/machine/endian.h @@ -0,0 +1,3 @@ +/* $NetBSD: endian.h,v 1.29 2000/03/17 00:09:20 mycroft Exp $ */ + +#include diff --git a/StdLib/Include/Ia32/machine/endian_machdep.h b/StdLib/Include/Ia32/machine/endian_machdep.h new file mode 100644 index 0000000000..83947a5fe6 --- /dev/null +++ b/StdLib/Include/Ia32/machine/endian_machdep.h @@ -0,0 +1,3 @@ +/* $NetBSD: endian_machdep.h,v 1.3 2006/01/30 21:52:38 dsl Exp $ */ + +#define _BYTE_ORDER _LITTLE_ENDIAN diff --git a/StdLib/Include/Ia32/machine/float.h b/StdLib/Include/Ia32/machine/float.h new file mode 100644 index 0000000000..c7dc6203f8 --- /dev/null +++ b/StdLib/Include/Ia32/machine/float.h @@ -0,0 +1,3 @@ +/* $NetBSD: float.h,v 1.12 2003/02/26 21:29:00 fvdl Exp $ */ + +#include diff --git a/StdLib/Include/Ia32/machine/ieee.h b/StdLib/Include/Ia32/machine/ieee.h new file mode 100644 index 0000000000..17a1d48d3a --- /dev/null +++ b/StdLib/Include/Ia32/machine/ieee.h @@ -0,0 +1,3 @@ +/* $NetBSD: ieee.h,v 1.2 2003/02/26 21:29:01 fvdl Exp $ */ + +#include diff --git a/StdLib/Include/Ia32/machine/int_const.h b/StdLib/Include/Ia32/machine/int_const.h new file mode 100644 index 0000000000..c3a59d7237 --- /dev/null +++ b/StdLib/Include/Ia32/machine/int_const.h @@ -0,0 +1,63 @@ +/* $NetBSD: int_const.h,v 1.1 2001/04/14 22:38:38 kleink Exp $ */ + +/*- + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Klaus Klein. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _I386_INT_CONST_H_ +#define _I386_INT_CONST_H_ + +/* + * 7.18.4 Macros for integer constants + */ + +/* 7.18.4.1 Macros for minimum-width integer constants */ + +#define INT8_C(c) c +#define INT16_C(c) c +#define INT32_C(c) c +#define INT64_C(c) c ## LL + +#define UINT8_C(c) c ## U +#define UINT16_C(c) c ## U +#define UINT32_C(c) c ## U +#define UINT64_C(c) c ## ULL + +/* 7.18.4.2 Macros for greatest-width integer constants */ + +#define INTMAX_C(c) c ## LL +#define UINTMAX_C(c) c ## ULL + +#endif /* !_I386_INT_CONST_H_ */ diff --git a/StdLib/Include/Ia32/machine/int_limits.h b/StdLib/Include/Ia32/machine/int_limits.h new file mode 100644 index 0000000000..b0aa9d5d7c --- /dev/null +++ b/StdLib/Include/Ia32/machine/int_limits.h @@ -0,0 +1,141 @@ +/** @file + 7.18.2 Limits of specified-width integer types. + + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Klaus Klein. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + + NetBSD: int_limits.h,v 1.5 2004/05/22 14:16:59 kleink Exp +**/ +#ifndef _I386_INT_LIMITS_H_ +#define _I386_INT_LIMITS_H_ + +/* 7.18.2.1 Limits of exact-width integer types */ + +/* minimum values of exact-width signed integer types */ +#define INT8_MIN ((-0x7f)-1) /* int8_t */ +#define INT16_MIN ((-0x7fff)-1) /* int16_t */ +#define INT32_MIN ((-0x7fffffff)-1) /* int32_t */ +#define INT64_MIN ((-0x7fffffffffffffffLL)-1) /* int64_t */ + +/* maximum values of exact-width signed integer types */ +#define INT8_MAX 0x7f /* int8_t */ +#define INT16_MAX 0x7fff /* int16_t */ +#define INT32_MAX 0x7fffffff /* int32_t */ +#define INT64_MAX 0x7fffffffffffffffLL /* int64_t */ + +/* maximum values of exact-width unsigned integer types */ +#define UINT8_MAX 0xffU /* uint8_t */ +#define UINT16_MAX 0xffffU /* uint16_t */ +#define UINT32_MAX 0xffffffffU /* uint32_t */ +#define UINT64_MAX 0xffffffffffffffffULL /* uint64_t */ + +/* 7.18.2.2 Limits of minimum-width integer types */ + +/* minimum values of minimum-width signed integer types */ +#define INT_LEAST8_MIN ((-0x7f)-1) /* int_least8_t */ +#define INT_LEAST16_MIN ((-0x7fff)-1) /* int_least16_t */ +#define INT_LEAST32_MIN ((-0x7fffffff)-1) /* int_least32_t */ +#define INT_LEAST64_MIN ((-0x7fffffffffffffffLL)-1) /* int_least64_t */ + +/* maximum values of minimum-width signed integer types */ +#define INT_LEAST8_MAX 0x7f /* int_least8_t */ +#define INT_LEAST16_MAX 0x7fff /* int_least16_t */ +#define INT_LEAST32_MAX 0x7fffffff /* int_least32_t */ +#define INT_LEAST64_MAX 0x7fffffffffffffffLL /* int_least64_t */ + +/* maximum values of minimum-width unsigned integer types */ +#define UINT_LEAST8_MAX 0xffU /* uint_least8_t */ +#define UINT_LEAST16_MAX 0xffffU /* uint_least16_t */ +#define UINT_LEAST32_MAX 0xffffffffU /* uint_least32_t */ +#define UINT_LEAST64_MAX 0xffffffffffffffffULL /* uint_least64_t */ + +/* 7.18.2.3 Limits of fastest minimum-width integer types */ + +/* minimum values of fastest minimum-width signed integer types */ +#define INT_FAST8_MIN ((-0x7f)-1) /* int_fast8_t */ +#define INT_FAST16_MIN ((-0x7fffffff)-1) /* int_fast16_t */ +#define INT_FAST32_MIN ((-0x7fffffff)-1) /* int_fast32_t */ +#define INT_FAST64_MIN ((-0x7fffffffffffffffLL-1) /* int_fast64_t */ + +/* maximum values of fastest minimum-width signed integer types */ +#define INT_FAST8_MAX 0x7f /* int_fast8_t */ +#define INT_FAST16_MAX 0x7fffffff /* int_fast16_t */ +#define INT_FAST32_MAX 0x7fffffff /* int_fast32_t */ +#define INT_FAST64_MAX 0x7fffffffffffffffLL /* int_fast64_t */ + +/* maximum values of fastest minimum-width unsigned integer types */ +#define UINT_FAST8_MAX 0xffU /* uint_fast8_t */ +#define UINT_FAST16_MAX 0xffffffffU /* uint_fast16_t */ +#define UINT_FAST32_MAX 0xffffffffU /* uint_fast32_t */ +#define UINT_FAST64_MAX 0xffffffffffffffffULL /* uint_fast64_t */ + +/* 7.18.2.4 Limits of integer types capable of holding object pointers */ + +#define INTPTR_MIN ((-0x7fffffff)-1) /* intptr_t */ +#define INTPTR_MAX 0x7fffffff /* intptr_t */ +#define UINTPTR_MAX 0xffffffffU /* uintptr_t */ + +/* 7.18.2.5 Limits of greatest-width integer types */ + +#define INTMAX_MIN ((-0x7fffffffffffffffLL)-1) /* intmax_t */ +#define INTMAX_MAX 0x7fffffffffffffffLL /* intmax_t */ +#define UINTMAX_MAX 0xffffffffffffffffULL /* uintmax_t */ + + +/* + * 7.18.3 Limits of other integer types + */ + +/* limits of ptrdiff_t */ +#define PTRDIFF_MIN ((-0x7fffffff)-1) /* ptrdiff_t */ +#define PTRDIFF_MAX 0x7fffffff /* ptrdiff_t */ + +/* limits of sig_atomic_t */ +#define SIG_ATOMIC_MIN ((-0x7fffffff)-1) /* sig_atomic_t */ +#define SIG_ATOMIC_MAX 0x7fffffff /* sig_atomic_t */ + +/* limit of size_t */ +#define SIZE_MAX 0xffffffffU /* size_t */ +#define SIZE_T_MAX SIZE_MAX + +#endif /* !_I386_INT_LIMITS_H_ */ diff --git a/StdLib/Include/Ia32/machine/int_mwgwtypes.h b/StdLib/Include/Ia32/machine/int_mwgwtypes.h new file mode 100644 index 0000000000..5e28108f8e --- /dev/null +++ b/StdLib/Include/Ia32/machine/int_mwgwtypes.h @@ -0,0 +1,82 @@ +/** @file + Minimum and Greatest Width Integer types. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Portions Copyright (c) 2001 The NetBSD Foundation, Inc. + All rights reserved. + + This code is derived from software contributed to The NetBSD Foundation + by Klaus Klein. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: + This product includes software developed by the NetBSD + Foundation, Inc. and its contributors. + 4. Neither the name of The NetBSD Foundation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: int_mwgwtypes.h,v 1.5 2005/12/24 20:06:47 perry Exp +**/ +#ifndef _AMD64_INT_MWGWTYPES_H_ +#define _AMD64_INT_MWGWTYPES_H_ + +/* + * 7.18.1 Integer types + */ + +/* 7.18.1.2 Minimum-width integer types */ + +typedef CHAR8 int_least8_t; +typedef UINT8 uint_least8_t; +typedef INT16 int_least16_t; +typedef UINT16 uint_least16_t; +typedef INT32 int_least32_t; +typedef UINT32 uint_least32_t; +typedef INT64 int_least64_t; +typedef UINT64 uint_least64_t; + +/* 7.18.1.3 Fastest minimum-width integer types */ +typedef INT32 int_fast8_t; +typedef UINT32 uint_fast8_t; +typedef INT32 int_fast16_t; +typedef UINT32 uint_fast16_t; +typedef INT32 int_fast32_t; +typedef UINT32 uint_fast32_t; +typedef INT64 int_fast64_t; +typedef UINT64 uint_fast64_t; + +/* 7.18.1.5 Greatest-width integer types */ + +typedef INT64 intmax_t; +typedef UINT64 uintmax_t; + +#endif /* !_AMD64_INT_MWGWTYPES_H_ */ diff --git a/StdLib/Include/Ia32/machine/int_types.h b/StdLib/Include/Ia32/machine/int_types.h new file mode 100644 index 0000000000..d04d8c0e4c --- /dev/null +++ b/StdLib/Include/Ia32/machine/int_types.h @@ -0,0 +1,61 @@ +/* $NetBSD: int_types.h,v 1.10 2005/12/24 20:07:10 perry Exp $ */ + +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)types.h 7.5 (Berkeley) 3/9/91 + */ + +#ifndef _I386_INT_TYPES_H_ +#define _I386_INT_TYPES_H_ + +#include + +/* + * 7.18.1 Integer types + */ + +/* 7.18.1.1 Exact-width integer types */ + +typedef INT8 __int8_t; +typedef UINT8 __uint8_t; +typedef INT16 __int16_t; +typedef UINT16 __uint16_t; +typedef INT32 __int32_t; +typedef UINT32 __uint32_t; +typedef INT64 __int64_t; +typedef UINT64 __uint64_t; + +#define __BIT_TYPES_DEFINED__ + +/* 7.18.1.4 Integer types capable of holding object pointers */ + +typedef INTN __intptr_t; +typedef UINTN __uintptr_t; + +#endif /* !_I386_INT_TYPES_H_ */ diff --git a/StdLib/Include/Ia32/machine/limits.h b/StdLib/Include/Ia32/machine/limits.h new file mode 100644 index 0000000000..62fbe40b42 --- /dev/null +++ b/StdLib/Include/Ia32/machine/limits.h @@ -0,0 +1,3 @@ +#include + +#define __POINTER_BIT 32 diff --git a/StdLib/Include/Ia32/machine/math.h b/StdLib/Include/Ia32/machine/math.h new file mode 100644 index 0000000000..a53422933c --- /dev/null +++ b/StdLib/Include/Ia32/machine/math.h @@ -0,0 +1,3 @@ +/* $NetBSD: math.h,v 1.3 2005/12/11 12:16:25 christos Exp $ */ + +#include diff --git a/StdLib/Include/Ia32/machine/param.h b/StdLib/Include/Ia32/machine/param.h new file mode 100644 index 0000000000..72da83f488 --- /dev/null +++ b/StdLib/Include/Ia32/machine/param.h @@ -0,0 +1,174 @@ +/* $NetBSD: param.h,v 1.61 2006/08/28 13:43:35 yamt Exp $ */ + +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)param.h 5.8 (Berkeley) 6/28/91 + */ + +#ifndef _I386_PARAM_H_ +#define _I386_PARAM_H_ + +/* + * Machine dependent constants for Intel 386. + */ + +#ifdef _KERNEL +#ifdef _LOCORE +#include +#else +#include +#endif +#endif + +#define _MACHINE i386 +#define MACHINE "i386" +#define _MACHINE_ARCH i386 +#define MACHINE_ARCH "i386" +#define MID_MACHINE MID_I386 + +/* + * Round p (pointer or byte index) up to a correctly-aligned value + * for all data types (int, long, ...). The result is u_int and + * must be cast to any desired pointer type. + * + * ALIGNED_POINTER is a boolean macro that checks whether an address + * is valid to fetch data elements of type t from on this architecture. + * This does not reflect the optimal alignment, just the possibility + * (within reasonable limits). + * + */ +#define ALIGNBYTES (sizeof(int) - 1) +#define ALIGN(p) (((u_int)(u_long)(p) + ALIGNBYTES) &~ \ + ALIGNBYTES) +#define ALIGNED_POINTER(p,t) 1 + +#define PGSHIFT 12 /* LOG2(NBPG) */ +#define NBPG (1 << PGSHIFT) /* bytes/page */ +#define PGOFSET (NBPG-1) /* byte offset into page */ +#define NPTEPG (NBPG/(sizeof (pt_entry_t))) + +#if defined(_KERNEL_OPT) +#include "opt_kernbase.h" +#endif /* defined(_KERNEL_OPT) */ + +#ifdef KERNBASE_LOCORE +#error "You should only re-define KERNBASE" +#endif + +#ifndef KERNBASE +#define KERNBASE 0xc0000000UL /* start of kernel virtual space */ +#endif + +#define KERNTEXTOFF (KERNBASE + 0x100000) /* start of kernel text */ +#define BTOPKERNBASE (KERNBASE >> PGSHIFT) + +#define DEV_BSHIFT 9 /* log2(DEV_BSIZE) */ +#define DEV_BSIZE (1 << DEV_BSHIFT) +#define BLKDEV_IOSIZE 2048 +#ifndef MAXPHYS +#define MAXPHYS (64 * 1024) /* max raw I/O transfer size */ +#endif + +#define SSIZE 1 /* initial stack size/NBPG */ +#define SINCR 1 /* increment of stack/NBPG */ + +#ifdef _KERNEL_OPT +#include "opt_noredzone.h" +#endif +#ifndef UPAGES +#ifdef NOREDZONE +#define UPAGES 2 /* pages of u-area */ +#else +#define UPAGES 3 +#endif /*NOREDZONE */ +#endif /* !defined(UPAGES) */ +#define USPACE (UPAGES * NBPG) /* total size of u-area */ + +#ifndef MSGBUFSIZE +#define MSGBUFSIZE 4*NBPG /* default message buffer size */ +#endif + +/* + * Constants related to network buffer management. + * MCLBYTES must be no larger than NBPG (the software page size), and, + * on machines that exchange pages of input or output buffers with mbuf + * clusters (MAPPED_MBUFS), MCLBYTES must also be an integral multiple + * of the hardware page size. + */ +#define MSIZE 256 /* size of an mbuf */ + +#ifndef MCLSHIFT +#define MCLSHIFT 11 /* convert bytes to m_buf clusters */ + /* 2K cluster can hold Ether frame */ +#endif /* MCLSHIFT */ + +#define MCLBYTES (1 << MCLSHIFT) /* size of a m_buf cluster */ + +#ifndef NMBCLUSTERS +#if defined(_KERNEL_OPT) +#include "opt_gateway.h" +#endif + +#ifdef GATEWAY +#define NMBCLUSTERS 2048 /* map size, max cluster allocation */ +#else +#define NMBCLUSTERS 1024 /* map size, max cluster allocation */ +#endif +#endif + +#ifndef NFS_RSIZE +#define NFS_RSIZE 32768 +#endif +#ifndef NFS_WSIZE +#define NFS_WSIZE 32768 +#endif + +/* + * Minimum and maximum sizes of the kernel malloc arena in PAGE_SIZE-sized + * logical pages. + */ +#define NKMEMPAGES_MIN_DEFAULT ((8 * 1024 * 1024) >> PAGE_SHIFT) +#define NKMEMPAGES_MAX_DEFAULT ((128 * 1024 * 1024) >> PAGE_SHIFT) + +/* + * Mach derived conversion macros + */ +#define x86_round_pdr(x) ((((unsigned)(x)) + PDOFSET) & ~PDOFSET) +#define x86_trunc_pdr(x) ((unsigned)(x) & ~PDOFSET) +#define x86_btod(x) ((unsigned)(x) >> PDSHIFT) +#define x86_dtob(x) ((unsigned)(x) << PDSHIFT) +#define x86_round_page(x) ((((unsigned)(x)) + PGOFSET) & ~PGOFSET) +#define x86_trunc_page(x) ((unsigned)(x) & ~PGOFSET) +#define x86_btop(x) ((unsigned)(x) >> PGSHIFT) +#define x86_ptob(x) ((unsigned)(x) << PGSHIFT) + +#endif /* _I386_PARAM_H_ */ diff --git a/StdLib/Include/Ia32/machine/signal.h b/StdLib/Include/Ia32/machine/signal.h new file mode 100644 index 0000000000..6628eb9e94 --- /dev/null +++ b/StdLib/Include/Ia32/machine/signal.h @@ -0,0 +1,22 @@ +/** +Copyright (c) 2010, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. +The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php. + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _MACHINE_SIGNAL_H +#define _MACHINE_SIGNAL_H +#include + +/** The type sig_atomic_t is the (possibly volatile-qualified) integer type of + an object that can be accessed as an atomic entity, even in the presence + of asynchronous interrupts. +**/ +typedef INTN sig_atomic_t; + +#endif /* _MACHINE_SIGNAL_H */ diff --git a/StdLib/Include/Ia32/machine/types.h b/StdLib/Include/Ia32/machine/types.h new file mode 100644 index 0000000000..f985991ec8 --- /dev/null +++ b/StdLib/Include/Ia32/machine/types.h @@ -0,0 +1,81 @@ +/** @file + Machine dependent type definitions. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990 The Regents of the University of California. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + types.h 7.5 (Berkeley) 3/9/91 + NetBSD: types.h,v 1.49 2006/09/03 13:51:23 bjh21 Exp +**/ +#ifndef _MACHTYPES_H_ +#define _MACHTYPES_H_ + +#include +#include +#include + +/* Handle the long and unsigned long data types which EFI doesn't directly support. */ +//typedef INTN LONGN; +//typedef UINTN ULONGN; + +typedef PHYSICAL_ADDRESS paddr_t; +typedef UINT64 psize_t; +typedef PHYSICAL_ADDRESS vaddr_t; +typedef UINT64 vsize_t; + +typedef INT32 pmc_evid_t; +typedef UINT64 pmc_ctr_t; +typedef INT32 register_t; + +typedef volatile INT32 __cpu_simple_lock_t; + +#define __SIMPLELOCK_LOCKED 1 +#define __SIMPLELOCK_UNLOCKED 0 + +/* The x86 does not have strict alignment requirements. */ +#define __NO_STRICT_ALIGNMENT + +#define __HAVE_DEVICE_REGISTER +#define __HAVE_CPU_COUNTER +#define __HAVE_SYSCALL_INTERN +#define __HAVE_MINIMAL_EMUL +#define __HAVE_OLD_DISKLABEL +#define __HAVE_GENERIC_SOFT_INTERRUPTS +#define __HAVE_CPU_MAXPROC +#define __HAVE_TIMECOUNTER +#define __HAVE_GENERIC_TODR + +#endif /* _MACHTYPES_H_ */ diff --git a/StdLib/Include/Ipf/machine/_regset.h b/StdLib/Include/Ipf/machine/_regset.h new file mode 100644 index 0000000000..82e4b91070 --- /dev/null +++ b/StdLib/Include/Ipf/machine/_regset.h @@ -0,0 +1,277 @@ +/* $NetBSD: _regset.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 2002, 2003 Marcel Moolenaar + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _MACHINE_REGSET_H_ +#define _MACHINE_REGSET_H_ + +/* + * Create register sets, based on the runtime specification. This allows + * us to better reuse code and to copy sets around more efficiently. + * Contexts are defined in terms of these sets. These include trapframe, + * sigframe, pcb, mcontext, reg and fpreg. Other candidates are unwind + * and coredump related contexts. + * + * Notes: + * o Constant registers (r0, f0 and f1) are not accounted for, + * o The stacked registers (r32-r127) are not accounted for, + * o Predicates are not split across sets. + */ + +/* A single FP register. */ +union _ia64_fpreg { + unsigned char fpr_bits[16]; + long double fpr_flt; +}; + +/* + * Special registers. + */ +struct _special { + unsigned long sp; + unsigned long unat; /* NaT before spilling */ + unsigned long rp; + unsigned long pr; + unsigned long pfs; + unsigned long bspstore; + unsigned long rnat; + unsigned long __spare; + /* Userland context and syscalls */ + unsigned long tp; + unsigned long rsc; + unsigned long fpsr; + unsigned long psr; + /* ASYNC: Interrupt specific */ + unsigned long gp; + unsigned long ndirty; + unsigned long cfm; + unsigned long iip; + unsigned long ifa; + unsigned long isr; +}; + +struct _high_fp { + union _ia64_fpreg fr32; + union _ia64_fpreg fr33; + union _ia64_fpreg fr34; + union _ia64_fpreg fr35; + union _ia64_fpreg fr36; + union _ia64_fpreg fr37; + union _ia64_fpreg fr38; + union _ia64_fpreg fr39; + union _ia64_fpreg fr40; + union _ia64_fpreg fr41; + union _ia64_fpreg fr42; + union _ia64_fpreg fr43; + union _ia64_fpreg fr44; + union _ia64_fpreg fr45; + union _ia64_fpreg fr46; + union _ia64_fpreg fr47; + union _ia64_fpreg fr48; + union _ia64_fpreg fr49; + union _ia64_fpreg fr50; + union _ia64_fpreg fr51; + union _ia64_fpreg fr52; + union _ia64_fpreg fr53; + union _ia64_fpreg fr54; + union _ia64_fpreg fr55; + union _ia64_fpreg fr56; + union _ia64_fpreg fr57; + union _ia64_fpreg fr58; + union _ia64_fpreg fr59; + union _ia64_fpreg fr60; + union _ia64_fpreg fr61; + union _ia64_fpreg fr62; + union _ia64_fpreg fr63; + union _ia64_fpreg fr64; + union _ia64_fpreg fr65; + union _ia64_fpreg fr66; + union _ia64_fpreg fr67; + union _ia64_fpreg fr68; + union _ia64_fpreg fr69; + union _ia64_fpreg fr70; + union _ia64_fpreg fr71; + union _ia64_fpreg fr72; + union _ia64_fpreg fr73; + union _ia64_fpreg fr74; + union _ia64_fpreg fr75; + union _ia64_fpreg fr76; + union _ia64_fpreg fr77; + union _ia64_fpreg fr78; + union _ia64_fpreg fr79; + union _ia64_fpreg fr80; + union _ia64_fpreg fr81; + union _ia64_fpreg fr82; + union _ia64_fpreg fr83; + union _ia64_fpreg fr84; + union _ia64_fpreg fr85; + union _ia64_fpreg fr86; + union _ia64_fpreg fr87; + union _ia64_fpreg fr88; + union _ia64_fpreg fr89; + union _ia64_fpreg fr90; + union _ia64_fpreg fr91; + union _ia64_fpreg fr92; + union _ia64_fpreg fr93; + union _ia64_fpreg fr94; + union _ia64_fpreg fr95; + union _ia64_fpreg fr96; + union _ia64_fpreg fr97; + union _ia64_fpreg fr98; + union _ia64_fpreg fr99; + union _ia64_fpreg fr100; + union _ia64_fpreg fr101; + union _ia64_fpreg fr102; + union _ia64_fpreg fr103; + union _ia64_fpreg fr104; + union _ia64_fpreg fr105; + union _ia64_fpreg fr106; + union _ia64_fpreg fr107; + union _ia64_fpreg fr108; + union _ia64_fpreg fr109; + union _ia64_fpreg fr110; + union _ia64_fpreg fr111; + union _ia64_fpreg fr112; + union _ia64_fpreg fr113; + union _ia64_fpreg fr114; + union _ia64_fpreg fr115; + union _ia64_fpreg fr116; + union _ia64_fpreg fr117; + union _ia64_fpreg fr118; + union _ia64_fpreg fr119; + union _ia64_fpreg fr120; + union _ia64_fpreg fr121; + union _ia64_fpreg fr122; + union _ia64_fpreg fr123; + union _ia64_fpreg fr124; + union _ia64_fpreg fr125; + union _ia64_fpreg fr126; + union _ia64_fpreg fr127; +}; + +/* + * Preserved registers. + */ +struct _callee_saved { + unsigned long unat; /* NaT after spilling. */ + unsigned long gr4; + unsigned long gr5; + unsigned long gr6; + unsigned long gr7; + unsigned long br1; + unsigned long br2; + unsigned long br3; + unsigned long br4; + unsigned long br5; + unsigned long lc; + unsigned long __spare; +}; + +struct _callee_saved_fp { + union _ia64_fpreg fr2; + union _ia64_fpreg fr3; + union _ia64_fpreg fr4; + union _ia64_fpreg fr5; + union _ia64_fpreg fr16; + union _ia64_fpreg fr17; + union _ia64_fpreg fr18; + union _ia64_fpreg fr19; + union _ia64_fpreg fr20; + union _ia64_fpreg fr21; + union _ia64_fpreg fr22; + union _ia64_fpreg fr23; + union _ia64_fpreg fr24; + union _ia64_fpreg fr25; + union _ia64_fpreg fr26; + union _ia64_fpreg fr27; + union _ia64_fpreg fr28; + union _ia64_fpreg fr29; + union _ia64_fpreg fr30; + union _ia64_fpreg fr31; +}; + +/* + * Scratch registers. + */ +struct _caller_saved { + unsigned long unat; /* NaT after spilling. */ + unsigned long gr2; + unsigned long gr3; + unsigned long gr8; + unsigned long gr9; + unsigned long gr10; + unsigned long gr11; + unsigned long gr14; + unsigned long gr15; + unsigned long gr16; + unsigned long gr17; + unsigned long gr18; + unsigned long gr19; + unsigned long gr20; + unsigned long gr21; + unsigned long gr22; + unsigned long gr23; + unsigned long gr24; + unsigned long gr25; + unsigned long gr26; + unsigned long gr27; + unsigned long gr28; + unsigned long gr29; + unsigned long gr30; + unsigned long gr31; + unsigned long br6; + unsigned long br7; + unsigned long ccv; + unsigned long csd; + unsigned long ssd; +}; + +struct _caller_saved_fp { + union _ia64_fpreg fr6; + union _ia64_fpreg fr7; + union _ia64_fpreg fr8; + union _ia64_fpreg fr9; + union _ia64_fpreg fr10; + union _ia64_fpreg fr11; + union _ia64_fpreg fr12; + union _ia64_fpreg fr13; + union _ia64_fpreg fr14; + union _ia64_fpreg fr15; +}; + +#ifdef _KERNEL +void restore_callee_saved(const struct _callee_saved *); +void restore_callee_saved_fp(const struct _callee_saved_fp *); +void restore_high_fp(const struct _high_fp *); +void save_callee_saved(struct _callee_saved *); +void save_callee_saved_fp(struct _callee_saved_fp *); +void save_high_fp(struct _high_fp *); +#endif + +#endif /* _MACHINE_REGSET_H_ */ diff --git a/StdLib/Include/Ipf/machine/acpi_func.h b/StdLib/Include/Ipf/machine/acpi_func.h new file mode 100644 index 0000000000..000fbbd9ac --- /dev/null +++ b/StdLib/Include/Ipf/machine/acpi_func.h @@ -0,0 +1,107 @@ +/* $NetBSD: acpi_func.h,v 1.2 2006/05/14 21:55:38 elad Exp $ */ + +/*- + * Copyright (c) 2002 Mitsuru IWASAKI + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/sys/ia64/include/acpica_machdep.h,v 1.4 2004/10/11 05:39:15 njl Exp $ + */ + +/****************************************************************************** + * + * Name: acpica_machdep.h - arch-specific defines, etc. + * $Revision: 1.2 $ + * + *****************************************************************************/ + +#ifndef _IA64_ACPI_FUNC_H_ +#define _IA64_ACPI_FUNC_H_ + +#include +#include + +/* Asm macros */ + +#define ACPI_ASM_MACROS +#define BREAKPOINT3 +#define ACPI_DISABLE_IRQS() disable_intr() +#define ACPI_ENABLE_IRQS() enable_intr() + +#define ACPI_FLUSH_CPU_CACHE() /* XXX ia64_fc()? */ + + +/* Section 5.2.9.1: global lock acquire/release functions */ +extern int acpi_acquire_global_lock(uint32_t *lock); +extern int acpi_release_global_lock(uint32_t *lock); +#define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \ + ((Acq) = acpi_acquire_global_lock(GLptr)) +#define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) \ + ((Acq) = acpi_release_global_lock(GLptr)) + + +/* Section 5.2.9.1: global lock acquire/release functions */ +#define GL_ACQUIRED (-1) +#define GL_BUSY 0 +#define GL_BIT_PENDING 0x1 +#define GL_BIT_OWNED 0x2 +#define GL_BIT_MASK (GL_BIT_PENDING | GL_BIT_OWNED) + +/* + * Acquire the global lock. If busy, set the pending bit. The caller + * will wait for notification from the BIOS that the lock is available + * and then attempt to acquire it again. + */ +int +acpi_acquire_global_lock(uint32_t *lock) +{ + uint32_t new, old; + + do { + old = *lock; + new = ((old & ~GL_BIT_MASK) | GL_BIT_OWNED) | + ((old >> 1) & GL_BIT_PENDING); + } while (atomic_cmpset_acq_int(lock, old, new) == 0); + + return ((new < GL_BIT_MASK) ? GL_ACQUIRED : GL_BUSY); +} + +/* + * Release the global lock, returning whether there is a waiter pending. + * If the BIOS set the pending bit, OSPM must notify the BIOS when it + * releases the lock. + */ +int +acpi_release_global_lock(uint32_t *lock) +{ + uint32_t new, old; + + do { + old = *lock; + new = old & ~GL_BIT_MASK; + } while (atomic_cmpset_rel_int(lock, old, new) == 0); + + return (old & GL_BIT_PENDING); +} + +#endif /* _IA64_ACPI_FUNC_H_ */ diff --git a/StdLib/Include/Ipf/machine/acpi_machdep.h b/StdLib/Include/Ipf/machine/acpi_machdep.h new file mode 100644 index 0000000000..a2903519a5 --- /dev/null +++ b/StdLib/Include/Ipf/machine/acpi_machdep.h @@ -0,0 +1,3 @@ +/* $NetBSD: acpi_machdep.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + + diff --git a/StdLib/Include/Ipf/machine/acpica_machdep.h b/StdLib/Include/Ipf/machine/acpica_machdep.h new file mode 100644 index 0000000000..71156b1ede --- /dev/null +++ b/StdLib/Include/Ipf/machine/acpica_machdep.h @@ -0,0 +1 @@ +/* $NetBSD: acpica_machdep.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ diff --git a/StdLib/Include/Ipf/machine/ansi.h b/StdLib/Include/Ipf/machine/ansi.h new file mode 100644 index 0000000000..07a2008717 --- /dev/null +++ b/StdLib/Include/Ipf/machine/ansi.h @@ -0,0 +1,95 @@ +/* $NetBSD: ansi.h,v 1.3 2006/10/04 13:52:00 tnozaki Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ansi.h 8.2 (Berkeley) 1/4/94 + */ + +#ifndef _ANSI_H_ +#define _ANSI_H_ + +#include +#include + +/* + * Types which are fundamental to the implementation and may appear in + * more than one standard header are defined here. Standard headers + * then use: + * #ifdef _SIZE_T_ + * typedef _SIZE_T_ size_t; + * #undef _SIZE_T_ + * #endif + * + * Thanks, ANSI! + */ +#define _BSD_CLOCK_T_ _EFI_CLOCK_T /* clock() */ +#define _BSD_PTRDIFF_T_ _EFI_PTRDIFF_T_ /* ptr1 - ptr2 */ +#define _BSD_SIZE_T_ _EFI_SIZE_T_ /* sizeof() */ +#define _BSD_SSIZE_T_ INTN /* byte count or error */ +#define _BSD_TIME_T_ _EFI_TIME_T /* time() */ + +#define _BSD_VA_LIST_ VA_LIST +#define _BSD_CLOCKID_T_ INT64 /* clockid_t */ +#define _BSD_TIMER_T_ INT64 /* timer_t */ +#define _BSD_SUSECONDS_T_ INT64 /* suseconds_t */ +#define _BSD_USECONDS_T_ UINT64 /* useconds_t */ + +/* + * NOTE: rune_t is not covered by ANSI nor other standards, and should not + * be instantiated outside of lib/libc/locale. use wchar_t. + * + * Runes (wchar_t) is declared to be an ``int'' instead of the more natural + * ``unsigned long'' or ``long''. Two things are happening here. It is not + * unsigned so that EOF (-1) can be naturally assigned to it and used. Also, + * it looks like 10646 will be a 31 bit standard. This means that if your + * ints cannot hold 32 bits, you will be in trouble. The reason an int was + * chosen over a long is that the is*() and to*() routines take ints (says + * ANSI C), but they use _RUNE_T_ instead of int. By changing it here, you + * lose a bit of ANSI conformance, but your programs will still work. + * + * Note that _WCHAR_T_ and _RUNE_T_ must be of the same type. When wchar_t + * and rune_t are typedef'd, _WCHAR_T_ will be undef'd, but _RUNE_T remains + * defined for ctype.h. + */ +#define _BSD_WCHAR_T_ _EFI_WCHAR_T /* wchar_t */ +#define _BSD_WINT_T_ _EFI_WINT_T /* wint_t */ +#define _BSD_RUNE_T_ _EFI_WCHAR_T /* rune_t */ +#define _BSD_WCTRANS_T_ void * /* wctrans_t */ +#define _BSD_WCTYPE_T_ unsigned int /* wctype_t */ +/* + * mbstate_t is an opaque object to keep conversion state, during multibyte + * stream conversions. The content must not be referenced by user programs. + */ +typedef union { + __int64_t __mbstateL; /* for alignment */ + char __mbstate8[128]; +} __mbstate_t; +#define _BSD_MBSTATE_T_ __mbstate_t /* mbstate_t */ + +#endif /* _ANSI_H_ */ diff --git a/StdLib/Include/Ipf/machine/aout_machdep.h b/StdLib/Include/Ipf/machine/aout_machdep.h new file mode 100644 index 0000000000..7c6f3d3652 --- /dev/null +++ b/StdLib/Include/Ipf/machine/aout_machdep.h @@ -0,0 +1,36 @@ +/* $NetBSD: aout_machdep.h,v 1.2 2006/07/03 17:01:45 cherry Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)exec.h 8.1 (Berkeley) 6/10/93 + */ + +#define AOUT_LDPGSZ 16384 + + diff --git a/StdLib/Include/Ipf/machine/asm.h b/StdLib/Include/Ipf/machine/asm.h new file mode 100644 index 0000000000..2022b888f4 --- /dev/null +++ b/StdLib/Include/Ipf/machine/asm.h @@ -0,0 +1,185 @@ +/* $NetBSD: asm.h,v 1.4 2006/08/30 11:14:23 cherry Exp $ */ + +/* - + * Copyright (c) 1991,1990,1989,1994,1995,1996 Carnegie Mellon University + * All Rights Reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR + * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie Mellon + * the rights to redistribute these changes. + */ + +/* + * Assembly coding style + * + * This file contains macros and register defines to + * aid in writing more readable assembly code. + * Some rules to make assembly code understandable by + * a debugger are also noted. + */ + +/* + * Macro to make a local label name. + */ +#define LLABEL(name,num) L ## name ## num + +/* + * MCOUNT + */ +#if defined(GPROF) +#define MCOUNT \ + alloc out0 = ar.pfs, 8, 0, 4, 0; \ + mov out1 = r1; \ + mov out2 = b0;; \ + mov out3 = r0; \ + br.call.sptk b0 = _mcount;; +#else +#define MCOUNT /* nothing */ +#endif + +/* + * ENTRY + * Declare a global leaf function. + * A leaf function does not call other functions. + */ +#define ENTRY(_name_, _n_args_) \ + .global _name_; \ + .align 16; \ + .proc _name_; \ +_name_:; \ + .regstk _n_args_, 0, 0, 0; \ + MCOUNT + +#define ENTRY_NOPROFILE(_name_, _n_args_) \ + .global _name_; \ + .align 16; \ + .proc _name_; \ +_name_:; \ + .regstk _n_args_, 0, 0, 0 + +/* + * STATIC_ENTRY + * Declare a local leaf function. + */ +#define STATIC_ENTRY(_name_, _n_args_) \ + .align 16; \ + .proc _name_; \ +_name_:; \ + .regstk _n_args_, 0, 0, 0 \ + MCOUNT +/* + * XENTRY + * Global alias for a leaf function, or alternate entry point + */ +#define XENTRY(_name_) \ + .globl _name_; \ +_name_: + +/* + * STATIC_XENTRY + * Local alias for a leaf function, or alternate entry point + */ +#define STATIC_XENTRY(_name_) \ +_name_: + + +/* + * END + * Function delimiter + */ +#define END(_name_) \ + .endp _name_ + + +/* + * EXPORT + * Export a symbol + */ +#define EXPORT(_name_) \ + .global _name_; \ +_name_: + + +/* + * IMPORT + * Make an external name visible, typecheck the size + */ +#define IMPORT(_name_, _size_) \ + /* .extern _name_,_size_ */ + + +/* + * ABS + * Define an absolute symbol + */ +#define ABS(_name_, _value_) \ + .globl _name_; \ +_name_ = _value_ + + +/* + * BSS + * Allocate un-initialized space for a global symbol + */ +#define BSS(_name_,_numbytes_) \ + .comm _name_,_numbytes_ + + +/* + * MSG + * Allocate space for a message (a read-only ascii string) + */ +#define ASCIZ .asciz +#define MSG(msg,reg,label) \ + addl reg,@ltoff(label),gp;; \ + ld8 reg=[reg];; \ + .data; \ +label: ASCIZ msg; \ + .text; + + +/* + * System call glue. + */ +#define SYSCALLNUM(name) ___CONCAT(SYS_,name) + +#define CALLSYS_NOERROR(name) \ +{ .mmi ; \ + alloc r9 = ar.pfs, 0, 0, 8, 0 ; \ + mov r31 = ar.k5 ; \ + mov r10 = b0 ;; } \ +{ .mib ; \ + mov r8 = SYSCALLNUM(name) ; \ + mov b7 = r31 ; \ + br.call.sptk b0 = b7 ;; } + + +/* + * WEAK_ALIAS: create a weak alias (ELF only). + */ +#define WEAK_ALIAS(alias,sym) \ + .weak alias; \ + alias = sym + +/* + * STRONG_ALIAS: create a strong alias. + */ +#define STRONG_ALIAS(alias,sym) \ + .globl alias; \ + alias = sym diff --git a/StdLib/Include/Ipf/machine/bootinfo.h b/StdLib/Include/Ipf/machine/bootinfo.h new file mode 100644 index 0000000000..1b1d7e9e57 --- /dev/null +++ b/StdLib/Include/Ipf/machine/bootinfo.h @@ -0,0 +1,52 @@ +/* $NetBSD: bootinfo.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +struct bootinfo { + uint64_t bi_magic; /* BOOTINFO_MAGIC */ +#define BOOTINFO_MAGIC 0xdeadbeeffeedface + uint64_t bi_version; /* version 1 */ + uint64_t bi_spare[5]; /* was: name of booted kernel */ + uint64_t bi_hcdp; /* DIG64 HCDP table */ + uint64_t bi_fpswa; /* FPSWA interface */ + uint64_t bi_boothowto; /* value for boothowto */ + uint64_t bi_systab; /* pa of EFI system table */ + uint64_t bi_memmap; /* pa of EFI memory map */ + uint64_t bi_memmap_size; /* size of EFI memory map */ + uint64_t bi_memdesc_size; /* sizeof EFI memory desc */ + uint32_t bi_memdesc_version; /* EFI memory desc version */ + uint32_t bi_spare2; + uint64_t bi_unwindtab; /* start of ia64 unwind table */ + uint64_t bi_unwindtablen; /* lenght of the table, in bytes */ + uint64_t bi_symtab; /* start of kernel sym table */ + uint64_t bi_esymtab; /* end of kernel sym table */ + uint64_t bi_kernend; /* end of kernel space */ + uint64_t bi_envp; /* environment */ +}; + +extern struct bootinfo bootinfo; diff --git a/StdLib/Include/Ipf/machine/bswap.h b/StdLib/Include/Ipf/machine/bswap.h new file mode 100644 index 0000000000..e3c52b5fa7 --- /dev/null +++ b/StdLib/Include/Ipf/machine/bswap.h @@ -0,0 +1,8 @@ +/* $NetBSD: bswap.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +#ifndef _MACHINE_BSWAP_H_ +#define _MACHINE_BSWAP_H_ + +#include + +#endif /* !_MACHINE_BSWAP_H_ */ diff --git a/StdLib/Include/Ipf/machine/cdefs.h b/StdLib/Include/Ipf/machine/cdefs.h new file mode 100644 index 0000000000..f1b4ddc56d --- /dev/null +++ b/StdLib/Include/Ipf/machine/cdefs.h @@ -0,0 +1,11 @@ +/* $NetBSD: cdefs.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +#ifndef _MACHINE_CDEFS_H_ +#define _MACHINE_CDEFS_H_ + +/* We're elf only: inspected by sys/cdefs.h */ +#ifndef __ELF__ +#define __ELF__ +#endif + +#endif /* !_MACHINE_CDEFS_H_ */ diff --git a/StdLib/Include/Ipf/machine/cpu.h b/StdLib/Include/Ipf/machine/cpu.h new file mode 100644 index 0000000000..33d70dd83e --- /dev/null +++ b/StdLib/Include/Ipf/machine/cpu.h @@ -0,0 +1,180 @@ +/* $NetBSD: cpu.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, + * NASA Ames Research Center, and by Charles M. Hannum. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + + +/*- + * Copyright (c) 1988 University of Utah. + * Copyright (c) 1982, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * the Systems Programming Group of the University of Utah Computer + * Science Department. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: Utah $Hdr: cpu.h 1.16 91/03/25$ + * + * @(#)cpu.h 8.4 (Berkeley) 1/5/94 + */ + + +#ifndef _IA64_CPU_H_ +#define _IA64_CPU_H_ + +#ifdef _KERNEL +#include +#include +#include +#include + + +struct cpu_info { + struct device *ci_dev; /* pointer to our device */ + struct cpu_info *ci_self; /* self-pointer */ + /* + * Public members. + */ + struct lwp *ci_curlwp; /* current owner of the processor */ + struct cpu_data ci_data; /* MI per-cpu data */ + struct cc_microtime_state ci_cc;/* cc_microtime state */ + struct cpu_info *ci_next; /* next cpu_info structure */ + + /* XXX: Todo */ + /* + * Private members. + */ + cpuid_t ci_cpuid; /* our CPU ID */ + struct pmap *ci_pmap; /* current pmap */ + struct lwp *ci_fpcurlwp; /* current owner of the FPU */ + paddr_t ci_curpcb; /* PA of current HW PCB */ + struct pcb *ci_idle_pcb; /* our idle PCB */ + struct cpu_softc *ci_softc; /* pointer to our device */ + u_long ci_want_resched; /* preempt current process */ + u_long ci_intrdepth; /* interrupt trap depth */ + struct trapframe *ci_db_regs; /* registers for debuggers */ +}; + + +extern struct cpu_info cpu_info_primary; + +#ifdef MULTIPROCESSOR +/* XXX: TODO */ +#else +#define curcpu() (&cpu_info_primary) +#endif /* MULTIPROCESSOR */ + +#define cpu_number() 0 /*XXX: FIXME */ + +#define aston(p) ((p)->p_md.md_astpending = 1) + +#define need_resched(ci) /*XXX: FIXME */ + +struct clockframe { + struct trapframe cf_tf; +}; + +#define CLKF_PC(cf) ((cf)->cf_tf.tf_special.iip) +#define CLKF_CPL(cf) ((cf)->cf_tf.tf_special.psr & IA64_PSR_CPL) +#define CLKF_USERMODE(cf) (CLKF_CPL(cf) != IA64_PSR_CPL_KERN) +#define CLKF_BASEPRI(frame) (0) /*XXX: CHECKME */ +#define CLKF_INTR(frame) (curcpu()->ci_intrdepth) + +#define TRAPF_PC(tf) ((tf)->tf_special.iip) +#define TRAPF_CPL(tf) ((tf)->tf_special.psr & IA64_PSR_CPL) +#define TRAPF_USERMODE(tf) (TRAPF_CPL(tf) != IA64_PSR_CPL_KERN) + + + + + + + +/* + * Give a profiling tick to the current process when the user profiling + * buffer pages are invalid. XXX:Fixme.... On the ia64 I haven't yet figured + * out what to do about this.. XXX. + */ + + +#define need_proftick(p) + +/* + * Notify the current process (p) that it has a signal pending, + * process as soon as possible. + */ +#define signotify(p) aston(p) + +#define setsoftclock() /*XXX: FIXME */ + +/* machdep.c */ +int cpu_maxproc(void); /*XXX: Fill in machdep.c */ + +#define cpu_proc_fork(p1, p2) /* XXX: Look into this. */ + + +/* XXX: TODO: generic microtime support kern/kern_microtime.c + * #define microtime(tv) cc_microtime(tv) + */ + + +#endif /* _KERNEL_ */ +#endif /* _IA64_CPU_H */ diff --git a/StdLib/Include/Ipf/machine/cpu_counter.h b/StdLib/Include/Ipf/machine/cpu_counter.h new file mode 100644 index 0000000000..e28ab24ef2 --- /dev/null +++ b/StdLib/Include/Ipf/machine/cpu_counter.h @@ -0,0 +1,78 @@ +/* $NetBSD: cpu_counter.h,v 1.1 2006/09/20 13:33:04 kochi Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Takayoshi Kochi. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _IA64_CPU_COUNTER_H_ +#define _IA64_CPU_COUNTER_H_ + +/* + * Machine-specific support for CPU counter. + */ + +#ifdef _KERNEL + +#include + +static __inline int +cpu_hascounter(void) +{ + return 1; +} + +static __inline uint64_t +cpu_counter(void) +{ + return ia64_get_itc(); +} + +static __inline uint32_t +cpu_counter32(void) +{ + return (ia64_get_itc() & 0xffffffffUL); +} + +static __inline uint64_t +cpu_frequency(struct cpu_info *ci) +{ + extern uint64_t itc_frequency; + + return itc_frequency; +} + +#endif /* _KERNEL */ + +#endif /* !_IA64_CPU_COUNTER_H_ */ diff --git a/StdLib/Include/Ipf/machine/db_machdep.h b/StdLib/Include/Ipf/machine/db_machdep.h new file mode 100644 index 0000000000..94739fd337 --- /dev/null +++ b/StdLib/Include/Ipf/machine/db_machdep.h @@ -0,0 +1,202 @@ +/* $NetBSD: db_machdep.h,v 1.2 2006/08/30 11:12:04 cherry Exp $ */ + +/* + * Copyright (c) 1995 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#ifndef _IA64_DB_MACHDEP_H_ +#define _IA64_DB_MACHDEP_H_ + +/* + * Machine-dependent defines for new kernel debugger. + */ + +#include +#include +#include +#include +#include + +typedef vaddr_t db_addr_t; /* address - unsigned */ +typedef long db_expr_t; /* expression - signed */ + +typedef struct trapframe db_regs_t; +extern db_regs_t *ddb_regp; /* pointer to current register state */ +#define DDB_REGS (ddb_regp) + +#if 0 /* XXX: disabling this until we switch on makectx()and have a proper \ + curlwp(). TODO: please switch this back on ASAP */ + +#define PC_REGS(regs) ((db_addr_t)(regs)->tf_special.__spare == 0) ? \ + ((db_addr_t)(regs)->tf_special.rp) : \ + ((db_addr_t)(regs)->tf_special.iip + (((regs)->tf_special.psr>>41) & 3)) +#endif + +#if 1 +#define PC_REGS(regs) ((db_addr_t)(regs)->tf_special.iip + (((regs)->tf_special.psr>>41) & 3)) +#endif + +#define db_set_single_step(regs) ((regs)->tf_special.psr |= IA64_PSR_SS) +#define db_clear_single_step(regs) ((regs)->tf_special.psr &= ~IA64_PSR_SS) + + + +/* defines to help with manipulating ia64 VLIW instruction bundles and slots */ + +#define TMPL_BITS 5 +#define TMPL_MASK ((1 << TMPL_BITS) - 1) +#define SLOT_BITS 41 +#define SLOT_COUNT 3 +#define SLOT_MASK ((1ULL << SLOT_BITS) - 1ULL) +#define SLOT_SHIFT(i) (TMPL_BITS+((i)<<3)+(i)) + +#define ADDR_SLOT0(addr) ( (addr) & ~(0xFUL) ) +#define SLOT_ADDR(addr) ( (addr) & (0xFUL) ) +/* breakpoint address. + * Check for violations of pseudo offsets above 2. + * Adjust for 32 bit shift within Bundle. + */ + +#define BKPT_ADDR(addr) ( (SLOT_ADDR(addr) < SLOT_COUNT) ? \ + (ADDR_SLOT0(addr) | (SLOT_ADDR(addr) << 2)) \ + : ADDR_SLOT0(addr) ) + +#define BKPT_SIZE 8 + +#define BKPT_SET(inst, addr) db_bkpt_set(inst, addr) +db_expr_t db_bkpt_set(db_expr_t inst, db_addr_t addr); + + +#define PC_ADVANCE(regs) db_pc_advance(regs) +void db_pc_advance(db_regs_t *); + +#define IS_BREAKPOINT_TRAP(type, code) (type == IA64_VEC_BREAK) +#define IS_WATCHPOINT_TRAP(type, code) 0 + + +#define inst_trap_return(ins) (ins & 0) +#define inst_return(ins) (ins & 0) +#define inst_call(ins) (ins & 0) +#define inst_branch(ins) (ins & 0) +#define inst_load(ins) (ins & 0) +#define inst_store(ins) (ins & 0) +#define inst_unconditional_flow_transfer(ins) (ins & 0) + +#define branch_taken(ins, pc, regs) pc + +u_long db_register_value(db_regs_t *, int); +int ddb_trap(unsigned long, unsigned long, unsigned long, + unsigned long, struct trapframe *); + +int ia64_trap(int, int, db_regs_t *); /* See: trap.c */ + +/* + * We define some of our own commands. + */ +#define DB_MACHINE_COMMANDS + +/* + * We use Elf64 symbols in DDB. + */ +#define DB_ELF_SYMBOLS +#define DB_ELFSIZE 64 + +/* + * Stuff for KGDB. + */ +typedef long kgdb_reg_t; +#define KGDB_NUMREGS 66 /* from tm-alpha.h, NUM_REGS */ +#define KGDB_REG_V0 0 +#define KGDB_REG_T0 1 +#define KGDB_REG_T1 2 +#define KGDB_REG_T2 3 +#define KGDB_REG_T3 4 +#define KGDB_REG_T4 5 +#define KGDB_REG_T5 6 +#define KGDB_REG_T6 7 +#define KGDB_REG_T7 8 +#define KGDB_REG_S0 9 +#define KGDB_REG_S1 10 +#define KGDB_REG_S2 11 +#define KGDB_REG_S3 12 +#define KGDB_REG_S4 13 +#define KGDB_REG_S5 14 +#define KGDB_REG_S6 15 /* FP */ +#define KGDB_REG_A0 16 +#define KGDB_REG_A1 17 +#define KGDB_REG_A2 18 +#define KGDB_REG_A3 19 +#define KGDB_REG_A4 20 +#define KGDB_REG_A5 21 +#define KGDB_REG_T8 22 +#define KGDB_REG_T9 23 +#define KGDB_REG_T10 24 +#define KGDB_REG_T11 25 +#define KGDB_REG_RA 26 +#define KGDB_REG_T12 27 +#define KGDB_REG_AT 28 +#define KGDB_REG_GP 29 +#define KGDB_REG_SP 30 +#define KGDB_REG_ZERO 31 +#define KGDB_REG_F0 32 +#define KGDB_REG_F1 33 +#define KGDB_REG_F2 34 +#define KGDB_REG_F3 35 +#define KGDB_REG_F4 36 +#define KGDB_REG_F5 37 +#define KGDB_REG_F6 38 +#define KGDB_REG_F7 39 +#define KGDB_REG_F8 40 +#define KGDB_REG_F9 41 +#define KGDB_REG_F10 42 +#define KGDB_REG_F11 43 +#define KGDB_REG_F12 44 +#define KGDB_REG_F13 45 +#define KGDB_REG_F14 46 +#define KGDB_REG_F15 47 +#define KGDB_REG_F16 48 +#define KGDB_REG_F17 49 +#define KGDB_REG_F18 50 +#define KGDB_REG_F19 51 +#define KGDB_REG_F20 52 +#define KGDB_REG_F21 53 +#define KGDB_REG_F22 54 +#define KGDB_REG_F23 55 +#define KGDB_REG_F24 56 +#define KGDB_REG_F25 57 +#define KGDB_REG_F26 58 +#define KGDB_REG_F27 59 +#define KGDB_REG_F28 60 +#define KGDB_REG_F29 61 +#define KGDB_REG_F30 62 +#define KGDB_REG_F31 63 +#define KGDB_REG_PC 64 +#define KGDB_REG_VFP 65 + +/* Too much? Must be large enough for register transfer. */ +#define KGDB_BUFLEN 1024 + +#endif /* _IA64_DB_MACHDEP_H_ */ diff --git a/StdLib/Include/Ipf/machine/dig64.h b/StdLib/Include/Ipf/machine/dig64.h new file mode 100644 index 0000000000..690845800a --- /dev/null +++ b/StdLib/Include/Ipf/machine/dig64.h @@ -0,0 +1,92 @@ +/* $NetBSD: dig64.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 2002 Marcel Moolenaar + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _MACHINE_DIG64_H_ +#define _MACHINE_DIG64_H_ + +struct dig64_gas { + uint8_t addr_space; + uint8_t bit_width; + uint8_t bit_offset; + uint8_t _reserved_; + /* + * XXX using a 64-bit type for the address would cause padding and + * using __packed would cause unaligned accesses... + */ + uint32_t addr_low; + uint32_t addr_high; +}; + +struct dig64_hcdp_entry { + uint8_t type; +#define DIG64_HCDP_CONSOLE 0 +#define DIG64_HCDP_DBGPORT 1 + uint8_t databits; + uint8_t parity; + uint8_t stopbits; + uint8_t pci_segment; + uint8_t pci_bus; + uint8_t pci_device:5; + uint8_t _reserved1_:3; + uint8_t pci_function:3; + uint8_t _reserved2_:3; + uint8_t interrupt:1; + uint8_t pci_flag:1; + /* + * XXX using a 64-bit type for the baudrate would cause padding and + * using __packed would cause unaligned accesses... + */ + uint32_t baud_low; + uint32_t baud_high; + struct dig64_gas address; + uint16_t pci_devid; + uint16_t pci_vendor; + uint32_t irq; + uint32_t pclock; + uint8_t pci_interface; + uint8_t _reserved3_[7]; +}; + +struct dig64_hcdp_table { + char signature[4]; +#define HCDP_SIGNATURE "HCDP" + uint32_t length; + uint8_t revision; + uint8_t checksum; + char oem_id[6]; + char oem_tbl_id[8]; + uint32_t oem_rev; + char creator_id[4]; + uint32_t creator_rev; + uint32_t entries; + struct dig64_hcdp_entry entry[1]; +}; + +#endif diff --git a/StdLib/Include/Ipf/machine/disklabel.h b/StdLib/Include/Ipf/machine/disklabel.h new file mode 100644 index 0000000000..34b9b6c5aa --- /dev/null +++ b/StdLib/Include/Ipf/machine/disklabel.h @@ -0,0 +1,73 @@ +/* $NetBSD: disklabel.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/* + * Copyright (c) 1994 Christopher G. Demetriou + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Christopher G. Demetriou. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _MACHINE_DISKLABEL_H_ +#define _MACHINE_DISKLABEL_H_ + +#define LABELSECTOR 1 /* sector containing label */ +#define LABELOFFSET 0 /* offset of label in sector */ +#define MAXPARTITIONS 16 /* number of partitions */ +#define OLDMAXPARTITIONS 8 /* number of partitions before 1.6 */ +#define RAW_PART 3 /* raw partition: XX?d (XXX) */ + +/* + * We use the highest bit of the minor number for the partition number. + * This maintains backward compatibility with device nodes created before + * MAXPARTITIONS was increased. + */ +#define __I386_MAXDISKS ((1 << 20) / MAXPARTITIONS) +#define DISKUNIT(dev) ((minor(dev) / OLDMAXPARTITIONS) % __I386_MAXDISKS) +#define DISKPART(dev) ((minor(dev) % OLDMAXPARTITIONS) + \ + ((minor(dev) / (__I386_MAXDISKS * OLDMAXPARTITIONS)) * OLDMAXPARTITIONS)) +#define DISKMINOR(unit, part) \ + (((unit) * OLDMAXPARTITIONS) + ((part) % OLDMAXPARTITIONS) + \ + ((part) / OLDMAXPARTITIONS) * (__I386_MAXDISKS * OLDMAXPARTITIONS)) + +/* Pull in MBR partition definitions. */ +#if HAVE_NBTOOL_CONFIG_H +#include +#else +#include +#endif /* HAVE_NBTOOL_CONFIG_H */ + +#ifndef __ASSEMBLER__ +#if HAVE_NBTOOL_CONFIG_H +#include +#else +#include +#endif /* HAVE_NBTOOL_CONFIG_H */ +struct cpu_disklabel { + struct dkbad bad; +}; +#endif + +#endif /* _MACHINE_DISKLABEL_H_ */ diff --git a/StdLib/Include/Ipf/machine/efi.h b/StdLib/Include/Ipf/machine/efi.h new file mode 100644 index 0000000000..67cf901e15 --- /dev/null +++ b/StdLib/Include/Ipf/machine/efi.h @@ -0,0 +1,165 @@ +/* $NetBSD: efi.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 2004 Marcel Moolenaar + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _MACHINE_EFI_H_ +#define _MACHINE_EFI_H_ + +#include + +#define EFI_PAGE_SHIFT 12 +#define EFI_PAGE_SIZE (1 << EFI_PAGE_SHIFT) +#define EFI_PAGE_MASK (EFI_PAGE_SIZE - 1) + +#define EFI_TABLE_ACPI20 \ + {0x8868e871,0xe4f1,0x11d3,0xbc,0x22,{0x00,0x80,0xc7,0x3c,0x88,0x81}} +#define EFI_TABLE_SAL \ + {0xeb9d2d32,0x2d88,0x11d3,0x9a,0x16,{0x00,0x90,0x27,0x3f,0xc1,0x4d}} + +enum efi_reset { + EFI_RESET_COLD, + EFI_RESET_WARM +}; + +typedef uint16_t efi_char; +typedef unsigned long efi_status; + +struct efi_cfgtbl { + struct uuid ct_uuid; + uint64_t ct_data; +}; + +struct efi_md { + uint32_t md_type; +#define EFI_MD_TYPE_NULL 0 +#define EFI_MD_TYPE_CODE 1 /* Loader text. */ +#define EFI_MD_TYPE_DATA 2 /* Loader data. */ +#define EFI_MD_TYPE_BS_CODE 3 /* Boot services text. */ +#define EFI_MD_TYPE_BS_DATA 4 /* Boot services data. */ +#define EFI_MD_TYPE_RT_CODE 5 /* Runtime services text. */ +#define EFI_MD_TYPE_RT_DATA 6 /* Runtime services data. */ +#define EFI_MD_TYPE_FREE 7 /* Unused/free memory. */ +#define EFI_MD_TYPE_BAD 8 /* Bad memory */ +#define EFI_MD_TYPE_RECLAIM 9 /* ACPI reclaimable memory. */ +#define EFI_MD_TYPE_FIRMWARE 10 /* ACPI NV memory */ +#define EFI_MD_TYPE_IOMEM 11 /* Memory-mapped I/O. */ +#define EFI_MD_TYPE_IOPORT 12 /* I/O port space. */ +#define EFI_MD_TYPE_PALCODE 13 /* PAL */ + uint32_t __pad; + uint64_t md_phys; + void *md_virt; + uint64_t md_pages; + uint64_t md_attr; +#define EFI_MD_ATTR_UC 0x0000000000000001UL +#define EFI_MD_ATTR_WC 0x0000000000000002UL +#define EFI_MD_ATTR_WT 0x0000000000000004UL +#define EFI_MD_ATTR_WB 0x0000000000000008UL +#define EFI_MD_ATTR_UCE 0x0000000000000010UL +#define EFI_MD_ATTR_WP 0x0000000000001000UL +#define EFI_MD_ATTR_RP 0x0000000000002000UL +#define EFI_MD_ATTR_XP 0x0000000000004000UL +#define EFI_MD_ATTR_RT 0x8000000000000000UL +}; + +struct efi_tm { + uint16_t tm_year; /* 1998 - 20XX */ + uint8_t tm_mon; /* 1 - 12 */ + uint8_t tm_mday; /* 1 - 31 */ + uint8_t tm_hour; /* 0 - 23 */ + uint8_t tm_min; /* 0 - 59 */ + uint8_t tm_sec; /* 0 - 59 */ + uint8_t __pad1; + uint32_t tm_nsec; /* 0 - 999,999,999 */ + int16_t tm_tz; /* -1440 to 1440 or 2047 */ + uint8_t tm_dst; + uint8_t __pad2; +}; + +struct efi_tmcap { + uint32_t tc_res; /* 1e-6 parts per million */ + uint32_t tc_prec; /* hertz */ + uint8_t tc_stz; /* Set clears sub-second time */ +}; + +struct efi_tblhdr { + uint64_t th_sig; + uint32_t th_rev; + uint32_t th_hdrsz; + uint32_t th_crc32; + uint32_t __res; +}; + +struct efi_rt { + struct efi_tblhdr rt_hdr; + efi_status (*rt_gettime)(struct efi_tm *, struct efi_tmcap *); + efi_status (*rt_settime)(struct efi_tm *); + efi_status (*rt_getwaketime)(uint8_t *, uint8_t *, + struct efi_tm *); + efi_status (*rt_setwaketime)(uint8_t, struct efi_tm *); + efi_status (*rt_setvirtual)(u_long, u_long, uint32_t, + struct efi_md *); + efi_status (*rt_cvtptr)(u_long, void **); + efi_status (*rt_getvar)(efi_char *, struct uuid *, uint32_t *, + u_long *, void *); + efi_status (*rt_scanvar)(u_long *, efi_char *, struct uuid *); + efi_status (*rt_setvar)(efi_char *, struct uuid *, uint32_t, + u_long, void *); + efi_status (*rt_gethicnt)(uint32_t *); + efi_status (*rt_reset)(enum efi_reset, efi_status, u_long, + efi_char *); +}; + +struct efi_systbl { + struct efi_tblhdr st_hdr; +#define EFI_SYSTBL_SIG 0x5453595320494249UL + efi_char *st_fwvendor; + uint32_t st_fwrev; + uint32_t __pad; + void *st_cin; + void *st_cinif; + void *st_cout; + void *st_coutif; + void *st_cerr; + void *st_cerrif; + uint64_t st_rt; + void *st_bs; + u_long st_entries; + uint64_t st_cfgtbl; +}; + +void efi_boot_finish(void); +int efi_boot_minimal(uint64_t); +void *efi_get_table(struct uuid *); +void efi_get_time(struct efi_tm *); +struct efi_md *efi_md_first(void); +struct efi_md *efi_md_next(struct efi_md *); +void efi_reset_system(void); +efi_status efi_set_time(struct efi_tm *); + +#endif /* _MACHINE_EFI_H_ */ diff --git a/StdLib/Include/Ipf/machine/elf_machdep.h b/StdLib/Include/Ipf/machine/elf_machdep.h new file mode 100644 index 0000000000..2cbb3d3daf --- /dev/null +++ b/StdLib/Include/Ipf/machine/elf_machdep.h @@ -0,0 +1,150 @@ +/* $NetBSD */ + +/*- + * Copyright (c) 1996-1997 John D. Polstra. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/sys/ia64/include/elf.h,v 1.11 2003/09/25 01:10:24 peter Exp $ + */ + + +#define ELF32_MACHDEP_ENDIANNESS XXX /* break compilation */ +#define ELF32_MACHDEP_ID_CASES \ + /* no 32-bit ELF machine types supported until 32bit emu */ + +#define ELF64_MACHDEP_ENDIANNESS ELFDATA2LSB +#define ELF64_MACHDEP_ID_CASES \ + case EM_IA_64: \ + break; + +#define ELF64_MACHDEP_ID EM_IA_64 /* XXX */ + +#define ARCH_ELFSIZE 64 /* MD native binary size */ + +/* + * Relocation types. + */ + +/* Name Value Field Calculation */ +#define R_IA64_NONE 0 /* None */ +#define R_IA64_IMM14 0x21 /* immediate14 S + A */ +#define R_IA64_IMM22 0x22 /* immediate22 S + A */ +#define R_IA64_IMM64 0x23 /* immediate64 S + A */ +#define R_IA64_DIR32MSB 0x24 /* word32 MSB S + A */ +#define R_IA64_DIR32LSB 0x25 /* word32 LSB S + A */ +#define R_IA64_DIR64MSB 0x26 /* word64 MSB S + A */ +#define R_IA64_DIR64LSB 0x27 /* word64 LSB S + A */ +#define R_IA64_GPREL22 0x2a /* immediate22 @gprel(S + A) */ +#define R_IA64_GPREL64I 0x2b /* immediate64 @gprel(S + A) */ +#define R_IA64_GPREL64MSB 0x2e /* word64 MSB @gprel(S + A) */ +#define R_IA64_GPREL64LSB 0x2f /* word64 LSB @gprel(S + A) */ +#define R_IA64_LTOFF22 0x32 /* immediate22 @ltoff(S + A) */ +#define R_IA64_LTOFF64I 0x33 /* immediate64 @ltoff(S + A) */ +#define R_IA64_PLTOFF22 0x3a /* immediate22 @pltoff(S + A) */ +#define R_IA64_PLTOFF64I 0x3b /* immediate64 @pltoff(S + A) */ +#define R_IA64_PLTOFF64MSB 0x3e /* word64 MSB @pltoff(S + A) */ +#define R_IA64_PLTOFF64LSB 0x3f /* word64 LSB @pltoff(S + A) */ +#define R_IA64_FPTR64I 0x43 /* immediate64 @fptr(S + A) */ +#define R_IA64_FPTR32MSB 0x44 /* word32 MSB @fptr(S + A) */ +#define R_IA64_FPTR32LSB 0x45 /* word32 LSB @fptr(S + A) */ +#define R_IA64_FPTR64MSB 0x46 /* word64 MSB @fptr(S + A) */ +#define R_IA64_FPTR64LSB 0x47 /* word64 LSB @fptr(S + A) */ +#define R_IA64_PCREL21B 0x49 /* immediate21 form1 S + A - P */ +#define R_IA64_PCREL21M 0x4a /* immediate21 form2 S + A - P */ +#define R_IA64_PCREL21F 0x4b /* immediate21 form3 S + A - P */ +#define R_IA64_PCREL32MSB 0x4c /* word32 MSB S + A - P */ +#define R_IA64_PCREL32LSB 0x4d /* word32 LSB S + A - P */ +#define R_IA64_PCREL64MSB 0x4e /* word64 MSB S + A - P */ +#define R_IA64_PCREL64LSB 0x4f /* word64 LSB S + A - P */ +#define R_IA64_LTOFF_FPTR22 0x52 /* immediate22 @ltoff(@fptr(S + A)) */ +#define R_IA64_LTOFF_FPTR64I 0x53 /* immediate64 @ltoff(@fptr(S + A)) */ +#define R_IA64_LTOFF_FPTR32MSB 0x54 /* word32 MSB @ltoff(@fptr(S + A)) */ +#define R_IA64_LTOFF_FPTR32LSB 0x55 /* word32 LSB @ltoff(@fptr(S + A)) */ +#define R_IA64_LTOFF_FPTR64MSB 0x56 /* word64 MSB @ltoff(@fptr(S + A)) */ +#define R_IA64_LTOFF_FPTR64LSB 0x57 /* word64 LSB @ltoff(@fptr(S + A)) */ +#define R_IA64_SEGREL32MSB 0x5c /* word32 MSB @segrel(S + A) */ +#define R_IA64_SEGREL32LSB 0x5d /* word32 LSB @segrel(S + A) */ +#define R_IA64_SEGREL64MSB 0x5e /* word64 MSB @segrel(S + A) */ +#define R_IA64_SEGREL64LSB 0x5f /* word64 LSB @segrel(S + A) */ +#define R_IA64_SECREL32MSB 0x64 /* word32 MSB @secrel(S + A) */ +#define R_IA64_SECREL32LSB 0x65 /* word32 LSB @secrel(S + A) */ +#define R_IA64_SECREL64MSB 0x66 /* word64 MSB @secrel(S + A) */ +#define R_IA64_SECREL64LSB 0x67 /* word64 LSB @secrel(S + A) */ +#define R_IA64_REL32MSB 0x6c /* word32 MSB BD + A */ +#define R_IA64_REL32LSB 0x6d /* word32 LSB BD + A */ +#define R_IA64_REL64MSB 0x6e /* word64 MSB BD + A */ +#define R_IA64_REL64LSB 0x6f /* word64 LSB BD + A */ +#define R_IA64_LTV32MSB 0x74 /* word32 MSB S + A */ +#define R_IA64_LTV32LSB 0x75 /* word32 LSB S + A */ +#define R_IA64_LTV64MSB 0x76 /* word64 MSB S + A */ +#define R_IA64_LTV64LSB 0x77 /* word64 LSB S + A */ +#define R_IA64_IPLTMSB 0x80 /* function descriptor MSB special */ +#define R_IA64_IPLTLSB 0x81 /* function descriptor LSB speciaal */ +#define R_IA64_SUB 0x85 /* immediate64 A - S */ +#define R_IA64_LTOFF22X 0x86 /* immediate22 special */ +#define R_IA64_LDXMOV 0x87 /* immediate22 special */ +#define R_IA64_TPREL14 0x91 /* imm14 @tprel(S + A) */ +#define R_IA64_TPREL22 0x92 /* imm22 @tprel(S + A) */ +#define R_IA64_TPREL64I 0x93 /* imm64 @tprel(S + A) */ +#define R_IA64_TPREL64MSB 0x96 /* word64 MSB @tprel(S + A) */ +#define R_IA64_TPREL64LSB 0x97 /* word64 LSB @tprel(S + A) */ +#define R_IA64_LTOFF_TPREL22 0x9a /* imm22 @ltoff(@tprel(S+A)) */ +#define R_IA64_DTPMOD64MSB 0xa6 /* word64 MSB @dtpmod(S + A) */ +#define R_IA64_DTPMOD64LSB 0xa7 /* word64 LSB @dtpmod(S + A) */ +#define R_IA64_LTOFF_DTPMOD22 0xaa /* imm22 @ltoff(@dtpmod(S+A)) */ +#define R_IA64_DTPREL14 0xb1 /* imm14 @dtprel(S + A) */ +#define R_IA64_DTPREL22 0xb2 /* imm22 @dtprel(S + A) */ +#define R_IA64_DTPREL64I 0xb3 /* imm64 @dtprel(S + A) */ +#define R_IA64_DTPREL32MSB 0xb4 /* word32 MSB @dtprel(S + A) */ +#define R_IA64_DTPREL32LSB 0xb5 /* word32 LSB @dtprel(S + A) */ +#define R_IA64_DTPREL64MSB 0xb6 /* word64 MSB @dtprel(S + A) */ +#define R_IA64_DTPREL64LSB 0xb7 /* word64 LSB @dtprel(S + A) */ +#define R_IA64_LTOFF_DTPREL22 0xba /* imm22 @ltoff(@dtprel(S+A)) */ + +/* p_type */ + +#define PT_IA_64_ARCHEXT 0x70000000 /* segment contains a section of type SHT_IA_64_EXT */ +#define PT_IA_64_UNWIND 0x70000001 /* segment contains the stack unwind tables */ + +/* p_flags */ + +#define PF_IA_64_NORECOV 0x80000000 /* segment contains the stack unwind tables */ + +/* sh_type */ + +#define SHT_IA_64_EXT 0x70000000 /* section contains product specific extension bits */ +#define SHT_IA_64_UNWIND 0x70000001 /* section contains unwind function table entries for stack unwinding */ +#define SHT_IA_64_LOPSREG 0x78000000 /* reserved for implementation-specific section types */ +#define SHT_IA_64_HIPSREG 0x7fffffff /* Ditto */ +#define SHT_IA_64_PRIORITY_INIT 0x79000000 /* section contains priority initialization record */ + +/* sh_flags */ + +#define SHF_IA_64_SHORT 0x10000000 /* section must be placed near gp. */ +#define SHF_IA_64_NORECOV 0x20000000 /* section contains code that uses speculative instructions without + * recovery code + */ + + + diff --git a/StdLib/Include/Ipf/machine/endian.h b/StdLib/Include/Ipf/machine/endian.h new file mode 100644 index 0000000000..3c2244efa3 --- /dev/null +++ b/StdLib/Include/Ipf/machine/endian.h @@ -0,0 +1,3 @@ +/* $NetBSD: endian.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +#include diff --git a/StdLib/Include/Ipf/machine/endian_machdep.h b/StdLib/Include/Ipf/machine/endian_machdep.h new file mode 100644 index 0000000000..7d69f7b16a --- /dev/null +++ b/StdLib/Include/Ipf/machine/endian_machdep.h @@ -0,0 +1,3 @@ +/* $NetBSD: endian_machdep.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +#define _BYTE_ORDER _LITTLE_ENDIAN diff --git a/StdLib/Include/Ipf/machine/float.h b/StdLib/Include/Ipf/machine/float.h new file mode 100644 index 0000000000..2cf8fecb44 --- /dev/null +++ b/StdLib/Include/Ipf/machine/float.h @@ -0,0 +1,30 @@ +/* $NetBSD: float.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +#include + + +/* #ifndef _IA64_FLOAT_H_ */ +/* #define _IA64_FLOAT_H_ */ + +/* #define LDBL_MANT_DIG 64 */ +/* #define LDBL_EPSILON 1.0842021724855044340E-19L */ +/* #define LDBL_DIG 18 */ +/* #define LDBL_MIN_EXP (-16381) */ +/* #define LDBL_MIN 3.3621031431120935063E-4932L */ +/* #define LDBL_MIN_10_EXP (-4931) */ +/* #define LDBL_MAX_EXP 16384 */ +/* #define LDBL_MAX 1.1897314953572317650E+4932L */ +/* #define LDBL_MAX_10_EXP 4932 */ + +/* #include */ + +/* #if !defined(_ANSI_SOURCE) && !defined(_POSIX_C_SOURCE) && \ */ +/* !defined(_XOPEN_SOURCE) || \ */ +/* ((__STDC_VERSION__ - 0) >= 199901L) || \ */ +/* ((_POSIX_C_SOURCE - 0) >= 200112L) || \ */ +/* ((_XOPEN_SOURCE - 0) >= 600) || \ */ +/* defined(_ISOC99_SOURCE) || defined(_NETBSD_SOURCE) */ +/* #define DECIMAL_DIG 35 */ +/* #endif /\* !defined(_ANSI_SOURCE) && ... *\/ */ + +/* #endif /\* _IA64_FLOAT_H_ *\/ */ diff --git a/StdLib/Include/Ipf/machine/ia64_cpu.h b/StdLib/Include/Ipf/machine/ia64_cpu.h new file mode 100644 index 0000000000..075bfbeff1 --- /dev/null +++ b/StdLib/Include/Ipf/machine/ia64_cpu.h @@ -0,0 +1,427 @@ +/* $NetBSD: ia64_cpu.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 2000 Doug Rabson + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _MACHINE_IA64_CPU_H_ +#define _MACHINE_IA64_CPU_H_ + +/* + * Definition of PSR and IPSR bits. + */ +#define IA64_PSR_BE 0x0000000000000002 +#define IA64_PSR_UP 0x0000000000000004 +#define IA64_PSR_AC 0x0000000000000008 +#define IA64_PSR_MFL 0x0000000000000010 +#define IA64_PSR_MFH 0x0000000000000020 +#define IA64_PSR_IC 0x0000000000002000 +#define IA64_PSR_I 0x0000000000004000 +#define IA64_PSR_PK 0x0000000000008000 +#define IA64_PSR_DT 0x0000000000020000 +#define IA64_PSR_DFL 0x0000000000040000 +#define IA64_PSR_DFH 0x0000000000080000 +#define IA64_PSR_SP 0x0000000000100000 +#define IA64_PSR_PP 0x0000000000200000 +#define IA64_PSR_DI 0x0000000000400000 +#define IA64_PSR_SI 0x0000000000800000 +#define IA64_PSR_DB 0x0000000001000000 +#define IA64_PSR_LP 0x0000000002000000 +#define IA64_PSR_TB 0x0000000004000000 +#define IA64_PSR_RT 0x0000000008000000 +#define IA64_PSR_CPL 0x0000000300000000 +#define IA64_PSR_CPL_KERN 0x0000000000000000 +#define IA64_PSR_CPL_1 0x0000000100000000 +#define IA64_PSR_CPL_2 0x0000000200000000 +#define IA64_PSR_CPL_USER 0x0000000300000000 +#define IA64_PSR_IS 0x0000000400000000 +#define IA64_PSR_MC 0x0000000800000000 +#define IA64_PSR_IT 0x0000001000000000 +#define IA64_PSR_ID 0x0000002000000000 +#define IA64_PSR_DA 0x0000004000000000 +#define IA64_PSR_DD 0x0000008000000000 +#define IA64_PSR_SS 0x0000010000000000 +#define IA64_PSR_RI 0x0000060000000000 +#define IA64_PSR_RI_0 0x0000000000000000 +#define IA64_PSR_RI_1 0x0000020000000000 +#define IA64_PSR_RI_2 0x0000040000000000 +#define IA64_PSR_ED 0x0000080000000000 +#define IA64_PSR_BN 0x0000100000000000 +#define IA64_PSR_IA 0x0000200000000000 + +/* + * Definition of ISR bits. + */ +#define IA64_ISR_CODE 0x000000000000ffff +#define IA64_ISR_VECTOR 0x0000000000ff0000 +#define IA64_ISR_X 0x0000000100000000 +#define IA64_ISR_W 0x0000000200000000 +#define IA64_ISR_R 0x0000000400000000 +#define IA64_ISR_NA 0x0000000800000000 +#define IA64_ISR_SP 0x0000001000000000 +#define IA64_ISR_RS 0x0000002000000000 +#define IA64_ISR_IR 0x0000004000000000 +#define IA64_ISR_NI 0x0000008000000000 +#define IA64_ISR_SO 0x0000010000000000 +#define IA64_ISR_EI 0x0000060000000000 +#define IA64_ISR_EI_0 0x0000000000000000 +#define IA64_ISR_EI_1 0x0000020000000000 +#define IA64_ISR_EI_2 0x0000040000000000 +#define IA64_ISR_ED 0x0000080000000000 + +/* + * Vector numbers for various ia64 interrupts. + */ +#define IA64_VEC_VHPT 0 +#define IA64_VEC_ITLB 1 +#define IA64_VEC_DTLB 2 +#define IA64_VEC_ALT_ITLB 3 +#define IA64_VEC_ALT_DTLB 4 +#define IA64_VEC_NESTED_DTLB 5 +#define IA64_VEC_IKEY_MISS 6 +#define IA64_VEC_DKEY_MISS 7 +#define IA64_VEC_DIRTY_BIT 8 +#define IA64_VEC_INST_ACCESS 9 +#define IA64_VEC_DATA_ACCESS 10 +#define IA64_VEC_BREAK 11 +#define IA64_VEC_EXT_INTR 12 +#define IA64_VEC_PAGE_NOT_PRESENT 20 +#define IA64_VEC_KEY_PERMISSION 21 +#define IA64_VEC_INST_ACCESS_RIGHTS 22 +#define IA64_VEC_DATA_ACCESS_RIGHTS 23 +#define IA64_VEC_GENERAL_EXCEPTION 24 +#define IA64_VEC_DISABLED_FP 25 +#define IA64_VEC_NAT_CONSUMPTION 26 +#define IA64_VEC_SPECULATION 27 +#define IA64_VEC_DEBUG 29 +#define IA64_VEC_UNALIGNED_REFERENCE 30 +#define IA64_VEC_UNSUPP_DATA_REFERENCE 31 +#define IA64_VEC_FLOATING_POINT_FAULT 32 +#define IA64_VEC_FLOATING_POINT_TRAP 33 +#define IA64_VEC_LOWER_PRIVILEGE_TRANSFER 34 +#define IA64_VEC_TAKEN_BRANCH_TRAP 35 +#define IA64_VEC_SINGLE_STEP_TRAP 36 +#define IA64_VEC_IA32_EXCEPTION 45 +#define IA64_VEC_IA32_INTERCEPT 46 +#define IA64_VEC_IA32_INTERRUPT 47 + +/* + * IA-32 exceptions. + */ +#define IA32_EXCEPTION_DIVIDE 0 +#define IA32_EXCEPTION_DEBUG 1 +#define IA32_EXCEPTION_BREAK 3 +#define IA32_EXCEPTION_OVERFLOW 4 +#define IA32_EXCEPTION_BOUND 5 +#define IA32_EXCEPTION_DNA 7 +#define IA32_EXCEPTION_NOT_PRESENT 11 +#define IA32_EXCEPTION_STACK_FAULT 12 +#define IA32_EXCEPTION_GPFAULT 13 +#define IA32_EXCEPTION_FPERROR 16 +#define IA32_EXCEPTION_ALIGNMENT_CHECK 17 +#define IA32_EXCEPTION_STREAMING_SIMD 19 + +#define IA32_INTERCEPT_INSTRUCTION 0 +#define IA32_INTERCEPT_GATE 1 +#define IA32_INTERCEPT_SYSTEM_FLAG 2 +#define IA32_INTERCEPT_LOCK 4 + +#ifndef _LOCORE + +/* + * Various special ia64 instructions. + */ + +/* + * Memory Fence. + */ +static __inline void +ia64_mf(void) +{ + __asm __volatile("mf"); +} + +static __inline void +ia64_mf_a(void) +{ + __asm __volatile("mf.a"); +} + +/* + * Flush Cache. + */ +static __inline void +ia64_fc(u_int64_t va) +{ + __asm __volatile("fc %0" :: "r"(va)); +} + +/* + * Flush Instruction Cache + */ + +static __inline void +ia64_fc_i(u_int64_t va) +{ + __asm __volatile("fc.i %0" :: "r"(va)); +} + +/* + * Sync instruction stream. + */ +static __inline void +ia64_sync_i(void) +{ + __asm __volatile("sync.i"); +} + +/* + * Calculate address in VHPT for va. + */ +static __inline u_int64_t +ia64_thash(u_int64_t va) +{ + u_int64_t result; + __asm __volatile("thash %0=%1" : "=r" (result) : "r" (va)); + return result; +} + +/* + * Calculate VHPT tag for va. + */ +static __inline u_int64_t +ia64_ttag(u_int64_t va) +{ + u_int64_t result; + __asm __volatile("ttag %0=%1" : "=r" (result) : "r" (va)); + return result; +} + +/* + * Convert virtual address to physical. + */ +static __inline u_int64_t +ia64_tpa(u_int64_t va) +{ + u_int64_t result; + __asm __volatile("tpa %0=%1" : "=r" (result) : "r" (va)); + return result; +} + +/* + * Generate a ptc.e instruction. + */ +static __inline void +ia64_ptc_e(u_int64_t v) +{ + __asm __volatile("ptc.e %0;; srlz.d;;" :: "r"(v)); +} + +/* + * Generate a ptc.g instruction. + */ +static __inline void +ia64_ptc_g(u_int64_t va, u_int64_t log2size) +{ + __asm __volatile("ptc.g %0,%1;; srlz.d;;" :: "r"(va), "r"(log2size)); +} + +/* + * Generate a ptc.ga instruction. + */ +static __inline void +ia64_ptc_ga(u_int64_t va, u_int64_t log2size) +{ + __asm __volatile("ptc.ga %0,%1;; srlz.d;;" :: "r"(va), "r"(log2size)); +} + +/* + * Generate a ptc.l instruction. + */ +static __inline void +ia64_ptc_l(u_int64_t va, u_int64_t log2size) +{ + __asm __volatile("ptc.l %0,%1;; srlz.d;;" :: "r"(va), "r"(log2size)); +} + +/* + * Read the value of psr. + */ +static __inline u_int64_t +ia64_get_psr(void) +{ + u_int64_t result; + __asm __volatile("mov %0=psr;;" : "=r" (result)); + return result; +} + +/* + * Define accessors for application registers. + */ + +#define IA64_AR(name) \ + \ +static __inline u_int64_t \ +ia64_get_##name(void) \ +{ \ + u_int64_t result; \ + __asm __volatile("mov %0=ar." #name : "=r" (result)); \ + return result; \ +} \ + \ +static __inline void \ +ia64_set_##name(u_int64_t v) \ +{ \ + __asm __volatile("mov ar." #name "=%0;;" :: "r" (v)); \ +} + +IA64_AR(k0) +IA64_AR(k1) +IA64_AR(k2) +IA64_AR(k3) +IA64_AR(k4) +IA64_AR(k5) +IA64_AR(k6) +IA64_AR(k7) + +IA64_AR(rsc) +IA64_AR(bsp) +IA64_AR(bspstore) +IA64_AR(rnat) + +IA64_AR(fcr) + +IA64_AR(eflag) +IA64_AR(csd) +IA64_AR(ssd) +IA64_AR(cflg) +IA64_AR(fsr) +IA64_AR(fir) +IA64_AR(fdr) + +IA64_AR(ccv) + +IA64_AR(unat) + +IA64_AR(fpsr) + +IA64_AR(itc) + +IA64_AR(pfs) +IA64_AR(lc) +IA64_AR(ec) + +/* + * Define accessors for control registers. + */ + +#define IA64_CR(name) \ + \ +static __inline u_int64_t \ +ia64_get_##name(void) \ +{ \ + u_int64_t result; \ + __asm __volatile("mov %0=cr." #name : "=r" (result)); \ + return result; \ +} \ + \ +static __inline void \ +ia64_set_##name(u_int64_t v) \ +{ \ + __asm __volatile("mov cr." #name "=%0;;" :: "r" (v)); \ +} + +IA64_CR(dcr) +IA64_CR(itm) +IA64_CR(iva) + +IA64_CR(pta) + +IA64_CR(ipsr) +IA64_CR(isr) + +IA64_CR(iip) +IA64_CR(ifa) +IA64_CR(itir) +IA64_CR(iipa) +IA64_CR(ifs) +IA64_CR(iim) +IA64_CR(iha) + +IA64_CR(lid) +IA64_CR(ivr) +IA64_CR(tpr) +IA64_CR(eoi) +IA64_CR(irr0) +IA64_CR(irr1) +IA64_CR(irr2) +IA64_CR(irr3) +IA64_CR(itv) +IA64_CR(pmv) +IA64_CR(cmcv) + +IA64_CR(lrr0) +IA64_CR(lrr1) + +/* + * Write a region register. + */ +static __inline void +ia64_set_rr(u_int64_t rrbase, u_int64_t v) +{ + __asm __volatile("mov rr[%0]=%1;; srlz.d;;" + :: "r"(rrbase), "r"(v) : "memory"); +} + +/* + * Read a CPUID register. + */ +static __inline u_int64_t +ia64_get_cpuid(int i) +{ + u_int64_t result; + __asm __volatile("mov %0=cpuid[%1]" + : "=r" (result) : "r"(i)); + return result; +} + +static __inline void +ia64_disable_highfp(void) +{ + __asm __volatile("ssm psr.dfh;; srlz.d"); +} + +static __inline void +ia64_enable_highfp(void) +{ + __asm __volatile("rsm psr.dfh;; srlz.d"); +} + +#endif /* !_LOCORE */ + +#endif /* _MACHINE_IA64_CPU_H_ */ + diff --git a/StdLib/Include/Ipf/machine/ieee.h b/StdLib/Include/Ipf/machine/ieee.h new file mode 100644 index 0000000000..783ceeb0c9 --- /dev/null +++ b/StdLib/Include/Ipf/machine/ieee.h @@ -0,0 +1,2 @@ + +#include diff --git a/StdLib/Include/Ipf/machine/ieeefp.h b/StdLib/Include/Ipf/machine/ieeefp.h new file mode 100644 index 0000000000..02662769f0 --- /dev/null +++ b/StdLib/Include/Ipf/machine/ieeefp.h @@ -0,0 +1,48 @@ +/*- + * Copyright (c) 2001 Doug Rabson + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/sys/ia64/include/ieeefp.h,v 1.5.10.1.4.1 2010/06/14 02:09:06 kensmith Exp $ + */ + +#ifndef _MACHINE_IEEEFP_H_ +#define _MACHINE_IEEEFP_H_ + +#include + +typedef int fp_except_t; +#define FP_X_INV IA64_FPSR_TRAP_VD /* invalid operation exception */ +#define FP_X_DZ IA64_FPSR_TRAP_ZD /* divide-by-zero exception */ +#define FP_X_OFL IA64_FPSR_TRAP_OD /* overflow exception */ +#define FP_X_UFL IA64_FPSR_TRAP_UD /* underflow exception */ +#define FP_X_IMP IA64_FPSR_TRAP_ID /* imprecise(inexact) exception */ + +typedef enum { + FP_RN = 0, /* round to nearest */ + FP_RM, /* round toward minus infinity */ + FP_RP, /* round toward plus infinity */ + FP_RZ /* round toward zero */ +} fp_rnd_t; + +#endif /* !_MACHINE_IEEEFP_H_ */ diff --git a/StdLib/Include/Ipf/machine/int_const.h b/StdLib/Include/Ipf/machine/int_const.h new file mode 100644 index 0000000000..dcf1ede3f5 --- /dev/null +++ b/StdLib/Include/Ipf/machine/int_const.h @@ -0,0 +1,64 @@ +/* $NetBSD: int_const.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Klaus Klein. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _IA64_INT_CONST_H_ +#define _IA64_INT_CONST_H_ + +/* XXX: cherry: needs to be audited */ +/* + * 7.18.4 Macros for integer constants + */ + +/* 7.18.4.1 Macros for minimum-width integer constants */ + +#define INT8_C(c) c +#define INT16_C(c) c +#define INT32_C(c) c +#define INT64_C(c) c ## L + +#define UINT8_C(c) c ## U +#define UINT16_C(c) c ## U +#define UINT32_C(c) c ## U +#define UINT64_C(c) c ## UL + +/* 7.18.4.2 Macros for greatest-width integer constants */ + +#define INTMAX_C(c) c ## L +#define UINTMAX_C(c) c ## UL + +#endif /* !_IA64_INT_CONST_H_ */ diff --git a/StdLib/Include/Ipf/machine/int_fmtio.h b/StdLib/Include/Ipf/machine/int_fmtio.h new file mode 100644 index 0000000000..a74f7cf02d --- /dev/null +++ b/StdLib/Include/Ipf/machine/int_fmtio.h @@ -0,0 +1,219 @@ +/* $NetBSD: int_fmtio.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Klaus Klein. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _IA64_INT_FMTIO_H_ +#define _IA64_INT_FMTIO_H_ + +/* + * 7.8.1 Macros for format specifiers + */ + +/* fprintf macros for signed integers */ + +#define PRId8 "d" /* int8_t */ +#define PRId16 "d" /* int16_t */ +#define PRId32 "d" /* int32_t */ +#define PRId64 "ld" /* int64_t */ +#define PRIdLEAST8 "d" /* int_least8_t */ +#define PRIdLEAST16 "d" /* int_least16_t */ +#define PRIdLEAST32 "d" /* int_least32_t */ +#define PRIdLEAST64 "ld" /* int_least64_t */ +#define PRIdFAST8 "d" /* int_fast8_t */ +#define PRIdFAST16 "d" /* int_fast16_t */ +#define PRIdFAST32 "d" /* int_fast32_t */ +#define PRIdFAST64 "ld" /* int_fast64_t */ +#define PRIdMAX "ld" /* intmax_t */ +#define PRIdPTR "ld" /* intptr_t */ + +#define PRIi8 "i" /* int8_t */ +#define PRIi16 "i" /* int16_t */ +#define PRIi32 "i" /* int32_t */ +#define PRIi64 "li" /* int64_t */ +#define PRIiLEAST8 "i" /* int_least8_t */ +#define PRIiLEAST16 "i" /* int_least16_t */ +#define PRIiLEAST32 "i" /* int_least32_t */ +#define PRIiLEAST64 "li" /* int_least64_t */ +#define PRIiFAST8 "i" /* int_fast8_t */ +#define PRIiFAST16 "i" /* int_fast16_t */ +#define PRIiFAST32 "i" /* int_fast32_t */ +#define PRIiFAST64 "li" /* int_fast64_t */ +#define PRIiMAX "li" /* intmax_t */ +#define PRIiPTR "li" /* intptr_t */ + +/* fprintf macros for unsigned integers */ + +#define PRIo8 "o" /* uint8_t */ +#define PRIo16 "o" /* uint16_t */ +#define PRIo32 "o" /* uint32_t */ +#define PRIo64 "lo" /* uint64_t */ +#define PRIoLEAST8 "o" /* uint_least8_t */ +#define PRIoLEAST16 "o" /* uint_least16_t */ +#define PRIoLEAST32 "o" /* uint_least32_t */ +#define PRIoLEAST64 "lo" /* uint_least64_t */ +#define PRIoFAST8 "o" /* uint_fast8_t */ +#define PRIoFAST16 "o" /* uint_fast16_t */ +#define PRIoFAST32 "o" /* uint_fast32_t */ +#define PRIoFAST64 "lo" /* uint_fast64_t */ +#define PRIoMAX "lo" /* uintmax_t */ +#define PRIoPTR "lo" /* uintptr_t */ + +#define PRIu8 "u" /* uint8_t */ +#define PRIu16 "u" /* uint16_t */ +#define PRIu32 "u" /* uint32_t */ +#define PRIu64 "lu" /* uint64_t */ +#define PRIuLEAST8 "u" /* uint_least8_t */ +#define PRIuLEAST16 "u" /* uint_least16_t */ +#define PRIuLEAST32 "u" /* uint_least32_t */ +#define PRIuLEAST64 "lu" /* uint_least64_t */ +#define PRIuFAST8 "u" /* uint_fast8_t */ +#define PRIuFAST16 "u" /* uint_fast16_t */ +#define PRIuFAST32 "u" /* uint_fast32_t */ +#define PRIuFAST64 "lu" /* uint_fast64_t */ +#define PRIuMAX "lu" /* uintmax_t */ +#define PRIuPTR "lu" /* uintptr_t */ + +#define PRIx8 "x" /* uint8_t */ +#define PRIx16 "x" /* uint16_t */ +#define PRIx32 "x" /* uint32_t */ +#define PRIx64 "lx" /* uint64_t */ +#define PRIxLEAST8 "x" /* uint_least8_t */ +#define PRIxLEAST16 "x" /* uint_least16_t */ +#define PRIxLEAST32 "x" /* uint_least32_t */ +#define PRIxLEAST64 "lx" /* uint_least64_t */ +#define PRIxFAST8 "x" /* uint_fast8_t */ +#define PRIxFAST16 "x" /* uint_fast16_t */ +#define PRIxFAST32 "x" /* uint_fast32_t */ +#define PRIxFAST64 "lx" /* uint_fast64_t */ +#define PRIxMAX "lx" /* uintmax_t */ +#define PRIxPTR "lx" /* uintptr_t */ + +#define PRIX8 "X" /* uint8_t */ +#define PRIX16 "X" /* uint16_t */ +#define PRIX32 "X" /* uint32_t */ +#define PRIX64 "lX" /* uint64_t */ +#define PRIXLEAST8 "X" /* uint_least8_t */ +#define PRIXLEAST16 "X" /* uint_least16_t */ +#define PRIXLEAST32 "X" /* uint_least32_t */ +#define PRIXLEAST64 "lX" /* uint_least64_t */ +#define PRIXFAST8 "X" /* uint_fast8_t */ +#define PRIXFAST16 "X" /* uint_fast16_t */ +#define PRIXFAST32 "X" /* uint_fast32_t */ +#define PRIXFAST64 "lX" /* uint_fast64_t */ +#define PRIXMAX "lX" /* uintmax_t */ +#define PRIXPTR "lX" /* uintptr_t */ + +/* fscanf macros for signed integers */ + +#define SCNd8 "hhd" /* int8_t */ +#define SCNd16 "hd" /* int16_t */ +#define SCNd32 "d" /* int32_t */ +#define SCNd64 "ld" /* int64_t */ +#define SCNdLEAST8 "hhd" /* int_least8_t */ +#define SCNdLEAST16 "hd" /* int_least16_t */ +#define SCNdLEAST32 "d" /* int_least32_t */ +#define SCNdLEAST64 "ld" /* int_least64_t */ +#define SCNdFAST8 "d" /* int_fast8_t */ +#define SCNdFAST16 "d" /* int_fast16_t */ +#define SCNdFAST32 "d" /* int_fast32_t */ +#define SCNdFAST64 "ld" /* int_fast64_t */ +#define SCNdMAX "ld" /* intmax_t */ +#define SCNdPTR "ld" /* intptr_t */ + +#define SCNi8 "hhi" /* int8_t */ +#define SCNi16 "hi" /* int16_t */ +#define SCNi32 "i" /* int32_t */ +#define SCNi64 "li" /* int64_t */ +#define SCNiLEAST8 "hhi" /* int_least8_t */ +#define SCNiLEAST16 "hi" /* int_least16_t */ +#define SCNiLEAST32 "i" /* int_least32_t */ +#define SCNiLEAST64 "li" /* int_least64_t */ +#define SCNiFAST8 "i" /* int_fast8_t */ +#define SCNiFAST16 "i" /* int_fast16_t */ +#define SCNiFAST32 "i" /* int_fast32_t */ +#define SCNiFAST64 "li" /* int_fast64_t */ +#define SCNiMAX "li" /* intmax_t */ +#define SCNiPTR "li" /* intptr_t */ + +/* fscanf macros for unsigned integers */ + +#define SCNo8 "hho" /* uint8_t */ +#define SCNo16 "ho" /* uint16_t */ +#define SCNo32 "o" /* uint32_t */ +#define SCNo64 "lo" /* uint64_t */ +#define SCNoLEAST8 "hho" /* uint_least8_t */ +#define SCNoLEAST16 "ho" /* uint_least16_t */ +#define SCNoLEAST32 "o" /* uint_least32_t */ +#define SCNoLEAST64 "lo" /* uint_least64_t */ +#define SCNoFAST8 "o" /* uint_fast8_t */ +#define SCNoFAST16 "o" /* uint_fast16_t */ +#define SCNoFAST32 "o" /* uint_fast32_t */ +#define SCNoFAST64 "lo" /* uint_fast64_t */ +#define SCNoMAX "lo" /* uintmax_t */ +#define SCNoPTR "lo" /* uintptr_t */ + +#define SCNu8 "hhu" /* uint8_t */ +#define SCNu16 "hu" /* uint16_t */ +#define SCNu32 "u" /* uint32_t */ +#define SCNu64 "lu" /* uint64_t */ +#define SCNuLEAST8 "hhu" /* uint_least8_t */ +#define SCNuLEAST16 "hu" /* uint_least16_t */ +#define SCNuLEAST32 "u" /* uint_least32_t */ +#define SCNuLEAST64 "lu" /* uint_least64_t */ +#define SCNuFAST8 "u" /* uint_fast8_t */ +#define SCNuFAST16 "u" /* uint_fast16_t */ +#define SCNuFAST32 "u" /* uint_fast32_t */ +#define SCNuFAST64 "lu" /* uint_fast64_t */ +#define SCNuMAX "lu" /* uintmax_t */ +#define SCNuPTR "lu" /* uintptr_t */ + +#define SCNx8 "hhx" /* uint8_t */ +#define SCNx16 "hx" /* uint16_t */ +#define SCNx32 "x" /* uint32_t */ +#define SCNx64 "lx" /* uint64_t */ +#define SCNxLEAST8 "hhx" /* uint_least8_t */ +#define SCNxLEAST16 "hx" /* uint_least16_t */ +#define SCNxLEAST32 "x" /* uint_least32_t */ +#define SCNxLEAST64 "lx" /* uint_least64_t */ +#define SCNxFAST8 "x" /* uint_fast8_t */ +#define SCNxFAST16 "x" /* uint_fast16_t */ +#define SCNxFAST32 "x" /* uint_fast32_t */ +#define SCNxFAST64 "lx" /* uint_fast64_t */ +#define SCNxMAX "lx" /* uintmax_t */ +#define SCNxPTR "lx" /* uintptr_t */ + +#endif /* !_IA64_INT_FMTIO_H_ */ diff --git a/StdLib/Include/Ipf/machine/int_limits.h b/StdLib/Include/Ipf/machine/int_limits.h new file mode 100644 index 0000000000..d548a73e5c --- /dev/null +++ b/StdLib/Include/Ipf/machine/int_limits.h @@ -0,0 +1,134 @@ +/* $NetBSD: int_limits.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Klaus Klein. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _IA64_INT_LIMITS_H_ +#define _IA64_INT_LIMITS_H_ + +/* + * 7.18.2 Limits of specified-width integer types + */ + +/* 7.18.2.1 Limits of exact-width integer types */ + +/* minimum values of exact-width signed integer types */ +#define INT8_MIN (-0x7f-1) /* int8_t */ +#define INT16_MIN (-0x7fff-1) /* int16_t */ +#define INT32_MIN (-0x7fffffff-1) /* int32_t */ +#define INT64_MIN (-0x7fffffffffffffffL-1) /* int64_t */ + +/* maximum values of exact-width signed integer types */ +#define INT8_MAX 0x7f /* int8_t */ +#define INT16_MAX 0x7fff /* int16_t */ +#define INT32_MAX 0x7fffffff /* int32_t */ +#define INT64_MAX 0x7fffffffffffffffL /* int64_t */ + +/* maximum values of exact-width unsigned integer types */ +#define UINT8_MAX 0xffU /* uint8_t */ +#define UINT16_MAX 0xffffU /* uint16_t */ +#define UINT32_MAX 0xffffffffU /* uint32_t */ +#define UINT64_MAX 0xffffffffffffffffUL /* uint64_t */ + +/* 7.18.2.2 Limits of minimum-width integer types */ + +/* minimum values of minimum-width signed integer types */ +#define INT_LEAST8_MIN (-0x7f-1) /* int_least8_t */ +#define INT_LEAST16_MIN (-0x7fff-1) /* int_least16_t */ +#define INT_LEAST32_MIN (-0x7fffffff-1) /* int_least32_t */ +#define INT_LEAST64_MIN (-0x7fffffffffffffffL-1) /* int_least64_t */ + +/* maximum values of minimum-width signed integer types */ +#define INT_LEAST8_MAX 0x7f /* int_least8_t */ +#define INT_LEAST16_MAX 0x7fff /* int_least16_t */ +#define INT_LEAST32_MAX 0x7fffffff /* int_least32_t */ +#define INT_LEAST64_MAX 0x7fffffffffffffffL /* int_least64_t */ + +/* maximum values of minimum-width unsigned integer types */ +#define UINT_LEAST8_MAX 0xffU /* uint_least8_t */ +#define UINT_LEAST16_MAX 0xffffU /* uint_least16_t */ +#define UINT_LEAST32_MAX 0xffffffffU /* uint_least32_t */ +#define UINT_LEAST64_MAX 0xffffffffffffffffUL /* uint_least64_t */ + +/* 7.18.2.3 Limits of fastest minimum-width integer types */ + +/* minimum values of fastest minimum-width signed integer types */ +#define INT_FAST8_MIN (-0x7fffffff-1) /* int_fast8_t */ +#define INT_FAST16_MIN (-0x7fffffff-1) /* int_fast16_t */ +#define INT_FAST32_MIN (-0x7fffffff-1) /* int_fast32_t */ +#define INT_FAST64_MIN (-0x7fffffffffffffffLL-1) /* int_fast64_t */ + +/* maximum values of fastest minimum-width signed integer types */ +#define INT_FAST8_MAX 0x7fffffff /* int_fast8_t */ +#define INT_FAST16_MAX 0x7fffffff /* int_fast16_t */ +#define INT_FAST32_MAX 0x7fffffff /* int_fast32_t */ +#define INT_FAST64_MAX 0x7fffffffffffffffLL /* int_fast64_t */ + +/* maximum values of fastest minimum-width unsigned integer types */ +#define UINT_FAST8_MAX 0xffffffffU /* uint_fast8_t */ +#define UINT_FAST16_MAX 0xffffffffU /* uint_fast16_t */ +#define UINT_FAST32_MAX 0xffffffffU /* uint_fast32_t */ +#define UINT_FAST64_MAX 0xffffffffffffffffULL /* uint_fast64_t */ + +/* 7.18.2.4 Limits of integer types capable of holding object pointers */ + +#define INTPTR_MIN (-0x7fffffffffffffffL-1) /* intptr_t */ +#define INTPTR_MAX 0x7fffffffffffffffL /* intptr_t */ +#define UINTPTR_MAX 0xffffffffffffffffUL /* uintptr_t */ + +/* 7.18.2.5 Limits of greatest-width integer types */ + +#define INTMAX_MIN (-0x7fffffffffffffffL-1) /* intmax_t */ +#define INTMAX_MAX 0x7fffffffffffffffL /* intmax_t */ +#define UINTMAX_MAX 0xffffffffffffffffUL /* uintmax_t */ + + +/* + * 7.18.3 Limits of other integer types + */ + +/* limits of ptrdiff_t */ +#define PTRDIFF_MIN (-0x7fffffffffffffffL-1) /* ptrdiff_t */ +#define PTRDIFF_MAX 0x7fffffffffffffffL /* ptrdiff_t */ + +/* limits of sig_atomic_t */ +#define SIG_ATOMIC_MIN (-0x7fffffffffffffffL-1) /* sig_atomic_t */ +#define SIG_ATOMIC_MAX 0x7fffffffffffffffL /* sig_atomic_t */ + +/* limit of size_t */ +#define SIZE_MAX 0xffffffffffffffffUL /* size_t */ + +#endif /* !_IA64_INT_LIMITS_H_ */ diff --git a/StdLib/Include/Ipf/machine/int_mwgwtypes.h b/StdLib/Include/Ipf/machine/int_mwgwtypes.h new file mode 100644 index 0000000000..6172c00ee9 --- /dev/null +++ b/StdLib/Include/Ipf/machine/int_mwgwtypes.h @@ -0,0 +1,83 @@ +/** @file + Minimum and Greatest Width Integer types. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Portions Copyright (c) 2001 The NetBSD Foundation, Inc. + All rights reserved. + + This code is derived from software contributed to The NetBSD Foundation + by Klaus Klein. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: + This product includes software developed by the NetBSD + Foundation, Inc. and its contributors. + 4. Neither the name of The NetBSD Foundation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: int_mwgwtypes.h,v 1.1 2006/04/07 14:21:18 cherry Exp +**/ + +#ifndef _IA64_INT_MWGWTYPES_H_ +#define _IA64_INT_MWGWTYPES_H_ + +/* + * 7.18.1 Integer types + */ + +/* 7.18.1.2 Minimum-width integer types */ + +typedef CHAR8 int_least8_t; +typedef UINT8 uint_least8_t; +typedef INT16 int_least16_t; +typedef UINT16 uint_least16_t; +typedef INT32 int_least32_t; +typedef UINT32 uint_least32_t; +typedef INT64 int_least64_t; +typedef UINT64 uint_least64_t; + +/* 7.18.1.3 Fastest minimum-width integer types */ +typedef INT32 int_fast8_t; +typedef UINT32 uint_fast8_t; +typedef INT32 int_fast16_t; +typedef UINT32 uint_fast16_t; +typedef INT32 int_fast32_t; +typedef UINT32 uint_fast32_t; +typedef INT64 int_fast64_t; +typedef UINT64 uint_fast64_t; + +/* 7.18.1.5 Greatest-width integer types */ + +typedef INT64 intmax_t; +typedef UINT64 uintmax_t; + +#endif /* !_IA64_INT_MWGWTYPES_H_ */ diff --git a/StdLib/Include/Ipf/machine/int_types.h b/StdLib/Include/Ipf/machine/int_types.h new file mode 100644 index 0000000000..a429a389c3 --- /dev/null +++ b/StdLib/Include/Ipf/machine/int_types.h @@ -0,0 +1,74 @@ +/* $NetBSD: int_types.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)types.h 7.5 (Berkeley) 3/9/91 + */ + +#ifndef _IA64_INT_TYPES_H_ +#define _IA64_INT_TYPES_H_ + +/* + * 7.18.1 Integer types + */ + +/* 7.18.1.1 Exact-width integer types */ + +typedef __signed char __int8_t; +typedef unsigned char __uint8_t; +typedef short int __int16_t; +typedef unsigned short int __uint16_t; +typedef int __int32_t; +typedef unsigned int __uint32_t; +#ifdef __COMPILER_INT64__ +typedef __COMPILER_INT64__ __int64_t; +typedef __COMPILER_UINT64__ __uint64_t; +#elif defined(_LP64) +typedef long int __int64_t; +typedef unsigned long int __uint64_t; +#else +/* LONGLONG */ +typedef long long int __int64_t; +/* LONGLONG */ +typedef unsigned long long int __uint64_t; +#endif + +#define __BIT_TYPES_DEFINED__ + +/* 7.18.1.4 Integer types capable of holding object pointers */ + +#ifdef _LP64 +typedef long int __intptr_t; +typedef unsigned long int __uintptr_t; +#else +typedef int __intptr_t; +typedef unsigned int __uintptr_t; +#endif + +#endif /* !_IA64_INT_TYPES_H_ */ diff --git a/StdLib/Include/Ipf/machine/intr.h b/StdLib/Include/Ipf/machine/intr.h new file mode 100644 index 0000000000..a7ca5cfcf4 --- /dev/null +++ b/StdLib/Include/Ipf/machine/intr.h @@ -0,0 +1,60 @@ +/* $NetBSD: intr.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/* XXX: cherry: To Be fixed when we switch on interrupts. */ + +#ifndef _IA64_INTR_H_ +#define _IA64_INTR_H_ + +#define IPL_NONE 0 /* XXX: Placeholder */ +#define IPL_BIO 0 /* XXX: Placeholder */ +#define IPL_NET 0 /* XXX: Placeholder */ +#define IPL_TTY 0 /* XXX: Placeholder */ +#define IPL_CLOCK 0 /* XXX: Placeholder */ +#define IPL_HIGH 0 /* XXX: Placeholder */ +#define IPL_SERIAL 0 /* XXX: Placeholder */ +#define IPL_SCHED 0 /* XXX: Placeholder */ +#define IPL_VM 0 /* XXX: Placeholder */ + +#define IPL_SOFTCLOCK 0 /* XXX: Placeholder */ +#define IPL_SOFTNET 0 /* XXX: Placeholder */ +#define IPL_SOFTSERIAL 0 /* XXX: Placeholder */ + +static __inline int splraise(int dummy) { return 0; } +static __inline void spllower(int dummy) { } + +/* + * Hardware interrupt masks + */ +#define splbio() splraise(IPL_BIO) +#define splnet() splraise(IPL_NET) +#define spltty() splraise(IPL_TTY) +#define splaudio() splraise(IPL_AUDIO) +#define splclock() splraise(IPL_CLOCK) +#define splstatclock() splclock() +#define splserial() splraise(IPL_SERIAL) +#define splipi() splraise(IPL_IPI) + + +/* + * Miscellaneous + */ +#define splvm() splraise(IPL_VM) +#define splhigh() splraise(IPL_HIGH) +#define spl0() spllower(IPL_NONE) +#define splsched() splraise(IPL_SCHED) +#define spllock() splhigh() +#define splx(x) spllower(x) + +/* + * Software interrupt masks + * + * NOTE: spllowersoftclock() is used by hardclock() to lower the priority from + * clock to softclock before it calls softclock(). + */ + +#define spllowersoftclock() spllower(IPL_SOFTCLOCK) +#define splsoftclock() splraise(IPL_SOFTCLOCK) +#define splsoftnet() splraise(IPL_SOFTNET) +#define splsoftserial() splraise(IPL_SOFTSERIAL) + +#endif /* ! _IA64_INTR_H_ */ diff --git a/StdLib/Include/Ipf/machine/intrcnt.h b/StdLib/Include/Ipf/machine/intrcnt.h new file mode 100644 index 0000000000..16d91c4ee9 --- /dev/null +++ b/StdLib/Include/Ipf/machine/intrcnt.h @@ -0,0 +1,43 @@ +/* $NetBSD: intrcnt.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#define INTRCNT_CLOCK 0 +#define INTRCNT_ISA_IRQ (INTRCNT_CLOCK + 1) +#define INTRCNT_ISA_IRQ_LEN 16 +#define INTRCNT_OTHER_BASE (INTRCNT_ISA_IRQ + INTRCNT_ISA_IRQ_LEN) +#define INTRCNT_OTHER_LEN 240 +#define INTRCNT_COUNT (INTRCNT_OTHER_BASE + INTRCNT_OTHER_LEN) + +/* + * Maximum name length in intrnames table (including terminating '\0'. + * Since vmstat(8) assumes a maximum length of 13 (including '\0'), we're + * pretty much limited to that (unless we don't care about the alignment + * of the columns :-) + */ +#define INTRNAME_LEN 13 diff --git a/StdLib/Include/Ipf/machine/limits.h b/StdLib/Include/Ipf/machine/limits.h new file mode 100644 index 0000000000..311b4bb578 --- /dev/null +++ b/StdLib/Include/Ipf/machine/limits.h @@ -0,0 +1,89 @@ +/* $NetBSD: limits.h,v 1.2 2006/05/14 21:55:38 elad Exp $ */ + +/* + * Copyright (c) 1988 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)limits.h 7.2 (Berkeley) 6/28/90 + */ + +#ifndef _MACHINE_LIMITS_H_ +#define _MACHINE_LIMITS_H_ + +#define __CHAR_BIT 8 /* number of bits in a char */ +//#define MB_LEN_MAX 32 /* no multibyte characters */ + +#define __SCHAR_MIN (-128) /* max value for a signed char */ +#define __SCHAR_MAX 127 /* min value for a signed char */ + +#define __UCHAR_MAX 255 /* max value for an unsigned char */ +//#define CHAR_MAX 0x7f /* max value for a char */ +//#define CHAR_MIN (-0x7f-1) /* min value for a char */ + +#define __USHRT_MAX 0xffffU /* max value for an unsigned short */ +#define __SHRT_MAX 0x7fff /* max value for a short */ +#define __SHRT_MIN (-0x7fff-1) /* min value for a short */ + +#define __UINT_MAX 0xffffffffU /* max value for an unsigned int */ +#define __INT_MAX 0x7fffffff /* max value for an int */ +#define __INT_MIN (-0x7fffffff-1) /* min value for an int */ + +//#define __ULONG_MAX 0xffffffffffffffffUL /* max value for an unsigned long */ +//#define __LONG_MAX 0x7fffffffffffffffL /* max value for a long */ +//#define __LONG_MIN (-0x7fffffffffffffffL-1) /* min value for a long */ +#define __ULONG_MAX __UINT_MAX /* max value for an unsigned long */ +#define __LONG_MAX __INT_MAX /* max value for a long */ +#define __LONG_MIN __INT_MIN /* min value for a long */ + + +#define SSIZE_MAX LONG_MAX /* max value for a ssize_t */ + +#define __ULLONG_MAX 0xffffffffffffffffULL /* max unsigned long long */ +#define __LLONG_MAX 0x7fffffffffffffffLL /* max signed long long */ +#define __LLONG_MIN (-0x7fffffffffffffffLL-1) /* min signed long long */ + +#define SIZE_T_MAX __ULLONG_MAX /* max value for a size_t */ + +/* GCC requires that quad constants be written as expressions. */ +#define UQUAD_MAX ((u_quad_t)0-1) /* max value for a uquad_t */ + /* max value for a quad_t */ +#define QUAD_MAX ((quad_t)(UQUAD_MAX >> 1)) +#define QUAD_MIN (-QUAD_MAX-1) /* min value for a quad_t */ + + +#define LONG_BIT 32 +#define WORD_BIT 32 + +/* Intel extensions to for UEFI */ +#define __SHORT_BIT 16 +#define __WCHAR_BIT 16 +#define __INT_BIT 32 +#define __LONG_BIT 32 /* Compiler dependent */ +#define __LONG_LONG_BIT 64 +#define __POINTER_BIT 64 + +#endif /* _MACHINE_LIMITS_H_ */ diff --git a/StdLib/Include/Ipf/machine/loadfile_machdep.h b/StdLib/Include/Ipf/machine/loadfile_machdep.h new file mode 100644 index 0000000000..5c2099d304 --- /dev/null +++ b/StdLib/Include/Ipf/machine/loadfile_machdep.h @@ -0,0 +1,97 @@ +/* $NetBSD: loadfile_machdep.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 1998 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas and Ross Harvey. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#define BOOT_ELF64 + +#define LOAD_KERNEL (LOAD_ALL & ~LOAD_TEXTA) +#define COUNT_KERNEL (COUNT_ALL & ~COUNT_TEXTA) + +#ifndef MD_LOADSEG +/* XXX: Multiple unwind sections are ignored, and the last one found returned... Fixme! */ +extern vaddr_t ia64_unwindtab; +extern vsize_t ia64_unwindtablen; +#define MD_LOADSEG(phdr) ((phdr)->p_type == PT_IA_64_UNWIND ? ia64_unwindtab = (phdr)->p_vaddr, ia64_unwindtablen = (phdr)->p_filesz, 1 : 0) +#endif + +#ifdef _STANDALONE + +/* XXX: cherry: This whole thing is glue between the NetBSD pread/vpbcopy etc. etc + * and the FreeBSD kern_pread/bzero etc. etc. Needs to be cleaned up + * after discussion. + */ + +#include "bootstrap.h" + +#define LOADADDR(a) ((a) + offset) +#define ALIGNENTRY(a) Error! alpha supports ECOFF and ELF only! /* Fixme: for ia64 */ +#define READ(f, b, c) pread((f), LOADADDR(b), (c)) +#define BCOPY(s, d, c) vpbcopy((s), LOADADDR(d), (c)) +#define BZERO(d, c) pbzero(LOADADDR(d), (c)) +#define WARN(a) (void)(printf a, \ + printf((errno ? ": %s\n" : "\n"), \ + strerror(errno))) +#define PROGRESS(a) (void) printf a +#define ALLOC(a) alloc(a) +#define DEALLOC(a, b) dealloc(a, b) +#define OKMAGIC(a) Error! ia64 supports ELF only! + + +/* XXX: defines below glues NetBSD conventions with bootstrap.h. */ + +#define vpbcopy archsw.arch_copyin +#define pbzero kern_bzero +#define pread archsw.arch_readin + +#else + +#define LOADADDR(a) (((u_long)(a)) + offset) +#define ALIGNENTRY(a) ((u_long)(a)) +#define READ(f, b, c) read((f), (void *)LOADADDR(b), (c)) +#define BCOPY(s, d, c) memcpy((void *)LOADADDR(d), (void *)(s), (c)) +#define BZERO(d, c) memset((void *)LOADADDR(d), 0, (c)) +#define WARN(a) warn a +#define PROGRESS(a) /* nothing */ +#define ALLOC(a) malloc(a) +#define DEALLOC(a, b) free(a) +#define OKMAGIC(a) ((a) == OMAGIC) + +ssize_t vread(int, u_long, u_long *, size_t); +void vcopy(u_long, u_long, u_long *, size_t); +void vzero(u_long, u_long *, size_t); + +#endif diff --git a/StdLib/Include/Ipf/machine/math.h b/StdLib/Include/Ipf/machine/math.h new file mode 100644 index 0000000000..ddd3922d1b --- /dev/null +++ b/StdLib/Include/Ipf/machine/math.h @@ -0,0 +1,6 @@ +/* $NetBSD: math.h,v 1.3 2005/12/11 12:16:25 christos Exp $ */ + +//#include + +//#define __HAVE_LONG_DOUBLE +//#define __HAVE_NANF diff --git a/StdLib/Include/Ipf/machine/mca_machdep.h b/StdLib/Include/Ipf/machine/mca_machdep.h new file mode 100644 index 0000000000..48674e1b2e --- /dev/null +++ b/StdLib/Include/Ipf/machine/mca_machdep.h @@ -0,0 +1,248 @@ +/* $NetBSD: mca_machdep.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 2002 Marcel Moolenaar + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _MACHINE_MCA_H_ +#define _MACHINE_MCA_H_ + +struct mca_record_header { + uint64_t rh_seqnr; /* Record id. */ + uint8_t rh_major; /* BCD (=02). */ + uint8_t rh_minor; /* BCD (=00). */ + uint8_t rh_error; /* Error severity. */ +#define MCA_RH_ERROR_RECOVERABLE 0 +#define MCA_RH_ERROR_FATAL 1 +#define MCA_RH_ERROR_CORRECTED 2 + uint8_t rh_flags; +#define MCA_RH_FLAGS_PLATFORM_ID 0x01 /* Platform_id present. */ + uint32_t rh_length; /* Size including header. */ + uint8_t rh_time[8]; +#define MCA_RH_TIME_SEC 0 +#define MCA_RH_TIME_MIN 1 +#define MCA_RH_TIME_HOUR 2 +#define MCA_RH_TIME_MDAY 4 +#define MCA_RH_TIME_MON 5 +#define MCA_RH_TIME_YEAR 6 +#define MCA_RH_TIME_CENT 7 + struct uuid rh_platform; +}; + +struct mca_section_header { + struct uuid sh_uuid; + uint8_t sh_major; /* BCD (=02). */ + uint8_t sh_minor; /* BCD (=00). */ + uint8_t sh_flags; +#define MCA_SH_FLAGS_CORRECTED 0x01 /* Error has been corrected. */ +#define MCA_SH_FLAGS_PROPAGATE 0x02 /* Possible propagation. */ +#define MCA_SH_FLAGS_RESET 0x04 /* Reset device before use. */ +#define MCA_SH_FLAGS_VALID 0x80 /* Flags are valid. */ + uint8_t __reserved; + uint32_t sh_length; /* Size including header. */ +}; + +struct mca_cpu_record { + uint64_t cpu_flags; +#define MCA_CPU_FLAGS_ERRMAP (1ULL << 0) +#define MCA_CPU_FLAGS_STATE (1ULL << 1) +#define MCA_CPU_FLAGS_CR_LID (1ULL << 2) +#define MCA_CPU_FLAGS_PSI_STRUCT (1ULL << 3) +#define MCA_CPU_FLAGS_CACHE(x) (((x) >> 4) & 15) +#define MCA_CPU_FLAGS_TLB(x) (((x) >> 8) & 15) +#define MCA_CPU_FLAGS_BUS(x) (((x) >> 12) & 15) +#define MCA_CPU_FLAGS_REG(x) (((x) >> 16) & 15) +#define MCA_CPU_FLAGS_MS(x) (((x) >> 20) & 15) +#define MCA_CPU_FLAGS_CPUID (1ULL << 24) + uint64_t cpu_errmap; + uint64_t cpu_state; + uint64_t cpu_cr_lid; + /* Nx cpu_mod (cache). */ + /* Nx cpu_mod (TLB). */ + /* Nx cpu_mod (bus). */ + /* Nx cpu_mod (reg). */ + /* Nx cpu_mod (MS). */ + /* cpu_cpuid. */ + /* cpu_psi. */ +}; + +struct mca_cpu_cpuid { + uint64_t cpuid[6]; +}; + +struct mca_cpu_mod { + uint64_t cpu_mod_flags; +#define MCA_CPU_MOD_FLAGS_INFO (1ULL << 0) +#define MCA_CPU_MOD_FLAGS_REQID (1ULL << 1) +#define MCA_CPU_MOD_FLAGS_RSPID (1ULL << 2) +#define MCA_CPU_MOD_FLAGS_TGTID (1ULL << 3) +#define MCA_CPU_MOD_FLAGS_IP (1ULL << 4) + uint64_t cpu_mod_info; + uint64_t cpu_mod_reqid; + uint64_t cpu_mod_rspid; + uint64_t cpu_mod_tgtid; + uint64_t cpu_mod_ip; +}; + +struct mca_cpu_psi { + uint64_t cpu_psi_flags; +#define MCA_CPU_PSI_FLAGS_STATE (1ULL << 0) +#define MCA_CPU_PSI_FLAGS_BR (1ULL << 1) +#define MCA_CPU_PSI_FLAGS_CR (1ULL << 2) +#define MCA_CPU_PSI_FLAGS_AR (1ULL << 3) +#define MCA_CPU_PSI_FLAGS_RR (1ULL << 4) +#define MCA_CPU_PSI_FLAGS_FR (1ULL << 5) + uint8_t cpu_psi_state[1024]; /* XXX variable? */ + uint64_t cpu_psi_br[8]; + uint64_t cpu_psi_cr[128]; /* XXX variable? */ + uint64_t cpu_psi_ar[128]; /* XXX variable? */ + uint64_t cpu_psi_rr[8]; + uint64_t cpu_psi_fr[256]; /* 16 bytes per register! */ +}; + +struct mca_mem_record { + uint64_t mem_flags; +#define MCA_MEM_FLAGS_STATUS (1ULL << 0) +#define MCA_MEM_FLAGS_ADDR (1ULL << 1) +#define MCA_MEM_FLAGS_ADDRMASK (1ULL << 2) +#define MCA_MEM_FLAGS_NODE (1ULL << 3) +#define MCA_MEM_FLAGS_CARD (1ULL << 4) +#define MCA_MEM_FLAGS_MODULE (1ULL << 5) +#define MCA_MEM_FLAGS_BANK (1ULL << 6) +#define MCA_MEM_FLAGS_DEVICE (1ULL << 7) +#define MCA_MEM_FLAGS_ROW (1ULL << 8) +#define MCA_MEM_FLAGS_COLUMN (1ULL << 9) +#define MCA_MEM_FLAGS_BITPOS (1ULL << 10) +#define MCA_MEM_FLAGS_REQID (1ULL << 11) +#define MCA_MEM_FLAGS_RSPID (1ULL << 12) +#define MCA_MEM_FLAGS_TGTID (1ULL << 13) +#define MCA_MEM_FLAGS_BUSDATA (1ULL << 14) +#define MCA_MEM_FLAGS_OEM_ID (1ULL << 15) +#define MCA_MEM_FLAGS_OEM_DATA (1ULL << 16) + uint64_t mem_status; + uint64_t mem_addr; + uint64_t mem_addrmask; + uint16_t mem_node; + uint16_t mem_card; + uint16_t mem_module; + uint16_t mem_bank; + uint16_t mem_device; + uint16_t mem_row; + uint16_t mem_column; + uint16_t mem_bitpos; + uint64_t mem_reqid; + uint64_t mem_rspid; + uint64_t mem_tgtid; + uint64_t mem_busdata; + struct uuid mem_oem_id; + uint16_t mem_oem_length; /* Size of OEM data. */ + /* N bytes of OEM platform data. */ +}; + +struct mca_pcibus_record { + uint64_t pcibus_flags; +#define MCA_PCIBUS_FLAGS_STATUS (1ULL << 0) +#define MCA_PCIBUS_FLAGS_ERROR (1ULL << 1) +#define MCA_PCIBUS_FLAGS_BUS (1ULL << 2) +#define MCA_PCIBUS_FLAGS_ADDR (1ULL << 3) +#define MCA_PCIBUS_FLAGS_DATA (1ULL << 4) +#define MCA_PCIBUS_FLAGS_CMD (1ULL << 5) +#define MCA_PCIBUS_FLAGS_REQID (1ULL << 6) +#define MCA_PCIBUS_FLAGS_RSPID (1ULL << 7) +#define MCA_PCIBUS_FLAGS_TGTID (1ULL << 8) +#define MCA_PCIBUS_FLAGS_OEM_ID (1ULL << 9) +#define MCA_PCIBUS_FLAGS_OEM_DATA (1ULL << 10) + uint64_t pcibus_status; + uint16_t pcibus_error; + uint16_t pcibus_bus; + uint32_t __reserved; + uint64_t pcibus_addr; + uint64_t pcibus_data; + uint64_t pcibus_cmd; + uint64_t pcibus_reqid; + uint64_t pcibus_rspid; + uint64_t pcibus_tgtid; + struct uuid pcibus_oem_id; + uint16_t pcibus_oem_length; /* Size of OEM data. */ + /* N bytes of OEM platform data. */ +}; + +struct mca_pcidev_record { + uint64_t pcidev_flags; +#define MCA_PCIDEV_FLAGS_STATUS (1ULL << 0) +#define MCA_PCIDEV_FLAGS_INFO (1ULL << 1) +#define MCA_PCIDEV_FLAGS_REG_MEM (1ULL << 2) +#define MCA_PCIDEV_FLAGS_REG_IO (1ULL << 3) +#define MCA_PCIDEV_FLAGS_REG_DATA (1ULL << 4) +#define MCA_PCIDEV_FLAGS_OEM_DATA (1ULL << 5) + uint64_t pcidev_status; + struct { + uint16_t info_vendor; + uint16_t info_device; + uint32_t info_ccfn; /* Class code & funct. nr. */ +#define MCA_PCIDEV_INFO_CLASS(x) ((x) & 0xffffff) +#define MCA_PCIDEV_INFO_FUNCTION(x) (((x) >> 24) & 0xff) + uint8_t info_slot; + uint8_t info_bus; + uint8_t info_segment; + uint8_t __res0; + uint32_t __res1; + } pcidev_info; + uint32_t pcidev_reg_mem; + uint32_t pcidev_reg_io; + /* Nx pcidev_reg. */ + /* M bytes of OEM platform data. */ +}; + +struct mca_pcidev_reg { + uint64_t pcidev_reg_addr; + uint64_t pcidev_reg_data; +}; + +#define MCA_UUID_CPU \ + {0xe429faf1,0x3cb7,0x11d4,0xbc,0xa7,{0x00,0x80,0xc7,0x3c,0x88,0x81}} +#define MCA_UUID_MEMORY \ + {0xe429faf2,0x3cb7,0x11d4,0xbc,0xa7,{0x00,0x80,0xc7,0x3c,0x88,0x81}} +#define MCA_UUID_SEL \ + {0xe429faf3,0x3cb7,0x11d4,0xbc,0xa7,{0x00,0x80,0xc7,0x3c,0x88,0x81}} +#define MCA_UUID_PCI_BUS \ + {0xe429faf4,0x3cb7,0x11d4,0xbc,0xa7,{0x00,0x80,0xc7,0x3c,0x88,0x81}} +#define MCA_UUID_SMBIOS \ + {0xe429faf5,0x3cb7,0x11d4,0xbc,0xa7,{0x00,0x80,0xc7,0x3c,0x88,0x81}} +#define MCA_UUID_PCI_DEV \ + {0xe429faf6,0x3cb7,0x11d4,0xbc,0xa7,{0x00,0x80,0xc7,0x3c,0x88,0x81}} +#define MCA_UUID_GENERIC \ + {0xe429faf7,0x3cb7,0x11d4,0xbc,0xa7,{0x00,0x80,0xc7,0x3c,0x88,0x81}} + +#ifdef _KERNEL + +void ia64_mca_init(void); +void ia64_mca_save_state(int); + +#endif /* _KERNEL */ + +#endif /* _MACHINE_MCA_H_ */ diff --git a/StdLib/Include/Ipf/machine/md_var.h b/StdLib/Include/Ipf/machine/md_var.h new file mode 100644 index 0000000000..1f5a75d3da --- /dev/null +++ b/StdLib/Include/Ipf/machine/md_var.h @@ -0,0 +1,95 @@ +/* $NetBSD: md_var.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 1998 Doug Rabson + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _IA64_MD_VAR_H_ +#define _IA64_MD_VAR_H_ + +/* + * Miscellaneous machine-dependent declarations. + */ + +struct ia64_fdesc { + uint64_t func; + uint64_t gp; +}; + +#define FDESC_FUNC(fn) (((struct ia64_fdesc *) fn)->func) +#define FDESC_GP(fn) (((struct ia64_fdesc *) fn)->gp) + +/* Convenience macros to decompose CFM & ar.pfs. */ +#define IA64_CFM_SOF(x) ((x) & 0x7f) +#define IA64_CFM_SOL(x) (((x) >> 7) & 0x7f) +#define IA64_CFM_SOR(x) (((x) >> 14) & 0x0f) +#define IA64_CFM_RRB_GR(x) (((x) >> 18) & 0x7f) +#define IA64_CFM_RRB_FR(x) (((x) >> 25) & 0x7f) +#define IA64_CFM_RRB_PR(x) (((x) >> 32) & 0x3f) + +#define IA64_RNATINDEX(x) (((x) & 0x1f8) >> 3) + +#ifdef _KERNEL + +extern char sigcode[]; +extern char esigcode[]; +extern int szsigcode; +extern long Maxmem; +extern vaddr_t kernstart, kernend; + + +struct _special; +struct fpreg; +struct reg; +struct thread; +struct trapframe; + +void busdma_swi(void); +int copyout_regstack(struct thread *, uint64_t *, uint64_t *); +void cpu_mp_add(u_int, u_int, u_int); +int do_ast(struct trapframe *); +void ia32_trap(int, struct trapframe *); +int ia64_count_cpus(void); +void ia64_flush_dirty(struct thread *, struct _special *); +uint64_t ia64_get_hcdp(void); +int ia64_highfp_drop(struct thread *); +int ia64_highfp_save(struct thread *); +void ia64_init(void); +void ia64_probe_sapics(void); +int interrupt(uint64_t, struct trapframe *); +void map_gateway_page(void); +void map_pal_code(void); +void os_boot_rendez(void); +void os_mca(void); +int syscall(struct trapframe *); +void trap(int, struct trapframe *); +void trap_panic(int, struct trapframe *); +int unaligned_fixup(struct trapframe *, struct thread *); + +#endif /* _KERNEL */ + +#endif /* !_IA64_MD_VAR_H_ */ diff --git a/StdLib/Include/Ipf/machine/pal.h b/StdLib/Include/Ipf/machine/pal.h new file mode 100644 index 0000000000..4a76d62f52 --- /dev/null +++ b/StdLib/Include/Ipf/machine/pal.h @@ -0,0 +1,111 @@ +/* $NetBSD: pal.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 2000 Doug Rabson + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _MACHINE_PAL_H_ +#define _MACHINE_PAL_H_ + +/* + * Architected static calling convention procedures. + */ +#define PAL_CACHE_FLUSH 1 +#define PAL_CACHE_INFO 2 +#define PAL_CACHE_INIT 3 +#define PAL_CACHE_SUMMARY 4 +#define PAL_MEM_ATTRIB 5 +#define PAL_PTCE_INFO 6 +#define PAL_VM_INFO 7 +#define PAL_VM_SUMMARY 8 +#define PAL_BUS_GET_FEATURES 9 +#define PAL_BUS_SET_FEATURES 10 +#define PAL_DEBUG_INFO 11 +#define PAL_FIXED_ADDR 12 +#define PAL_FREQ_BASE 13 +#define PAL_FREQ_RATIOS 14 +#define PAL_PERF_MON_INFO 15 +#define PAL_PLATFORM_ADDR 16 +#define PAL_PROC_GET_FEATURE 17 +#define PAL_PROC_SET_FEATURE 18 +#define PAL_RSE_INFO 19 +#define PAL_VERSION 20 +#define PAL_MC_CLEAR_LOG 21 +#define PAL_MC_DRAIN 22 +#define PAL_MC_DYNAMIC_STATE 24 +#define PAL_MC_ERROR_INFO 25 +#define PAL_MC_EXPECTED 23 +#define PAL_MC_REGISTER_MEM 27 +#define PAL_MC_RESUME 26 +#define PAL_HALT 28 +#define PAL_HALT_LIGHT 29 +#define PAL_COPY_INFO 30 +#define PAL_CACHE_LINE_INIT 31 +#define PAL_PMI_ENTRYPOINT 32 +#define PAL_ENTER_IA_32_ENV 33 +#define PAL_VM_PAGE_SIZE 34 +#define PAL_MEM_FOR_TEST 37 +#define PAL_CACHE_PROT_INFO 38 +#define PAL_REGISTER_INFO 39 +#define PAL_SHUTDOWN 40 +#define PAL_PREFETCH_VISIBILITY 41 + +/* + * Architected stacked calling convention procedures. + */ +#define PAL_COPY_PAL 256 +#define PAL_HALT_INFO 257 +#define PAL_TEST_PROC 258 +#define PAL_CACHE_READ 259 +#define PAL_CACHE_WRITE 260 +#define PAL_VM_TR_READ 261 + +/* + * Default physical address of the Processor Interrupt Block (PIB). + * See also: IA-64 SDM, rev 1.1, volume 2, page 5-31. + */ +#define PAL_PIB_DEFAULT_ADDR 0x00000000FEE00000L + +struct ia64_pal_result { + int64_t pal_status; + u_int64_t pal_result[3]; +}; + +extern struct ia64_pal_result + ia64_call_pal_static(u_int64_t proc, u_int64_t arg1, + u_int64_t arg2, u_int64_t arg3); +extern struct ia64_pal_result + ia64_call_pal_static_physical(u_int64_t proc, u_int64_t arg1, + u_int64_t arg2, u_int64_t arg3); +extern struct ia64_pal_result + ia64_call_pal_stacked(u_int64_t proc, u_int64_t arg1, + u_int64_t arg2, u_int64_t arg3); +extern struct ia64_pal_result + ia64_call_pal_stacked_physical(u_int64_t proc, u_int64_t arg1, + u_int64_t arg2, u_int64_t arg3); + +#endif /* _MACHINE_PAL_H_ */ diff --git a/StdLib/Include/Ipf/machine/param.h b/StdLib/Include/Ipf/machine/param.h new file mode 100644 index 0000000000..1d7180606a --- /dev/null +++ b/StdLib/Include/Ipf/machine/param.h @@ -0,0 +1,152 @@ +/* $NetBSD: param.h,v 1.2 2006/08/28 13:43:35 yamt Exp $ */ + +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)param.h 5.8 (Berkeley) 6/28/91 + */ + +#ifndef _IA64_PARAM_H_ +#define _IA64_PARAM_H_ + +/* + * Machine dependent constants for Intel Itanium. + */ + +#define _MACHINE ia64 +#define MACHINE "ia64" +#define _MACHINE_ARCH ia64 +#define MACHINE_ARCH "ia64" +#define MID_MACHINE MID_IA64 + +#ifdef SMP +#define MAXCPU 16 +#else +#define MAXCPU 1 +#endif + +#define DEV_BSHIFT 9 /* log2(DEV_BSIZE) */ +#define DEV_BSIZE (1<> PAGE_SHIFT) +#define NKMEMPAGES_MAX_DEFAULT ((128 * 1024 * 1024) >> PAGE_SHIFT) + +/* + * Mach derived conversion macros + */ + +#define ia64_round_page(x) ((((unsigned long)(x)) + NBPG - 1) & ~(NBPG - 1)) +#define ia64_trunc_page(x) ((unsigned long)(x) & ~(NBPG - 1)) + +#define ia64_btop(x) ((unsigned long)(x) >> PGSHIFT) +#define ia64_ptob(x) ((unsigned long)(x) << PGSHIFT) + +#ifdef _KERNEL +#ifndef _LOCORE + +#include + +#endif /* _LOCORE */ +#endif /* _KERNEL */ + +#endif /* _IA64_PARAM_H_ */ diff --git a/StdLib/Include/Ipf/machine/pcb.h b/StdLib/Include/Ipf/machine/pcb.h new file mode 100644 index 0000000000..6158e29f93 --- /dev/null +++ b/StdLib/Include/Ipf/machine/pcb.h @@ -0,0 +1,78 @@ +/* $NetBSD: pcb.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 2003,2004 Marcel Moolenaar + * Copyright (c) 2000 Doug Rabson + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/sys/ia64/include/pcb.h,v 1.16 2004/08/16 19:05:08 marcel Exp $ + */ + +#ifndef _IA64_PCB_H_ +#define _IA64_PCB_H_ + +#include +#include + +/* + * PCB: process control block + */ +struct pmap; +struct pcb { + struct _special pcb_special; + struct _callee_saved pcb_preserved; + struct _callee_saved_fp pcb_preserved_fp; + struct _high_fp pcb_high_fp; + struct pcpu *pcb_fpcpu; + struct simplelock pcb_fpcpu_slock; + + + /* IA32 specific registers. */ + uint64_t pcb_ia32_cflg; + uint64_t pcb_ia32_eflag; + uint64_t pcb_ia32_fcr; + uint64_t pcb_ia32_fdr; + uint64_t pcb_ia32_fir; + uint64_t pcb_ia32_fsr; + + uint64_t pcb_onfault; /* for copy faults */ + // struct pmap *pcb_current_pmap; +}; + +#ifdef _KERNEL + +#define savectx(p) swapctx(p, NULL) + +struct trapframe; + +void makectx(struct trapframe *, struct pcb *); +/*void restorectx(struct pcb *) __dead2;*/ +int swapctx(struct pcb *old, struct pcb *new); + +void ia32_restorectx(struct pcb *); +void ia32_savectx(struct pcb *); + +#endif + +#endif /* _IA64_PCB_H_ */ diff --git a/StdLib/Include/Ipf/machine/pmap.h b/StdLib/Include/Ipf/machine/pmap.h new file mode 100644 index 0000000000..04b78a3e60 --- /dev/null +++ b/StdLib/Include/Ipf/machine/pmap.h @@ -0,0 +1,162 @@ +/*- + * Copyright (c) 1998, 1999, 2000, 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, + * NASA Ames Research Center and by Chris G. Demetriou. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/*- + * Copyright (c) 1991 Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * the Systems Programming Group of the University of Utah Computer + * Science Department and William Jolitz of UUNET Technologies Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Derived from hp300 version by Mike Hibler, this version by William + * Jolitz uses a recursive map [a pde points to the page directory] to + * map the page tables using the pagetables themselves. This is done to + * reduce the impact on kernel virtual memory for lots of sparse address + * space, and to reduce the cost of memory to each process. + * + * from: hp300: @(#)pmap.h 7.2 (Berkeley) 12/16/90 + * from: @(#)pmap.h 7.4 (Berkeley) 5/12/91 + * from: i386 pmap.h,v 1.54 1997/11/20 19:30:35 bde Exp + * $FreeBSD: src/sys/ia64/include/pmap.h,v 1.25 2005/09/03 23:53:50 marcel Exp $ + */ + +#ifndef _PMAP_MACHINE_ +#define _PMAP_MACHINE_ + +#include + +paddr_t vtophys(vaddr_t); + +struct pv_entry; /* Forward declaration. */ + +struct pmap { + TAILQ_ENTRY(pmap) pm_list; /* list of all pmaps */ + TAILQ_HEAD(,pv_entry) pm_pvlist; /* list of mappings in pmap */ + int pm_count; /* pmap reference count */ + struct simplelock pm_slock; /* lock on pmap */ + u_int32_t pm_rid[5]; /* base RID for pmap */ + int pm_active; /* active flag */ + struct pmap_statistics pm_stats; /* pmap statistics */ + unsigned long pm_cpus; /* mask of CPUs using pmap */ + +}; + +typedef struct pmap *pmap_t; + +/* + * For each vm_page_t, there is a list of all currently valid virtual + * mappings of that page. An entry is a pv_entry_t, the list is pv_pvlist. + */ +typedef struct pv_entry { + pmap_t pv_pmap; /* pmap where mapping lies */ + vaddr_t pv_va; /* virtual address for mapping */ + TAILQ_ENTRY(pv_entry) pv_list; + TAILQ_ENTRY(pv_entry) pv_plist; +} *pv_entry_t; + +/* pvh_attrs */ +#define PGA_MODIFIED 0x01 /* modified */ +#define PGA_REFERENCED 0x02 /* referenced */ + + +extern struct pmap kernel_pmap_store; + +#define pmap_kernel() (&kernel_pmap_store) + +#define pmap_resident_count(pmap) ((pmap)->pm_stats.resident_count) +#define pmap_wired_count(pmap) ((pmap)->pm_stats.wired_count) + +#define pmap_copy(dp, sp, da, l, sa) /* nothing */ +#define pmap_update(pmap) /* nothing (yet) */ + +void pmap_bootstrap(void); + +#define pmap_is_referenced(pg) \ + (((pg)->mdpage.pvh_attrs & PGA_REFERENCED) != 0) +#define pmap_is_modified(pg) \ + (((pg)->mdpage.pvh_attrs & PGA_MODIFIED) != 0) + + +#define PMAP_STEAL_MEMORY /* enable pmap_steal_memory() */ + +/* + * Alternate mapping hooks for pool pages. Avoids thrashing the TLB. + */ +#define PMAP_MAP_POOLPAGE(pa) IA64_PHYS_TO_RR7((pa)) +#define PMAP_UNMAP_POOLPAGE(va) IA64_RR_MASK((va)) + +/* + * Macros for locking pmap structures. + * + * Note that we if we access the kernel pmap in interrupt context, it + * is only to update statistics. Since stats are updated using atomic + * operations, locking the kernel pmap is not necessary. Therefore, + * it is not necessary to block interrupts when locking pmap strucutres. + */ +#define PMAP_LOCK(pmap) simple_lock(&(pmap)->pm_slock) +#define PMAP_UNLOCK(pmap) simple_unlock(&(pmap)->pm_slock) + + +#define PMAP_VHPT_LOG2SIZE 16 + + +#endif /* _PMAP_MACHINE_ */ diff --git a/StdLib/Include/Ipf/machine/pte.h b/StdLib/Include/Ipf/machine/pte.h new file mode 100644 index 0000000000..aa4fe017d7 --- /dev/null +++ b/StdLib/Include/Ipf/machine/pte.h @@ -0,0 +1,110 @@ +/* $NetBSD: pte.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 2001 Doug Rabson + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _MACHINE_PTE_H_ +#define _MACHINE_PTE_H_ + +#define PTE_PRESENT 0x0000000000000001 +#define PTE__RV1_ 0x0000000000000002 +#define PTE_MA_MASK 0x000000000000001C +#define PTE_MA_WB 0x0000000000000000 +#define PTE_MA_UC 0x0000000000000010 +#define PTE_MA_UCE 0x0000000000000014 +#define PTE_MA_WC 0x0000000000000018 +#define PTE_MA_NATPAGE 0x000000000000001C +#define PTE_ACCESSED 0x0000000000000020 +#define PTE_DIRTY 0x0000000000000040 +#define PTE_PL_MASK 0x0000000000000180 +#define PTE_PL_KERN 0x0000000000000000 +#define PTE_PL_USER 0x0000000000000180 +#define PTE_AR_MASK 0x0000000000000E00 + +#define PTE_AR_R 0x0000000000000000 +#define PTE_AR_RX 0x0000000000000200 +#define PTE_AR_RW 0x0000000000000400 +#define PTE_AR_RWX 0x0000000000000600 +#define PTE_AR_R_RW 0x0000000000000800 +#define PTE_AR_RX_RWX 0x0000000000000A00 +#define PTE_AR_RWX_RW 0x0000000000000C00 +#define PTE_AR_X_RX 0x0000000000000E00 +#define PTE_PPN_MASK 0x0003FFFFFFFFF000 +#define PTE__RV2_ 0x000C000000000000 +#define PTE_ED 0x0010000000000000 +#define PTE_IG_MASK 0xFFE0000000000000 +#define PTE_WIRED 0x0020000000000000 +#define PTE_MANAGED 0x0040000000000000 +#define PTE_PROT_MASK 0x0700000000000000 + +#define ITIR__RV1_ 0x0000000000000003 +#define ITIR_PS_MASK 0x00000000000000FC +#define ITIR_KEY_MASK 0x00000000FFFFFF00 +#define ITIR__RV2_ 0xFFFFFFFF00000000 + +#ifndef _LOCORE + +typedef uint64_t pt_entry_t; + +static __inline pt_entry_t +pte_atomic_clear(pt_entry_t *ptep, uint64_t val) +{ + return (atomic_clear_64(ptep, val)); +} + +static __inline pt_entry_t +pte_atomic_set(pt_entry_t *ptep, uint64_t val) +{ + return (atomic_set_64(ptep, val)); +} + +/* + * A long-format VHPT entry. + */ +struct ia64_lpte { + pt_entry_t pte; + uint64_t itir; + uint64_t tag; /* includes ti */ + uint64_t chain; /* pa of collision chain */ +}; + + +/* + * Layout of rr[x]. + */ +struct ia64_rr { + uint64_t rr_ve :1; /* bit 0 */ + uint64_t __rv1__ :1; /* bit 1 */ + uint64_t rr_ps :6; /* bits 2..7 */ + uint64_t rr_rid :24; /* bits 8..31 */ + uint64_t __rv2__ :32; /* bits 32..63 */ +}; + +#endif /* !LOCORE */ + +#endif /* !_MACHINE_PTE_H_ */ diff --git a/StdLib/Include/Ipf/machine/ptrace.h b/StdLib/Include/Ipf/machine/ptrace.h new file mode 100644 index 0000000000..1f29a8394c --- /dev/null +++ b/StdLib/Include/Ipf/machine/ptrace.h @@ -0,0 +1,40 @@ +/* $NetBSD: ptrace.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/* + * Copyright (c) 1994 Christopher G. Demetriou + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Christopher G. Demetriou. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * IA64 dependent ptrace definitions. + */ +#define PT_STEP (PT_FIRSTMACH + 0) +#define PT_GETREGS (PT_FIRSTMACH + 1) +#define PT_SETREGS (PT_FIRSTMACH + 2) +#define PT_GETFPREGS (PT_FIRSTMACH + 3) +#define PT_SETFPREGS (PT_FIRSTMACH + 4) diff --git a/StdLib/Include/Ipf/machine/reg.h b/StdLib/Include/Ipf/machine/reg.h new file mode 100644 index 0000000000..4aa811ab33 --- /dev/null +++ b/StdLib/Include/Ipf/machine/reg.h @@ -0,0 +1,53 @@ +/* $NetBSD: reg.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 2000 Doug Rabson + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _IA64_REG_H_ +#define _IA64_REG_H_ + +#include + +struct reg { + struct _special r_special; + struct _callee_saved r_preserved; + struct _caller_saved r_scratch; +}; + +struct fpreg { + struct _callee_saved_fp fpr_preserved; + struct _caller_saved_fp fpr_scratch; + struct _high_fp fpr_high; +}; + +struct dbreg { + unsigned long dbr_data[8]; + unsigned long dbr_inst[8]; +}; + +#endif /* _IA64_REG_H_ */ diff --git a/StdLib/Include/Ipf/machine/sal.h b/StdLib/Include/Ipf/machine/sal.h new file mode 100644 index 0000000000..f7b244ceb9 --- /dev/null +++ b/StdLib/Include/Ipf/machine/sal.h @@ -0,0 +1,144 @@ +/* $NetBSD: sal.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 2001 Doug Rabson + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _MACHINE_SAL_H_ +#define _MACHINE_SAL_H_ + +struct sal_system_table { + char sal_signature[4]; +#define SAL_SIGNATURE "SST_" + u_int32_t sal_length; + u_int8_t sal_rev[2]; + u_int16_t sal_entry_count; + u_int8_t sal_checksum; + u_int8_t sal_reserved1[7]; + u_int8_t sal_a_version[2]; + u_int8_t sal_b_version[2]; + char sal_oem_id[32]; + char sal_product_id[32]; + u_int8_t sal_reserved2[8]; +}; + +struct sal_entrypoint_descriptor { + u_int8_t sale_type; /* == 0 */ + u_int8_t sale_reserved1[7]; + u_int64_t sale_pal_proc; + u_int64_t sale_sal_proc; + u_int64_t sale_sal_gp; + u_int8_t sale_reserved2[16]; +}; + +struct sal_memory_descriptor { + u_int8_t sale_type; /* == 1 */ + u_int8_t sale_need_virtual; + u_int8_t sale_current_attribute; + u_int8_t sale_access_rights; + u_int8_t sale_supported_attributes; + u_int8_t sale_reserved1; + u_int8_t sale_memory_type[2]; + u_int64_t sale_physical_address; + u_int32_t sale_length; + u_int8_t sale_reserved2[12]; +}; + +struct sal_platform_descriptor { + u_int8_t sale_type; /* == 2 */ + u_int8_t sale_features; + u_int8_t sale_reserved[14]; +}; + +struct sal_tr_descriptor { + u_int8_t sale_type; /* == 3 */ + u_int8_t sale_register_type; + u_int8_t sale_register_number; + u_int8_t sale_reserved1[5]; + u_int64_t sale_virtual_address; + u_int64_t sale_page_size; + u_int8_t sale_reserved2[8]; +}; + +struct sal_ptc_cache_descriptor { + u_int8_t sale_type; /* == 4 */ + u_int8_t sale_reserved[3]; + u_int32_t sale_domains; + u_int64_t sale_address; +}; + +struct sal_ap_wakeup_descriptor { + u_int8_t sale_type; /* == 5 */ + u_int8_t sale_mechanism; + u_int8_t sale_reserved[6]; + u_int64_t sale_vector; +}; + +/* + * SAL Procedure numbers. + */ + +#define SAL_SET_VECTORS 0x01000000 +#define SAL_GET_STATE_INFO 0x01000001 +#define SAL_GET_STATE_INFO_SIZE 0x01000002 +#define SAL_CLEAR_STATE_INFO 0x01000003 +#define SAL_MC_RENDEZ 0x01000004 +#define SAL_MC_SET_PARAMS 0x01000005 +#define SAL_REGISTER_PHYSICAL_ADDR 0x01000006 +#define SAL_CACHE_FLUSH 0x01000008 +#define SAL_CACHE_INIT 0x01000009 +#define SAL_PCI_CONFIG_READ 0x01000010 +#define SAL_PCI_CONFIG_WRITE 0x01000011 +#define SAL_FREQ_BASE 0x01000012 +#define SAL_UPDATE_PAL 0x01000020 + +/* SAL_SET_VECTORS event handler types */ +#define SAL_OS_MCA 0 +#define SAL_OS_INIT 1 +#define SAL_OS_BOOT_RENDEZ 2 + +/* SAL_GET_STATE_INFO, SAL_GET_STATE_INFO_SIZE types */ +#define SAL_INFO_MCA 0 +#define SAL_INFO_INIT 1 +#define SAL_INFO_CMC 2 +#define SAL_INFO_CPE 3 +#define SAL_INFO_TYPES 4 /* number of types we know about */ + +struct ia64_sal_result { + int64_t sal_status; + u_int64_t sal_result[3]; +}; + +typedef struct ia64_sal_result sal_entry_t + (u_int64_t, u_int64_t, u_int64_t, u_int64_t, + u_int64_t, u_int64_t, u_int64_t, u_int64_t); + +extern sal_entry_t *ia64_sal_entry; + +extern void ia64_sal_init(void); + +#endif /* _MACHINE_SAL_H_ */ diff --git a/StdLib/Include/Ipf/machine/setjmp.h b/StdLib/Include/Ipf/machine/setjmp.h new file mode 100644 index 0000000000..34b54efe65 --- /dev/null +++ b/StdLib/Include/Ipf/machine/setjmp.h @@ -0,0 +1,101 @@ +/* $NetBSD: setjmp.h,v 1.2 2006/09/10 21:16:56 cherry Exp $ */ + +/*- + * Copyright (c) 2000 + * Intel Corporation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * + * This product includes software developed by Intel Corporation and + * its contributors. + * + * 4. Neither the name of Intel Corporation or its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD: src/sys/ia64/include/setjmp.h,v 1.12 2003/07/26 08:03:43 marcel Exp $ + */ + +#ifndef _MACHINE_SETJMP_H_ +#define _MACHINE_SETJMP_H_ + +#include + +#define JMPBUF_ADDR_OF(buf, item) ((unsigned long)((char *)buf + item)) + +#define J_UNAT 0 +#define J_NATS 0x8 +#define J_PFS 0x10 +#define J_BSP 0x18 +#define J_RNAT 0x20 +#define J_PREDS 0x28 +#define J_LC 0x30 +#define J_R4 0x38 +#define J_R5 0x40 +#define J_R6 0x48 +#define J_R7 0x50 +#define J_SP 0x58 +#define J_F2 0x60 +#define J_F3 0x70 +#define J_F4 0x80 +#define J_F5 0x90 +#define J_F16 0xa0 +#define J_F17 0xb0 +#define J_F18 0xc0 +#define J_F19 0xd0 +#define J_F20 0xe0 +#define J_F21 0xf0 +#define J_F22 0x100 +#define J_F23 0x110 +#define J_F24 0x120 +#define J_F25 0x130 +#define J_F26 0x140 +#define J_F27 0x150 +#define J_F28 0x160 +#define J_F29 0x170 +#define J_F30 0x180 +#define J_F31 0x190 +#define J_FPSR 0x1a0 +#define J_B0 0x1a8 +#define J_B1 0x1b0 +#define J_B2 0x1b8 +#define J_B3 0x1c0 +#define J_B4 0x1c8 +#define J_B5 0x1d0 +#define J_SIGMASK 0x1d8 +#define J_SIGSET 0x1e0 + +#define _JBLEN 0x200 /* Size in long XXX: Set to sizeof(mcontext_t)/sizeof(long) */ + +#ifdef _KERNEL +#ifdef CTASSERT +CTASSERT(sizeof(struct _jmp_buf) == 512); +#endif +#endif + +#endif /* !_MACHINE_SETJMP_H_ */ diff --git a/StdLib/Include/Ipf/machine/signal.h b/StdLib/Include/Ipf/machine/signal.h new file mode 100644 index 0000000000..bd9b92d046 --- /dev/null +++ b/StdLib/Include/Ipf/machine/signal.h @@ -0,0 +1,22 @@ +/** +Copyright (c) 2010, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. +The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php. + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _MACHINE_SIGNAL_H +#define _MACHINE_SIGNAL_H +#include + +/** The type sig_atomic_t is the (possibly volatile-qualified) integer type of + an object that can be accessed as an atomic entity, even in the presence + of asynchronous interrupts. +**/ +typedef INTN sig_atomic_t; + +#endif /* _MACHINE_SIGNAL_H */ diff --git a/StdLib/Include/Ipf/machine/smp.h b/StdLib/Include/Ipf/machine/smp.h new file mode 100644 index 0000000000..d96346b703 --- /dev/null +++ b/StdLib/Include/Ipf/machine/smp.h @@ -0,0 +1,40 @@ +/* + * $FreeBSD: src/sys/ia64/include/smp.h,v 1.10 2005/08/06 20:28:19 marcel Exp $ + */ +#ifndef _MACHINE_SMP_H_ +#define _MACHINE_SMP_H_ + +#ifdef _KERNEL + +/* + * Interprocessor interrupts for SMP. The following values are indices + * into the IPI vector table. The SAL gives us the vector used for AP + * wake-up. We base the other vectors on that. Keep IPI_AP_WAKEUP at + * index 0 and IPI_MCA_RENDEZ at index 1. See sal.c for details. + */ +/* Architecture specific IPIs. */ +#define IPI_AP_WAKEUP 0 +#define IPI_HIGH_FP 1 +#define IPI_MCA_CMCV 2 +#define IPI_MCA_RENDEZ 3 +#define IPI_TEST 4 +/* Machine independent IPIs. */ +#define IPI_AST 5 +#define IPI_RENDEZVOUS 6 +#define IPI_STOP 7 + +#define IPI_COUNT 8 + +#ifndef LOCORE + +extern int ipi_vector[]; + +void ipi_all(int ipi); +void ipi_all_but_self(int ipi); +void ipi_selected(u_int64_t cpus, int ipi); +void ipi_self(int ipi); +void ipi_send(u_int64_t lid, int ipi); + +#endif /* !LOCORE */ +#endif /* _KERNEL */ +#endif /* !_MACHINE_SMP_H */ diff --git a/StdLib/Include/Ipf/machine/ssc.h b/StdLib/Include/Ipf/machine/ssc.h new file mode 100644 index 0000000000..ed1ae172fc --- /dev/null +++ b/StdLib/Include/Ipf/machine/ssc.h @@ -0,0 +1,18 @@ +/* $NetBSD: ssc.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +#define SSC_CONSOLE_INIT 20 +#define SSC_GETCHAR 21 +#define SSC_PUTCHAR 31 +#define SSC_OPEN 50 +#define SSC_CLOSE 51 +#define SSC_READ 52 +#define SSC_WRITE 53 +#define SSC_GET_COMPLETION 54 +#define SSC_WAIT_COMPLETION 55 +#define SSC_GET_RTC 65 +#define SSC_EXIT 66 +#define SSC_LOAD_SYMBOLS 69 +#define SSC_SAL_SET_VECTORS 120 + +u_int64_t +ssc(u_int64_t in0, u_int64_t in1, u_int64_t in2, u_int64_t in3, int which); diff --git a/StdLib/Include/Ipf/machine/stdarg.h b/StdLib/Include/Ipf/machine/stdarg.h new file mode 100644 index 0000000000..96c1a4128c --- /dev/null +++ b/StdLib/Include/Ipf/machine/stdarg.h @@ -0,0 +1,61 @@ +/* $NetBSD: stdarg.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)stdarg.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _IA64_STDARG_H_ +#define _IA64_STDARG_H_ + +#include +#include + +typedef _BSD_VA_LIST_ va_list; + +#ifdef __lint__ +#define __builtin_next_arg(t) ((t) ? 0 : 0) +#define __builtin_stdarg_start(a, l) ((a) = (va_list)(void *)&(l)) +#define __builtin_va_arg(a, t) ((a) ? (t) 0 : (t) 0) +#define __builtin_va_end(a) /* nothing */ +#define __builtin_va_copy(d, s) ((d) = (s)) +#endif + +#define va_start(ap, last) __builtin_stdarg_start((ap), (last)) +#define va_arg __builtin_va_arg +#define va_end(ap) __builtin_va_end(ap) +#define __va_copy(dest, src) __builtin_va_copy((dest), (src)) + +#if !defined(_ANSI_SOURCE) && \ + (defined(_ISOC99_SOURCE) || (__STDC_VERSION__ - 0) >= 199901L || \ + defined(_NETBSD_SOURCE)) +#define va_copy(dest, src) __va_copy((dest), (src)) +#endif + +#endif /* !_IA64_STDARG_H_ */ diff --git a/StdLib/Include/Ipf/machine/types.h b/StdLib/Include/Ipf/machine/types.h new file mode 100644 index 0000000000..206c4e4d12 --- /dev/null +++ b/StdLib/Include/Ipf/machine/types.h @@ -0,0 +1,64 @@ +/* $NetBSD: types.h,v 1.2 2006/09/10 21:30:14 gdamore Exp $ */ + +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)types.h 7.5 (Berkeley) 3/9/91 + */ + +#ifndef _MACHTYPES_H_ +#define _MACHTYPES_H_ +#include +#include +#include + +/* Handle the long and unsigned long data types which EFI doesn't directly support */ +//typedef INTN LONGN; +//typedef UINTN ULONGN; + +typedef PHYSICAL_ADDRESS paddr_t; +typedef UINT64 psize_t; +typedef PHYSICAL_ADDRESS vaddr_t; +typedef UINT64 vsize_t; + +typedef INTN pmc_evid_t; +typedef UINT64 pmc_ctr_t; +typedef INTN register_t; + +typedef __volatile INT32 __cpu_simple_lock_t; + +#define __SIMPLELOCK_LOCKED 1 +#define __SIMPLELOCK_UNLOCKED 0 + +#define __HAVE_CPU_COUNTER +#define __HAVE_SYSCALL_INTERN +#define __HAVE_MINIMAL_EMUL +#define __HAVE_OLD_DISKLABEL +/* XXX: #define __HAVE_CPU_MAXPROC */ + +#endif /* _MACHTYPES_H_ */ diff --git a/StdLib/Include/Ipf/machine/varargs.h b/StdLib/Include/Ipf/machine/varargs.h new file mode 100644 index 0000000000..9158eb5b1f --- /dev/null +++ b/StdLib/Include/Ipf/machine/varargs.h @@ -0,0 +1,52 @@ +/* $NetBSD: varargs.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)varargs.h 8.2 (Berkeley) 3/22/94 + */ + +#ifndef _IA64_VARARGS_H_ +#define _IA64_VARARGS_H_ + +#include + +#define __va_ellipsis ... +#define __va_alist_t __builtin_va_alist_t +#define va_alist __builtin_va_alist +#define va_dcl __va_alist_t __builtin_va_alist; __va_ellipsis + +#undef va_start +#define va_start(ap) __builtin_varargs_start((ap)) + +#endif /* !_IA64_VARARGS_H_ */ diff --git a/StdLib/Include/Ipf/machine/vmparam.h b/StdLib/Include/Ipf/machine/vmparam.h new file mode 100644 index 0000000000..116b7cc3f7 --- /dev/null +++ b/StdLib/Include/Ipf/machine/vmparam.h @@ -0,0 +1,132 @@ +/* $NetBSD: vmparam.h,v 1.2 2006/07/03 17:01:45 cherry Exp $ */ + +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)vmparam.h 5.9 (Berkeley) 5/12/91 + */ + +#ifndef _VMPARAM_H_ +#define _VMPARAM_H_ + +#include + +#define USRSTACK VM_MAX_ADDRESS /* XXX: Revisit vm address space. */ + +/* + * Virtual memory related constants, all in bytes + */ +#ifndef MAXTSIZ +#define MAXTSIZ (1<<30) /* max text size (1G) */ +#endif +#ifndef DFLDSIZ +#define DFLDSIZ (1<<27) /* initial data size (128M) */ +#endif +#ifndef MAXDSIZ +#define MAXDSIZ (1<<30) /* max data size (1G) */ +#endif +#ifndef DFLSSIZ +#define DFLSSIZ (1<<21) /* initial stack size (2M) */ +#endif +#ifndef MAXSSIZ +#define MAXSSIZ (1<<28) /* max stack size (256M) */ +#endif +#ifndef SGROWSIZ +#define SGROWSIZ (128UL*1024) /* amount to grow stack */ +#endif + + + +/* + * PTEs for mapping user space into the kernel for phyio operations. + * 64 pte's are enough to cover 8 disks * MAXBSIZE. + */ +#ifndef USRIOSIZE +#define USRIOSIZE 64 +#endif + +/* + * Manipulating region bits of an address. + */ +#define IA64_RR_BASE(n) (((u_int64_t) (n)) << 61) +#define IA64_RR_MASK(x) ((x) & ((1L << 61) - 1)) + +#define IA64_PHYS_TO_RR6(x) ((x) | IA64_RR_BASE(6)) +#define IA64_PHYS_TO_RR7(x) ((x) | IA64_RR_BASE(7)) + +#define IA64_ID_PAGE_SHIFT 28 /* 256M */ +#define IA64_ID_PAGE_SIZE (1 << IA64_ID_PAGE_SHIFT) +#define IA64_ID_PAGE_MASK (IA64_ID_PAGE_SIZE-1) + +#define IA64_BACKINGSTORE IA64_RR_BASE(4) + +#define PAGE_SHIFT 14 /* 16K pages by default. */ +#define PAGE_SIZE (1 << PAGE_SHIFT) +#define PAGE_MASK (PAGE_SIZE - 1) + +/* user/kernel map constants */ +#define VM_MIN_ADDRESS ((vaddr_t)0) +#define VM_MAX_ADDRESS ((vaddr_t) IA64_RR_BASE(5)) +#define VM_GATEWAY_SIZE PAGE_SIZE +#define VM_MAXUSER_ADDRESS (VM_MAX_ADDRESS + VM_GATEWAY_SIZE) +#define VM_MIN_KERNEL_ADDRESS VM_MAXUSER_ADDRESS +#define VM_MAX_KERNEL_ADDRESS ((vaddr_t) (IA64_RR_BASE(6) - 1)) + +#define VM_PHYSSEG_MAX 16 /* XXX: */ +#define VM_PHYSSEG_STRAT VM_PSTRAT_BSEARCH +#define VM_PHYSSEG_NOADD /* no more after vm_mem_init */ + +#define VM_NFREELIST 1 /* XXX: */ +#define VM_FREELIST_DEFAULT 0 /* XXX: */ + +/* virtual sizes (bytes) for various kernel submaps */ +#define VM_PHYS_SIZE (USRIOSIZE*PAGE_SIZE) + +#ifndef _LOCORE +/* + * pmap-specific data store in the vm_page structure. + */ +#define __HAVE_VM_PAGE_MD +struct vm_page_md { + TAILQ_HEAD(,pv_entry) pv_list; /* pv_entry list */ + int pv_list_count; + struct simplelock pv_slock; /* lock on this head */ + int pvh_attrs; /* page attributes */ +}; + +#define VM_MDPAGE_INIT(pg) \ +do { \ + TAILQ_INIT(&(pg)->mdpage.pv_list); \ + simple_lock_init(&(pg)->mdpage.pv_slock); \ +} while (/*CONSTCOND*/0) +#endif /*_LOCORE*/ + +#endif /* _VMPARAM_H_ */ diff --git a/StdLib/Include/Ipf/machine/wchar_limits.h b/StdLib/Include/Ipf/machine/wchar_limits.h new file mode 100644 index 0000000000..38bdfb8a68 --- /dev/null +++ b/StdLib/Include/Ipf/machine/wchar_limits.h @@ -0,0 +1,42 @@ +/* $NetBSD: wchar_limits.h,v 1.1 2006/04/07 14:21:18 cherry Exp $ */ + +/*- + * Copyright (c) 2004 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Klaus Klein. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _IA64_WCHAR_LIMITS_H_ +#define _IA64_WCHAR_LIMITS_H_ + +#endif /* !_IA64_WCHAR_LIMITS_H_ */ diff --git a/StdLib/Include/X64/machine/ansi.h b/StdLib/Include/X64/machine/ansi.h new file mode 100644 index 0000000000..1d276f608c --- /dev/null +++ b/StdLib/Include/X64/machine/ansi.h @@ -0,0 +1,103 @@ +/** @file + Machine dependent ANSI type definitions. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: ansi.h,v 1.4 2006/10/04 13:51:59 tnozaki Exp + ansi.h 8.2 (Berkeley) 1/4/94 +**/ +#ifndef _ANSI_H_ +#define _ANSI_H_ + +#include + +#include + +/* + * Types which are fundamental to the implementation and may appear in + * more than one standard header are defined here. Standard headers + * then use: + * #ifdef _BSD_SIZE_T_ + * typedef _BSD_SIZE_T_ size_t; + * #undef _BSD_SIZE_T_ + * #endif + */ +#define _BSD_CLOCK_T_ _EFI_CLOCK_T /* clock() */ +#define _BSD_PTRDIFF_T_ _EFI_PTRDIFF_T_ /* ptr1 - ptr2 */ +#define _BSD_SIZE_T_ _EFI_SIZE_T_ /* sizeof() */ +#define _BSD_SSIZE_T_ INTN /* byte count or error */ +#define _BSD_TIME_T_ _EFI_TIME_T /* time() */ +#define _BSD_VA_LIST_ VA_LIST +#define _BSD_CLOCKID_T_ INT64 /* clockid_t */ +#define _BSD_TIMER_T_ INT64 /* timer_t */ +#define _BSD_SUSECONDS_T_ INT64 /* suseconds_t */ +#define _BSD_USECONDS_T_ UINT64 /* useconds_t */ + +/* + * NOTE: rune_t is not covered by ANSI nor other standards, and should not + * be instantiated outside of lib/libc/locale. use wchar_t. + * + * Runes (wchar_t) is declared to be an ``int'' instead of the more natural + * ``unsigned long'' or ``long''. Two things are happening here. It is not + * unsigned so that EOF (-1) can be naturally assigned to it and used. Also, + * it looks like 10646 will be a 31 bit standard. This means that if your + * ints cannot hold 32 bits, you will be in trouble. The reason an int was + * chosen over a long is that the is*() and to*() routines take ints (says + * ANSI C), but they use _RUNE_T_ instead of int. By changing it here, you + * lose a bit of ANSI conformance, but your programs will still work. + * + * Note that _WCHAR_T_ and _RUNE_T_ must be of the same type. When wchar_t + * and rune_t are typedef'd, _WCHAR_T_ will be undef'd, but _RUNE_T remains + * defined for ctype.h. + */ +#define _BSD_WCHAR_T_ _EFI_WCHAR_T /* wchar_t */ +#define _BSD_WINT_T_ _EFI_WINT_T /* wint_t */ +#define _BSD_RUNE_T_ _EFI_WCHAR_T /* rune_t */ +#define _BSD_WCTRANS_T_ void * /* wctrans_t */ +#define _BSD_WCTYPE_T_ unsigned int /* wctype_t */ + +/* + * mbstate_t is an opaque object to keep conversion state, during multibyte + * stream conversions. The content must not be referenced by user programs. + */ +typedef union { + __int64_t __mbstateL; /* for alignment */ + char __mbstate8[128]; +} __mbstate_t; +#define _BSD_MBSTATE_T_ __mbstate_t /* mbstate_t */ + +#endif /* _ANSI_H_ */ diff --git a/StdLib/Include/X64/machine/asm.h b/StdLib/Include/X64/machine/asm.h new file mode 100644 index 0000000000..109d1e1879 --- /dev/null +++ b/StdLib/Include/X64/machine/asm.h @@ -0,0 +1,146 @@ +/* $NetBSD: asm.h,v 1.6 2006/09/05 19:00:42 ad Exp $ */ + +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)asm.h 5.5 (Berkeley) 5/7/91 + */ + +#ifndef _AMD64_ASM_H_ +#define _AMD64_ASM_H_ + +#ifdef PIC +#define PIC_PLT(x) x@PLT +#define PIC_GOT(x) x@GOTPCREL(%rip) +#else +#define PIC_PLT(x) x +#define PIC_GOT(x) x +#endif + +# define _C_LABEL(x) x +#define _ASM_LABEL(x) x + +#define CVAROFF(x,y) (_C_LABEL(x)+y)(%rip) + +#ifdef __STDC__ +# define __CONCAT(x,y) x ## y +# define __STRING(x) #x +#else +# define __CONCAT(x,y) x/**/y +# define __STRING(x) "x" +#endif + +/* let kernels and others override entrypoint alignment */ +#ifndef _ALIGN_TEXT +#define _ALIGN_TEXT .align 4 +#endif + +#define _ENTRY(x) \ + .text; _ALIGN_TEXT; .globl x; .type x,@function; x: + +#ifdef _KERNEL +/* XXX Can't use __CONCAT() here, as it would be evaluated incorrectly. */ +#ifdef __STDC__ +#define IDTVEC(name) \ + ALIGN_TEXT; .globl X ## name; .type X ## name,@function; X ## name: +#else +#define IDTVEC(name) \ + ALIGN_TEXT; .globl X/**/name; .type X/**/name,@function; X/**/name: +#endif /* __STDC__ */ +#endif /* _KERNEL */ + +#ifdef __STDC__ +#define CPUVAR(off) %gs:CPU_INFO_ ## off +#else +#define CPUVAR(off) %gs:CPU_INFO_/**/off +#endif + + +#ifdef GPROF +# define _PROF_PROLOGUE \ + pushq %rbp; leaq (%rsp),%rbp; call PIC_PLT(__mcount); popq %rbp +#else +# define _PROF_PROLOGUE +#endif + +#define ENTRY(y) _ENTRY(_C_LABEL(y)); _PROF_PROLOGUE +#define NENTRY(y) _ENTRY(_C_LABEL(y)) +#define ASENTRY(y) _ENTRY(_ASM_LABEL(y)); _PROF_PROLOGUE + +#define ASMSTR .asciz + +#define RCSID(x) .text; .asciz x + +#define WEAK_ALIAS(alias,sym) \ + .weak alias; \ + alias = sym + +/* + * STRONG_ALIAS: create a strong alias. + */ +#define STRONG_ALIAS(alias,sym) \ + .globl alias; \ + alias = sym + +/* XXXfvdl do not use stabs here */ +#ifdef __STDC__ +#define WARN_REFERENCES(sym,msg) \ + .stabs msg ## ,30,0,0,0 ; \ + .stabs __STRING(_C_LABEL(sym)) ## ,1,0,0,0 +#else +#define WARN_REFERENCES(sym,msg) \ + .stabs msg,30,0,0,0 ; \ + .stabs __STRING(sym),1,0,0,0 +#endif /* __STDC__ */ + +/* + * Assembley equivalent of spllower(). Label contains the label to jump to + * if we need to fire off pending interrupts (e.g. _C_LABEL(Xspllower)). + * + * On entry %rcx = new SPL. + */ +#define SPLLOWER(label) \ + movq CPUVAR(SELF), %r9 ; \ + cmpl CPU_INFO_ILEVEL(%r9), %ecx ; \ + jae 99f ; \ + movl CPU_INFO_IUNMASK(%r9,%rcx,4), %edi ; \ + pushfq ; \ + popq %rax ; \ + cli ; \ + testl CPU_INFO_IPENDING(%r9), %edi ; \ + movq %rcx, %rdi ; \ + jnz label ; \ + movl %ecx, CPU_INFO_ILEVEL(%r9) ; \ + pushq %rax ; \ + popfq ; \ +99: + +#endif /* !_AMD64_ASM_H_ */ diff --git a/StdLib/Include/X64/machine/atomic.h b/StdLib/Include/X64/machine/atomic.h new file mode 100644 index 0000000000..fa5672b4d3 --- /dev/null +++ b/StdLib/Include/X64/machine/atomic.h @@ -0,0 +1,95 @@ +/* $NetBSD: atomic.h,v 1.4 2005/12/28 19:09:29 perry Exp $ */ + +/* + * Copyright 2002 (c) Wasabi Systems, Inc. + * All rights reserved. + * + * Written by Frank van der Linden for Wasabi Systems, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed for the NetBSD Project by + * Wasabi Systems, Inc. + * 4. The name of Wasabi Systems, Inc. may not be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _ATOMIC_H +#define _ATOMIC_H + +#ifndef _LOCORE + +static __inline u_int64_t +x86_atomic_testset_u64(volatile u_int64_t *ptr, u_int64_t val) { + __asm volatile ("xchgq %0,(%2)" :"=r" (val):"0" (val),"r" (ptr)); + return val; +} + +static __inline u_int32_t +x86_atomic_testset_u32(volatile u_int32_t *ptr, u_int32_t val) { + __asm volatile ("xchgl %0,(%2)" :"=r" (val):"0" (val),"r" (ptr)); + return val; +} + + + +static __inline int32_t +x86_atomic_testset_i32(volatile int32_t *ptr, int32_t val) { + __asm volatile ("xchgl %0,(%2)" :"=r" (val):"0" (val),"r" (ptr)); + return val; +} + + + +static __inline void +x86_atomic_setbits_u32(volatile u_int32_t *ptr, u_int32_t bits) { + __asm volatile("lock ; orl %1,%0" : "=m" (*ptr) : "ir" (bits)); +} + +static __inline void +x86_atomic_clearbits_u32(volatile u_int32_t *ptr, u_int32_t bits) { + __asm volatile("lock ; andl %1,%0" : "=m" (*ptr) : "ir" (~bits)); +} + + + +static __inline void +x86_atomic_setbits_u64(volatile u_int64_t *ptr, u_int64_t bits) { + __asm volatile("lock ; orq %1,%0" : "=m" (*ptr) : "ir" (~bits)); +} + +static __inline void +x86_atomic_clearbits_u64(volatile u_int64_t *ptr, u_int64_t bits) { + __asm volatile("lock ; andq %1,%0" : "=m" (*ptr) : "ir" (~bits)); +} + +#define x86_atomic_testset_ul x86_atomic_testset_u32 +#define x86_atomic_testset_i x86_atomic_testset_i32 +#define x86_atomic_setbits_l x86_atomic_setbits_u32 +#define x86_atomic_setbits_ul x86_atomic_setbits_u32 +#define x86_atomic_clearbits_l x86_atomic_clearbits_u32 +#define x86_atomic_clearbits_ul x86_atomic_clearbits_u32 + +#endif +#endif diff --git a/StdLib/Include/X64/machine/bswap.h b/StdLib/Include/X64/machine/bswap.h new file mode 100644 index 0000000000..1c8caaad4c --- /dev/null +++ b/StdLib/Include/X64/machine/bswap.h @@ -0,0 +1,13 @@ +/* $NetBSD: bswap.h,v 1.2 2006/01/31 07:49:18 dsl Exp $ */ + +/* Written by Manuel Bouyer. Public domain */ + +#ifndef _MACHINE_BSWAP_H_ +#define _MACHINE_BSWAP_H_ + +#include + +#define __BSWAP_RENAME +#include + +#endif /* !_MACHINE_BSWAP_H_ */ diff --git a/StdLib/Include/X64/machine/byte_swap.h b/StdLib/Include/X64/machine/byte_swap.h new file mode 100644 index 0000000000..dec8a24015 --- /dev/null +++ b/StdLib/Include/X64/machine/byte_swap.h @@ -0,0 +1,71 @@ +/* $NetBSD: byte_swap.h,v 1.4 2006/01/30 22:46:35 dsl Exp $ */ + +/*- + * Copyright (c) 1998 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Charles M. Hannum. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Copy of the i386 version. 64 bit versions may be added later. + */ + +#ifndef _AMD64_BYTE_SWAP_H_ +#define _AMD64_BYTE_SWAP_H_ + +#ifdef __GNUC__ +#include +__BEGIN_DECLS + +#define __BYTE_SWAP_U32_VARIABLE __byte_swap_u32_variable +static __inline uint32_t __byte_swap_u32_variable(uint32_t); +static __inline uint32_t +__byte_swap_u32_variable(uint32_t x) +{ + __asm volatile ( "bswap %1" : "=r" (x) : "0" (x)); + return (x); +} + +#define __BYTE_SWAP_U16_VARIABLE __byte_swap_u16_variable +static __inline uint16_t __byte_swap_u16_variable(uint16_t); +static __inline uint16_t +__byte_swap_u16_variable(uint16_t x) +{ + __asm volatile ("rorw $8, %w1" : "=r" (x) : "0" (x)); + return (x); +} + +__END_DECLS +#endif + +#endif /* !_AMD64_BYTE_SWAP_H_ */ diff --git a/StdLib/Include/X64/machine/endian.h b/StdLib/Include/X64/machine/endian.h new file mode 100644 index 0000000000..53de9c6ef4 --- /dev/null +++ b/StdLib/Include/X64/machine/endian.h @@ -0,0 +1,3 @@ +/* $NetBSD: endian.h,v 1.1 2003/04/26 18:39:40 fvdl Exp $ */ + +#include diff --git a/StdLib/Include/X64/machine/endian_machdep.h b/StdLib/Include/X64/machine/endian_machdep.h new file mode 100644 index 0000000000..efe81a3ec3 --- /dev/null +++ b/StdLib/Include/X64/machine/endian_machdep.h @@ -0,0 +1,3 @@ +/* $NetBSD: endian_machdep.h,v 1.4 2006/01/30 21:52:38 dsl Exp $ */ + +#define _BYTE_ORDER _LITTLE_ENDIAN diff --git a/StdLib/Include/X64/machine/float.h b/StdLib/Include/X64/machine/float.h new file mode 100644 index 0000000000..620601e169 --- /dev/null +++ b/StdLib/Include/X64/machine/float.h @@ -0,0 +1,3 @@ +/* $NetBSD: float.h,v 1.1 2003/04/26 18:39:40 fvdl Exp $ */ + +#include diff --git a/StdLib/Include/X64/machine/fpu.h b/StdLib/Include/X64/machine/fpu.h new file mode 100644 index 0000000000..b463062f31 --- /dev/null +++ b/StdLib/Include/X64/machine/fpu.h @@ -0,0 +1,103 @@ +/* $NetBSD: fpu.h,v 1.1 2003/04/26 18:39:40 fvdl Exp $ */ + +#ifndef _AMD64_FPU_H_ +#define _AMD64_FPU_H_ + +/* + * NetBSD/amd64 only uses the extended save/restore format used + * by fxsave/fsrestore, to always deal with the SSE registers, + * which are part of the ABI to pass floating point values. + * Must be stored in memory on a 16-byte boundary. + */ + +struct fxsave64 { + u_int16_t fx_fcw; + u_int16_t fx_fsw; + u_int8_t fx_ftw; + u_int8_t fx_unused1; + u_int16_t fx_fop; + u_int64_t fx_rip; + u_int64_t fx_rdp; + u_int32_t fx_mxcsr; + u_int32_t fx_mxcsr_mask; + u_int64_t fx_st[8][2]; /* 8 normal FP regs */ + u_int64_t fx_xmm[16][2]; /* 16 SSE2 registers */ + u_int8_t fx_unused3[96]; +} __attribute__((packed)); + +struct savefpu { + struct fxsave64 fp_fxsave; /* see above */ + u_int16_t fp_ex_sw; /* saved status from last exception */ + u_int16_t fp_ex_tw; /* saved tag from last exception */ +}; + +#ifdef _KERNEL + +/* + * This one only used for backward compat coredumping. + */ +struct oldfsave { + u_int16_t fs_control; + u_int16_t fs_unused0; + u_int16_t fs_status; + u_int16_t fs_unused1; + u_int16_t fs_tag; + u_int16_t fs_unused2; + u_int32_t fs_ipoff; + u_int16_t fs_ipsel; + u_int16_t fs_op; + u_int32_t fs_opoff; + u_int16_t fs_opsel; +} __attribute__ ((packed)); + +#endif + + +/* + * The i387 defaults to Intel extended precision mode and round to nearest, + * with all exceptions masked. + */ +#define __INITIAL_NPXCW__ 0x037f +#define __INITIAL_MXCSR__ 0x1f80 +#define __INITIAL_MXCSR_MASK__ 0xffbf + +/* NetBSD uses IEEE double precision. */ +#define __NetBSD_NPXCW__ 0x127f +/* Linux just uses the default control word. */ +#define __Linux_NPXCW__ 0x037f + +/* + * The standard control word from finit is 0x37F, giving: + * round to nearest + * 64-bit precision + * all exceptions masked. + * + * Now we want: + * affine mode (if we decide to support 287's) + * round to nearest + * 53-bit precision + * all exceptions masked. + * + * 64-bit precision often gives bad results with high level languages + * because it makes the results of calculations depend on whether + * intermediate values are stored in memory or in FPU registers. + */ + +#ifdef _KERNEL +/* + * XXX + */ +struct trapframe; +struct cpu_info; + +void fpuinit(struct cpu_info *); +void fpudrop(void); +void fpusave(struct lwp *); +void fpudiscard(struct lwp *); +void fputrap(struct trapframe *); +void fpusave_lwp(struct lwp *, int); +void fpusave_cpu(struct cpu_info *, int); + +#endif + +#endif /* _AMD64_FPU_H_ */ diff --git a/StdLib/Include/X64/machine/ieee.h b/StdLib/Include/X64/machine/ieee.h new file mode 100644 index 0000000000..6f942256dc --- /dev/null +++ b/StdLib/Include/X64/machine/ieee.h @@ -0,0 +1,3 @@ +/* $NetBSD: ieee.h,v 1.1 2003/04/26 18:39:41 fvdl Exp $ */ + +#include diff --git a/StdLib/Include/X64/machine/int_const.h b/StdLib/Include/X64/machine/int_const.h new file mode 100644 index 0000000000..084796358d --- /dev/null +++ b/StdLib/Include/X64/machine/int_const.h @@ -0,0 +1,63 @@ +/* $NetBSD: int_const.h,v 1.1 2003/04/26 18:39:42 fvdl Exp $ */ + +/*- + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Klaus Klein. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _AMD64_INT_CONST_H_ +#define _AMD64_INT_CONST_H_ + +/* + * 7.18.4 Macros for integer constants + */ + +/* 7.18.4.1 Macros for minimum-width integer constants */ + +#define INT8_C(c) c +#define INT16_C(c) c +#define INT32_C(c) c +#define INT64_C(c) c ## LL + +#define UINT8_C(c) c ## U +#define UINT16_C(c) c ## U +#define UINT32_C(c) c ## U +#define UINT64_C(c) c ## ULL + +/* 7.18.4.2 Macros for greatest-width integer constants */ + +#define INTMAX_C(c) c ## LL +#define UINTMAX_C(c) c ## ULL + +#endif /* !_AMD64_INT_CONST_H_ */ diff --git a/StdLib/Include/X64/machine/int_fmtio.h b/StdLib/Include/X64/machine/int_fmtio.h new file mode 100644 index 0000000000..181cc26e84 --- /dev/null +++ b/StdLib/Include/X64/machine/int_fmtio.h @@ -0,0 +1,219 @@ +/* $NetBSD: int_fmtio.h,v 1.4 2005/12/11 12:16:25 christos Exp $ */ + +/*- + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Klaus Klein. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _AMD64_INT_FMTIO_H_ +#define _AMD64_INT_FMTIO_H_ + +/* + * 7.8.1 Macros for format specifiers + */ + +/* fprintf macros for signed integers */ + +#define PRId8 "d" /* int8_t */ +#define PRId16 "d" /* int16_t */ +#define PRId32 "d" /* int32_t */ +#define PRId64 "ld" /* int64_t */ +#define PRIdLEAST8 "d" /* int_least8_t */ +#define PRIdLEAST16 "d" /* int_least16_t */ +#define PRIdLEAST32 "d" /* int_least32_t */ +#define PRIdLEAST64 "ld" /* int_least64_t */ +#define PRIdFAST8 "d" /* int_fast8_t */ +#define PRIdFAST16 "d" /* int_fast16_t */ +#define PRIdFAST32 "d" /* int_fast32_t */ +#define PRIdFAST64 "ld" /* int_fast64_t */ +#define PRIdMAX "ld" /* intmax_t */ +#define PRIdPTR "ld" /* intptr_t */ + +#define PRIi8 "i" /* int8_t */ +#define PRIi16 "i" /* int16_t */ +#define PRIi32 "i" /* int32_t */ +#define PRIi64 "li" /* int64_t */ +#define PRIiLEAST8 "i" /* int_least8_t */ +#define PRIiLEAST16 "i" /* int_least16_t */ +#define PRIiLEAST32 "i" /* int_least32_t */ +#define PRIiLEAST64 "li" /* int_least64_t */ +#define PRIiFAST8 "i" /* int_fast8_t */ +#define PRIiFAST16 "i" /* int_fast16_t */ +#define PRIiFAST32 "i" /* int_fast32_t */ +#define PRIiFAST64 "li" /* int_fast64_t */ +#define PRIiMAX "li" /* intmax_t */ +#define PRIiPTR "li" /* intptr_t */ + +/* fprintf macros for unsigned integers */ + +#define PRIo8 "o" /* uint8_t */ +#define PRIo16 "o" /* uint16_t */ +#define PRIo32 "o" /* uint32_t */ +#define PRIo64 "lo" /* uint64_t */ +#define PRIoLEAST8 "o" /* uint_least8_t */ +#define PRIoLEAST16 "o" /* uint_least16_t */ +#define PRIoLEAST32 "o" /* uint_least32_t */ +#define PRIoLEAST64 "lo" /* uint_least64_t */ +#define PRIoFAST8 "o" /* uint_fast8_t */ +#define PRIoFAST16 "o" /* uint_fast16_t */ +#define PRIoFAST32 "o" /* uint_fast32_t */ +#define PRIoFAST64 "lo" /* uint_fast64_t */ +#define PRIoMAX "lo" /* uintmax_t */ +#define PRIoPTR "lo" /* uintptr_t */ + +#define PRIu8 "u" /* uint8_t */ +#define PRIu16 "u" /* uint16_t */ +#define PRIu32 "u" /* uint32_t */ +#define PRIu64 "lu" /* uint64_t */ +#define PRIuLEAST8 "u" /* uint_least8_t */ +#define PRIuLEAST16 "u" /* uint_least16_t */ +#define PRIuLEAST32 "u" /* uint_least32_t */ +#define PRIuLEAST64 "lu" /* uint_least64_t */ +#define PRIuFAST8 "u" /* uint_fast8_t */ +#define PRIuFAST16 "u" /* uint_fast16_t */ +#define PRIuFAST32 "u" /* uint_fast32_t */ +#define PRIuFAST64 "lu" /* uint_fast64_t */ +#define PRIuMAX "lu" /* uintmax_t */ +#define PRIuPTR "lu" /* uintptr_t */ + +#define PRIx8 "x" /* uint8_t */ +#define PRIx16 "x" /* uint16_t */ +#define PRIx32 "x" /* uint32_t */ +#define PRIx64 "lx" /* uint64_t */ +#define PRIxLEAST8 "x" /* uint_least8_t */ +#define PRIxLEAST16 "x" /* uint_least16_t */ +#define PRIxLEAST32 "x" /* uint_least32_t */ +#define PRIxLEAST64 "lx" /* uint_least64_t */ +#define PRIxFAST8 "x" /* uint_fast8_t */ +#define PRIxFAST16 "x" /* uint_fast16_t */ +#define PRIxFAST32 "x" /* uint_fast32_t */ +#define PRIxFAST64 "lx" /* uint_fast64_t */ +#define PRIxMAX "lx" /* uintmax_t */ +#define PRIxPTR "lx" /* uintptr_t */ + +#define PRIX8 "X" /* uint8_t */ +#define PRIX16 "X" /* uint16_t */ +#define PRIX32 "X" /* uint32_t */ +#define PRIX64 "lX" /* uint64_t */ +#define PRIXLEAST8 "X" /* uint_least8_t */ +#define PRIXLEAST16 "X" /* uint_least16_t */ +#define PRIXLEAST32 "X" /* uint_least32_t */ +#define PRIXLEAST64 "lX" /* uint_least64_t */ +#define PRIXFAST8 "X" /* uint_fast8_t */ +#define PRIXFAST16 "X" /* uint_fast16_t */ +#define PRIXFAST32 "X" /* uint_fast32_t */ +#define PRIXFAST64 "lX" /* uint_fast64_t */ +#define PRIXMAX "lX" /* uintmax_t */ +#define PRIXPTR "lX" /* uintptr_t */ + +/* fscanf macros for signed integers */ + +#define SCNd8 "hhd" /* int8_t */ +#define SCNd16 "hd" /* int16_t */ +#define SCNd32 "d" /* int32_t */ +#define SCNd64 "ld" /* int64_t */ +#define SCNdLEAST8 "hhd" /* int_least8_t */ +#define SCNdLEAST16 "hd" /* int_least16_t */ +#define SCNdLEAST32 "d" /* int_least32_t */ +#define SCNdLEAST64 "ld" /* int_least64_t */ +#define SCNdFAST8 "d" /* int_fast8_t */ +#define SCNdFAST16 "d" /* int_fast16_t */ +#define SCNdFAST32 "d" /* int_fast32_t */ +#define SCNdFAST64 "ld" /* int_fast64_t */ +#define SCNdMAX "ld" /* intmax_t */ +#define SCNdPTR "ld" /* intptr_t */ + +#define SCNi8 "hhi" /* int8_t */ +#define SCNi16 "hi" /* int16_t */ +#define SCNi32 "i" /* int32_t */ +#define SCNi64 "li" /* int64_t */ +#define SCNiLEAST8 "hhi" /* int_least8_t */ +#define SCNiLEAST16 "hi" /* int_least16_t */ +#define SCNiLEAST32 "i" /* int_least32_t */ +#define SCNiLEAST64 "li" /* int_least64_t */ +#define SCNiFAST8 "i" /* int_fast8_t */ +#define SCNiFAST16 "i" /* int_fast16_t */ +#define SCNiFAST32 "i" /* int_fast32_t */ +#define SCNiFAST64 "li" /* int_fast64_t */ +#define SCNiMAX "li" /* intmax_t */ +#define SCNiPTR "li" /* intptr_t */ + +/* fscanf macros for unsigned integers */ + +#define SCNo8 "hho" /* uint8_t */ +#define SCNo16 "ho" /* uint16_t */ +#define SCNo32 "o" /* uint32_t */ +#define SCNo64 "lo" /* uint64_t */ +#define SCNoLEAST8 "hho" /* uint_least8_t */ +#define SCNoLEAST16 "ho" /* uint_least16_t */ +#define SCNoLEAST32 "o" /* uint_least32_t */ +#define SCNoLEAST64 "lo" /* uint_least64_t */ +#define SCNoFAST8 "o" /* uint_fast8_t */ +#define SCNoFAST16 "o" /* uint_fast16_t */ +#define SCNoFAST32 "o" /* uint_fast32_t */ +#define SCNoFAST64 "lo" /* uint_fast64_t */ +#define SCNoMAX "lo" /* uintmax_t */ +#define SCNoPTR "lo" /* uintptr_t */ + +#define SCNu8 "hhu" /* uint8_t */ +#define SCNu16 "hu" /* uint16_t */ +#define SCNu32 "u" /* uint32_t */ +#define SCNu64 "lu" /* uint64_t */ +#define SCNuLEAST8 "hhu" /* uint_least8_t */ +#define SCNuLEAST16 "hu" /* uint_least16_t */ +#define SCNuLEAST32 "u" /* uint_least32_t */ +#define SCNuLEAST64 "lu" /* uint_least64_t */ +#define SCNuFAST8 "u" /* uint_fast8_t */ +#define SCNuFAST16 "u" /* uint_fast16_t */ +#define SCNuFAST32 "u" /* uint_fast32_t */ +#define SCNuFAST64 "lu" /* uint_fast64_t */ +#define SCNuMAX "lu" /* uintmax_t */ +#define SCNuPTR "lu" /* uintptr_t */ + +#define SCNx8 "hhx" /* uint8_t */ +#define SCNx16 "hx" /* uint16_t */ +#define SCNx32 "x" /* uint32_t */ +#define SCNx64 "lx" /* uint64_t */ +#define SCNxLEAST8 "hhx" /* uint_least8_t */ +#define SCNxLEAST16 "hx" /* uint_least16_t */ +#define SCNxLEAST32 "x" /* uint_least32_t */ +#define SCNxLEAST64 "lx" /* uint_least64_t */ +#define SCNxFAST8 "x" /* uint_fast8_t */ +#define SCNxFAST16 "x" /* uint_fast16_t */ +#define SCNxFAST32 "x" /* uint_fast32_t */ +#define SCNxFAST64 "lx" /* uint_fast64_t */ +#define SCNxMAX "lx" /* uintmax_t */ +#define SCNxPTR "lx" /* uintptr_t */ + +#endif /* !_AMD64_INT_FMTIO_H_ */ diff --git a/StdLib/Include/X64/machine/int_limits.h b/StdLib/Include/X64/machine/int_limits.h new file mode 100644 index 0000000000..8543760e53 --- /dev/null +++ b/StdLib/Include/X64/machine/int_limits.h @@ -0,0 +1,135 @@ +/* $NetBSD: int_limits.h,v 1.3 2005/12/11 12:16:25 christos Exp $ */ + +/*- + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Klaus Klein. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _AMD64_INT_LIMITS_H_ +#define _AMD64_INT_LIMITS_H_ + +/* + * 7.18.2 Limits of specified-width integer types + */ + +/* 7.18.2.1 Limits of exact-width integer types */ + +/* minimum values of exact-width signed integer types */ +#define INT8_MIN (-0x7f-1) /* int8_t */ +#define INT16_MIN (-0x7fff-1) /* int16_t */ +#define INT32_MIN (-0x7fffffff-1) /* int32_t */ +#define INT64_MIN (-0x7fffffffffffffffLL-1) /* int64_t */ + +/* maximum values of exact-width signed integer types */ +#define INT8_MAX 0x7f /* int8_t */ +#define INT16_MAX 0x7fff /* int16_t */ +#define INT32_MAX 0x7fffffff /* int32_t */ +#define INT64_MAX 0x7fffffffffffffffLL /* int64_t */ + +/* maximum values of exact-width unsigned integer types */ +#define UINT8_MAX 0xffU /* uint8_t */ +#define UINT16_MAX 0xffffU /* uint16_t */ +#define UINT32_MAX 0xffffffffU /* uint32_t */ +#define UINT64_MAX 0xffffffffffffffffULL /* uint64_t */ + +/* 7.18.2.2 Limits of minimum-width integer types */ + +/* minimum values of minimum-width signed integer types */ +#define INT_LEAST8_MIN (-0x7f-1) /* int_least8_t */ +#define INT_LEAST16_MIN (-0x7fff-1) /* int_least16_t */ +#define INT_LEAST32_MIN (-0x7fffffff-1) /* int_least32_t */ +#define INT_LEAST64_MIN (-0x7fffffffffffffffLL-1) /* int_least64_t */ + +/* maximum values of minimum-width signed integer types */ +#define INT_LEAST8_MAX 0x7f /* int_least8_t */ +#define INT_LEAST16_MAX 0x7fff /* int_least16_t */ +#define INT_LEAST32_MAX 0x7fffffff /* int_least32_t */ +#define INT_LEAST64_MAX 0x7fffffffffffffffLL /* int_least64_t */ + +/* maximum values of minimum-width unsigned integer types */ +#define UINT_LEAST8_MAX 0xffU /* uint_least8_t */ +#define UINT_LEAST16_MAX 0xffffU /* uint_least16_t */ +#define UINT_LEAST32_MAX 0xffffffffU /* uint_least32_t */ +#define UINT_LEAST64_MAX 0xffffffffffffffffULL /* uint_least64_t */ + +/* 7.18.2.3 Limits of fastest minimum-width integer types */ + +/* minimum values of fastest minimum-width signed integer types */ +#define INT_FAST8_MIN (-0x7fffffff-1) /* int_fast8_t */ +#define INT_FAST16_MIN (-0x7fffffff-1) /* int_fast16_t */ +#define INT_FAST32_MIN (-0x7fffffff-1) /* int_fast32_t */ +#define INT_FAST64_MIN (-0x7fffffffffffffffLL-1) /* int_fast64_t */ + +/* maximum values of fastest minimum-width signed integer types */ +#define INT_FAST8_MAX 0x7fffffff /* int_fast8_t */ +#define INT_FAST16_MAX 0x7fffffff /* int_fast16_t */ +#define INT_FAST32_MAX 0x7fffffff /* int_fast32_t */ +#define INT_FAST64_MAX 0x7fffffffffffffffLL /* int_fast64_t */ + +/* maximum values of fastest minimum-width unsigned integer types */ +#define UINT_FAST8_MAX 0xffffffffU /* uint_fast8_t */ +#define UINT_FAST16_MAX 0xffffffffU /* uint_fast16_t */ +#define UINT_FAST32_MAX 0xffffffffU /* uint_fast32_t */ +#define UINT_FAST64_MAX 0xffffffffffffffffULL /* uint_fast64_t */ + +/* 7.18.2.4 Limits of integer types capable of holding object pointers */ + +#define INTPTR_MIN (-0x7fffffffffffffffLL-1) /* intptr_t */ +#define INTPTR_MAX 0x7fffffffffffffffLL /* intptr_t */ +#define UINTPTR_MAX 0xffffffffffffffffULL /* uintptr_t */ + +/* 7.18.2.5 Limits of greatest-width integer types */ + +#define INTMAX_MIN (-0x7fffffffffffffffLL-1) /* intmax_t */ +#define INTMAX_MAX 0x7fffffffffffffffLL /* intmax_t */ +#define UINTMAX_MAX 0xffffffffffffffffULL /* uintmax_t */ + + +/* + * 7.18.3 Limits of other integer types + */ + +/* limits of ptrdiff_t */ +#define PTRDIFF_MIN (-0x7fffffffffffffffLL-1) /* ptrdiff_t */ +#define PTRDIFF_MAX 0x7fffffffffffffffLL /* ptrdiff_t */ + +/* limits of sig_atomic_t */ +#define SIG_ATOMIC_MIN (-0x7fffffffffffffffLL-1) /* sig_atomic_t */ +#define SIG_ATOMIC_MAX 0x7fffffffffffffffLL /* sig_atomic_t */ + +/* limit of size_t */ +#define SIZE_MAX 0xffffffffffffffffULL /* size_t */ +#define SIZE_T_MAX SIZE_MAX + +#endif /* !_AMD64_INT_LIMITS_H_ */ diff --git a/StdLib/Include/X64/machine/int_mwgwtypes.h b/StdLib/Include/X64/machine/int_mwgwtypes.h new file mode 100644 index 0000000000..5e28108f8e --- /dev/null +++ b/StdLib/Include/X64/machine/int_mwgwtypes.h @@ -0,0 +1,82 @@ +/** @file + Minimum and Greatest Width Integer types. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Portions Copyright (c) 2001 The NetBSD Foundation, Inc. + All rights reserved. + + This code is derived from software contributed to The NetBSD Foundation + by Klaus Klein. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: + This product includes software developed by the NetBSD + Foundation, Inc. and its contributors. + 4. Neither the name of The NetBSD Foundation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: int_mwgwtypes.h,v 1.5 2005/12/24 20:06:47 perry Exp +**/ +#ifndef _AMD64_INT_MWGWTYPES_H_ +#define _AMD64_INT_MWGWTYPES_H_ + +/* + * 7.18.1 Integer types + */ + +/* 7.18.1.2 Minimum-width integer types */ + +typedef CHAR8 int_least8_t; +typedef UINT8 uint_least8_t; +typedef INT16 int_least16_t; +typedef UINT16 uint_least16_t; +typedef INT32 int_least32_t; +typedef UINT32 uint_least32_t; +typedef INT64 int_least64_t; +typedef UINT64 uint_least64_t; + +/* 7.18.1.3 Fastest minimum-width integer types */ +typedef INT32 int_fast8_t; +typedef UINT32 uint_fast8_t; +typedef INT32 int_fast16_t; +typedef UINT32 uint_fast16_t; +typedef INT32 int_fast32_t; +typedef UINT32 uint_fast32_t; +typedef INT64 int_fast64_t; +typedef UINT64 uint_fast64_t; + +/* 7.18.1.5 Greatest-width integer types */ + +typedef INT64 intmax_t; +typedef UINT64 uintmax_t; + +#endif /* !_AMD64_INT_MWGWTYPES_H_ */ diff --git a/StdLib/Include/X64/machine/int_types.h b/StdLib/Include/X64/machine/int_types.h new file mode 100644 index 0000000000..5797db8e7f --- /dev/null +++ b/StdLib/Include/X64/machine/int_types.h @@ -0,0 +1,73 @@ +/** @file + Machine dependent integer type definitions. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: int_types.h,v 1.5 2005/12/24 20:06:47 perry Exp + types.h 7.5 (Berkeley) 3/9/91 +**/ +#ifndef _AMD64_INT_TYPES_H_ +#define _AMD64_INT_TYPES_H_ + +#include + +/* + * 7.18.1 Integer types + */ + +/* 7.18.1.1 Exact-width integer types */ + +typedef INT8 __int8_t; +typedef UINT8 __uint8_t; +typedef INT16 __int16_t; +typedef UINT16 __uint16_t; +typedef INT32 __int32_t; +typedef UINT32 __uint32_t; +typedef INT64 __int64_t; +typedef UINT64 __uint64_t; + +#define __BIT_TYPES_DEFINED__ + +/* 7.18.1.4 Integer types capable of holding object pointers */ + +typedef INTN __intptr_t; +typedef UINTN __uintptr_t; + +#endif /* !_AMD64_INT_TYPES_H_ */ diff --git a/StdLib/Include/X64/machine/limits.h b/StdLib/Include/X64/machine/limits.h new file mode 100644 index 0000000000..663b2e3290 --- /dev/null +++ b/StdLib/Include/X64/machine/limits.h @@ -0,0 +1,3 @@ +#include + +#define __POINTER_BIT 64 diff --git a/StdLib/Include/X64/machine/math.h b/StdLib/Include/X64/machine/math.h new file mode 100644 index 0000000000..a53422933c --- /dev/null +++ b/StdLib/Include/X64/machine/math.h @@ -0,0 +1,3 @@ +/* $NetBSD: math.h,v 1.3 2005/12/11 12:16:25 christos Exp $ */ + +#include diff --git a/StdLib/Include/X64/machine/param.h b/StdLib/Include/X64/machine/param.h new file mode 100644 index 0000000000..abb9790031 --- /dev/null +++ b/StdLib/Include/X64/machine/param.h @@ -0,0 +1,122 @@ +/* $NetBSD: param.h,v 1.3 2006/08/28 13:43:35 yamt Exp $ */ + +#define _MACHINE amd64 +#define MACHINE "amd64" +#define _MACHINE_ARCH x86_64 +#define MACHINE_ARCH "x86_64" +#define MID_MACHINE MID_X86_64 + +/* + * Round p (pointer or byte index) up to a correctly-aligned value + * for all data types (int, long, ...). The result is u_int and + * must be cast to any desired pointer type. + * + * ALIGNED_POINTER is a boolean macro that checks whether an address + * is valid to fetch data elements of type t from on this architecture. + * This does not reflect the optimal alignment, just the possibility + * (within reasonable limits). + * + */ +#define ALIGNBYTES (sizeof(INT64) - 1) +#define ALIGN(p) (((UINT64)(p) + ALIGNBYTES) &~ALIGNBYTES) +#define ALIGNED_POINTER(p,t) 1 + +#define ALIGNBYTES32 (sizeof(INT32) - 1) +#define ALIGN32(p) (((UINT32)(p) + ALIGNBYTES32) &~ALIGNBYTES32) + +#define PGSHIFT 12 /* LOG2(NBPG) */ +#define NBPG (1 << PGSHIFT) /* bytes/page */ +#define PGOFSET (NBPG-1) /* byte offset into page */ +#define NPTEPG (NBPG/(sizeof (pt_entry_t))) + +/* + * XXXfvdl change this (after bootstrap) to take # of bits from + * config info into account. + */ +#define KERNBASE 0xffffffff80000000 /* start of kernel virtual space */ +#define KERNTEXTOFF 0xffffffff80100000 /* start of kernel text */ +#define BTOPKERNBASE ((u_long)KERNBASE >> PGSHIFT) + +#define KERNTEXTOFF_HI 0xffffffff +#define KERNTEXTOFF_LO 0x80100000 + +#define KERNBASE_HI 0xffffffff +#define KERNBASE_LO 0x80000000 + +#define DEV_BSHIFT 9 /* log2(DEV_BSIZE) */ +#define DEV_BSIZE (1 << DEV_BSHIFT) +#define BLKDEV_IOSIZE 2048 +#ifndef MAXPHYS +#define MAXPHYS (64 * 1024) /* max raw I/O transfer size */ +#endif + +#define SSIZE 1 /* initial stack size/NBPG */ +#define SINCR 1 /* increment of stack/NBPG */ +#define UPAGES 5 /* pages of u-area */ +#define USPACE (UPAGES * NBPG) /* total size of u-area */ + +#ifndef MSGBUFSIZE +#define MSGBUFSIZE 4*NBPG /* default message buffer size */ +#endif + +/* + * Constants related to network buffer management. + * MCLBYTES must be no larger than NBPG (the software page size), and, + * on machines that exchange pages of input or output buffers with mbuf + * clusters (MAPPED_MBUFS), MCLBYTES must also be an integral multiple + * of the hardware page size. + */ +#define MSIZE 512 /* size of an mbuf */ + +#ifndef MCLSHIFT +#define MCLSHIFT 11 /* convert bytes to m_buf clusters */ + /* 2K cluster can hold Ether frame */ +#endif /* MCLSHIFT */ + +#define MCLBYTES (1 << MCLSHIFT) /* size of a m_buf cluster */ + +#ifndef NMBCLUSTERS + #ifdef GATEWAY + #define NMBCLUSTERS 4096 /* map size, max cluster allocation */ + #else + #define NMBCLUSTERS 2048 /* map size, max cluster allocation */ + #endif +#endif + +#ifndef NFS_RSIZE + #define NFS_RSIZE 32768 +#endif +#ifndef NFS_WSIZE + #define NFS_WSIZE 32768 +#endif + +/* + * Minimum and maximum sizes of the kernel malloc arena in PAGE_SIZE-sized + * logical pages. + */ +//#define NKMEMPAGES_MIN_DEFAULT ((8 * 1024 * 1024) >> PAGE_SHIFT) +//#define NKMEMPAGES_MAX_DEFAULT ((1 *1024 * 1024 * 1024) >> PAGE_SHIFT) + +/* + * XXXfvdl the PD* stuff is different from i386. + */ +/* + * Mach derived conversion macros + */ +#ifdef MACH_DCM + #define x86_round_pdr(x) ((((unsigned long)(x)) + (NBPD_L2 - 1)) & ~(NBPD_L2 - 1)) + #define x86_trunc_pdr(x) ((unsigned long)(x) & ~(NBPD_L2 - 1)) + #define x86_btod(x) ((unsigned long)(x) >> L2_SHIFT) + #define x86_dtob(x) ((unsigned long)(x) << L2_SHIFT) +#endif // MACH_DCM + +#define x86_round_page(x) ((((ULONG32)(x)) + PGOFSET) & ~PGOFSET) +#define x86_trunc_page(x) ((ULONG32)(x) & ~PGOFSET) +#define x86_btop(x) ((ULONG32)(x) >> PGSHIFT) +#define x86_ptob(x) ((ULONG32)(x) << PGSHIFT) + +#define btop(x) x86_btop(x) +#define ptob(x) x86_ptob(x) +#define round_pdr(x) x86_round_pdr(x) + +#define mstohz(ms) ((ms + 0UL) * hz / 1000) diff --git a/StdLib/Include/X64/machine/signal.h b/StdLib/Include/X64/machine/signal.h new file mode 100644 index 0000000000..6628eb9e94 --- /dev/null +++ b/StdLib/Include/X64/machine/signal.h @@ -0,0 +1,22 @@ +/** +Copyright (c) 2010, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. +The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php. + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _MACHINE_SIGNAL_H +#define _MACHINE_SIGNAL_H +#include + +/** The type sig_atomic_t is the (possibly volatile-qualified) integer type of + an object that can be accessed as an atomic entity, even in the presence + of asynchronous interrupts. +**/ +typedef INTN sig_atomic_t; + +#endif /* _MACHINE_SIGNAL_H */ diff --git a/StdLib/Include/X64/machine/types.h b/StdLib/Include/X64/machine/types.h new file mode 100644 index 0000000000..1c1f1ab423 --- /dev/null +++ b/StdLib/Include/X64/machine/types.h @@ -0,0 +1,78 @@ +/** @file + Machine dependent type definitions. + + Portions Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: types.h,v 1.14 2006/09/03 20:42:14 perry Exp + types.h 7.5 (Berkeley) 3/9/91 +**/ +#ifndef _MACHTYPES_H_ +#define _MACHTYPES_H_ + +#include +#include + +/* Handle the long and unsigned long data types which EFI doesn't directly support. */ +//typedef long int LONGN; // 32-bit +//typedef long unsigned int ULONGN; // 32-bit + +typedef PHYSICAL_ADDRESS paddr_t; +typedef UINT64 psize_t; +typedef PHYSICAL_ADDRESS vaddr_t; +typedef UINT64 vsize_t; + +typedef INTN register_t; +typedef INT32 register32_t; + +typedef volatile INT32 __cpu_simple_lock_t; + +#define __SIMPLELOCK_LOCKED 1 +#define __SIMPLELOCK_UNLOCKED 0 + +/* The amd64 does not have strict alignment requirements. */ +#define __NO_STRICT_ALIGNMENT + +#define __HAVE_DEVICE_REGISTER +#define __HAVE_CPU_COUNTER +#define __HAVE_SYSCALL_INTERN +#define __HAVE_MINIMAL_EMUL +#define __HAVE_GENERIC_SOFT_INTERRUPTS +#define __HAVE_CPU_MAXPROC +#define __HAVE_TIMECOUNTER +#define __HAVE_GENERIC_TODR + +#endif /* _MACHTYPES_H_ */ diff --git a/StdLib/Include/arpa/inet.h b/StdLib/Include/arpa/inet.h new file mode 100644 index 0000000000..888a7654e6 --- /dev/null +++ b/StdLib/Include/arpa/inet.h @@ -0,0 +1,105 @@ +/* $NetBSD: inet.h,v 1.21.10.1 2007/05/17 21:25:11 jdc Exp $ */ + +/* + * ++Copyright++ 1983, 1993 + * - + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * - + * Portions Copyright (c) 1993 by Digital Equipment Corporation. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies, and that + * the name of Digital Equipment Corporation not be used in advertising or + * publicity pertaining to distribution of the document or software without + * specific, written prior permission. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT + * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * - + * --Copyright-- + */ + +/*% + * @(#)inet.h 8.1 (Berkeley) 6/2/93 + * Id: inet.h,v 1.2.18.1 2005/04/27 05:00:50 sra Exp + */ + +#ifndef _ARPA_INET_H_ +#define _ARPA_INET_H_ + +/* External definitions for functions in inet(3) */ + +#include +#include +#include +#include + +#include + +#if (_POSIX_C_SOURCE - 0) >= 200112L || (_XOPEN_SOURCE - 0) >= 520 || \ + defined(_NETBSD_SOURCE) +#ifndef socklen_t +typedef __socklen_t socklen_t; +#define socklen_t __socklen_t +#endif +#endif /* _POSIX_C_SOURCE >= 200112 || XOPEN_SOURCE >= 520 || _NETBSD_SOURCE */ + +__BEGIN_DECLS +in_addr_t inet_addr(const char *); +in_addr_t inet_lnaof(struct in_addr); +struct in_addr inet_makeaddr(in_addr_t, in_addr_t); +in_addr_t inet_netof(struct in_addr); +in_addr_t inet_network(const char *); +char *inet_ntoa(struct in_addr); +#if (_POSIX_C_SOURCE - 0) >= 200112L || (_XOPEN_SOURCE - 0) >= 520 || \ + defined(_NETBSD_SOURCE) +const char *inet_ntop(int, const void * __restrict, + char * __restrict, socklen_t); +int inet_pton(int, const char * __restrict, + void * __restrict); +#endif +#if defined(_NETBSD_SOURCE) +int inet_aton(const char *, struct in_addr *); +char * inet_neta(u_long, char *, size_t); +char *inet_net_ntop(int, const void *, int, char *, size_t); +int inet_net_pton(int, const char *, void *, size_t); +char *inet_cidr_ntop(int, const void *, int, char *, size_t); +int inet_cidr_pton(int, const char *, void *, int *); +u_int inet_nsap_addr(const char *, u_char *, int); +char *inet_nsap_ntoa(int, const u_char *, char *); +#endif +__END_DECLS + +#endif /* _ARPA_INET_H_ */ diff --git a/StdLib/Include/arpa/nameser.h b/StdLib/Include/arpa/nameser.h new file mode 100644 index 0000000000..c4db9efc86 --- /dev/null +++ b/StdLib/Include/arpa/nameser.h @@ -0,0 +1,574 @@ +/* $NetBSD: nameser.h,v 1.19.4.1 2007/05/17 21:25:12 jdc Exp $ */ + +/* + * Copyright (c) 1983, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") + * Copyright (c) 1996-1999 by Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * Id: nameser.h,v 1.7.18.1 2005/04/27 05:00:50 sra Exp + */ + +#ifndef _ARPA_NAMESER_H_ +#define _ARPA_NAMESER_H_ + +#define BIND_4_COMPAT + +#include +#if (!defined(BSD)) || (BSD < 199306) +# include +#else +# include +#endif +#include + +/*% + * Revision information. This is the release date in YYYYMMDD format. + * It can change every day so the right thing to do with it is use it + * in preprocessor commands such as "#if (__NAMESER > 19931104)". Do not + * compare for equality; rather, use it to determine whether your libbind.a + * contains a new enough lib/nameser/ to support the feature you need. + */ + +#define __NAMESER 19991006 /*%< New interface version stamp. */ + +/* + * Define constants based on RFC0883, RFC1034, RFC 1035 + */ +#define NS_PACKETSZ 512 /*%< default UDP packet size */ +#define NS_MAXDNAME 1025 /*%< maximum domain name */ +#define NS_MAXMSG 65535 /*%< maximum message size */ +#define NS_MAXCDNAME 255 /*%< maximum compressed domain name */ +#define NS_MAXLABEL 63 /*%< maximum length of domain label */ +#define NS_HFIXEDSZ 12 /*%< #/bytes of fixed data in header */ +#define NS_QFIXEDSZ 4 /*%< #/bytes of fixed data in query */ +#define NS_RRFIXEDSZ 10 /*%< #/bytes of fixed data in r record */ +#define NS_INT32SZ 4 /*%< #/bytes of data in a u_int32_t */ +#define NS_INT16SZ 2 /*%< #/bytes of data in a u_int16_t */ +#define NS_INT8SZ 1 /*%< #/bytes of data in a u_int8_t */ +#define NS_INADDRSZ 4 /*%< IPv4 T_A */ +#define NS_IN6ADDRSZ 16 /*%< IPv6 T_AAAA */ +#define NS_CMPRSFLGS 0xc0 /*%< Flag bits indicating name compression. */ +#define NS_DEFAULTPORT 53 /*%< For both TCP and UDP. */ + +/* + * These can be expanded with synonyms, just keep ns_parse.c:ns_parserecord() + * in synch with it. + */ +typedef enum __ns_sect { + ns_s_qd = 0, /*%< Query: Question. */ + ns_s_zn = 0, /*%< Update: Zone. */ + ns_s_an = 1, /*%< Query: Answer. */ + ns_s_pr = 1, /*%< Update: Prerequisites. */ + ns_s_ns = 2, /*%< Query: Name servers. */ + ns_s_ud = 2, /*%< Update: Update. */ + ns_s_ar = 3, /*%< Query|Update: Additional records. */ + ns_s_max = 4 +} ns_sect; + +/*% + * This is a message handle. It is caller allocated and has no dynamic data. + * This structure is intended to be opaque to all but ns_parse.c, thus the + * leading _'s on the member names. Use the accessor functions, not the _'s. + */ +typedef struct __ns_msg { + const u_char *_msg, *_eom; + uint16_t _id, _flags, _counts[ns_s_max]; + const u_char *_sections[ns_s_max]; + ns_sect _sect; + int _rrnum; + const u_char *_msg_ptr; +} ns_msg; + +/* Private data structure - do not use from outside library. */ +struct _ns_flagdata { int mask, shift; }; +extern struct _ns_flagdata _ns_flagdata[]; + +/* Accessor macros - this is part of the public interface. */ + +#define ns_msg_id(handle) ((handle)._id + 0) +#define ns_msg_base(handle) ((handle)._msg + 0) +#define ns_msg_end(handle) ((handle)._eom + 0) +#define ns_msg_size(handle) ((size_t)((handle)._eom - (handle)._msg)) +#define ns_msg_count(handle, section) ((handle)._counts[section] + 0) + +/*% + * This is a parsed record. It is caller allocated and has no dynamic data. + */ +typedef struct __ns_rr { + char name[NS_MAXDNAME]; + uint16_t type; + uint16_t rr_class; + uint32_t ttl; + uint16_t rdlength; + const u_char * rdata; +} ns_rr; + +/* Accessor macros - this is part of the public interface. */ +#define ns_rr_name(rr) (((rr).name[0] != '\0') ? (rr).name : ".") +#define ns_rr_type(rr) ((ns_type)((rr).type + 0)) +#define ns_rr_class(rr) ((ns_class)((rr).rr_class + 0)) +#define ns_rr_ttl(rr) ((u_long)(rr).ttl + 0) +#define ns_rr_rdlen(rr) ((size_t)(rr).rdlength + 0) +#define ns_rr_rdata(rr) ((rr).rdata + 0) + +/*% + * These don't have to be in the same order as in the packet flags word, + * and they can even overlap in some cases, but they will need to be kept + * in synch with ns_parse.c:ns_flagdata[]. + */ +typedef enum __ns_flag { + ns_f_qr, /*%< Question/Response. */ + ns_f_opcode, /*%< Operation code. */ + ns_f_aa, /*%< Authoritative Answer. */ + ns_f_tc, /*%< Truncation occurred. */ + ns_f_rd, /*%< Recursion Desired. */ + ns_f_ra, /*%< Recursion Available. */ + ns_f_z, /*%< MBZ. */ + ns_f_ad, /*%< Authentic Data (DNSSEC). */ + ns_f_cd, /*%< Checking Disabled (DNSSEC). */ + ns_f_rcode, /*%< Response code. */ + ns_f_max +} ns_flag; + +/*% + * Currently defined opcodes. + */ +typedef enum __ns_opcode { + ns_o_query = 0, /*%< Standard query. */ + ns_o_iquery = 1, /*%< Inverse query (deprecated/unsupported). */ + ns_o_status = 2, /*%< Name server status query (unsupported). */ + /* Opcode 3 is undefined/reserved. */ + ns_o_notify = 4, /*%< Zone change notification. */ + ns_o_update = 5, /*%< Zone update message. */ + ns_o_max = 6 +} ns_opcode; + +/*% + * Currently defined response codes. + */ +typedef enum __ns_rcode { + ns_r_noerror = 0, /*%< No error occurred. */ + ns_r_formerr = 1, /*%< Format error. */ + ns_r_servfail = 2, /*%< Server failure. */ + ns_r_nxdomain = 3, /*%< Name error. */ + ns_r_notimpl = 4, /*%< Unimplemented. */ + ns_r_refused = 5, /*%< Operation refused. */ + /* these are for BIND_UPDATE */ + ns_r_yxdomain = 6, /*%< Name exists */ + ns_r_yxrrset = 7, /*%< RRset exists */ + ns_r_nxrrset = 8, /*%< RRset does not exist */ + ns_r_notauth = 9, /*%< Not authoritative for zone */ + ns_r_notzone = 10, /*%< Zone of record different from zone section */ + ns_r_max = 11, + /* The following are EDNS extended rcodes */ + ns_r_badvers = 16, + /* The following are TSIG errors */ + ns_r_badsig = 16, + ns_r_badkey = 17, + ns_r_badtime = 18 +} ns_rcode; + +/* BIND_UPDATE */ +typedef enum __ns_update_operation { + ns_uop_delete = 0, + ns_uop_add = 1, + ns_uop_max = 2 +} ns_update_operation; + +/*% + * This structure is used for TSIG authenticated messages + */ +struct ns_tsig_key { + char name[NS_MAXDNAME], alg[NS_MAXDNAME]; + unsigned char *data; + int len; +}; +typedef struct ns_tsig_key ns_tsig_key; + +/*% + * This structure is used for TSIG authenticated TCP messages + */ +struct ns_tcp_tsig_state { + int counter; + struct dst_key *key; + void *ctx; + unsigned char sig[NS_PACKETSZ]; + int siglen; +}; +typedef struct ns_tcp_tsig_state ns_tcp_tsig_state; + +#define NS_TSIG_FUDGE 300 +#define NS_TSIG_TCP_COUNT 100 +#define NS_TSIG_ALG_HMAC_MD5 "HMAC-MD5.SIG-ALG.REG.INT" + +#define NS_TSIG_ERROR_NO_TSIG -10 +#define NS_TSIG_ERROR_NO_SPACE -11 +#define NS_TSIG_ERROR_FORMERR -12 + +/*% + * Currently defined type values for resources and queries. + */ +typedef enum __ns_type { + ns_t_invalid = 0, /*%< Cookie. */ + ns_t_a = 1, /*%< Host address. */ + ns_t_ns = 2, /*%< Authoritative server. */ + ns_t_md = 3, /*%< Mail destination. */ + ns_t_mf = 4, /*%< Mail forwarder. */ + ns_t_cname = 5, /*%< Canonical name. */ + ns_t_soa = 6, /*%< Start of authority zone. */ + ns_t_mb = 7, /*%< Mailbox domain name. */ + ns_t_mg = 8, /*%< Mail group member. */ + ns_t_mr = 9, /*%< Mail rename name. */ + ns_t_null = 10, /*%< Null resource record. */ + ns_t_wks = 11, /*%< Well known service. */ + ns_t_ptr = 12, /*%< Domain name pointer. */ + ns_t_hinfo = 13, /*%< Host information. */ + ns_t_minfo = 14, /*%< Mailbox information. */ + ns_t_mx = 15, /*%< Mail routing information. */ + ns_t_txt = 16, /*%< Text strings. */ + ns_t_rp = 17, /*%< Responsible person. */ + ns_t_afsdb = 18, /*%< AFS cell database. */ + ns_t_x25 = 19, /*%< X_25 calling address. */ + ns_t_isdn = 20, /*%< ISDN calling address. */ + ns_t_rt = 21, /*%< Router. */ + ns_t_nsap = 22, /*%< NSAP address. */ + ns_t_nsap_ptr = 23, /*%< Reverse NSAP lookup (deprecated). */ + ns_t_sig = 24, /*%< Security signature. */ + ns_t_key = 25, /*%< Security key. */ + ns_t_px = 26, /*%< X.400 mail mapping. */ + ns_t_gpos = 27, /*%< Geographical position (withdrawn). */ + ns_t_aaaa = 28, /*%< Ip6 Address. */ + ns_t_loc = 29, /*%< Location Information. */ + ns_t_nxt = 30, /*%< Next domain (security). */ + ns_t_eid = 31, /*%< Endpoint identifier. */ + ns_t_nimloc = 32, /*%< Nimrod Locator. */ + ns_t_srv = 33, /*%< Server Selection. */ + ns_t_atma = 34, /*%< ATM Address */ + ns_t_naptr = 35, /*%< Naming Authority PoinTeR */ + ns_t_kx = 36, /*%< Key Exchange */ + ns_t_cert = 37, /*%< Certification record */ + ns_t_a6 = 38, /*%< IPv6 address (deprecates AAAA) */ + ns_t_dname = 39, /*%< Non-terminal DNAME (for IPv6) */ + ns_t_sink = 40, /*%< Kitchen sink (experimentatl) */ + ns_t_opt = 41, /*%< EDNS0 option (meta-RR) */ + ns_t_apl = 42, /*%< Address prefix list (RFC3123) */ + ns_t_tkey = 249, /*%< Transaction key */ + ns_t_tsig = 250, /*%< Transaction signature. */ + ns_t_ixfr = 251, /*%< Incremental zone transfer. */ + ns_t_axfr = 252, /*%< Transfer zone of authority. */ + ns_t_mailb = 253, /*%< Transfer mailbox records. */ + ns_t_maila = 254, /*%< Transfer mail agent records. */ + ns_t_any = 255, /*%< Wildcard match. */ + ns_t_zxfr = 256, /*%< BIND-specific, nonstandard. */ + ns_t_max = 65536 +} ns_type; + +/* Exclusively a QTYPE? (not also an RTYPE) */ +#define ns_t_qt_p(t) (ns_t_xfr_p(t) || (t) == ns_t_any || \ + (t) == ns_t_mailb || (t) == ns_t_maila) +/* Some kind of meta-RR? (not a QTYPE, but also not an RTYPE) */ +#define ns_t_mrr_p(t) ((t) == ns_t_tsig || (t) == ns_t_opt) +/* Exclusively an RTYPE? (not also a QTYPE or a meta-RR) */ +#define ns_t_rr_p(t) (!ns_t_qt_p(t) && !ns_t_mrr_p(t)) +#define ns_t_udp_p(t) ((t) != ns_t_axfr && (t) != ns_t_zxfr) +#define ns_t_xfr_p(t) ((t) == ns_t_axfr || (t) == ns_t_ixfr || \ + (t) == ns_t_zxfr) + +/*% + * Values for class field + */ +typedef enum __ns_class { + ns_c_invalid = 0, /*%< Cookie. */ + ns_c_in = 1, /*%< Internet. */ + ns_c_2 = 2, /*%< unallocated/unsupported. */ + ns_c_chaos = 3, /*%< MIT Chaos-net. */ + ns_c_hs = 4, /*%< MIT Hesiod. */ + /* Query class values which do not appear in resource records */ + ns_c_none = 254, /*%< for prereq. sections in update requests */ + ns_c_any = 255, /*%< Wildcard match. */ + ns_c_max = 65536 +} ns_class; + +/* DNSSEC constants. */ + +typedef enum __ns_key_types { + ns_kt_rsa = 1, /*%< key type RSA/MD5 */ + ns_kt_dh = 2, /*%< Diffie Hellman */ + ns_kt_dsa = 3, /*%< Digital Signature Standard (MANDATORY) */ + ns_kt_private = 254 /*%< Private key type starts with OID */ +} ns_key_types; + +typedef enum __ns_cert_types { + cert_t_pkix = 1, /*%< PKIX (X.509v3) */ + cert_t_spki = 2, /*%< SPKI */ + cert_t_pgp = 3, /*%< PGP */ + cert_t_url = 253, /*%< URL private type */ + cert_t_oid = 254 /*%< OID private type */ +} ns_cert_types; + +/* Flags field of the KEY RR rdata. */ +#define NS_KEY_TYPEMASK 0xC000 /*%< Mask for "type" bits */ +#define NS_KEY_TYPE_AUTH_CONF 0x0000 /*%< Key usable for both */ +#define NS_KEY_TYPE_CONF_ONLY 0x8000 /*%< Key usable for confidentiality */ +#define NS_KEY_TYPE_AUTH_ONLY 0x4000 /*%< Key usable for authentication */ +#define NS_KEY_TYPE_NO_KEY 0xC000 /*%< No key usable for either; no key */ +/* The type bits can also be interpreted independently, as single bits: */ +#define NS_KEY_NO_AUTH 0x8000 /*%< Key unusable for authentication */ +#define NS_KEY_NO_CONF 0x4000 /*%< Key unusable for confidentiality */ +#define NS_KEY_RESERVED2 0x2000 /* Security is *mandatory* if bit=0 */ +#define NS_KEY_EXTENDED_FLAGS 0x1000 /*%< reserved - must be zero */ +#define NS_KEY_RESERVED4 0x0800 /*%< reserved - must be zero */ +#define NS_KEY_RESERVED5 0x0400 /*%< reserved - must be zero */ +#define NS_KEY_NAME_TYPE 0x0300 /*%< these bits determine the type */ +#define NS_KEY_NAME_USER 0x0000 /*%< key is assoc. with user */ +#define NS_KEY_NAME_ENTITY 0x0200 /*%< key is assoc. with entity eg host */ +#define NS_KEY_NAME_ZONE 0x0100 /*%< key is zone key */ +#define NS_KEY_NAME_RESERVED 0x0300 /*%< reserved meaning */ +#define NS_KEY_RESERVED8 0x0080 /*%< reserved - must be zero */ +#define NS_KEY_RESERVED9 0x0040 /*%< reserved - must be zero */ +#define NS_KEY_RESERVED10 0x0020 /*%< reserved - must be zero */ +#define NS_KEY_RESERVED11 0x0010 /*%< reserved - must be zero */ +#define NS_KEY_SIGNATORYMASK 0x000F /*%< key can sign RR's of same name */ +#define NS_KEY_RESERVED_BITMASK ( NS_KEY_RESERVED2 | \ + NS_KEY_RESERVED4 | \ + NS_KEY_RESERVED5 | \ + NS_KEY_RESERVED8 | \ + NS_KEY_RESERVED9 | \ + NS_KEY_RESERVED10 | \ + NS_KEY_RESERVED11 ) +#define NS_KEY_RESERVED_BITMASK2 0xFFFF /*%< no bits defined here */ + +/* The Algorithm field of the KEY and SIG RR's is an integer, {1..254} */ +#define NS_ALG_MD5RSA 1 /*%< MD5 with RSA */ +#define NS_ALG_DH 2 /*%< Diffie Hellman KEY */ +#define NS_ALG_DSA 3 /*%< DSA KEY */ +#define NS_ALG_DSS NS_ALG_DSA +#define NS_ALG_EXPIRE_ONLY 253 /*%< No alg, no security */ +#define NS_ALG_PRIVATE_OID 254 /*%< Key begins with OID giving alg */ + +/* Protocol values */ +/* value 0 is reserved */ +#define NS_KEY_PROT_TLS 1 +#define NS_KEY_PROT_EMAIL 2 +#define NS_KEY_PROT_DNSSEC 3 +#define NS_KEY_PROT_IPSEC 4 +#define NS_KEY_PROT_ANY 255 + +/* Signatures */ +#define NS_MD5RSA_MIN_BITS 512 /*%< Size of a mod or exp in bits */ +#define NS_MD5RSA_MAX_BITS 4096 + /* Total of binary mod and exp */ +#define NS_MD5RSA_MAX_BYTES ((NS_MD5RSA_MAX_BITS+7/8)*2+3) + /* Max length of text sig block */ +#define NS_MD5RSA_MAX_BASE64 (((NS_MD5RSA_MAX_BYTES+2)/3)*4) +#define NS_MD5RSA_MIN_SIZE ((NS_MD5RSA_MIN_BITS+7)/8) +#define NS_MD5RSA_MAX_SIZE ((NS_MD5RSA_MAX_BITS+7)/8) + +#define NS_DSA_SIG_SIZE 41 +#define NS_DSA_MIN_SIZE 213 +#define NS_DSA_MAX_BYTES 405 + +/* Offsets into SIG record rdata to find various values */ +#define NS_SIG_TYPE 0 /*%< Type flags */ +#define NS_SIG_ALG 2 /*%< Algorithm */ +#define NS_SIG_LABELS 3 /*%< How many labels in name */ +#define NS_SIG_OTTL 4 /*%< Original TTL */ +#define NS_SIG_EXPIR 8 /*%< Expiration time */ +#define NS_SIG_SIGNED 12 /*%< Signature time */ +#define NS_SIG_FOOT 16 /*%< Key footprint */ +#define NS_SIG_SIGNER 18 /*%< Domain name of who signed it */ + +/* How RR types are represented as bit-flags in NXT records */ +#define NS_NXT_BITS 8 +#define NS_NXT_BIT_SET( n,p) (p[(n)/NS_NXT_BITS] |= (0x80>>((n)%NS_NXT_BITS))) +#define NS_NXT_BIT_CLEAR(n,p) (p[(n)/NS_NXT_BITS] &= ~(0x80>>((n)%NS_NXT_BITS))) +#define NS_NXT_BIT_ISSET(n,p) (p[(n)/NS_NXT_BITS] & (0x80>>((n)%NS_NXT_BITS))) +#define NS_NXT_MAX 127 + +/*% + * EDNS0 extended flags, host order. + */ +#define NS_OPT_DNSSEC_OK 0x8000U + +/*% + * Inline versions of get/put short/long. Pointer is advanced. + */ +#define NS_GET16(s, cp) do { \ + const u_char *t_cp = (const u_char *)(cp); \ + (s) = ((uint16_t)t_cp[0] << 8) \ + | ((uint16_t)t_cp[1]) \ + ; \ + (cp) += NS_INT16SZ; \ +} while (/*CONSTCOND*/0) + +#define NS_GET32(l, cp) do { \ + const u_char *t_cp = (const u_char *)(cp); \ + (l) = ((uint32_t)t_cp[0] << 24) \ + | ((uint32_t)t_cp[1] << 16) \ + | ((uint32_t)t_cp[2] << 8) \ + | ((uint32_t)t_cp[3]) \ + ; \ + (cp) += NS_INT32SZ; \ +} while (/*CONSTCOND*/0) + +#define NS_PUT16(s, cp) do { \ + uint32_t t_s = (uint32_t)(s); \ + u_char *t_cp = (u_char *)(cp); \ + *t_cp++ = t_s >> 8; \ + *t_cp = t_s; \ + (cp) += NS_INT16SZ; \ +} while (/*CONSTCOND*/0) + +#define NS_PUT32(l, cp) do { \ + uint32_t t_l = (uint32_t)(l); \ + u_char *t_cp = (u_char *)(cp); \ + *t_cp++ = t_l >> 24; \ + *t_cp++ = t_l >> 16; \ + *t_cp++ = t_l >> 8; \ + *t_cp = t_l; \ + (cp) += NS_INT32SZ; \ +} while (/*CONSTCOND*/0) + +/*% + * ANSI C identifier hiding for bind's lib/nameser. + */ +#define ns_msg_getflag __ns_msg_getflag +#define ns_get16 __ns_get16 +#define ns_get32 __ns_get32 +#define ns_put16 __ns_put16 +#define ns_put32 __ns_put32 +#define ns_initparse __ns_initparse +#define ns_skiprr __ns_skiprr +#define ns_parserr __ns_parserr +#define ns_sprintrr __ns_sprintrr +#define ns_sprintrrf __ns_sprintrrf +#define ns_format_ttl __ns_format_ttl +#define ns_parse_ttl __ns_parse_ttl +#define ns_datetosecs __ns_datetosecs +#define ns_name_ntol __ns_name_ntol +#define ns_name_ntop __ns_name_ntop +#define ns_name_pton __ns_name_pton +#define ns_name_unpack __ns_name_unpack +#define ns_name_pack __ns_name_pack +#define ns_name_compress __ns_name_compress +#define ns_name_uncompress __ns_name_uncompress +#define ns_name_skip __ns_name_skip +#define ns_name_rollback __ns_name_rollback +#define ns_sign __ns_sign +#define ns_sign2 __ns_sign2 +#define ns_sign_tcp __ns_sign_tcp +#define ns_sign_tcp2 __ns_sign_tcp2 +#define ns_sign_tcp_init __ns_sign_tcp_init +#define ns_find_tsig __ns_find_tsig +#define ns_verify __ns_verify +#define ns_verify_tcp __ns_verify_tcp +#define ns_verify_tcp_init __ns_verify_tcp_init +#define ns_samedomain __ns_samedomain +#define ns_subdomain __ns_subdomain +#define ns_makecanon __ns_makecanon +#define ns_samename __ns_samename + +__BEGIN_DECLS +int ns_msg_getflag(ns_msg, int); +uint16_t ns_get16(const u_char *); +uint32_t ns_get32(const u_char *); +void ns_put16(uint16_t, u_char *); +void ns_put32(uint32_t, u_char *); +int ns_initparse(const u_char *, int, ns_msg *); +int ns_skiprr(const u_char *, const u_char *, ns_sect, int); +int ns_parserr(ns_msg *, ns_sect, int, ns_rr *); +int ns_sprintrr(const ns_msg *, const ns_rr *, + const char *, const char *, char *, size_t); +int ns_sprintrrf(const u_char *, size_t, const char *, + ns_class, ns_type, u_long, const u_char *, + size_t, const char *, const char *, + char *, size_t); +int ns_format_ttl(u_long, char *, size_t); +int ns_parse_ttl(const char *, u_long *); +uint32_t ns_datetosecs(const char *cp, int *errp); +int ns_name_ntol(const u_char *, u_char *, size_t); +int ns_name_ntop(const u_char *, char *, size_t); +int ns_name_pton(const char *, u_char *, size_t); +int ns_name_unpack(const u_char *, const u_char *, + const u_char *, u_char *, size_t); +int ns_name_pack(const u_char *, u_char *, int, + const u_char **, const u_char **); +int ns_name_uncompress(const u_char *, const u_char *, + const u_char *, char *, size_t); +int ns_name_compress(const char *, u_char *, size_t, + const u_char **, const u_char **); +int ns_name_skip(const u_char **, const u_char *); +void ns_name_rollback(const u_char *, const u_char **, + const u_char **); +int ns_sign(u_char *, int *, int, int, void *, + const u_char *, int, u_char *, int *, time_t); +int ns_sign2(u_char *, int *, int, int, void *, + const u_char *, int, u_char *, int *, time_t, + u_char **, u_char **); +int ns_sign_tcp(u_char *, int *, int, int, + ns_tcp_tsig_state *, int); +int ns_sign_tcp2(u_char *, int *, int, int, + ns_tcp_tsig_state *, int, + u_char **, u_char **); +int ns_sign_tcp_init(void *, const u_char *, int, + ns_tcp_tsig_state *); +u_char *ns_find_tsig(u_char *, u_char *); +int ns_verify(u_char *, int *, void *, + const u_char *, int, u_char *, int *, + time_t *, int); +int ns_verify_tcp(u_char *, int *, ns_tcp_tsig_state *, int); +int ns_verify_tcp_init(void *, const u_char *, int, + ns_tcp_tsig_state *); +int ns_samedomain(const char *, const char *); +int ns_subdomain(const char *, const char *); +int ns_makecanon(const char *, char *, size_t); +int ns_samename(const char *, const char *); +__END_DECLS + +#ifdef BIND_4_COMPAT +#include +#endif + +#endif /* !_ARPA_NAMESER_H_ */ diff --git a/StdLib/Include/arpa/nameser_compat.h b/StdLib/Include/arpa/nameser_compat.h new file mode 100644 index 0000000000..524b1fd2d4 --- /dev/null +++ b/StdLib/Include/arpa/nameser_compat.h @@ -0,0 +1,236 @@ +/* $NetBSD: nameser_compat.h,v 1.1.1.2.10.1 2007/05/17 21:25:12 jdc Exp $ */ + +/* Copyright (c) 1983, 1989 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/*% + * from nameser.h 8.1 (Berkeley) 6/2/93 + * Id: nameser_compat.h,v 1.5.18.3 2006/05/19 02:36:00 marka Exp + */ + +#ifndef _ARPA_NAMESER_COMPAT_ +#define _ARPA_NAMESER_COMPAT_ + +#define __BIND 19950621 /*%< (DEAD) interface version stamp. */ + +#ifndef BYTE_ORDER +#if (BSD >= 199103) +# include +#else +#ifdef __linux +# include +#else +#define LITTLE_ENDIAN 1234 /*%< least-significant byte first (vax, pc) */ +#define BIG_ENDIAN 4321 /*%< most-significant byte first (IBM, net) */ +#define PDP_ENDIAN 3412 /*%< LSB first in word, MSW first in long (pdp) */ + +#if defined(vax) || defined(ns32000) || defined(sun386) || defined(i386) || \ + defined(MIPSEL) || defined(_MIPSEL) || defined(BIT_ZERO_ON_RIGHT) || \ + defined(__i386__) || defined(__i386) || defined(__amd64__) || \ + defined(__x86_64__) || defined(MIPSEL) || defined(_MIPSEL) || \ + defined(BIT_ZERO_ON_RIGHT) || defined(__alpha__) || defined(__alpha) || \ + (defined(__Lynx__) && defined(__x86__)) +#define BYTE_ORDER LITTLE_ENDIAN +#endif + +#if defined(sel) || defined(pyr) || defined(mc68000) || defined(sparc) || \ + defined(is68k) || defined(tahoe) || defined(ibm032) || defined(ibm370) || \ + defined(MIPSEB) || defined(_MIPSEB) || defined(_IBMR2) || defined(DGUX) ||\ + defined(apollo) || defined(__convex__) || defined(_CRAY) || \ + defined(__hppa) || defined(__hp9000) || \ + defined(__hp9000s300) || defined(__hp9000s700) || \ + defined(__hp3000s900) || defined(__hpux) || defined(MPE) || \ + defined (BIT_ZERO_ON_LEFT) || defined(m68k) || defined(__sparc) || \ + (defined(__Lynx__) && \ + (defined(__68k__) || defined(__sparc__) || defined(__powerpc__))) +#define BYTE_ORDER BIG_ENDIAN +#endif +#endif /* __linux */ +#endif /* BSD */ +#endif /* BYTE_ORDER */ + +#if !defined(BYTE_ORDER) || \ + (BYTE_ORDER != BIG_ENDIAN && BYTE_ORDER != LITTLE_ENDIAN && \ + BYTE_ORDER != PDP_ENDIAN) + /* you must determine what the correct bit order is for + * your compiler - the next line is an intentional error + * which will force your compiles to bomb until you fix + * the above macros. + */ + error "Undefined or invalid BYTE_ORDER"; +#endif + +/*% + * Structure for query header. The order of the fields is machine- and + * compiler-dependent, depending on the byte/bit order and the layout + * of bit fields. We use bit fields only in int variables, as this + * is all ANSI requires. This requires a somewhat confusing rearrangement. + */ + +typedef struct { + unsigned id :16; /*%< query identification number */ +#if BYTE_ORDER == BIG_ENDIAN + /* fields in third byte */ + unsigned qr: 1; /*%< response flag */ + unsigned opcode: 4; /*%< purpose of message */ + unsigned aa: 1; /*%< authoritive answer */ + unsigned tc: 1; /*%< truncated message */ + unsigned rd: 1; /*%< recursion desired */ + /* fields in fourth byte */ + unsigned ra: 1; /*%< recursion available */ + unsigned unused :1; /*%< unused bits (MBZ as of 4.9.3a3) */ + unsigned ad: 1; /*%< authentic data from named */ + unsigned cd: 1; /*%< checking disabled by resolver */ + unsigned rcode :4; /*%< response code */ +#endif +#if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN + /* fields in third byte */ + unsigned rd :1; /*%< recursion desired */ + unsigned tc :1; /*%< truncated message */ + unsigned aa :1; /*%< authoritive answer */ + unsigned opcode :4; /*%< purpose of message */ + unsigned qr :1; /*%< response flag */ + /* fields in fourth byte */ + unsigned rcode :4; /*%< response code */ + unsigned cd: 1; /*%< checking disabled by resolver */ + unsigned ad: 1; /*%< authentic data from named */ + unsigned unused :1; /*%< unused bits (MBZ as of 4.9.3a3) */ + unsigned ra :1; /*%< recursion available */ +#endif + /* remaining bytes */ + unsigned qdcount :16; /*%< number of question entries */ + unsigned ancount :16; /*%< number of answer entries */ + unsigned nscount :16; /*%< number of authority entries */ + unsigned arcount :16; /*%< number of resource entries */ +} HEADER; + +#define PACKETSZ NS_PACKETSZ +#define MAXDNAME NS_MAXDNAME +#define MAXCDNAME NS_MAXCDNAME +#define MAXLABEL NS_MAXLABEL +#define HFIXEDSZ NS_HFIXEDSZ +#define QFIXEDSZ NS_QFIXEDSZ +#define RRFIXEDSZ NS_RRFIXEDSZ +#define INT32SZ NS_INT32SZ +#define INT16SZ NS_INT16SZ +#define INT8SZ NS_INT8SZ +#define INADDRSZ NS_INADDRSZ +#define IN6ADDRSZ NS_IN6ADDRSZ +#define INDIR_MASK NS_CMPRSFLGS +#define NAMESERVER_PORT NS_DEFAULTPORT + +#define S_ZONE ns_s_zn +#define S_PREREQ ns_s_pr +#define S_UPDATE ns_s_ud +#define S_ADDT ns_s_ar + +#define QUERY ns_o_query +#define IQUERY ns_o_iquery +#define STATUS ns_o_status +#define NS_NOTIFY_OP ns_o_notify +#define NS_UPDATE_OP ns_o_update + +#define NOERROR ns_r_noerror +#define FORMERR ns_r_formerr +#define SERVFAIL ns_r_servfail +#define NXDOMAIN ns_r_nxdomain +#define NOTIMP ns_r_notimpl +#define REFUSED ns_r_refused +#define YXDOMAIN ns_r_yxdomain +#define YXRRSET ns_r_yxrrset +#define NXRRSET ns_r_nxrrset +#define NOTAUTH ns_r_notauth +#define NOTZONE ns_r_notzone +/*#define BADSIG ns_r_badsig*/ +/*#define BADKEY ns_r_badkey*/ +/*#define BADTIME ns_r_badtime*/ + + +#define DELETE ns_uop_delete +#define ADD ns_uop_add + +#define T_A ns_t_a +#define T_NS ns_t_ns +#define T_MD ns_t_md +#define T_MF ns_t_mf +#define T_CNAME ns_t_cname +#define T_SOA ns_t_soa +#define T_MB ns_t_mb +#define T_MG ns_t_mg +#define T_MR ns_t_mr +#define T_NULL ns_t_null +#define T_WKS ns_t_wks +#define T_PTR ns_t_ptr +#define T_HINFO ns_t_hinfo +#define T_MINFO ns_t_minfo +#define T_MX ns_t_mx +#define T_TXT ns_t_txt +#define T_RP ns_t_rp +#define T_AFSDB ns_t_afsdb +#define T_X25 ns_t_x25 +#define T_ISDN ns_t_isdn +#define T_RT ns_t_rt +#define T_NSAP ns_t_nsap +#define T_NSAP_PTR ns_t_nsap_ptr +#define T_SIG ns_t_sig +#define T_KEY ns_t_key +#define T_PX ns_t_px +#define T_GPOS ns_t_gpos +#define T_AAAA ns_t_aaaa +#define T_LOC ns_t_loc +#define T_NXT ns_t_nxt +#define T_EID ns_t_eid +#define T_NIMLOC ns_t_nimloc +#define T_SRV ns_t_srv +#define T_ATMA ns_t_atma +#define T_NAPTR ns_t_naptr +#define T_A6 ns_t_a6 +#define T_TSIG ns_t_tsig +#define T_IXFR ns_t_ixfr +#define T_AXFR ns_t_axfr +#define T_MAILB ns_t_mailb +#define T_MAILA ns_t_maila +#define T_ANY ns_t_any + +#define C_IN ns_c_in +#define C_CHAOS ns_c_chaos +#define C_HS ns_c_hs +/* BIND_UPDATE */ +#define C_NONE ns_c_none +#define C_ANY ns_c_any + +#define GETSHORT NS_GET16 +#define GETLONG NS_GET32 +#define PUTSHORT NS_PUT16 +#define PUTLONG NS_PUT32 + +#endif /* _ARPA_NAMESER_COMPAT_ */ diff --git a/StdLib/Include/assert.h b/StdLib/Include/assert.h new file mode 100644 index 0000000000..faa3f03294 --- /dev/null +++ b/StdLib/Include/assert.h @@ -0,0 +1,70 @@ +/** @file + Provides a definition of the assert macro. + + This header file defines the assert macro and refers to the NDEBUG macro, + which is NOT defined in this file. + + Unlike other header files, assert.h is designed to be included multiple + times, with potentially different behavior on each inclusion. + + If the NDEBUG macro is defined at the point where assert.h + is included, the assert macro is defined so as to not produce code. + Otherwise, the assertion is tested and if the assertion is true a + diagnostic message of the form + "ASSERT (): \n" is produced. + A true assertion will also result in the application being terminated. + + The behavior of the assert macro can be further modified by setting attributes + in the PcdDebugPropertyMask PCD entry when building the Application Toolkit. + If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of PcdDebugProperyMask is set + then CpuBreakpoint() is called. Otherwise, if the + DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then + CpuDeadLoop() is called. If neither of these bits are set, then the + application will be terminated immediately after the message is printed to + the debug output device. + +Copyright (c) 2010, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. +The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php. + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#include + +#undef assert ///< Remove any existing definition for assert. + +extern void +__assert(const char *func, const char *file, int line, const char *failedexpr); + +/** The assert macro puts diagnostic tests into programs; it expands to a + void expression. + + When it is executed, if expression (which shall have a scalar type) is + false (that is, compares equal to 0), the assert macro writes information + about the particular call that failed (including the text of the argument, + the name of the source file, the source line number, and the name of the + enclosing function - the latter are respectively the values of the + preprocessing macros __FILE__ and __LINE__ and of the identifier __func__) + on the standard error stream. It then calls the abort function. + + If NDEBUG is not defined, Expression is evaluated. If Expression evaluates to FALSE, then + __assert is called passing in the source filename, source function, source line number, + and the Expression. + + @param Expression Boolean expression. + +@{ +**/ +#ifdef NDEBUG +#define assert(Expression) /* ignored */ + +#else +#define assert(Expression) ((Expression) ? (void)0 :\ + __assert(__func__, __FILE__, __LINE__, #Expression) ) +#endif +/// @} +/* END of file assert.h */ diff --git a/StdLib/Include/ctype.h b/StdLib/Include/ctype.h new file mode 100644 index 0000000000..1796b81db7 --- /dev/null +++ b/StdLib/Include/ctype.h @@ -0,0 +1,187 @@ +/** @file + Single-byte character classification and case conversion macros and + function declarations. + + The header declares several functions useful for testing and mapping + characters. In all cases, the argument is an int, the value of which shall be + representable as an unsigned char or shall equal the value of the macro EOF. + If the argument has any other value, the behavior is undefined. + + The behavior of these functions is affected by the current locale. The + default is the "C" locale. + + The term "printing character" refers to a member of a locale-specific + set of characters, each of which occupies one printing position on a display + device; the term control character refers to a member of a locale-specific + set of characters that are not printing characters. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _CTYPE_H +#define _CTYPE_H +#include +#include + +__BEGIN_DECLS +// Declarations for the classification Functions + +/** The isalnum function tests for any character for which isalpha or isdigit + is true. + + @return Returns nonzero (true) if and only if the value of the argument c + conforms to that in the description of the function. +**/ +int isalnum(int c); + +/** The isalpha function tests for any character for which isupper or islower + is true, or any character that is one of a locale-specific set of + alphabetic characters for which none of iscntrl, isdigit, ispunct, or + isspace is true. In the "C" locale, isalpha returns true only for the + characters for which isupper or islower is true. + + @return Returns nonzero (true) if and only if the value of the argument c + conforms to that in the description of the function. +**/ +int isalpha(int c); + +/** The iscntrl function tests for any control character. + + @return Returns nonzero (true) if and only if the value of the argument c + conforms to that in the description of the function. +**/ +int iscntrl(int c); + +/** The isdigit function tests for any decimal-digit character. + + @return Returns nonzero (true) if and only if the value of the argument c + conforms to that in the description of the function. +**/ +int isdigit(int c); + +/** The isgraph function tests for any printing character except space (' '). + + @return Returns nonzero (true) if and only if the value of the argument c + conforms to that in the description of the function. +**/ +int isgraph(int c); + +/** The islower function tests for any character that is a lowercase letter or + is one of a locale-specific set of characters for which none of iscntrl, + isdigit, ispunct, or isspace is true. In the "C" locale, islower returns + true only for the lowercase letters. + + @return Returns nonzero (true) if and only if the value of the argument c + conforms to that in the description of the function. +**/ +int islower(int c); + +/** The isprint function tests for any printing character including space (' '). + + @return Returns nonzero (true) if and only if the value of the argument c + conforms to that in the description of the function. +**/ +int isprint(int c); + +/** The ispunct function tests for any printing character that is one of a + locale-specific set of punctuation characters for which neither isspace nor + isalnum is true. In the "C" locale, ispunct returns true for every printing + character for which neither isspace nor isalnum is true. + + @return Returns nonzero (true) if and only if the value of the argument c + conforms to that in the description of the function. +**/ +int ispunct(int c); + +/** The isspace function tests for any character that is a standard white-space + character or is one of a locale-specific set of characters for which + isalnum is false. The standard white-space characters are the following: + space (' '), form feed ('\f'), new-line ('\n'), carriage return ('\r'), + horizontal tab ('\t'), and vertical tab ('\v'). In the "C" locale, isspace + returns true only for the standard white-space characters. + + @return Returns nonzero (true) if and only if the value of the argument c + conforms to that in the description of the function. +**/ +int isspace(int c); + +/** The isupper function tests for any character that is an uppercase letter or + is one of a locale-specific set of characters for which none of iscntrl, + isdigit, ispunct, or isspace is true. In the "C" locale, isupper returns + true only for the uppercase letters. + + @return Returns nonzero (true) if and only if the value of the argument c + conforms to that in the description of the function. +**/ +int isupper(int c); + +/** The isxdigit function tests for any hexadecimal-digit character. + + @return Returns nonzero (true) if and only if the value of the argument c + conforms to that in the description of the function. +**/ +int isxdigit(int c); + +/** The isascii function tests that a character is one of the 128 ASCII characters. + + @param[in] c The character to test. + @return Returns nonzero (true) if c is a valid ASCII character. Otherwize, + zero (false) is returned. +**/ +int isascii(int c); + +/** The tolower function converts an uppercase letter to a corresponding + lowercase letter. + + @return If the argument is a character for which isupper is true and + there are one or more corresponding characters, as specified by + the current locale, for which islower is true, the tolower + function returns one of the corresponding characters (always the + same one for any given locale); otherwise, the argument is + returned unchanged. +**/ +int tolower(int c); + +/** The toupper function converts a lowercase letter to a corresponding + uppercase letter. + + @return If the argument is a character for which islower is true and + there are one or more corresponding characters, as specified by + the current locale, for which isupper is true, the toupper + function returns one of the corresponding characters (always the + same one for any given locale); otherwise, the argument is + returned unchanged. +**/ +int toupper(int c); + +int isblank(int); + +__END_DECLS + +// Character Classification Macros +// Undefine individually or define NO_CTYPE_MACROS, before including , +// in order to use the Function version of the character classification macros. +#ifndef NO_CTYPE_MACROS + #define isalnum(c) (__isCClass( (int)c, (_CD | _CU | _CL | _XA))) + #define isalpha(c) (__isCClass( (int)c, (_CU | _CL | _XA))) + #define iscntrl(c) (__isCClass( (int)c, (_CC))) + #define isdigit(c) (__isCClass( (int)c, (_CD))) + #define isgraph(c) (__isCClass( (int)c, (_CG))) + #define islower(c) (__isCClass( (int)c, (_CL))) + #define isprint(c) (__isCClass( (int)c, (_CS | _CG))) + #define ispunct(c) (__isCClass( (int)c, (_CP))) + #define isspace(c) (__isCClass( (int)c, (_CW))) + #define isupper(c) (__isCClass( (int)c, (_CU))) + #define isxdigit(c) (__isCClass( (int)c, (_CD | _CX))) + #define tolower(c) (__toLower((int)c)) + #define toupper(c) (__toUpper((int)c)) +#endif /* NO_CTYPE_MACROS */ + +#endif /* _CTYPE_H */ diff --git a/StdLib/Include/dirent.h b/StdLib/Include/dirent.h new file mode 100644 index 0000000000..859f4d5aeb --- /dev/null +++ b/StdLib/Include/dirent.h @@ -0,0 +1,22 @@ +/** @file + Declarations pertaining to directory entries under the UEFI environment. + + The information is based upon the EFI_FILE_INFO structure + in MdePkg/Include/Guid/FileInfo.h. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _DIRENT_H_ +#define _DIRENT_H_ + +#include + +#endif /* _DIRENT_H_ */ diff --git a/StdLib/Include/errno.h b/StdLib/Include/errno.h new file mode 100644 index 0000000000..f6d97bb9e5 --- /dev/null +++ b/StdLib/Include/errno.h @@ -0,0 +1,160 @@ +/** @file + The header defines several values, all relating to the reporting of + error conditions. + + The enum members expand to integral constant expressions + with distinct nonzero values, suitable for use in #if preprocessing + directives; and errno which expands to a modifiable lvalue that has type int, + the value of which is set to a positive error number by several library + functions. + + The value of errno is zero at program startup, but is never set to zero by + any library function. The value of errno may be set to a non-zero value by + a library function call whether or not there is an error, provided the use + of errno is not is not documented in the description of the function in + the governing standard: ISO/IEC 9899:1990 with Amendment 1 or ISO/IEC 9899:1999. + +Copyright (c) 2010, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. +The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php. + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _ERRNO_H +#define _ERRNO_H +#include +#include + +extern int errno; +extern RETURN_STATUS EFIerrno; + +// Define error number in terms of the ENUM in + +#define EMINERRORVAL __EMINERRORVAL /* The lowest valid error value */ + +#define EPERM __EPERM /* 1 Operation not permitted */ +#define ENOENT __ENOENT /* 2 No such file or directory */ +#define ESRCH __ESRCH /* 3 No such process */ +#define EINTR __EINTR /* 4 Interrupted system call */ +#define EIO __EIO /* 5 Input/output error */ +#define ENXIO __ENXIO /* 6 Device not configured */ +#define E2BIG __E2BIG /* 7 Argument list too long */ +#define ENOEXEC __ENOEXEC /* 8 Exec format error */ +#define EBADF __EBADF /* 9 Bad file descriptor */ +#define ECHILD __ECHILD /* 10 No child processes */ +#define EDEADLK __EDEADLK /* 11 Resource deadlock avoided */ +#define ENOMEM __ENOMEM /* 12 Cannot allocate memory */ +#define EACCES __EACCES /* 13 Permission denied */ +#define EFAULT __EFAULT /* 14 Bad address */ +#define ENOTBLK __ENOTBLK /* 15 Block device required */ +#define EBUSY __EBUSY /* 16 Device busy */ +#define EEXIST __EEXIST /* 17 File exists */ +#define EXDEV __EXDEV /* 18 Cross-device link */ +#define ENODEV __ENODEV /* 19 Operation not supported by device */ +#define ENOTDIR __ENOTDIR /* 20 Not a directory */ +#define EISDIR __EISDIR /* 21 Is a directory */ +#define EINVAL __EINVAL /* 22 Invalid argument */ +#define ENFILE __ENFILE /* 23 Too many open files in system */ +#define EMFILE __EMFILE /* 24 Too many open file descriptors */ +#define ENOTTY __ENOTTY /* 25 Inappropriate ioctl for device */ +#define ETXTBSY __ETXTBSY /* 26 Text file busy */ +#define EFBIG __EFBIG /* 27 File too large */ +#define ENOSPC __ENOSPC /* 28 No space left on device */ +#define ESPIPE __ESPIPE /* 29 Illegal seek */ +#define EROFS __EROFS /* 30 Read-only filesystem */ +#define EMLINK __EMLINK /* 31 Too many links */ +#define EPIPE __EPIPE /* 32 Broken pipe */ + +/* math software -- these are the only two values required by the C Standard */ +#define EDOM __EDOM /* 33 Numerical argument out of domain */ +#define ERANGE __ERANGE /* 34 Result too large */ + +/* non-blocking and interrupt i/o */ +#define EAGAIN __EAGAIN /* 35 Resource temporarily unavailable */ +#define EWOULDBLOCK __EWOULDBLOCK /* 35 Operation would block */ +#define EINPROGRESS __EINPROGRESS /* 36 Operation now in progress */ +#define EALREADY __EALREADY /* 37 Operation already in progress */ + +/* ipc/network software -- argument errors */ +#define ENOTSOCK __ENOTSOCK /* 38 Socket operation on non-socket */ +#define EDESTADDRREQ __EDESTADDRREQ /* 39 Destination address required */ +#define EMSGSIZE __EMSGSIZE /* 40 Message too long */ +#define EPROTOTYPE __EPROTOTYPE /* 41 Protocol wrong type for socket */ +#define ENOPROTOOPT __ENOPROTOOPT /* 42 Protocol not available */ +#define EPROTONOSUPPORT __EPROTONOSUPPORT /* 43 Protocol not supported */ +#define ESOCKTNOSUPPORT __ESOCKTNOSUPPORT /* 44 Socket type not supported */ +#define EOPNOTSUPP __EOPNOTSUPP /* 45 Operation not supported */ +#define ENOTSUP __ENOTSUP /* 45 Operation not supported */ +#define EPFNOSUPPORT __EPFNOSUPPORT /* 46 Protocol family not supported */ +#define EAFNOSUPPORT __EAFNOSUPPORT /* 47 Address family not supported by protocol family */ +#define EADDRINUSE __EADDRINUSE /* 48 Address already in use */ +#define EADDRNOTAVAIL __EADDRNOTAVAIL /* 49 Can't assign requested address */ + +/* ipc/network software -- operational errors */ +#define ENETDOWN __ENETDOWN /* 50 Network is down */ +#define ENETUNREACH __ENETUNREACH /* 51 Network is unreachable */ +#define ENETRESET __ENETRESET /* 52 Network dropped connection on reset */ +#define ECONNABORTED __ECONNABORTED /* 53 Software caused connection abort */ +#define ECONNRESET __ECONNRESET /* 54 Connection reset by peer */ +#define ENOBUFS __ENOBUFS /* 55 No buffer space available */ +#define EISCONN __EISCONN /* 56 Socket is already connected */ +#define ENOTCONN __ENOTCONN /* 57 Socket is not connected */ +#define ESHUTDOWN __ESHUTDOWN /* 58 Can't send after socket shutdown */ +#define ETOOMANYREFS __ETOOMANYREFS /* 59 Too many references: can't splice */ +#define ETIMEDOUT __ETIMEDOUT /* 60 Operation timed out */ +#define ECONNREFUSED __ECONNREFUSED /* 61 Connection refused */ +#define ELOOP __ELOOP /* 62 Too many levels of symbolic links */ +#define ENAMETOOLONG __ENAMETOOLONG /* 63 File name too long */ +#define EHOSTDOWN __EHOSTDOWN /* 64 Host is down */ +#define EHOSTUNREACH __EHOSTUNREACH /* 65 No route to host */ + +#define ENOTEMPTY __ENOTEMPTY /* 66 Directory not empty */ + +/* quotas, etc. */ +#define EPROCLIM __EPROCLIM /* 67 Too many processes */ +#define EUSERS __EUSERS /* 68 Too many users */ +#define EDQUOT __EDQUOT /* 69 Disc quota exceeded */ + +/* Network File System */ +#define ESTALE __ESTALE /* 70 Stale NFS file handle */ +#define EREMOTE __EREMOTE /* 71 Too many levels of remote in path */ +#define EBADRPC __EBADRPC /* 72 RPC struct is bad */ +#define ERPCMISMATCH __ERPCMISMATCH /* 73 RPC version wrong */ +#define EPROGUNAVAIL __EPROGUNAVAIL /* 74 RPC prog. not avail */ +#define EPROGMISMATCH __EPROGMISMATCH /* 75 Program version wrong */ +#define EPROCUNAVAIL __EPROCUNAVAIL /* 76 Bad procedure for program */ +#define ENOLCK __ENOLCK /* 77 No locks available */ +#define ENOSYS __ENOSYS /* 78 Function not implemented */ +#define EFTYPE __EFTYPE /* 79 Inappropriate file type or format */ +#define EAUTH __EAUTH /* 80 Authentication error */ +#define ENEEDAUTH __ENEEDAUTH /* 81 Need authenticator */ +#define EIDRM __EIDRM /* 82 Identifier removed */ +#define ENOMSG __ENOMSG /* 83 No message of desired type */ +#define EOVERFLOW __EOVERFLOW /* 84 Value too large to be stored in data type */ +#define EILSEQ __EILSEQ /* 85 Illegal byte sequence */ +#define ENOTHING_1 __ENOTHING_1 /* 86 Place Holder */ +#define ECANCELED __ECANCELED /* 87 Operation canceled */ + +#define EBADMSG __EBADMSG /* 88 Bad message */ +#define ENODATA __ENODATA /* 89 No message available */ +#define ENOSR __ENOSR /* 90 No STREAM resources */ +#define ENOSTR __ENOSTR /* 91 Not a STREAM */ +#define ETIME __ETIME /* 92 STREAM ioctl timeout */ + +#define ENOATTR __ENOATTR /* 93 Attribute not found */ + +#define EDOOFUS __EDOOFUS /* 94 Programming error */ + +#define EMULTIHOP __EMULTIHOP /* 95 Multihop attempted */ +#define ENOLINK __ENOLINK /* 96 Link has been severed */ +#define EPROTO __EPROTO /* 97 Protocol error */ + +#define EBUFSIZE __EBUFSIZE /* 98 Buffer too small to hold result */ + +#define EMAXERRORVAL __EMAXERRORVAL /* One more than the highest defined error value. */ + +#endif /* _ERRNO_H */ diff --git a/StdLib/Include/fcntl.h b/StdLib/Include/fcntl.h new file mode 100644 index 0000000000..f5b4474572 --- /dev/null +++ b/StdLib/Include/fcntl.h @@ -0,0 +1 @@ +#include diff --git a/StdLib/Include/float.h b/StdLib/Include/float.h new file mode 100644 index 0000000000..ca38ade70f --- /dev/null +++ b/StdLib/Include/float.h @@ -0,0 +1 @@ +#include diff --git a/StdLib/Include/inttypes.h b/StdLib/Include/inttypes.h new file mode 100644 index 0000000000..51cdb5b879 --- /dev/null +++ b/StdLib/Include/inttypes.h @@ -0,0 +1,63 @@ +/* $NetBSD: inttypes.h,v 1.4 2005/04/18 19:47:51 kleink Exp $ */ + +/*- + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Klaus Klein. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _INTTYPES_H_ +#define _INTTYPES_H_ + +#include +//#include +#include +#include + +#ifdef _EFI_WCHAR_T + typedef _EFI_WCHAR_T wchar_t; + #undef _EFI_WCHAR_T + #undef _BSD_WCHAR_T_ +#endif + +__BEGIN_DECLS +intmax_t strtoimax(const char * __restrict, + char ** __restrict, int); +uintmax_t strtoumax(const char * __restrict, + char ** __restrict, int); +intmax_t wcstoimax(const wchar_t * __restrict, + wchar_t ** __restrict, int); +uintmax_t wcstoumax(const wchar_t * __restrict, + wchar_t ** __restrict, int); +__END_DECLS + +#endif /* !_INTTYPES_H_ */ diff --git a/StdLib/Include/iso646.h b/StdLib/Include/iso646.h new file mode 100644 index 0000000000..c72d5d663b --- /dev/null +++ b/StdLib/Include/iso646.h @@ -0,0 +1,32 @@ +/** @file + Provides alternative "spellings" for several C operators. + + The header defines the following eleven macros (on the left) that expand + to the corresponding tokens (on the right). + +Copyright (c) 2010, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. +The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php. + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#ifndef _ISO646_H +#define _ISO646_H +#include + +#define and && +#define and_eq &= +#define bitand & +#define bitor | +#define compl ~ +#define not ! +#define not_eq != +#define or || +#define or_eq |= +#define xor ^ +#define xor_eq ^= + +#endif /* _ISO646_H */ diff --git a/StdLib/Include/langinfo.h b/StdLib/Include/langinfo.h new file mode 100644 index 0000000000..70a8f1b5a0 --- /dev/null +++ b/StdLib/Include/langinfo.h @@ -0,0 +1,91 @@ +/* $NetBSD: langinfo.h,v 1.9 2005/02/03 04:39:32 perry Exp $ */ + +/* + * Written by J.T. Conklin + * Public domain. + */ + +#ifndef _LANGINFO_H_ +#define _LANGINFO_H_ + +#include +#include + +#define D_T_FMT ((nl_item)0) /* String for formatting date and + time */ +#define D_FMT ((nl_item)1) /* Date format string */ +#define T_FMT ((nl_item)2) /* Time format string */ +#define T_FMT_AMPM ((nl_item)3) /* Time format string with 12 hour + clock */ +#define AM_STR ((nl_item)4) /* Ante Meridiem afix */ +#define PM_STR ((nl_item)5) /* Post Meridiem afix */ + +#define DAY_1 ((nl_item)6) /* Name of the first day of the week */ +#define DAY_2 ((nl_item)7) +#define DAY_3 ((nl_item)8) +#define DAY_4 ((nl_item)9) +#define DAY_5 ((nl_item)10) +#define DAY_6 ((nl_item)11) +#define DAY_7 ((nl_item)12) + +#define ABDAY_1 ((nl_item)13) /* Abbrev. name of the first day of + the week */ +#define ABDAY_2 ((nl_item)14) +#define ABDAY_3 ((nl_item)15) +#define ABDAY_4 ((nl_item)16) +#define ABDAY_5 ((nl_item)17) +#define ABDAY_6 ((nl_item)18) +#define ABDAY_7 ((nl_item)19) + +#define MON_1 ((nl_item)20) /* Name of the first month */ +#define MON_2 ((nl_item)21) +#define MON_3 ((nl_item)22) +#define MON_4 ((nl_item)23) +#define MON_5 ((nl_item)24) +#define MON_6 ((nl_item)25) +#define MON_7 ((nl_item)26) +#define MON_8 ((nl_item)27) +#define MON_9 ((nl_item)28) +#define MON_10 ((nl_item)29) +#define MON_11 ((nl_item)30) +#define MON_12 ((nl_item)31) + +#define ABMON_1 ((nl_item)32) /* Abbrev. name of the first month */ +#define ABMON_2 ((nl_item)33) +#define ABMON_3 ((nl_item)34) +#define ABMON_4 ((nl_item)35) +#define ABMON_5 ((nl_item)36) +#define ABMON_6 ((nl_item)37) +#define ABMON_7 ((nl_item)38) +#define ABMON_8 ((nl_item)39) +#define ABMON_9 ((nl_item)40) +#define ABMON_10 ((nl_item)41) +#define ABMON_11 ((nl_item)42) +#define ABMON_12 ((nl_item)43) + +#define RADIXCHAR ((nl_item)44) /* Radix character */ +#define THOUSEP ((nl_item)45) /* Separator for thousands */ +#define YESSTR ((nl_item)46) /* Affirmitive response for yes/no + queries */ +#define YESEXPR ((nl_item)47) /* Affirmitive response for yes/no + queries */ +#define NOSTR ((nl_item)48) /* Negative response for yes/no + queries */ +#define NOEXPR ((nl_item)49) /* Negative response for yes/no + queries */ +#define CRNCYSTR ((nl_item)50) /* Currency symbol */ + +#define CODESET ((nl_item)51) /* codeset name */ + +#define ERA ((nl_item)52) /* Era description segments */ +#define ERA_D_FMT ((nl_item)53) /* Era date format string */ +#define ERA_D_T_FMT ((nl_item)54) /* Era date and time format string */ +#define ERA_T_FMT ((nl_item)55) /* Era time format string */ + +#define ALT_DIGITS ((nl_item)56) /* Alternative symbols for digits */ + +__BEGIN_DECLS +char *nl_langinfo(nl_item); +__END_DECLS + +#endif /* _LANGINFO_H_ */ diff --git a/StdLib/Include/limits.h b/StdLib/Include/limits.h new file mode 100644 index 0000000000..c0e60fe007 --- /dev/null +++ b/StdLib/Include/limits.h @@ -0,0 +1,120 @@ +/** @file + The header defines several macros that expand to various limits and + parameters of the standard integer types. + + The values given below shall be replaced by constant expressions suitable for + use in #if preprocessing directives. Moreover, except for CHAR_BIT and + MB_LEN_MAX, the following shall be replaced by expressions that have the same + type as would an expression that is an object of the corresponding type + converted according to the integer promotions. Their implementation-defined + values shall be equal or greater in magnitude (absolute value) to those + documented, with the same sign. + + If the value of an object of type char is treated as a signed integer when + used in an expression, the value of CHAR_MIN shall be the same as that of + SCHAR_MIN and the value of CHAR_MAX shall be the same as that of SCHAR_MAX. + Otherwise, the value of CHAR_MIN shall be 0 and the value of CHAR_MAX shall + be the same as that of UCHAR_MAX.) + The value UCHAR_MAX shall equal 2^(CHAR_BIT - 1). + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _LIMITS_H +#define _LIMITS_H +#include +#include + +/* Get the architecturally defined limits for this compilation unit. */ +#include + +/* Define the values required by Specification. */ + +/** maximum number of bytes in a multibyte character, for any supported locale **/ +#define MB_LEN_MAX 2 /* 16-bit UTC-2 */ + +/** Number of bits for smallest object that is not a bit-field (byte). **/ +#define CHAR_BIT __CHAR_BIT + +/** minimum value for an object of type signed char **/ +#define SCHAR_MIN __SCHAR_MIN + +/** maximum value for an object of type signed char **/ +#define SCHAR_MAX __SCHAR_MAX + +/** maximum value for an object of type unsigned char **/ +#define UCHAR_MAX __UCHAR_MAX + +#ifdef __CHAR_UNSIGNED__ + /** maximum value for an object of type char **/ + #define CHAR_MAX UCHAR_MAX + /** minimum value for an object of type char **/ + #define CHAR_MIN 0 +#else + /** maximum value for an object of type char **/ + #define CHAR_MAX SCHAR_MAX + /** minimum value for an object of type char **/ + #define CHAR_MIN SCHAR_MIN +#endif + +/** minimum value for an object of type short int **/ +#define SHRT_MIN __SHRT_MIN + +/** maximum value for an object of type short int **/ +#define SHRT_MAX __SHRT_MAX + +/** maximum value for an object of type unsigned short int **/ +#define USHRT_MAX __USHRT_MAX + +/** minimum value for an object of type int **/ +#define INT_MIN __INT_MIN + +/** maximum value for an object of type int **/ +#define INT_MAX __INT_MAX + +/** maximum value for an object of type unsigned int **/ +#define UINT_MAX __UINT_MAX + +/** minimum value for an object of type long int **/ +#define LONG_MIN __LONG_MIN + +/** maximum value for an object of type long int **/ +#define LONG_MAX __LONG_MAX + +/** maximum value for an object of type unsigned long int **/ +#define ULONG_MAX __ULONG_MAX + +/** minimum value for an object of type long long int **/ +#define LLONG_MIN __LLONG_MIN + +/** maximum value for an object of type long long int **/ +#define LLONG_MAX __LLONG_MAX + +/** maximum value for an object of type unsigned long long int **/ +#define ULLONG_MAX __ULLONG_MAX + +/* Object limits used in the Standard Libraries */ +#if (PcdGet32(PcdMaximumAsciiStringLength) > 0) + #define ASCII_STRING_MAX PcdGet32(PcdMaximumAsciiStringLength) +#else + #define ASCII_STRING_MAX 256 +#endif + +#if (PcdGet32(PcdMaximumUnicodeStringLength) > 0) + #define UNICODE_STRING_MAX PcdGet32(PcdMaximumUnicodeStringLength) +#else + #define UNICODE_STRING_MAX 512 +#endif + +/* Limits for BSD Compatibility */ +#define NL_TEXTMAX 2048 +#include + +#endif /* _LIMITS_H */ diff --git a/StdLib/Include/locale.h b/StdLib/Include/locale.h new file mode 100644 index 0000000000..220f35a043 --- /dev/null +++ b/StdLib/Include/locale.h @@ -0,0 +1,87 @@ +/* $NetBSD: locale.h,v 1.14 2005/02/03 04:39:32 perry Exp $ */ + +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)locale.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _LOCALE_H_ +#define _LOCALE_H_ + +struct lconv { + char *decimal_point; + char *thousands_sep; + char *grouping; + char *int_curr_symbol; + char *currency_symbol; + char *mon_decimal_point; + char *mon_thousands_sep; + char *mon_grouping; + char *positive_sign; + char *negative_sign; + char int_frac_digits; + char frac_digits; + char p_cs_precedes; + char p_sep_by_space; + char n_cs_precedes; + char n_sep_by_space; + char p_sign_posn; + char n_sign_posn; + char int_p_cs_precedes; + char int_n_cs_precedes; + char int_p_sep_by_space; + char int_n_sep_by_space; + char int_p_sign_posn; + char int_n_sign_posn; +}; + +#define LC_ALL 0 +#define LC_COLLATE 1 +#define LC_CTYPE 2 +#define LC_MONETARY 3 +#define LC_NUMERIC 4 +#define LC_TIME 5 +#define LC_MESSAGES 6 + +#define _LC_LAST 7 /* marks end */ + +#include + +__BEGIN_DECLS +struct lconv *localeconv(void); + char *__setlocale_mb_len_max_32(int, const char *); +#ifdef __SETLOCALE_SOURCE__ + char *setlocale(int, const char *); + char *__setlocale(int, const char *); +#else /* !__SETLOCALE_SOURCE__ */ + char *setlocale(int, const char *) __RENAME(__setlocale_mb_len_max_32); +#endif /* !__SETLOCALE_SOURCE__ */ +__END_DECLS + +#endif /* _LOCALE_H_ */ diff --git a/StdLib/Include/math.h b/StdLib/Include/math.h new file mode 100644 index 0000000000..81a900e671 --- /dev/null +++ b/StdLib/Include/math.h @@ -0,0 +1,453 @@ +/* $NetBSD: math.h,v 1.44 2006/03/25 16:41:11 xtraeme Exp $ */ + +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +/* + * @(#)fdlibm.h 5.1 93/09/24 + */ + +#ifndef _MATH_H_ +#define _MATH_H_ + +#include +#include + +union __float_u { + unsigned char __dummy[sizeof(float)]; + float __val; +}; + +union __double_u { + unsigned char __dummy[sizeof(double)]; + double __val; +}; + +union __long_double_u { + unsigned char __dummy[sizeof(long double)]; + long double __val; +}; + +#include /* may use __float_u, __double_u, + or __long_double_u */ + +#ifdef __HAVE_LONG_DOUBLE +#define __fpmacro_unary_floating(__name, __arg0) \ + /* LINTED */ \ + ((sizeof (__arg0) == sizeof (float)) \ + ? __ ## __name ## f (__arg0) \ + : (sizeof (__arg0) == sizeof (double)) \ + ? __ ## __name ## d (__arg0) \ + : __ ## __name ## l (__arg0)) +#else +#define __fpmacro_unary_floating(__name, __arg0) \ + /* LINTED */ \ + ((sizeof (__arg0) == sizeof (float)) \ + ? __ ## __name ## f (__arg0) \ + : __ ## __name ## d (__arg0)) +#endif /* __HAVE_LONG_DOUBLE */ + +/* + * ANSI/POSIX + */ +/* 7.12#3 HUGE_VAL, HUGELF, HUGE_VALL */ +extern const union __double_u __infinity; +#define HUGE_VAL __infinity.__val + +/* + * ISO C99 + */ +/* 7.12#3 HUGE_VAL, HUGELF, HUGE_VALL */ +extern const union __float_u __infinityf; +#define HUGE_VALF __infinityf.__val + +extern const union __long_double_u __infinityl; +#define HUGE_VALL __infinityl.__val + +/* 7.12#4 INFINITY */ +#ifdef __INFINITY +#define INFINITY __INFINITY /* float constant which overflows */ +#else +#define INFINITY HUGE_VALF /* positive infinity */ +#endif /* __INFINITY */ + +/* 7.12#5 NAN: a quiet NaN, if supported */ +#ifdef __HAVE_NANF +extern const union __float_u __nanf; +#define NAN __nanf.__val +#endif /* __HAVE_NANF */ + +/* 7.12#6 number classification macros */ +#define FP_INFINITE 0x00 +#define FP_NAN 0x01 +#define FP_NORMAL 0x02 +#define FP_SUBNORMAL 0x03 +#define FP_ZERO 0x04 +/* NetBSD extensions */ +#define _FP_LOMD 0x80 /* range for machine-specific classes */ +#define _FP_HIMD 0xff + +/* + * XOPEN/SVID + */ +#define M_E 2.7182818284590452354 /* e */ +#define M_LOG2E 1.4426950408889634074 /* log 2e */ +#define M_LOG10E 0.43429448190325182765 /* log 10e */ +#define M_LN2 0.69314718055994530942 /* log e2 */ +#define M_LN10 2.30258509299404568402 /* log e10 */ +#define M_PI 3.14159265358979323846 /* pi */ +#define M_PI_2 1.57079632679489661923 /* pi/2 */ +#define M_PI_4 0.78539816339744830962 /* pi/4 */ +#define M_1_PI 0.31830988618379067154 /* 1/pi */ +#define M_2_PI 0.63661977236758134308 /* 2/pi */ +#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */ +#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ +#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ + +#define MAXFLOAT ((float)3.40282346638528860e+38) +extern int signgam; + +enum fdversion {fdlibm_ieee = -1, fdlibm_svid, fdlibm_xopen, fdlibm_posix}; + +#define _LIB_VERSION_TYPE enum fdversion +#define _LIB_VERSION _fdlib_version + +/* if global variable _LIB_VERSION is not desirable, one may + * change the following to be a constant by: + * #define _LIB_VERSION_TYPE const enum version + * In that case, after one initializes the value _LIB_VERSION (see + * s_lib_version.c) during compile time, it cannot be modified + * in the middle of a program + */ +extern _LIB_VERSION_TYPE _LIB_VERSION; + +#define _IEEE_ fdlibm_ieee +#define _SVID_ fdlibm_svid +#define _XOPEN_ fdlibm_xopen +#define _POSIX_ fdlibm_posix + +#ifndef __cplusplus +struct exception { + int type; + char *name; + double arg1; + double arg2; + double retval; +}; +#endif + +#define HUGE MAXFLOAT + +/* + * set X_TLOSS = pi*2**52, which is possibly defined in + * (one may replace the following line by "#include ") + */ + +#define X_TLOSS 1.41484755040568800000e+16 + +#define DOMAIN 1 +#define SING 2 +#define OVERFLOW 3 +#define UNDERFLOW 4 +#define TLOSS 5 +#define PLOSS 6 + + +__BEGIN_DECLS +/* + * ANSI/POSIX + */ +double acos(double); +double asin(double); +double atan(double); +double atan2(double, double); +double cos(double); +double sin(double); +double tan(double); + +double cosh(double); +double sinh(double); +double tanh(double); + +double exp(double); +double frexp(double, int *); +double ldexp(double, int); +double log(double); +double log2(double); +double log10(double); +double modf(double, double *); + +double pow(double, double); +double sqrt(double); + +double ceil(double); +double fabs(double); +double floor(double); +double fmod(double, double); + +//#if defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE) +//double erf(double); +//double erfc(double); +//double gamma(double); +//double hypot(double, double); +int finite(double); +//double j0(double); +//double j1(double); +//double jn(int, double); +//double lgamma(double); +//double y0(double); +//double y1(double); +//double yn(int, double); + +//#if (_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE) +//double acosh(double); +//double asinh(double); +//double atanh(double); +//double cbrt(double); +double expm1(double); +//int ilogb(double); +//double log1p(double); +//double logb(double); +//double nextafter(double, double); +//double remainder(double, double); +//double rint(double); +//double scalb(double, double); +//#endif /* (_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE)*/ +//#endif /* _XOPEN_SOURCE || _NETBSD_SOURCE */ + +/* 7.12.3.1 int fpclassify(real-floating x) */ +#define fpclassify(__x) __fpmacro_unary_floating(fpclassify, __x) + +#if 0 +/* + * ISO C99 + */ +#if !defined(_ANSI_SOURCE) && !defined(_POSIX_C_SOURCE) && \ + !defined(_XOPEN_SOURCE) || \ + ((__STDC_VERSION__ - 0) >= 199901L) || \ + ((_POSIX_C_SOURCE - 0) >= 200112L) || \ + ((_XOPEN_SOURCE - 0) >= 600) || \ + defined(_ISOC99_SOURCE) || defined(_NETBSD_SOURCE) + +/* 7.12.3.2 int isfinite(real-floating x) */ +#define isfinite(__x) __fpmacro_unary_floating(isfinite, __x) + +/* 7.12.3.5 int isnormal(real-floating x) */ +#define isnormal(__x) (fpclassify(__x) == FP_NORMAL) + +/* 7.12.3.6 int signbit(real-floating x) */ +#define signbit(__x) __fpmacro_unary_floating(signbit, __x) + +/* 7.12.4 trigonometric */ + +float acosf(float); +float asinf(float); +float atanf(float); +float atan2f(float, float); +float cosf(float); +float sinf(float); +float tanf(float); + +/* 7.12.5 hyperbolic */ + +float acoshf(float); +float asinhf(float); +float atanhf(float); +float coshf(float); +float sinhf(float); +float tanhf(float); + +/* 7.12.6 exp / log */ + +float expf(float); +float expm1f(float); +float frexpf(float, int *); +int ilogbf(float); +float ldexpf(float, int); +float logf(float); +float log2f(float); +float log10f(float); +float log1pf(float); +float logbf(float); +float modff(float, float *); +float scalbnf(float, int); + +/* 7.12.7 power / absolute */ + +float cbrtf(float); +float fabsf(float); +float hypotf(float, float); +float powf(float, float); +float sqrtf(float); + +/* 7.12.8 error / gamma */ + +float erff(float); +float erfcf(float); +float lgammaf(float); + +/* 7.12.9 nearest integer */ + +float ceilf(float); +float floorf(float); +float rintf(float); +double round(double); +float roundf(float); +double trunc(double); +float truncf(float); +long int lrint(double); +long int lrintf(float); +/* LONGLONG */ +long long int llrint(double); +/* LONGLONG */ +long long int llrintf(float); +long int lround(double); +long int lroundf(float); +/* LONGLONG */ +long long int llround(double); +/* LONGLONG */ +long long int llroundf(float); + +/* 7.12.10 remainder */ + +float fmodf(float, float); +float remainderf(float, float); + +/* 7.2.11 manipulation */ + +float copysignf(float, float); +double nan(const char *); +float nanf(const char *); +long double nanl(const char *); +float nextafterf(float, float); + + +#endif /* !_ANSI_SOURCE && ... */ + +#if defined(_NETBSD_SOURCE) +#ifndef __cplusplus +int matherr(struct exception *); +#endif +#endif /* _NETBSD_SOURCE */ + +/* + * IEEE Test Vector + */ +double significand(double); +#endif /* if 0 */ + +/* 7.12.3.3 int isinf(real-floating x) */ +#ifdef __isinf +#define isinf(__x) __isinf(__x) +#else +#define isinf(__x) __fpmacro_unary_floating(isinf, __x) +#endif + +/* 7.12.3.4 int isnan(real-floating x) */ +#ifdef __isnan +#define isnan(__x) __isnan(__x) +#else +#define isnan(__x) __fpmacro_unary_floating(isnan, __x) +#endif + +/* + * Functions callable from C, intended to support IEEE arithmetic. + */ +double copysign(double, double); +double scalbn(double, int); + +#if 0 +/* + * BSD math library entry points + */ +#ifndef __MATH_PRIVATE__ +double cabs(/* struct complex { double r; double i; } */); +#endif +double drem(double, double); + + +#if defined(_NETBSD_SOURCE) || defined(_REENTRANT) +/* + * Reentrant version of gamma & lgamma; passes signgam back by reference + * as the second argument; user must allocate space for signgam. + */ +double gamma_r(double, int *); +double lgamma_r(double, int *); +#endif /* _NETBSD_SOURCE || _REENTRANT */ + + +#if defined(_NETBSD_SOURCE) + +/* float versions of ANSI/POSIX functions */ + +float gammaf(float); +int isinff(float); +int isnanf(float); +int finitef(float); +float j0f(float); +float j1f(float); +float jnf(int, float); +float y0f(float); +float y1f(float); +float ynf(int, float); + +float scalbf(float, float); + +/* + * float version of IEEE Test Vector + */ +float significandf(float); + +/* + * float versions of BSD math library entry points + */ +#ifndef __MATH_PRIVATE__ +float cabsf(/* struct complex { float r; float i; } */); +#endif +float dremf(float, float); +#endif /* _NETBSD_SOURCE */ + +#if defined(_NETBSD_SOURCE) || defined(_REENTRANT) +/* + * Float versions of reentrant version of gamma & lgamma; passes + * signgam back by reference as the second argument; user must + * allocate space for signgam. + */ +float gammaf_r(float, int *); +float lgammaf_r(float, int *); +#endif /* !... || _REENTRANT */ + +#endif /* if 0 */ + +///* +// * Library implementation +// */ +int __fpclassifyf(float); +int __fpclassifyd(double); +//int __isfinitef(float); +//int __isfinited(double); +int __isinff(float); +int __isinfd(double); +int __isnanf(float); +int __isnand(double); +//int __signbitf(float); +//int __signbitd(double); + +//#ifdef __HAVE_LONG_DOUBLE +int __fpclassifyl(long double); +//int __isfinitel(long double); +int __isinfl(long double); +int __isnanl(long double); +//int __signbitl(long double); +//#endif +__END_DECLS + +#endif /* _MATH_H_ */ diff --git a/StdLib/Include/netinet/in.h b/StdLib/Include/netinet/in.h new file mode 100644 index 0000000000..6f13b02d3a --- /dev/null +++ b/StdLib/Include/netinet/in.h @@ -0,0 +1,557 @@ +/* $NetBSD: in.h,v 1.77 2006/11/13 05:13:41 dyoung Exp $ */ + +/* + * Copyright (c) 1982, 1986, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in.h 8.3 (Berkeley) 1/3/94 + */ + +/* + * Constants and structures defined by the internet system, + * Per RFC 790, September 1981, and numerous additions. + */ + +#ifndef _NETINET_IN_H_ +#define _NETINET_IN_H_ + +#include + +#ifndef uint8_t +typedef __uint8_t uint8_t; +#define uint8_t __uint8_t +#endif + +#ifndef uint32_t +typedef __uint32_t uint32_t; +#define uint32_t __uint32_t +#endif + +#include + +#ifndef in_addr_t +typedef __in_addr_t in_addr_t; +#define in_addr_t __in_addr_t +#endif + +#ifndef in_port_t +typedef __in_port_t in_port_t; +#define in_port_t __in_port_t +#endif + +#ifndef sa_family_t +typedef __sa_family_t sa_family_t; +#define sa_family_t __sa_family_t +#endif + +/* + * Protocols + */ +#define IPPROTO_IP 0 /* dummy for IP */ +#define IPPROTO_HOPOPTS 0 /* IP6 hop-by-hop options */ +#define IPPROTO_ICMP 1 /* control message protocol */ +#define IPPROTO_IGMP 2 /* group mgmt protocol */ +#define IPPROTO_GGP 3 /* gateway^2 (deprecated) */ +#define IPPROTO_IPV4 4 /* IP header */ +#define IPPROTO_IPIP 4 /* IP inside IP */ +#define IPPROTO_TCP 6 /* tcp */ +#define IPPROTO_EGP 8 /* exterior gateway protocol */ +#define IPPROTO_PUP 12 /* pup */ +#define IPPROTO_UDP 17 /* user datagram protocol */ +#define IPPROTO_IDP 22 /* xns idp */ +#define IPPROTO_TP 29 /* tp-4 w/ class negotiation */ +#define IPPROTO_IPV6 41 /* IP6 header */ +#define IPPROTO_ROUTING 43 /* IP6 routing header */ +#define IPPROTO_FRAGMENT 44 /* IP6 fragmentation header */ +#define IPPROTO_RSVP 46 /* resource reservation */ +#define IPPROTO_GRE 47 /* GRE encaps RFC 1701 */ +#define IPPROTO_ESP 50 /* encap. security payload */ +#define IPPROTO_AH 51 /* authentication header */ +#define IPPROTO_MOBILE 55 /* IP Mobility RFC 2004 */ +#define IPPROTO_IPV6_ICMP 58 /* IPv6 ICMP */ +#define IPPROTO_ICMPV6 58 /* ICMP6 */ +#define IPPROTO_NONE 59 /* IP6 no next header */ +#define IPPROTO_DSTOPTS 60 /* IP6 destination option */ +#define IPPROTO_EON 80 /* ISO cnlp */ +#define IPPROTO_ETHERIP 97 /* Ethernet-in-IP */ +#define IPPROTO_ENCAP 98 /* encapsulation header */ +#define IPPROTO_PIM 103 /* Protocol indep. multicast */ +#define IPPROTO_IPCOMP 108 /* IP Payload Comp. Protocol */ +#define IPPROTO_VRRP 112 /* VRRP RFC 2338 */ +#define IPPROTO_CARP 112 /* Common Address Resolution Protocol */ +#define IPPROTO_RAW 255 /* raw IP packet */ +#define IPPROTO_MAX 256 + +/* last return value of *_input(), meaning "all job for this pkt is done". */ +#define IPPROTO_DONE 257 + +/* sysctl placeholder for (FAST_)IPSEC */ +#define CTL_IPPROTO_IPSEC 258 + + +/* + * Local port number conventions: + * + * Ports < IPPORT_RESERVED are reserved for privileged processes (e.g. root), + * unless a kernel is compiled with IPNOPRIVPORTS defined. + * + * When a user does a bind(2) or connect(2) with a port number of zero, + * a non-conflicting local port address is chosen. + * + * The default range is IPPORT_ANONMIN to IPPORT_ANONMAX, although + * that is settable by sysctl(3); net.inet.ip.anonportmin and + * net.inet.ip.anonportmax respectively. + * + * A user may set the IPPROTO_IP option IP_PORTRANGE to change this + * default assignment range. + * + * The value IP_PORTRANGE_DEFAULT causes the default behavior. + * + * The value IP_PORTRANGE_HIGH is the same as IP_PORTRANGE_DEFAULT, + * and exists only for FreeBSD compatibility purposes. + * + * The value IP_PORTRANGE_LOW changes the range to the "low" are + * that is (by convention) restricted to privileged processes. + * This convention is based on "vouchsafe" principles only. + * It is only secure if you trust the remote host to restrict these ports. + * The range is IPPORT_RESERVEDMIN to IPPORT_RESERVEDMAX. + */ + +#define IPPORT_RESERVED 1024 +#define IPPORT_ANONMIN 49152 +#define IPPORT_ANONMAX 65535 +#define IPPORT_RESERVEDMIN 600 +#define IPPORT_RESERVEDMAX (IPPORT_RESERVED-1) + +/* + * Internet address (a structure for historical reasons) + */ +struct in_addr { + in_addr_t s_addr; +} __attribute__((__packed__)); + +/* + * Definitions of bits in internet address integers. + * On subnets, the decomposition of addresses to host and net parts + * is done according to subnet mask, not the masks here. + * + * By byte-swapping the constants, we avoid ever having to byte-swap IP + * addresses inside the kernel. Unfortunately, user-level programs rely + * on these macros not doing byte-swapping. + */ +#ifdef _KERNEL +#define __IPADDR(x) ((uint32_t) htonl((uint32_t)(x))) +#else +#define __IPADDR(x) ((uint32_t)(x)) +#endif + +#define IN_CLASSA(i) (((uint32_t)(i) & __IPADDR(0x80000000)) == \ + __IPADDR(0x00000000)) +#define IN_CLASSA_NET __IPADDR(0xff000000) +#define IN_CLASSA_NSHIFT 24 +#define IN_CLASSA_HOST __IPADDR(0x00ffffff) +#define IN_CLASSA_MAX 128 + +#define IN_CLASSB(i) (((uint32_t)(i) & __IPADDR(0xc0000000)) == \ + __IPADDR(0x80000000)) +#define IN_CLASSB_NET __IPADDR(0xffff0000) +#define IN_CLASSB_NSHIFT 16 +#define IN_CLASSB_HOST __IPADDR(0x0000ffff) +#define IN_CLASSB_MAX 65536 + +#define IN_CLASSC(i) (((uint32_t)(i) & __IPADDR(0xe0000000)) == \ + __IPADDR(0xc0000000)) +#define IN_CLASSC_NET __IPADDR(0xffffff00) +#define IN_CLASSC_NSHIFT 8 +#define IN_CLASSC_HOST __IPADDR(0x000000ff) + +#define IN_CLASSD(i) (((uint32_t)(i) & __IPADDR(0xf0000000)) == \ + __IPADDR(0xe0000000)) +/* These ones aren't really net and host fields, but routing needn't know. */ +#define IN_CLASSD_NET __IPADDR(0xf0000000) +#define IN_CLASSD_NSHIFT 28 +#define IN_CLASSD_HOST __IPADDR(0x0fffffff) +#define IN_MULTICAST(i) IN_CLASSD(i) + +#define IN_EXPERIMENTAL(i) (((uint32_t)(i) & __IPADDR(0xf0000000)) == \ + __IPADDR(0xf0000000)) +#define IN_BADCLASS(i) (((uint32_t)(i) & __IPADDR(0xf0000000)) == \ + __IPADDR(0xf0000000)) + +#define IN_LINKLOCAL(i) (((uint32_t)(i) & __IPADDR(0xffff0000)) == \ + __IPADDR(0xa9fe0000)) + +#define IN_PRIVATE(i) ((((uint32_t)(i) & __IPADDR(0xff000000)) == \ + __IPADDR(0x0a000000)) || \ + (((uint32_t)(i) & __IPADDR(0xfff00000)) == \ + __IPADDR(0xac100000)) || \ + (((uint32_t)(i) & __IPADDR(0xffff0000)) == \ + __IPADDR(0xc0a80000))) + +#define IN_LOCAL_GROUP(i) (((uint32_t)(i) & __IPADDR(0xffffff00)) == \ + __IPADDR(0xe0000000)) + +#define IN_ANY_LOCAL(i) (IN_LINKLOCAL(i) || IN_LOCAL_GROUP(i)) + +#define INADDR_ANY __IPADDR(0x00000000) +#define INADDR_LOOPBACK __IPADDR(0x7f000001) +#define INADDR_BROADCAST __IPADDR(0xffffffff) /* must be masked */ +#define INADDR_NONE __IPADDR(0xffffffff) /* -1 return */ + +#define INADDR_UNSPEC_GROUP __IPADDR(0xe0000000) /* 224.0.0.0 */ +#define INADDR_ALLHOSTS_GROUP __IPADDR(0xe0000001) /* 224.0.0.1 */ +#define INADDR_ALLRTRS_GROUP __IPADDR(0xe0000002) /* 224.0.0.2 */ +#define INADDR_CARP_GROUP __IPADDR(0xe0000012) /* 224.0.0.18 */ +#define INADDR_MAX_LOCAL_GROUP __IPADDR(0xe00000ff) /* 224.0.0.255 */ + +#define IN_LOOPBACKNET 127 /* official! */ + +/* + * Socket address, internet style. + */ +struct sockaddr_in { + uint8_t sin_len; + sa_family_t sin_family; + in_port_t sin_port; + struct in_addr sin_addr; + __int8_t sin_zero[8]; +}; + +#define INET_ADDRSTRLEN 16 + +/* + * Structure used to describe IP options. + * Used to store options internally, to pass them to a process, + * or to restore options retrieved earlier. + * The ip_dst is used for the first-hop gateway when using a source route + * (this gets put into the header proper). + */ +struct ip_opts { + struct in_addr ip_dst; /* first hop, 0 w/o src rt */ +#if defined(__cplusplus) + __int8_t Ip_opts[40]; /* actually variable in size */ +#else + __int8_t ip_opts[40]; /* actually variable in size */ +#endif +}; + +/* + * Options for use with [gs]etsockopt at the IP level. + * First word of comment is data type; bool is stored in int. + */ +#define IP_OPTIONS 1 /* buf/ip_opts; set/get IP options */ +#define IP_HDRINCL 2 /* int; header is included with data */ +#define IP_TOS 3 /* int; IP type of service and preced. */ +#define IP_TTL 4 /* int; IP time to live */ +#define IP_RECVOPTS 5 /* bool; receive all IP opts w/dgram */ +#define IP_RECVRETOPTS 6 /* bool; receive IP opts for response */ +#define IP_RECVDSTADDR 7 /* bool; receive IP dst addr w/dgram */ +#define IP_RETOPTS 8 /* ip_opts; set/get IP options */ +#define IP_MULTICAST_IF 9 /* in_addr; set/get IP multicast i/f */ +#define IP_MULTICAST_TTL 10 /* u_char; set/get IP multicast ttl */ +#define IP_MULTICAST_LOOP 11 /* u_char; set/get IP multicast loopback */ +#define IP_ADD_MEMBERSHIP 12 /* ip_mreq; add an IP group membership */ +#define IP_DROP_MEMBERSHIP 13 /* ip_mreq; drop an IP group membership */ +#define IP_PORTRANGE 19 /* int; range to use for ephemeral port */ +#define IP_RECVIF 20 /* bool; receive reception if w/dgram */ +#define IP_ERRORMTU 21 /* int; get MTU of last xmit = EMSGSIZE */ +#if 1 /*IPSEC*/ +#define IP_IPSEC_POLICY 22 /* struct; get/set security policy */ +#endif + +/* + * Defaults and limits for options + */ +#define IP_DEFAULT_MULTICAST_TTL 1 /* normally limit m'casts to 1 hop */ +#define IP_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */ +#define IP_MAX_MEMBERSHIPS 20 /* per socket; must fit in one mbuf */ + +/* + * Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP. + */ +struct ip_mreq { + struct in_addr imr_multiaddr; /* IP multicast address of group */ + struct in_addr imr_interface; /* local IP address of interface */ +}; + +/* + * Argument for IP_PORTRANGE: + * - which range to search when port is unspecified at bind() or connect() + */ +#define IP_PORTRANGE_DEFAULT 0 /* default range */ +#define IP_PORTRANGE_HIGH 1 /* same as DEFAULT (FreeBSD compat) */ +#define IP_PORTRANGE_LOW 2 /* use privileged range */ + +#if defined(_NETBSD_SOURCE) +/* + * Definitions for inet sysctl operations. + * + * Third level is protocol number. + * Fourth level is desired variable within that protocol. + */ +#define IPPROTO_MAXID (IPPROTO_AH + 1) /* don't list to IPPROTO_MAX */ + +#define CTL_IPPROTO_NAMES { \ + { "ip", CTLTYPE_NODE }, \ + { "icmp", CTLTYPE_NODE }, \ + { "igmp", CTLTYPE_NODE }, \ + { "ggp", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "tcp", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { "egp", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "pup", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "udp", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "idp", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "ipsec", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "pim", CTLTYPE_NODE }, \ +} + +/* + * Names for IP sysctl objects + */ +#define IPCTL_FORWARDING 1 /* act as router */ +#define IPCTL_SENDREDIRECTS 2 /* may send redirects when forwarding */ +#define IPCTL_DEFTTL 3 /* default TTL */ +#ifdef notyet +#define IPCTL_DEFMTU 4 /* default MTU */ +#endif +#define IPCTL_FORWSRCRT 5 /* forward source-routed packets */ +#define IPCTL_DIRECTEDBCAST 6 /* default broadcast behavior */ +#define IPCTL_ALLOWSRCRT 7 /* allow/drop all source-routed pkts */ +#define IPCTL_SUBNETSARELOCAL 8 /* treat subnets as local addresses */ +#define IPCTL_MTUDISC 9 /* allow path MTU discovery */ +#define IPCTL_ANONPORTMIN 10 /* minimum ephemeral port */ +#define IPCTL_ANONPORTMAX 11 /* maximum ephemeral port */ +#define IPCTL_MTUDISCTIMEOUT 12 /* allow path MTU discovery */ +#define IPCTL_MAXFLOWS 13 /* maximum ip flows allowed */ +#define IPCTL_HOSTZEROBROADCAST 14 /* is host zero a broadcast addr? */ +#define IPCTL_GIF_TTL 15 /* default TTL for gif encap packet */ +#define IPCTL_LOWPORTMIN 16 /* minimum reserved port */ +#define IPCTL_LOWPORTMAX 17 /* maximum reserved port */ +#define IPCTL_MAXFRAGPACKETS 18 /* max packets reassembly queue */ +#define IPCTL_GRE_TTL 19 /* default TTL for gre encap packet */ +#define IPCTL_CHECKINTERFACE 20 /* drop pkts in from 'wrong' iface */ +#define IPCTL_IFQ 21 /* ipintrq node */ +#define IPCTL_RANDOMID 22 /* use random IP ids (if configured) */ +#define IPCTL_LOOPBACKCKSUM 23 /* do IP checksum on loopback */ +#define IPCTL_STATS 24 /* IP statistics */ +#define IPCTL_MAXID 25 + +#define IPCTL_NAMES { \ + { 0, 0 }, \ + { "forwarding", CTLTYPE_INT }, \ + { "redirect", CTLTYPE_INT }, \ + { "ttl", CTLTYPE_INT }, \ + { "mtu", CTLTYPE_INT }, \ + { "forwsrcrt", CTLTYPE_INT }, \ + { "directed-broadcast", CTLTYPE_INT }, \ + { "allowsrcrt", CTLTYPE_INT }, \ + { "subnetsarelocal", CTLTYPE_INT }, \ + { "mtudisc", CTLTYPE_INT }, \ + { "anonportmin", CTLTYPE_INT }, \ + { "anonportmax", CTLTYPE_INT }, \ + { "mtudisctimeout", CTLTYPE_INT }, \ + { "maxflows", CTLTYPE_INT }, \ + { "hostzerobroadcast", CTLTYPE_INT }, \ + { "gifttl", CTLTYPE_INT }, \ + { "lowportmin", CTLTYPE_INT }, \ + { "lowportmax", CTLTYPE_INT }, \ + { "maxfragpackets", CTLTYPE_INT }, \ + { "grettl", CTLTYPE_INT }, \ + { "checkinterface", CTLTYPE_INT }, \ + { "ifq", CTLTYPE_NODE }, \ + { "random_id", CTLTYPE_INT }, \ + { "do_loopback_cksum", CTLTYPE_INT }, \ + { "stats", CTLTYPE_STRUCT }, \ +} +#endif /* _NETBSD_SOURCE */ + +/* INET6 stuff */ +#define __KAME_NETINET_IN_H_INCLUDED_ +#include +#undef __KAME_NETINET_IN_H_INCLUDED_ + +#ifdef _KERNEL +/* + * in_cksum_phdr: + * + * Compute significant parts of the IPv4 checksum pseudo-header + * for use in a delayed TCP/UDP checksum calculation. + * + * Args: + * + * src Source IP address + * dst Destination IP address + * lenproto htons(proto-hdr-len + proto-number) + */ +static __inline u_int16_t __attribute__((__unused__)) +in_cksum_phdr(u_int32_t src, u_int32_t dst, u_int32_t lenproto) +{ + u_int32_t sum; + + sum = lenproto + + (u_int16_t)(src >> 16) + + (u_int16_t)(src /*& 0xffff*/) + + (u_int16_t)(dst >> 16) + + (u_int16_t)(dst /*& 0xffff*/); + + sum = (u_int16_t)(sum >> 16) + (u_int16_t)(sum /*& 0xffff*/); + + if (sum > 0xffff) + sum -= 0xffff; + + return (sum); +} + +/* + * in_cksum_addword: + * + * Add the two 16-bit network-order values, carry, and return. + */ +static __inline u_int16_t __attribute__((__unused__)) +in_cksum_addword(u_int16_t a, u_int16_t b) +{ + u_int32_t sum = a + b; + + if (sum > 0xffff) + sum -= 0xffff; + + return (sum); +} + +extern struct in_addr zeroin_addr; +extern u_char ip_protox[]; + +int in_broadcast(struct in_addr, struct ifnet *); +int in_canforward(struct in_addr); +int in_cksum(struct mbuf *, int); +int in4_cksum(struct mbuf *, u_int8_t, int, int); +void in_delayed_cksum(struct mbuf *); +int in_localaddr(struct in_addr); +void in_socktrim(struct sockaddr_in *); + +#define in_hosteq(s,t) ((s).s_addr == (t).s_addr) +#define in_nullhost(x) ((x).s_addr == INADDR_ANY) + +#define satosin(sa) ((struct sockaddr_in *)(sa)) +#define sintosa(sin) ((struct sockaddr *)(sin)) +#define ifatoia(ifa) ((struct in_ifaddr *)(ifa)) +#endif /* _KERNEL */ + +#endif /* !_NETINET_IN_H_ */ diff --git a/StdLib/Include/netinet6/in6.h b/StdLib/Include/netinet6/in6.h new file mode 100644 index 0000000000..7e81bb7084 --- /dev/null +++ b/StdLib/Include/netinet6/in6.h @@ -0,0 +1,790 @@ +/* $NetBSD: in6.h,v 1.57 2006/10/31 00:29:30 cbiere Exp $ */ +/* $KAME: in6.h,v 1.83 2001/03/29 02:55:07 jinmei Exp $ */ + +/* + Copyright (c) 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +*/ + +/* + * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Copyright (c) 1982, 1986, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in.h 8.3 (Berkeley) 1/3/94 + */ + +#ifndef _NETINET6_IN6_H_ +#define _NETINET6_IN6_H_ + +#ifndef __KAME_NETINET_IN_H_INCLUDED_ +#error "do not include netinet6/in6.h directly, include netinet/in.h. see RFC2553" +#endif + +#include + +/* + * Identification of the network protocol stack + * for *BSD-current/release: http://www.kame.net/dev/cvsweb.cgi/kame/COVERAGE + * has the table of implementation/integration differences. + */ +#define __KAME__ +#define __KAME_VERSION "NetBSD-current" + +/* + * Local port number conventions: + * + * Ports < IPPORT_RESERVED are reserved for privileged processes (e.g. root), + * unless a kernel is compiled with IPNOPRIVPORTS defined. + * + * When a user does a bind(2) or connect(2) with a port number of zero, + * a non-conflicting local port address is chosen. + * + * The default range is IPPORT_ANONMIN to IPPORT_ANONMAX, although + * that is settable by sysctl(3); net.inet.ip.anonportmin and + * net.inet.ip.anonportmax respectively. + * + * A user may set the IPPROTO_IP option IP_PORTRANGE to change this + * default assignment range. + * + * The value IP_PORTRANGE_DEFAULT causes the default behavior. + * + * The value IP_PORTRANGE_HIGH is the same as IP_PORTRANGE_DEFAULT, + * and exists only for FreeBSD compatibility purposes. + * + * The value IP_PORTRANGE_LOW changes the range to the "low" are + * that is (by convention) restricted to privileged processes. + * This convention is based on "vouchsafe" principles only. + * It is only secure if you trust the remote host to restrict these ports. + * The range is IPPORT_RESERVEDMIN to IPPORT_RESERVEDMAX. + */ + +#if defined(_NETBSD_SOURCE) +#define IPV6PORT_RESERVED 1024 +#define IPV6PORT_ANONMIN 49152 +#define IPV6PORT_ANONMAX 65535 +#define IPV6PORT_RESERVEDMIN 600 +#define IPV6PORT_RESERVEDMAX (IPV6PORT_RESERVED-1) +#endif + +/* + * IPv6 address + */ +struct in6_addr { + union { + __uint8_t __u6_addr8[16]; + __uint16_t __u6_addr16[8]; + uint32_t __u6_addr32[4]; + } __u6_addr; /* 128-bit IP6 address */ +}; + +#define s6_addr __u6_addr.__u6_addr8 +#ifdef _KERNEL /* XXX nonstandard */ +#define s6_addr8 __u6_addr.__u6_addr8 +#define s6_addr16 __u6_addr.__u6_addr16 +#define s6_addr32 __u6_addr.__u6_addr32 +#endif + +#define INET6_ADDRSTRLEN 46 + +/* + * Socket address for IPv6 + */ +#if defined(_NETBSD_SOURCE) +#define SIN6_LEN +#endif +struct sockaddr_in6 { + uint8_t sin6_len; /* length of this struct(socklen_t)*/ + sa_family_t sin6_family; /* AF_INET6 (sa_family_t) */ + in_port_t sin6_port; /* Transport layer port */ + uint32_t sin6_flowinfo; /* IP6 flow information */ + struct in6_addr sin6_addr; /* IP6 address */ + uint32_t sin6_scope_id; /* scope zone index */ +}; + +/* + * Local definition for masks + */ +#ifdef _KERNEL /* XXX nonstandard */ +#define IN6MASK0 {{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }}} +#define IN6MASK32 {{{ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} +#define IN6MASK64 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} +#define IN6MASK96 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }}} +#define IN6MASK128 {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }}} +#endif + +#ifdef _KERNEL +extern const struct sockaddr_in6 sa6_any; + +extern const struct in6_addr in6mask0; +extern const struct in6_addr in6mask32; +extern const struct in6_addr in6mask64; +extern const struct in6_addr in6mask96; +extern const struct in6_addr in6mask128; +#endif /* _KERNEL */ + +/* + * Macros started with IPV6_ADDR is KAME local + */ +#ifdef _KERNEL /* XXX nonstandard */ +#if BYTE_ORDER == BIG_ENDIAN +#define IPV6_ADDR_INT32_ONE 1 +#define IPV6_ADDR_INT32_TWO 2 +#define IPV6_ADDR_INT32_MNL 0xff010000 +#define IPV6_ADDR_INT32_MLL 0xff020000 +#define IPV6_ADDR_INT32_SMP 0x0000ffff +#define IPV6_ADDR_INT16_ULL 0xfe80 +#define IPV6_ADDR_INT16_USL 0xfec0 +#define IPV6_ADDR_INT16_MLL 0xff02 +#elif BYTE_ORDER == LITTLE_ENDIAN +#define IPV6_ADDR_INT32_ONE 0x01000000 +#define IPV6_ADDR_INT32_TWO 0x02000000 +#define IPV6_ADDR_INT32_MNL 0x000001ff +#define IPV6_ADDR_INT32_MLL 0x000002ff +#define IPV6_ADDR_INT32_SMP 0xffff0000 +#define IPV6_ADDR_INT16_ULL 0x80fe +#define IPV6_ADDR_INT16_USL 0xc0fe +#define IPV6_ADDR_INT16_MLL 0x02ff +#endif +#endif + +/* + * Definition of some useful macros to handle IP6 addresses + */ +#define IN6ADDR_ANY_INIT \ + {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }}} +#define IN6ADDR_LOOPBACK_INIT \ + {{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} +#define IN6ADDR_NODELOCAL_ALLNODES_INIT \ + {{{ 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} +#define IN6ADDR_LINKLOCAL_ALLNODES_INIT \ + {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }}} +#define IN6ADDR_LINKLOCAL_ALLROUTERS_INIT \ + {{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }}} + +extern const struct in6_addr in6addr_any; +extern const struct in6_addr in6addr_loopback; +extern const struct in6_addr in6addr_nodelocal_allnodes; +extern const struct in6_addr in6addr_linklocal_allnodes; +extern const struct in6_addr in6addr_linklocal_allrouters; + +/* + * Equality + * NOTE: Some of kernel programming environment (for example, openbsd/sparc) + * does not supply memcmp(). For userland memcmp() is preferred as it is + * in ANSI standard. + */ +#ifdef _KERNEL +#define IN6_ARE_ADDR_EQUAL(a, b) \ + (bcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0) +#else +#define IN6_ARE_ADDR_EQUAL(a, b) \ + (memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0) +#endif + +/* + * Unspecified + */ +#define IN6_IS_ADDR_UNSPECIFIED(a) \ + ((*(const uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ + (*(const uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ + (*(const uint32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \ + (*(const uint32_t *)(const void *)(&(a)->s6_addr[12]) == 0)) + +/* + * Loopback + */ +#define IN6_IS_ADDR_LOOPBACK(a) \ + ((*(const uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ + (*(const uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ + (*(const uint32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \ + (*(const uint32_t *)(const void *)(&(a)->s6_addr[12]) == ntohl(1))) + +/* + * IPv4 compatible + */ +#define IN6_IS_ADDR_V4COMPAT(a) \ + ((*(const uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ + (*(const uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ + (*(const uint32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \ + (*(const uint32_t *)(const void *)(&(a)->s6_addr[12]) != 0) && \ + (*(const uint32_t *)(const void *)(&(a)->s6_addr[12]) != ntohl(1))) + +/* + * Mapped + */ +#define IN6_IS_ADDR_V4MAPPED(a) \ + ((*(const uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \ + (*(const uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \ + (*(const uint32_t *)(const void *)(&(a)->s6_addr[8]) == ntohl(0x0000ffff))) + +/* + * KAME Scope Values + */ + +#ifdef _KERNEL /* XXX nonstandard */ +#define IPV6_ADDR_SCOPE_NODELOCAL 0x01 +#define IPV6_ADDR_SCOPE_INTFACELOCAL 0x01 +#define IPV6_ADDR_SCOPE_LINKLOCAL 0x02 +#define IPV6_ADDR_SCOPE_SITELOCAL 0x05 +#define IPV6_ADDR_SCOPE_ORGLOCAL 0x08 /* just used in this file */ +#define IPV6_ADDR_SCOPE_GLOBAL 0x0e +#else +#define __IPV6_ADDR_SCOPE_NODELOCAL 0x01 +#define __IPV6_ADDR_SCOPE_LINKLOCAL 0x02 +#define __IPV6_ADDR_SCOPE_SITELOCAL 0x05 +#define __IPV6_ADDR_SCOPE_ORGLOCAL 0x08 /* just used in this file */ +#define __IPV6_ADDR_SCOPE_GLOBAL 0x0e +#endif + +/* + * Unicast Scope + * Note that we must check topmost 10 bits only, not 16 bits (see RFC2373). + */ +#define IN6_IS_ADDR_LINKLOCAL(a) \ + (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80)) +#define IN6_IS_ADDR_SITELOCAL(a) \ + (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0)) + +/* + * Multicast + */ +#define IN6_IS_ADDR_MULTICAST(a) ((a)->s6_addr[0] == 0xff) + +#ifdef _KERNEL /* XXX nonstandard */ +#define IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f) +#else +#define __IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f) +#endif + +/* + * Multicast Scope + */ +#ifdef _KERNEL /* refers nonstandard items */ +#define IN6_IS_ADDR_MC_NODELOCAL(a) \ + (IN6_IS_ADDR_MULTICAST(a) && \ + (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_NODELOCAL)) +#define IN6_IS_ADDR_MC_INTFACELOCAL(a) \ + (IN6_IS_ADDR_MULTICAST(a) && \ + (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_INTFACELOCAL)) +#define IN6_IS_ADDR_MC_LINKLOCAL(a) \ + (IN6_IS_ADDR_MULTICAST(a) && \ + (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_LINKLOCAL)) +#define IN6_IS_ADDR_MC_SITELOCAL(a) \ + (IN6_IS_ADDR_MULTICAST(a) && \ + (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_SITELOCAL)) +#define IN6_IS_ADDR_MC_ORGLOCAL(a) \ + (IN6_IS_ADDR_MULTICAST(a) && \ + (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_ORGLOCAL)) +#define IN6_IS_ADDR_MC_GLOBAL(a) \ + (IN6_IS_ADDR_MULTICAST(a) && \ + (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_GLOBAL)) +#else +#define IN6_IS_ADDR_MC_NODELOCAL(a) \ + (IN6_IS_ADDR_MULTICAST(a) && \ + (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_NODELOCAL)) +#define IN6_IS_ADDR_MC_LINKLOCAL(a) \ + (IN6_IS_ADDR_MULTICAST(a) && \ + (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_LINKLOCAL)) +#define IN6_IS_ADDR_MC_SITELOCAL(a) \ + (IN6_IS_ADDR_MULTICAST(a) && \ + (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL)) +#define IN6_IS_ADDR_MC_ORGLOCAL(a) \ + (IN6_IS_ADDR_MULTICAST(a) && \ + (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL)) +#define IN6_IS_ADDR_MC_GLOBAL(a) \ + (IN6_IS_ADDR_MULTICAST(a) && \ + (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_GLOBAL)) +#endif + +#ifdef _KERNEL /* nonstandard */ +/* + * KAME Scope + */ +#define IN6_IS_SCOPE_LINKLOCAL(a) \ + ((IN6_IS_ADDR_LINKLOCAL(a)) || \ + (IN6_IS_ADDR_MC_LINKLOCAL(a))) + +#define IN6_IS_SCOPE_EMBEDDABLE(__a) \ + (IN6_IS_SCOPE_LINKLOCAL(__a) || IN6_IS_ADDR_MC_INTFACELOCAL(__a)) + +#define IFA6_IS_DEPRECATED(a) \ + ((a)->ia6_lifetime.ia6t_pltime != ND6_INFINITE_LIFETIME && \ + (u_int32_t)((time_second - (a)->ia6_updatetime)) > \ + (a)->ia6_lifetime.ia6t_pltime) +#define IFA6_IS_INVALID(a) \ + ((a)->ia6_lifetime.ia6t_vltime != ND6_INFINITE_LIFETIME && \ + (u_int32_t)((time_second - (a)->ia6_updatetime)) > \ + (a)->ia6_lifetime.ia6t_vltime) +#endif + +/* + * IP6 route structure + */ +#if defined(_NETBSD_SOURCE) +struct route_in6 { + struct rtentry *ro_rt; + struct sockaddr_in6 ro_dst; +}; +#endif + +/* + * Options for use with [gs]etsockopt at the IPV6 level. + * First word of comment is data type; bool is stored in int. + */ +/* no hdrincl */ +#if 0 +/* These are deprecated non-standard options which are no longer supported. */ +#define IPV6_OPTIONS 1 /* buf/ip6_opts; set/get IP6 options */ +#define IPV6_RECVOPTS 5 /* bool; receive all IP6 opts w/dgram */ +#define IPV6_RECVRETOPTS 6 /* bool; receive IP6 opts for response */ +#define IPV6_RECVDSTADDR 7 /* bool; receive IP6 dst addr w/dgram */ +#define IPV6_RETOPTS 8 /* ip6_opts; set/get IP6 options */ +#endif +#define IPV6_SOCKOPT_RESERVED1 3 /* reserved for future use */ +#define IPV6_UNICAST_HOPS 4 /* int; IP6 hops */ +#define IPV6_MULTICAST_IF 9 /* u_int; set/get IP6 multicast i/f */ +#define IPV6_MULTICAST_HOPS 10 /* int; set/get IP6 multicast hops */ +#define IPV6_MULTICAST_LOOP 11 /* u_int; set/get IP6 multicast loopback */ +#define IPV6_JOIN_GROUP 12 /* ip6_mreq; join a group membership */ +#define IPV6_LEAVE_GROUP 13 /* ip6_mreq; leave a group membership */ +#define IPV6_PORTRANGE 14 /* int; range to choose for unspec port */ +#if defined(_NETBSD_SOURCE) +#define ICMP6_FILTER 18 /* icmp6_filter; icmp6 filter */ +#endif +/* RFC2292 options */ +#ifdef _KERNEL +#define IPV6_2292PKTINFO 19 /* bool; send/recv if, src/dst addr */ +#define IPV6_2292HOPLIMIT 20 /* bool; hop limit */ +#define IPV6_2292NEXTHOP 21 /* bool; next hop addr */ +#define IPV6_2292HOPOPTS 22 /* bool; hop-by-hop option */ +#define IPV6_2292DSTOPTS 23 /* bool; destinaion option */ +#define IPV6_2292RTHDR 24 /* bool; routing header */ +#define IPV6_2292PKTOPTIONS 25 /* buf/cmsghdr; set/get IPv6 options */ +#endif +#define IPV6_CHECKSUM 26 /* int; checksum offset for raw socket */ +#define IPV6_V6ONLY 27 /* bool; make AF_INET6 sockets v6 only */ + +#if 1 /* IPSEC */ +#define IPV6_IPSEC_POLICY 28 /* struct; get/set security policy */ +#endif +#define IPV6_FAITH 29 /* bool; accept FAITH'ed connections */ + +/* new socket options introduced in RFC3542 */ +#define IPV6_RTHDRDSTOPTS 35 /* ip6_dest; send dst option before rthdr */ + +#define IPV6_RECVPKTINFO 36 /* bool; recv if, dst addr */ +#define IPV6_RECVHOPLIMIT 37 /* bool; recv hop limit */ +#define IPV6_RECVRTHDR 38 /* bool; recv routing header */ +#define IPV6_RECVHOPOPTS 39 /* bool; recv hop-by-hop option */ +#define IPV6_RECVDSTOPTS 40 /* bool; recv dst option after rthdr */ +#ifdef _KERNEL +#define IPV6_RECVRTHDRDSTOPTS 41 /* bool; recv dst option before rthdr */ +#endif +#define IPV6_USE_MIN_MTU 42 /* bool; send packets at the minimum MTU */ +#define IPV6_RECVPATHMTU 43 /* bool; notify an according MTU */ +#define IPV6_PATHMTU 44 /* mtuinfo; get the current path MTU (sopt), + 4 bytes int; MTU notification (cmsg) */ + +/* more new socket options introduced in RFC3542 */ +#define IPV6_PKTINFO 46 /* in6_pktinfo; send if, src addr */ +#define IPV6_HOPLIMIT 47 /* int; send hop limit */ +#define IPV6_NEXTHOP 48 /* sockaddr; next hop addr */ +#define IPV6_HOPOPTS 49 /* ip6_hbh; send hop-by-hop option */ +#define IPV6_DSTOPTS 50 /* ip6_dest; send dst option befor rthdr */ +#define IPV6_RTHDR 51 /* ip6_rthdr; send routing header */ + +#define IPV6_RECVTCLASS 57 /* bool; recv traffic class values */ +#ifdef _KERNEL +#define IPV6_OTCLASS 58 /* u_int8_t; send traffic class value */ +#endif + +#define IPV6_TCLASS 61 /* int; send traffic class value */ +#define IPV6_DONTFRAG 62 /* bool; disable IPv6 fragmentation */ +/* to define items, should talk with KAME guys first, for *BSD compatibility */ + +#define IPV6_RTHDR_LOOSE 0 /* this hop need not be a neighbor. XXX old spec */ +#define IPV6_RTHDR_STRICT 1 /* this hop must be a neighbor. XXX old spec */ +#define IPV6_RTHDR_TYPE_0 0 /* IPv6 routing header type 0 */ + +/* + * Defaults and limits for options + */ +#define IPV6_DEFAULT_MULTICAST_HOPS 1 /* normally limit m'casts to 1 hop */ +#define IPV6_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */ + +/* + * Argument structure for IPV6_JOIN_GROUP and IPV6_LEAVE_GROUP. + */ +struct ipv6_mreq { + struct in6_addr ipv6mr_multiaddr; + unsigned int ipv6mr_interface; +}; + +/* + * IPV6_PKTINFO: Packet information(RFC2292 sec 5) + */ +struct in6_pktinfo { + struct in6_addr ipi6_addr; /* src/dst IPv6 address */ + unsigned int ipi6_ifindex; /* send/recv interface index */ +}; + +/* + * Control structure for IPV6_RECVPATHMTU socket option. + */ +struct ip6_mtuinfo { + struct sockaddr_in6 ip6m_addr; /* or sockaddr_storage? */ + uint32_t ip6m_mtu; +}; + +/* + * Argument for IPV6_PORTRANGE: + * - which range to search when port is unspecified at bind() or connect() + */ +#define IPV6_PORTRANGE_DEFAULT 0 /* default range */ +#define IPV6_PORTRANGE_HIGH 1 /* "high" - request firewall bypass */ +#define IPV6_PORTRANGE_LOW 2 /* "low" - vouchsafe security */ + +#if defined(_NETBSD_SOURCE) +/* + * Definitions for inet6 sysctl operations. + * + * Third level is protocol number. + * Fourth level is desired variable within that protocol. + */ +#define IPV6PROTO_MAXID (IPPROTO_PIM + 1) /* don't list to IPV6PROTO_MAX */ + +#define CTL_IPV6PROTO_NAMES { \ + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ + { 0, 0 }, \ + { "tcp6", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "udp6", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ + { 0, 0 }, \ + { "ip6", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ + { 0, 0 }, \ + { "ipsec6", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "icmp6", CTLTYPE_NODE }, \ + { 0, 0 }, \ + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "pim6", CTLTYPE_NODE }, \ +} + +/* + * Names for IP sysctl objects + */ +#define IPV6CTL_FORWARDING 1 /* act as router */ +#define IPV6CTL_SENDREDIRECTS 2 /* may send redirects when forwarding*/ +#define IPV6CTL_DEFHLIM 3 /* default Hop-Limit */ +#ifdef notyet +#define IPV6CTL_DEFMTU 4 /* default MTU */ +#endif +#define IPV6CTL_FORWSRCRT 5 /* forward source-routed dgrams */ +#define IPV6CTL_STATS 6 /* stats */ +#define IPV6CTL_MRTSTATS 7 /* multicast forwarding stats */ +#define IPV6CTL_MRTPROTO 8 /* multicast routing protocol */ +#define IPV6CTL_MAXFRAGPACKETS 9 /* max packets reassembly queue */ +#define IPV6CTL_SOURCECHECK 10 /* verify source route and intf */ +#define IPV6CTL_SOURCECHECK_LOGINT 11 /* minimume logging interval */ +#define IPV6CTL_ACCEPT_RTADV 12 +#define IPV6CTL_KEEPFAITH 13 +#define IPV6CTL_LOG_INTERVAL 14 +#define IPV6CTL_HDRNESTLIMIT 15 +#define IPV6CTL_DAD_COUNT 16 +#define IPV6CTL_AUTO_FLOWLABEL 17 +#define IPV6CTL_DEFMCASTHLIM 18 +#define IPV6CTL_GIF_HLIM 19 /* default HLIM for gif encap packet */ +#define IPV6CTL_KAME_VERSION 20 +#define IPV6CTL_USE_DEPRECATED 21 /* use deprecated addr (RFC2462 5.5.4) */ +#define IPV6CTL_RR_PRUNE 22 /* walk timer for router renumbering */ +/* 23: reserved */ +#define IPV6CTL_V6ONLY 24 +/* 25 to 27: reserved */ +#define IPV6CTL_ANONPORTMIN 28 /* minimum ephemeral port */ +#define IPV6CTL_ANONPORTMAX 29 /* maximum ephemeral port */ +#define IPV6CTL_LOWPORTMIN 30 /* minimum reserved port */ +#define IPV6CTL_LOWPORTMAX 31 /* maximum reserved port */ +/* 32 to 38: reserved */ +#define IPV6CTL_USE_DEFAULTZONE 39 /* use default scope zone */ +/* 40: reserved */ +#define IPV6CTL_MAXFRAGS 41 /* max fragments */ +#define IPV6CTL_IFQ 42 /* ip6intrq node */ +/* New entries should be added here from current IPV6CTL_MAXID value. */ +/* to define items, should talk with KAME guys first, for *BSD compatibility */ +#define IPV6CTL_MAXID 43 + +#define IPV6CTL_NAMES { \ + { 0, 0 }, \ + { "forwarding", CTLTYPE_INT }, \ + { "redirect", CTLTYPE_INT }, \ + { "hlim", CTLTYPE_INT }, \ + { "mtu", CTLTYPE_INT }, \ + { "forwsrcrt", CTLTYPE_INT }, \ + { "stats", CTLTYPE_STRUCT }, \ + { 0, 0 }, \ + { "mrtproto", CTLTYPE_INT }, \ + { "maxfragpackets", CTLTYPE_INT }, \ + { "sourcecheck", CTLTYPE_INT }, \ + { "sourcecheck_logint", CTLTYPE_INT }, \ + { "accept_rtadv", CTLTYPE_INT }, \ + { "keepfaith", CTLTYPE_INT }, \ + { "log_interval", CTLTYPE_INT }, \ + { "hdrnestlimit", CTLTYPE_INT }, \ + { "dad_count", CTLTYPE_INT }, \ + { "auto_flowlabel", CTLTYPE_INT }, \ + { "defmcasthlim", CTLTYPE_INT }, \ + { "gifhlim", CTLTYPE_INT }, \ + { "kame_version", CTLTYPE_STRING }, \ + { "use_deprecated", CTLTYPE_INT }, \ + { "rr_prune", CTLTYPE_INT }, \ + { 0, 0 }, \ + { "v6only", CTLTYPE_INT }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "anonportmin", CTLTYPE_INT }, \ + { "anonportmax", CTLTYPE_INT }, \ + { "lowportmin", CTLTYPE_INT }, \ + { "lowportmax", CTLTYPE_INT }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { 0, 0 }, \ + { "maxfrags", CTLTYPE_INT }, \ + { "ifq", CTLTYPE_NODE }, \ +} + +#endif /* _NETBSD_SOURCE */ + +#ifdef _KERNEL +struct cmsghdr; + +/* + * in6_cksum_phdr: + * + * Compute significant parts of the IPv6 checksum pseudo-header + * for use in a delayed TCP/UDP checksum calculation. + * + * Args: + * + * src Source IPv6 address + * dst Destination IPv6 address + * len htonl(proto-hdr-len) + * nxt htonl(next-proto-number) + * + * NOTE: We expect the src and dst addresses to be 16-bit + * aligned! + */ +static __inline u_int16_t __attribute__((__unused__)) +in6_cksum_phdr(const struct in6_addr *src, const struct in6_addr *dst, + u_int32_t len, u_int32_t nxt) +{ + u_int32_t sum = 0; + const u_int16_t *w; + + /*LINTED*/ + w = (const u_int16_t *) src; + sum += w[0]; + if (!IN6_IS_SCOPE_LINKLOCAL(src)) + sum += w[1]; + sum += w[2]; sum += w[3]; sum += w[4]; sum += w[5]; + sum += w[6]; sum += w[7]; + + /*LINTED*/ + w = (const u_int16_t *) dst; + sum += w[0]; + if (!IN6_IS_SCOPE_LINKLOCAL(dst)) + sum += w[1]; + sum += w[2]; sum += w[3]; sum += w[4]; sum += w[5]; + sum += w[6]; sum += w[7]; + + sum += (u_int16_t)(len >> 16) + (u_int16_t)(len /*& 0xffff*/); + + sum += (u_int16_t)(nxt >> 16) + (u_int16_t)(nxt /*& 0xffff*/); + + sum = (u_int16_t)(sum >> 16) + (u_int16_t)(sum /*& 0xffff*/); + + if (sum > 0xffff) + sum -= 0xffff; + + return (sum); +} + +struct mbuf; +struct ifnet; +int in6_cksum __P((struct mbuf *, u_int8_t, u_int32_t, u_int32_t)); +void in6_delayed_cksum __P((struct mbuf *)); +int in6_localaddr __P((struct in6_addr *)); +int in6_addrscope __P((struct in6_addr *)); +struct in6_ifaddr *in6_ifawithifp __P((struct ifnet *, struct in6_addr *)); +extern void in6_if_up __P((struct ifnet *)); +#ifndef __FreeBSD__ +extern int in6_src_sysctl __P((void *, size_t *, void *, size_t)); +#endif +extern void addrsel_policy_init __P((void)); +extern u_char ip6_protox[]; + +#define satosin6(sa) ((struct sockaddr_in6 *)(sa)) +#define sin6tosa(sin6) ((struct sockaddr *)(sin6)) +#define ifatoia6(ifa) ((struct in6_ifaddr *)(ifa)) +#endif /* _KERNEL */ + +#if defined(_NETBSD_SOURCE) + +#include + +#ifdef _BSD_SIZE_T_ +typedef _BSD_SIZE_T_ size_t; +#define _SIZE_T +#undef _BSD_SIZE_T_ +#endif + +#include + +__BEGIN_DECLS +struct cmsghdr; + +extern int inet6_option_space (int); +extern int inet6_option_init (void *, struct cmsghdr **, int); +extern int inet6_option_append (struct cmsghdr *, const uint8_t *, + int, int); +extern uint8_t *inet6_option_alloc (struct cmsghdr *, int, int, int); +extern int inet6_option_next (const struct cmsghdr *, uint8_t **); +extern int inet6_option_find (const struct cmsghdr *, uint8_t **, int); + +extern size_t inet6_rthdr_space (int, int); +extern struct cmsghdr *inet6_rthdr_init (void *, int); +extern int inet6_rthdr_add (struct cmsghdr *, const struct in6_addr *, + unsigned int); +extern int inet6_rthdr_lasthop (struct cmsghdr *, unsigned int); +#if 0 /* not implemented yet */ +extern int inet6_rthdr_reverse (const struct cmsghdr *, struct cmsghdr *); +#endif +extern int inet6_rthdr_segments (const struct cmsghdr *); +extern struct in6_addr *inet6_rthdr_getaddr (struct cmsghdr *, int); +extern int inet6_rthdr_getflags (const struct cmsghdr *, int); + +extern int inet6_opt_init (void *, socklen_t); +extern int inet6_opt_append (void *, socklen_t, int, uint8_t, + socklen_t, uint8_t, void **); +extern int inet6_opt_finish (void *, socklen_t, int); +extern int inet6_opt_set_val (void *, int, void *, socklen_t); + +extern int inet6_opt_next (void *, socklen_t, int, uint8_t *, + socklen_t *, void **); +extern int inet6_opt_find (void *, socklen_t, int, uint8_t, + socklen_t *, void **); +extern int inet6_opt_get_val (void *, int, void *, socklen_t); +extern socklen_t inet6_rth_space (int, int); +extern void *inet6_rth_init (void *, socklen_t, int, int); +extern int inet6_rth_add (void *, const struct in6_addr *); +extern int inet6_rth_reverse (const void *, void *); +extern int inet6_rth_segments (const void *); +extern struct in6_addr *inet6_rth_getaddr (const void *, int); +__END_DECLS +#endif /* _NETBSD_SOURCE */ + +#endif /* !_NETINET6_IN6_H_ */ diff --git a/StdLib/Include/nl_types.h b/StdLib/Include/nl_types.h new file mode 100644 index 0000000000..f98111a242 --- /dev/null +++ b/StdLib/Include/nl_types.h @@ -0,0 +1,98 @@ +/* $NetBSD: nl_types.h,v 1.11 2005/02/03 04:39:32 perry Exp $ */ + +/*- + * Copyright (c) 1996 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by J.T. Conklin. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _NL_TYPES_H_ +#define _NL_TYPES_H_ +#include + +#ifdef _NLS_PRIVATE +/* + * MESSAGE CATALOG FILE FORMAT. + * + * The NetBSD message catalog format is similar to the format used by + * Svr4 systems. The differences are: + * * fixed byte order (big endian) + * * fixed data field sizes + * + * A message catalog contains four data types: a catalog header, one + * or more set headers, one or more message headers, and one or more + * text strings. + */ + +#define _NLS_MAGIC 0xff88ff89 + +struct _nls_cat_hdr { + int32_t __magic; + int32_t __nsets; + int32_t __mem; + int32_t __msg_hdr_offset; + int32_t __msg_txt_offset; +} ; + +struct _nls_set_hdr { + int32_t __setno; /* set number: 0 < x <= NL_SETMAX */ + int32_t __nmsgs; /* number of messages in the set */ + int32_t __index; /* index of first msg_hdr in msg_hdr table */ +} ; + +struct _nls_msg_hdr { + int32_t __msgno; /* msg number: 0 < x <= NL_MSGMAX */ + int32_t __msglen; + int32_t __offset; +} ; + +#endif + +#define NL_SETD 1 +#define NL_CAT_LOCALE 1 + +typedef struct __nl_cat_d { + void *__data; + int __size; +} *nl_catd; + +typedef LONG32 nl_item; + +__BEGIN_DECLS +nl_catd catopen(const char *, int); +char *catgets(nl_catd, int, int, const char *) + __attribute__((__format_arg__(4))); +int catclose(nl_catd); +__END_DECLS + +#endif /* _NL_TYPES_H_ */ diff --git a/StdLib/Include/paths.h b/StdLib/Include/paths.h new file mode 100644 index 0000000000..44c1dd1ece --- /dev/null +++ b/StdLib/Include/paths.h @@ -0,0 +1,118 @@ +/* $NetBSD: paths.h,v 1.30 2004/12/11 06:01:33 christos Exp $ */ + +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)paths.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _PATHS_H_ +#define _PATHS_H_ + +///* +// * Default user search path. +// * set by login(1), rshd(8), rexecd(8) +// * used by execvp(3) absent PATH from the environ(7) +// */ +//#ifdef RESCUEDIR +//#define _PATH_DEFPATH RESCUEDIR ":/usr/bin:/bin:/usr/pkg/bin:/usr/local/bin" +//#else +//#define _PATH_DEFPATH "/usr/bin:/bin:/usr/pkg/bin:/usr/local/bin" +//#endif + +///* +// * All standard utilities path. +// * set by init(8) for system programs & scripts (e.g. /etc/rc) +// * used by ttyaction(3), whereis(1) +// */ +//#define _PATH_STDPATH "/usr/bin:/bin:/usr/sbin:/sbin:/usr/pkg/bin:/usr/pkg/sbin:/usr/local/bin:/usr/local/sbin" + +//#define _PATH_AUDIO "/dev/audio" +//#define _PATH_AUDIO0 "/dev/audio0" +//#define _PATH_AUDIOCTL "/dev/audioctl" +//#define _PATH_AUDIOCTL0 "/dev/audioctl0" +//#define _PATH_BPF "/dev/bpf" +//#define _PATH_CLOCKCTL "/dev/clockctl" +#define _PATH_CONSOLE "console:" +#define _PATH_CONSTTY "constty:" +//#define _PATH_CSMAPPER "/usr/share/i18n/csmapper" +//#define _PATH_DEFTAPE "/dev/nrst0" +//#define _PATH_DEVDB "/var/run/dev.db" +#define _PATH_DEVNULL "null:" +//#define _PATH_DRUM "/dev/drum" +//#define _PATH_ESDB "/usr/share/i18n/esdb" +//#define _PATH_FTPUSERS "/etc/ftpusers" +//#define _PATH_I18NMODULE "/usr/lib/i18n" +//#define _PATH_ICONV "/usr/share/i18n/iconv" +//#define _PATH_KMEM "/dev/kmem" +//#define _PATH_KSYMS "/dev/ksyms" +//#define _PATH_KVMDB "/var/db/kvm.db" +#define _PATH_LOCALE "/Efi/Locale" +//#define _PATH_MAILDIR "/var/mail" +//#define _PATH_MAN "/usr/share/man" +//#define _PATH_MEM "/dev/mem" +//#define _PATH_MIXER "/dev/mixer" +//#define _PATH_MIXER0 "/dev/mixer0" +//#define _PATH_NOLOGIN "/etc/nologin" +//#define _PATH_RANDOM "/dev/random" +//#define _PATH_SENDMAIL "/usr/sbin/sendmail" +//#define _PATH_SHELLS "/etc/shells" +//#define _PATH_SKEYKEYS "/etc/skeykeys" +//#define _PATH_SOUND "/dev/sound" +//#define _PATH_SOUND0 "/dev/sound0" +//#define _PATH_SYSMON "/dev/sysmon" +#define _PATH_TTY "tty:" +//#define _PATH_UNIX "/netbsd" +//#define _PATH_URANDOM "/dev/urandom" +//#define _PATH_VI "/usr/bin/vi" +#define _PATH_STDIN "stdin:" +#define _PATH_STDOUT "stdout:" +#define _PATH_STDERR "stderr:" + +/* + * Provide trailing slash, since mostly used for building pathnames. + * see the __CONCAT() macro from for cpp examples. + */ +//#define _PATH_DEV "/dev/" +//#define _PATH_DEV_PTS "/dev/pts/" +//#define _PATH_EMUL_AOUT "/emul/aout/" +#define _PATH_TMP "/Efi/Temp/" +//#define _PATH_VARDB "/var/db/" +//#define _PATH_VARRUN "/var/run/" +//#define _PATH_VARTMP "/var/tmp/" + +//#ifdef RESCUEDIR +//#define _PATH_BSHELL RESCUEDIR "/sh" +//#define _PATH_CSHELL RESCUEDIR "/csh" +//#else +//#define _PATH_BSHELL "/bin/sh" +//#define _PATH_CSHELL "/bin/csh" +//#endif + +#endif /* !_PATHS_H_ */ + diff --git a/StdLib/Include/setjmp.h b/StdLib/Include/setjmp.h new file mode 100644 index 0000000000..ed691e654d --- /dev/null +++ b/StdLib/Include/setjmp.h @@ -0,0 +1,62 @@ +/** @file + The header defines the macro setjmp, and declares one function + and one type, for bypassing the normal function call and return discipline. + +Copyright (c) 2010, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. +The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php. + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _SETJMP_H +#define _SETJMP_H +#include +#include + +/** jmp_buf is an array type suitable for holding the information needed to + restore a calling environment. The environment of a call to the setjmp + macro consists of information sufficient for a call to the longjmp function + to return execution to the correct block and invocation of that block, were + it called recursively. It does not include the state of the floating-point + status flags, of open files, or of any other component of the abstract + machine. +**/ +typedef BASE_LIBRARY_JUMP_BUFFER jmp_buf[1]; + +/** The setjmp macro saves its calling environment in its jmp_buf argument for + later use by the longjmp function. + + The Standard does not specify whether setjmp is a macro or an identifier + declared with external linkage. If a macro definition is suppressed in + order to access an actual function, or a program defines an external + identifier with the name setjmp, the behavior is undefined by the Standard. + + @param[in,out] env A jmp_buf type object into which + the current environment is stored. + + @return If the return is from a direct invocation, the setjmp macro + returns the value zero. If the return is from a call to the longjmp + function, the setjmp macro returns a nonzero value. +**/ +#define setjmp(env) (INTN)SetJump((env)) + +/** The longjmp function restores the environment saved by the most recent + invocation of the setjmp macro in the same invocation of the program with + the corresponding jmp_buf argument. If there has been no such invocation, + or if the function containing the invocation of the setjmp macro has + terminated execution in the interim, or if the invocation of the setjmp + macro was within the scope of an identifier with variably modified type and + execution has left that scope in the interim, the behavior is undefined. + + After longjmp is completed, program execution continues as if the + corresponding invocation of the setjmp macro had just returned the value + specified by val. The longjmp function cannot cause the setjmp macro to + return the value 0; if val is 0, the setjmp macro returns the value 1. +**/ +extern void longjmp(jmp_buf env, int val); + +#endif /* _SETJMP_H */ diff --git a/StdLib/Include/signal.h b/StdLib/Include/signal.h new file mode 100644 index 0000000000..52873c764d --- /dev/null +++ b/StdLib/Include/signal.h @@ -0,0 +1,83 @@ +/** @file + The header declares a type and two functions and defines several + macros, for handling various signals (conditions that may be reported during + program execution). + + The UEFI implementation of maps signals onto the UEFI + event mechanism. + + An implementation need not generate any of these signals, except as a result + of explicit calls to the raise function. Additional signals and pointers to + undeclarable functions, with macro definitions beginning, respectively, with + the letters SIG and an uppercase letter or with SIG_ and an uppercase letter + may also be specified by the implementation. The complete set of signals, + their semantics, and their default handling is implementation-defined; all + signal numbers shall be positive. + +Copyright (c) 2010, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. +The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php. + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _SIGNAL_H +#define _SIGNAL_H +#include +#include + +/* The type sig_atomic_t is the (possibly volatile-qualified) integer type of + an object that can be accessed as an atomic entity, even in the presence + of asynchronous interrupts. + + This, possibly machine specific, type is defined in . +*/ + +/** The following three macros expand to constant expressions with distinct + values that have type compatible with the second argument to, and the + return value of, the signal function, and whose values compare unequal to + the address of any declarable function. +**/ +#define SIG_IGN ((__sighandler_t *) 0) +#define SIG_DFL ((__sighandler_t *) 1) +#define SIG_ERR ((__sighandler_t *) 3) + +/** The following members expand to positive integer constant expressions with + type int and distinct values that are the signal numbers, each + corresponding to the specified condition. + Many existing programs expect these to be macros. +**/ +#define SIGINT 1 ///< receipt of an interactive attention signal +#define SIGILL 2 ///< detection of an invalid function image, such as an invalid instruction +#define SIGABRT 3 ///< abnormal termination, such as is initiated by the abort function +#define SIGFPE 4 ///< an erroneous arithmetic operation, such as zero divide or an operation resulting in overflow +#define SIGSEGV 5 ///< an invalid access to storage +#define SIGTERM 6 ///< a termination request sent to the program +#define SIG_LAST 7 ///< One more than the largest signal number + +__BEGIN_DECLS + +/* For historical reasons; programs expect signal to be declared + in . The function is documented in . + + The function is declared in the C Standard as:
+ void (*signal(int sig, void (*func)(int)))(int); +*/ + +/** Send a signal. + + The raise function carries out the actions described for signal, + in , for the signal sig. If a signal handler is called, the + raise function shall not return until after the signal handler does. + + @return The raise function returns zero if successful, + nonzero if unsuccessful. +**/ +int raise(int sig); + +__END_DECLS + +#endif /* _SIGNAL_H */ diff --git a/StdLib/Include/stdarg.h b/StdLib/Include/stdarg.h new file mode 100644 index 0000000000..226e315695 --- /dev/null +++ b/StdLib/Include/stdarg.h @@ -0,0 +1,121 @@ +/** @file + The header declares a type and defines three macros, for advancing + through a list of arguments whose number and types are not known to the + called function when it is translated. + + A function may be called with a variable number of arguments of varying types. + Its parameter list contains one or more parameters. The rightmost parameter + plays a special role in the access mechanism, and will be designated paramN + in this description. + + The type va_list is a type suitable for holding information needed by the + macros va_start, va_arg, and va_end. If access to the varying arguments + is desired, the called function shall declare an object (referred to as ap + in these descriptions) having type va_list. The object ap may be passed as + an argument to another function; if that function invokes the va_arg macro + with parameter ap, the value of ap in the calling function is indeterminate + and shall be passed to the va_end macro prior to any further reference to ap. + + The va_start and va_arg macros shall be implemented as macros, not as actual + functions. It is unspecified, by the C library standards, whether va_end + is a macro or an identifier declared with external linkage. If a macro + definition is suppressed in order to access an actual function, or a + program defines an external identifier with the name va_end, the behavior + is undefined. The va_start and va_end macros shall be invoked in the + function accepting a varying number of arguments, if access to the varying + arguments is desired. + +Copyright (c) 2010, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. +The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php. + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _STDARG_H +#define _STDARG_H +#include + +/** The type va_list is a type suitable for holding information needed by the + macros va_start, va_arg, and va_end. + + This implementation aliases va_list to VA_LIST, declared in MdePkg/Base.h. +**/ +#define va_list VA_LIST + +/** The va_start macro shall be invoked before any access to the unnamed arguments. + The va_start macro initializes ap for subsequent use by va_arg and va_end. + + Synopsys: void va_start(va_list ap, paramN); + + @param ap An object of type va_list that is to be initialized such + that subsequent successive invocations of va_arg will + return the values of the parameters following paramN. + + @param paramN The parameter paramN is the identifier of the rightmost + parameter in the variable parameter list in the function + definition (the one just before the ,...). If the + parameter parmN is declared with the register storage + class, with a function of array type, or with a type that + is not compatible with the type that results after + application of the default argument promotions, the + behavior is undefined. + + This implementation aliases va_start to VA_START, declared in MdePkg/Base.h. +**/ +//#define va_start(ap, ParamN) VA_START(ap, ParamN) +#define va_start VA_START + +/** The va_arg macro expands to an expression that has the type and value of + the next argument in the call. The parameter ap shall be the same as the + va_list ap initialized by va_start. Each invocation of va_arg modifies ap + so that the values of successive arguments are returned in turn. The + parameter type is a type name specified such that the type of a pointer to + an object that has the specified type can be obtained simply by postfixing + a * to type. If there is no actual next argument, or if type is not + compatible with the type of the actual next argument (as promoted + according to the default argument promotions), the behavior is undefined. + + Synopsys: type va_arg(va_list ap, type); + + @param ap An object of type va_list that was initialized by a prior + invocation of va_start. + + @param type A type name specifying the type of the parameter to be retrieved. + + @return The first invocation of the va_arg macro after that of the + va_start macro returns the value of the argument after that + specified by paramN. Successive invocations return the values + of the remaining arguments in succession. + + This implementation aliases va_arg to VA_ARG, declared in MdePkg/Base.h. +**/ +//#define va_arg(ap, type) VA_ARG(ap, type) +#define va_arg VA_ARG + +/** The va_end macro facillitates a normal return from the function whose + variable argument list was referred to by the expansion of va_start that + initialized the va_list ap. + + Synopsys: void va_end(va_list ap); + + The va_end macro may modify ap so that it is no longer usable (without an + intervening invocation of va_start). If there is no corresponding + invocation of the va_start macro, or if the va_end macro is not invoked + before the return, the behavior is undefined. + + @param ap An object of type va_list, initialized by a prior + invocation of va_start, that will no longer be referenced. + + This implementation aliases va_end to VA_END, declared in MdePkg/Base.h. +**/ +//#define va_end(ap) VA_END(ap) +#define va_end VA_END + +/** For BSD compatibility. **/ +#define va_copy(s,d) (s) = (d) + +#endif /* _STDARG_H */ diff --git a/StdLib/Include/stdbool.h b/StdLib/Include/stdbool.h new file mode 100644 index 0000000000..42dcd86b53 --- /dev/null +++ b/StdLib/Include/stdbool.h @@ -0,0 +1,34 @@ +/** @file + The header defines four macros: bool, true, false, + and __bool_true_false_are_defined. + + The macro bool expands to _Bool. + + The remaining three macros are suitable for use in #if preprocessing + directives. They are true, which expands to the integer constant 1, + false, which expands to the integer constant 0, and + __bool_true_false_are_defined which expands to the integer constant 1. + + A program may undefine and perhaps then redefine the + macros bool, true, and false. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _STDBOOL_H +#define _STDBOOL_H +#include + +#define bool _Bool +#define true 1 +#define false 0 +#define __bool_true_false_are_defined 1 + +#endif /* _STDBOOL_H */ diff --git a/StdLib/Include/stddef.h b/StdLib/Include/stddef.h new file mode 100644 index 0000000000..c97d5648c4 --- /dev/null +++ b/StdLib/Include/stddef.h @@ -0,0 +1,64 @@ +/** @file + Common Definitions. + +Copyright (c) 2010, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. +The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php. + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _STDDEF_H +#define _STDDEF_H +#include + +/** ptrdiff_t is the signed integer type of the result of subtracting two pointers. +**/ +#ifdef _EFI_PTRDIFF_T_ + typedef _EFI_PTRDIFF_T_ ptrdiff_t; + #undef _EFI_PTRDIFF_T_ +#endif + +/** size_t is the unsigned integer type of the result of the sizeof operator. +**/ +#ifdef _EFI_SIZE_T_ + typedef _EFI_SIZE_T_ size_t; + #undef _EFI_SIZE_T_ + #undef _BSD_SIZE_T_ +#endif + +/** wchar_t is an integer type whose range of values can represent distinct + codes for all members of the largest extended character set specified among + the supported locales. The null character shall have the code value zero. +**/ +#ifndef __cplusplus + #ifdef _EFI_WCHAR_T + typedef _EFI_WCHAR_T wchar_t; + #undef _EFI_WCHAR_T + #undef _BSD_WCHAR_T_ + #endif +#endif + +/** NULL expands to an implementation-defined null pointer constant. + NULL is defined in MdePkg/Include/Base.h which is automatically included + by the EDK II build tools. +**/ + +/** offsetof(type, member-designator) expands to an integer constant expression + that has type size_t, the value of which is the offset in bytes, to the + structure member (designated by member-designator), from the beginning of + its structure (designated by type). The type and member designator shall be + such that given
+ static type t;
+ then the expression &(t.member-designator) evaluates to an address constant. + (If the specified member is a bit-field, the behavior is undefined.) + + Alliased to OFFSET_OF which is defined in MdePkg/Include/Base.h which is + automatically included by the EDK II build tools. +**/ +#define offsetof(type, member) OFFSET_OF(type, member) + +#endif /* _STDDEF_H */ diff --git a/StdLib/Include/stdint.h b/StdLib/Include/stdint.h new file mode 100644 index 0000000000..04656a1d26 --- /dev/null +++ b/StdLib/Include/stdint.h @@ -0,0 +1 @@ +#include diff --git a/StdLib/Include/stdio.h b/StdLib/Include/stdio.h new file mode 100644 index 0000000000..d6eadf513c --- /dev/null +++ b/StdLib/Include/stdio.h @@ -0,0 +1,704 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)stdio.h 8.5 (Berkeley) 4/29/95 + */ +/* $NetBSD: stdio.h,v 1.66.2.3 2007/08/24 20:07:38 liamjfoy Exp $ */ + +#ifndef _STDIO_H_ +#define _STDIO_H_ + +#include +#include +#include +#include + +#ifdef _EFI_SIZE_T_ + typedef _EFI_SIZE_T_ size_t; + #undef _EFI_SIZE_T_ +#endif + +/* + * This is fairly grotesque, but pure ANSI code must not inspect the + * innards of an fpos_t anyway. The library internally uses off_t, + * which we assume is exactly as big as eight chars. + */ +#if (!defined(_ANSI_SOURCE) && !defined(__STRICT_ANSI__)) || defined(_LIBC) +typedef __off_t fpos_t; +#else +typedef struct __sfpos { + __off_t _pos; +} fpos_t; +#endif + +#define _FSTDIO /* Define for new stdio with functions. */ + +/* + * NB: to fit things in six character monocase externals, the stdio + * code uses the prefix `__s' for stdio objects, typically followed + * by a three-character attempt at a mnemonic. + */ + +/* stdio buffers */ +struct __sbuf { + unsigned char *_base; + int _size; +}; + +/* + * stdio state variables. + * + * The following always hold: + * + * if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR), + * _lbfsize is -_bf._size, else _lbfsize is 0 + * if _flags&__SRD, _w is 0 + * if _flags&__SWR, _r is 0 + * + * This ensures that the getc and putc macros (or inline functions) never + * try to write or read from a file that is in `read' or `write' mode. + * (Moreover, they can, and do, automatically switch from read mode to + * write mode, and back, on "r+" and "w+" files.) + * + * _lbfsize is used only to make the inline line-buffered output stream + * code as compact as possible. + * + * _ub, _up, and _ur are used when ungetc() pushes back more characters + * than fit in the current _bf, or when ungetc() pushes back a character + * that does not match the previous one in _bf. When this happens, + * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff + * _ub._base!=NULL) and _up and _ur save the current values of _p and _r. + * + * NB: see WARNING above before changing the layout of this structure! + */ +typedef struct __sFILE { + unsigned char *_p; /* current position in (some) buffer */ + int _r; /* read space left for getc() */ + int _w; /* write space left for putc() */ + unsigned short _flags; /* flags, below; this FILE is free if 0 */ + short _file; /* fileno, if Unix descriptor, else -1 */ + struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */ + int _lbfsize; /* 0 or -_bf._size, for inline putc */ + + /* operations */ + void *_cookie; /* cookie passed to io functions */ + int (*_close)(void *); + int (*_read) (void *, char *, int); + fpos_t (*_seek) (void *, fpos_t, int); + int (*_write)(void *, const char *, int); + + /* file extension */ + struct __sbuf _ext; + + /* separate buffer for long sequences of ungetc() */ + unsigned char *_up; /* saved _p when _p is doing ungetc data */ + int _ur; /* saved _r when _r is counting ungetc data */ + + /* tricks to meet minimum requirements even when malloc() fails */ + unsigned char _ubuf[3]; /* guarantee an ungetc() buffer */ + unsigned char _nbuf[1]; /* guarantee a getc() buffer */ + + /* separate buffer for fgetln() when line crosses buffer boundary */ + struct __sbuf _lb; /* buffer for fgetln() */ + + /* Unix stdio files get aligned to block boundaries on fseek() */ + int _blksize; /* stat.st_blksize (may be != _bf._size) */ + fpos_t _offset; /* current lseek offset */ +} FILE; + +__BEGIN_DECLS +extern FILE __sF[]; +__END_DECLS + +#define __SLBF 0x0001 /* line buffered */ +#define __SNBF 0x0002 /* unbuffered */ +#define __SRD 0x0004 /* OK to read */ +#define __SWR 0x0008 /* OK to write */ + /* RD and WR are never simultaneously asserted */ +#define __SRW 0x0010 /* open for reading & writing */ +#define __SEOF 0x0020 /* found EOF */ +#define __SERR 0x0040 /* found error */ +#define __SMBF 0x0080 /* _buf is from malloc */ +#define __SAPP 0x0100 /* fdopen()ed in append mode */ +#define __SSTR 0x0200 /* this is an sprintf/snprintf string */ +#define __SOPT 0x0400 /* do fseek() optimization */ +#define __SNPT 0x0800 /* do not do fseek() optimization */ +#define __SOFF 0x1000 /* set iff _offset is in fact correct */ +#define __SMOD 0x2000 /* true => fgetln modified _p text */ +#define __SALC 0x4000 /* allocate string space dynamically */ + +/* + * The following three definitions are for ANSI C, which took them + * from System V, which brilliantly took internal interface macros and + * made them official arguments to setvbuf(), without renaming them. + * Hence, these ugly _IOxxx names are *supposed* to appear in user code. + * + * Although numbered as their counterparts above, the implementation + * does not rely on this. + */ +#define _IOFBF 0 /* setvbuf should set fully buffered */ +#define _IOLBF 1 /* setvbuf should set line buffered */ +#define _IONBF 2 /* setvbuf should set unbuffered */ + +#define BUFSIZ 1024 /* size of buffer used by setbuf */ +#define EOF (-1) + +/* + * FOPEN_MAX is a minimum maximum, and is the number of streams that + * stdio can provide without attempting to allocate further resources + * (which could fail). Do not use this for anything. + */ +#define FOPEN_MAX OPEN_MAX /* must be <= OPEN_MAX */ +#define FILENAME_MAX PATH_MAX /* must be <= PATH_MAX */ + +#define L_tmpnam PATH_MAX /* must be == PATH_MAX */ + +#ifndef TMP_MAX +#define TMP_MAX 308915776 /* Legacy */ +#endif + +/* Always ensure that these are consistent with ! */ +#ifndef SEEK_SET +#define SEEK_SET 0 /* set file offset to offset */ +#endif +#ifndef SEEK_CUR +#define SEEK_CUR 1 /* set file offset to current plus offset */ +#endif +#ifndef SEEK_END +#define SEEK_END 2 /* set file offset to EOF plus offset */ +#endif + +#define stdin (&__sF[0]) +#define stdout (&__sF[1]) +#define stderr (&__sF[2]) + +/* + * Functions defined in ANSI C standard. + */ +__BEGIN_DECLS +void clearerr(FILE *); +int fclose (FILE *); +int feof (FILE *); +int ferror (FILE *); +int fflush (FILE *); +int fgetc (FILE *); +int fgetpos (FILE * __restrict, fpos_t * __restrict); +char *fgets (char * __restrict, int, FILE * __restrict); +FILE *fopen (const char * __restrict , const char * __restrict); + +/** The fprintf function writes output to the stream pointed to by stream, + under control of the string pointed to by format that specifies how + subsequent arguments are converted for output. If there are insufficient + arguments for the format, the behavior is undefined. If the format is + exhausted while arguments remain, the excess arguments are evaluated + (as always) but are otherwise ignored. The fprintf function returns when + the end of the format string is encountered. + + The format shall be a multibyte character sequence, beginning and ending in + its initial shift state. The format is composed of zero or more directives: + ordinary multibyte characters (not %), which are copied unchanged to the + output stream; and conversion specifications, each of which results in + fetching zero or more subsequent arguments, converting them, if applicable, + according to the corresponding conversion specifier, and then writing the + result to the output stream. + + Each conversion specification is introduced by the character %. After + the %, the following appear in sequence: + - Zero or more flags (in any order) that modify the meaning of the + conversion specification. + - An optional minimum field width. If the converted value has fewer + characters than the field width, it is padded with spaces (by default) + on the left (or right, if the left adjustment flag, described later, + has been given) to the field width. The field width takes the form of + an asterisk * (described later) or a nonnegative decimal integer. + - An optional precision that gives the minimum number of digits to appear + for the d, i, o, u, x, and X conversions, the number of digits to + appear after the decimal-point character for e, E, f, and F + conversions, the maximum number of significant digits for the g and G + conversions, or the maximum number of bytes to be written for s + conversions. The precision takes the form of a period (.) followed + either by an asterisk * (described later) or by an optional decimal + integer; if only the period is specified, the precision is taken as + zero. If a precision appears with any other conversion specifier, the + behavior is undefined. + - An optional length modifier that specifies the size of the argument. + - A conversion specifier character that specifies the type of conversion + to be applied. + + As noted above, a field width, or precision, or both, may be indicated by + an asterisk. In this case, an int argument supplies the field width or + precision. The arguments specifying field width, or precision, or both, shall + appear (in that order) before the argument (if any) to be converted. A negative + field width argument is taken as a - flag followed by a positive field width. + A negative precision argument is taken as if the precision were omitted. + + The flag characters and their meanings are: + - The result of the conversion is left-justified within the field. + (It is right-justified if this flag is not specified.) + + The result of a signed conversion always begins with a plus or + minus sign. (It begins with a sign only when a negative value is + converted if this flag is not specified.) + space If the first character of a signed conversion is not a sign, or + if a signed conversion results in no characters, a space is + prefixed to the result. If the space and + flags both appear, the + space flag is ignored. + # The result is converted to an "alternative form". For o + conversion, it increases the precision, if and only if necessary, + to force the first digit of the result to be a zero (if the value + and precision are both 0, a single 0 is printed). For x (or X) + conversion, a nonzero result has 0x (or 0X) prefixed to it. For e, + E, f, F, g, and G conversions, the result of converting a + floating-point number always contains a decimal-point character, + even if no digits follow it. (Normally, a decimal-point character + appears in the result of these conversions only if a digit follows + it.) For g and G conversions, trailing zeros are not removed from + the result. For other conversions, the behavior is undefined. + 0 For d, i, o, u, x, X, e, E, f, F, g, and G conversions, leading + zeros (following any indication of sign or base) are used to pad to + the field width rather than performing space padding, except when + converting an infinity or NaN. If the 0 and - flags both appear, + the 0 flag is ignored. For d, i, o, u, x, and X conversions, if a + precision is specified, the 0 flag is ignored. For other + conversions, the behavior is undefined. + + The length modifiers and their meanings are: + hh Specifies that a following d, i, o, u, x, or X conversion specifier + applies to a signed char or unsigned char argument (the argument + will have been promoted according to the integer promotions, but + its value shall be converted to signed char or unsigned char before + printing); or that a following n conversion specifier applies to a + pointer to a signed char argument. + h Specifies that a following d, i, o, u, x, or X conversion specifier + applies to a short int or unsigned short int argument (the argument + will have been promoted according to the integer promotions, but + its value shall be converted to short int or unsigned short int + before printing); or that a following n conversion specifier + applies to a pointer to a short int argument. + l (ell) Specifies that a following d, i, o, u, x, or X conversion + specifier applies to a long int or unsigned long int argument; that + a following n conversion specifier applies to a pointer to a long + int argument; that a following c conversion specifier applies to a + wint_t argument; that a following s conversion specifier applies to + a pointer to a wchar_t argument; or has no effect on a following e, + E, f, F, g, or G conversion specifier. + ll (ell-ell) Specifies that a following d, i, o, u, x, or X conversion + specifier applies to a long long int or unsigned long long int + argument; or that a following n conversion specifier applies to a + pointer to a long long int argument. + j Specifies that a following d, i, o, u, x, or X conversion specifier + applies to an intmax_t or uintmax_t argument; or that a following n + conversion specifier applies to a pointer to an intmax_t argument. + z Specifies that a following d, i, o, u, x, or X conversion specifier + applies to a size_t or the corresponding signed integer type + argument; or that a following n conversion specifier applies to a + pointer to a signed integer type corresponding to size_t argument. + t Specifies that a following d, i, o, u, x, or X conversion specifier + applies to a ptrdiff_t or the corresponding unsigned integer type + argument; or that a following n conversion specifier applies to a + pointer to a ptrdiff_t argument. + L Specifies that a following e, E, f, F, g, or G conversion specifier + applies to a long double argument. + + If a length modifier appears with any conversion specifier other than as + specified above, the behavior is undefined. + + The conversion specifiers and their meanings are: + d,i The int argument is converted to signed decimal in the style + [-]dddd. The precision specifies the minimum number of digits to + appear; if the value being converted can be represented in fewer + digits, it is expanded with leading zeros. The default precision + is 1. The result of converting a zero value with a precision of + zero is no characters. + o,u,x,X The unsigned int argument is converted to unsigned octal (o), + unsigned decimal (u), or unsigned hexadecimal notation (x or X) in + the style dddd; the letters abcdef are used for x conversion and + the letters ABCDEF for X conversion. The precision specifies the + minimum number of digits to appear; if the value being converted + can be represented in fewer digits, it is expanded with leading + zeros. The default precision is 1. The result of converting a zero + value with a precision of zero is no characters. + f,F A double argument representing a floating-point number is + converted to decimal notation in the style [-]ddd.ddd, where the + number of digits after the decimal-point character is equal to the + precision specification. If the precision is missing, it is taken + as 6; if the precision is zero and the # flag is not specified, no + decimal-point character appears. If a decimal-point character + appears, at least one digit appears before it. The value is rounded + to the appropriate number of digits. + A double argument representing an infinity is converted in one + of the styles [-]inf or [-]infinity - which style is + implementation-defined. A double argument representing a NaN is + converted in one of the styles [-]nan or [-]nan(n-char-sequence) + - which style, and the meaning of any n-char-sequence, is + implementation-defined. The F conversion specifier produces INF, + INFINITY, or NAN instead of inf, infinity, or nan, respectively. + e,E A double argument representing a floating-point number is + converted in the style [-]d.ddd e[+-]dd, where there is one digit + (which is nonzero if the argument is nonzero) before the + decimal-point character and the number of digits after it is equal + to the precision; if the precision is missing, it is taken as 6; if + the precision is zero and the # flag is not specified, no + decimal-point character appears. The value is rounded to the + appropriate number of digits. The E conversion specifier produces a + number with E instead of e introducing the exponent. The exponent + always contains at least two digits, and only as many more digits + as necessary to represent the exponent. If the value is zero, the + exponent is zero. + A double argument representing an infinity or NaN is converted + in the style of an f or F conversion specifier. + g,G A double argument representing a floating-point number is + converted in style f or e (or in style F or E in the case of a G + conversion specifier), depending on the value converted and the + precision. Let P equal the precision if nonzero, 6 if the precision + is omitted, or 1 if the precision is zero. Then, if a conversion + with style E would have an exponent of X: + - if P > X = -4, the conversion is with style f (or F) and + precision P - (X + 1). + - otherwise, the conversion is with style e (or E) and + precision P - 1. + + Finally, unless the # flag is used, any trailing zeros are removed + from the fractional portion of the result and the decimal-point + character is removed if there is no fractional portion remaining. + A double argument representing an infinity or NaN is converted in + the style of an f or F conversion specifier. + c If no l length modifier is present, the int argument is + converted to an unsigned char, and the resulting character is + written. If an l length modifier is present, the wint_t argument is + converted as if by an ls conversion specification with no precision + and an argument that points to the initial element of a two-element + array of wchar_t, the first element containing the wint_t argument + to the lc conversion specification and the second a null wide + character. + s If no l length modifier is present, the argument is a pointer + to the initial element of an array of character type. Characters + from the array are written up to (but not including) the + terminating null character. If the precision is specified, no more + than that many bytes are written. If the precision is not specified + or is greater than the size of the array, the array shall contain a + null character. + If an l length modifier is present, the argument shall be a + pointer to the initial element of an array of wchar_t type. Wide + characters from the array are converted to multibyte characters + (each as if by a call to the wcrtomb function, with the conversion + state described by an mbstate_t object initialized to zero before + the first wide character is converted) up to and including a + terminating null wide character. The resulting multibyte characters + are written up to (but not including) the terminating null + character (byte). If no precision is specified, the array shall + contain a null wide character. If a precision is specified, no more + than that many bytes are written (including shift sequences, if + any), and the array shall contain a null wide character if, to + equal the multibyte character sequence length given by the + precision, the function would need to access a wide character one + past the end of the array. In no case is a partial multibyte + character written. + p The argument shall be a pointer to void. The value of the + pointer is converted to a sequence of printing characters, in an + implementation-defined manner. + n The argument shall be a pointer to signed integer into which is + written the number of characters written to the output stream so + far by this call to fprintf. No argument is converted, but one is + consumed. If the conversion specification includes any flags, a + field width, or a precision, the behavior is undefined. + % A % character is written. No argument is converted. The + complete conversion specification shall be %%. + + In no case does a nonexistent or small field width cause truncation of a + field; if the result of a conversion is wider than the field width, the + field is expanded to contain the conversion result. + + @param[in] stream An open File specifier to which the output is sent. + @param[in] format A multi-byte character sequence containing characters + to be copied unchanged, and conversion specifiers + which convert their associated arguments. Copied and + converted characters are sent to the output stream. + @param ... Variable number of parameters as required by format. + + @return The fprintf function returns the number of characters + transmitted, or a negative value if an output or encoding + error occurred. + +**/ +int fprintf (FILE * __restrict stream, const char * __restrict format, ...); + +int fputc (int, FILE *); +int fputs (const char * __restrict, FILE * __restrict); +size_t fread (void * __restrict, size_t, size_t, FILE * __restrict); +FILE *freopen (const char * __restrict, const char * __restrict, FILE * __restrict); +int fscanf (FILE * __restrict, const char * __restrict, ...); +int fseek (FILE *, long, int); +int fsetpos (FILE *, const fpos_t *); +long ftell (FILE *); +size_t fwrite (const void * __restrict, size_t, size_t, FILE * __restrict); +int getc (FILE *); +int getchar (void); +void perror (const char *); +int printf (const char * __restrict, ...); +int putc (int, FILE *); +int putchar (int); +int puts (const char *); +int remove (const char *); +void rewind (FILE *); +int scanf (const char * __restrict, ...); +void setbuf (FILE * __restrict, char * __restrict); +int setvbuf (FILE * __restrict, char * __restrict, int, size_t); +int sscanf (const char * __restrict, const char * __restrict, ...); +FILE *tmpfile (void); +int ungetc (int, FILE *); +int vfprintf(FILE * __restrict, const char * __restrict, _BSD_VA_LIST_); +int vprintf (const char * __restrict, _BSD_VA_LIST_); + +#ifndef __AUDIT__ +char *gets (char *); +int sprintf (char * __restrict, const char * __restrict, ...); +char *tmpnam (char *); +int vsprintf(char * __restrict, const char * __restrict, _BSD_VA_LIST_); +#endif + +#if defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) +int rename (const char *, const char *) __RENAME(__posix_rename); +#else +int rename (const char *, const char *); +#endif +__END_DECLS + +/* + * IEEE Std 1003.1-90 + */ +#if defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || \ + defined(_NETBSD_SOURCE) + #define L_ctermid 1024 /* size for ctermid(); PATH_MAX */ + #define L_cuserid 9 /* size for cuserid(); UT_NAMESIZE + 1 */ + + __BEGIN_DECLS + char *ctermid(char *); + #ifndef __CUSERID_DECLARED + #define __CUSERID_DECLARED + /* also declared in unistd.h */ + char *cuserid(char *); + #endif /* __CUSERID_DECLARED */ + FILE *fdopen(int, const char *); + int fileno(FILE *); + __END_DECLS +#endif /* not ANSI */ + +/* + * IEEE Std 1003.1c-95, also adopted by X/Open CAE Spec Issue 5 Version 2 + */ +#if (_POSIX_C_SOURCE - 0) >= 199506L || (_XOPEN_SOURCE - 0) >= 500 || \ + defined(_REENTRANT) || defined(_NETBSD_SOURCE) + __BEGIN_DECLS + void flockfile (FILE *); + int ftrylockfile (FILE *); + void funlockfile (FILE *); + int getc_unlocked (FILE *); + int getchar_unlocked(void); + int putc_unlocked (int, FILE *); + int putchar_unlocked(int); + __END_DECLS +#endif /* _POSIX_C_SOURCE >= 1995056 || _XOPEN_SOURCE >= 500 || ... */ + +/* + * Functions defined in POSIX 1003.2 and XPG2 or later. + */ +#if (_POSIX_C_SOURCE - 0) >= 2 || (_XOPEN_SOURCE - 0) >= 2 || \ + defined(_NETBSD_SOURCE) + __BEGIN_DECLS + int pclose (FILE *); + FILE *popen (const char *, const char *); + __END_DECLS +#endif + +/* + * Functions defined in ISO XPG4.2, ISO C99, POSIX 1003.1-2001 or later. + */ +#if ((__STDC_VERSION__ - 0) >= 199901L) || \ + ((_POSIX_C_SOURCE - 0) >= 200112L) || \ + (defined(_XOPEN_SOURCE) && defined(_XOPEN_SOURCE_EXTENDED)) || \ + ((_XOPEN_SOURCE - 0) >= 500) || \ + defined(_ISOC99_SOURCE) || defined(_NETBSD_SOURCE) + __BEGIN_DECLS + int snprintf (char * __restrict, size_t, const char * __restrict, ...) + __attribute__((__format__(__printf__, 3, 4))); + int vsnprintf(char * __restrict, size_t, const char * __restrict, _BSD_VA_LIST_) + __attribute__((__format__(__printf__, 3, 0))); + __END_DECLS +#endif + +/* + * Functions defined in XPG4.2. + */ +#if defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE) + __BEGIN_DECLS + int getw(FILE *); + int putw(int, FILE *); + char *mkdtemp(char *); + int mkstemp(char *); + char *mktemp(char *); + + #ifndef __AUDIT__ + char *tempnam(const char *, const char *); + #endif + __END_DECLS +#endif + +/* + * X/Open CAE Specification Issue 5 Version 2 + */ +#ifndef off_t + typedef __off_t off_t; + #define off_t __off_t +#endif /* off_t */ + +__BEGIN_DECLS +int fseeko(FILE *, off_t, int); +off_t ftello(FILE *); +__END_DECLS + +/* + * Routines that are purely local. + */ +#if defined(_NETBSD_SOURCE) + + #define FPARSELN_UNESCESC 0x01 + #define FPARSELN_UNESCCONT 0x02 + #define FPARSELN_UNESCCOMM 0x04 + #define FPARSELN_UNESCREST 0x08 + #define FPARSELN_UNESCALL 0x0f + + __BEGIN_DECLS + //int asprintf(char ** __restrict, const char * __restrict, ...) + // __attribute__((__format__(__printf__, 2, 3))); + char *fgetln(FILE * __restrict, size_t * __restrict); + char *fparseln(FILE *, size_t *, size_t *, const char[3], int); + int fpurge(FILE *); + void setbuffer(FILE *, char *, int); + int setlinebuf(FILE *); + int vasprintf(char ** __restrict, const char * __restrict, + _BSD_VA_LIST_) + __attribute__((__format__(__printf__, 2, 0))); + int vscanf(const char * __restrict, _BSD_VA_LIST_) + __attribute__((__format__(__scanf__, 1, 0))); + int vfscanf(FILE * __restrict, const char * __restrict, + _BSD_VA_LIST_) + __attribute__((__format__(__scanf__, 2, 0))); + int vsscanf(const char * __restrict, const char * __restrict, + _BSD_VA_LIST_) + __attribute__((__format__(__scanf__, 2, 0))); + const char *fmtcheck(const char *, const char *) + __attribute__((__format_arg__(2))); + __END_DECLS + + /* + * Stdio function-access interface. + */ + __BEGIN_DECLS + FILE *funopen(const void *, + int (*)(void *, char *, int), + int (*)(void *, const char *, int), + fpos_t (*)(void *, fpos_t, int), + int (*)(void *)); + __END_DECLS + //#define fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0) + //#define fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0) +#endif /* _NETBSD_SOURCE */ + +/* + * Functions internal to the implementation. + */ +__BEGIN_DECLS +int __srget(FILE *); +int __swbuf(int, FILE *); +__END_DECLS + +/* + * The __sfoo macros are here so that we can + * define function versions in the C library. + */ +#define __sgetc(p) (--(p)->_r < 0 ? __srget(p) : (int)(*(p)->_p++)) +#if defined(__GNUC__) && defined(__STDC__) + static __inline int __sputc(int _c, FILE *_p) { + if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n')) + return (*_p->_p++ = _c); + else + return (__swbuf(_c, _p)); + } +#else + /* + * This has been tuned to generate reasonable code on the vax using pcc. + */ + #define __sputc(c, p) \ + (--(p)->_w < 0 ? \ + (p)->_w >= (p)->_lbfsize ? \ + (*(p)->_p = (unsigned char)(c)), *(p)->_p != '\n' ? \ + (int)*(p)->_p++ : \ + __swbuf('\n', p) : \ + __swbuf((int)(c), p) : \ + (*(p)->_p = (unsigned char)(c), (int)*(p)->_p++)) +#endif + +#define __sfeof(p) (((p)->_flags & __SEOF) != 0) +#define __sferror(p) (((p)->_flags & __SERR) != 0) +#define __sclearerr(p) ((void)((p)->_flags &= ~(__SERR|__SEOF))) +#define __sfileno(p) ((p)->_file) + +#ifndef __lint__ + #if !defined(_REENTRANT) && !defined(_PTHREADS) + #define feof(p) __sfeof(p) + #define ferror(p) __sferror(p) + #define clearerr(p) __sclearerr(p) + + #define getc(fp) __sgetc(fp) + #define putc(x, fp) __sputc(x, fp) + #endif /* !_REENTRANT && !_PTHREADS */ +#endif /* __lint__ */ + +#define getchar() getc(stdin) +#define putchar(x) putc(x, stdout) + +#if defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || \ + defined(_NETBSD_SOURCE) + #if !defined(_REENTRANT) && !defined(_PTHREADS) + #define fileno(p) __sfileno(p) + #endif /* !_REENTRANT && !_PTHREADS */ +#endif /* !_ANSI_SOURCE */ + +#if (_POSIX_C_SOURCE - 0) >= 199506L || (_XOPEN_SOURCE - 0) >= 500 || \ + defined(_REENTRANT) || defined(_NETBSD_SOURCE) + #define getc_unlocked(fp) __sgetc(fp) + #define putc_unlocked(x, fp) __sputc(x, fp) + + #define getchar_unlocked() getc_unlocked(stdin) + #define putchar_unlocked(x) putc_unlocked(x, stdout) +#endif /* _POSIX_C_SOURCE >= 199506 || _XOPEN_SOURCE >= 500 || _REENTRANT... */ + +#endif /* _STDIO_H_ */ diff --git a/StdLib/Include/stdlib.h b/StdLib/Include/stdlib.h new file mode 100644 index 0000000000..2b19fd224b --- /dev/null +++ b/StdLib/Include/stdlib.h @@ -0,0 +1,536 @@ +/** @file + The header declares five types and several functions of general + utility, and defines several macros. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _STDLIB_H +#define _STDLIB_H +#include + +#ifdef _EFI_SIZE_T_ + typedef _EFI_SIZE_T_ size_t; + #undef _EFI_SIZE_T_ + #undef _BSD_SIZE_T_ +#endif + +#ifndef __cplusplus + #ifdef _EFI_WCHAR_T + typedef _EFI_WCHAR_T wchar_t; + #undef _EFI_WCHAR_T + #undef _BSD_WCHAR_T_ + #endif +#endif + +/// A structure type that is the type of the value returned by the div function. +typedef struct { + int quot; /* quotient */ + int rem; /* remainder */ +} div_t; + +/// A structure type that is the type of the value returned by the ldiv function. +typedef struct { + long quot; + long rem; +} ldiv_t; + +/// A structure type that is the type of the value returned by the lldiv function. +typedef struct { + long long quot; + long long rem; +} lldiv_t; + +/** Expand to integer constant expressions that can be used as the argument to + the exit function to return unsuccessful or successful termination status, + respectively, to the host environment. +**/ +#define EXIT_FAILURE 1 +#define EXIT_SUCCESS 0 + +/** Expands to an integer constant expression that is the maximum value + returned by the rand function. + + The value of the RAND_MAX macro shall be at least 32767. +**/ +#define RAND_MAX 0x7fffffff + +/** Expands to a positive integer expression with type size_t that is the + maximum number of bytes in a multibyte character for the extended character + set specified by the current locale (category LC_CTYPE), which is never + greater than MB_LEN_MAX. +**/ +#define MB_CUR_MAX 2 + +/** Maximum number of functions that can be registered by atexit. + + The C standard states that the implementation shall support the + registration of at least 32 functions. +**/ +#define ATEXIT_MAX 32 + +__BEGIN_DECLS + +/* ################ Communication with the environment ################## */ + +/** The abort function causes abnormal program termination to occur, unless + the signal SIGABRT is being caught and the signal handler does not return. + + Open streams with unwritten buffered data are not flushed, open + streams are not closed, and temporary files are not removed by abort. + + Unsuccessful termination is returned to the host environment by means of + the function call, raise(SIGABRT). + + @sa signal.h +**/ +void abort(void); + +/** The atexit function registers the function pointed to by func, to be + called without arguments at normal program termination. + + The implementation supports the registration of up to 32 functions. + + @return The atexit function returns zero if the registration succeeds, + nonzero if it fails. +**/ +int atexit(void (*)(void)); + +/** The exit function causes normal program termination to occur. If more than + one call to the exit function is executed by a program, + the behavior is undefined. + + First, all functions registered by the atexit function are called, in the + reverse order of their registration, except that a function is called + after any previously registered functions that had already been called at + the time it was registered. If, during the call to any such function, a + call to the longjmp function is made that would terminate the call to the + registered function, the behavior is undefined. + + Next, all open streams with unwritten buffered data are flushed, all open + streams are closed, and all files created by the tmpfile function + are removed. + + Finally, control is returned to the host environment. If the value of + status is zero, or EXIT_SUCCESS, status is returned unchanged. If the value + of status is EXIT_FAILURE, EAPPLICATION is returned. + Otherwise, status is returned unchanged. +**/ +void exit(int status) __noreturn; + +/** The _Exit function causes normal program termination to occur and control + to be returned to the host environment. + + No functions registered by the atexit function or signal handlers + registered by the signal function are called. Open streams with unwritten + buffered data are not flushed, open streams are not closed, and temporary + files are not removed by abort. + + The status returned to the host environment is determined in the same way + as for the exit function. +**/ +void _Exit(int status) __noreturn; + +/** The getenv function searches an environment list, provided by the host + environment, for a string that matches the string pointed to by name. The + set of environment names and the method for altering the environment list + are determined by the underlying UEFI Shell implementation. + + @return The getenv function returns a pointer to a string associated with + the matched list member. The string pointed to shall not be + modified by the program, but may be overwritten by a subsequent + call to the getenv function. If the specified name cannot be + found, a null pointer is returned. +**/ +char *getenv(const char *name); + +/** If string is a null pointer, the system function determines whether the + host environment has a command processor. If string is not a null pointer, + the system function passes the string pointed to by string to that command + processor to be executed in a manner which the implementation shall + document; this might then cause the program calling system to behave in a + non-conforming manner or to terminate. + + @return If the argument is a null pointer, the system function returns + nonzero only if a command processor is available. If the argument + is not a null pointer, and the system function does return, it + returns an implementation-defined value. +**/ +int system(const char *string); + + +/* ################ Integer arithmetic functions ######################## */ + +/** Computes the absolute value of an integer j. + + @return The absolute value of j. +**/ +int abs(int j); + +/** Computes the absolute value of an integer j. + + @return The absolute value of j. +**/ +long labs(long j); + +/** Computes the absolute value of an integer j. + + @return The absolute value of j. +**/ +long long + llabs(long long j); + +/** Computes numer / denom and numer % denom in a single operation. + + @return Returns a structure of type div_t, comprising both the + quotient and the remainder. +**/ +div_t div(int numer, int denom); + +/** Computes numer / denom and numer % denom in a single operation. + + @return Returns a structure of type ldiv_t, comprising both the + quotient and the remainder. +**/ +ldiv_t ldiv(long numer, long denom); + +/** Computes numer / denom and numer % denom in a single operation. + + @return Returns a structure of type lldiv_t, comprising both the + quotient and the remainder. +**/ +lldiv_t lldiv(long long numer, long long denom); + +/* ############ Integer Numeric conversion functions #################### */ + +/** The atoi function converts the initial portion of the string pointed to by + nptr to int representation. Except for the behavior on error, it is + equivalent to: + - atoi: (int)strtol(nptr, (char **)NULL, 10) + + @return The atoi function returns the converted value. +**/ +int atoi(const char *nptr); + +/** The atol function converts the initial portion of the string pointed to by + nptr to long int representation. Except for the behavior on error, it is + equivalent to: + - atol: strtol(nptr, (char **)NULL, 10) + + @return The atol function returns the converted value. +**/ +long atol(const char *nptr); + +/** The atoll function converts the initial portion of the string pointed to by + nptr to long long int representation. Except for the behavior on error, it + is equivalent to: + - atoll: strtoll(nptr, (char **)NULL, 10) + + @return The atoll function returns the converted value. +**/ +long long + atoll(const char *nptr); + +/** The strtol, strtoll, strtoul, and strtoull functions convert the initial + portion of the string pointed to by nptr to long int, long long int, + unsigned long int, and unsigned long long int representation, respectively. + First, they decompose the input string into three parts: an initial, + possibly empty, sequence of white-space characters (as specified by the + isspace function), a subject sequence resembling an integer represented in + some radix determined by the value of base, and a final string of one or + more unrecognized characters, including the terminating null character of + the input string. Then, they attempt to convert the subject sequence to an + integer, and return the result. + + If the value of base is zero, the expected form of the subject sequence is + that of an integer constant as described in 6.4.4.1, optionally preceded + by a plus or minus sign, but not including an integer suffix. If the value + of base is between 2 and 36 (inclusive), the expected form of the subject + sequence is a sequence of letters and digits representing an integer with + the radix specified by base, optionally preceded by a plus or minus sign, + but not including an integer suffix. The letters from a (or A) through z + (or Z) are ascribed the values 10 through 35; only letters and digits whose + ascribed values are less than that of base are permitted. If the value of + base is 16, the characters 0x or 0X may optionally precede the sequence of + letters and digits, following the sign if present. + + The subject sequence is defined as the longest initial subsequence of the + input string, starting with the first non-white-space character, that is of + the expected form. The subject sequence contains no characters if the input + string is empty or consists entirely of white space, or if the first + non-white-space character is other than a sign or a permissible letter or digit. + + If the subject sequence has the expected form and the value of base is + zero, the sequence of characters starting with the first digit is + interpreted as an integer constant. If the subject sequence has the + expected form and the value of base is between 2 and 36, it is used as the + base for conversion, ascribing to each letter its value as given above. If + the subject sequence begins with a minus sign, the value resulting from the + conversion is negated (in the return type). A pointer to the final string + is stored in the object pointed to by endptr, provided that endptr is + not a null pointer. + + In other than the "C" locale, additional locale-specific subject sequence + forms may be accepted. + + If the subject sequence is empty or does not have the expected form, no + conversion is performed; the value of nptr is stored in the object pointed + to by endptr, provided that endptr is not a null pointer. + + @return The strtol, strtoll, strtoul, and strtoull functions return the + converted value, if any. If no conversion could be performed, zero + is returned. If the correct value is outside the range of + representable values, LONG_MIN, LONG_MAX, LLONG_MIN, LLONG_MAX, + ULONG_MAX, or ULLONG_MAX is returned (according to the return type + and sign of the value, if any), and the value of the macro ERANGE + is stored in errno. +**/ +long strtol(const char * __restrict nptr, char ** __restrict endptr, int base); + +/** The strtoul function converts the initial portion of the string pointed to + by nptr to unsigned long int representation. + + See the description for strtol for more information. + + @return The strtoul function returns the converted value, if any. If no + conversion could be performed, zero is returned. If the correct + value is outside the range of representable values, ULONG_MAX is + returned and the value of the macro ERANGE is stored in errno. +**/ +unsigned long + strtoul(const char * __restrict nptr, char ** __restrict endptr, int base); + +/** The strtoll function converts the initial portion of the string pointed to + by nptr to long long int representation. + + See the description for strtol for more information. + + @return The strtoll function returns the converted value, if any. If no + conversion could be performed, zero is returned. If the correct + value is outside the range of representable values, LLONG_MIN or + LLONG_MAX is returned (according to the sign of the value, if any), + and the value of the macro ERANGE is stored in errno. +**/ +long long + strtoll(const char * __restrict nptr, char ** __restrict endptr, int base); + +/** The strtoull function converts the initial portion of the string pointed to + by nptr to unsigned long long int representation. + + See the description for strtol for more information. + + @return The strtoull function returns the converted value, if any. If no + conversion could be performed, zero is returned. If the correct + value is outside the range of representable values, ULLONG_MAX is + returned and the value of the macro ERANGE is stored in errno. +**/ +unsigned long long + strtoull(const char * __restrict nptr, char ** __restrict endptr, int base); + +/* ######### Floating-point Numeric conversion functions ################ */ + +/** + + @return +**/ +double atof(const char *); + +/** + + @return +**/ +double strtod(const char * __restrict nptr, char ** __restrict endptr); + +/** + + @return +**/ +float strtof(const char * __restrict nptr, char ** __restrict endptr); + +/** + + @return +**/ +long double + strtold(const char * __restrict nptr, char ** __restrict endptr); + +/* ################ Pseudo-random sequence generation functions ######### */ + +/** The rand function computes a sequence of pseudo-random integers in the + range 0 to RAND_MAX. + + @return The rand function returns a pseudo-random integer. +**/ +int rand(void); + +/** The srand function uses the argument as a seed for a new sequence of + pseudo-random numbers to be returned by subsequent calls to rand. + + If srand is then called with the same seed value, the sequence of + pseudo-random numbers shall be repeated. If rand is called before any calls + to srand have been made, the same sequence shall be generated as when srand + is first called with a seed value of 1. +**/ +void srand(unsigned seed); + +/* ################ Memory management functions ######################### */ + +/** The calloc function allocates space for an array of Num objects, each of + whose size is Size. The space is initialized to all bits zero. + + @return NULL is returned if the space could not be allocated and errno + contains the cause. Otherwise, a pointer to an 8-byte aligned + region of the requested size is returned. +**/ +void *calloc(size_t Num, size_t Size); + +/** The free function causes the space pointed to by Ptr to be deallocated, + that is, made available for further allocation. + + If Ptr is a null pointer, no action occurs. Otherwise, if the argument + does not match a pointer earlier returned by the calloc, malloc, or realloc + function, or if the space has been deallocated by a call to free or + realloc, the behavior is undefined. + + @param Ptr Pointer to a previously allocated region of memory to be freed. + +**/ +void free(void *); + +/** The malloc function allocates space for an object whose size is specified + by size and whose value is indeterminate. + + This implementation uses the UEFI memory allocation boot services to get a + region of memory that is 8-byte aligned and of the specified size. The + region is allocated with type EfiLoaderData. + + @param size Size, in bytes, of the region to allocate. + + @return NULL is returned if the space could not be allocated and errno + contains the cause. Otherwise, a pointer to an 8-byte aligned + region of the requested size is returned.
+ If NULL is returned, errno may contain: + - EINVAL: Requested Size is zero. + - ENOMEM: Memory could not be allocated. +**/ +void *malloc(size_t); + +/** The realloc function changes the size of the object pointed to by Ptr to + the size specified by NewSize. + + The contents of the object are unchanged up to the lesser of the new and + old sizes. If the new size is larger, the value of the newly allocated + portion of the object is indeterminate. + + If Ptr is a null pointer, the realloc function behaves like the malloc + function for the specified size. + + If Ptr does not match a pointer earlier returned by the calloc, malloc, or + realloc function, or if the space has been deallocated by a call to the free + or realloc function, the behavior is undefined. + + If the space cannot be allocated, the object pointed to by Ptr is unchanged. + + If NewSize is zero and Ptr is not a null pointer, the object it points to + is freed. + + This implementation uses the UEFI memory allocation boot services to get a + region of memory that is 8-byte aligned and of the specified size. The + region is allocated with type EfiLoaderData. + + @param Ptr Pointer to a previously allocated region of memory to be resized. + @param NewSize Size, in bytes, of the new object to allocate space for. + + @return NULL is returned if the space could not be allocated and errno + contains the cause. Otherwise, a pointer to an 8-byte aligned + region of the requested size is returned. If NewSize is zero, + NULL is returned and errno will be unchanged. +**/ +void *realloc(void *Ptr, size_t NewSize); + +/* ################ Searching and Sorting utilities ##################### */ + +/** The bsearch function searches an array of nmemb objects, the initial + element of which is pointed to by base, for an element that matches the + object pointed to by key. The size of each element of the array is + specified by size. + + The comparison function pointed to by compar is called with two arguments + that point to the key object and to an array element, in that order. The + function returns an integer less than, equal to, or greater than zero if + the key object is considered, respectively, to be less than, to match, or + to be greater than the array element. The array consists of: all the + elements that compare less than, all the elements that compare equal to, + and all the elements that compare greater than the key object, + in that order. + + @return The bsearch function returns a pointer to a matching element of the + array, or a null pointer if no match is found. If two elements + compare as equal, which element is matched is unspecified. +**/ +void * +bsearch( const void *key, const void *base0, + size_t nmemb, size_t size, + int (*compar)(const void *, const void *) +); + +/** The qsort function sorts an array of nmemb objects, the initial element of + which is pointed to by base. The size of each object is specified by size. + + The contents of the array are sorted into ascending order according to a + comparison function pointed to by compar, which is called with two + arguments that point to the objects being compared. The function shall + return an integer less than, equal to, or greater than zero if the first + argument is considered to be respectively less than, equal to, or greater + than the second. + + If two elements compare as equal, their order in the resulting sorted array + is unspecified. +**/ +void qsort( void *base, size_t nmemb, size_t size, + int (*compar)(const void *, const void *)); + +/* ################ Multibyte/wide character conversion functions ####### */ + +/** + + @return +**/ +int mblen(const char *, size_t); + +/** + + @return +**/ +int mbtowc(wchar_t * __restrict, const char * __restrict, size_t); + +/** + + @return +**/ +int wctomb(char *, wchar_t); + +/* ################ Multibyte/wide string conversion functions ########## */ + +/** + + @return +**/ +size_t mbstowcs(wchar_t * __restrict , const char * __restrict, size_t); + +/** + + @return +**/ +size_t wcstombs(char * __restrict, const wchar_t * __restrict, size_t); + +__END_DECLS + +#endif /* _STDLIB_H */ diff --git a/StdLib/Include/string.h b/StdLib/Include/string.h new file mode 100644 index 0000000000..920d6c8dd6 --- /dev/null +++ b/StdLib/Include/string.h @@ -0,0 +1,329 @@ +/** @file + The header declares one type and several functions, and defines + one macro useful for manipulating arrays of character type and other objects + treated as arrays of character type. Various methods are used for + determining the lengths of the arrays, but in all cases a char * or void * + argument points to the initial (lowest addressed) character of the array. If + an array is accessed beyond the end of an object, the behavior is undefined. + + Where an argument declared as size_t n specifies the length of the array for + a function, n can have the value zero on a call to that function. Unless + explicitly stated otherwise in the description of those functions, pointer + arguments on such a call shall still have valid values. + + For all functions declared in this header, each character shall be + interpreted as if it had the type unsigned char (and therefore every possible + object representation is valid and has a different value). + +Copyright (c) 2010, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. +The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php. + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _STRING_H +#define _STRING_H +#include + +#ifdef _EFI_SIZE_T_ + typedef _EFI_SIZE_T_ size_t; + #undef _EFI_SIZE_T_ + #undef _BSD_SIZE_T_ +#endif + +__BEGIN_DECLS + +/* ################ Copying Functions ################################# */ + +/** The memcpy function copies n characters from the object pointed to by s2 + into the object pointed to by s1. If copying takes place between objects + that overlap, the behavior is undefined. + + @return The memcpy function returns the value of s1. +**/ +void *memcpy(void * __restrict s1, const void * __restrict s2, size_t n); + +/** The memmove function copies n characters from the object pointed to by s2 + into the object pointed to by s1. Copying takes place as if the n + characters from the object pointed to by s2 are first copied into a + temporary array of n characters that does not overlap the objects pointed + to by s1 and s2, and then the n characters from the temporary array are + copied into the object pointed to by s1. + + @return The memmove function returns the value of s1. +**/ +void *memmove(void *s1, const void *s2, size_t n); + +/** The strcpy function copies the string pointed to by s2 (including the + terminating null character) into the array pointed to by s1. If copying + takes place between objects that overlap, the behavior is undefined. + + @return The strcpy function returns the value of s1. +**/ +char *strcpy(char * __restrict s1, const char * __restrict s2); + +/** The strncpy function copies not more than n characters (characters that + follow a null character are not copied) from the array pointed to by s2 to + the array pointed to by s1. If copying takes place between objects that + overlap, the behavior is undefined. + + If the array pointed to by s2 is a string that is shorter than n + characters, null characters are appended to the copy in the array pointed + to by s1, until n characters in all have been written. + + @return The strncpy function returns the value of s1. +**/ +char *strncpy(char * __restrict s1, const char * __restrict s2, size_t n); + +/** The strncpyX function copies not more than n-1 characters (characters that + follow a null character are not copied) from the array pointed to by s2 to + the array pointed to by s1. Array s1 is guaranteed to be NULL terminated. + If copying takes place between objects that overlap, + the behavior is undefined. + + strncpyX exists because normal strncpy does not indicate if the copy was + terminated because of exhausting the buffer or reaching the end of s2. + + @return The strncpyX function returns 0 if the copy operation was + terminated because it reached the end of s1. Otherwise, + a non-zero value is returned indicating how many characters + remain in s1. +**/ +int strncpyX(char * __restrict s1, const char * __restrict s2, size_t n); + +/* ################ Concatenation Functions ########################### */ + +/** The strcat function appends a copy of the string pointed to by s2 + (including the terminating null character) to the end of the string pointed + to by s1. The initial character of s2 overwrites the null character at the + end of s1. If copying takes place between objects that overlap, the + behavior is undefined. + + @return The strcat function returns the value of s1. +**/ +char *strcat(char * __restrict s1, const char * __restrict s2); + +/** The strncat function appends not more than n characters (a null character + and characters that follow it are not appended) from the array pointed to + by s2 to the end of the string pointed to by s1. The initial character of + s2 overwrites the null character at the end of s1. A terminating null + character is always appended to the result. If copying takes place + between objects that overlap, the behavior is undefined. + + @return The strncat function returns the value of s1. +**/ +char *strncat(char * __restrict s1, const char * __restrict s2, size_t n); + +/** The strncatX function appends not more than n characters (a null character + and characters that follow it are not appended) from the array pointed to + by s2 to the end of the string pointed to by s1. The initial character of + s2 overwrites the null character at the end of s1. The result is always + terminated with a null character. If copying takes place between objects + that overlap, the behavior is undefined. + + strncatX exists because normal strncat does not indicate if the operation + was terminated because of exhausting n or reaching the end of s2. + + @return The strncatX function returns 0 if the operation was terminated + because it reached the end of s1. Otherwise, a non-zero value is + returned indicating how many characters remain in s1. +**/ +int strncatX(char * __restrict s1, const char * __restrict s2, size_t n); + +/* ################ Comparison Functions ############################## */ + +/** The memcmp function compares the first n characters of the object pointed + to by s1 to the first n characters of the object pointed to by s2. + + @return The memcmp function returns an integer greater than, equal to, or + less than zero, accordingly as the object pointed to by s1 is + greater than, equal to, or less than the object pointed to by s2. +**/ +int memcmp(const void *s1, const void *s2, size_t n); + +/** The strcmp function compares the string pointed to by s1 to the string + pointed to by s2. + + @return The strcmp function returns an integer greater than, equal to, or + less than zero, accordingly as the string pointed to by s1 is + greater than, equal to, or less than the string pointed to by s2. +**/ +int strcmp(const char *s1, const char *s2); + +/** The strcoll function compares the string pointed to by s1 to the string + pointed to by s2, both interpreted as appropriate to the LC_COLLATE + category of the current locale. + + @return The strcoll function returns an integer greater than, equal to, + or less than zero, accordingly as the string pointed to by s1 is + greater than, equal to, or less than the string pointed to by s2 + when both are interpreted as appropriate to the current locale. +**/ +int strcoll(const char *s1, const char *s2); + +/** The strncmp function compares not more than n characters (characters that + follow a null character are not compared) from the array pointed to by s1 + to the array pointed to by s2. + + @return The strncmp function returns an integer greater than, equal to, + or less than zero, accordingly as the possibly null-terminated + array pointed to by s1 is greater than, equal to, or less than + the possibly null-terminated array pointed to by s2. +**/ +int strncmp(const char *s1, const char *s2, size_t n); + +/** The strxfrm function transforms the string pointed to by s2 and places the + resulting string into the array pointed to by s1. The transformation is + such that if the strcmp function is applied to two transformed strings, it + returns a value greater than, equal to, or less than zero, corresponding to + the result of the strcoll function applied to the same two original + strings. No more than n characters are placed into the resulting array + pointed to by s1, including the terminating null character. If n is zero, + s1 is permitted to be a null pointer. If copying takes place between + objects that overlap, the behavior is undefined. + + @return The strxfrm function returns the length of the transformed string + (not including the terminating null character). If the value + returned is n or more, the contents of the array pointed to by s1 + are indeterminate. +**/ +size_t strxfrm(char * __restrict s1, const char * __restrict s2, size_t n); + +/* ################ Search Functions ################################## */ + +/** The memchr function locates the first occurrence of c (converted to an + unsigned char) in the initial n characters (each interpreted as + unsigned char) of the object pointed to by s. + + @return The memchr function returns a pointer to the located character, + or a null pointer if the character does not occur in the object. +**/ +void *memchr(const void *s, int c, size_t n); + +/** The strchr function locates the first occurrence of c (converted to a char) + in the string pointed to by s. The terminating null character is considered + to be part of the string. + + @return The strchr function returns a pointer to the located character, + or a null pointer if the character does not occur in the string. +**/ +char *strchr(const char *s, int c); + +/** The strcspn function computes the length of the maximum initial segment of + the string pointed to by s1 which consists entirely of characters NOT from + the string pointed to by s2. + + @return The strcspn function returns the length of the segment. +**/ +size_t strcspn(const char *s1, const char *s2); + +/** The strpbrk function locates the first occurrence in the string pointed to + by s1 of any character from the string pointed to by s2. + + @return The strpbrk function returns a pointer to the character, or a + null pointer if no character from s2 occurs in s1. +**/ +char *strpbrk(const char *s1, const char *s2); + +/** The strrchr function locates the last occurrence of c (converted to a char) + in the string pointed to by s. The terminating null character is considered + to be part of the string. + + @return The strrchr function returns a pointer to the character, or a + null pointer if c does not occur in the string. +**/ +char *strrchr(const char *s, int c); + +/** The strspn function computes the length of the maximum initial segment of + the string pointed to by s1 which consists entirely of characters from the + string pointed to by s2. + + @return The strspn function returns the length of the segment. +**/ +size_t strspn(const char *s1 , const char *s2); + +/** The strstr function locates the first occurrence in the string pointed to + by s1 of the sequence of characters (excluding the terminating null + character) in the string pointed to by s2. + + @return The strstr function returns a pointer to the located string, or a + null pointer if the string is not found. If s2 points to a string + with zero length, the function returns s1. +**/ +char *strstr(const char *s1 , const char *s2); + +/** A sequence of calls to the strtok function breaks the string pointed to by + s1 into a sequence of tokens, each of which is delimited by a character + from the string pointed to by s2. The first call in the sequence has a + non-null first argument; subsequent calls in the sequence have a null first + argument. The separator string pointed to by s2 may be different from call + to call. + + The first call in the sequence searches the string pointed to by s1 for the + first character that is not contained in the current separator string + pointed to by s2. If no such character is found, then there are no tokens + in the string pointed to by s1 and the strtok function returns a null + pointer. If such a character is found, it is the start of the first token. + + The strtok function then searches from there for a character that is + contained in the current separator string. If no such character is found, + the current token extends to the end of the string pointed to by s1, and + subsequent searches for a token will return a null pointer. If such a + character is found, it is overwritten by a null character, which terminates + the current token. The strtok function saves a pointer to the following + character, from which the next search for a token will start. + + Each subsequent call, with a null pointer as the value of the first + argument, starts searching from the saved pointer and behaves as + described above. + + @return The strtok function returns a pointer to the first character of a + token, or a null pointer if there is no token. +**/ +char *strtok(char * __restrict s1, const char * __restrict s2); + +/* ################ Miscellaneous Functions ########################### */ + +/** The memset function copies the value of c (converted to an unsigned char) + into each of the first n characters of the object pointed to by s. + + @return The memset function returns the value of s. +**/ +void *memset(void *s, int c, size_t n); + +/** The strerror function maps the number in errnum to a message string. + Typically, the values for errnum come from errno, but strerror shall map + any value of type int to a message. + + The implementation shall behave as if no library function calls the + strerror function. + + @return The strerror function returns a pointer to the string, the + contents of which are locale specific. The array pointed to + shall not be modified by the program, but may be overwritten by + a subsequent call to the strerror function. +**/ +char *strerror(int num); + +/** The strlen function computes the length of the string pointed to by s. + + @return The strlen function returns the number of characters that + precede the terminating null character. +**/ +size_t strlen(const char *); + + +/* ################ BSD Compatibility Functions ####################### */ + +char *strdup (const char *); +int strerror_r(int, char *, size_t); +int strcasecmp(const char *s1, const char *s2); +void *memccpy (void *, const void *, int, size_t); + +__END_DECLS + +#endif /* _STRING_H */ diff --git a/StdLib/Include/sys/EfiCdefs.h b/StdLib/Include/sys/EfiCdefs.h new file mode 100644 index 0000000000..46aaf6e744 --- /dev/null +++ b/StdLib/Include/sys/EfiCdefs.h @@ -0,0 +1,367 @@ +/** @file + Common declarations and definitions for Standard C Library headers. + + This header consolidates definitions and declarations for compiler specific + features in one place in order to assist in making the remainder of the + library as compiler independent as possible. + + Certain macro and type definitions are required to be provided by several + different headers. In order to avoid having multiple definitions, and the + attendant risk of having the definitions get out of sync, they are defined in + this header. + + Note that MdePkg/Include/Base.h is automatically included and will bring + processor architecture specific definitions along with it. + + Throughout the library, the following macros are used instead of keywords so + that the library can be easily tuned for different compilers. + __inline Defined to the appropriate keyword or not defined. + __func__ Defined to __FUNC__, __FUNCTION__, or NULL as appropriate. + __restrict Defined to nothing for VC++ or to restrict for C99 compliant compilers. + + This file and its contents are inspired by the files in Berkeley + Unix. They have been re-implemented to be specific to the EFI environment. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Portions Copyright (c) 1991, 1993 + The Regents of the University of California. All rights reserved. + + Portions of this code are derived from software contributed to Berkeley by + Berkeley Software Design, Inc. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +**/ +#ifndef _EFI_CDEFS_H +#define _EFI_CDEFS_H + +/* +* Macro to test if we're using a GNU C compiler of a specific vintage +* or later, for e.g. features that appeared in a particular version +* of GNU C. Usage: +* +* #if __GNUC_PREREQ__(major, minor) +* ...cool feature... +* #else +* ...delete feature... +* #endif +*/ +#ifdef __GNUC__ +#define __GNUC_PREREQ__(x, y) \ +((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) || \ + (__GNUC__ > (x))) + +#define DONT_USE_STRONG_WEAK_ALIAS 1 + +#else +#define __GNUC_PREREQ__(x, y) 0 +#endif + +#include +//#include +#ifdef __PE32__ +#include +#else +#include +#endif + +/* NULL is defined by the automatic inclusion of Base.h by the build tools. */ + +#ifdef __GNUC__ + #define _EFI_SIZE_T_ __SIZE_TYPE__ /* sizeof() */ + #define _EFI_WCHAR_T __WCHAR_TYPE__ + #define _EFI_WINT_T __WINT_TYPE__ + //#define _EFI_WINT_MIN (0) + //#define _EFI_WINT_MAX (0xFFFF) + #define _EFI_PTRDIFF_T_ __PTRDIFF_TYPE__ /* ptr1 - ptr2 --- Must be same size as size_t */ +#else +#define _EFI_SIZE_T_ UINTN /* sizeof() */ +#define _EFI_WCHAR_T UINT16 +#define _EFI_WINT_T INT32 + //#define _EFI_WINT_MIN (-2147483647) /* wint_t */ + //#define _EFI_WINT_MAX ( 2147483647) /* wint_t */ + #define _EFI_PTRDIFF_T_ INTN /* ptr1 - ptr2 --- Must be same size as size_t */ +#endif /* __GNUC__ */ + +#define _EFI_CLOCK_T UINT64 +#define _EFI_TIME_T INT32 + +#if defined(__cplusplus) +#define __BEGIN_DECLS extern "C" { +#define __END_DECLS } +#define __static_cast(x,y) static_cast(y) +#else +#define __BEGIN_DECLS +#define __END_DECLS +#define __static_cast(x,y) (x)y +#endif + + /* + * The __CONCAT macro is used to concatenate parts of symbol names, e.g. + * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo. + * The __CONCAT macro is a bit tricky -- make sure you don't put spaces + * in between its arguments. __CONCAT can also concatenate double-quoted + * strings produced by the __STRING macro, but this only works with ANSI C. + */ + +#define ___STRING(x) __STRING(x) +#define ___CONCAT(x,y) __CONCAT(x,y) +#define __CONCAT(x,y) x ## y +#define __STRING(x) #x + +#define __const CONST +#define __signed signed +#define __volatile volatile + +#if __STDC__ || defined(__cplusplus) + #if defined(__cplusplus) + #define __inline inline /* convert to C++ keyword */ + #else + #if defined(_MSC_VER) || (!defined(__GNUC__) && !defined(__lint__)) + #define __inline /* delete C99 keyword */ + #endif /* !__GNUC__ && !__lint__ */ + #endif /* !__cplusplus */ +#endif /* !(__STDC__ || __cplusplus) */ + +/* Used in NetBSD for internal auditing of the source tree. */ +#define __aconst + + /* + * The following macro is used to remove const cast-away warnings + * from gcc -Wcast-qual; it should be used with caution because it + * can hide valid errors; in particular most valid uses are in + * situations where the API requires it, not to cast away string + * constants. We don't use *intptr_t on purpose here and we are + * explicit about unsigned long so that we don't have additional + * dependencies. + */ +#define __UNCONST(a) ((void *)(a)) +//#define __UNCONST(a) ((void *)(PHYSICAL_ADDRESS)(const void *)(a)) + + /* + * The following macro is used to remove the volatile cast-away warnings + * from gcc -Wcast-qual; as above it should be used with caution + * because it can hide valid errors or warnings. Valid uses include + * making it possible to pass a volatile pointer to memset(). + * For the same reasons as above, we use unsigned long and not intptr_t. + */ +#define __UNVOLATILE(a) ((void *)(PHYSICAL_ADDRESS)(volatile void *)(a)) + + /* + * GCC2 provides __extension__ to suppress warnings for various GNU C + * language extensions under "-ansi -pedantic". + */ +#if !__GNUC_PREREQ__(2, 0) +#define __extension__ /* delete __extension__ if non-gcc or gcc1 */ +#endif + + /* + * GCC1 and some versions of GCC2 declare dead (non-returning) and + * pure (no side effects) functions using "volatile" and "const"; + * unfortunately, these then cause warnings under "-ansi -pedantic". + * GCC2 uses a new, peculiar __attribute__((attrs)) style. All of + * these work for GNU C++ (modulo a slight glitch in the C++ grammar + * in the distribution version of 2.5.5). + */ +#if !__GNUC_PREREQ__(2, 5) +#define __attribute__(x) /* delete __attribute__ if non-gcc or gcc1 */ +#if defined(__GNUC__) && !defined(__STRICT_ANSI__) +#define __dead __volatile +#define __pure __const +#endif +#endif + + /* Delete pseudo-keywords wherever they are not available or needed. */ +#ifndef __dead +#define __dead +#define __pure +#endif + +#if __GNUC_PREREQ__(2, 7) +#define __unused __attribute__((__unused__)) +#define __noreturn __attribute__((__noreturn__)) +#else +#define __unused /* delete */ +#define __noreturn /* delete */ +#endif + +#if __GNUC_PREREQ__(3, 1) +#define __used __attribute__((__used__)) +#else +#define __used __unused +#endif + +#if __GNUC_PREREQ__(2, 7) +#define __packed __attribute__((__packed__)) +#define __aligned(x) __attribute__((__aligned__(x))) +#define __section(x) __attribute__((__section__(x))) +#elif defined(__lint__) +#define __packed /* delete */ +#define __aligned(x) /* delete */ +#define __section(x) /* delete */ +#else +#define __packed error: no __packed for this compiler +#define __aligned(x) error: no __aligned for this compiler +#define __section(x) error: no __section for this compiler +#endif + +/* +* C99 defines the restrict type qualifier keyword, which was made available +* in GCC 2.92. +*/ +#if __STDC_VERSION__ >= 199901L + #define __restrict restrict +#else + #if defined(_MSC_VER) || !__GNUC_PREREQ__(2, 92) + #define __restrict /* delete __restrict when not supported */ + #endif +#endif + +/* +* C99 defines __func__ predefined identifier, which was made available +* in GCC 2.95. +*/ +#if !(__STDC_VERSION__ >= 199901L) + #if defined(_MSC_VER) + #define __func__ __FUNCTION__ /* Use the MS-specific predefined macro */ + #elif __GNUC_PREREQ__(2, 6) + #define __func__ __PRETTY_FUNCTION__ + #elif __GNUC_PREREQ__(2, 4) + #define __func__ __FUNCTION__ + #else + #define __func__ "" + #endif +#endif /* !(__STDC_VERSION__ >= 199901L) */ + +// Experiment to disable RENAME for GCC +#if 0 +#ifdef __GNUC__ + #define __RENAME(x) ___RENAME(x) +#else + #ifdef __lint__ + #define __RENAME(x) __symbolrename(x) + #else + /*DVM To see where this might be used... */ + //#error "No function renaming possible" + #define __RENAME(x) + #endif /* __lint__ */ +#endif /* __GNUC__ */ +#else /* if 0 */ + #define __RENAME(x) +#endif /* if 0 */ + + /* + * A barrier to stop the optimizer from moving code or assume live + * register values. This is gcc specific, the version is more or less + * arbitrary, might work with older compilers. + */ +#if __GNUC_PREREQ__(2, 95) +#define __insn_barrier() __asm __volatile("":::"memory") +#else +#define __insn_barrier() /* */ +#endif + + /* + * GNU C version 2.96 adds explicit branch prediction so that + * the CPU back-end can hint the processor and also so that + * code blocks can be reordered such that the predicted path + * sees a more linear flow, thus improving cache behavior, etc. + * + * The following two macros provide us with a way to use this + * compiler feature. Use __predict_true() if you expect the expression + * to evaluate to true, and __predict_false() if you expect the + * expression to evaluate to false. + * + * A few notes about usage: + * + * * Generally, __predict_false() error condition checks (unless + * you have some _strong_ reason to do otherwise, in which case + * document it), and/or __predict_true() `no-error' condition + * checks, assuming you want to optimize for the no-error case. + * + * * Other than that, if you don't know the likelihood of a test + * succeeding from empirical or other `hard' evidence, don't + * make predictions. + * + * * These are meant to be used in places that are run `a lot'. + * It is wasteful to make predictions in code that is run + * seldomly (e.g. at subsystem initialization time) as the + * basic block reordering that this affects can often generate + * larger code. + */ +#if __GNUC_PREREQ__(2, 96) +#define __predict_true(exp) __builtin_expect((exp) != 0, 1) +#define __predict_false(exp) __builtin_expect((exp) != 0, 0) +#else +#define __predict_true(exp) (exp) +#define __predict_false(exp) (exp) +#endif + +/* find least significant bit that is set */ +#define __LOWEST_SET_BIT(__mask) ((((__mask) - 1) & (__mask)) ^ (__mask)) + +#define __SHIFTOUT(__x, __mask) (((__x) & (__mask)) / __LOWEST_SET_BIT(__mask)) +#define __SHIFTIN(__x, __mask) ((__x) * __LOWEST_SET_BIT(__mask)) +#define __SHIFTOUT_MASK(__mask) __SHIFTOUT((__mask), (__mask)) + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ + + /* VC++, by default, defines wchar_t as an intrinsic type, equivalent to + unsigned short. This conflicts which Standard C Library + implementations which try to define wchar_t. + Make sure that this behavior has been turned off by using + /Zc:wchar_t- on the command line. + */ + #ifdef _NATIVE_WCHAR_T_DEFINED + #error You must specify /Zc:wchar_t- to the compiler to turn off intrinsic wchar_t. + #endif + + // Keep compiler quiet about casting from smaller to larger types + #pragma warning ( disable : 4306 ) +#endif /* defined(_MSC_VER) */ +extern int _fltused; // VC++ requires this if you use floating point. KEEP for all compilers. + +#define _Bool BOOLEAN +#define _DIAGASSERT(e) + +// Types used to replace long so that it will have constant length regardless of compiler. +typedef INT32 EFI_LONG_T; // Equivalent to long in VS200? +typedef UINT32 EFI_ULONG_T; // Equivalent to unsigned long in VS200? +typedef INTN LONGN; +typedef UINTN ULONGN; +typedef INT32 LONG32; +typedef UINT32 ULONG32; +typedef INT64 LONG64; +typedef UINT64 ULONG64; + +//extern int EFIAPI main(); + +#endif /* _EFI_CDEFS_H */ diff --git a/StdLib/Include/sys/EfiSysCall.h b/StdLib/Include/sys/EfiSysCall.h new file mode 100644 index 0000000000..14ecb49890 --- /dev/null +++ b/StdLib/Include/sys/EfiSysCall.h @@ -0,0 +1,84 @@ +/** @file + Function declarations for UEFI "system calls". + + Concept derived from NetBSD's unistd.h file. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _EFI_SYS_CALL_H +#define _EFI_SYS_CALL_H + +#include +#include + +struct stat; // Structure declared in + +#define STDIN_FILENO 0 /* standard input file descriptor */ +#define STDOUT_FILENO 1 /* standard output file descriptor */ +#define STDERR_FILENO 2 /* standard error file descriptor */ + +/* access function */ +#define F_OK 0 /* test for existence of file */ +#define X_OK 0x01 /* test for execute or search permission */ +#define W_OK 0x02 /* test for write permission */ +#define R_OK 0x04 /* test for read permission */ + +/* whence values for lseek(2) */ +#define SEEK_SET 0 /* set file offset to offset */ +#define SEEK_CUR 1 /* set file offset to current plus offset */ +#define SEEK_END 2 /* set file offset to EOF plus offset */ + +__BEGIN_DECLS + +/* EFI versions of BSD system calls used in stdio */ +extern int close (int fd); +extern ssize_t read (int fd, void *buf, size_t n); +extern ssize_t write (int fd, const void *buf, size_t n); +extern int unlink (const char *name); +extern int dup2 (int, int); +extern int rmdir (const char *); +extern int isatty (int); + +/* These system calls are also declared in sys/fcntl.h */ +#ifndef __FCNTL_SYSCALLS_DECLARED + #define __FCNTL_SYSCALLS_DECLARED + extern int open (const char *name, int oflags, int mode); + extern int creat (const char *, mode_t); + extern int fcntl (int, int, ...); +#endif // __FCNTL_SYSCALLS_DECLARED + +/* These system calls are also declared in stat.h */ +#ifndef __STAT_SYSCALLS_DECLARED + #define __STAT_SYSCALLS_DECLARED + extern int mkdir (const char *, mode_t); + extern int fstat (int, struct stat *); + extern int lstat (const char *, struct stat *); + extern int stat (const char *, void *); +// extern int chmod (const char *, mode_t); +#endif // __STAT_SYSCALLS_DECLARED + +// These are also declared in sys/types.h +#ifndef __OFF_T_SYSCALLS_DECLARED + #define __OFF_T_SYSCALLS_DECLARED + extern off_t lseek (int, off_t, int); + extern int truncate (const char *, off_t); + extern int ftruncate (int, off_t); // IEEE Std 1003.1b-93 +#endif /* __OFF_T_SYSCALLS_DECLARED */ + +/* These system calls don't YET have EFI implementations. */ +extern int access (const char *path, int amode); +extern int chdir (const char *); +extern char *getcwd (char *, size_t); +extern int reboot (int, char *); + +__END_DECLS + +#endif /* _EFI_SYS_CALL_H */ diff --git a/StdLib/Include/sys/_ctype.h b/StdLib/Include/sys/_ctype.h new file mode 100644 index 0000000000..e5872f48f8 --- /dev/null +++ b/StdLib/Include/sys/_ctype.h @@ -0,0 +1,66 @@ +/** @file + Implementation specific support for Single-byte character classification and + case conversion macros and function declarations. + + This file is intended to only be included by . + + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _CTYPE_H +#error This file, , may only be included by . +#endif + +__BEGIN_DECLS +extern const UINT16 *_cClass; // Locale independent pointer to Character Classification Table +extern const UINT8 *_uConvT; // Locale independent pointer to Lowercase to Uppercase Conversion Table +extern const UINT8 *_lConvT; // Locale independent pointer to Uppercase to Lowercase Conversion Table + +extern int __isCClass( int _c, unsigned int mask); // Internal character classification function +__END_DECLS + + +// Character Class bit masks +#define _CC 0x0001U // Control Characters +#define _CW 0x0002U // White Space +#define _CP 0x0004U // Punctuation +#define _CD 0x0008U // Digits [0-9] +#define _CU 0x0010U // Uppercase Letter [A-Z] +#define _CL 0x0020U // Lowercase Letter [a-z] +#define _CX 0x0040U // Hexadecimal Digits [A-Fa-f] +#define _C0 0x0080U +#define _CS 0x0100U // Space Characters, ' ' in C locale +#define _CG 0x0200U // Graphic Characters +#define _CB 0x0400U // Blank Characters, ' ' and '\t' in C locale +#define _C4 0x0800U +#define _XA 0x1000U // eXtra Alpha characters not in _CU or _CL +#define _C6 0x2000U +#define _C7 0x4000U +#define _C8 0x8000U + +#ifndef NO_CTYPE_MACROS + #define __isCClass( _c, mask) (((_c) < 0 || (_c) > 127) ? 0 : (_cClass[(_c)] & (mask))) + #define __toLower( _c) ((__isCClass( ((int)_c), (_CU))) ? _lConvT[(_c)] : (_c)) + #define __toUpper( _c) ((__isCClass( ((int)_c), (_CL))) ? _uConvT[(_c)] : (_c)) +#endif /* NO_CTYPE_MACROS */ + +/* Macros used by implementation functions */ +#define __isHexLetter(_c) (__isCClass( (int)c, (_CX))) + +#ifdef _CTYPE_PRIVATE + #define _CTYPE_NUM_CHARS (256) + + #define _CTYPE_ID "BSDCTYPE" + #define _CTYPE_REV 2 + + extern const UINT16 _C_CharClassTable[]; + extern const UINT8 _C_ToUpperTable[]; + extern const UINT8 _C_ToLowerTable[]; +#endif diff --git a/StdLib/Include/sys/ansi.h b/StdLib/Include/sys/ansi.h new file mode 100644 index 0000000000..a52a9994c9 --- /dev/null +++ b/StdLib/Include/sys/ansi.h @@ -0,0 +1,63 @@ +/** @file + ANSI type definitions. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to The NetBSD Foundation + by Jun-ichiro itojun Hagino and by Klaus Klein. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: ansi.h,v 1.11 2005/12/11 12:25:20 christos Exp +**/ +#ifndef _SYS_ANSI_H_ +#define _SYS_ANSI_H_ + +#include + +typedef INT8 * __caddr_t; /* core address */ +typedef __uint32_t __gid_t; /* group id */ +typedef __uint32_t __in_addr_t; /* IP(v4) address */ +typedef __uint16_t __in_port_t; /* "Internet" port number */ +typedef __uint32_t __mode_t; /* file permissions */ +typedef __int64_t __off_t; /* file offset */ +typedef __int32_t __pid_t; /* process id */ +typedef __uint8_t __sa_family_t; /* socket address family */ +typedef UINTN __socklen_t; /* socket-related datum length */ +typedef __uint32_t __uid_t; /* user id */ +typedef __uint64_t __fsblkcnt_t; /* fs block count (statvfs) */ +typedef __uint64_t __fsfilcnt_t; /* fs file count */ + +#endif /* !_SYS_ANSI_H_ */ diff --git a/StdLib/Include/sys/bswap.h b/StdLib/Include/sys/bswap.h new file mode 100644 index 0000000000..a9284eb81d --- /dev/null +++ b/StdLib/Include/sys/bswap.h @@ -0,0 +1,77 @@ +/* $NetBSD: bswap.h,v 1.12 2006/05/22 16:28:27 drochner Exp $ */ + +/* Written by Manuel Bouyer. Public domain */ + +#ifndef _SYS_BSWAP_H_ +#define _SYS_BSWAP_H_ + +#ifndef _LOCORE +#include +#include + +#include + +__BEGIN_DECLS +/* Always declare the functions in case their address is taken (etc) */ +#if !defined(__BSWAP_RENAME) +uint16_t bswap16(uint16_t) __attribute__((__const__)); +uint32_t bswap32(uint32_t) __attribute__((__const__)); +#else +uint16_t bswap16(uint16_t) __RENAME(__bswap16) __attribute__((__const__)); +uint32_t bswap32(uint32_t) __RENAME(__bswap32) __attribute__((__const__)); +#endif +uint64_t bswap64(uint64_t) __attribute__((__const__)); +__END_DECLS + +#if defined(__GNUC__) && defined(__OPTIMIZE__) + +/* machine/byte_swap.h might have defined inline versions */ +#ifndef __BYTE_SWAP_U64_VARIABLE +#define __BYTE_SWAP_U64_VARIABLE bswap64 +#endif + +#ifndef __BYTE_SWAP_U32_VARIABLE +#define __BYTE_SWAP_U32_VARIABLE bswap32 +#endif + +#ifndef __BYTE_SWAP_U16_VARIABLE +#define __BYTE_SWAP_U16_VARIABLE bswap16 +#endif + +#define __byte_swap_u64_constant(x) \ + ((uint64_t) \ + ((((x) & 0xff00000000000000ull) >> 56) | \ + (((x) & 0x00ff000000000000ull) >> 40) | \ + (((x) & 0x0000ff0000000000ull) >> 24) | \ + (((x) & 0x000000ff00000000ull) >> 8) | \ + (((x) & 0x00000000ff000000ull) << 8) | \ + (((x) & 0x0000000000ff0000ull) << 24) | \ + (((x) & 0x000000000000ff00ull) << 40) | \ + (((x) & 0x00000000000000ffull) << 56))) + +#define __byte_swap_u32_constant(x) \ + ((((x) & 0xff000000) >> 24) | \ + (((x) & 0x00ff0000) >> 8) | \ + (((x) & 0x0000ff00) << 8) | \ + (((x) & 0x000000ff) << 24)) + +#define __byte_swap_u16_constant(x) \ + ((((x) & 0xff00) >> 8) | \ + (((x) & 0x00ff) << 8)) + +#define bswap64(x) \ + (__builtin_constant_p((x)) ? \ + __byte_swap_u64_constant(x) : __BYTE_SWAP_U64_VARIABLE(x)) + +#define bswap32(x) \ + (__builtin_constant_p((x)) ? \ + __byte_swap_u32_constant(x) : __BYTE_SWAP_U32_VARIABLE(x)) + +#define bswap16(x) \ + (__builtin_constant_p((x)) ? \ + __byte_swap_u16_constant(x) : __BYTE_SWAP_U16_VARIABLE(x)) + +#endif /* __GNUC__ && __OPTIMIZE__ */ +#endif /* !_LOCORE */ + +#endif /* !_SYS_BSWAP_H_ */ diff --git a/StdLib/Include/sys/callout.h b/StdLib/Include/sys/callout.h new file mode 100644 index 0000000000..b3768199fa --- /dev/null +++ b/StdLib/Include/sys/callout.h @@ -0,0 +1,131 @@ +/* $NetBSD: callout.h,v 1.22 2005/12/11 12:25:20 christos Exp $ */ + +/*- + * Copyright (c) 2000, 2003 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, + * NASA Ames Research Center. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Copyright (c) 2000-2001 Artur Grabowski + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SYS_CALLOUT_H_ +#define _SYS_CALLOUT_H_ + +/* + * The following funkyness is to appease gcc3's strict aliasing. + */ +struct callout; +struct callout_circq { + /* next element */ + union { + struct callout *elem; + struct callout_circq *list; + } cq_next; + /* previous element */ + union { + struct callout *elem; + struct callout_circq *list; + } cq_prev; +}; +#define cq_next_e cq_next.elem +#define cq_prev_e cq_prev.elem +#define cq_next_l cq_next.list +#define cq_prev_l cq_prev.list + +struct callout { + struct callout_circq c_list; /* linkage on queue */ + void (*c_func)(void *); /* function to call */ + void *c_arg; /* function argument */ + int c_time; /* when callout fires */ + int c_flags; /* state of this entry */ +}; + +#define CALLOUT_PENDING 0x0002 /* callout is on the queue */ +#define CALLOUT_FIRED 0x0004 /* callout has fired */ +#define CALLOUT_INVOKING 0x0008 /* callout function is being invoked */ + +#define CALLOUT_INITIALIZER_SETFUNC(func, arg) \ + { {{NULL}, {NULL}}, func, arg, 0, 0 } + +#define CALLOUT_INITIALIZER CALLOUT_INITIALIZER_SETFUNC(NULL, NULL) + +#ifdef _KERNEL +void callout_startup(void); +void callout_init(struct callout *); +void callout_setfunc(struct callout *, void (*)(void *), void *); +void callout_reset(struct callout *, int, void (*)(void *), void *); +void callout_schedule(struct callout *, int); +void callout_stop(struct callout *); +int callout_hardclock(void); + +#define callout_setfunc(c, f, a) \ +do { \ + (c)->c_func = (f); \ + (c)->c_arg = (a); \ +} while (/*CONSTCOND*/0) + +#define callout_pending(c) ((c)->c_flags & CALLOUT_PENDING) +#define callout_expired(c) ((c)->c_flags & CALLOUT_FIRED) +#define callout_active(c) ((c)->c_flags & (CALLOUT_PENDING|CALLOUT_FIRED)) +#define callout_invoking(c) ((c)->c_flags & CALLOUT_INVOKING) +#define callout_ack(c) ((c)->c_flags &= ~CALLOUT_INVOKING) +#endif /* _KERNEL */ + +#endif /* !_SYS_CALLOUT_H_ */ diff --git a/StdLib/Include/sys/cdefs_aout.h b/StdLib/Include/sys/cdefs_aout.h new file mode 100644 index 0000000000..ce4ca06193 --- /dev/null +++ b/StdLib/Include/sys/cdefs_aout.h @@ -0,0 +1,136 @@ +/* $NetBSD: cdefs_aout.h,v 1.20 2006/05/18 17:55:38 christos Exp $ */ + +/* + * Written by J.T. Conklin 01/17/95. + * Public domain. + */ + +#ifndef _SYS_CDEFS_AOUT_H_ +#define _SYS_CDEFS_AOUT_H_ + +#define _C_LABEL(x) __CONCAT(_,x) +#define _C_LABEL_STRING(x) "_"x + +#if __STDC__ +#define ___RENAME(x) __asm(___STRING(_C_LABEL(x))) +#else +#define ___RENAME(x) ____RENAME(_/**/x) +#define ____RENAME(x) __asm(___STRING(x)) +#endif + +#define __indr_reference(sym,alias) /* nada, since we do weak refs */ + +#ifdef __GNUC__ +#if __STDC__ + #ifndef DONT_USE_STRONG_WEAK_ALIAS +#define __strong_alias(alias,sym) \ + __asm(".global " _C_LABEL_STRING(#alias) "\n" \ + _C_LABEL_STRING(#alias) " = " _C_LABEL_STRING(#sym)); +#define __weak_alias(alias,sym) \ + __asm(".weak " _C_LABEL_STRING(#alias) "\n" \ + _C_LABEL_STRING(#alias) " = " _C_LABEL_STRING(#sym)); + +/* Do not use __weak_extern, use __weak_reference instead */ +#define __weak_extern(sym) \ + __asm(".weak " _C_LABEL_STRING(#sym)); + +#if __GNUC_PREREQ__(4, 0) +#define __weak_reference(sym) __attribute__((__weakref__)) +#else +#define __weak_reference(sym) ; __asm(".weak " _C_LABEL_STRING(#sym)) +#endif + +#define __warn_references(sym,msg) \ + __asm(".stabs \"" msg "\",30,0,0,0"); \ + __asm(".stabs \"_" #sym "\",1,0,0,0"); + #else + #define __strong_alias(alias,sym) /* NOTHING */ + #define __weak_alias(alias,sym) /* NOTHING */ + #define __weak_extern(sym) /* NOTHING */ + #define __weak_reference(sym) /* NOTHING */ + + #define __warn_references(sym,msg) \ + __asm(".stabs \"" msg "\",30,0,0,0"); \ + __asm(".stabs \"_" #sym "\",1,0,0,0"); + #endif +#else /* __STDC__ */ +#define __weak_alias(alias,sym) ___weak_alias(_/**/alias,_/**/sym) +#define ___weak_alias(alias,sym) \ + __asm(".weak alias\nalias = sym"); +/* Do not use __weak_extern, use __weak_reference instead */ +#define __weak_extern(sym) ___weak_extern(_/**/sym) +#define ___weak_extern(sym) \ + __asm(".weak sym"); + +#if __GNUC_PREREQ__(4, 0) +#define __weak_reference(sym) __attribute__((__weakref__)) +#else +#define ___weak_reference(sym) ; __asm(".weak sym"); +#define __weak_reference(sym) ___weak_reference(_/**/sym) +#endif + +#define __warn_references(sym,msg) \ + __asm(".stabs msg,30,0,0,0"); \ + __asm(".stabs \"_/**/sym\",1,0,0,0"); +#endif /* __STDC__ */ +#else /* __GNUC__ */ +#define __warn_references(sym,msg) +#endif /* __GNUC__ */ + +#if defined(__sh__) /* XXX SH COFF */ +#undef __indr_reference(sym,alias) +#undef __warn_references(sym,msg) +#define __warn_references(sym,msg) +#endif + +#define __IDSTRING(_n,_s) \ + __asm(".data ; .asciz \"" _s "\" ; .text") + +#undef __KERNEL_RCSID + +#define __RCSID(_s) __IDSTRING(rcsid,_s) +#define __SCCSID(_s) +#define __SCCSID2(_s) +#if 0 /* XXX userland __COPYRIGHTs have \ns in them */ +#define __COPYRIGHT(_s) __IDSTRING(copyright,_s) +#else +#define __COPYRIGHT(_s) \ + static const char copyright[] __attribute__((__unused__)) = _s +#endif + +#if defined(USE_KERNEL_RCSIDS) || !defined(_KERNEL) +#define __KERNEL_RCSID(_n,_s) __IDSTRING(__CONCAT(rcsid,_n),_s) +#else +#define __KERNEL_RCSID(_n,_s) +#endif +#define __KERNEL_SCCSID(_n,_s) +#define __KERNEL_COPYRIGHT(_n, _s) __IDSTRING(__CONCAT(copyright,_n),_s) + +#ifndef __lint__ +#define __link_set_make_entry(set, sym, type) \ + static void const * const \ + __link_set_##set##_sym_##sym __used = &sym; \ + __asm(".stabs \"___link_set_" #set "\", " #type ", 0, 0, _" #sym) +#else +#define __link_set_make_entry(set, sym, type) \ + extern void const * const __link_set_##set##_sym_##sym +#endif /* __lint__ */ + +#define __link_set_add_text(set, sym) __link_set_make_entry(set, sym, 23) +#define __link_set_add_rodata(set, sym) __link_set_make_entry(set, sym, 23) +#define __link_set_add_data(set, sym) __link_set_make_entry(set, sym, 25) +#define __link_set_add_bss(set, sym) __link_set_make_entry(set, sym, 27) + +#define __link_set_decl(set, ptype) \ +extern struct { \ + int __ls_length; \ + ptype *__ls_items[1]; \ +} __link_set_##set + +#define __link_set_start(set) (&(__link_set_##set).__ls_items[0]) +#define __link_set_end(set) \ + (&(__link_set_##set).__ls_items[(__link_set_##set).__ls_length]) + +#define __link_set_count(set) ((__link_set_##set).__ls_length) + +#endif /* !_SYS_CDEFS_AOUT_H_ */ diff --git a/StdLib/Include/sys/dirent.h b/StdLib/Include/sys/dirent.h new file mode 100644 index 0000000000..1d5f91185f --- /dev/null +++ b/StdLib/Include/sys/dirent.h @@ -0,0 +1,90 @@ +/** @file + Declarations pertaining to directory entries under the UEFI environment. + + The information is based upon the EFI_FILE_INFO structure + in MdePkg/Include/Guid/FileInfo.h. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1989, 1993 + The Regents of the University of California. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + @(#)dirent.h 8.3 (Berkeley) 8/10/94 + NetBSD: dirent.h,v 1.23 2005/12/26 18:41:36 perry Exp +**/ + +#ifndef _SYS_DIRENT_H_ +#define _SYS_DIRENT_H_ + +#include +#include + +#define MAXNAMLEN 511 + +/* + * The dirent structure defines the format of directory entries returned by + * read(fd, ...) when fd refers to a directory. + * + * All names are wide characters and are guaranteed to be null terminated. + * The maximum length of a name in a directory is MAXNAMLEN. + */ +struct dirent { + UINT64 Size; // Size of this dirent structure instance, + // including the Null-terminated FileName string. + UINT64 FileSize; // The size of the file in bytes. + UINT64 PhysicalSize; // The amount of physical space the file consumes + // on the file system volume. + UINT64 Attribute; // The time the file was created. + timespec CreateTime; // The time when the file was last accessed. + timespec LastAccessTime; // The time when the file’s contents were last modified. + timespec ModificationTime; // The attribute bits for the file. See below. + CHAR16 FileName[]; // The Null-terminated name of the file. +}; + +/* + * File Attributes + */ +#define DT_UNKNOWN 0 +#define DT_READ_ONLY 0x0000000000000001 +#define DT_HIDDEN 0x0000000000000002 +#define DT_SYSTEM 0x0000000000000004 +#define DT_RESERVED 0x0000000000000008 +#define DT_DIRECTORY 0x0000000000000010 +#define DT_ARCHIVE 0x0000000000000020 +#define DT_CHR 0x0000000000010000 // File attaches to a character device +#define DT_BLK 0x0000000000020000 // File attaches to a block device +#define DT_SOCKET 0x0000000000030000 // File attaches to a socket +#define DT_VALID_ATTR 0x0000000000030037 // Mask for valid attribute bits + +#endif /* !_SYS_DIRENT_H_ */ diff --git a/StdLib/Include/sys/endian.h b/StdLib/Include/sys/endian.h new file mode 100644 index 0000000000..dfe013fa40 --- /dev/null +++ b/StdLib/Include/sys/endian.h @@ -0,0 +1,309 @@ +/** @file + Byte order related definitions and declarations. + + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: endian.h,v 1.24 2006/05/05 15:08:11 christos Exp + endian.h 8.1 (Berkeley) 6/11/93 +**/ +#ifndef _SYS_ENDIAN_H_ +#define _SYS_ENDIAN_H_ + +#include + +/* + * Definitions for byte order, according to byte significance from low + * address to high. + */ +#define _LITTLE_ENDIAN 1234 /* LSB first: i386, vax */ +#define _BIG_ENDIAN 4321 /* MSB first: 68000, ibm, net */ +#define _PDP_ENDIAN 3412 /* LSB first in word, MSW first in long */ + + +#if defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE) +#ifndef _LOCORE + +/* C-family endian-ness definitions */ + +#include +#include + +#ifndef in_addr_t +typedef __in_addr_t in_addr_t; +#define in_addr_t __in_addr_t +#endif + +#ifndef in_port_t +typedef __in_port_t in_port_t; +#define in_port_t __in_port_t +#endif + +__BEGIN_DECLS +uint32_t htonl(uint32_t) __attribute__((__const__)); +uint16_t htons(uint16_t) __attribute__((__const__)); +uint32_t ntohl(uint32_t) __attribute__((__const__)); +uint16_t ntohs(uint16_t) __attribute__((__const__)); +__END_DECLS + +#endif /* !_LOCORE */ +#endif /* _XOPEN_SOURCE || _NETBSD_SOURCE */ + + +#include + +/* + * Define the order of 32-bit words in 64-bit words. + */ +#if _BYTE_ORDER == _LITTLE_ENDIAN +#define _QUAD_HIGHWORD 1 +#define _QUAD_LOWWORD 0 +#endif + +#if _BYTE_ORDER == _BIG_ENDIAN +#define _QUAD_HIGHWORD 0 +#define _QUAD_LOWWORD 1 +#endif + + +#if defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE) +/* + * Traditional names for byteorder. These are defined as the numeric + * sequences so that third party code can "#define XXX_ENDIAN" and not + * cause errors. + */ +#define LITTLE_ENDIAN 1234 /* LSB first: i386, vax */ +#define BIG_ENDIAN 4321 /* MSB first: 68000, ibm, net */ +#define PDP_ENDIAN 3412 /* LSB first in word, MSW first in long */ +#define BYTE_ORDER _BYTE_ORDER + +#ifndef _LOCORE + +#include + +/* + * Macros for network/external number representation conversion. + */ +#if BYTE_ORDER == BIG_ENDIAN && !defined(__lint__) +#define ntohl(x) (x) +#define ntohs(x) (x) +#define htonl(x) (x) +#define htons(x) (x) + +#define NTOHL(x) (void) (x) +#define NTOHS(x) (void) (x) +#define HTONL(x) (void) (x) +#define HTONS(x) (void) (x) + +#else /* LITTLE_ENDIAN || !defined(__lint__) */ + +#define ntohl(x) bswap32((uint32_t)(x)) +#define ntohs(x) bswap16((uint16_t)(x)) +#define htonl(x) bswap32((uint32_t)(x)) +#define htons(x) bswap16((uint16_t)(x)) + +#define NTOHL(x) (x) = ntohl((uint32_t)(x)) +#define NTOHS(x) (x) = ntohs((uint16_t)(x)) +#define HTONL(x) (x) = htonl((uint32_t)(x)) +#define HTONS(x) (x) = htons((uint16_t)(x)) +#endif /* LITTLE_ENDIAN || !defined(__lint__) */ + +/* + * Macros to convert to a specific endianness. + */ + +#if BYTE_ORDER == BIG_ENDIAN + +#define htobe16(x) (x) +#define htobe32(x) (x) +#define htobe64(x) (x) +#define htole16(x) bswap16((uint16_t)(x)) +#define htole32(x) bswap32((uint32_t)(x)) +#define htole64(x) bswap64((uint64_t)(x)) + +#define HTOBE16(x) (void) (x) +#define HTOBE32(x) (void) (x) +#define HTOBE64(x) (void) (x) +#define HTOLE16(x) (x) = bswap16((uint16_t)(x)) +#define HTOLE32(x) (x) = bswap32((uint32_t)(x)) +#define HTOLE64(x) (x) = bswap64((uint64_t)(x)) + +#else /* LITTLE_ENDIAN */ + +#define htobe16(x) bswap16((uint16_t)(x)) +#define htobe32(x) bswap32((uint32_t)(x)) +#define htobe64(x) bswap64((uint64_t)(x)) +#define htole16(x) (x) +#define htole32(x) (x) +#define htole64(x) (x) + +#define HTOBE16(x) (x) = bswap16((uint16_t)(x)) +#define HTOBE32(x) (x) = bswap32((uint32_t)(x)) +#define HTOBE64(x) (x) = bswap64((uint64_t)(x)) +#define HTOLE16(x) (void) (x) +#define HTOLE32(x) (void) (x) +#define HTOLE64(x) (void) (x) + +#endif /* LITTLE_ENDIAN */ + +#define be16toh(x) htobe16(x) +#define be32toh(x) htobe32(x) +#define be64toh(x) htobe64(x) +#define le16toh(x) htole16(x) +#define le32toh(x) htole32(x) +#define le64toh(x) htole64(x) + +#define BE16TOH(x) HTOBE16(x) +#define BE32TOH(x) HTOBE32(x) +#define BE64TOH(x) HTOBE64(x) +#define LE16TOH(x) HTOLE16(x) +#define LE32TOH(x) HTOLE32(x) +#define LE64TOH(x) HTOLE64(x) + +/* + * Routines to encode/decode big- and little-endian multi-octet values + * to/from an octet stream. + */ + +static __inline void __unused +be16enc(void *buf, uint16_t u) +{ + uint8_t *p = (uint8_t *)buf; + + p[0] = (uint8_t)(((unsigned)u >> 8) & 0xff); + p[1] = (uint8_t)(u & 0xff); +} + +static __inline void __unused +le16enc(void *buf, uint16_t u) +{ + uint8_t *p = (uint8_t *)buf; + + p[0] = (uint8_t)(u & 0xff); + p[1] = (uint8_t)(((unsigned)u >> 8) & 0xff); +} + +static __inline uint16_t __unused +be16dec(const void *buf) +{ + const uint8_t *p = (const uint8_t *)buf; + + return ((p[0] << 8) | p[1]); +} + +static __inline uint16_t __unused +le16dec(const void *buf) +{ + const uint8_t *p = (const uint8_t *)buf; + + return ((p[1] << 8) | p[0]); +} + +static __inline void __unused +be32enc(void *buf, uint32_t u) +{ + uint8_t *p = (uint8_t *)buf; + + p[0] = (uint8_t)((u >> 24) & 0xff); + p[1] = (uint8_t)((u >> 16) & 0xff); + p[2] = (uint8_t)((u >> 8) & 0xff); + p[3] = (uint8_t)(u & 0xff); +} + +static __inline void __unused +le32enc(void *buf, uint32_t u) +{ + uint8_t *p = (uint8_t *)buf; + + p[0] = (uint8_t)(u & 0xff); + p[1] = (uint8_t)((u >> 8) & 0xff); + p[2] = (uint8_t)((u >> 16) & 0xff); + p[3] = (uint8_t)((u >> 24) & 0xff); +} + +static __inline uint32_t __unused +be32dec(const void *buf) +{ + const uint8_t *p = (const uint8_t *)buf; + + return ((p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]); +} + +static __inline uint32_t __unused +le32dec(const void *buf) +{ + const uint8_t *p = (const uint8_t *)buf; + + return ((p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]); +} + +static __inline void __unused +be64enc(void *buf, uint64_t u) +{ + uint8_t *p = (uint8_t *)buf; + + be32enc(p, (uint32_t)(u >> 32)); + be32enc(p + 4, (uint32_t)(u & 0xffffffffULL)); +} + +static __inline void __unused +le64enc(void *buf, uint64_t u) +{ + uint8_t *p = (uint8_t *)buf; + + le32enc(p, (uint32_t)(u & 0xffffffffULL)); + le32enc(p + 4, (uint32_t)(u >> 32)); +} + +static __inline uint64_t __unused +be64dec(const void *buf) +{ + const uint8_t *p = (const uint8_t *)buf; + + return (((uint64_t)be32dec(p) << 32) | be32dec(p + 4)); +} + +static __inline uint64_t __unused +le64dec(const void *buf) +{ + const uint8_t *p = (const uint8_t *)buf; + + return (le32dec(p) | ((uint64_t)le32dec(p + 4) << 32)); +} + +#endif /* !_LOCORE */ +#endif /* _XOPEN_SOURCE || _NETBSD_SOURCE */ +#endif /* !_SYS_ENDIAN_H_ */ diff --git a/StdLib/Include/sys/errno.h b/StdLib/Include/sys/errno.h new file mode 100644 index 0000000000..3662c8d441 --- /dev/null +++ b/StdLib/Include/sys/errno.h @@ -0,0 +1,151 @@ +/** @file + The header defines several values, all relating to the reporting of + error conditions. + + The enum members expand to integral constant expressions + with distinct nonzero values, suitable for use in #if preprocessing + directives. + + Copyright (c) 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifdef _ERRNO_H // May only be included from +#ifndef _SYS_ERRNO_H +#define _SYS_ERRNO_H + +/* Define the error numbers, sequentially, beginning at 1. */ +enum { + __EMINERRORVAL = 1, /* The lowest valid error value */ + __EPERM = __EMINERRORVAL, /* 1 Operation not permitted */ + __ENOENT, /* 2 No such file or directory */ + __ESRCH, /* 3 No such process */ + __EINTR, /* 4 Interrupted system call */ + __EIO, /* 5 Input/output error */ + __ENXIO, /* 6 Device not configured */ + __E2BIG, /* 7 Argument list too long */ + __ENOEXEC, /* 8 Exec format error */ + __EBADF, /* 9 Bad file descriptor */ + __ECHILD, /* 10 No child processes */ + __EDEADLK, /* 11 Resource deadlock avoided */ + __ENOMEM, /* 12 Cannot allocate memory */ + __EACCES, /* 13 Permission denied */ + __EFAULT, /* 14 Bad address */ + __ENOTBLK, /* 15 Block device required */ + __EBUSY, /* 16 Device busy */ + __EEXIST, /* 17 File exists */ + __EXDEV, /* 18 Cross-device link */ + __ENODEV, /* 19 Operation not supported by device */ + __ENOTDIR, /* 20 Not a directory */ + __EISDIR, /* 21 Is a directory */ + __EINVAL, /* 22 Invalid argument */ + __ENFILE, /* 23 Too many open files in system */ + __EMFILE, /* 24 Too many open file descriptors */ + __ENOTTY, /* 25 Inappropriate ioctl for device */ + __ETXTBSY, /* 26 Text file busy */ + __EFBIG, /* 27 File too large */ + __ENOSPC, /* 28 No space left on device */ + __ESPIPE, /* 29 Illegal seek */ + __EROFS, /* 30 Read-only filesystem */ + __EMLINK, /* 31 Too many links */ + __EPIPE, /* 32 Broken pipe */ + + /* math software -- these are the only two values required by the C Standard */ + __EDOM, /* 33 Numerical argument out of domain */ + __ERANGE, /* 34 Result too large */ + + /* non-blocking and interrupt i/o */ + __EAGAIN, /* 35 Resource temporarily unavailable */ + __EWOULDBLOCK = __EAGAIN, /* 35 Operation would block */ + __EINPROGRESS, /* 36 Operation now in progress */ + __EALREADY, /* 37 Operation already in progress */ + + /* ipc/network software -- argument errors */ + __ENOTSOCK, /* 38 Socket operation on non-socket */ + __EDESTADDRREQ, /* 39 Destination address required */ + __EMSGSIZE, /* 40 Message too long */ + __EPROTOTYPE, /* 41 Protocol wrong type for socket */ + __ENOPROTOOPT, /* 42 Protocol not available */ + __EPROTONOSUPPORT, /* 43 Protocol not supported */ + __ESOCKTNOSUPPORT, /* 44 Socket type not supported */ + __EOPNOTSUPP, /* 45 Operation not supported */ + __ENOTSUP = __EOPNOTSUPP, /* 45 Operation not supported */ + __EPFNOSUPPORT, /* 46 Protocol family not supported */ + __EAFNOSUPPORT, /* 47 Address family not supported by protocol family */ + __EADDRINUSE, /* 48 Address already in use */ + __EADDRNOTAVAIL, /* 49 Can't assign requested address */ + + /* ipc/network software -- operational errors */ + __ENETDOWN, /* 50 Network is down */ + __ENETUNREACH, /* 51 Network is unreachable */ + __ENETRESET, /* 52 Network dropped connection on reset */ + __ECONNABORTED, /* 53 Software caused connection abort */ + __ECONNRESET, /* 54 Connection reset by peer */ + __ENOBUFS, /* 55 No buffer space available */ + __EISCONN, /* 56 Socket is already connected */ + __ENOTCONN, /* 57 Socket is not connected */ + __ESHUTDOWN, /* 58 Can't send after socket shutdown */ + __ETOOMANYREFS, /* 59 Too many references: can't splice */ + __ETIMEDOUT, /* 60 Operation timed out */ + __ECONNREFUSED, /* 61 Connection refused */ + __ELOOP, /* 62 Too many levels of symbolic links */ + __ENAMETOOLONG, /* 63 File name too long */ + __EHOSTDOWN, /* 64 Host is down */ + __EHOSTUNREACH, /* 65 No route to host */ + + __ENOTEMPTY, /* 66 Directory not empty */ + + /* quotas, etc. */ + __EPROCLIM, /* 67 Too many processes */ + __EUSERS, /* 68 Too many users */ + __EDQUOT, /* 69 Disc quota exceeded */ + + /* Network File System */ + __ESTALE, /* 70 Stale NFS file handle */ + __EREMOTE, /* 71 Too many levels of remote in path */ + __EBADRPC, /* 72 RPC struct is bad */ + __ERPCMISMATCH, /* 73 RPC version wrong */ + __EPROGUNAVAIL, /* 74 RPC prog. not avail */ + __EPROGMISMATCH, /* 75 Program version wrong */ + __EPROCUNAVAIL, /* 76 Bad procedure for program */ + __ENOLCK, /* 77 No locks available */ + __ENOSYS, /* 78 Function not implemented */ + __EFTYPE, /* 79 Inappropriate file type or format */ + __EAUTH, /* 80 Authentication error */ + __ENEEDAUTH, /* 81 Need authenticator */ + __EIDRM, /* 82 Identifier removed */ + __ENOMSG, /* 83 No message of desired type */ + __EOVERFLOW, /* 84 Value too large to be stored in data type */ + __EILSEQ, /* 85 Illegal byte sequence */ + __ENOTHING_1, /* 86 Place Holder */ + __ECANCELED, /* 87 Operation canceled */ + + __EBADMSG, /* 88 Bad message */ + __ENODATA, /* 89 No message available */ + __ENOSR, /* 90 No STREAM resources */ + __ENOSTR, /* 91 Not a STREAM */ + __ETIME, /* 92 STREAM ioctl timeout */ + + __ENOATTR, /* 93 Attribute not found */ + + __EDOOFUS, /* 94 Programming error */ + + __EMULTIHOP, /* 95 Multihop attempted */ + __ENOLINK, /* 96 Link has been severed */ + __EPROTO, /* 97 Protocol error */ + + __EBUFSIZE, /* 98 Buffer too small to hold result */ + + __EMAXERRORVAL /* One more than the highest defined error value. */ +}; + +#endif /* _SYS_ERRNO_H */ +#else /* not defined _ERRNO_H */ +#error must only be included by . +#endif /* _ERRNO_H */ diff --git a/StdLib/Include/sys/fcntl.h b/StdLib/Include/sys/fcntl.h new file mode 100644 index 0000000000..cd720c03d9 --- /dev/null +++ b/StdLib/Include/sys/fcntl.h @@ -0,0 +1,150 @@ +/** @file + This file includes the definitions for open and fcntl described by POSIX + for ; it also includes related kernel definitions. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made + available under the terms and conditions of the BSD License which + accompanies this distribution. The full text of the license may be found + at http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1983, 1990, 1993 + The Regents of the University of California. All rights reserved. + (c) UNIX System Laboratories, Inc. + All or some portions of this file are derived from material licensed + to the University of California by American Telephone and Telegraph + Co. or Unix System Laboratories, Inc. and are reproduced herein with + the permission of UNIX System Laboratories, Inc. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + fcntl.h 8.3 (Berkeley) 1/21/94 + NetBSD: fcntl.h,v 1.34 2006/10/05 14:48:33 chs Exp + */ +#ifndef _SYS_FCNTL_H_ +#define _SYS_FCNTL_H_ + +#include +#include + +#include + +/* + * File status flags: these are used by open(2), fcntl(2). + * They are also used (indirectly) in the kernel file structure f_flags, + * which is a superset of the open/fcntl flags. Open flags and f_flags + * are inter-convertible using OFLAGS(fflags) and FFLAGS(oflags). + * Open/fcntl flags begin with O_; kernel-internal flags begin with F. + */ +/* open-only flags */ +#define O_RDONLY 0x00000000 /* open for reading only */ +#define O_WRONLY 0x00000001 /* open for writing only */ +#define O_RDWR 0x00000002 /* open for reading and writing */ +#define O_ACCMODE 0x00000003 /* mask for above modes */ + +/* + * Kernel encoding of open mode; separate read and write bits that are + * independently testable: 1 greater than the above. + * + * XXX + * FREAD and FWRITE are excluded from the #ifdef _KERNEL so that TIOCFLUSH, + * which was documented to use FREAD/FWRITE, continues to work. + */ +#define FREAD 0x00000001 +#define FWRITE 0x00000002 +#define O_NONBLOCK 0x00000004 /* no delay */ +#define O_APPEND 0x00000008 /* set append mode */ +#define O_CREAT 0x00000200 /* create if nonexistent */ +#define O_TRUNC 0x00000400 /* truncate to zero length */ +#define O_EXCL 0x00000800 /* error if already exists */ + +//#define O_DIRECT 0x00080000 /* direct I/O hint */ + +#define O_SETMASK 0x0000000F /* Flags modifiable by F_SETFD (fcntl) */ + +/* + * Constants used for fcntl(2) + */ + +/* command values */ +#define F_DUPFD 0 /* duplicate file descriptor */ +#define F_GETFD 1 /* get file descriptor flags */ +#define F_SETFD 2 /* set file descriptor flags */ +#define F_GETFL 3 /* get file status flags */ +#define F_SETFL 4 /* set file status flags */ +#define F_GETOWN 5 /* get SIGIO/SIGURG proc/pgrp */ +#define F_SETOWN 6 /* set SIGIO/SIGURG proc/pgrp */ +#define F_GETLK 7 /* get record locking information */ +#define F_SETLK 8 /* set record locking information */ +#define F_SETLKW 9 /* F_SETLK; wait if blocked */ +#define F_CLOSEM 10 /* close all fds >= to the one given */ +#define F_MAXFD 11 /* return the max open fd */ + +/* file descriptor flags (F_GETFD, F_SETFD) */ +#define FD_CLOEXEC 1 /* close-on-exec flag */ + +/* record locking flags (F_GETLK, F_SETLK, F_SETLKW) */ +#define F_RDLCK 1 /* shared or read lock */ +#define F_UNLCK 2 /* unlock */ +#define F_WRLCK 3 /* exclusive or write lock */ + +/* Constants for fcntl's passed to the underlying fs - like ioctl's. */ +#define F_PARAM_MASK 0xfff +#define F_PARAM_LEN(x) (((x) >> 16) & F_PARAM_MASK) +#define F_PARAM_MAX 4095 +#define F_FSCTL (int)0x80000000 /* This fcntl goes to the fs */ +#define F_FSVOID (int)0x40000000 /* no parameters */ +#define F_FSOUT (int)0x20000000 /* copy out parameter */ +#define F_FSIN (int)0x10000000 /* copy in parameter */ +#define F_FSINOUT (F_FSIN | F_FSOUT) +#define F_FSDIRMASK (int)0x70000000 /* mask for IN/OUT/VOID */ +#define F_FSPRIV (int)0x00008000 /* command is fs-specific */ + +/* Always ensure that these are consistent with and ! */ +#ifndef SEEK_SET + #define SEEK_SET 0 /* set file offset to offset */ +#endif +#ifndef SEEK_CUR + #define SEEK_CUR 1 /* set file offset to current plus offset */ +#endif +#ifndef SEEK_END + #define SEEK_END 2 /* set file offset to EOF plus offset */ +#endif + +#include + +__BEGIN_DECLS +#ifndef __FCNTL_SYSCALLS_DECLARED + #define __FCNTL_SYSCALLS_DECLARED + int open(const char *, int, int ); + int creat(const char *, mode_t); + int fcntl(int, int, ...); +#endif // __FCNTL_SYSCALLS_DECLARED +__END_DECLS + +#endif /* !_SYS_FCNTL_H_ */ diff --git a/StdLib/Include/sys/fd_set.h b/StdLib/Include/sys/fd_set.h new file mode 100644 index 0000000000..acbfbf0c9a --- /dev/null +++ b/StdLib/Include/sys/fd_set.h @@ -0,0 +1,107 @@ +/* $NetBSD: fd_set.h,v 1.2 2005/12/11 12:25:20 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)types.h 8.4 (Berkeley) 1/21/94 + */ + +#ifndef _SYS_FD_SET_H_ +#define _SYS_FD_SET_H_ + +#include +#include + +/* + * Implementation dependent defines, hidden from user space. X/Open does not + * specify them. + */ +#define __NBBY 8 /* number of bits in a byte */ +typedef __int32_t __fd_mask; + +/* bits per mask */ +#define __NFDBITS ((unsigned int)sizeof(__fd_mask) * __NBBY) + +#define __howmany(x, y) (((x) + ((y) - 1)) / (y)) + +/* + * Select uses bit masks of file descriptors in longs. These macros + * manipulate such bit fields (the filesystem macros use chars). + * FD_SETSIZE may be defined by the user, but the default here should + * be enough for most uses. + */ +#ifndef FD_SETSIZE +#define FD_SETSIZE 256 +#endif + +typedef struct fd_set { + __fd_mask fds_bits[__howmany(FD_SETSIZE, __NFDBITS)]; +} fd_set; + +#define FD_SET(n, p) \ + ((p)->fds_bits[(n)/__NFDBITS] |= (1 << ((n) % __NFDBITS))) +#define FD_CLR(n, p) \ + ((p)->fds_bits[(n)/__NFDBITS] &= ~(1 << ((n) % __NFDBITS))) +#define FD_ISSET(n, p) \ + ((p)->fds_bits[(n)/__NFDBITS] & (1 << ((n) % __NFDBITS))) +#if __GNUC_PREREQ__(2, 95) +#define FD_ZERO(p) (void)__builtin_memset((p), 0, sizeof(*(p))) +#else +#define FD_ZERO(p) do { \ + fd_set *__fds = (p); \ + unsigned int __i; \ + for (__i = 0; __i < __howmany(FD_SETSIZE, __NFDBITS); __i++) \ + __fds->fds_bits[__i] = 0; \ + } while (/* CONSTCOND */ 0) +#endif /* GCC 2.95 */ + +/* + * Expose our internals if we are not required to hide them. + */ +#if defined(_NETBSD_SOURCE) + +#define fd_mask __fd_mask +#define NFDBITS __NFDBITS +#ifndef howmany +#define howmany(a, b) __howmany(a, b) +#endif + +#if __GNUC_PREREQ__(2, 95) +#define FD_COPY(f, t) (void)__builtin_memcpy((t), (f), sizeof(*(f))) +#else +#define FD_COPY(f, t) do { \ + fd_set *__f = (f), *__t = (t); \ + unsigned int __i; \ + for (__i = 0; __i < __howmany(FD_SETSIZE, __NFDBITS); __i++) \ + __t->fds_bits[__i] = __f->fds_bits[__i]; \ + } while (/* CONSTCOND */ 0) +#endif /* GCC 2.95 */ + +#endif /* _NETBSD_SOURCE */ + +#endif /* _SYS_FD_SET_H_ */ diff --git a/StdLib/Include/sys/featuretest.h b/StdLib/Include/sys/featuretest.h new file mode 100644 index 0000000000..f36396af17 --- /dev/null +++ b/StdLib/Include/sys/featuretest.h @@ -0,0 +1,73 @@ +/* $NetBSD: featuretest.h,v 1.8 2005/12/11 12:25:20 christos Exp $ */ + +/* + * Written by Klaus Klein , February 2, 1998. + * Public domain. + * + * NOTE: Do not protect this header against multiple inclusion. Doing + * so can have subtle side-effects due to header file inclusion order + * and testing of e.g. _POSIX_SOURCE vs. _POSIX_C_SOURCE. Instead, + * protect each CPP macro that we want to supply. + */ + +/* + * Feature-test macros are defined by several standards, and allow an + * application to specify what symbols they want the system headers to + * expose, and hence what standard they want them to conform to. + * There are two classes of feature-test macros. The first class + * specify complete standards, and if one of these is defined, header + * files will try to conform to the relevant standard. They are: + * + * ANSI macros: + * _ANSI_SOURCE ANSI C89 + * + * POSIX macros: + * _POSIX_SOURCE == 1 IEEE Std 1003.1 (version?) + * _POSIX_C_SOURCE == 1 IEEE Std 1003.1-1990 + * _POSIX_C_SOURCE == 2 IEEE Std 1003.2-1992 + * _POSIX_C_SOURCE == 199309L IEEE Std 1003.1b-1993 + * _POSIX_C_SOURCE == 199506L ISO/IEC 9945-1:1996 + * _POSIX_C_SOURCE == 200112L IEEE Std 1003.1-2001 + * + * X/Open macros: + * _XOPEN_SOURCE System Interfaces and Headers, Issue 4, Ver 2 + * _XOPEN_SOURCE_EXTENDED == 1 XSH4.2 UNIX extensions + * _XOPEN_SOURCE == 500 System Interfaces and Headers, Issue 5 + * _XOPEN_SOURCE == 520 Networking Services (XNS), Issue 5.2 + * _XOPEN_SOURCE == 600 IEEE Std 1003.1-2001, XSI option + * + * NetBSD macros: + * _NETBSD_SOURCE == 1 Make all NetBSD features available. + * + * If more than one of these "major" feature-test macros is defined, + * then the set of facilities provided (and namespace used) is the + * union of that specified by the relevant standards, and in case of + * conflict, the earlier standard in the above list has precedence (so + * if both _POSIX_C_SOURCE and _NETBSD_SOURCE are defined, the version + * of rename() that's used is the POSIX one). If none of the "major" + * feature-test macros is defined, _NETBSD_SOURCE is assumed. + * + * There are also "minor" feature-test macros, which enable extra + * functionality in addition to some base standard. They should be + * defined along with one of the "major" macros. The "minor" macros + * are: + * + * _REENTRANT + * _ISOC99_SOURCE + * _LARGEFILE_SOURCE Large File Support + * + */ + +#if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE) +#define _POSIX_C_SOURCE 1L +#endif + +#if !defined(_ANSI_SOURCE) && !defined(_POSIX_C_SOURCE) && \ + !defined(_XOPEN_SOURCE) && !defined(_NETBSD_SOURCE) +#define _NETBSD_SOURCE 1 +#endif + +#if ((_POSIX_C_SOURCE - 0) >= 199506L || (_XOPEN_SOURCE - 0) >= 500) && \ + !defined(_REENTRANT) +#define _REENTRANT +#endif diff --git a/StdLib/Include/sys/filio.h b/StdLib/Include/sys/filio.h new file mode 100644 index 0000000000..65f34bcb5c --- /dev/null +++ b/StdLib/Include/sys/filio.h @@ -0,0 +1,62 @@ +/* $NetBSD: filio.h,v 1.10 2005/12/11 12:25:20 christos Exp $ */ + +/*- + * Copyright (c) 1982, 1986, 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)filio.h 8.1 (Berkeley) 3/28/94 + */ + +#ifndef _SYS_FILIO_H_ +#define _SYS_FILIO_H_ + +#include + +/* Generic file-descriptor ioctl's. */ +#define FIOCLEX _IO('f', 1) /* set close on exec on fd */ +#define FIONCLEX _IO('f', 2) /* remove close on exec */ +#define FIONREAD _IOR('f', 127, int) /* get # bytes to read */ +#define FIONBIO _IOW('f', 126, int) /* set/clear non-blocking i/o */ +#define FIOASYNC _IOW('f', 125, int) /* set/clear async i/o */ +#define FIOSETOWN _IOW('f', 124, int) /* set owner */ +#define FIOGETOWN _IOR('f', 123, int) /* get owner */ +#define OFIOGETBMAP _IOWR('f', 122, uint32_t) /* get underlying block no. */ +#define FIOGETBMAP _IOWR('f', 122, daddr_t) /* get underlying block no. */ +#define FIONWRITE _IOR('f', 121, int) /* get # bytes outstanding + * in send queue. */ +#define FIONSPACE _IOR('f', 120, int) /* get space in send queue. */ + + +/* Ugly symbol for compatibility with other operating systems */ +#define FIBMAP FIOGETBMAP + +#endif /* !_SYS_FILIO_H_ */ diff --git a/StdLib/Include/sys/float_ieee754.h b/StdLib/Include/sys/float_ieee754.h new file mode 100644 index 0000000000..1c8cfdeddb --- /dev/null +++ b/StdLib/Include/sys/float_ieee754.h @@ -0,0 +1,99 @@ +/* $NetBSD: float_ieee754.h,v 1.8 2005/12/11 12:25:20 christos Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)float.h 8.1 (Berkeley) 6/10/93 + */ + +/* + * NOTICE: This is not a standalone file. To use it, #include it in + * your port's float.h header. + */ + +#ifndef _SYS_FLOAT_IEEE754_H_ +#define _SYS_FLOAT_IEEE754_H_ + +#include +#include + +#ifndef FLT_ROUNDS +__BEGIN_DECLS +extern int __flt_rounds(void); +__END_DECLS +#define FLT_ROUNDS __flt_rounds() +#endif + +#ifndef FLT_EVAL_METHOD +#if __GNUC_PREREQ__(3, 3) +#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__ +#endif /* GCC >= 3.3 */ +#endif /* defined(FLT_EVAL_METHOD) */ + +#define FLT_RADIX 2 /* b */ + +#define FLT_MANT_DIG 24 /* p */ +#define FLT_EPSILON 1.19209290E-7F /* b**(1-p) */ +#define FLT_DIG 6 /* floor((p-1)*log10(b))+(b == 10) */ +#define FLT_MIN_EXP (-125) /* emin */ +#define FLT_MIN 1.17549435E-38F /* b**(emin-1) */ +#define FLT_MIN_10_EXP (-37) /* ceil(log10(b**(emin-1))) */ +#define FLT_MAX_EXP 128 /* emax */ +//#define FLT_MAX 3.40282347e+38F /* (1-b**(-p))*b**emax */ +#define FLT_MAX 3.402823e+38F /* (1-b**(-p))*b**emax */ +#define FLT_MAX_10_EXP 38 /* floor(log10((1-b**(-p))*b**emax)) */ + +#define DBL_MANT_DIG 53 +#define DBL_EPSILON 2.2204460492503131E-16 +#define DBL_DIG 15 +#define DBL_MIN_EXP (-1021) +#define DBL_MIN 2.2250738585072014E-308 +#define DBL_MIN_10_EXP (-307) +#define DBL_MAX_EXP 1024 +#define DBL_MAX 1.7976931348623157E+308 +#define DBL_MAX_10_EXP 308 + +/* + * If no extended-precision type is defined by the machine-dependent + * header including this, default to `long double' being double-precision. + */ +#ifndef LDBL_MANT_DIG + #define LDBL_MANT_DIG DBL_MANT_DIG + #define LDBL_EPSILON DBL_EPSILON + #define LDBL_DIG DBL_DIG + #define LDBL_MIN_EXP DBL_MIN_EXP + #define LDBL_MIN DBL_MIN + #define LDBL_MIN_10_EXP DBL_MIN_10_EXP + #define LDBL_MAX_EXP DBL_MAX_EXP + #define LDBL_MAX DBL_MAX + #define LDBL_MAX_10_EXP DBL_MAX_10_EXP + + #define DECIMAL_DIG 17 /* ceil((1+p*log10(b))-(b==10) */ +#endif /* LDBL_MANT_DIG */ + +#endif /* _SYS_FLOAT_IEEE754_H_ */ diff --git a/StdLib/Include/sys/ieee754.h b/StdLib/Include/sys/ieee754.h new file mode 100644 index 0000000000..740b58eb55 --- /dev/null +++ b/StdLib/Include/sys/ieee754.h @@ -0,0 +1,152 @@ +/* $NetBSD: ieee754.h,v 1.6.24.1 2007/05/07 19:49:10 pavel Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Lawrence Berkeley Laboratory. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ieee.h 8.1 (Berkeley) 6/11/93 + */ +#ifndef _SYS_IEEE754_H_ +#define _SYS_IEEE754_H_ + +/* + * NOTICE: This is not a standalone file. To use it, #include it in + * your port's ieee.h header. + */ + +#include + +/* + * defines the layout of IEEE 754 floating point types. + * Only single-precision and double-precision types are defined here; + * extended types, if available, are defined in the machine-dependent + * header. + */ + +/* + * Define the number of bits in each fraction and exponent. + * + * k k+1 + * Note that 1.0 x 2 == 0.1 x 2 and that denorms are represented + * + * (-exp_bias+1) + * as fractions that look like 0.fffff x 2 . This means that + * + * -126 + * the number 0.10000 x 2 , for instance, is the same as the normalized + * + * -127 -128 + * float 1.0 x 2 . Thus, to represent 2 , we need one leading zero + * + * -129 + * in the fraction; to represent 2 , we need two, and so on. This + * + * (-exp_bias-fracbits+1) + * implies that the smallest denormalized number is 2 + * + * for whichever format we are talking about: for single precision, for + * + * -126 -149 + * instance, we get .00000000000000000000001 x 2 , or 1.0 x 2 , and + * + * -149 == -127 - 23 + 1. + */ +#define SNG_EXPBITS 8 +#define SNG_FRACBITS 23 + +struct ieee_single { +#if _BYTE_ORDER == _BIG_ENDIAN + u_int sng_sign:1; + u_int sng_exp:SNG_EXPBITS; + u_int sng_frac:SNG_FRACBITS; +#else + u_int sng_frac:SNG_FRACBITS; + u_int sng_exp:SNG_EXPBITS; + u_int sng_sign:1; +#endif +}; + +#define DBL_EXPBITS 11 +#define DBL_FRACHBITS 20 +#define DBL_FRACLBITS 32 +#define DBL_FRACBITS (DBL_FRACHBITS + DBL_FRACLBITS) + +struct ieee_double { +#if _BYTE_ORDER == _BIG_ENDIAN + u_int dbl_sign:1; + u_int dbl_exp:DBL_EXPBITS; + u_int dbl_frach:DBL_FRACHBITS; + u_int dbl_fracl:DBL_FRACLBITS; +#else + u_int dbl_fracl:DBL_FRACLBITS; + u_int dbl_frach:DBL_FRACHBITS; + u_int dbl_exp:DBL_EXPBITS; + u_int dbl_sign:1; +#endif +}; + +/* + * Floats whose exponent is in [1..INFNAN) (of whatever type) are + * `normal'. Floats whose exponent is INFNAN are either Inf or NaN. + * Floats whose exponent is zero are either zero (iff all fraction + * bits are zero) or subnormal values. + * + * At least one `signalling NaN' and one `quiet NaN' value must be + * implemented. It is left to the architecture to specify how to + * distinguish between these. + */ +#define SNG_EXP_INFNAN 255 +#define DBL_EXP_INFNAN 2047 + +/* + * Exponent biases. + */ +#define SNG_EXP_BIAS 127 +#define DBL_EXP_BIAS 1023 + +/* + * Convenience data structures. + */ +union ieee_single_u { + float sngu_f; + struct ieee_single sngu_sng; +}; + +union ieee_double_u { + double dblu_d; + struct ieee_double dblu_dbl; +}; +#endif /* _SYS_IEEE754_H_ */ diff --git a/StdLib/Include/sys/inttypes.h b/StdLib/Include/sys/inttypes.h new file mode 100644 index 0000000000..5dc3565f3d --- /dev/null +++ b/StdLib/Include/sys/inttypes.h @@ -0,0 +1,52 @@ +/* $NetBSD: inttypes.h,v 1.4 2001/04/28 15:41:30 kleink Exp $ */ + +/*- + * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Klaus J. Klein. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SYS_INTTYPES_H_ +#define _SYS_INTTYPES_H_ + +/* + * 7.8 Format conversion of integer types + */ + +#include + +#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) +#include +#endif + +#endif /* !_SYS_INTTYPES_H_ */ diff --git a/StdLib/Include/sys/ioccom.h b/StdLib/Include/sys/ioccom.h new file mode 100644 index 0000000000..210c9180d7 --- /dev/null +++ b/StdLib/Include/sys/ioccom.h @@ -0,0 +1,67 @@ +/* $NetBSD: ioccom.h,v 1.8 2005/12/11 12:25:20 christos Exp $ */ + +/*- + * Copyright (c) 1982, 1986, 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ioccom.h 8.3 (Berkeley) 1/9/95 + */ + +#ifndef _SYS_IOCCOM_H_ +#define _SYS_IOCCOM_H_ + +/* + * Ioctl's have the command encoded in the lower word, and the size of + * any in or out parameters in the upper word. The high 3 bits of the + * upper word are used to encode the in/out status of the parameter. + */ +#define IOCPARM_MASK 0x1fff /* parameter length, at most 13 bits */ +#define IOCPARM_LEN(x) (((x) >> 16) & IOCPARM_MASK) +#define IOCBASECMD(x) ((x) & ~(IOCPARM_MASK << 16)) +#define IOCGROUP(x) (((x) >> 8) & 0xff) + +#define IOCPARM_MAX NBPG /* max size of ioctl args, mult. of NBPG */ + /* no parameters */ +#define IOC_VOID (unsigned long)0x20000000 + /* copy parameters out */ +#define IOC_OUT (unsigned long)0x40000000 + /* copy parameters in */ +#define IOC_IN (unsigned long)0x80000000 + /* copy parameters in and out */ +#define IOC_INOUT (IOC_IN|IOC_OUT) + /* mask for IN/OUT/VOID */ +#define IOC_DIRMASK (unsigned long)0xe0000000 + +#define _IOC(inout,group,num,len) \ + (inout | ((len & IOCPARM_MASK) << 16) | ((group) << 8) | (num)) +#define _IO(g,n) _IOC(IOC_VOID, (g), (n), 0) +#define _IOR(g,n,t) _IOC(IOC_OUT, (g), (n), sizeof(t)) +#define _IOW(g,n,t) _IOC(IOC_IN, (g), (n), sizeof(t)) +/* this should be _IORW, but stdio got there first */ +#define _IOWR(g,n,t) _IOC(IOC_INOUT, (g), (n), sizeof(t)) + +#endif /* !_SYS_IOCCOM_H_ */ diff --git a/StdLib/Include/sys/localedef.h b/StdLib/Include/sys/localedef.h new file mode 100644 index 0000000000..63ea8a2307 --- /dev/null +++ b/StdLib/Include/sys/localedef.h @@ -0,0 +1,100 @@ +/* $NetBSD: localedef.h,v 1.7 2005/11/29 03:12:16 christos Exp $ */ + +/* + * Copyright (c) 1994 Winning Strategies, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Winning Strategies, Inc. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SYS_LOCALEDEF_H_ +#define _SYS_LOCALEDEF_H_ + +typedef struct { + const char *yesexpr; + const char *noexpr; + const char *yesstr; + const char *nostr; +} _MessagesLocale; + +extern const _MessagesLocale *_CurrentMessagesLocale; +extern const _MessagesLocale _DefaultMessagesLocale; + + +typedef struct { + const char *int_curr_symbol; + const char *currency_symbol; + const char *mon_decimal_point; + const char *mon_thousands_sep; + const char *mon_grouping; + const char *positive_sign; + const char *negative_sign; + char int_frac_digits; + char frac_digits; + char p_cs_precedes; + char p_sep_by_space; + char n_cs_precedes; + char n_sep_by_space; + char p_sign_posn; + char n_sign_posn; + char int_p_cs_precedes; + char int_n_cs_precedes; + char int_p_sep_by_space; + char int_n_sep_by_space; + char int_p_sign_posn; + char int_n_sign_posn; +} _MonetaryLocale; + +extern const _MonetaryLocale *_CurrentMonetaryLocale; +extern const _MonetaryLocale _DefaultMonetaryLocale; + + +typedef struct { + const char *decimal_point; + const char *thousands_sep; + const char *grouping; +} _NumericLocale; + +extern const _NumericLocale *_CurrentNumericLocale; +extern const _NumericLocale _DefaultNumericLocale; + + +typedef struct { + const char *abday[7]; + const char *day[7]; + const char *abmon[12]; + const char *mon[12]; + const char *am_pm[2]; + const char *d_t_fmt; + const char *d_fmt; + const char *t_fmt; + const char *t_fmt_ampm; +} _TimeLocale; + +extern const _TimeLocale *_CurrentTimeLocale; +extern const _TimeLocale _DefaultTimeLocale; + +#endif /* !_SYS_LOCALEDEF_H_ */ diff --git a/StdLib/Include/sys/param.h b/StdLib/Include/sys/param.h new file mode 100644 index 0000000000..19de391a9f --- /dev/null +++ b/StdLib/Include/sys/param.h @@ -0,0 +1,321 @@ +/* $NetBSD: param.h,v 1.244.2.9.2.2 2008/10/05 08:44:03 bouyer Exp $ */ + +/*- + * Copyright (c) 1982, 1986, 1989, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)param.h 8.3 (Berkeley) 4/4/95 + */ + +#ifndef _SYS_PARAM_H_ +#define _SYS_PARAM_H_ + +/* + * Historic BSD #defines -- probably will remain untouched for all time. + */ +#define BSD 199506 /* System version (year & month). */ +#define BSD4_3 1 +#define BSD4_4 1 + +/* + * #define __NetBSD_Version__ MMmmrrpp00 + * + * M = major version + * m = minor version; a minor number of 99 indicates current. + * r = 0 (*) + * p = patchlevel + * + * When new releases are made, src/gnu/usr.bin/groff/tmac/mdoc.local + * needs to be updated and the changes sent back to the groff maintainers. + * + * (*) Up to 2.0I "release" used to be "",A-Z,Z[A-Z] but numeric + * e.g. NetBSD-1.2D = 102040000 ('D' == 4) + * NetBSD-2.0H (200080000) was changed on 20041001 to: + * 2.99.9 (299000900) + */ + +#define __NetBSD_Version__ 400000003 /* NetBSD 4.0.1 */ + +#define __NetBSD_Prereq__(M,m,p) (((((M) * 100000000) + \ + (m) * 1000000) + (p) * 100) <= __NetBSD_Version__) + +/* + * Historical NetBSD #define + * + * NetBSD 1.4 was the last release for which this value was incremented. + * The value is now permanently fixed at 199905. It will never be + * changed again. + * + * New code must use __NetBSD_Version__ instead, and should not even + * count on NetBSD being defined. + * + */ + +#define NetBSD 199905 /* NetBSD version (year & month). */ + +#ifndef _LOCORE +//#include +#include +#endif + +/* + * Machine-independent constants (some used in following include files). + * Redefined constants are from POSIX 1003.1 limits file. + * + * MAXCOMLEN should be >= sizeof(ac_comm) (see ) + * MAXLOGNAME should be >= UT_NAMESIZE (see ) + */ +#include + +#define MAXCOMLEN 16 /* max command name remembered */ +#define MAXINTERP PATH_MAX /* max interpreter file name length */ +/* DEPRECATED: use LOGIN_NAME_MAX instead. */ +#define MAXLOGNAME (LOGIN_NAME_MAX - 1) /* max login name length */ +#define NCARGS ARG_MAX /* max bytes for an exec function */ +#define NGROUPS NGROUPS_MAX /* max number groups */ +#define NOGROUP 65535 /* marker for empty group set member */ +#define MAXHOSTNAMELEN 256 /* max hostname size */ + +#ifndef NOFILE +#define NOFILE OPEN_MAX /* max open files per process */ +#endif +#ifndef MAXUPRC /* max simultaneous processes */ +#define MAXUPRC CHILD_MAX /* POSIX 1003.1-compliant default */ +#else +#if (MAXUPRC - 0) < CHILD_MAX +#error MAXUPRC less than CHILD_MAX. See options(4) for details. +#endif /* (MAXUPRC - 0) < CHILD_MAX */ +#endif /* !defined(MAXUPRC) */ + +/* Signals. */ +#include + +/* Machine type dependent parameters. */ +#include +#include + +/* pages ("clicks") to disk blocks */ +#define ctod(x) ((x) << (PGSHIFT - DEV_BSHIFT)) +#define dtoc(x) ((x) >> (PGSHIFT - DEV_BSHIFT)) + +/* bytes to pages */ +#define ctob(x) ((x) << PGSHIFT) +#define btoc(x) (((x) + PGOFSET) >> PGSHIFT) + +/* bytes to disk blocks */ +#define dbtob(x) ((x) << DEV_BSHIFT) +#define btodb(x) ((x) >> DEV_BSHIFT) + +/* + * Stack macros. On most architectures, the stack grows down, + * towards lower addresses; it is the rare architecture where + * it grows up, towards higher addresses. + * + * STACK_GROW and STACK_SHRINK adjust a stack pointer by some + * size, no questions asked. STACK_ALIGN aligns a stack pointer. + * + * STACK_ALLOC returns a pointer to allocated stack space of + * some size; given such a pointer and a size, STACK_MAX gives + * the maximum (in the "maxsaddr" sense) stack address of the + * allocated memory. + */ +#if defined(_KERNEL) || defined(__EXPOSE_STACK) +#ifdef __MACHINE_STACK_GROWS_UP +#define STACK_GROW(sp, _size) (((caddr_t)(sp)) + (_size)) +#define STACK_SHRINK(sp, _size) (((caddr_t)(sp)) - (_size)) +#define STACK_ALIGN(sp, bytes) \ + ((caddr_t)((((unsigned long)(sp)) + (bytes)) & ~(bytes))) +#define STACK_ALLOC(sp, _size) ((caddr_t)(sp)) +#define STACK_MAX(p, _size) (((caddr_t)(p)) + (_size)) +#else +#define STACK_GROW(sp, _size) (((caddr_t)(sp)) - (_size)) +#define STACK_SHRINK(sp, _size) (((caddr_t)(sp)) + (_size)) +#define STACK_ALIGN(sp, bytes) \ + ((caddr_t)(((unsigned long)(sp)) & ~(bytes))) +#define STACK_ALLOC(sp, _size) (((caddr_t)(sp)) - (_size)) +#define STACK_MAX(p, _size) ((caddr_t)(p)) +#endif +#endif /* defined(_KERNEL) || defined(__EXPOSE_STACK) */ + +/* + * Priorities. Note that with 32 run queues, differences less than 4 are + * insignificant. + */ +#define PSWP 0 +#define PVM 4 +#define PINOD 8 +#define PRIBIO 16 +#define PVFS 20 +#define PZERO 22 /* No longer magic, shouldn't be here. XXX */ +#define PSOCK 24 +#define PWAIT 32 +#define PLOCK 36 +#define PPAUSE 40 +#define PUSER 50 +#define MAXPRI 127 /* Priorities range from 0 through MAXPRI. */ + +#define PRIMASK 0x0ff +#define PCATCH 0x100 /* OR'd with pri for tsleep to check signals */ +#define PNORELOCK 0x200 /* OR'd with pri for cond_wait() to not relock + the interlock */ +#define PNOEXITERR 0x400 /* OR'd with pri for tsleep to not exit + with an error code when LWPs are exiting */ +#define NBPW sizeof(int) /* number of bytes per word (integer) */ + +#define CMASK 022 /* default file mask: S_IWGRP|S_IWOTH */ +#define NODEV (dev_t)(-1) /* non-existent device */ + +#define CBLOCK 64 /* Clist block size, must be a power of 2. */ +#define CBQSIZE (CBLOCK/NBBY) /* Quote bytes/cblock - can do better. */ + /* Data chars/clist. */ +#define CBSIZE (CBLOCK - (int)sizeof(struct cblock *) - CBQSIZE) +#define CROUND (CBLOCK - 1) /* Clist rounding. */ + +/* + * File system parameters and macros. + * + * The file system is made out of blocks of at most MAXBSIZE units, with + * smaller units (fragments) only in the last direct block. MAXBSIZE + * primarily determines the size of buffers in the buffer pool. It may be + * made larger without any effect on existing file systems; however making + * it smaller may make some file systems unmountable. + */ +#ifndef MAXBSIZE /* XXX */ +#define MAXBSIZE MAXPHYS +#endif +#define MAXFRAG 8 + +/* + * MAXPATHLEN defines the longest permissible path length after expanding + * symbolic links. It is used to allocate a temporary buffer from the buffer + * pool in which to do the name expansion, hence should be a power of two, + * and must be less than or equal to MAXBSIZE. MAXSYMLINKS defines the + * maximum number of symbolic links that may be expanded in a path name. + * It should be set high enough to allow all legitimate uses, but halt + * infinite loops reasonably quickly. + */ +#define MAXPATHLEN PATH_MAX +#define MAXSYMLINKS 32 + +/* Bit map related macros. */ +#define setbit(a,i) ((a)[(i)/NBBY] |= 1<<((i)%NBBY)) +#define clrbit(a,i) ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY))) +#define isset(a,i) ((a)[(i)/NBBY] & (1<<((i)%NBBY))) +#define isclr(a,i) (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0) + +/* Macros for counting and rounding. */ +#ifndef howmany +#define howmany(x, y) (((x)+((y)-1))/(y)) +#endif +#define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) +#define rounddown(x,y) (((x)/(y))*(y)) +#define powerof2(x) ((((x)-1)&(x))==0) + +///* Macros for min/max. */ +//#define MIN(a,b) (((a)<(b))?(a):(b)) +//#define MAX(a,b) (((a)>(b))?(a):(b)) + +/* + * Constants for setting the parameters of the kernel memory allocator. + * + * 2 ** MINBUCKET is the smallest unit of memory that will be + * allocated. It must be at least large enough to hold a pointer. + * + * Units of memory less or equal to MAXALLOCSAVE will permanently + * allocate physical memory; requests for these size pieces of + * memory are quite fast. Allocations greater than MAXALLOCSAVE must + * always allocate and free physical memory; requests for these + * size allocations should be done infrequently as they will be slow. + * + * Constraints: NBPG <= MAXALLOCSAVE <= 2 ** (MINBUCKET + 14), and + * MAXALLOCSAVE must be a power of two. + */ +#ifdef _LP64 +#define MINBUCKET 5 /* 5 => min allocation of 32 bytes */ +#else +#define MINBUCKET 4 /* 4 => min allocation of 16 bytes */ +#endif +#define MAXALLOCSAVE (2 * NBPG) + +/* + * Scale factor for scaled integers used to count %cpu time and load avgs. + * + * The number of CPU `tick's that map to a unique `%age' can be expressed + * by the formula (1 / (2 ^ (FSHIFT - 11))). The maximum load average that + * can be calculated (assuming 32 bits) can be closely approximated using + * the formula (2 ^ (2 * (16 - FSHIFT))) for (FSHIFT < 15). + * + * For the scheduler to maintain a 1:1 mapping of CPU `tick' to `%age', + * FSHIFT must be at least 11; this gives us a maximum load avg of ~1024. + */ +#define FSHIFT 11 /* bits to right of fixed binary point */ +#define FSCALE (1<. + */ + +#ifndef UBC_WINSHIFT +#define UBC_WINSHIFT 13 +#endif +#ifndef UBC_NWINS +#define UBC_NWINS 1024 +#endif + +#ifdef _KERNEL +/* + * macro to convert from milliseconds to hz without integer overflow + * Default version using only 32bits arithmetics. + * 64bit port can define 64bit version in their + * 0x20000 is safe for hz < 20000 + */ +#ifndef mstohz +#define mstohz(ms) \ + (__predict_false((ms) >= 0x20000) ? \ + ((ms +0u) / 1000u) * hz : \ + ((ms +0u) * hz) / 1000u) +#endif +#endif /* _KERNEL */ + +#endif /* !_SYS_PARAM_H_ */ diff --git a/StdLib/Include/sys/pool.h b/StdLib/Include/sys/pool.h new file mode 100644 index 0000000000..43c080a227 --- /dev/null +++ b/StdLib/Include/sys/pool.h @@ -0,0 +1,311 @@ +/* $NetBSD: pool.h,v 1.54 2006/08/20 09:35:25 yamt Exp $ */ + +/*- + * Copyright (c) 1997, 1998, 1999, 2000 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Paul Kranenburg; by Jason R. Thorpe of the Numerical Aerospace + * Simulation Facility, NASA Ames Research Center. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SYS_POOL_H_ +#define _SYS_POOL_H_ + +#ifdef _KERNEL +#define __POOL_EXPOSE +#endif + +#if defined(_KERNEL_OPT) +#include "opt_pool.h" +#endif + +#ifdef __POOL_EXPOSE +#include +#include +#include +#include +#if defined(_KERNEL) +#include +#endif /* defined(_KERNEL) */ +#endif + +#define PCG_NOBJECTS 16 + +#define POOL_PADDR_INVALID ((paddr_t) -1) + +#ifdef __POOL_EXPOSE +/* The pool cache group. */ +struct pool_cache_group { + LIST_ENTRY(pool_cache_group) + pcg_list; /* link in the pool cache's group list */ + u_int pcg_avail; /* # available objects */ + /* pointers to the objects */ + struct { + void *pcgo_va; /* cache object virtual address */ + paddr_t pcgo_pa;/* cache object physical address */ + } pcg_objects[PCG_NOBJECTS]; +}; + +LIST_HEAD(pool_cache_grouplist,pool_cache_group); +struct pool_cache { + LIST_ENTRY(pool_cache) + pc_poollist; /* entry on pool's group list */ + struct pool_cache_grouplist + pc_emptygroups; /* list of empty cache groups */ + struct pool_cache_grouplist + pc_fullgroups; /* list of full cache groups */ + struct pool_cache_grouplist + pc_partgroups; /* list of partial cache groups */ + struct pool *pc_pool; /* parent pool */ + struct simplelock pc_slock; /* mutex */ + + int (*pc_ctor)(void *, void *, int); + void (*pc_dtor)(void *, void *); + void *pc_arg; + + /* Statistics. */ + unsigned long pc_hits; /* cache hits */ + unsigned long pc_misses; /* cache misses */ + + unsigned long pc_ngroups; /* # cache groups */ + + unsigned long pc_nitems; /* # objects currently in cache */ +}; + +struct pool_allocator { + void *(*pa_alloc)(struct pool *, int); + void (*pa_free)(struct pool *, void *); + unsigned int pa_pagesz; + + /* The following fields are for internal use only. */ + struct simplelock pa_slock; + TAILQ_HEAD(, pool) pa_list; /* list of pools using this allocator */ + int pa_flags; +#define PA_INITIALIZED 0x01 + int pa_pagemask; + int pa_pageshift; + struct vm_map *pa_backingmap; +#if defined(_KERNEL) + struct vm_map **pa_backingmapptr; + SLIST_ENTRY(pool_allocator) pa_q; +#endif /* defined(_KERNEL) */ +}; + +LIST_HEAD(pool_pagelist,pool_item_header); + +struct pool { + LIST_ENTRY(pool) + pr_poollist; + struct pool_pagelist + pr_emptypages; /* Empty pages */ + struct pool_pagelist + pr_fullpages; /* Full pages */ + struct pool_pagelist + pr_partpages; /* Partially-allocated pages */ + struct pool_item_header *pr_curpage; + struct pool *pr_phpool; /* Pool item header pool */ + LIST_HEAD(,pool_cache) + pr_cachelist; /* Caches for this pool */ + unsigned int pr_size; /* Size of item */ + unsigned int pr_align; /* Requested alignment, must be 2^n */ + unsigned int pr_itemoffset; /* Align this offset in item */ + unsigned int pr_minitems; /* minimum # of items to keep */ + unsigned int pr_minpages; /* same in page units */ + unsigned int pr_maxpages; /* maximum # of pages to keep */ + unsigned int pr_npages; /* # of pages allocated */ + unsigned int pr_itemsperpage;/* # items that fit in a page */ + unsigned int pr_slack; /* unused space in a page */ + unsigned int pr_nitems; /* number of available items in pool */ + unsigned int pr_nout; /* # items currently allocated */ + unsigned int pr_hardlimit; /* hard limit to number of allocated + items */ + struct pool_allocator *pr_alloc;/* back-end allocator */ + TAILQ_ENTRY(pool) pr_alloc_list;/* link on allocator's pool list */ + + /* Drain hook. */ + void (*pr_drain_hook)(void *, int); + void *pr_drain_hook_arg; + + const char *pr_wchan; /* tsleep(9) identifier */ + unsigned int pr_flags; /* r/w flags */ + unsigned int pr_roflags; /* r/o flags */ +#define PR_NOWAIT 0x00 /* for symmetry */ +#define PR_WAITOK 0x02 +#define PR_WANTED 0x04 +#define PR_PHINPAGE 0x40 +#define PR_LOGGING 0x80 +#define PR_LIMITFAIL 0x100 /* even if waiting, fail if we hit limit */ +#define PR_RECURSIVE 0x200 /* pool contains pools, for vmstat(8) */ +#define PR_NOTOUCH 0x400 /* don't use free items to keep internal state*/ +#define PR_NOALIGN 0x800 /* don't assume backend alignment */ + + /* + * `pr_slock' protects the pool's data structures when removing + * items from or returning items to the pool, or when reading + * or updating read/write fields in the pool descriptor. + * + * We assume back-end page allocators provide their own locking + * scheme. They will be called with the pool descriptor _unlocked_, + * since the page allocators may block. + */ + struct simplelock pr_slock; + + SPLAY_HEAD(phtree, pool_item_header) pr_phtree; + + int pr_maxcolor; /* Cache colouring */ + int pr_curcolor; + int pr_phoffset; /* Offset in page of page header */ + + /* + * Warning message to be issued, and a per-time-delta rate cap, + * if the hard limit is reached. + */ + const char *pr_hardlimit_warning; + struct timeval pr_hardlimit_ratecap; + struct timeval pr_hardlimit_warning_last; + + /* + * Instrumentation + */ + unsigned long pr_nget; /* # of successful requests */ + unsigned long pr_nfail; /* # of unsuccessful requests */ + unsigned long pr_nput; /* # of releases */ + unsigned long pr_npagealloc; /* # of pages allocated */ + unsigned long pr_npagefree; /* # of pages released */ + unsigned int pr_hiwat; /* max # of pages in pool */ + unsigned long pr_nidle; /* # of idle pages */ + + /* + * Diagnostic aides. + */ + struct pool_log *pr_log; + int pr_curlogentry; + int pr_logsize; + + const char *pr_entered_file; /* reentrancy check */ + long pr_entered_line; + +#if defined(_KERNEL) + struct callback_entry pr_reclaimerentry; +#endif +}; +#endif /* __POOL_EXPOSE */ + +#ifdef _KERNEL +/* + * pool_allocator_kmem is the default that all pools get unless + * otherwise specified. pool_allocator_nointr is provided for + * pools that know they will never be accessed in interrupt + * context. + */ +extern struct pool_allocator pool_allocator_kmem; +extern struct pool_allocator pool_allocator_nointr; +#ifdef POOL_SUBPAGE +/* The above are subpage allocators in this case. */ +extern struct pool_allocator pool_allocator_kmem_fullpage; +extern struct pool_allocator pool_allocator_nointr_fullpage; +#endif + +struct link_pool_init { /* same as args to pool_init() */ + struct pool *pp; + size_t size; + u_int align; + u_int align_offset; + int flags; + const char *wchan; + struct pool_allocator *palloc; +}; +#define POOL_INIT(pp, size, align, align_offset, flags, wchan, palloc) \ +struct pool pp; \ +static const struct link_pool_init _link_ ## pp[1] = { \ + { &pp, size, align, align_offset, flags, wchan, palloc } \ +}; \ +__link_set_add_rodata(pools, _link_ ## pp) + +void pool_subsystem_init(void); + +void pool_init(struct pool *, size_t, u_int, u_int, + int, const char *, struct pool_allocator *); +void pool_destroy(struct pool *); + +void pool_set_drain_hook(struct pool *, + void (*)(void *, int), void *); + +void *pool_get(struct pool *, int); +void pool_put(struct pool *, void *); +int pool_reclaim(struct pool *); + +#ifdef POOL_DIAGNOSTIC +/* + * These versions do reentrancy checking. + */ +void *_pool_get(struct pool *, int, const char *, long); +void _pool_put(struct pool *, void *, const char *, long); +int _pool_reclaim(struct pool *, const char *, long); +#define pool_get(h, f) _pool_get((h), (f), __FILE__, __LINE__) +#define pool_put(h, v) _pool_put((h), (v), __FILE__, __LINE__) +#define pool_reclaim(h) _pool_reclaim((h), __FILE__, __LINE__) +#endif /* POOL_DIAGNOSTIC */ + +int pool_prime(struct pool *, int); +void pool_setlowat(struct pool *, int); +void pool_sethiwat(struct pool *, int); +void pool_sethardlimit(struct pool *, int, const char *, int); +void pool_drain(void *); + +/* + * Debugging and diagnostic aides. + */ +void pool_print(struct pool *, const char *); +void pool_printit(struct pool *, const char *, + void (*)(const char *, ...)); +void pool_printall(const char *, void (*)(const char *, ...)); +int pool_chk(struct pool *, const char *); + +/* + * Pool cache routines. + */ +void pool_cache_init(struct pool_cache *, struct pool *, + int (*)(void *, void *, int), + void (*)(void *, void *), + void *); +void pool_cache_destroy(struct pool_cache *); +void *pool_cache_get_paddr(struct pool_cache *, int, paddr_t *); +#define pool_cache_get(pc, f) pool_cache_get_paddr((pc), (f), NULL) +void pool_cache_put_paddr(struct pool_cache *, void *, paddr_t); +#define pool_cache_put(pc, o) pool_cache_put_paddr((pc), (o), \ + POOL_PADDR_INVALID) +void pool_cache_destruct_object(struct pool_cache *, void *); +void pool_cache_invalidate(struct pool_cache *); +#endif /* _KERNEL */ + +#endif /* _SYS_POOL_H_ */ diff --git a/StdLib/Include/sys/resource.h b/StdLib/Include/sys/resource.h new file mode 100644 index 0000000000..c54c816cd6 --- /dev/null +++ b/StdLib/Include/sys/resource.h @@ -0,0 +1,143 @@ +/* $NetBSD: resource.h,v 1.29 2006/07/23 22:06:14 ad Exp $ */ + +/* + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)resource.h 8.4 (Berkeley) 1/9/95 + */ + +#ifndef _SYS_RESOURCE_H_ +#define _SYS_RESOURCE_H_ + +#include +#include + +/* + * Process priority specifications to get/setpriority. + */ +#define PRIO_MIN -20 +#define PRIO_MAX 20 + +#define PRIO_PROCESS 0 +#define PRIO_PGRP 1 +#define PRIO_USER 2 + +/* + * Resource utilization information. + */ + +#define RUSAGE_SELF 0 +#define RUSAGE_CHILDREN -1 + +struct rusage { + struct timeval ru_utime; /* user time used */ + struct timeval ru_stime; /* system time used */ + long ru_maxrss; /* max resident set size */ +#ifdef _KERNEL +#define ru_first ru_ixrss +#endif + long ru_ixrss; /* integral shared memory size */ + long ru_idrss; /* integral unshared data " */ + long ru_isrss; /* integral unshared stack " */ + long ru_minflt; /* page reclaims */ + long ru_majflt; /* page faults */ + long ru_nswap; /* swaps */ + long ru_inblock; /* block input operations */ + long ru_oublock; /* block output operations */ + long ru_msgsnd; /* messages sent */ + long ru_msgrcv; /* messages received */ + long ru_nsignals; /* signals received */ + long ru_nvcsw; /* voluntary context switches */ + long ru_nivcsw; /* involuntary " */ +#ifdef _KERNEL +#define ru_last ru_nivcsw +#endif +}; + +/* + * Resource limits + */ +#define RLIMIT_CPU 0 /* cpu time in milliseconds */ +#define RLIMIT_FSIZE 1 /* maximum file size */ +#define RLIMIT_DATA 2 /* data size */ +#define RLIMIT_STACK 3 /* stack size */ +#define RLIMIT_CORE 4 /* core file size */ +#define RLIMIT_RSS 5 /* resident set size */ +#define RLIMIT_MEMLOCK 6 /* locked-in-memory address space */ +#define RLIMIT_NPROC 7 /* number of processes */ +#define RLIMIT_NOFILE 8 /* number of open files */ +#define RLIMIT_SBSIZE 9 /* maximum size of all socket buffers */ + +#if defined(_NETBSD_SOURCE) +#define RLIM_NLIMITS 10 /* number of resource limits */ +#endif + +#define RLIM_INFINITY (~((u_quad_t)1 << 63)) /* no limit */ +#define RLIM_SAVED_MAX RLIM_INFINITY /* unrepresentable hard limit */ +#define RLIM_SAVED_CUR RLIM_INFINITY /* unrepresentable soft limit */ + +#if defined(_KERNEL) +/* 4.3BSD compatibility rlimit argument structure. */ +struct orlimit { + int32_t rlim_cur; /* current (soft) limit */ + int32_t rlim_max; /* maximum value for rlim_cur */ +}; +#endif + +struct rlimit { + rlim_t rlim_cur; /* current (soft) limit */ + rlim_t rlim_max; /* maximum value for rlim_cur */ +}; + +#if defined(_NETBSD_SOURCE) +/* Load average structure. */ +struct loadavg { + fixpt_t ldavg[3]; + long fscale; +}; +#endif + +#ifdef _KERNEL +extern struct loadavg averunnable; +struct pcred; +int dosetrlimit(struct lwp *, struct proc *, int, struct rlimit *); +int donice(struct lwp *, struct proc *, int); + +#else +#include + +__BEGIN_DECLS +int getpriority(int, id_t); +int getrlimit(int, struct rlimit *); +int getrusage(int, struct rusage *); +int setpriority(int, id_t, int); +int setrlimit(int, const struct rlimit *); +__END_DECLS + +#endif /* _KERNEL */ +#endif /* !_SYS_RESOURCE_H_ */ diff --git a/StdLib/Include/sys/select.h b/StdLib/Include/sys/select.h new file mode 100644 index 0000000000..e1e5de1d5f --- /dev/null +++ b/StdLib/Include/sys/select.h @@ -0,0 +1,51 @@ +/* $NetBSD: select.h,v 1.27 2006/02/16 20:17:20 perry Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)select.h 8.2 (Berkeley) 1/4/94 + */ + +#ifndef _SYS_SELECT_H_ +#define _SYS_SELECT_H_ + +#include +#include + +#include +#include + +__BEGIN_DECLS +int pselect(int, fd_set * __restrict, fd_set * __restrict, + fd_set * __restrict, const struct timespec * __restrict, + const sigset_t * __restrict); +int select(int, fd_set * __restrict, fd_set * __restrict, + fd_set * __restrict, struct timeval * __restrict); +__END_DECLS + +#endif /* !_SYS_SELECT_H_ */ diff --git a/StdLib/Include/sys/signal.h b/StdLib/Include/sys/signal.h new file mode 100644 index 0000000000..8cc32f08c9 --- /dev/null +++ b/StdLib/Include/sys/signal.h @@ -0,0 +1,37 @@ +/** +Copyright (c) 2010, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. +The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php. + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _SYS_SIGNAL_H +#define _SYS_SIGNAL_H +#include +#include + +/** The type of a signal handler function. **/ +typedef void __sighandler_t(int); + +/** The signal function associates a "signal handler" with a signal number. + + For historical reasons; programs expect signal to be declared + in . + + @param[in] sig Signal number that function is to be associated with. + @param[in] function The "handler" function to be associated with signal sig. + + @return If the request can be honored, the signal function returns the + value of func for the most recent successful call to signal for + the specified signal sig. Otherwise, a value of SIG_ERR is + returned and a positive value is stored in errno. + */ +__BEGIN_DECLS +__sighandler_t *signal(int sig, __sighandler_t *func); +__END_DECLS + +#endif /* _SYS_SIGNAL_H */ diff --git a/StdLib/Include/sys/sigtypes.h b/StdLib/Include/sys/sigtypes.h new file mode 100644 index 0000000000..c640296f49 --- /dev/null +++ b/StdLib/Include/sys/sigtypes.h @@ -0,0 +1,123 @@ +/* $NetBSD: sigtypes.h,v 1.8 2005/12/11 12:25:21 christos Exp $ */ + +/* + * Copyright (c) 1982, 1986, 1989, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)signal.h 8.4 (Berkeley) 5/4/95 + */ + +#ifndef _SYS_SIGTYPES_H_ +#define _SYS_SIGTYPES_H_ + +/* + * This header file defines various signal-related types. We also keep + * the macros to manipulate sigset_t here, to encapsulate knowledge of + * its internals. + */ + +#include +#include +#include + +#ifdef _EFI_SIZE_T_ + typedef _EFI_SIZE_T_ size_t; + #undef _EFI_SIZE_T_ + #undef _BSD_SIZE_T_ +#endif + +#if defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || \ + defined(_NETBSD_SOURCE) + +typedef struct { + __uint32_t __bits[4]; +} sigset_t; + +/* + * Macro for manipulating signal masks. + */ +#define __sigmask(n) (1 << (((unsigned int)(n) - 1) & 31)) +#define __sigword(n) (((unsigned int)(n) - 1) >> 5) +#define __sigaddset(s, n) ((s)->__bits[__sigword(n)] |= __sigmask(n)) +#define __sigdelset(s, n) ((s)->__bits[__sigword(n)] &= ~__sigmask(n)) +#define __sigismember(s, n) (((s)->__bits[__sigword(n)] & __sigmask(n)) != 0) +#define __sigemptyset(s) ((s)->__bits[0] = 0x00000000, \ + (s)->__bits[1] = 0x00000000, \ + (s)->__bits[2] = 0x00000000, \ + (s)->__bits[3] = 0x00000000) +#define __sigsetequal(s1,s2) ((s1)->__bits[0] == (s2)->__bits[0] && \ + (s1)->__bits[1] == (s2)->__bits[1] && \ + (s1)->__bits[2] == (s2)->__bits[2] && \ + (s1)->__bits[3] == (s2)->__bits[3]) +#define __sigfillset(s) ((s)->__bits[0] = 0xffffffff, \ + (s)->__bits[1] = 0xffffffff, \ + (s)->__bits[2] = 0xffffffff, \ + (s)->__bits[3] = 0xffffffff) +#define __sigplusset(s, t) \ + do { \ + (t)->__bits[0] |= (s)->__bits[0]; \ + (t)->__bits[1] |= (s)->__bits[1]; \ + (t)->__bits[2] |= (s)->__bits[2]; \ + (t)->__bits[3] |= (s)->__bits[3]; \ + } while (/* CONSTCOND */ 0) +#define __sigminusset(s, t) \ + do { \ + (t)->__bits[0] &= ~(s)->__bits[0]; \ + (t)->__bits[1] &= ~(s)->__bits[1]; \ + (t)->__bits[2] &= ~(s)->__bits[2]; \ + (t)->__bits[3] &= ~(s)->__bits[3]; \ + } while (/* CONSTCOND */ 0) +#define __sigandset(s, t) \ + do { \ + (t)->__bits[0] &= (s)->__bits[0]; \ + (t)->__bits[1] &= (s)->__bits[1]; \ + (t)->__bits[2] &= (s)->__bits[2]; \ + (t)->__bits[3] &= (s)->__bits[3]; \ + } while (/* CONSTCOND */ 0) + +#if (defined(_XOPEN_SOURCE) && defined(_XOPEN_SOURCE_EXTENDED)) || \ + (_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE) +typedef struct +#if defined(_NETBSD_SOURCE) + sigaltstack +#endif /* _NETBSD_SOURCE */ + { + void *ss_sp; /* signal stack base */ + size_t ss_size; /* signal stack length */ + int ss_flags; /* SS_DISABLE and/or SS_ONSTACK */ +} stack_t; + +#endif /* _XOPEN_SOURCE_EXTENDED || XOPEN_SOURCE >= 500 || _NETBSD_SOURCE */ + +#endif /* _POSIX_C_SOURCE || _XOPEN_SOURCE || ... */ + +#endif /* !_SYS_SIGTYPES_H_ */ diff --git a/StdLib/Include/sys/socket.h b/StdLib/Include/sys/socket.h new file mode 100644 index 0000000000..8cc297d58b --- /dev/null +++ b/StdLib/Include/sys/socket.h @@ -0,0 +1,570 @@ +/* $NetBSD: socket.h,v 1.82 2006/06/27 03:49:08 mrg Exp $ */ + +/* + * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Copyright (c) 1982, 1985, 1986, 1988, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)socket.h 8.6 (Berkeley) 5/3/95 + */ + +#ifndef _SYS_SOCKET_H_ +#define _SYS_SOCKET_H_ + +#include + +/* + * Definitions related to sockets: types, address families, options. + */ + +/* + * Data types. + */ +#include + +#ifndef sa_family_t +typedef __sa_family_t sa_family_t; +#define sa_family_t __sa_family_t +#endif + +#ifndef socklen_t +typedef __socklen_t socklen_t; +#define socklen_t __socklen_t +#endif + +#include + +#ifdef _BSD_SIZE_T_ +typedef _BSD_SIZE_T_ size_t; +#undef _BSD_SIZE_T_ +#endif + +#ifdef _BSD_SSIZE_T_ +typedef _BSD_SSIZE_T_ ssize_t; +#undef _BSD_SSIZE_T_ +#endif + +#include + +/* + * Socket types. + */ +#define SOCK_STREAM 1 /* stream socket */ +#define SOCK_DGRAM 2 /* datagram socket */ +#define SOCK_RAW 3 /* raw-protocol interface */ +#define SOCK_RDM 4 /* reliably-delivered message */ +#define SOCK_SEQPACKET 5 /* sequenced packet stream */ + +/* + * Option flags per-socket. + */ +#define SO_DEBUG 0x0001 /* turn on debugging info recording */ +#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ +#define SO_REUSEADDR 0x0004 /* allow local address reuse */ +#define SO_KEEPALIVE 0x0008 /* keep connections alive */ +#define SO_DONTROUTE 0x0010 /* just use interface addresses */ +#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */ +#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */ +#define SO_LINGER 0x0080 /* linger on close if data present */ +#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */ +#define SO_REUSEPORT 0x0200 /* allow local address & port reuse */ +#define SO_TIMESTAMP 0x0400 /* timestamp received dgram traffic */ + + +/* + * Additional options, not kept in so_options. + */ +#define SO_SNDBUF 0x1001 /* send buffer size */ +#define SO_RCVBUF 0x1002 /* receive buffer size */ +#define SO_SNDLOWAT 0x1003 /* send low-water mark */ +#define SO_RCVLOWAT 0x1004 /* receive low-water mark */ +#define SO_SNDTIMEO 0x1005 /* send timeout */ +#define SO_RCVTIMEO 0x1006 /* receive timeout */ +#define SO_ERROR 0x1007 /* get error status and clear */ +#define SO_TYPE 0x1008 /* get socket type */ +#define SO_OVERFLOWED 0x1009 /* datagrams: return packets dropped */ + +/* + * Structure used for manipulating linger option. + */ +struct linger { + int l_onoff; /* option on/off */ + int l_linger; /* linger time in seconds */ +}; + +/* + * Level number for (get/set)sockopt() to apply to socket itself. + */ +#define SOL_SOCKET 0xffff /* options for socket level */ + +/* + * Address families. + */ +#define AF_UNSPEC 0 /* unspecified */ +#define AF_LOCAL 1 /* local to host (pipes, portals) */ +#define AF_UNIX AF_LOCAL /* backward compatibility */ +#define AF_INET 2 /* internetwork: UDP, TCP, etc. */ +#define AF_IMPLINK 3 /* arpanet imp addresses */ +#define AF_PUP 4 /* pup protocols: e.g. BSP */ +#define AF_CHAOS 5 /* mit CHAOS protocols */ +#define AF_NS 6 /* XEROX NS protocols */ +#define AF_ISO 7 /* ISO protocols */ +#define AF_OSI AF_ISO +#define AF_ECMA 8 /* european computer manufacturers */ +#define AF_DATAKIT 9 /* datakit protocols */ +#define AF_CCITT 10 /* CCITT protocols, X.25 etc */ +#define AF_SNA 11 /* IBM SNA */ +#define AF_DECnet 12 /* DECnet */ +#define AF_DLI 13 /* DEC Direct data link interface */ +#define AF_LAT 14 /* LAT */ +#define AF_HYLINK 15 /* NSC Hyperchannel */ +#define AF_APPLETALK 16 /* Apple Talk */ +#define AF_ROUTE 17 /* Internal Routing Protocol */ +#define AF_LINK 18 /* Link layer interface */ +#if defined(_NETBSD_SOURCE) +#define pseudo_AF_XTP 19 /* eXpress Transfer Protocol (no AF) */ +#endif +#define AF_COIP 20 /* connection-oriented IP, aka ST II */ +#define AF_CNT 21 /* Computer Network Technology */ +#if defined(_NETBSD_SOURCE) +#define pseudo_AF_RTIP 22 /* Help Identify RTIP packets */ +#endif +#define AF_IPX 23 /* Novell Internet Protocol */ +#define AF_INET6 24 /* IP version 6 */ +#if defined(_NETBSD_SOURCE) +#define pseudo_AF_PIP 25 /* Help Identify PIP packets */ +#endif +#define AF_ISDN 26 /* Integrated Services Digital Network*/ +#define AF_E164 AF_ISDN /* CCITT E.164 recommendation */ +#define AF_NATM 27 /* native ATM access */ +#define AF_ARP 28 /* (rev.) addr. res. prot. (RFC 826) */ +#if defined(_NETBSD_SOURCE) +#define pseudo_AF_KEY 29 /* Internal key management protocol */ +#define pseudo_AF_HDRCMPLT 30 /* Used by BPF to not rewrite hdrs + in interface output routine */ +#endif +#define AF_BLUETOOTH 31 + +#define AF_MAX 32 + +/* + * Structure used by kernel to store most + * addresses. + */ +struct sockaddr { + __uint8_t sa_len; /* total length */ + sa_family_t sa_family; /* address family */ + char sa_data[14]; /* actually longer; address value */ +}; + +#if defined(_KERNEL) +/* + * Structure used by kernel to pass protocol + * information in raw sockets. + */ +struct sockproto { + u_short sp_family; /* address family */ + u_short sp_protocol; /* protocol */ +}; +#endif /* _KERNEL */ + +#if 1 +/* + * RFC 2553: protocol-independent placeholder for socket addresses + */ +#define _SS_MAXSIZE 128 +#define _SS_ALIGNSIZE (sizeof(__int64_t)) +#define _SS_PAD1SIZE (_SS_ALIGNSIZE - 2) +#define _SS_PAD2SIZE (_SS_MAXSIZE - 2 - \ + _SS_PAD1SIZE - _SS_ALIGNSIZE) + +#if (_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE) +struct sockaddr_storage { + __uint8_t ss_len; /* address length */ + sa_family_t ss_family; /* address family */ + char __ss_pad1[_SS_PAD1SIZE]; + __int64_t __ss_align;/* force desired structure storage alignment */ + char __ss_pad2[_SS_PAD2SIZE]; +}; +#endif /* _XOPEN_SOURCE >= 500 || _NETBSD_SOURCE */ +#endif /* 1 */ + +/* + * Protocol families, same as address families for now. + */ +#define PF_UNSPEC AF_UNSPEC +#define PF_LOCAL AF_LOCAL +#define PF_UNIX PF_LOCAL /* backward compatibility */ +#define PF_INET AF_INET +#define PF_IMPLINK AF_IMPLINK +#define PF_PUP AF_PUP +#define PF_CHAOS AF_CHAOS +#define PF_NS AF_NS +#define PF_ISO AF_ISO +#define PF_OSI AF_ISO +#define PF_ECMA AF_ECMA +#define PF_DATAKIT AF_DATAKIT +#define PF_CCITT AF_CCITT +#define PF_SNA AF_SNA +#define PF_DECnet AF_DECnet +#define PF_DLI AF_DLI +#define PF_LAT AF_LAT +#define PF_HYLINK AF_HYLINK +#define PF_APPLETALK AF_APPLETALK +#define PF_ROUTE AF_ROUTE +#define PF_LINK AF_LINK +#if defined(_NETBSD_SOURCE) +#define PF_XTP pseudo_AF_XTP /* really just proto family, no AF */ +#endif +#define PF_COIP AF_COIP +#define PF_CNT AF_CNT +#define PF_INET6 AF_INET6 +#define PF_IPX AF_IPX /* same format as AF_NS */ +#if defined(_NETBSD_SOURCE) +#define PF_RTIP pseudo_AF_RTIP /* same format as AF_INET */ +#define PF_PIP pseudo_AF_PIP +#endif +#define PF_ISDN AF_ISDN /* same as E164 */ +#define PF_E164 AF_E164 +#define PF_NATM AF_NATM +#define PF_ARP AF_ARP +#if defined(_NETBSD_SOURCE) +#define PF_KEY pseudo_AF_KEY /* like PF_ROUTE, only for key mgmt */ +#endif +#define PF_BLUETOOTH AF_BLUETOOTH + +#define PF_MAX AF_MAX + +#if defined(_NETBSD_SOURCE) + +#ifndef gid_t +typedef __gid_t gid_t; /* group id */ +#define gid_t __gid_t +#endif + +#ifndef uid_t +typedef __uid_t uid_t; /* user id */ +#define uid_t __uid_t +#endif + +/* + * Socket credentials. + */ +struct sockcred { + uid_t sc_uid; /* real user id */ + uid_t sc_euid; /* effective user id */ + gid_t sc_gid; /* real group id */ + gid_t sc_egid; /* effective group id */ + int sc_ngroups; /* number of supplemental groups */ + gid_t sc_groups[1]; /* variable length */ +}; + +/* + * Compute size of a sockcred structure with groups. + */ +#define SOCKCREDSIZE(ngrps) \ + (sizeof(struct sockcred) + (sizeof(gid_t) * ((ngrps) - 1))) +#endif /* _NETBSD_SOURCE */ + + +#if defined(_NETBSD_SOURCE) +/* + * Definitions for network related sysctl, CTL_NET. + * + * Second level is protocol family. + * Third level is protocol number. + * + * Further levels are defined by the individual families below. + */ +#define NET_MAXID AF_MAX + +#define CTL_NET_NAMES { \ + { 0, 0 }, \ + { "local", CTLTYPE_NODE }, \ + { "inet", CTLTYPE_NODE }, \ + { "implink", CTLTYPE_NODE }, \ + { "pup", CTLTYPE_NODE }, \ + { "chaos", CTLTYPE_NODE }, \ + { "xerox_ns", CTLTYPE_NODE }, \ + { "iso", CTLTYPE_NODE }, \ + { "emca", CTLTYPE_NODE }, \ + { "datakit", CTLTYPE_NODE }, \ + { "ccitt", CTLTYPE_NODE }, \ + { "ibm_sna", CTLTYPE_NODE }, \ + { "decnet", CTLTYPE_NODE }, \ + { "dec_dli", CTLTYPE_NODE }, \ + { "lat", CTLTYPE_NODE }, \ + { "hylink", CTLTYPE_NODE }, \ + { "appletalk", CTLTYPE_NODE }, \ + { "route", CTLTYPE_NODE }, \ + { "link_layer", CTLTYPE_NODE }, \ + { "xtp", CTLTYPE_NODE }, \ + { "coip", CTLTYPE_NODE }, \ + { "cnt", CTLTYPE_NODE }, \ + { "rtip", CTLTYPE_NODE }, \ + { "ipx", CTLTYPE_NODE }, \ + { "inet6", CTLTYPE_NODE }, \ + { "pip", CTLTYPE_NODE }, \ + { "isdn", CTLTYPE_NODE }, \ + { "natm", CTLTYPE_NODE }, \ + { "arp", CTLTYPE_NODE }, \ + { "key", CTLTYPE_NODE }, \ +} + +struct kinfo_pcb { + __uint64_t ki_pcbaddr; /* PTR: pcb addr */ + __uint64_t ki_ppcbaddr; /* PTR: ppcb addr */ + __uint64_t ki_sockaddr; /* PTR: socket addr */ + + __uint32_t ki_family; /* INT: protocol family */ + __uint32_t ki_type; /* INT: socket type */ + __uint32_t ki_protocol; /* INT: protocol */ + __uint32_t ki_pflags; /* INT: generic protocol flags */ + + __uint32_t ki_sostate; /* INT: socket state */ + __uint32_t ki_prstate; /* INT: protocol state */ + __int32_t ki_tstate; /* INT: tcp state */ + __uint32_t ki_tflags; /* INT: tcp flags */ + + __uint64_t ki_rcvq; /* U_LONG: receive queue len */ + __uint64_t ki_sndq; /* U_LONG: send queue len */ + + union { + struct sockaddr _kis_src; /* STRUCT: local address */ + char _kis_pad[256 + 8]; /* pad to max addr length */ + } ki_s; + union { + struct sockaddr _kid_dst; /* STRUCT: remote address */ + char _kid_pad[256 + 8]; /* pad to max addr length */ + } ki_d; + + __uint64_t ki_inode; /* INO_T: fake inode number */ + __uint64_t ki_vnode; /* PTR: if associated with file */ + __uint64_t ki_conn; /* PTR: control block of peer */ + __uint64_t ki_refs; /* PTR: referencing socket */ + __uint64_t ki_nextref; /* PTR: link in refs list */ +}; + +#define ki_src ki_s._kis_src +#define ki_dst ki_d._kid_dst + +#define PCB_SLOP 20 +#define PCB_ALL 0 + +#endif /* _NETBSD_SOURCE */ + +#if defined(_NETBSD_SOURCE) +/* + * PF_ROUTE - Routing table + * + * Three additional levels are defined: + * Fourth: address family, 0 is wildcard + * Fifth: type of info, defined below + * Sixth: flag(s) to mask with for NET_RT_FLAGS + */ +#define NET_RT_DUMP 1 /* dump; may limit to a.f. */ +#define NET_RT_FLAGS 2 /* by flags, e.g. RESOLVING */ +#define NET_RT_OIFLIST 3 /* old NET_RT_IFLIST (pre 1.5) */ +#define NET_RT_IFLIST 4 /* survey interface list */ +#define NET_RT_MAXID 5 + +#define CTL_NET_RT_NAMES { \ + { 0, 0 }, \ + { "dump", CTLTYPE_STRUCT }, \ + { "flags", CTLTYPE_STRUCT }, \ + { 0, 0 }, \ + { "iflist", CTLTYPE_STRUCT }, \ +} +#endif /* _NETBSD_SOURCE */ + +/* + * Maximum queue length specifiable by listen(2). + */ +#ifndef SOMAXCONN +#define SOMAXCONN 128 +#endif + +/* + * Message header for recvmsg and sendmsg calls. + * Used value-result for recvmsg, value only for sendmsg. + */ +struct msghdr { + void *msg_name; /* optional address */ + socklen_t msg_namelen; /* size of address */ + struct iovec *msg_iov; /* scatter/gather array */ + int msg_iovlen; /* # elements in msg_iov */ + void *msg_control; /* ancillary data, see below */ + socklen_t msg_controllen; /* ancillary data buffer len */ + int msg_flags; /* flags on received message */ +}; + +#define MSG_OOB 0x0001 /* process out-of-band data */ +#define MSG_PEEK 0x0002 /* peek at incoming message */ +#define MSG_DONTROUTE 0x0004 /* send without using routing tables */ +#define MSG_EOR 0x0008 /* data completes record */ +#define MSG_TRUNC 0x0010 /* data discarded before delivery */ +#define MSG_CTRUNC 0x0020 /* control data lost before delivery */ +#define MSG_WAITALL 0x0040 /* wait for full request or error */ +#define MSG_DONTWAIT 0x0080 /* this message should be nonblocking */ +#define MSG_BCAST 0x0100 /* this message was rcvd using link-level brdcst */ +#define MSG_MCAST 0x0200 /* this message was rcvd using link-level mcast */ +#define MSG_NOSIGNAL 0x0400 /* do not generate SIGPIPE on EOF */ + +/* + * Header for ancillary data objects in msg_control buffer. + * Used for additional information with/about a datagram + * not expressible by flags. The format is a sequence + * of message elements headed by cmsghdr structures. + */ +struct cmsghdr { + socklen_t cmsg_len; /* data byte count, including hdr */ + int cmsg_level; /* originating protocol */ + int cmsg_type; /* protocol-specific type */ +/* followed by u_char cmsg_data[]; */ +}; + +/* given pointer to struct cmsghdr, return pointer to data */ +#define CMSG_DATA(cmsg) \ + ((u_char *)(void *)(cmsg) + __CMSG_ALIGN(sizeof(struct cmsghdr))) +#define CCMSG_DATA(cmsg) \ + ((const u_char *)(const void *)(cmsg) + \ + __CMSG_ALIGN(sizeof(struct cmsghdr))) + +/* + * Alignment requirement for CMSG struct manipulation. + * This basically behaves the same as ALIGN() ARCH/include/param.h. + * We declare it separately for two reasons: + * (1) avoid dependency between machine/param.h, and (2) to sync with kernel's + * idea of ALIGNBYTES at runtime. + * without (2), we can't guarantee binary compatibility in case of future + * changes in ALIGNBYTES. + */ +#define __CMSG_ALIGN(n) (((n) + __cmsg_alignbytes()) & ~__cmsg_alignbytes()) +#ifdef _KERNEL +#define CMSG_ALIGN(n) __CMSG_ALIGN(n) +#endif + +/* given pointer to struct cmsghdr, return pointer to next cmsghdr */ +#define CMSG_NXTHDR(mhdr, cmsg) \ + (((__caddr_t)(cmsg) + __CMSG_ALIGN((cmsg)->cmsg_len) + \ + __CMSG_ALIGN(sizeof(struct cmsghdr)) > \ + (((__caddr_t)(mhdr)->msg_control) + (mhdr)->msg_controllen)) ? \ + (struct cmsghdr *)0 : \ + (struct cmsghdr *)((__caddr_t)(cmsg) + \ + __CMSG_ALIGN((cmsg)->cmsg_len))) + +/* + * RFC 2292 requires to check msg_controllen, in case that the kernel returns + * an empty list for some reasons. + */ +#define CMSG_FIRSTHDR(mhdr) \ + ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \ + (struct cmsghdr *)(mhdr)->msg_control : \ + (struct cmsghdr *)0) + +#define CMSG_SPACE(l) (__CMSG_ALIGN(sizeof(struct cmsghdr)) + __CMSG_ALIGN(l)) +#define CMSG_LEN(l) (__CMSG_ALIGN(sizeof(struct cmsghdr)) + (l)) + +/* "Socket"-level control message types: */ +#define SCM_RIGHTS 0x01 /* access rights (array of int) */ +#if defined(_NETBSD_SOURCE) +#define SCM_TIMESTAMP 0x02 /* timestamp (struct timeval) */ +#define SCM_CREDS 0x04 /* credentials (struct sockcred) */ +#endif + +/* + * Types of socket shutdown(2). + */ +#define SHUT_RD 0 /* Disallow further receives. */ +#define SHUT_WR 1 /* Disallow further sends. */ +#define SHUT_RDWR 2 /* Disallow further sends/receives. */ + +#include + +__BEGIN_DECLS +int __cmsg_alignbytes(void); +__END_DECLS + +#ifndef _KERNEL + +__BEGIN_DECLS +int accept(int, struct sockaddr * __restrict, socklen_t * __restrict); +int bind(int, const struct sockaddr *, socklen_t); +int connect(int, const struct sockaddr *, socklen_t); +int getpeername(int, struct sockaddr * __restrict, socklen_t * __restrict); +int getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict); +int getsockopt(int, int, int, void * __restrict, socklen_t * __restrict); +int listen(int, int); +ssize_t recv(int, void *, size_t, int); +ssize_t recvfrom(int, void * __restrict, size_t, int, + struct sockaddr * __restrict, socklen_t * __restrict); +ssize_t recvmsg(int, struct msghdr *, int); +ssize_t send(int, const void *, size_t, int); +ssize_t sendto(int, const void *, + size_t, int, const struct sockaddr *, socklen_t); +ssize_t sendmsg(int, const struct msghdr *, int); +int setsockopt(int, int, int, const void *, socklen_t); +int shutdown(int, int); +int sockatmark(int); +int socket(int, int, int) +#if !defined(__LIBC12_SOURCE__) && !defined(_STANDALONE) +__RENAME(__socket30) +#endif + ; +int socketpair(int, int, int, int *); +__END_DECLS +#endif /* !_KERNEL */ + +#endif /* !_SYS_SOCKET_H_ */ diff --git a/StdLib/Include/sys/stat.h b/StdLib/Include/sys/stat.h new file mode 100644 index 0000000000..adc61ecf80 --- /dev/null +++ b/StdLib/Include/sys/stat.h @@ -0,0 +1,213 @@ +/** @file + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made + available under the terms and conditions of the BSD License that + accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1982, 1986, 1989, 1993 + The Regents of the University of California. All rights reserved. + (c) UNIX System Laboratories, Inc. + All or some portions of this file are derived from material licensed + to the University of California by American Telephone and Telegraph + Co. or Unix System Laboratories, Inc. and are reproduced herein with + the permission of UNIX System Laboratories, Inc. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + stat.h 8.12 (Berkeley) 8/17/94 + NetBSD: stat.h,v 1.54 2006/02/24 22:01:30 thorpej Exp + */ +#ifndef _SYS_STAT_H_ +#define _SYS_STAT_H_ + +#include +#include /* XXX */ +#include + +struct stat { + off_t st_size; /* file size, in bytes */ + off_t st_physsize; /* physical space the file consumes */ + dtime_t st_birthtime; /* time of creation */ + dtime_t st_atime; /* time of last access */ + dtime_t st_mtime; /* time of last data modification */ + mode_t st_mode; /* file attributes */ + + blksize_t st_blksize; /* optimal blocksize for I/O */ +#if 0 + uint32_t st_flags; /* user defined flags for file */ + blkcnt_t st_blocks; /* blocks allocated for file */ + ino_t st_ino; /* inode's number */ + time_t st_ctime; /* time of last file status change */ + nlink_t st_nlink; /* number of hard links */ + uid_t st_uid; /* user ID of the file's owner */ + gid_t st_gid; /* group ID of the file's group */ + dev_t st_dev; /* inode's device */ + dev_t st_rdev; /* device type */ + uint32_t st_gen; /* file generation number */ +#endif + uint32_t st_spare[1]; +}; + +#if 0 +#define st_atime st_atimespec.tv_sec +#define st_atimensec st_atimespec.tv_nsec +#define st_mtime st_mtimespec.tv_sec +#define st_mtimensec st_mtimespec.tv_nsec +#define st_ctime st_ctimespec.tv_sec +#define st_ctimensec st_ctimespec.tv_nsec +#define st_birthtime st_birthtimespec.tv_sec +#define st_birthtimensec st_birthtimespec.tv_nsec +#endif + +#define S_ISUID 0004000 /* set user id on execution */ +#define S_ISGID 0002000 /* set group id on execution */ +#define S_ISTXT 0001000 /* sticky bit */ + +#define S_IRWXU 0000700 /* RWX mask for owner */ +#define S_IRUSR 0000400 /* R for owner */ +#define S_IWUSR 0000200 /* W for owner */ +#define S_IXUSR 0000100 /* X for owner */ + +#define S_IREAD S_IRUSR +#define S_IWRITE S_IWUSR +#define S_IEXEC S_IXUSR + +#define S_IRWXG 0000070 /* RWX mask for group */ +#define S_IRGRP 0000040 /* R for group */ +#define S_IWGRP 0000020 /* W for group */ +#define S_IXGRP 0000010 /* X for group */ + +#define S_IRWXO 0000007 /* RWX mask for other */ +#define S_IROTH 0000004 /* R for other */ +#define S_IWOTH 0000002 /* W for other */ +#define S_IXOTH 0000001 /* X for other */ + +/* The Octal access modes, above, fall into the Hex mask 0x00000FFF. + Traditionally, the remainder of the flags are specified in Octal + but they are expressed in Hex here for modern clarity. +*/ +#define _S_IFMT 0x0001F000 /* type-of-file mask */ +#define _S_IFCHR 0x00002000 /* character special */ +#define _S_IFDIR 0x00004000 /* directory */ +#define _S_IFBLK 0x00006000 /* block special */ +#define _S_IFREG 0x00008000 /* regular */ +#define _S_IFSOCK 0x0000C000 /* socket */ +#define _S_ITTY 0x00010000 /* File connects to a TTY device */ +#define _S_IWTTY 0x00020000 /* TTY receives Wide characters */ + +/* UEFI specific (FAT file system) File attributes. + Specifiec in Hexadecimal instead of Octal. + These bits correspond to the xx portion of _S_IFMT +*/ +#define S_IREADONLY 0x00100000 // Read Only File +#define S_IHIDDEN 0x00200000 // Hidden File +#define S_ISYSTEM 0x00400000 // System File +#define S_IDIRECTORY 0x01000000 // Directory +#define S_IARCHIVE 0x02000000 // Archive Bit +#define S_IROFS 0x08000000 /* Read Only File System */ + +#define S_EFISHIFT 20 // LS bit of the UEFI attributes + +//#define _S_IFIFO 0010000 /* named pipe (fifo) */ +//#define _S_IFLNK 0120000 /* symbolic link */ +//#define _S_IFWHT 0160000 /* whiteout */ +//#define _S_ARCH1 0200000 /* Archive state 1, ls -l shows 'a' */ +//#define _S_ARCH2 0400000 /* Archive state 2, ls -l shows 'A' */ +//#define _S_ISVTX 0001000 /* ???? save swapped text even after use */ + + +#define S_IFMT _S_IFMT +#define S_IFBLK _S_IFBLK +#define S_IFREG _S_IFREG +//#define S_IFIFO _S_IFIFO +//#define S_IFCHR _S_IFCHR +//#define S_IFDIR _S_IFDIR +//#define S_IFLNK _S_IFLNK +//#define S_ISVTX _S_ISVTX +//#define S_IFSOCK _S_IFSOCK +//#define S_IFWHT _S_IFWHT + +//#define S_ARCH1 _S_ARCH1 +//#define S_ARCH2 _S_ARCH2 + +#define S_ISDIR(m) ((m & _S_IFMT) == _S_IFDIR) /* directory */ +#define S_ISCHR(m) ((m & _S_IFMT) == _S_IFCHR) /* char special */ +#define S_ISREG(m) ((m & _S_IFMT) == _S_IFREG) /* regular file */ +#define S_ISBLK(m) ((m & _S_IFMT) == _S_IFBLK) /* block special */ +#define S_ISSOCK(m) ((m & _S_IFMT) == _S_IFSOCK) /* socket */ + +//#define S_ISFIFO(m) ((m & _S_IFMT) == _S_IFIFO) /* fifo */ +//#define S_ISLNK(m) ((m & _S_IFMT) == _S_IFLNK) /* symbolic link */ +//#define S_ISWHT(m) ((m & _S_IFMT) == _S_IFWHT) /* whiteout */ + +/* The following three macros have been changed to reflect + access permissions that better reflect the UEFI FAT file system. + UEFI only supports Read or Read+Write instead of the *nix + rwx paradigm. Thus, using 0777 is the closest analog. +*/ +#define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) /* 0777 */ +#define ALLPERMS (S_IRWXU|S_IRWXG|S_IRWXO) /* 0777 */ +#define DEFFILEMODE (S_IRWXU|S_IRWXG|S_IRWXO) /* 0777 */ + +#define S_BLKSIZE 512 /* block size used in the stat struct */ + +/* + * Definitions of flags stored in file flags word. + * + * Super-user and owner changeable flags. + */ +#define UF_SETTABLE 0x0000ffff /* mask of owner changeable flags */ +#define UF_NODUMP 0x00000001 /* do not dump file */ +#define UF_IMMUTABLE 0x00000002 /* file may not be changed */ +#define UF_APPEND 0x00000004 /* writes to file may only append */ +/* UF_NOUNLINK 0x00000010 [NOT IMPLEMENTED] */ +/* + * Super-user changeable flags. + */ +#define SF_SETTABLE 0xffff0000 /* mask of superuser changeable flags */ +#define SF_ARCHIVED 0x00010000 /* file is archived */ +#define SF_IMMUTABLE 0x00020000 /* file may not be changed */ +#define SF_APPEND 0x00040000 /* writes to file may only append */ +/* SF_NOUNLINK 0x00100000 [NOT IMPLEMENTED] */ + +#include + +__BEGIN_DECLS +#ifndef __STAT_SYSCALLS_DECLARED + #define __STAT_SYSCALLS_DECLARED + extern int mkdir (const char *, mode_t); + extern int fstat (int, struct stat *); + extern int lstat (const char *, struct stat *); + extern int stat (const char *, void *); +// extern int chmod (const char *, mode_t); +#endif // __STAT_SYSCALLS_DECLARED +__END_DECLS + +#endif /* !_SYS_STAT_H_ */ diff --git a/StdLib/Include/sys/stdint.h b/StdLib/Include/sys/stdint.h new file mode 100644 index 0000000000..7989fe0156 --- /dev/null +++ b/StdLib/Include/sys/stdint.h @@ -0,0 +1,107 @@ +/* $NetBSD: stdint.h,v 1.5 2005/12/11 12:25:21 christos Exp $ */ + +/*- + * Copyright (c) 2001, 2004 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Klaus Klein. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SYS_STDINT_H_ +#define _SYS_STDINT_H_ + +#include +#include + +#ifndef int8_t +typedef __int8_t int8_t; +#define int8_t __int8_t +#endif + +#ifndef uint8_t +typedef __uint8_t uint8_t; +#define uint8_t __uint8_t +#endif + +#ifndef int16_t +typedef __int16_t int16_t; +#define int16_t __int16_t +#endif + +#ifndef uint16_t +typedef __uint16_t uint16_t; +#define uint16_t __uint16_t +#endif + +#ifndef int32_t +typedef __int32_t int32_t; +#define int32_t __int32_t +#endif + +#ifndef uint32_t +typedef __uint32_t uint32_t; +#define uint32_t __uint32_t +#endif + +#ifndef int64_t +typedef __int64_t int64_t; +#define int64_t __int64_t +#endif + +#ifndef uint64_t +typedef __uint64_t uint64_t; +#define uint64_t __uint64_t +#endif + +#ifndef intptr_t +typedef __intptr_t intptr_t; +#define intptr_t __intptr_t +#endif + +#ifndef uintptr_t +typedef __uintptr_t uintptr_t; +#define uintptr_t __uintptr_t +#endif + +#include + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) +#include +#endif + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) +#include +#endif + +//#include + +#endif /* !_SYS_STDINT_H_ */ diff --git a/StdLib/Include/sys/syslimits.h b/StdLib/Include/sys/syslimits.h new file mode 100644 index 0000000000..a26104c7f6 --- /dev/null +++ b/StdLib/Include/sys/syslimits.h @@ -0,0 +1,53 @@ +/* $NetBSD: syslimits.h,v 1.23 2005/12/11 12:25:21 christos Exp $ */ + +/* + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)syslimits.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _SYS_SYSLIMITS_H_ +#define _SYS_SYSLIMITS_H_ + +#include + +#define ARG_MAX (2 * 1024) /* max bytes for an exec function */ +#ifndef CHILD_MAX + #define CHILD_MAX 128 /* max simultaneous processes */ +#endif +#define MAX_INPUT 255 /* max bytes in terminal input */ +#define NAME_MAX 255 /* max bytes in a file name */ +#ifndef OPEN_MAX + #define OPEN_MAX 20 /* max open files per process */ +#endif +#define PATH_MAX 1024 /* max bytes in pathname */ +#define PIPE_BUF 512 /* max bytes for atomic pipe writes */ + +#define LOGIN_NAME_MAX 17 /* max login name length incl. NUL */ + +#endif /* !_SYS_SYSLIMITS_H_ */ diff --git a/StdLib/Include/sys/termios.h b/StdLib/Include/sys/termios.h new file mode 100644 index 0000000000..b1373dea2b --- /dev/null +++ b/StdLib/Include/sys/termios.h @@ -0,0 +1,304 @@ +/* $NetBSD: termios.h,v 1.29 2005/12/11 12:25:21 christos Exp $ */ + +/* + * Copyright (c) 1988, 1989, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)termios.h 8.3 (Berkeley) 3/28/94 + */ + +#ifndef _SYS_TERMIOS_H_ +#define _SYS_TERMIOS_H_ + +#include +#include + +/* + * Special Control Characters + * + * Index into c_cc[] character array. + * + * Name Subscript Enabled by + */ +#define VEOF 0 /* ICANON */ +#define VEOL 1 /* ICANON */ +#if defined(_NETBSD_SOURCE) +#define VEOL2 2 /* ICANON */ +#endif +#define VERASE 3 /* ICANON */ +#if defined(_NETBSD_SOURCE) +#define VWERASE 4 /* ICANON */ +#endif +#define VKILL 5 /* ICANON */ +#if defined(_NETBSD_SOURCE) +#define VREPRINT 6 /* ICANON */ +#endif +/* 7 spare 1 */ +#define VINTR 8 /* ISIG */ +#define VQUIT 9 /* ISIG */ +#define VSUSP 10 /* ISIG */ +#if defined(_NETBSD_SOURCE) +#define VDSUSP 11 /* ISIG */ +#endif +#define VSTART 12 /* IXON, IXOFF */ +#define VSTOP 13 /* IXON, IXOFF */ +#if defined(_NETBSD_SOURCE) +#define VLNEXT 14 /* IEXTEN */ +#define VDISCARD 15 /* IEXTEN */ +#endif +#define VMIN 16 /* !ICANON */ +#define VTIME 17 /* !ICANON */ +#if defined(_NETBSD_SOURCE) +#define VSTATUS 18 /* ICANON */ +/* 19 spare 2 */ +#endif +#define NCCS 20 + +#define _POSIX_VDISABLE ((unsigned char)'\377') + +#if defined(_NETBSD_SOURCE) +#define CCEQ(val, c) (c == val ? val != _POSIX_VDISABLE : 0) +#endif + +/* + * Input flags - software input processing + */ +#define IGNBRK 0x00000001 /* ignore BREAK condition */ +#define BRKINT 0x00000002 /* map BREAK to SIGINTR */ +#define IGNPAR 0x00000004 /* ignore (discard) parity errors */ +#define PARMRK 0x00000008 /* mark parity and framing errors */ +#define INPCK 0x00000010 /* enable checking of parity errors */ +#define ISTRIP 0x00000020 /* strip 8th bit off chars */ +#define INLCR 0x00000040 /* map NL into CR */ +#define IGNCR 0x00000080 /* ignore CR */ +#define ICRNL 0x00000100 /* map CR to NL (ala CRMOD) */ +#define IXON 0x00000200 /* enable output flow control */ +#define IXOFF 0x00000400 /* enable input flow control */ +#if defined(_NETBSD_SOURCE) +#define IXANY 0x00000800 /* any char will restart after stop */ +#endif +#if defined(_NETBSD_SOURCE) +#define IMAXBEL 0x00002000 /* ring bell on input queue full */ +#endif + +/* + * Output flags - software output processing + */ +#define OPOST 0x00000001 /* enable following output processing */ +#if defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE) +#define ONLCR 0x00000002 /* map NL to CR-NL (ala CRMOD) */ +#endif +#if defined(_NETBSD_SOURCE) +#define OXTABS 0x00000004 /* expand tabs to spaces */ +#define ONOEOT 0x00000008 /* discard EOT's (^D) on output */ +#endif +#if defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE) +#define OCRNL 0x00000010 /* map CR to NL */ +#define ONOCR 0x00000020 /* discard CR's when on column 0 */ +#define ONLRET 0x00000040 /* move to column 0 on CR */ +#endif /* defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE) */ + +/* + * Control flags - hardware control of terminal + */ +#if defined(_NETBSD_SOURCE) +#define CIGNORE 0x00000001 /* ignore control flags */ +#endif +#define CSIZE 0x00000300 /* character size mask */ +#define CS5 0x00000000 /* 5 bits (pseudo) */ +#define CS6 0x00000100 /* 6 bits */ +#define CS7 0x00000200 /* 7 bits */ +#define CS8 0x00000300 /* 8 bits */ +#define CSTOPB 0x00000400 /* send 2 stop bits */ +#define CREAD 0x00000800 /* enable receiver */ +#define PARENB 0x00001000 /* parity enable */ +#define PARODD 0x00002000 /* odd parity, else even */ +#define HUPCL 0x00004000 /* hang up on last close */ +#define CLOCAL 0x00008000 /* ignore modem status lines */ +#if defined(_NETBSD_SOURCE) +#define CRTSCTS 0x00010000 /* RTS/CTS full-duplex flow control */ +#define CRTS_IFLOW CRTSCTS /* XXX compat */ +#define CCTS_OFLOW CRTSCTS /* XXX compat */ +#define CDTRCTS 0x00020000 /* DTR/CTS full-duplex flow control */ +#define MDMBUF 0x00100000 /* DTR/DCD hardware flow control */ +#define CHWFLOW (MDMBUF|CRTSCTS|CDTRCTS) /* all types of hw flow control */ +#endif + + +/* + * "Local" flags - dumping ground for other state + * + * Warning: some flags in this structure begin with + * the letter "I" and look like they belong in the + * input flag. + */ + +#if defined(_NETBSD_SOURCE) +#define ECHOKE 0x00000001 /* visual erase for line kill */ +#endif +#define ECHOE 0x00000002 /* visually erase chars */ +#define ECHOK 0x00000004 /* echo NL after line kill */ +#define ECHO 0x00000008 /* enable echoing */ +#define ECHONL 0x00000010 /* echo NL even if ECHO is off */ +#if defined(_NETBSD_SOURCE) +#define ECHOPRT 0x00000020 /* visual erase mode for hardcopy */ +#define ECHOCTL 0x00000040 /* echo control chars as ^(Char) */ +#endif /* defined(_NETBSD_SOURCE) */ +#define ISIG 0x00000080 /* enable signals INTR, QUIT, [D]SUSP */ +#define ICANON 0x00000100 /* canonicalize input lines */ +#if defined(_NETBSD_SOURCE) +#define ALTWERASE 0x00000200 /* use alternate WERASE algorithm */ +#endif /* defined(_NETBSD_SOURCE) */ +#define IEXTEN 0x00000400 /* enable DISCARD and LNEXT */ +#if defined(_NETBSD_SOURCE) +#define EXTPROC 0x00000800 /* external processing */ +#endif /* defined(_NETBSD_SOURCE) */ +#define TOSTOP 0x00400000 /* stop background jobs on output */ +#if defined(_NETBSD_SOURCE) +#define FLUSHO 0x00800000 /* output being flushed (state) */ +#define NOKERNINFO 0x02000000 /* no kernel output from VSTATUS */ +#define PENDIN 0x20000000 /* re-echo input buffer at next read */ +#endif /* defined(_NETBSD_SOURCE) */ +#define NOFLSH 0x80000000 /* don't flush output on signal */ + +typedef unsigned int tcflag_t; +typedef unsigned char cc_t; +typedef unsigned int speed_t; + +struct termios { + tcflag_t c_iflag; /* input flags */ + tcflag_t c_oflag; /* output flags */ + tcflag_t c_cflag; /* control flags */ + tcflag_t c_lflag; /* local flags */ + cc_t c_cc[NCCS]; /* control chars */ + int c_ispeed; /* input speed */ + int c_ospeed; /* output speed */ +}; + +/* + * Commands passed to tcsetattr() for setting the termios structure. + */ +#define TCSANOW 0 /* make change immediate */ +#define TCSADRAIN 1 /* drain output, then change */ +#define TCSAFLUSH 2 /* drain output, flush input */ +#if defined(_NETBSD_SOURCE) +#define TCSASOFT 0x10 /* flag - don't alter h.w. state */ +#endif + +/* + * Standard speeds + */ +#define B0 0 +#define B50 50 +#define B75 75 +#define B110 110 +#define B134 134 +#define B150 150 +#define B200 200 +#define B300 300 +#define B600 600 +#define B1200 1200 +#define B1800 1800 +#define B2400 2400 +#define B4800 4800 +#define B9600 9600 +#define B19200 19200 +#define B38400 38400 +#if defined(_NETBSD_SOURCE) +#define B7200 7200 +#define B14400 14400 +#define B28800 28800 +#define B57600 57600 +#define B76800 76800 +#define B115200 115200 +#define B230400 230400 +#define B460800 460800 +#define B921600 921600 +#define EXTA 19200 +#define EXTB 38400 +#endif /* defined(_NETBSD_SOURCE) */ + +#ifndef _KERNEL + +#define TCIFLUSH 1 +#define TCOFLUSH 2 +#define TCIOFLUSH 3 +#define TCOOFF 1 +#define TCOON 2 +#define TCIOFF 3 +#define TCION 4 + +#if defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE) +#ifndef pid_t +typedef __pid_t pid_t; +#define pid_t __pid_t +#endif +#endif /* _XOPEN_SOURCE || _NETBSD_SOURCE */ +#include + +__BEGIN_DECLS +speed_t cfgetispeed(const struct termios *); +speed_t cfgetospeed(const struct termios *); +int cfsetispeed(struct termios *, speed_t); +int cfsetospeed(struct termios *, speed_t); +int tcgetattr(int, struct termios *); +int tcsetattr(int, int, const struct termios *); +int tcdrain(int); +int tcflow(int, int); +int tcflush(int, int); +int tcsendbreak(int, int); +#if defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE) +pid_t tcgetsid(int); +#endif /* defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE) */ + + +#if defined(_NETBSD_SOURCE) +void cfmakeraw(struct termios *); +int cfsetspeed(struct termios *, speed_t); +#endif /* defined(_NETBSD_SOURCE) */ +__END_DECLS + +#endif /* !_KERNEL */ + +#if defined(_NETBSD_SOURCE) + +/* + * Include tty ioctl's that aren't just for backwards compatibility + * with the old tty driver. These ioctl definitions were previously + * in . + */ +//#include +#endif + +/* + * END OF PROTECTED INCLUDE. + */ +#endif /* !_SYS_TERMIOS_H_ */ + +#if defined(_NETBSD_SOURCE) +//#include +#endif diff --git a/StdLib/Include/sys/time.h b/StdLib/Include/sys/time.h new file mode 100644 index 0000000000..1dd10b598f --- /dev/null +++ b/StdLib/Include/sys/time.h @@ -0,0 +1,183 @@ +/** @file + System-specific declarations and macros related to time. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1982, 1986, 1993 + The Regents of the University of California. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + time.h 8.5 (Berkeley) 5/4/95 + NetBSD: time.h,v 1.56 2006/06/18 21:09:24 uwe Exp + */ +#ifndef _SYS_TIME_H_ +#define _SYS_TIME_H_ + +#include +#include +#include + +/* + * Traditional *nix structure returned by gettimeofday(2) system call, + * and used in other calls. + */ +struct timeval { + LONG32 tv_sec; /* seconds */ + LONG32 tv_usec; /* and microseconds */ +}; + +/* + * Structure defined by POSIX.1b to be like a timeval. + * This works within EFI since the times really are time_t. + * Note that this is not exactly POSIX compliant since tv_nsec + * is a UINT32 instead of the compliant long. + */ +struct timespec { + time_t tv_sec; /* seconds */ + UINT32 tv_nsec; /* and nanoseconds */ +}; + +#define TIMEVAL_TO_TIMESPEC(tv, ts) do { \ + (ts)->tv_sec = (tv)->tv_sec; \ + (ts)->tv_nsec = (tv)->tv_usec * 1000; \ +} while (/*CONSTCOND*/0) +#define TIMESPEC_TO_TIMEVAL(tv, ts) do { \ + (tv)->tv_sec = (ts)->tv_sec; \ + (tv)->tv_usec = (ts)->tv_nsec / 1000; \ +} while (/*CONSTCOND*/0) + +/* Operations on timevals. */ +#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0 +#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) +#define timercmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec == (uvp)->tv_sec) ? \ + ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ + ((tvp)->tv_sec cmp (uvp)->tv_sec)) +#define timeradd(tvp, uvp, vvp) \ + do { \ + (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ + (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ + if ((vvp)->tv_usec >= 1000000) { \ + (vvp)->tv_sec++; \ + (vvp)->tv_usec -= 1000000; \ + } \ + } while (/* CONSTCOND */ 0) +#define timersub(tvp, uvp, vvp) \ + do { \ + (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ + (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ + if ((vvp)->tv_usec < 0) { \ + (vvp)->tv_sec--; \ + (vvp)->tv_usec += 1000000; \ + } \ + } while (/* CONSTCOND */ 0) + +/* Operations on timespecs. */ +#define timespecclear(tsp) (tsp)->tv_sec = (tsp)->tv_nsec = 0 +#define timespecisset(tsp) ((tsp)->tv_sec || (tsp)->tv_nsec) +#define timespeccmp(tsp, usp, cmp) \ + (((tsp)->tv_sec == (usp)->tv_sec) ? \ + ((tsp)->tv_nsec cmp (usp)->tv_nsec) : \ + ((tsp)->tv_sec cmp (usp)->tv_sec)) +#define timespecadd(tsp, usp, vsp) \ + do { \ + (vsp)->tv_sec = (tsp)->tv_sec + (usp)->tv_sec; \ + (vsp)->tv_nsec = (tsp)->tv_nsec + (usp)->tv_nsec; \ + if ((vsp)->tv_nsec >= 1000000000L) { \ + (vsp)->tv_sec++; \ + (vsp)->tv_nsec -= 1000000000L; \ + } \ + } while (/* CONSTCOND */ 0) +#define timespecsub(tsp, usp, vsp) \ + do { \ + (vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec; \ + (vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec; \ + if ((vsp)->tv_nsec < 0) { \ + (vsp)->tv_sec--; \ + (vsp)->tv_nsec += 1000000000L; \ + } \ + } while (/* CONSTCOND */ 0) + +/* + * Names of the interval timers, and structure + * defining a timer setting. + */ +#define ITIMER_REAL 0 +#define ITIMER_VIRTUAL 1 +#define ITIMER_PROF 2 + +struct itimerval { + struct timeval it_interval; /* timer interval */ + struct timeval it_value; /* current value */ +}; + +/* + * Structure defined by POSIX.1b to be like a itimerval, but with + * timespecs. Used in the timer_*() system calls. + */ +struct itimerspec { + struct timespec it_interval; + struct timespec it_value; +}; + +#define CLOCK_REALTIME 0 +#define CLOCK_VIRTUAL 1 +#define CLOCK_PROF 2 +#define CLOCK_MONOTONIC 3 + +#define TIMER_RELTIME 0x0 /* relative timer */ +#define TIMER_ABSTIME 0x1 /* absolute timer */ + +#if 0 + #if (_POSIX_C_SOURCE - 0) >= 200112L || \ + (defined(_XOPEN_SOURCE) && defined(_XOPEN_SOURCE_EXTENDED)) || \ + (_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE) + #include + #endif +#endif /* if 0 */ + +#include +#include + +/* Functions useful for dealing with EFI */ +__BEGIN_DECLS + +/* Convert an EFI_TIME structure into a time_t value. */ +time_t Efi2Time( EFI_TIME *EfiBDtime); + +/* Convert an EFI_TIME structure into a C Standard tm structure. */ +void Efi2Tm( EFI_TIME *EfiBDtime, struct tm *NewTime); + +__END_DECLS + +#endif /* !_SYS_TIME_H_ */ diff --git a/StdLib/Include/sys/types.h b/StdLib/Include/sys/types.h new file mode 100644 index 0000000000..9e95fd3ea3 --- /dev/null +++ b/StdLib/Include/sys/types.h @@ -0,0 +1,301 @@ +/** @file + System type declarations. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: types.h,v 1.71.12.1 2007/09/27 13:40:47 xtraeme Exp + types.h 8.4 (Berkeley) 1/21/94 +**/ +#ifndef _SYS_TYPES_H_ +#define _SYS_TYPES_H_ + +#include + +/* Machine type dependent parameters. */ +#include + +#include +#include + + +#include + +#ifndef int8_t + typedef __int8_t int8_t; + #define int8_t __int8_t +#endif + +#ifndef uint8_t + typedef __uint8_t uint8_t; + #define uint8_t __uint8_t +#endif + +#ifndef int16_t + typedef __int16_t int16_t; + #define int16_t __int16_t +#endif + +#ifndef uint16_t + typedef __uint16_t uint16_t; + #define uint16_t __uint16_t +#endif + +#ifndef int32_t + typedef __int32_t int32_t; + #define int32_t __int32_t +#endif + +#ifndef uint32_t + typedef __uint32_t uint32_t; + #define uint32_t __uint32_t +#endif + +#ifndef int64_t + typedef __int64_t int64_t; + #define int64_t __int64_t +#endif + +#ifndef uint64_t + typedef __uint64_t uint64_t; + #define uint64_t __uint64_t +#endif + +typedef uint8_t u_int8_t; +typedef uint16_t u_int16_t; +typedef uint32_t u_int32_t; +typedef uint64_t u_int64_t; + +#include + +#if defined(_NETBSD_SOURCE) + typedef UINT8 u_char; + typedef UINT16 u_short; + typedef UINTN u_int; + typedef ULONGN u_long; + + typedef UINT8 unchar; /* Sys V compatibility */ + typedef UINT16 ushort; /* Sys V compatibility */ + typedef UINTN uint; /* Sys V compatibility */ + typedef ULONGN ulong; /* Sys V compatibility */ + + typedef u_long cpuid_t; +#endif + +typedef uint64_t u_quad_t; /* quads */ +typedef int64_t quad_t; +typedef quad_t * qaddr_t; + +/* + * The types longlong_t and u_longlong_t exist for use with the + * Sun-derived XDR routines involving these types, and their usage + * in other contexts is discouraged. Further note that these types + * may not be equivalent to "long long" and "unsigned long long", + * they are only guaranteed to be signed and unsigned 64-bit types + * respectively. Portable programs that need 64-bit types should use + * the C99 types int64_t and uint64_t instead. + */ + +typedef int64_t longlong_t; /* for XDR */ +typedef uint64_t u_longlong_t; /* for XDR */ + +typedef int64_t blkcnt_t; /* fs block count */ +typedef uint32_t blksize_t; /* fs optimal block size */ + +#ifndef fsblkcnt_t + typedef __fsblkcnt_t fsblkcnt_t; /* fs block count (statvfs) */ + #define fsblkcnt_t __fsblkcnt_t +#endif + +#ifndef fsfilcnt_t + typedef __fsfilcnt_t fsfilcnt_t; /* fs file count */ + #define fsfilcnt_t __fsfilcnt_t +#endif + +#ifndef caddr_t + typedef __caddr_t caddr_t; /* core address */ + #define caddr_t __caddr_t +#endif + +#ifdef __daddr_t + typedef __daddr_t daddr_t; /* disk address */ + #undef __daddr_t +#else + typedef int64_t daddr_t; /* disk address */ +#endif + +typedef uint32_t dev_t; /* device number */ +typedef uint32_t fixpt_t; /* fixed point number */ + +#ifndef gid_t + typedef __gid_t gid_t; /* group id */ + #define gid_t __gid_t +#endif + +typedef uint32_t id_t; /* group id, process id or user id */ +typedef uint64_t ino_t; /* inode number */ +typedef EFI_LONG_T key_t; /* IPC key (for Sys V IPC) */ + +#ifndef mode_t + typedef __mode_t mode_t; /* permissions */ + #define mode_t __mode_t +#endif + +typedef uint32_t nlink_t; /* link count */ + +#ifndef off_t + typedef __off_t off_t; /* file offset */ + #define off_t __off_t +#endif + +#ifndef pid_t + typedef __pid_t pid_t; /* process id */ + #define pid_t __pid_t +#endif +typedef int32_t lwpid_t; /* LWP id */ +typedef quad_t rlim_t; /* resource limit */ +typedef int32_t segsz_t; /* segment size */ +typedef int32_t swblk_t; /* swap offset */ + +#ifndef uid_t + typedef __uid_t uid_t; /* user id */ + #define uid_t __uid_t +#endif + +typedef int64_t dtime_t; /* on-disk time_t */ + +#if defined(_LIBC) + /* + * semctl(2)'s argument structure. This is here for the benefit of + * . It is not in the user's namespace in SUSv2. + * The SUSv2 semctl(2) takes variable arguments. + */ + union __semun { + int val; /* value for SETVAL */ + struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */ + unsigned short *array; /* array for GETALL & SETALL */ + }; + /* For the same reason as above */ + #include + typedef intptr_t semid_t; +#endif /* _LIBC */ + +/* + * These belong in EfiSysCall.h, but are also placed here to ensure that + * long arguments will be promoted to off_t if the program fails to + * include that header or explicitly cast them to off_t. + */ +#ifndef __OFF_T_SYSCALLS_DECLARED + #define __OFF_T_SYSCALLS_DECLARED + __BEGIN_DECLS + extern off_t lseek (int, off_t, int); + extern int truncate (const char *, off_t); + extern int ftruncate (int, off_t); + __END_DECLS +#endif /* __OFF_T_SYSCALLS_DECLARED */ + +#if defined(_NETBSD_SOURCE) + /* Major, minor numbers, dev_t's. */ + #define major(x) ((int32_t)((((x) & 0x000fff00) >> 8))) + #define minor(x) ((int32_t)((((x) & 0xfff00000) >> 12) | \ + (((x) & 0x000000ff) >> 0))) + #define makedev(x,y) ((dev_t)((((x) << 8) & 0x000fff00) | \ + (((y) << 12) & 0xfff00000) | \ + (((y) << 0) & 0x000000ff))) +#endif + +#if defined(_BSD_CLOCK_T_) && defined(_EFI_CLOCK_T) + typedef _BSD_CLOCK_T_ clock_t; + #undef _BSD_CLOCK_T_ + #undef _EFI_CLOCK_T +#endif + +#if defined(_BSD_SIZE_T_) && defined(_EFI_SIZE_T_) + typedef _BSD_SIZE_T_ size_t; + #define _SIZE_T + #undef _BSD_SIZE_T_ + #undef _EFI_SIZE_T_ +#endif + +#ifdef _BSD_SSIZE_T_ + typedef _BSD_SSIZE_T_ ssize_t; + #undef _BSD_SSIZE_T_ +#endif + +#if defined(_BSD_TIME_T_) && defined(_EFI_TIME_T) + typedef _BSD_TIME_T_ time_t; + #undef _BSD_TIME_T_ + #undef _EFI_TIME_T +#endif + +#ifdef _BSD_CLOCKID_T_ + typedef _BSD_CLOCKID_T_ clockid_t; + #undef _BSD_CLOCKID_T_ +#endif + +#ifdef _BSD_TIMER_T_ + typedef _BSD_TIMER_T_ timer_t; + #undef _BSD_TIMER_T_ +#endif + +#ifdef _BSD_SUSECONDS_T_ + typedef _BSD_SUSECONDS_T_ suseconds_t; + #undef _BSD_SUSECONDS_T_ +#endif + +#ifdef _BSD_USECONDS_T_ + typedef _BSD_USECONDS_T_ useconds_t; + #undef _BSD_USECONDS_T_ +#endif + +#ifdef _NETBSD_SOURCE + #include + #define NBBY __NBBY + + typedef struct kauth_cred *kauth_cred_t; + +#endif + +#if 0 + #if !defined(_KERNEL) && !defined(_STANDALONE) + #if (_POSIX_C_SOURCE - 0L) >= 199506L || (_XOPEN_SOURCE - 0) >= 500 || \ + defined(_NETBSD_SOURCE) + #include + #endif + #endif +#endif /* if 0 */ + +#endif /* !_SYS_TYPES_H_ */ diff --git a/StdLib/Include/sys/uio.h b/StdLib/Include/sys/uio.h new file mode 100644 index 0000000000..8c3ee8fbf9 --- /dev/null +++ b/StdLib/Include/sys/uio.h @@ -0,0 +1,123 @@ +/* $NetBSD: uio.h,v 1.34 2006/03/01 12:38:32 yamt Exp $ */ + +/* + * Copyright (c) 1982, 1986, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)uio.h 8.5 (Berkeley) 2/22/94 + */ + +#ifndef _SYS_UIO_H_ +#define _SYS_UIO_H_ + +#ifdef _KERNEL +#ifndef __UIO_EXPOSE +#define __UIO_EXPOSE +#endif +#endif + +#include +#include + +#ifdef _BSD_SIZE_T_ +typedef _BSD_SIZE_T_ size_t; +#undef _BSD_SIZE_T_ +#endif + +#ifdef _BSD_SSIZE_T_ +typedef _BSD_SSIZE_T_ ssize_t; +#undef _BSD_SSIZE_T_ +#endif + +struct iovec { + void *iov_base; /* Base address. */ + size_t iov_len; /* Length. */ +}; + +#if defined(_NETBSD_SOURCE) +#include + +#ifndef off_t +typedef __off_t off_t; /* file offset */ +#define off_t __off_t +#endif + +enum uio_rw { UIO_READ, UIO_WRITE }; + +/* Segment flag values. */ +enum uio_seg { + UIO_USERSPACE, /* from user data space */ + UIO_SYSSPACE /* from system space */ +}; + +#ifdef __UIO_EXPOSE + +struct uio { + struct iovec *uio_iov; /* pointer to array of iovecs */ + int uio_iovcnt; /* number of iovecs in array */ + off_t uio_offset; /* offset into file this uio corresponds to */ + size_t uio_resid; /* residual i/o count */ + enum uio_rw uio_rw; /* see above */ + struct vmspace *uio_vmspace; +}; +#define UIO_SETUP_SYSSPACE(uio) uio_setup_sysspace(uio) + +#endif /* __UIO_EXPOSE */ + +/* + * Limits + */ +/* Deprecated: use IOV_MAX from instead. */ +#define UIO_MAXIOV 1024 /* max 1K of iov's */ +#endif /* _NETBSD_SOURCE */ + +#ifdef _KERNEL +#include + +MALLOC_DECLARE(M_IOV); + +#define UIO_SMALLIOV 8 /* 8 on stack, else malloc */ + +void uio_setup_sysspace(struct uio *); +#endif + +#ifndef _KERNEL +#include + +__BEGIN_DECLS +#if defined(_NETBSD_SOURCE) +ssize_t preadv(int, const struct iovec *, int, off_t); +ssize_t pwritev(int, const struct iovec *, int, off_t); +#endif /* _NETBSD_SOURCE */ +ssize_t readv(int, const struct iovec *, int); +ssize_t writev(int, const struct iovec *, int); +__END_DECLS +#else +int ureadc(int, struct uio *); +#endif /* !_KERNEL */ + +#endif /* !_SYS_UIO_H_ */ diff --git a/StdLib/Include/time.h b/StdLib/Include/time.h new file mode 100644 index 0000000000..386629cc6b --- /dev/null +++ b/StdLib/Include/time.h @@ -0,0 +1,311 @@ +/** @file + The header defines two macros, and declares several types and + functions for manipulating time. Many functions deal with a calendar time + that represents the current date (according to the Gregorian calendar) and + time. Some functions deal with local time, which is the calendar time + expressed for some specific time zone, and with Daylight Saving Time, which + is a temporary change in the algorithm for determining local time. The local + time zone and Daylight Saving Time are implementation-defined. + + The macros defined are NULL; and CLOCKS_PER_SEC which expands to an + expression with type clock_t (described below) that is the number per second + of the value returned by the clock function. + + The types declared are size_t along with clock_t and time_t which are + arithmetic types capable of representing times; and struct tm which holds + the components of a calendar time, called the broken-down time. + + The range and precision of times representable in clock_t and time_t are + implementation-defined. The tm structure shall contain at least the following + members, in any order. The semantics of the members and their normal ranges + are expressed in the comments. + - int tm_sec; // seconds after the minute - [0, 60] + - int tm_min; // minutes after the hour - [0, 59] + - int tm_hour; // hours since midnight - [0, 23] + - int tm_mday; // day of the month - [1, 31] + - int tm_mon; // months since January - [0, 11] + - int tm_year; // years since 1900 + - int tm_wday; // days since Sunday - [0, 6] + - int tm_yday; // days since January 1 - [0, 365] + - int tm_isdst; // Daylight Saving Time flag + + The value of tm_isdst is positive if Daylight Saving Time is in effect, zero + if Daylight Saving Time is not in effect, and negative if the information + is not available. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _TIME_H +#define _TIME_H +#include + +#define CLOCKS_PER_SEC __getCPS() + +#ifdef _EFI_SIZE_T_ + typedef _EFI_SIZE_T_ size_t; + #undef _EFI_SIZE_T_ + #undef _BSD_SIZE_T_ +#endif + +/** An arithmetic type capable of representing values returned by clock(); **/ +#ifdef _EFI_CLOCK_T + typedef _EFI_CLOCK_T clock_t; + #undef _EFI_CLOCK_T +#endif + +/** An arithmetic type capable of representing values returned as calendar time + values, such as that returned by mktime(); +**/ +#ifdef _EFI_TIME_T + typedef _EFI_TIME_T time_t; + #undef _EFI_TIME_T +#endif + +/** A structure holding the components of a calendar time, called the + broken-down time. The first nine (9) members are as mandated by the + C95 standard. Additional fields have been added for EFI support. +**/ +struct tm { + int tm_year; // years since 1900 + int tm_mon; // months since January — [0, 11] + int tm_mday; // day of the month — [1, 31] + int tm_hour; // hours since midnight — [0, 23] + int tm_min; // minutes after the hour — [0, 59] + int tm_sec; // seconds after the minute — [0, 60] + int tm_wday; // days since Sunday — [0, 6] + int tm_yday; // days since January 1 — [0, 365] + int tm_isdst; // Daylight Saving Time flag + int tm_zoneoff; // EFI TimeZone offset, -1440 to 1440 or 2047 + int tm_daylight; // EFI Daylight flags + UINT32 tm_Nano; // EFI Nanosecond value +}; + +/* ############### Time Manipulation Functions ########################## */ + +/** The clock function determines the processor time used. + + @return The clock function returns the implementation’s best + approximation to the processor time used by the program since the + beginning of an implementation-defined era related only to the + program invocation. To determine the time in seconds, the value + returned by the clock function should be divided by the value of + the macro CLOCKS_PER_SEC. If the processor time used is not + available or its value cannot be represented, the function + returns the value (clock_t)(-1). + + On IA32 or X64 platforms, the value returned is the number of + CPU TimeStamp Counter ticks since the appliation started. +**/ +clock_t EFIAPI clock(void); + +/** +**/ +double EFIAPI difftime(time_t time1, time_t time0); + +/** The mktime function converts the broken-down time, expressed as local time, + in the structure pointed to by timeptr into a calendar time value with the + same encoding as that of the values returned by the time function. The + original values of the tm_wday and tm_yday components of the structure are + ignored, and the original values of the other components are not + restricted to the ranges indicated above.270) On successful completion, + the values of the tm_wday and tm_yday components of the structure are set + appropriately, and the other components are set to represent the specified + calendar time, but with their values forced to the ranges indicated above; + the final value of tm_mday is not set until tm_mon and tm_year + are determined. + + @return The mktime function returns the specified calendar time encoded + as a value of type time_t. If the calendar time cannot be + represented, the function returns the value (time_t)(-1). +**/ +time_t EFIAPI mktime(struct tm *timeptr); + +/** +**/ +time_t EFIAPI time(time_t *timer); + +/* ################# Time Conversion Functions ########################## */ + +/** +**/ +char * EFIAPI asctime(const struct tm *timeptr); + +/** +**/ +char * EFIAPI ctime(const time_t *timer); + +/** +**/ +struct tm * EFIAPI gmtime(const time_t *timer); + +/** +**/ +struct tm * EFIAPI localtime(const time_t *timer); + +/** The strftime function places characters into the array pointed to by s as + controlled by the string pointed to by format. The format shall be a + multibyte character sequence, beginning and ending in its initial shift + state. The format string consists of zero or more conversion specifiers + and ordinary multibyte characters. A conversion specifier consists of + a % character, possibly followed by an E or O modifier character + (described below), followed by a character that determines the behavior of + the conversion specifier. + + All ordinary multibyte characters (including the terminating null + character) are copied unchanged into the array. If copying takes place + between objects that overlap, the behavior is undefined. No more than + maxsize characters are placed into the array. 3 Each conversion specifier + is replaced by appropriate characters as described in the following list. + The appropriate characters are determined using the LC_TIME category of + the current locale and by the values of zero or more members of the + broken-down time structure pointed to by timeptr, as specified in brackets + in the description. If any of the specified values is outside the normal + range, the characters stored are unspecified. + + %a is replaced by the locale’s abbreviated weekday name. [tm_wday] + %A is replaced by the locale’s full weekday name. [tm_wday] + %b is replaced by the locale’s abbreviated month name. [tm_mon] + %B is replaced by the locale’s full month name. [tm_mon] + %c is replaced by the locale’s appropriate date and time representation. + %C is replaced by the year divided by 100 and truncated to an integer, + as a decimal number (00-99). [tm_year] + %d is replaced by the day of the month as a decimal number (01-31). [tm_mday] + %D is equivalent to "%m/%d/%y". [tm_mon, tm_mday, tm_year] + %e is replaced by the day of the month as a decimal number (1-31); + a single digit is preceded by a space. [tm_mday] + %F is equivalent to "%Y-%m-%d" (the ISO 8601 date format). + [tm_year, tm_mon, tm_mday] + %g is replaced by the last 2 digits of the week-based year (see below) as + a decimal number (00-99). [tm_year, tm_wday, tm_yday] + %G is replaced by the week-based year (see below) as a decimal number + (e.g., 1997). [tm_year, tm_wday, tm_yday] + %h is equivalent to "%b". [tm_mon] + %H is replaced by the hour (24-hour clock) as a decimal number (00-23). [tm_hour] + %I is replaced by the hour (12-hour clock) as a decimal number (01-12). [tm_hour] + %j is replaced by the day of the year as a decimal number (001-366). [tm_yday] + %m is replaced by the month as a decimal number (01-12). [tm_mon] + %M is replaced by the minute as a decimal number (00-59). [tm_min] + %n is replaced by a new-line character. + %p is replaced by the locale’s equivalent of the AM/PM designations + associated with a 12-hour clock. [tm_hour] + %r is replaced by the locale’s 12-hour clock time. [tm_hour, tm_min, tm_sec] + %R is equivalent to "%H:%M". [tm_hour, tm_min] + %S is replaced by the second as a decimal number (00-60). [tm_sec] + %t is replaced by a horizontal-tab character. + %T is equivalent to "%H:%M:%S" (the ISO 8601 time format). + [tm_hour, tm_min, tm_sec] + %u is replaced by the ISO 8601 weekday as a decimal number (1-7), + where Monday is 1. [tm_wday] + %U is replaced by the week number of the year (the first Sunday as the + first day of week 1) as a decimal number (00-53). [tm_year, tm_wday, tm_yday] + %V is replaced by the ISO 8601 week number (see below) as a decimal number + (01-53). [tm_year, tm_wday, tm_yday] + %w is replaced by the weekday as a decimal number (0-6), where Sunday is 0. + [tm_wday] + %W is replaced by the week number of the year (the first Monday as the + first day of week 1) as a decimal number (00-53). [tm_year, tm_wday, tm_yday] + %x is replaced by the locale’s appropriate date representation. + %X is replaced by the locale’s appropriate time representation. + %y is replaced by the last 2 digits of the year as a decimal + number (00-99). [tm_year] + %Y is replaced by the year as a decimal number (e.g., 1997). [tm_year] + %z is replaced by the offset from UTC in the ISO 8601 format "-0430" + (meaning 4 hours 30 minutes behind UTC, west of Greenwich), or by no + characters if no time zone is determinable. [tm_isdst] + %Z is replaced by the locale's time zone name or abbreviation, or by no + characters if no time zone is determinable. [tm_isdst] + %% is replaced by %. + + Some conversion specifiers can be modified by the inclusion of an E or O + modifier character to indicate an alternative format or specification. + If the alternative format or specification does not exist for the current + locale, the modifier is ignored. %Ec is replaced by the locale’s + alternative date and time representation. + + %EC is replaced by the name of the base year (period) in the locale’s + alternative representation. + %Ex is replaced by the locale’s alternative date representation. + %EX is replaced by the locale’s alternative time representation. + %Ey is replaced by the offset from %EC (year only) in the locale’s + alternative representation. + %EY is replaced by the locale’s full alternative year representation. + %Od is replaced by the day of the month, using the locale’s alternative + numeric symbols (filled as needed with leading zeros, or with leading + spaces if there is no alternative symbol for zero). + %Oe is replaced by the day of the month, using the locale’s alternative + numeric symbols (filled as needed with leading spaces). + %OH is replaced by the hour (24-hour clock), using the locale’s + alternative numeric symbols. + %OI is replaced by the hour (12-hour clock), using the locale’s + alternative numeric symbols. + %Om is replaced by the month, using the locale’s alternative numeric symbols. + %OM is replaced by the minutes, using the locale’s alternative numeric symbols. + %OS is replaced by the seconds, using the locale’s alternative numeric symbols. + %Ou is replaced by the ISO 8601 weekday as a number in the locale’s + alternative representation, where Monday is 1. + %OU is replaced by the week number, using the locale’s alternative numeric symbols. + %OV is replaced by the ISO 8601 week number, using the locale’s alternative + numeric symbols. + %Ow is replaced by the weekday as a number, using the locale’s alternative + numeric symbols. + %OW is replaced by the week number of the year, using the locale’s + alternative numeric symbols. + %Oy is replaced by the last 2 digits of the year, using the locale’s + alternative numeric symbols. + + %g, %G, and %V give values according to the ISO 8601 week-based year. In + this system, weeks begin on a Monday and week 1 of the year is the week + that includes January 4th, which is also the week that includes the first + Thursday of the year, and is also the first week that contains at least + four days in the year. If the first Monday of January is the 2nd, 3rd, or + 4th, the preceding days are part of the last week of the preceding year; + thus, for Saturday 2nd January 1999, %G is replaced by 1998 and %V is + replaced by 53. If December 29th, 30th, or 31st is a Monday, it and any + following days are part of week 1 of the following year. Thus, for Tuesday + 30th December 1997, %G is replaced by 1998 and %V is replaced by 01. + + If a conversion specifier is not one of the above, the behavior is undefined. + + In the "C" locale, the E and O modifiers are ignored and the replacement + strings for the following specifiers are: + %a the first three characters of %A. + %A one of "Sunday", "Monday", ... , "Saturday". + %b the first three characters of %B. + %B one of "January", "February", ... , "December". + %c equivalent to "%a %b %e %T %Y". + %p one of "AM" or "PM". + %r equivalent to "%I:%M:%S %p". + %x equivalent to "%m/%d/%y". + %X equivalent to %T. + %Z implementation-defined. + + @param s Pointer to the buffer in which to store the result. + @param maxsize Maximum number of characters to put into buffer s. + @param format Format string, as described above. + @param timeptr Pointer to a broken-down time structure containing the + time to format. + + @return If the total number of resulting characters including the + terminating null character is not more than maxsize, the + strftime function returns the number of characters placed into + the array pointed to by s not including the terminating null + character. Otherwise, zero is returned and the contents of the + array are indeterminate. +**/ +size_t EFIAPI strftime( char * __restrict s, size_t maxsize, + const char * __restrict format, + const struct tm * __restrict timeptr); + +/* ################# Implementation Functions ########################### */ + +clock_t EFIAPI __getCPS(void); + +#endif /* _TIME_H */ diff --git a/StdLib/Include/wchar.h b/StdLib/Include/wchar.h new file mode 100644 index 0000000000..360bdacc32 --- /dev/null +++ b/StdLib/Include/wchar.h @@ -0,0 +1,539 @@ +/** @file + Extended multibyte and wide character utilities. + + Within this implementation, multibyte characters are represented using the + Unicode UTF-8 encoding and wide characters are represented using the + 16-bit UCS-2 encoding. + + Unless explicitly stated otherwise, if the execution of a function declared + in this file causes copying to take place between objects that overlap, the + behavior is undefined. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _WCHAR_H +#define _WCHAR_H +#include +#include +#include +#include +#include + +#if defined(_MSC_VER) + #pragma warning ( disable : 4142 ) +#endif + +#ifdef _EFI_SIZE_T_ + typedef _EFI_SIZE_T_ size_t; + #undef _BSD_SIZE_T_ + #undef _EFI_SIZE_T_ +#endif + +#ifndef __cplusplus + #ifdef _EFI_WCHAR_T + typedef _EFI_WCHAR_T wchar_t; + #undef _BSD_WCHAR_T_ + #undef _EFI_WCHAR_T + #endif +#endif + +/* mbstate_t is an opaque object, that must not be an array type, used to keep + conversion state during multibyte stream conversions. + */ +#ifdef _BSD_MBSTATE_T_ + typedef _BSD_MBSTATE_T_ mbstate_t; + #undef _BSD_MBSTATE_T_ +#endif + +/* wint_t is an integer type unchanged by default argument promotions that can + hold any value corresponding to members of the extended character set, as + well as at least one value that does not correspond to any member of the + extended character set: WEOF. +*/ +#ifdef _EFI_WINT_T + typedef _EFI_WINT_T wint_t; + #undef _BSD_WINT_T_ + #undef _EFI_WINT_T +#endif + +/* Since wchar_t is an unsigned 16-bit value, it has a minimum value of 0, and + a maximum value defined by __USHRT_MAX (65535 on IA processors). +*/ +#ifndef WCHAR_MIN + #define WCHAR_MIN 0 + #define WCHAR_MAX __USHRT_MAX +#endif + +/* limits of wint_t */ +#ifndef WINT_MIN + #define WINT_MIN _EFI_WINT_MIN /* wint_t */ + #define WINT_MAX _EFI_WINT_MAX /* wint_t */ +#endif + +/* WEOF expands to a constant expression of type wint_t whose value does not + correspond to any member of the extended character set. It is accepted + (and returned) by several functions, declared in this file, to indicate + end-of-file, that is, no more input from a stream. It is also used as a + wide character value that does not correspond to any member of the + extended character set. +*/ +#ifndef WEOF + #define WEOF ((wint_t)-1) +#endif + +/* tm is declared here as an incomplete structure type. The full structure + declaration is in . +*/ +struct tm; + +/* ############### Formatted Input/Output Functions ##################### */ + +/** +The fwprintf function writes output to the stream pointed to by stream, under +control of the wide string pointed to by format that specifies how subsequent arguments +are converted for output. If there are insufficient arguments for the format, the behavior +is undefined. If the format is exhausted while arguments remain, the excess arguments +are evaluated (as always) but are otherwise ignored. The fwprintf function returns +when the end of the format string is encountered. + +The fwprintf function returns the number of wide characters transmitted, or a negative +value if an output or encoding error occurred. +**/ +int fwprintf(FILE * __restrict stream, const wchar_t * __restrict format, ...); + +/** +The fwscanf function reads input from the stream pointed to by stream, under +control of the wide string pointed to by format that specifies the admissible input +sequences and how they are to be converted for assignment, using subsequent arguments +as pointers to the objects to receive the converted input. If there are insufficient +arguments for the format, the behavior is undefined. If the format is exhausted while +arguments remain, the excess arguments are evaluated (as always) but are otherwise +ignored. + +The fwscanf function returns the value of the macro EOF if an input failure occurs +before any conversion. Otherwise, the function returns the number of input items +assigned, which can be fewer than provided for, or even zero, in the event of an early +matching failure. +**/ +int fwscanf(FILE * __restrict stream, const wchar_t * __restrict format, ...); + +/** +The swprintf function is equivalent to fwprintf, except that the argument s +specifies an array of wide characters into which the generated output is to be written, +rather than written to a stream. No more than n wide characters are written, including a +terminating null wide character, which is always added (unless n is zero). + +The swprintf function returns the number of wide characters written in the array, not +counting the terminating null wide character, or a neg ative value if an encoding error +occurred or if n or more wide characters were requested to be written. +**/ +int swprintf(wchar_t * __restrict s, size_t n, const wchar_t * __restrict format, ...); + +/** +**/ +int swscanf(const wchar_t * __restrict s, const wchar_t * __restrict format, ...); + +/** +**/ +int vfwprintf(FILE * __restrict stream, const wchar_t * __restrict format, va_list arg); + +/** +**/ +int vfwscanf(FILE * __restrict stream, const wchar_t * __restrict format, va_list arg); + +/** +**/ +int vswprintf(wchar_t * __restrict s, size_t n, const wchar_t * __restrict format, va_list arg); + +/** +**/ +int vswscanf(const wchar_t * __restrict s, const wchar_t * __restrict format, va_list arg); + +/** +**/ +int vwprintf(const wchar_t * __restrict format, va_list arg); + +/** +**/ +int vwscanf(const wchar_t * __restrict format, va_list arg); + +/** +**/ +int wprintf(const wchar_t * __restrict format, ...); + +/** +**/ +int wscanf(const wchar_t * __restrict format, ...); + +/* ################### Input/Output Functions ########################### */ + + +/** +**/ +wint_t fgetwc(FILE *stream); + +/** +**/ +wchar_t *fgetws(wchar_t * __restrict s, int n, FILE * __restrict stream); + +/** +**/ +wint_t fputwc(wchar_t c, FILE *stream); + +/** +**/ +int fputws(const wchar_t * __restrict s, FILE * __restrict stream); + +/** +**/ +int fwide(FILE *stream, int mode); + +/** +**/ +wint_t getwc(FILE *stream); + +/** +**/ +wint_t getwchar(void); + +/** +**/ +wint_t putwc(wchar_t c, FILE *stream); + +/** +**/ +wint_t putwchar(wchar_t c); + +/** +**/ +wint_t ungetwc(wint_t c, FILE *stream); + +/* ################### Numeric Conversions ########################### */ + +/** +**/ +double wcstod(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr); + +/** +**/ +float wcstof(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr); + +/** +**/ +long double wcstold(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr); + +/** +**/ +long int wcstol( const wchar_t * __restrict nptr, wchar_t ** __restrict endptr, int base); + +/** +**/ +long long int wcstoll( const wchar_t * __restrict nptr, wchar_t ** __restrict endptr, int base); + +/** +**/ +unsigned long int wcstoul( const wchar_t * __restrict nptr, wchar_t ** __restrict endptr, int base); + +/** +**/ +unsigned long long int wcstoull( const wchar_t * __restrict nptr, wchar_t ** __restrict endptr, int base); + +/* ####################### String Copying ############################### */ + +/** The wcscpy function copies the wide string pointed to by s2 (including the + terminating null wide character) into the array pointed to by s1. + + @return The wcscpy function returns the value of s1. +**/ +wchar_t *wcscpy(wchar_t * __restrict s1, const wchar_t * __restrict s2); + +/** The wcsncpy function copies not more than n wide characters (those that + follow a null wide character are not copied) from the array pointed to by + s2 to the array pointed to by s1. + + If the array pointed to by s2 is a wide string that is shorter than n wide + characters, null wide characters are appended to the copy in the array + pointed to by s1, until n wide characters in all have been written. + + @return The wcsncpy function returns the value of s1. +**/ +wchar_t *wcsncpy(wchar_t * __restrict s1, const wchar_t * __restrict s2, size_t n); + +/** The wmemcpy function copies n wide characters from the object pointed to by + s2 to the object pointed to by s1. + + Use this function if you know that s1 and s2 DO NOT Overlap. Otherwise, + use wmemmove. + + @return The wmemcpy function returns the value of s1. +**/ +wchar_t *wmemcpy(wchar_t * __restrict s1, const wchar_t * __restrict s2, size_t n); + +/** The wmemmove function copies n wide characters from the object pointed to by + s2 to the object pointed to by s1. The objects pointed to by s1 and s2 are + allowed to overlap. + + Because the UEFI BaseMemoryLib function CopyMem explicitly handles + overlapping source and destination objects, this function and wmemcpy are + implemented identically. + + For programming clarity, it is recommended that you use wmemcpy if you know + that s1 and s2 DO NOT Overlap. If s1 and s2 might possibly overlap, then + use wmemmove. + + @return The wmemmove function returns the value of s1. +**/ +wchar_t *wmemmove(wchar_t *s1, const wchar_t *s2, size_t n); + +/* ################### String Concatenation ########################## */ + +/** The wcscat function appends a copy of the wide string pointed to by s2 + (including the terminating null wide character) to the end of the wide + string pointed to by s1. The initial wide character of s2 overwrites the + null wide character at the end of s1. + + @return The wcscat function returns the value of s1. +**/ +wchar_t *wcscat(wchar_t * __restrict s1, const wchar_t * __restrict s2); + +/** The wcsncat function appends not more than n wide characters (a null wide + character and those that follow it are not appended) from the array pointed + to by s2 to the end of the wide string pointed to by s1. The initial wide + character of s2 overwrites the null wide character at the end of s1. + A terminating null wide character is always appended to the result. + + @return The wcsncat function returns the value of s1. +**/ +wchar_t *wcsncat(wchar_t * __restrict s1, const wchar_t * __restrict s2, size_t n); + +/* ##################### String Comparison ############################# */ + +/** The wcscmp function compares the wide string pointed to by s1 to the wide + string pointed to by s2. + + @return The wcscmp function returns an integer greater than, equal to, or + less than zero, accordingly as the wide string pointed to by s1 + is greater than, equal to, or less than the wide string + pointed to by s2. +**/ +int wcscmp(const wchar_t *s1, const wchar_t *s2); + +/** The wcscoll function compares the wide string pointed to by s1 to the wide + string pointed to by s2, both interpreted as appropriate to the LC_COLLATE + category of the current locale. + + @return The wcscoll function returns an integer greater than, equal to, + or less than zero, accordingly as the wide string pointed to by + s1 is greater than, equal to, or less than the wide string + pointed to by s2 when both are interpreted as appropriate to + the current locale. +**/ +int wcscoll(const wchar_t *s1, const wchar_t *s2); + +/** The wcsncmp function compares not more than n wide characters (those that + follow a null wide character are not compared) from the array pointed to by + s1 to the array pointed to by s2. + + @return The wcsncmp function returns an integer greater than, equal to, + or less than zero, accordingly as the possibly null-terminated + array pointed to by s1 is greater than, equal to, or less than + the possibly null-terminated array pointed to by s2. +**/ +int wcsncmp(const wchar_t *s1, const wchar_t *s2, size_t n); + +/** The wcsxfrm function transforms the wide string pointed to by s2 and places + the resulting wide string into the array pointed to by s1. The + transformation is such that if the wcscmp function is applied to two + transformed wide strings, it returns a value greater than, equal to, or + less than zero, corresponding to the result of the wcscoll function applied + to the same two original wide strings. No more than n wide characters are + placed into the resulting array pointed to by s1, including the terminating + null wide character. If n is zero, s1 is permitted to be a null pointer. + + @return The wcsxfrm function returns the length of the transformed wide + string (not including the terminating null wide character). If + the value returned is n or greater, the contents of the array + pointed to by s1 are indeterminate. +**/ +size_t wcsxfrm(wchar_t * __restrict s1, const wchar_t * __restrict s2, size_t n); + +/** The wmemcmp function compares the first n wide characters of the object + pointed to by s1 to the first n wide characters of the object pointed to + by s2. + + @return The wmemcmp function returns an integer greater than, equal to, + or less than zero, accordingly as the object pointed to by s1 is + greater than, equal to, or less than the object pointed to by s2. +**/ +int wmemcmp(const wchar_t *s1, const wchar_t *s2, size_t n); + +/* ##################### String Searching ############################## */ + +/** The wcschr function locates the first occurrence of c in the wide string + pointed to by s. The terminating null wide character is considered to be + part of the wide string. + + @return The wcschr function returns a pointer to the located wide + character, or a null pointer if the wide character does not occur + in the wide string. +**/ +wchar_t *wcschr(const wchar_t *s, wchar_t c); + +/** The wcscspn function computes the length of the maximum initial segment of + the wide string pointed to by s1 which consists entirely of wide characters + not from the wide string pointed to by s2. + + @return The wcscspn function returns the length of the segment. +**/ +size_t wcscspn(const wchar_t *s1, const wchar_t *s2); + +/** The wcspbrk function locates the first occurrence in the wide string + pointed to by s1 of any wide character from the wide string + pointed to by s2. + + @return The wcspbrk function returns a pointer to the wide character + in s1, or a null pointer if no wide character from s2 occurs + in s1. +**/ +wchar_t *wcspbrk(const wchar_t *s1, const wchar_t *s2); + +/** The wcsrchr function locates the last occurrence of c in the wide string + pointed to by s. The terminating null wide character is considered to be + part of the wide string. + + @return The wcsrchr function returns a pointer to the wide character, + or a null pointer if c does not occur in the wide string. +**/ +wchar_t *wcsrchr(const wchar_t *s, wchar_t c); + +/** The wcsspn function computes the length of the maximum initial segment of + the wide string pointed to by s1 which consists entirely of wide characters + from the wide string pointed to by s2. + + @return The wcsspn function returns the length of the segment. +**/ +size_t wcsspn(const wchar_t *s1, const wchar_t *s2); + +/** The wcsstr function locates the first occurrence in the wide string pointed + to by s1 of the sequence of wide characters (excluding the terminating null + wide character) in the wide string pointed to by s2. + + @return The wcsstr function returns a pointer to the located wide string, + or a null pointer if the wide string is not found. If s2 points + to a wide string with zero length, the function returns s1. +**/ +wchar_t *wcsstr(const wchar_t *s1, const wchar_t *s2); + +/** A sequence of calls to the wcstok function breaks the wide string pointed + to by s1 into a sequence of tokens, each of which is delimited by a wide + character from the wide string pointed to by s2. The third argument points + to a caller-provided wchar_t pointer into which the wcstok function stores + information necessary for it to continue scanning the same wide string. + + The first call in a sequence has a non-null first argument and stores an + initial value in the object pointed to by ptr. Subsequent calls in the + sequence have a null first argument and the object pointed to by ptr is + required to have the value stored by the previous call in the sequence, + which is then updated. The separator wide string pointed to by s2 may be + different from call to call. + + The first call in the sequence searches the wide string pointed to by s1 + for the first wide character that is not contained in the current separator + wide string pointed to by s2. If no such wide character is found, then + there are no tokens in the wide string pointed to by s1 and the wcstok + function returns a null pointer. If such a wide character is found, it is + the start of the first token. + + The wcstok function then searches from there for a wide character that is + contained in the current separator wide string. If no such wide character + is found, the current token extends to the end of the wide string pointed + to by s1, and subsequent searches in the same wide string for a token + return a null pointer. If such a wide character is found, it is overwritten + by a null wide character, which terminates the current token. + + In all cases, the wcstok function stores sufficient information in the + pointer pointed to by ptr so that subsequent calls, with a null pointer for + s1 and the unmodified pointer value for ptr, shall start searching just + past the element overwritten by a null wide character (if any). + + @return The wcstok function returns a pointer to the first wide character + of a token, or a null pointer if there is no token. +**/ +wchar_t *wcstok(wchar_t * __restrict s1, const wchar_t * __restrict s2, wchar_t ** __restrict ptr); + +/** The wmemchr function locates the first occurrence of c in the initial n + wide characters of the object pointed to by s. + + @return The wmemchr function returns a pointer to the located wide + character, or a null pointer if the wide character does not occur + in the object. +**/ +wchar_t *wmemchr(const wchar_t *s, wchar_t c, size_t n); + +/* ################### String Manipulation ############################# */ + +/** The wcslen function computes the length of the wide string pointed to by s. + + @return The wcslen function returns the number of wide characters that + precede the terminating null wide character. +**/ +size_t wcslen(const wchar_t *s); + +/** The wmemset function copies the value of c into each of the first n wide + characters of the object pointed to by s. + + @return The wmemset function returns the value of s. +**/ +wchar_t *wmemset(wchar_t *s, wchar_t c, size_t n); + +/* ################# Date and Time Conversion ########################### */ + +/** +**/ +size_t wcsftime(wchar_t * __restrict s, size_t maxsize, const wchar_t * __restrict format, const struct tm * __restrict timeptr); + +/* ############# Multibyte <--> Wide Character Conversion ############### */ + +/** +**/ +wint_t btowc(int c); + +/** +**/ +int wctob(wint_t c); + +/** +**/ +int mbsinit(const mbstate_t *ps); + +/* ####### Restartable Multibyte <--> Wide Character Conversion ######### */ + +/** +**/ +size_t mbrlen(const char * __restrict s, size_t n, mbstate_t * __restrict ps); + +/** +**/ +size_t mbrtowc(wchar_t * __restrict pwc, const char * __restrict s, size_t n, mbstate_t * __restrict ps); + +/** +**/ +size_t wcrtomb(char * __restrict s, wchar_t wc, mbstate_t * __restrict ps); + +/** +**/ +size_t mbsrtowcs(wchar_t * __restrict dst, const char ** __restrict src, size_t len, mbstate_t * __restrict ps); + +/** +**/ +size_t wcsrtombs(char * __restrict dst, const wchar_t ** __restrict src, size_t len, mbstate_t * __restrict ps); + +#endif /* _WCHAR_H */ diff --git a/StdLib/Include/wctype.h b/StdLib/Include/wctype.h new file mode 100644 index 0000000000..9aa89ef541 --- /dev/null +++ b/StdLib/Include/wctype.h @@ -0,0 +1,77 @@ +/* $NetBSD: wctype.h,v 1.6 2005/02/03 04:39:32 perry Exp $ */ + +/*- + * Copyright (c)1999 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * citrus Id: wctype.h,v 1.4 2000/12/21 01:50:21 itojun Exp + */ + +#ifndef _WCTYPE_H_ +#define _WCTYPE_H_ + +#include +#include + +#ifdef _BSD_WINT_T_ +typedef _BSD_WINT_T_ wint_t; +#undef _BSD_WINT_T_ +#endif + +#ifdef _BSD_WCTRANS_T_ +typedef wint_t (*wctrans_t)(wint_t); +#undef _BSD_WCTRANS_T_ +#endif + +#ifdef _BSD_WCTYPE_T_ +typedef _BSD_WCTYPE_T_ wctype_t; +#undef _BSD_WCTYPE_T_ +#endif + +#ifndef WEOF +#define WEOF ((wint_t)-1) +#endif + +__BEGIN_DECLS +int /*EFIAPI*/ iswalnum(wint_t); +int /*EFIAPI*/ iswalpha(wint_t); +int /*EFIAPI*/ iswcntrl(wint_t); +int /*EFIAPI*/ iswctype(wint_t, wctype_t); +int /*EFIAPI*/ iswdigit(wint_t); +int /*EFIAPI*/ iswgraph(wint_t); +int /*EFIAPI*/ iswlower(wint_t); +int /*EFIAPI*/ iswprint(wint_t); +int /*EFIAPI*/ iswpunct(wint_t); +int /*EFIAPI*/ iswblank(wint_t); +int /*EFIAPI*/ iswspace(wint_t); +int /*EFIAPI*/ iswupper(wint_t); +int /*EFIAPI*/ iswxdigit(wint_t); +wint_t /*EFIAPI*/ towctrans(wint_t, wctrans_t); +wint_t /*EFIAPI*/ towlower(wint_t); +wint_t /*EFIAPI*/ towupper(wint_t); +wctrans_t /*EFIAPI*/ wctrans(const char *); +wctype_t /*EFIAPI*/ wctype(const char *); +__END_DECLS + +#endif /* _WCTYPE_H_ */ diff --git a/StdLib/Include/x86/float.h b/StdLib/Include/x86/float.h new file mode 100644 index 0000000000..ee70bc88a4 --- /dev/null +++ b/StdLib/Include/x86/float.h @@ -0,0 +1,25 @@ +/* $NetBSD: float.h,v 1.5 2003/10/23 23:26:06 kleink Exp $ */ + +#ifndef _X86_FLOAT_H_ +#define _X86_FLOAT_H_ + +#if 0 /* Force all compilers to have the same limits */ +/* long double and double are the same in Microsoft compilers. */ +#if !defined(_MSC_VER) /* Non-Microsoft compiler specifics. */ + #define LDBL_MANT_DIG 64 + #define LDBL_EPSILON 1.0842021724855044340E-19L + #define LDBL_DIG 18 + #define LDBL_MIN_EXP (-16381) + #define LDBL_MIN 3.3621031431120935063E-4932L + #define LDBL_MIN_10_EXP (-4931) + #define LDBL_MAX_EXP 16384 + #define LDBL_MAX 1.1897314953572317650E+4932L + #define LDBL_MAX_10_EXP 4932 + + #define DECIMAL_DIG 21 +#endif // !defined(_MSC_VER) +#endif // if 0 + +#include + +#endif /* _X86_FLOAT_H_ */ diff --git a/StdLib/Include/x86/ieee.h b/StdLib/Include/x86/ieee.h new file mode 100644 index 0000000000..f4326b0bc1 --- /dev/null +++ b/StdLib/Include/x86/ieee.h @@ -0,0 +1,107 @@ +/* $NetBSD: ieee.h,v 1.9.32.1 2007/05/07 19:49:10 pavel Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Lawrence Berkeley Laboratory. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ieee.h 8.1 (Berkeley) 6/11/93 + */ + +/* + * ieee.h defines the machine-dependent layout of the machine's IEEE + * floating point. It does *not* define (yet?) any of the rounding + * mode bits, exceptions, and so forth. + */ + +#include + +#define EXT_EXPBITS 15 +#define EXT_FRACHBITS 32 +#define EXT_FRACLBITS 32 +#define EXT_FRACBITS (EXT_FRACLBITS + EXT_FRACHBITS) + +#define EXT_TO_ARRAY32(u, a) do { \ + (a)[0] = (uint32_t)(u).extu_ext.ext_fracl; \ + (a)[1] = (uint32_t)(u).extu_ext.ext_frach; \ +} while(/*CONSTCOND*/0) + +/* + * struct ieee_ext is the raw storage layout of the 80-bit + * extended-precision type as implemented by the FPU. Per the + * respective ABI specifications, it is followed by a tail padding of + * + * amd64: 48 bits, + * i386: 16 bits. + */ +struct ieee_ext { + u_int ext_fracl:EXT_FRACLBITS; + u_int ext_frach:EXT_FRACHBITS; +#if 0 + u_int ext_int:1; +#endif + u_int ext_exp:EXT_EXPBITS; + u_int ext_sign:1; +}; + +/* + * Floats whose exponent is in [1..INFNAN) (of whatever type) are + * `normal'. Floats whose exponent is INFNAN are either Inf or NaN. + * Floats whose exponent is zero are either zero (iff all fraction + * bits are zero) or subnormal values. + * + * A NaN is a `signalling NaN' if its QUIETNAN bit is clear in its + * high fraction; if the bit is set, it is a `quiet NaN'. + */ +#define EXT_EXP_INFNAN 32767 + +#if 0 +#define SNG_QUIETNAN (1 << 22) +#define DBL_QUIETNAN (1 << 19) +#define EXT_QUIETNAN (1 << 30) +#endif + +/* + * Exponent biases. + */ +#define EXT_EXP_BIAS 16383 + +/* + * Convenience data structures. + */ +union ieee_ext_u { + long double extu_ld; + struct ieee_ext extu_ext; +}; diff --git a/StdLib/Include/x86/limits.h b/StdLib/Include/x86/limits.h new file mode 100644 index 0000000000..19d7963e2a --- /dev/null +++ b/StdLib/Include/x86/limits.h @@ -0,0 +1,77 @@ +/** @file + Machine specific values for . + + Within this file, the ^ character is used in comments to represent exponentiation. + Thus, 2^7 means "2 to the 7th power", NOT "2 XOR 7". + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#ifndef _MACHINE_LIMITS_H +#define _MACHINE_LIMITS_H + +/** Number of bits for smallest object that is not a bit-field (byte). **/ +#define __CHAR_BIT 8 + +/** minimum value for an object of type signed char **/ +#define __SCHAR_MIN -128 // -(2^7 - 1) + +/** maximum value for an object of type signed char **/ +#define __SCHAR_MAX +127 // 2^7 - 1 + +/** maximum value for an object of type unsigned char **/ +#define __UCHAR_MAX 255 // 2^8 - 1 + +/** minimum value for an object of type short int **/ +#define __SHRT_MIN -32768 // -(2^15 - 1) + +/** maximum value for an object of type short int **/ +#define __SHRT_MAX +32767 // 2^15 - 1 + +/** maximum value for an object of type unsigned short int **/ +#define __USHRT_MAX 65535 // 2^16 - 1 + +/** maximum value for an object of type int **/ +#define __INT_MAX +2147483647 // 2^31 - 1 + +/** minimum value for an object of type int **/ +#define __INT_MIN (-2147483647 - 1) // -(2^31 - 1) + +/** maximum value for an object of type unsigned int **/ +#define __UINT_MAX 0xffffffff // 2^32 - 1 + +/** minimum value for an object of type long int **/ +#define __LONG_MIN (-2147483647L - 1L) // -(2^31 - 1) + +/** maximum value for an object of type long int **/ +#define __LONG_MAX +2147483647L // 2^31 - 1 + +/** maximum value for an object of type unsigned long int **/ +#define __ULONG_MAX 0xffffffff // 2^32 - 1 + +/** minimum value for an object of type long long int **/ +//#define __LLONG_MIN -9223372036854775808LL // -(2^63 - 1) +//#define __LLONG_MIN ((-9223372036854775807LL)-1) // -(2^63 - 1) +#define __LLONG_MIN (-9223372036854775807LL - 1LL) // -(2^63 - 1) + +/** maximum value for an object of type long long int **/ +#define __LLONG_MAX 9223372036854775807LL // 2^63 - 1 + +/** maximum value for an object of type unsigned long long int **/ +//#define __ULLONG_MAX 18446744073709551615ULL // 2^64 - 1 +#define __ULLONG_MAX 0xFFFFFFFFFFFFFFFFULL // 2^64 - 1 + +/* Intel extensions to for UEFI */ +#define __SHORT_BIT 16 +#define __WCHAR_BIT 16 +#define __INT_BIT 32 +#define __LONG_BIT 32 /* Compiler dependent */ +#define __LONG_LONG_BIT 64 + +#endif /* _MACHINE_LIMITS_H */ diff --git a/StdLib/Include/x86/math.h b/StdLib/Include/x86/math.h new file mode 100644 index 0000000000..7c308bfc84 --- /dev/null +++ b/StdLib/Include/x86/math.h @@ -0,0 +1,4 @@ +/* $NetBSD: math.h,v 1.2 2003/10/28 00:55:28 kleink Exp $ */ + +#define __HAVE_LONG_DOUBLE +#define __HAVE_NANF diff --git a/StdLib/LibC/CRT/Gcc.c b/StdLib/LibC/CRT/Gcc.c new file mode 100644 index 0000000000..01fbe79dc9 --- /dev/null +++ b/StdLib/LibC/CRT/Gcc.c @@ -0,0 +1,196 @@ +/** @file + Integer Arithmetic Run-time support functions for GCC. + The integer arithmetic routines are used on platforms that don't provide + hardware support for arithmetic operations on some modes.. + + Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#include +#include +#include +#include + +#include + +// Shift Datum left by Count bits. +// =========================================================================== +//int __ashlsi3(int Datum, int Count) +//{ +// DebugPrint(DEBUG_INFO, "%a:\n", __func__); +// return (int) LShiftU64 ((UINT64)Datum, (UINTN)Count); +//} + +INT64 __ashldi3(INT64 Datum, int Count) +{ + DebugPrint(DEBUG_INFO, "%a:\n", __func__); + return LShiftU64 (Datum, (UINTN)Count); +} + +//long long __ashlti3(long long Datum, int Count) +//{ +// DebugPrint(DEBUG_INFO, "%a:\n", __func__); +// return (long long) LShiftU64 ((UINT64)Datum, (UINTN)Count); +//} + +// Arithmetically shift Datum right by Count bits. +// =========================================================================== +//int __ashrsi3(int Datum, int Count) +//{ +// DebugPrint(DEBUG_INFO, "%a:\n", __func__); +// return (int) ARShiftU64 ((UINT64) Datum, (UINTN)Count); +//} + +INT64 __ashrdi3(INT64 Datum, int Count) +{ + DebugPrint(DEBUG_INFO, "%a:\n", __func__); + return ARShiftU64 ( Datum, (UINTN)Count); +} + +//long long __ashrti3(long long Datum, int Count) +//{ +// DebugPrint(DEBUG_INFO, "%a:\n", __func__); +// return (long long) ARShiftU64 ((UINT64) Datum, (UINTN)Count); +//} + +// Return the quotient of the signed division of Dividend and Divisor +// =========================================================================== +//int __divsi3(int Dividend, int Divisor) +//{ +// DebugPrint(DEBUG_INFO, "%a:\n", __func__); +// return (int) DivS64x64Remainder ((INT64) Dividend, (INT64) Divisor, NULL); +//} + +INT64 __divdi3(INT64 Dividend, INT64 Divisor) +{ + INT64 Quotient; + + Quotient = DivS64x64Remainder ((INT64) Dividend, (INT64) Divisor, NULL); + DebugPrint(DEBUG_INFO, "%a: %Ld / %Ld = %Ld\n", __func__, Dividend, Divisor, Quotient); + + return Quotient; +} + +//long long __divti3(long long Dividend, long long Divisor) +//{ +// DebugPrint(DEBUG_INFO, "%a:\n", __func__); +// return (long long) DivS64x64Remainder ((INT64) Dividend, (INT64) Divisor, NULL); +//} + +// Logically shift Datum right by Count bits +// =========================================================================== +//int __lshrsi3(int Datum, int Count) +//{ +// DebugPrint(DEBUG_INFO, "%a:\n", __func__); +// return (int) RShiftU64 ((UINT64) Datum, (UINTN)Count); +//} + +INT64 __lshrdi3(INT64 Datum, int Count) +{ + DebugPrint(DEBUG_INFO, "%a:\n", __func__); + return RShiftU64 ( Datum, (UINTN)Count); +} + +//long long __lshrti3(int Datum, int Count) +//{ +// DebugPrint(DEBUG_INFO, "%a:\n", __func__); +// return (long long) RShiftU64 ((UINT64) Datum, (UINTN)Count); +//} + +// Return the remainder of the signed division of Dividend and Divisor +// =========================================================================== +//int __modsi3(int Dividend, int Divisor) +//{ +// INT64 Remainder; + +// (void) DivS64x64Remainder ((INT64) Dividend, (INT64) Divisor, &Remainder); +// DebugPrint(DEBUG_INFO, "modsi3: %d %% %d = %d\n", Dividend, Divisor, (int)Remainder); + +// return (int) Remainder; +//} + +INT64 __moddi3(INT64 Dividend, INT64 Divisor) +{ + INT64 Remainder; + + (void) DivS64x64Remainder ((INT64) Dividend, (INT64) Divisor, &Remainder); + DebugPrint(DEBUG_INFO, "moddi3: %Ld %% %Ld = %Ld\n", (INT64)Dividend, (INT64)Divisor, Remainder); + + return Remainder; +} + +//long long __modti3(long long Dividend, long long Divisor) +//{ +// INT64 Remainder; + +// (void) DivS64x64Remainder ((INT64) Dividend, (INT64) Divisor, &Remainder); +// DebugPrint(DEBUG_INFO, "modti3: %Ld %% %Ld = %Ld\n", (INT64)Dividend, (INT64)Divisor, Remainder); + +// return (long long) Remainder; +//} + +// These functions return the product of the Multiplicand and Multiplier. +// =========================================================================== +//long long __multi3(long long Multiplicand, long long Multiplier) +//{ +// DebugPrint(DEBUG_INFO, "%a:\n", __func__); +// return (long long) MultS64x64 ((INT64)Multiplicand, (INT64)Multiplier); +//} + +// Return the quotient of the unsigned division of a and b. +// =========================================================================== +//unsigned int __udivsi3(unsigned int Dividend, unsigned int Divisor) +//{ +// DebugPrint(DEBUG_INFO, "%a:\n", __func__); +// return (int) DivU64x64Remainder ((UINT64) Dividend, (UINT64) Divisor, NULL); +//} + +UINT64 __udivdi3(UINT64 Dividend, UINT64 Divisor) +{ + DebugPrint(DEBUG_INFO, "%a:\n", __func__); + return DivU64x64Remainder ((UINT64) Dividend, (UINT64) Divisor, NULL); +} + +//unsigned long long __udivti3(unsigned long long Dividend, unsigned long long Divisor) +//{ +// DebugPrint(DEBUG_INFO, "%a:\n", __func__); +// return (long long) DivU64x64Remainder ((UINT64) Dividend, (UINT64) Divisor, NULL); +//} + +// =========================================================================== +//unsigned int __umodsi3(unsigned int Dividend, unsigned int Divisor) +//{ +// UINT64 Remainder; + +// DebugPrint(DEBUG_INFO, "%a:\n", __func__); +// (void) DivU64x64Remainder ((UINT64) Dividend, (UINT64) Divisor, &Remainder); + +// return (unsigned int) Remainder; +//} + +UINT64 __umoddi3(UINT64 Dividend, UINT64 Divisor) +{ + UINT64 Remainder; + + DebugPrint(DEBUG_INFO, "%a:\n", __func__); + (void) DivU64x64Remainder ((UINT64) Dividend, (UINT64) Divisor, &Remainder); + + return Remainder; +} + +//unsigned long long __umodti3(unsigned long long Dividend, unsigned long long Divisor) +//{ +// UINT64 Remainder; + +// DebugPrint(DEBUG_INFO, "%a:\n", __func__); +// (void) DivU64x64Remainder ((UINT64) Dividend, (UINT64) Divisor, &Remainder); + +// return (unsigned long long) Remainder; +//} diff --git a/StdLib/LibC/CRT/Ia32/ashrdi3.S b/StdLib/LibC/CRT/Ia32/ashrdi3.S new file mode 100644 index 0000000000..1c629dc23b --- /dev/null +++ b/StdLib/LibC/CRT/Ia32/ashrdi3.S @@ -0,0 +1,66 @@ +#------------------------------------------------------------------------------ +# +# Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
+# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php. +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# Module Name: +# +# MathRShiftU64.S +# +# Abstract: +# +# 64-bit Math Worker Function. +# Shifts a 64-bit unsigned value right by a certain number of bits. +# +#------------------------------------------------------------------------------ + + + .686: + .code: + +ASM_GLOBAL ASM_PFX(__ashrdi3) + +#------------------------------------------------------------------------------ +# +# void __cdecl __ashrdi3 (void) +# +#------------------------------------------------------------------------------ +ASM_PFX(__ashrdi3): + # + # Checking: Only handle 64bit shifting or more + # + cmpb $64, %cl + jae _Exit + + # + # Handle shifting between 0 and 31 bits + # + cmpb $32, %cl + jae More32 + shrd %cl, %edx, %eax + shr %cl, %edx + ret + + # + # Handle shifting of 32-63 bits + # +More32: + movl %edx, %eax + xor %edx, %edx + and $32, %cl + shr %cl, %eax + ret + + # + # Invalid number (less then 32bits), return 0 + # +_Exit: + xor %eax, %eax + xor %edx, %edx + ret diff --git a/StdLib/LibC/CRT/Ia32/lldiv.c b/StdLib/LibC/CRT/Ia32/lldiv.c new file mode 100644 index 0000000000..cae2342243 --- /dev/null +++ b/StdLib/LibC/CRT/Ia32/lldiv.c @@ -0,0 +1,97 @@ +/** @file + 64-bit Math Worker Function. + The 32-bit versions of C compiler generate calls to library routines + to handle 64-bit math. These functions use non-standard calling conventions. + + Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include + + +/* + * Divides a 64-bit signed value with a 64-bit signed value and returns + * a 64-bit signed result. + */ +__declspec(naked) void __cdecl _alldiv (void) +{ + // + // Wrapper Implementation over EDKII DivS64x64Remainder() routine + // INT64 + // EFIAPI + // DivS64x64Remainder ( + // IN UINT64 Dividend, + // IN UINT64 Divisor, + // OUT UINT64 *Remainder OPTIONAL + // ) + // + _asm { + + ;Entry: + ; Arguments are passed on the stack: + ; 1st pushed: divisor (QWORD) + ; 2nd pushed: dividend (QWORD) + ; + ;Exit: + ; EDX:EAX contains the quotient (dividend/divisor) + ; NOTE: this routine removes the parameters from the stack. + ; + ; Original local stack when calling _alldiv + ; ----------------- + ; | | + ; |---------------| + ; | | + ; |-- Divisor --| + ; | | + ; |---------------| + ; | | + ; |-- Dividend --| + ; | | + ; |---------------| + ; | ReturnAddr** | + ; ESP---->|---------------| + ; + + ; + ; Set up the local stack for NULL Reminder pointer + ; + xor eax, eax + push eax + + ; + ; Set up the local stack for Divisor parameter + ; + mov eax, [esp + 20] + push eax + mov eax, [esp + 20] + push eax + + ; + ; Set up the local stack for Dividend parameter + ; + mov eax, [esp + 20] + push eax + mov eax, [esp + 20] + push eax + + ; + ; Call native DivS64x64Remainder of BaseLib + ; + call DivS64x64Remainder + + ; + ; Adjust stack + ; + add esp, 20 + + ret 16 + } +} diff --git a/StdLib/LibC/CRT/Ia32/lldvrm.c b/StdLib/LibC/CRT/Ia32/lldvrm.c new file mode 100644 index 0000000000..26e4ef8d53 --- /dev/null +++ b/StdLib/LibC/CRT/Ia32/lldvrm.c @@ -0,0 +1,100 @@ +/** @file + 64-bit Math Worker Function. + The 32-bit versions of C compiler generate calls to library routines + to handle 64-bit math. These functions use non-standard calling conventions. + + Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include + + +/* + * Divides a 64-bit signed value by another 64-bit signed value and returns + * the 64-bit signed result and the 64-bit signed remainder. + */ +__declspec(naked) void __cdecl _alldvrm(void) +{ + // + // Wrapper Implementation over EDKII DivS64x64Remainder() routine + // INT64 + // EFIAPI + // DivS64x64Remainder ( + // IN INT64 Dividend, + // IN INT64 Divisor, + // OUT INT64 *Remainder + // ) + // + _asm { + ; Original local stack when calling _alldvrm + ; ----------------- + ; | | + ; |---------------| + ; | | + ; |-- Divisor --| + ; | | + ; |---------------| + ; | | + ; |-- Dividend --| + ; | | + ; |---------------| + ; | ReturnAddr** | + ; ESP---->|---------------| + ; + ; + ; On Exit: + ; EDX:EAX contains the quotient (dividend/divisor) + ; EBX:ECX contains the remainder (divided % divisor) + ; NOTE: this routine removes the parameters from the stack. + ; + + ; + ; Set up the local stack for Reminder pointer + ; + sub esp, 8 + push esp + + ; + ; Set up the local stack for Divisor parameter + ; + mov eax, [esp + 28] + push eax + mov eax, [esp + 28] + push eax + + ; + ; Set up the local stack for Dividend parameter + ; + mov eax, [esp + 28] + push eax + mov eax, [esp + 28] + push eax + + ; + ; Call native DivS64x64Remainder of BaseLib + ; + call DivS64x64Remainder + + ; + ; EDX:EAX contains the quotient (dividend/divisor) + ; Put the Remainder in EBX:ECX + ; + mov ecx, [esp + 20] + mov ebx, [esp + 24] + + ; + ; Adjust stack + ; + add esp, 28 + + ret 16 + } +} diff --git a/StdLib/LibC/CRT/Ia32/llmul.c b/StdLib/LibC/CRT/Ia32/llmul.c new file mode 100644 index 0000000000..214134cc03 --- /dev/null +++ b/StdLib/LibC/CRT/Ia32/llmul.c @@ -0,0 +1,79 @@ +/** @file + 64-bit Math Worker Function. + The 32-bit versions of C compiler generate calls to library routines + to handle 64-bit math. These functions use non-standard calling conventions. + + Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include + +/* + * Multiplies a 64-bit signed or unsigned value by a 64-bit signed or unsigned value + * and returns a 64-bit result. + */ +__declspec(naked) void __cdecl _allmul (void) +{ + // + // Wrapper Implementation over EDKII MultS64x64() routine + // INT64 + // EFIAPI + // MultS64x64 ( + // IN INT64 Multiplicand, + // IN INT64 Multiplier + // ) + // + _asm { + ; Original local stack when calling _allmul + ; ----------------- + ; | | + ; |---------------| + ; | | + ; |--Multiplier --| + ; | | + ; |---------------| + ; | | + ; |--Multiplicand-| + ; | | + ; |---------------| + ; | ReturnAddr** | + ; ESP---->|---------------| + ; + + ; + ; Set up the local stack for Multiplicand parameter + ; + mov eax, [esp + 16] + push eax + mov eax, [esp + 16] + push eax + + ; + ; Set up the local stack for Multiplier parameter + ; + mov eax, [esp + 16] + push eax + mov eax, [esp + 16] + push eax + + ; + ; Call native MulS64x64 of BaseLib + ; + call MultS64x64 + + ; + ; Adjust stack + ; + add esp, 16 + + ret 16 + } +} diff --git a/StdLib/LibC/CRT/Ia32/llrem.c b/StdLib/LibC/CRT/Ia32/llrem.c new file mode 100644 index 0000000000..a92c300a40 --- /dev/null +++ b/StdLib/LibC/CRT/Ia32/llrem.c @@ -0,0 +1,93 @@ +/** @file + 64-bit Math Worker Function. + The 32-bit versions of C compiler generate calls to library routines + to handle 64-bit math. These functions use non-standard calling conventions. + + Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include + + +/* + * Divides a 64-bit signed value by another 64-bit signed value and returns + * the 64-bit signed remainder. + */ +__declspec(naked) void __cdecl _allrem(void) +{ + // + // Wrapper Implementation over EDKII DivS64x64Remainder() routine + // UINT64 + // EFIAPI + // DivS64x64Remainder ( + // IN UINT64 Dividend, + // IN UINT64 Divisor, + // OUT UINT64 *Remainder + // ) + // + _asm { + ; Original local stack when calling _allrem + ; ----------------- + ; | | + ; |---------------| + ; | | + ; |-- Divisor --| + ; | | + ; |---------------| + ; | | + ; |-- Dividend --| + ; | | + ; |---------------| + ; | ReturnAddr** | + ; ESP---->|---------------| + ; + + ; + ; Set up the local stack for Reminder pointer + ; + sub esp, 8 + push esp + + ; + ; Set up the local stack for Divisor parameter + ; + mov eax, [esp + 28] + push eax + mov eax, [esp + 28] + push eax + + ; + ; Set up the local stack for Dividend parameter + ; + mov eax, [esp + 28] + push eax + mov eax, [esp + 28] + push eax + + ; + ; Call native DivS64x64Remainder of BaseLib + ; + call DivS64x64Remainder + + ; + ; Put the Reminder in EDX:EAX as return value + ; + mov eax, [esp + 20] + mov edx, [esp + 24] + + ; + ; Adjust stack + ; + add esp, 28 + + ret 16 + } +} diff --git a/StdLib/LibC/CRT/Ia32/llshl.c b/StdLib/LibC/CRT/Ia32/llshl.c new file mode 100644 index 0000000000..835fd042e7 --- /dev/null +++ b/StdLib/LibC/CRT/Ia32/llshl.c @@ -0,0 +1,54 @@ +/** @file + 64-bit Math Worker Function. + The 32-bit versions of C compiler generate calls to library routines + to handle 64-bit math. These functions use non-standard calling conventions. + + Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + + +/* + * Shifts a 64-bit signed value left by a particular number of bits. + */ +__declspec(naked) void __cdecl _allshl (void) +{ + _asm { + ; + ; Handle shifting of 64 or more bits (return 0) + ; + cmp cl, 64 + jae short ReturnZero + + ; + ; Handle shifting of between 0 and 31 bits + ; + cmp cl, 32 + jae short More32 + shld edx, eax, cl + shl eax, cl + ret + + ; + ; Handle shifting of between 32 and 63 bits + ; +More32: + mov edx, eax + xor eax, eax + and cl, 31 + shl edx, cl + ret + +ReturnZero: + xor eax,eax + xor edx,edx + ret + } +} diff --git a/StdLib/LibC/CRT/Ia32/mulll.S b/StdLib/LibC/CRT/Ia32/mulll.S new file mode 100644 index 0000000000..333fdfbb9f --- /dev/null +++ b/StdLib/LibC/CRT/Ia32/mulll.S @@ -0,0 +1,77 @@ +#------------------------------------------------------------------------------ +# +# Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
+# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php. +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# Module Name: +# +# MathMultS64x64.S +# +# Abstract: +# +# 64-bit Math Worker Function. +# Multiplies a 64-bit signed or unsigned value by a 64-bit signed or unsigned value +# and returns a 64-bit result +# +#------------------------------------------------------------------------------ + + .686: + .code: + +ASM_GLOBAL ASM_PFX(_mulll), ASM_PFX(MultS64x64) + +#------------------------------------------------------------------------------ +# +# void __cdecl __mulll (void) +# +#------------------------------------------------------------------------------ +ASM_PFX(__mulll): + # Original local stack when calling __mulll + # ----------------- + # | | + # |---------------| + # | | + # |--Multiplier --| + # | | + # |---------------| + # | | + # |--Multiplicand-| + # | | + # |---------------| + # | ReturnAddr** | + # ESP---->|---------------| + # + + # + # Set up the local stack for Multiplicand parameter + # + movl 16(%esp), %eax + push %eax + movl 16(%esp), %eax + push %eax + + # + # Set up the local stack for Multiplier parameter + # + movl 16(%esp), %eax + push %eax + movl 16(%esp), %eax + push %eax + + # + # Call native MulS64x64 of BaseLib + # + jmp ASM_PFX(MultS64x64) + + # + # Adjust stack + # + add $16, %esp + + ret $16 diff --git a/StdLib/LibC/CRT/Ia32/shldi3.S b/StdLib/LibC/CRT/Ia32/shldi3.S new file mode 100644 index 0000000000..b2a03d9833 --- /dev/null +++ b/StdLib/LibC/CRT/Ia32/shldi3.S @@ -0,0 +1,62 @@ +#------------------------------------------------------------------------------ +# +# Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
+# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php. +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# Module Name: +# +# MathLShiftS64.S +# +# Abstract: +# +# 64-bit Math Worker Function. +# Shifts a 64-bit signed value left by a certain number of bits. +# +#------------------------------------------------------------------------------ + + .686: + .code: + +ASM_GLOBAL ASM_PFX(__ashldi3) + +#------------------------------------------------------------------------------ +# +# void __cdecl __ashldi3 (void) +# +#------------------------------------------------------------------------------ +ASM_PFX(__ashldi3): + # + # Handle shifting of 64 or more bits (return 0) + # + cmpb $64, %cl + jae ReturnZero + + # + # Handle shifting of between 0 and 31 bits + # + cmpb $32, %cl + jae More32 + shld %cl, %eax, %edx + shl %cl, %eax + ret + + # + # Handle shifting of between 32 and 63 bits + # +More32: + movl %eax, %edx + xor %eax, %eax + and $31, %cl + shl %cl, %edx + ret + +ReturnZero: + xor %eax, %eax + xor %edx, %edx + ret diff --git a/StdLib/LibC/CRT/Ia32/udivdi3.S b/StdLib/LibC/CRT/Ia32/udivdi3.S new file mode 100644 index 0000000000..336d75ee7c --- /dev/null +++ b/StdLib/LibC/CRT/Ia32/udivdi3.S @@ -0,0 +1,83 @@ +#------------------------------------------------------------------------------ +# +# Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
+# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php. +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# Module Name: +# +# MathDivU64x64.S +# +# Abstract: +# +# 64-bit Math Worker Function. +# Divides a 64-bit unsigned value with a 64-bit unsigned value and returns +# a 64-bit unsigned result. +# +#------------------------------------------------------------------------------ + + .686: + .code: + +ASM_GLOBAL ASM_PFX(__udivdi3), ASM_PFX(DivU64x64Remainder) + +#------------------------------------------------------------------------------ +# +# void __cdecl __udivdi3 (void) +# +#------------------------------------------------------------------------------ +ASM_PFX(__udivdi3): + # Original local stack when calling __udivdi3 + # ----------------- + # | | + # |---------------| + # | | + # |-- Divisor --| + # | | + # |---------------| + # | | + # |-- Dividend --| + # | | + # |---------------| + # | ReturnAddr** | + # ESP---->|---------------| + # + + # + # Set up the local stack for NULL Reminder pointer + # + xorl %eax, %eax + push %eax + + # + # Set up the local stack for Divisor parameter + # + movl 20(%esp), %eax + push %eax + movl 20(%esp), %eax + push %eax + + # + # Set up the local stack for Dividend parameter + # + movl 20(%esp), %eax + push %eax + movl 20(%esp), %eax + push %eax + + # + # Call native DivU64x64Remainder of BaseLib + # + jmp ASM_PFX(DivU64x64Remainder) + + # + # Adjust stack + # + addl $20, %esp + + ret $16 diff --git a/StdLib/LibC/CRT/Ia32/ulldiv.c b/StdLib/LibC/CRT/Ia32/ulldiv.c new file mode 100644 index 0000000000..e8d6efb6d8 --- /dev/null +++ b/StdLib/LibC/CRT/Ia32/ulldiv.c @@ -0,0 +1,88 @@ +/** @file + 64-bit Math Worker Function. + The 32-bit versions of C compiler generate calls to library routines + to handle 64-bit math. These functions use non-standard calling conventions. + + Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include + + +/* + * Divides a 64-bit unsigned value with a 64-bit unsigned value and returns + * a 64-bit unsigned result. + */ +__declspec(naked) void __cdecl _aulldiv (void) +{ + // + // Wrapper Implementation over EDKII DivU64x64Reminder() routine + // UINT64 + // EFIAPI + // DivU64x64Remainder ( + // IN UINT64 Dividend, + // IN UINT64 Divisor, + // OUT UINT64 *Remainder OPTIONAL + // ) + // + _asm { + + ; Original local stack when calling _aulldiv + ; ----------------- + ; | | + ; |---------------| + ; | | + ; |-- Divisor --| + ; | | + ; |---------------| + ; | | + ; |-- Dividend --| + ; | | + ; |---------------| + ; | ReturnAddr** | + ; ESP---->|---------------| + ; + + ; + ; Set up the local stack for NULL Reminder pointer + ; + xor eax, eax + push eax + + ; + ; Set up the local stack for Divisor parameter + ; + mov eax, [esp + 20] + push eax + mov eax, [esp + 20] + push eax + + ; + ; Set up the local stack for Dividend parameter + ; + mov eax, [esp + 20] + push eax + mov eax, [esp + 20] + push eax + + ; + ; Call native DivU64x64Remainder of BaseLib + ; + call DivU64x64Remainder + + ; + ; Adjust stack + ; + add esp, 20 + + ret 16 + } +} diff --git a/StdLib/LibC/CRT/Ia32/ulldvrm.c b/StdLib/LibC/CRT/Ia32/ulldvrm.c new file mode 100644 index 0000000000..2df587e1a4 --- /dev/null +++ b/StdLib/LibC/CRT/Ia32/ulldvrm.c @@ -0,0 +1,100 @@ +/** @file + 64-bit Math Worker Function. + The 32-bit versions of C compiler generate calls to library routines + to handle 64-bit math. These functions use non-standard calling conventions. + + Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include + + +/* + * Divides a 64-bit signed value by another 64-bit signed value and returns + * the 64-bit signed result and the 64-bit signed remainder. + */ +__declspec(naked) void __cdecl _aulldvrm(void) +{ + // + // Wrapper Implementation over EDKII DivU64x64Remainder() routine + // UINT64 + // EFIAPI + // DivU64x64Remainder ( + // IN UINT64 Dividend, + // IN UINT64 Divisor, + // OUT UINT64 *Remainder + // ) + // + _asm { + ; Original local stack when calling _aulldvrm + ; ----------------- + ; | | + ; |---------------| + ; | | + ; |-- Divisor --| + ; | | + ; |---------------| + ; | | + ; |-- Dividend --| + ; | | + ; |---------------| + ; | ReturnAddr** | + ; ESP---->|---------------| + ; + ; + ; On Exit: + ; EDX:EAX contains the quotient (dividend/divisor) + ; EBX:ECX contains the remainder (divided % divisor) + ; NOTE: this routine removes the parameters from the stack. + ; + + ; + ; Set up the local stack for Remainder pointer + ; + sub esp, 8 + push esp + + ; + ; Set up the local stack for Divisor parameter + ; + mov eax, [esp + 28] + push eax + mov eax, [esp + 28] + push eax + + ; + ; Set up the local stack for Dividend parameter + ; + mov eax, [esp + 28] + push eax + mov eax, [esp + 28] + push eax + + ; + ; Call native DivU64x64Remainder of BaseLib + ; + call DivU64x64Remainder + + ; + ; EDX:EAX contains the quotient (dividend/divisor) + ; Put the Remainder in EBX:ECX + ; + mov ecx, [esp + 20] + mov ebx, [esp + 24] + + ; + ; Adjust stack + ; + add esp, 28 + + ret 16 + } +} diff --git a/StdLib/LibC/CRT/Ia32/ullrem.c b/StdLib/LibC/CRT/Ia32/ullrem.c new file mode 100644 index 0000000000..2e25c6c4e3 --- /dev/null +++ b/StdLib/LibC/CRT/Ia32/ullrem.c @@ -0,0 +1,93 @@ +/** @file + 64-bit Math Worker Function. + The 32-bit versions of C compiler generate calls to library routines + to handle 64-bit math. These functions use non-standard calling conventions. + + Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include + + +/* + * Divides a 64-bit unsigned value by another 64-bit unsigned value and returns + * the 64-bit unsigned remainder. + */ +__declspec(naked) void __cdecl _aullrem(void) +{ + // + // Wrapper Implementation over EDKII DivU64x64Remainder() routine + // UINT64 + // EFIAPI + // DivU64x64Remainder ( + // IN UINT64 Dividend, + // IN UINT64 Divisor, + // OUT UINT64 *Remainder OPTIONAL + // ) + // + _asm { + ; Original local stack when calling _aullrem + ; ----------------- + ; | | + ; |---------------| + ; | | + ; |-- Divisor --| + ; | | + ; |---------------| + ; | | + ; |-- Dividend --| + ; | | + ; |---------------| + ; | ReturnAddr** | + ; ESP---->|---------------| + ; + + ; + ; Set up the local stack for Reminder pointer + ; + sub esp, 8 + push esp + + ; + ; Set up the local stack for Divisor parameter + ; + mov eax, [esp + 28] + push eax + mov eax, [esp + 28] + push eax + + ; + ; Set up the local stack for Dividend parameter + ; + mov eax, [esp + 28] + push eax + mov eax, [esp + 28] + push eax + + ; + ; Call native DivU64x64Remainder of BaseLib + ; + call DivU64x64Remainder + + ; + ; Put the Reminder in EDX:EAX as return value + ; + mov eax, [esp + 20] + mov edx, [esp + 24] + + ; + ; Adjust stack + ; + add esp, 28 + + ret 16 + } +} diff --git a/StdLib/LibC/CRT/Ia32/ullshr.c b/StdLib/LibC/CRT/Ia32/ullshr.c new file mode 100644 index 0000000000..f08adcb03e --- /dev/null +++ b/StdLib/LibC/CRT/Ia32/ullshr.c @@ -0,0 +1,57 @@ +/** @file + 64-bit Math Worker Function. + The 32-bit versions of C compiler generate calls to library routines + to handle 64-bit math. These functions use non-standard calling conventions. + + Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + + +/* + * Shifts a 64-bit unsigned value right by a certain number of bits. + */ +__declspec(naked) void __cdecl _aullshr (void) +{ + _asm { + ; + ; Checking: Only handle 64bit shifting or more + ; + cmp cl, 64 + jae _Exit + + ; + ; Handle shifting between 0 and 31 bits + ; + cmp cl, 32 + jae More32 + shrd eax, edx, cl + shr edx, cl + ret + + ; + ; Handle shifting of 32-63 bits + ; +More32: + mov eax, edx + xor edx, edx + and cl, 31 + shr eax, cl + ret + + ; + ; Invalid number (less then 32bits), return 0 + ; +_Exit: + xor eax, eax + xor edx, edx + ret + } +} diff --git a/StdLib/LibC/CRT/Ia32/umoddi3.S b/StdLib/LibC/CRT/Ia32/umoddi3.S new file mode 100644 index 0000000000..9b72e918a4 --- /dev/null +++ b/StdLib/LibC/CRT/Ia32/umoddi3.S @@ -0,0 +1,89 @@ +#------------------------------------------------------------------------------ +# +# Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.
+# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php. +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# Module Name: +# +# MathReminderU64x64.S +# +# Abstract: +# +# 64-bit Math Worker Function. +# Divides a 64-bit unsigned value by another 64-bit unsigned value and returns +# the 64-bit unsigned remainder +# +#------------------------------------------------------------------------------ + + .686: + .code: + +ASM_GLOBAL ASM_PFX(__umoddi3), ASM_PFX(DivU64x64Remainder) + +#------------------------------------------------------------------------------ +# +# void __cdecl __umoddi3 (void) +# +#------------------------------------------------------------------------------ +ASM_PFX(__umoddi3): + # Original local stack when calling __umoddi3 + # ----------------- + # | | + # |---------------| + # | | + # |-- Divisor --| + # | | + # |---------------| + # | | + # |-- Dividend --| + # | | + # |---------------| + # | ReturnAddr** | + # ESP---->|---------------| + # + + # + # Set up the local stack for Reminder pointer + # + sub $8, %esp + push %esp + + # + # Set up the local stack for Divisor parameter + # + movl 28(%esp), %eax + push %eax + movl 28(%esp), %eax + push %eax + + # + # Set up the local stack for Dividend parameter + # + movl 28(%esp), %eax + push %eax + movl 28(%esp), %eax + push %eax + + # + # Call native DivU64x64Remainder of BaseLib + # + jmp ASM_PFX(DivU64x64Remainder) + + # + # Put the Reminder in EDX:EAX as return value + # + movl 20(%esp), %eax + movl 24(%esp), %edx + + # + # Adjust stack + # + add $28, %esp + + ret $16 diff --git a/StdLib/LibC/Ctype/CClass.c b/StdLib/LibC/Ctype/CClass.c new file mode 100644 index 0000000000..f350063352 --- /dev/null +++ b/StdLib/LibC/Ctype/CClass.c @@ -0,0 +1,140 @@ +/** @file + Character classification and case conversion functions for . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#include + +#define NO_CTYPE_MACROS // So that we don't define the classification macros +#include + +int +__isCClass( int _c, unsigned int mask) +{ + return ((_c < 0 || _c > 127) ? 0 : (_cClass[_c] & mask)); +} + +/** + + @return +**/ +int isalnum(int c) +{ + return (__isCClass( c, (_CD | _CU | _CL | _XA))); +} + +/** + + @return +**/ +int isalpha(int c) +{ + return (__isCClass( c, (_CU | _CL | _XA))); +} + +/** + + @return +**/ +int iscntrl(int c) +{ + return (__isCClass( c, (_CC))); +} + +/** + + @return +**/ +int isdigit(int c) +{ + return (__isCClass( c, (_CD))); +} + +/** + + @return +**/ +int isgraph(int c) +{ + return (__isCClass( c, (_CG))); +} + +/** + + @return +**/ +int islower(int c) +{ + return (__isCClass( c, (_CL))); +} + +/** + + @return +**/ +int isprint(int c) +{ + return (__isCClass( c, (_CS | _CG))); +} + +/** + + @return +**/ +int ispunct(int c) +{ + return (__isCClass( c, (_CP))); +} + +/** + + @return +**/ +int isspace(int c) +{ + return (__isCClass( c, (_CW))); +} + +/** + + @return +**/ +int isupper(int c) +{ + return (__isCClass( c, (_CU))); +} + +/** + + @return +**/ +int isxdigit(int c) +{ + return (__isCClass( c, (_CD | _CX))); +} + +#if defined(_NETBSD_SOURCE) +int +isblank(int c) +{ + return (__isCClass( c, _CB)); +} +#endif + +/** The isascii function tests that a character is one of the 128 ASCII characters. + + @param[in] c The character to test. + @return Returns nonzero (true) if c is a valid ASCII character. Otherwize, + zero (false) is returned. +**/ +int isascii(int c){ + return ((c >= 0) && (c < 128)); +} diff --git a/StdLib/LibC/Ctype/CConv.c b/StdLib/LibC/Ctype/CConv.c new file mode 100644 index 0000000000..6ad4f8722d --- /dev/null +++ b/StdLib/LibC/Ctype/CConv.c @@ -0,0 +1,48 @@ +/** @file + Case conversion functions for + + The tolower function converts an uppercase letter to a corresponding + lowercase letter. If the argument is a character for which isupper + is true and there are one or more corresponding characters, as + specified by the current locale, for which islower is true, the tolower + function returns one of the corresponding characters (always the same one + for any given locale); otherwise, the argument is returned unchanged. + + The toupper function converts a lowercase letter to a corresponding + uppercase letter. If the argument is a character for which islower is true + and there are one or more corresponding characters, as specified by the + current locale, for which isupper is true, the toupper function returns one + of the corresponding characters (always the same one for any given locale); + otherwise, the argument is returned unchanged. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#include + +#define NO_CTYPE_MACROS // So that we don't define the classification macros +#include + +int +tolower( + int _c + ) +{ +// return ((_c < 0 || _c > 127) ? _c : _lConvT[_c]); + return (isupper(_c) ? _lConvT[_c] : _c); +} + +int toupper( + int _c + ) +{ +// return ((_c < 0 || _c > 127) ? _c : _uConvT[_c]); + return (islower(_c) ? _uConvT[_c] : _c); +} diff --git a/StdLib/LibC/Ctype/Ctype.inf b/StdLib/LibC/Ctype/Ctype.inf new file mode 100644 index 0000000000..e767885326 --- /dev/null +++ b/StdLib/LibC/Ctype/Ctype.inf @@ -0,0 +1,50 @@ +## @file +# +# Character Classification library implementing the functionality described +# by the header of the C Standard Library, ISO/IEC 9899:1990 with +# Amendment 1 (C95). +# +# Copyright (c) 2010, Intel Corporation. All rights reserved.
+# This program and the accompanying materials are licensed and made available +# under the terms and conditions of the BSD License which accompanies this +# distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THIS PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = LibCtype + FILE_GUID = dcc64575-fa7d-4b7b-b1ad-48427c97c74d + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + LIBRARY_CLASS = LibCtype + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 IPF +# + +[Sources] + iCtype.c + CClass.c + CConv.c + +[Packages] + StdLib/StdLib.dec + StdLibPrivateInternalFiles/DoNotUse.dec + MdePkg/MdePkg.dec + +################################################################ +# +# The Build Options, below, are only used when building the C library. +# DO NOT use them when building your application! +# Nasty things could happen if you do. +# +[BuildOptions] + MSFT:*_*_*_CC_FLAGS = /GL- diff --git a/StdLib/LibC/Ctype/iCtype.c b/StdLib/LibC/Ctype/iCtype.c new file mode 100644 index 0000000000..69df21e7ae --- /dev/null +++ b/StdLib/LibC/Ctype/iCtype.c @@ -0,0 +1,303 @@ +/** @file + Character classification and case conversion tables, and functions, + for the C Standard Library as required to implement ctype.h. + + These are the default, C locale, tables. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#include +#include + +/// ASCII-8 Character Classification Table +const UINT16 _C_CharClassTable[128] = { + /* 00 NUL */ ( _CC ), + /* 01 SOH */ ( _CC ), + /* 02 STX */ ( _CC ), + /* 03 ETX */ ( _CC ), + /* 04 EOT */ ( _CC ), + /* 05 ENQ */ ( _CC ), + /* 06 ACK */ ( _CC ), + /* 07 BEL */ ( _CC ), + /* 08 BS */ ( _CC ), + /* 09 TAB */ ( _CC | _CW | _CB ), + /* 0A LF */ ( _CC | _CW ), + /* 0B VT */ ( _CC | _CW ), + /* 0C FF */ ( _CC | _CW ), + /* 0D CR */ ( _CC | _CW ), + /* 0E SO */ ( _CC ), + /* 0F SI */ ( _CC ), + /* 10 DLE */ ( _CC ), + /* 11 DC1 */ ( _CC ), + /* 12 DC2 */ ( _CC ), + /* 13 DC3 */ ( _CC ), + /* 14 DC4 */ ( _CC ), + /* 15 NAK */ ( _CC ), + /* 16 SYN */ ( _CC ), + /* 17 ETB */ ( _CC ), + /* 18 CAN */ ( _CC ), + /* 19 EM */ ( _CC ), + /* 1A SUB */ ( _CC ), + /* 1B ESC */ ( _CC ), + /* 1C FS */ ( _CC ), + /* 1D GS */ ( _CC ), + /* 1E RS */ ( _CC ), + /* 1F US */ ( _CC ), + /* 20 ' ' */ ( _CW | _CS | _CB ), + /* 21 '!' */ ( _CP | _CG ), + /* 22 '"' */ ( _CP | _CG ), + /* 23 '#' */ ( _CP | _CG ), + /* 24 '$' */ ( _CP | _CG ), + /* 25 '%' */ ( _CP | _CG ), + /* 26 '&' */ ( _CP | _CG ), + /* 27 '\''*/ ( _CP | _CG ), + /* 28 '(' */ ( _CP | _CG ), + /* 29 ')' */ ( _CP | _CG ), + /* 2A '*' */ ( _CP | _CG ), + /* 2B '+' */ ( _CP | _CG ), + /* 2C ',' */ ( _CP | _CG ), + /* 2D '-' */ ( _CP | _CG ), + /* 2E '.' */ ( _CP | _CG ), + /* 2F '/' */ ( _CP | _CG ), + /* 30 '0' */ ( _CD | _CG ), + /* 31 '1' */ ( _CD | _CG ), + /* 32 '2' */ ( _CD | _CG ), + /* 33 '3' */ ( _CD | _CG ), + /* 34 '4' */ ( _CD | _CG ), + /* 35 '5' */ ( _CD | _CG ), + /* 36 '6' */ ( _CD | _CG ), + /* 37 '7' */ ( _CD | _CG ), + /* 38 '8' */ ( _CD | _CG ), + /* 39 '9' */ ( _CD | _CG ), + /* 3A ':' */ ( _CP | _CG ), + /* 3B ';' */ ( _CP | _CG ), + /* 3C '<' */ ( _CP | _CG ), + /* 3D '=' */ ( _CP | _CG ), + /* 3E '>' */ ( _CP | _CG ), + /* 3F '?' */ ( _CP | _CG ), + /* 40 '@' */ ( _CP | _CG ), + /* 41 'A' */ ( _CU | _CX | _CG ), + /* 42 'B' */ ( _CU | _CX | _CG ), + /* 43 'C' */ ( _CU | _CX | _CG ), + /* 44 'D' */ ( _CU | _CX | _CG ), + /* 45 'E' */ ( _CU | _CX | _CG ), + /* 46 'F' */ ( _CU | _CX | _CG ), + /* 47 'G' */ ( _CU | _CG ), + /* 48 'H' */ ( _CU | _CG ), + /* 49 'I' */ ( _CU | _CG ), + /* 4A 'J' */ ( _CU | _CG ), + /* 4B 'K' */ ( _CU | _CG ), + /* 4C 'L' */ ( _CU | _CG ), + /* 4D 'M' */ ( _CU | _CG ), + /* 4E 'N' */ ( _CU | _CG ), + /* 4F 'O' */ ( _CU | _CG ), + /* 50 'P' */ ( _CU | _CG ), + /* 51 'Q' */ ( _CU | _CG ), + /* 52 'R' */ ( _CU | _CG ), + /* 53 'S' */ ( _CU | _CG ), + /* 54 'T' */ ( _CU | _CG ), + /* 55 'U' */ ( _CU | _CG ), + /* 56 'V' */ ( _CU | _CG ), + /* 57 'W' */ ( _CU | _CG ), + /* 58 'X' */ ( _CU | _CG ), + /* 59 'Y' */ ( _CU | _CG ), + /* 5A 'Z' */ ( _CU | _CG ), + /* 5B '[' */ ( _CP | _CG ), + /* 5C '\' */ ( _CP | _CG ), + /* 5D ']' */ ( _CP | _CG ), + /* 5E '^' */ ( _CP | _CG ), + /* 5F '_' */ ( _CP | _CG ), + /* 60 '`' */ ( _CP | _CG ), + /* 61 'a' */ ( _CL | _CX | _CG ), + /* 62 'b' */ ( _CL | _CX | _CG ), + /* 63 'c' */ ( _CL | _CX | _CG ), + /* 64 'd' */ ( _CL | _CX | _CG ), + /* 65 'e' */ ( _CL | _CX | _CG ), + /* 66 'f' */ ( _CL | _CX | _CG ), + /* 67 'g' */ ( _CL | _CG ), + /* 68 'h' */ ( _CL | _CG ), + /* 69 'i' */ ( _CL | _CG ), + /* 6A 'j' */ ( _CL | _CG ), + /* 6B 'k' */ ( _CL | _CG ), + /* 6C 'l' */ ( _CL | _CG ), + /* 6D 'm' */ ( _CL | _CG ), + /* 6E 'n' */ ( _CL | _CG ), + /* 6F 'o' */ ( _CL | _CG ), + /* 70 'p' */ ( _CL | _CG ), + /* 71 'q' */ ( _CL | _CG ), + /* 72 'r' */ ( _CL | _CG ), + /* 73 's' */ ( _CL | _CG ), + /* 74 't' */ ( _CL | _CG ), + /* 75 'u' */ ( _CL | _CG ), + /* 76 'v' */ ( _CL | _CG ), + /* 77 'w' */ ( _CL | _CG ), + /* 78 'x' */ ( _CL | _CG ), + /* 79 'y' */ ( _CL | _CG ), + /* 7A 'z' */ ( _CL | _CG ), + /* 7B '{' */ ( _CP | _CG ), + /* 7C '|' */ ( _CP | _CG ), + /* 7D '}' */ ( _CP | _CG ), + /* 7E '~' */ ( _CP | _CG ), + /* 7F DEL */ ( _CC ) +}; + +/// ASCII-8 Upper case to Lower case character conversion table +const UINT8 _C_ToLowerTable[128] = { + /* 00 NUL */ 0x00, /* 01 SOH */ 0x01, + /* 02 STX */ 0x02, /* 03 ETX */ 0x03, + /* 04 EOT */ 0x04, /* 05 ENQ */ 0x05, + /* 06 ACK */ 0x06, /* 07 BEL */ 0x07, + /* 08 BS */ 0x08, /* 09 TAB */ 0x09, + /* 0A LF */ 0x0A, /* 0B VT */ 0x0B, + /* 0C FF */ 0x0C, /* 0D CR */ 0x0D, + /* 0E SO */ 0x0E, /* 0F SI */ 0x0F, + /* 10 DLE */ 0x10, /* 11 DC1 */ 0x11, + /* 12 DC2 */ 0x12, /* 13 DC3 */ 0x13, + /* 14 DC4 */ 0x14, /* 15 NAK */ 0x15, + /* 16 SYN */ 0x16, /* 17 ETB */ 0x17, + /* 18 CAN */ 0x18, /* 19 EM */ 0x19, + /* 1A SUB */ 0x1A, /* 1B ESC */ 0x1B, + /* 1C FS */ 0x1C, /* 1D GS */ 0x1D, + /* 1E RS */ 0x1E, /* 1F US */ 0x1F, + /* 20 ' ' */ 0x20, /* 21 '!' */ 0x21, + /* 22 '"' */ 0x22, /* 23 '#' */ 0x23, + /* 24 '$' */ 0x24, /* 25 '%' */ 0x25, + /* 26 '&' */ 0x26, /* 27 '\''*/ 0x27, + /* 28 '(' */ 0x28, /* 29 ')' */ 0x29, + /* 2A '*' */ 0x2A, /* 2B '+' */ 0x2B, + /* 2C ',' */ 0x2C, /* 2D '-' */ 0x2D, + /* 2E '.' */ 0x2E, /* 2F '/' */ 0x2F, + /* 30 '0' */ 0x30, /* 31 '1' */ 0x31, + /* 32 '2' */ 0x32, /* 33 '3' */ 0x33, + /* 34 '4' */ 0x34, /* 35 '5' */ 0x35, + /* 36 '6' */ 0x36, /* 37 '7' */ 0x37, + /* 38 '8' */ 0x38, /* 39 '9' */ 0x39, + /* 3A ':' */ 0x3A, /* 3B ';' */ 0x3B, + /* 3C '<' */ 0x3C, /* 3D '=' */ 0x3D, + /* 3E '>' */ 0x3E, /* 3F '?' */ 0x3F, + /* 40 '@' */ 0x40, /* 41 'A' */ 0x61, + /* 42 'B' */ 0x62, /* 43 'C' */ 0x63, + /* 44 'D' */ 0x64, /* 45 'E' */ 0x65, + /* 46 'F' */ 0x66, /* 47 'G' */ 0x67, + /* 48 'H' */ 0x68, /* 49 'I' */ 0x69, + /* 4A 'J' */ 0x6A, /* 4B 'K' */ 0x6B, + /* 4C 'L' */ 0x6C, /* 4D 'M' */ 0x6D, + /* 4E 'N' */ 0x6E, /* 4F 'O' */ 0x6F, + /* 50 'P' */ 0x70, /* 51 'Q' */ 0x71, + /* 52 'R' */ 0x72, /* 53 'S' */ 0x73, + /* 54 'T' */ 0x74, /* 55 'U' */ 0x75, + /* 56 'V' */ 0x76, /* 57 'W' */ 0x77, + /* 58 'X' */ 0x78, /* 59 'Y' */ 0x79, + /* 5A 'Z' */ 0x7A, /* 5B '[' */ 0x5B, + /* 5C '\' */ 0x5C, /* 5D ']' */ 0x5D, + /* 5E '^' */ 0x5E, /* 5F '_' */ 0x5F, + /* 60 '`' */ 0x60, /* 61 'a' */ 0x61, + /* 62 'b' */ 0x62, /* 63 'c' */ 0x63, + /* 64 'd' */ 0x64, /* 65 'e' */ 0x65, + /* 66 'f' */ 0x66, /* 67 'g' */ 0x67, + /* 68 'h' */ 0x68, /* 69 'i' */ 0x69, + /* 6A 'j' */ 0x6A, /* 6B 'k' */ 0x6B, + /* 6C 'l' */ 0x6C, /* 6D 'm' */ 0x6D, + /* 6E 'n' */ 0x6E, /* 6F 'o' */ 0x6F, + /* 70 'p' */ 0x70, /* 71 'q' */ 0x71, + /* 72 'r' */ 0x72, /* 73 's' */ 0x73, + /* 74 't' */ 0x74, /* 75 'u' */ 0x75, + /* 76 'v' */ 0x76, /* 77 'w' */ 0x77, + /* 78 'x' */ 0x78, /* 79 'y' */ 0x79, + /* 7A 'z' */ 0x7A, /* 7B '{' */ 0x7B, + /* 7C '|' */ 0x7C, /* 7D '}' */ 0x7D, + /* 7E '~' */ 0x7E, /* 7F DEL */ 0x7F +}; + +/// ASCII-8 Lower case to Upper case character conversion table +const UINT8 _C_ToUpperTable[128] = { + /* 00 NUL */ 0x00, /* 01 SOH */ 0x01, + /* 02 STX */ 0x02, /* 03 ETX */ 0x03, + /* 04 EOT */ 0x04, /* 05 ENQ */ 0x05, + /* 06 ACK */ 0x06, /* 07 BEL */ 0x07, + /* 08 BS */ 0x08, /* 09 TAB */ 0x09, + /* 0A LF */ 0x0A, /* 0B VT */ 0x0B, + /* 0C FF */ 0x0C, /* 0D CR */ 0x0D, + /* 0E SO */ 0x0E, /* 0F SI */ 0x0F, + /* 10 DLE */ 0x10, /* 11 DC1 */ 0x11, + /* 12 DC2 */ 0x12, /* 13 DC3 */ 0x13, + /* 14 DC4 */ 0x14, /* 15 NAK */ 0x15, + /* 16 SYN */ 0x16, /* 17 ETB */ 0x17, + /* 18 CAN */ 0x18, /* 19 EM */ 0x19, + /* 1A SUB */ 0x1A, /* 1B ESC */ 0x1B, + /* 1C FS */ 0x1C, /* 1D GS */ 0x1D, + /* 1E RS */ 0x1E, /* 1F US */ 0x1F, + /* 20 ' ' */ 0x20, /* 21 '!' */ 0x21, + /* 22 '"' */ 0x22, /* 23 '#' */ 0x23, + /* 24 '$' */ 0x24, /* 25 '%' */ 0x25, + /* 26 '&' */ 0x26, /* 27 '\''*/ 0x27, + /* 28 '(' */ 0x28, /* 29 ')' */ 0x29, + /* 2A '*' */ 0x2A, /* 2B '+' */ 0x2B, + /* 2C ',' */ 0x2C, /* 2D '-' */ 0x2D, + /* 2E '.' */ 0x2E, /* 2F '/' */ 0x2F, + /* 30 '0' */ 0x30, /* 31 '1' */ 0x31, + /* 32 '2' */ 0x32, /* 33 '3' */ 0x33, + /* 34 '4' */ 0x34, /* 35 '5' */ 0x35, + /* 36 '6' */ 0x36, /* 37 '7' */ 0x37, + /* 38 '8' */ 0x38, /* 39 '9' */ 0x39, + /* 3A ':' */ 0x3A, /* 3B ';' */ 0x3B, + /* 3C '<' */ 0x3C, /* 3D '=' */ 0x3D, + /* 3E '>' */ 0x3E, /* 3F '?' */ 0x3F, + /* 40 '@' */ 0x40, /* 41 'A' */ 0x41, + /* 42 'B' */ 0x42, /* 43 'C' */ 0x43, + /* 44 'D' */ 0x44, /* 45 'E' */ 0x45, + /* 46 'F' */ 0x46, /* 47 'G' */ 0x47, + /* 48 'H' */ 0x48, /* 49 'I' */ 0x49, + /* 4A 'J' */ 0x4A, /* 4B 'K' */ 0x4B, + /* 4C 'L' */ 0x4C, /* 4D 'M' */ 0x4D, + /* 4E 'N' */ 0x4E, /* 4F 'O' */ 0x4F, + /* 50 'P' */ 0x50, /* 51 'Q' */ 0x51, + /* 52 'R' */ 0x52, /* 53 'S' */ 0x53, + /* 54 'T' */ 0x54, /* 55 'U' */ 0x55, + /* 56 'V' */ 0x56, /* 57 'W' */ 0x57, + /* 58 'X' */ 0x58, /* 59 'Y' */ 0x59, + /* 5A 'Z' */ 0x5A, /* 5B '[' */ 0x5B, + /* 5C '\' */ 0x5C, /* 5D ']' */ 0x5D, + /* 5E '^' */ 0x5E, /* 5F '_' */ 0x5F, + /* 60 '`' */ 0x60, /* 61 'a' */ 0x41, + /* 62 'b' */ 0x42, /* 63 'c' */ 0x43, + /* 64 'd' */ 0x44, /* 65 'e' */ 0x45, + /* 66 'f' */ 0x46, /* 67 'g' */ 0x47, + /* 68 'h' */ 0x48, /* 69 'i' */ 0x49, + /* 6A 'j' */ 0x4A, /* 6B 'k' */ 0x4B, + /* 6C 'l' */ 0x4C, /* 6D 'm' */ 0x4D, + /* 6E 'n' */ 0x4E, /* 6F 'o' */ 0x4F, + /* 70 'p' */ 0x50, /* 71 'q' */ 0x51, + /* 72 'r' */ 0x52, /* 73 's' */ 0x53, + /* 74 't' */ 0x54, /* 75 'u' */ 0x55, + /* 76 'v' */ 0x56, /* 77 'w' */ 0x57, + /* 78 'x' */ 0x58, /* 79 'y' */ 0x59, + /* 7A 'z' */ 0x5A, /* 7B '{' */ 0x7B, + /* 7C '|' */ 0x7C, /* 7D '}' */ 0x7D, + /* 7E '~' */ 0x7E, /* 7F DEL */ 0x7F +}; + +/// Default character classification table is 8-bit ASCII +const UINT16 *_cClass = _C_CharClassTable; + +/// Default upper to lower conversion table is 8-bit ASCII +const UINT8 *_lConvT = _C_ToLowerTable; + +/// Default lower to upper conversion table is 8-bit ASCII +const UINT8 *_uConvT = _C_ToUpperTable; + +void +__set_C_locale( void ) +{ + _cClass = _C_CharClassTable; + _lConvT = _C_ToLowerTable; + _uConvT = _C_ToUpperTable; +} diff --git a/StdLib/LibC/LibC.inf b/StdLib/LibC/LibC.inf new file mode 100644 index 0000000000..4af3ffe45e --- /dev/null +++ b/StdLib/LibC/LibC.inf @@ -0,0 +1,115 @@ +## @file +# Standard C library: Miscelaneous implementations. +# +# Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license. +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = LibC + FILE_GUID = 695bec93-82ae-4c17-bdad-7f184f4e651d + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + LIBRARY_CLASS = LibC + +# +# VALID_ARCHITECTURES = IA32 X64 IPF +# + +[Sources] + Main/errno.c + Main/assert.c + Main/isinfd_ieee754.c + Main/isinff_ieee754.c + Main/isnand_ieee754.c + Main/isnanf_ieee754.c + Main/infinityf_ieee754.c + Main/Main.c + Main/HtoNtoH.c + Main/ByteSwap.c + Main/longjmp.c + +[Sources.IA32] + Main/x86flt_rounds.c + Main/Ia32/fpu_rmode.asm | MSFT + Main/Ia32/fpu_rmode.asm | INTEL + Main/Ia32/fpu_rmode.S | GCC + Main/Ia32/isinfl.c + Main/Ia32/isnanl.c + + # Compiler helper (C RunTime) functions + CRT/Ia32/llmul.c | MSFT # __allmul + CRT/Ia32/llshl.c | MSFT # __allshl + CRT/Ia32/ulldiv.c | MSFT # __aulldiv + CRT/Ia32/ullrem.c | MSFT # __aullrem + CRT/Ia32/ullshr.c | MSFT # __aullshr + CRT/Ia32/lldiv.c | MSFT # __alldiv + CRT/Ia32/llrem.c | MSFT # __allrem + CRT/Ia32/lldvrm.c | MSFT # __alldvrm + CRT/Ia32/ulldvrm.c | MSFT # __aulldvrm + + CRT/Ia32/llmul.c | INTEL + CRT/Ia32/llshl.c | INTEL + CRT/Ia32/ulldiv.c | INTEL + CRT/Ia32/ullrem.c | INTEL + CRT/Ia32/ullshr.c | INTEL + CRT/Ia32/lldiv.c | INTEL + CRT/Ia32/llrem.c | INTEL + CRT/Ia32/lldvrm.c | INTEL + CRT/Ia32/ulldvrm.c | INTEL + + CRT/Gcc.c | GCC + +[Sources.X64] + Main/x86flt_rounds.c + Main/X64/fpu_rmode.asm | MSFT + Main/X64/fpu_rmode.asm | INTEL + Main/X64/fpu_rmode.S | GCC + Main/X64/isinfl.c + Main/X64/isnanl.c + +[Sources.IPF] + Main/x86flt_rounds.c + Main/Ipf/FpuRmode.s + +[Sources.ARM] + Main/Arm/flt_rounds.c + +[Binaries.IA32] + LIB|Main/Ia32/ftol2.obj|*|MSFT + +[Packages] + StdLib/StdLib.dec + StdLibPrivateInternalFiles/DoNotUse.dec + MdePkg/MdePkg.dec + ShellPkg/ShellPkg.dec + +[LibraryClasses] + ShellCEntryLib + UefiLib + BaseLib + BaseMemoryLib + MemoryAllocationLib + TimerLib + LibStdLib + LibStdio + LibString + +################################################################ +# +# The Build Options, below, are only used when building the C library. +# DO NOT use them when building your application! +# Nasty things could happen if you do. +# +[BuildOptions] + MSFT:*_*_IA32_CC_FLAGS = /GL- diff --git a/StdLib/LibC/Locale/Locale.inf b/StdLib/LibC/Locale/Locale.inf new file mode 100644 index 0000000000..5fee723f85 --- /dev/null +++ b/StdLib/LibC/Locale/Locale.inf @@ -0,0 +1,74 @@ +## @file +# Standard C library: Locale implementation. +# +# Copyright (c) 2010, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php. +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = LibLocale + FILE_GUID = 9205cde5-5ae5-4a4b-bfbf-f6211967eef9 + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + LIBRARY_CLASS = LibLocale + +# +# VALID_ARCHITECTURES = IA32 X64 IPF +# + +[Sources] + __mb_cur_max.c # + _def_messages.c # + _def_monetary.c # + _def_numeric.c # + _def_time.c # + aliasname.c # + ctypeio.c # + localeconv.c # + nl_langinfo.c # + setlocale1.c # + setlocale32.c # + setlocale.c # + wcscoll.c # + wcsftime.c # + wcstoimax.c # + wcstol.c # + wcstoll.c # + wcstoul.c # + wcstoull.c # + wcstoumax.c # + wcstod.c # + wcstof.c # + wcstold.c # + wcsxfrm.c # + + # Single-byte locale to avoid bringing in citrus + iswctype_sb.c # + multibyte_sb.c # + +[Packages] + StdLib/StdLib.dec + StdLibPrivateInternalFiles/DoNotUse.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + LibC + LibCType + +################################################################ +# +# The Build Options, below, are only used when building the C library. +# DO NOT use them when building your application! +# Nasty things could happen if you do. +# +[BuildOptions] + GCC:*_*_*_CC_FLAGS = -fno-builtin diff --git a/StdLib/LibC/Locale/__mb_cur_max.c b/StdLib/LibC/Locale/__mb_cur_max.c new file mode 100644 index 0000000000..394c6c2eed --- /dev/null +++ b/StdLib/LibC/Locale/__mb_cur_max.c @@ -0,0 +1,39 @@ +/* $NetBSD: __mb_cur_max.c,v 1.2 2001/01/25 01:25:06 itojun Exp $ */ + +/*- + * Copyright (c)1999 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: __mb_cur_max.c,v 1.2 2001/01/25 01:25:06 itojun Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +size_t __mb_cur_max = 1; +size_t __mb_len_max_runtime = MB_LEN_MAX; + diff --git a/StdLib/LibC/Locale/__wctoint.h b/StdLib/LibC/Locale/__wctoint.h new file mode 100644 index 0000000000..47d1e74686 --- /dev/null +++ b/StdLib/LibC/Locale/__wctoint.h @@ -0,0 +1,79 @@ +/* $NetBSD: __wctoint.h,v 1.1 2001/09/28 11:25:37 yamt Exp $ */ + +/*- + * Copyright (c)2001 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Citrus: xpg4dl/FreeBSD/lib/libc/locale/__wctoint.h,v 1.1 2001/09/21 13:52:32 yamt Exp $ + */ + + +__inline static int +__wctoint(wchar_t wc) +{ + int n; + + /* XXX I expect compiler to optimize this. :D */ + switch (wc) { + case L'0': n = 0; break; + case L'1': n = 1; break; + case L'2': n = 2; break; + case L'3': n = 3; break; + case L'4': n = 4; break; + case L'5': n = 5; break; + case L'6': n = 6; break; + case L'7': n = 7; break; + case L'8': n = 8; break; + case L'9': n = 9; break; + case L'A': case L'a': n = 10; break; + case L'B': case L'b': n = 11; break; + case L'C': case L'c': n = 12; break; + case L'D': case L'd': n = 13; break; + case L'E': case L'e': n = 14; break; + case L'F': case L'f': n = 15; break; + case L'G': case L'g': n = 16; break; + case L'H': case L'h': n = 17; break; + case L'I': case L'i': n = 18; break; + case L'J': case L'j': n = 19; break; + case L'K': case L'k': n = 20; break; + case L'L': case L'l': n = 21; break; + case L'M': case L'm': n = 22; break; + case L'N': case L'n': n = 23; break; + case L'O': case L'o': n = 24; break; + case L'P': case L'p': n = 25; break; + case L'Q': case L'q': n = 26; break; + case L'R': case L'r': n = 27; break; + case L'S': case L's': n = 28; break; + case L'T': case L't': n = 29; break; + case L'U': case L'u': n = 30; break; + case L'V': case L'v': n = 31; break; + case L'W': case L'w': n = 32; break; + case L'X': case L'x': n = 33; break; + case L'Y': case L'y': n = 34; break; + case L'Z': case L'z': n = 35; break; + default: n = -1; break; /* error */ + } + + return n; +} diff --git a/StdLib/LibC/Locale/_def_messages.c b/StdLib/LibC/Locale/_def_messages.c new file mode 100644 index 0000000000..2481febf53 --- /dev/null +++ b/StdLib/LibC/Locale/_def_messages.c @@ -0,0 +1,24 @@ +/* $NetBSD: _def_messages.c,v 1.6 2005/06/12 05:21:27 lukem Exp $ */ + +/* + * Written by J.T. Conklin . + * Public domain. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: _def_messages.c,v 1.6 2005/06/12 05:21:27 lukem Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +const _MessagesLocale _DefaultMessagesLocale = +{ + "^[Yy]", + "^[Nn]", + "yes", + "no" +} ; + +const _MessagesLocale *_CurrentMessagesLocale = &_DefaultMessagesLocale; diff --git a/StdLib/LibC/Locale/_def_monetary.c b/StdLib/LibC/Locale/_def_monetary.c new file mode 100644 index 0000000000..af11866859 --- /dev/null +++ b/StdLib/LibC/Locale/_def_monetary.c @@ -0,0 +1,42 @@ +/* $NetBSD: _def_monetary.c,v 1.8 2005/06/12 05:21:27 lukem Exp $ */ + +/* + * Written by J.T. Conklin . + * Public domain. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: _def_monetary.c,v 1.8 2005/06/12 05:21:27 lukem Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include + +const _MonetaryLocale _DefaultMonetaryLocale = +{ + "", + "", + "", + "", + "", + "", + "", + (char)CHAR_MAX, + (char)CHAR_MAX, + (char)CHAR_MAX, + (char)CHAR_MAX, + (char)CHAR_MAX, + (char)CHAR_MAX, + (char)CHAR_MAX, + (char)CHAR_MAX, + (char)CHAR_MAX, + (char)CHAR_MAX, + (char)CHAR_MAX, + (char)CHAR_MAX, + (char)CHAR_MAX, + (char)CHAR_MAX +}; + +const _MonetaryLocale *_CurrentMonetaryLocale = &_DefaultMonetaryLocale; diff --git a/StdLib/LibC/Locale/_def_numeric.c b/StdLib/LibC/Locale/_def_numeric.c new file mode 100644 index 0000000000..10a6cec004 --- /dev/null +++ b/StdLib/LibC/Locale/_def_numeric.c @@ -0,0 +1,23 @@ +/* $NetBSD: _def_numeric.c,v 1.6 2005/06/12 05:21:27 lukem Exp $ */ + +/* + * Written by J.T. Conklin . + * Public domain. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: _def_numeric.c,v 1.6 2005/06/12 05:21:27 lukem Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +const _NumericLocale _DefaultNumericLocale = +{ + ".", + "", + "" +}; + +const _NumericLocale *_CurrentNumericLocale = &_DefaultNumericLocale; diff --git a/StdLib/LibC/Locale/_def_time.c b/StdLib/LibC/Locale/_def_time.c new file mode 100644 index 0000000000..102fff554d --- /dev/null +++ b/StdLib/LibC/Locale/_def_time.c @@ -0,0 +1,42 @@ +/* $NetBSD: _def_time.c,v 1.8 2005/06/12 05:21:27 lukem Exp $ */ + +/* + * Written by J.T. Conklin . + * Public domain. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: _def_time.c,v 1.8 2005/06/12 05:21:27 lukem Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +const _TimeLocale _DefaultTimeLocale = +{ + { + "Sun","Mon","Tue","Wed","Thu","Fri","Sat", + }, + { + "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", + "Friday", "Saturday" + }, + { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" + }, + { + "January", "February", "March", "April", "May", "June", "July", + "August", "September", "October", "November", "December" + }, + { + "AM", "PM" + }, + "%a %b %e %H:%M:%S %Y", + "%m/%d/%y", + "%H:%M:%S", + "%I:%M:%S %p" +}; + +const _TimeLocale *_CurrentTimeLocale = &_DefaultTimeLocale; diff --git a/StdLib/LibC/Locale/_wcstod.h b/StdLib/LibC/Locale/_wcstod.h new file mode 100644 index 0000000000..1e7c47f2c0 --- /dev/null +++ b/StdLib/LibC/Locale/_wcstod.h @@ -0,0 +1,126 @@ +/* $NetBSD: _wcstod.h,v 1.1 2006/04/15 12:17:23 tnozaki Exp $ */ + +/*- + * Copyright (c) 2002 Tim J. Robbins + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Original version ID: + * FreeBSD: /repoman/r/ncvs/src/lib/libc/locale/wcstod.c,v 1.4 2004/04/07 09:47:56 tjr Exp + * NetBSD: wcstod.c,v 1.8 2006/04/13 01:25:13 tnozaki Exp + */ + +/* + * function template for wcstof, wcstod, wcstold. + * + * parameters: + * _FUNCNAME : function name + * _RETURN_TYPE : return type + * _STRTOD_FUNC : real conversion function + */ +#ifndef __WCSTOD_H_ +#define __WCSTOD_H_ + +/* + * Convert a string to a double-precision number. + * + * This is the wide-character counterpart of strto{f,d,ld}(). So that + * we do not have to duplicate the code of strto{f,d,ld}() here, + * we convert the supplied wide character string to multibyte and + * call strto{f,d,ld}() on the result. + * This assumes that the multibyte encoding is compatible with ASCII + * for at least the digits, radix character and letters. + */ +_RETURN_TYPE +_FUNCNAME(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr) +{ + const wchar_t *src, *start; + _RETURN_TYPE val; + char *buf, *end; + size_t bufsiz, len; + + _DIAGASSERT(nptr != NULL); + /* endptr may be null */ + + src = nptr; + while (iswspace((wint_t)*src) != 0) + ++src; + if (*src == L'\0') + goto no_convert; + + /* + * Convert the supplied numeric wide char. string to multibyte. + * + * We could attempt to find the end of the numeric portion of the + * wide char. string to avoid converting unneeded characters but + * choose not to bother; optimising the uncommon case where + * the input string contains a lot of text after the number + * duplicates a lot of strto{f,d,ld}()'s functionality and + * slows down the most common cases. + */ + start = src; + len = wcstombs(NULL, src, 0); + if (len == (size_t)-1) + /* errno = EILSEQ */ + goto no_convert; + + _DIAGASSERT(len > 0); + + bufsiz = len; + buf = (void *)malloc(bufsiz + 1); + if (buf == NULL) + /* errno = ENOMEM */ + goto no_convert; + + len = wcstombs(buf, src, bufsiz + 1); + + _DIAGASSERT(len == bufsiz); + _DIAGASSERT(buf[len] == '\0'); + + /* Let strto{f,d,ld}() do most of the work for us. */ + val = _STRTOD_FUNC(buf, &end); + if (buf == end) { + free(buf); + goto no_convert; + } + + /* + * We only know where the number ended in the _multibyte_ + * representation of the string. If the caller wants to know + * where it ended, count multibyte characters to find the + * corresponding position in the wide char string. + */ + if (endptr != NULL) + /* XXX Assume each wide char is one byte. */ + *endptr = __UNCONST(start + (size_t)(end - buf)); + + free(buf); + + return val; + +no_convert: + if (endptr != NULL) + *endptr = __UNCONST(nptr); + return 0; +} +#endif /*__WCSTOD_H_*/ diff --git a/StdLib/LibC/Locale/_wcstol.h b/StdLib/LibC/Locale/_wcstol.h new file mode 100644 index 0000000000..97d0dc9a95 --- /dev/null +++ b/StdLib/LibC/Locale/_wcstol.h @@ -0,0 +1,153 @@ +/** @file + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + Original version ID: + @(#)strtol.c 8.1 (Berkeley) 6/4/93 + NetBSD: wcstol.c,v 1.1 2001/09/27 16:30:36 yamt Exp + Citrus: xpg4dl/FreeBSD/lib/libc/locale/wcstol.c,v 1.2 2001/09/21 16:11:41 yamt Exp + NetBSD: _wcstol.h,v 1.3 2005/11/29 03:11:59 christos Exp + */ + +/* + * function template for wcstol, wcstoll and wcstoimax. + * + * parameters: + * _FUNCNAME : function name + * __wINT : return type + * __wINT_MIN : lower limit of the return type + * __wINT_MAX : upper limit of the return type + */ + +__wINT +_FUNCNAME( + const wchar_t *nptr, + wchar_t **endptr, + int base + ) +{ + const wchar_t *s; + __wINT acc, cutoff; + wint_t wc; + int i; + int neg, any, cutlim; + + _DIAGASSERT(nptr != NULL); + /* endptr may be NULL */ + +#ifdef __GNUC__ + (void)&acc; (void)&cutoff; +#endif + + /* check base value */ + if (base && (base < 2 || base > 36)) { + errno = EINVAL; + return 0; + } + + /* + * Skip white space and pick up leading +/- sign if any. + * If base is 0, allow 0x for hex and 0 for octal, else + * assume decimal; if base is already 16, allow 0x. + */ + s = nptr; + do { + wc = (wchar_t) *s++; + } while (iswspace(wc)); + if (wc == L'-') { + neg = 1; + wc = *s++; + } else { + neg = 0; + if (wc == L'+') + wc = *s++; + } + if ((base == 0 || base == 16) && + wc == L'0' && (*s == L'x' || *s == L'X')) { + wc = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = ((wc == L'0') ? 8 : 10); + + /* + * See strtol for comments as to the logic used. + */ + cutoff = neg ? __wINT_MIN : __wINT_MAX; + cutlim = (int)(cutoff % base); + cutoff /= base; + if (neg) { + if (cutlim > 0) { + cutlim -= base; + cutoff += 1; + } + cutlim = -cutlim; + } + for (acc = 0, any = 0;; wc = (wchar_t) *s++) { + i = __wctoint((wchar_t)wc); + if (i == -1) + break; + if (i >= base) + break; + if (any < 0) + continue; + if (neg) { + if (acc < cutoff || (acc == cutoff && i > cutlim)) { + any = -1; + acc = __wINT_MIN; + errno = ERANGE; + } else { + any = 1; + acc *= base; + acc -= i; + } + } else { + if (acc > cutoff || (acc == cutoff && i > cutlim)) { + any = -1; + acc = __wINT_MAX; + errno = ERANGE; + } else { + any = 1; + acc *= base; + acc += i; + } + } + } + if (endptr != 0) + *endptr = __UNCONST(any ? s - 1 : nptr); + return (acc); +} diff --git a/StdLib/LibC/Locale/_wcstoul.h b/StdLib/LibC/Locale/_wcstoul.h new file mode 100644 index 0000000000..ebfc330fe9 --- /dev/null +++ b/StdLib/LibC/Locale/_wcstoul.h @@ -0,0 +1,131 @@ +/** @file + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + Original version ID: + @(#)strtoul.c 8.1 (Berkeley) 6/4/93 + Citrus: xpg4dl/FreeBSD/lib/libc/locale/wcstoul.c,v 1.2 2001/09/21 16:11:41 yamt Exp + NetBSD: wcstoul.c,v 1.1 2001/09/27 16:30:37 yamt Exp + NetBSD: _wcstoul.h,v 1.3 2005/11/29 03:11:59 christos Exp + */ + +/* + * function template for wcstoul, wcstoull and wcstoumax. + * + * parameters: + * _FUNCNAME : function name + * __wUINT : return type + * __wINT : signed version of __wUINT + * __wUINT_MAX : upper limit of the return type + */ + +__wUINT +_FUNCNAME( + const wchar_t *nptr, + wchar_t **endptr, + int base + ) +{ + const wchar_t *s; + __wUINT acc, cutoff; + wint_t wc; + int i; + int neg, any, cutlim; + + _DIAGASSERT(nptr != NULL); + /* endptr may be NULL */ + + if (base && (base < 2 || base > 36)) { + errno = EINVAL; + return 0; + } + + /* + * Skip white space and pick up leading +/- sign if any. + * If base is 0, allow 0x for hex and 0 for octal, else + * assume decimal; if base is already 16, allow 0x. + */ + s = nptr; + do { + wc = (wchar_t) *s++; + } while (iswspace(wc)); + if (wc == L'-') { + neg = 1; + wc = *s++; + } else { + neg = 0; + if (wc == L'+') + wc = *s++; + } + if ((base == 0 || base == 16) && + wc == L'0' && (*s == L'x' || *s == L'X')) { + wc = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = wc == L'0' ? 8 : 10; + + /* + * See strtoul for comments as to the logic used. + */ + cutoff = __wUINT_MAX / (__wUINT)base; + cutlim = (int)(__wUINT_MAX % (__wUINT)base); + for (acc = 0, any = 0;; wc = (wint_t) *s++) { + i = __wctoint((wchar_t)wc); + if (i == -1) { + break; + } + if (i >= base) + break; + if (any < 0) + continue; + if (acc > cutoff || (acc == cutoff && i > cutlim)) { + any = -1; + acc = __wUINT_MAX; + errno = ERANGE; + } else { + any = 1; + acc *= (__wUINT)base; + acc += i; + } + } + if (neg && any > 0) + acc = (__wUINT)(-((__wINT)acc)); + if (endptr != 0) + *endptr = __UNCONST(any ? s - 1 : nptr); + return (acc); +} diff --git a/StdLib/LibC/Locale/aliasname.c b/StdLib/LibC/Locale/aliasname.c new file mode 100644 index 0000000000..56303e97fe --- /dev/null +++ b/StdLib/LibC/Locale/aliasname.c @@ -0,0 +1,129 @@ +/* $NetBSD: aliasname.c,v 1.2 2005/02/09 21:35:46 kleink Exp $ */ + +/*- + * Copyright (c)2002 YAMAMOTO Takashi, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: aliasname.c,v 1.2 2005/02/09 21:35:46 kleink Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" +#include +#include +#include + +#include "aliasname_local.h" + +__inline int __is_ws(char); + +__inline int __is_ws(char ch) +{ + + return (ch == ' ' || ch == '\t'); +} + +const char * +__unaliasname(const char *dbname, const char *alias, void *buf, size_t bufsize) +{ + FILE *fp = NULL; + const char *result = alias; + size_t resultlen; + size_t aliaslen; + const char *p; + size_t len; + + _DIAGASSERT(dbname != NULL); + _DIAGASSERT(alias != NULL); + _DIAGASSERT(buf != NULL); + + fp = fopen(dbname, "r"); + if (fp == NULL) + goto quit; + + aliaslen = strlen(alias); + + while (/*CONSTCOND*/ 1) { + p = fgetln(fp, &len); + if (p == NULL) + goto quit; /* eof or error */ + + _DIAGASSERT(len != 0); + + /* ignore terminating NL */ + if (p[len - 1] == '\n') + len--; + + /* ignore null line and comment */ + if (len == 0 || p[0] == '#') + continue; + + if (aliaslen > len) + continue; + + if (memcmp(alias, p, aliaslen)) + continue; + + p += aliaslen; + len -= aliaslen; + + if (len == 0 || !__is_ws(*p)) + continue; + + /* entry was found here */ + break; + + /* NOTREACHED */ + } + + /* skip white spaces */ + do { + p++; + len--; + } while (len != 0 && __is_ws(*p)); + + if (len == 0) + goto quit; + + /* count length of result */ + resultlen = 0; + while (resultlen < len && !__is_ws(*p)) + resultlen++; + + /* check if space is enough */ + if (bufsize < resultlen + 1) + goto quit; + + memcpy(buf, p, resultlen); + ((char *)buf)[resultlen] = 0; + result = buf; + +quit: + if (fp) + fclose(fp); + + return result; +} diff --git a/StdLib/LibC/Locale/aliasname_local.h b/StdLib/LibC/Locale/aliasname_local.h new file mode 100644 index 0000000000..9daec022b2 --- /dev/null +++ b/StdLib/LibC/Locale/aliasname_local.h @@ -0,0 +1,29 @@ +/* $NetBSD: aliasname_local.h,v 1.1 2002/02/13 07:45:52 yamt Exp $ */ + +/*- + * Copyright (c)2002 YAMAMOTO Takashi, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +const char *__unaliasname(const char *, const char *, void *, size_t); diff --git a/StdLib/LibC/Locale/ctypeio.c b/StdLib/LibC/Locale/ctypeio.c new file mode 100644 index 0000000000..8679dcd884 --- /dev/null +++ b/StdLib/LibC/Locale/ctypeio.c @@ -0,0 +1,186 @@ +/** @file + Internal C-type locale functions. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1997 Christos Zoulas. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: + This product includes software developed by Christos Zoulas. + 4. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + NetBSD: ctypeio.c,v 1.7 2005/11/29 03:11:59 christos Exp +**/ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: ctypeio.c,v 1.7 2005/11/29 03:11:59 christos Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include + +#include +#include +#include +#include +#define _CTYPE_PRIVATE +#include +#include "ctypeio.h" + +int +__loadctype(const char *name) +{ + FILE *fp; + char id[sizeof(_CTYPE_ID) - 1]; + u_int32_t i, len; + unsigned short *new_ctype = NULL; + unsigned char *new_toupper = NULL, *new_tolower = NULL; + + _DIAGASSERT(name != NULL); + + if ((fp = fopen(name, "r")) == NULL) + return 0; + + if (fread(id, sizeof(id), 1, fp) != 1) + goto bad; + + if (memcmp(id, _CTYPE_ID, sizeof(id)) != 0) + goto bad; + + if (fread(&i, sizeof(u_int32_t), 1, fp) != 1) + goto bad; + + if ((i = ntohl(i)) != _CTYPE_REV) + goto bad; + + if (fread(&len, sizeof(u_int32_t), 1, fp) != 1) + goto bad; + + if ((len = ntohl(len)) != _CTYPE_NUM_CHARS) + goto bad; + + if ((new_ctype = malloc(sizeof(UINT16) * (1 + len))) == NULL) + goto bad; + + new_ctype[0] = 0; + if (fread(&new_ctype[1], sizeof(UINT16), len, fp) != len) + goto bad; + + if ((new_toupper = malloc(sizeof(UINT8) * (1 + len))) == NULL) + goto bad; + + new_toupper[0] = (UINT8)EOF; + if (fread(&new_toupper[1], sizeof(UINT8), len, fp) != len) + goto bad; + + if ((new_tolower = malloc(sizeof(UINT8) * (1 + len))) == NULL) + goto bad; + + new_tolower[0] = (UINT8)EOF; + if (fread(&new_tolower[1], sizeof(UINT8), len, fp) != len) + goto bad; + +#if BYTE_ORDER == LITTLE_ENDIAN + for (i = 1; i <= len; i++) { + new_ctype[i] = ntohs(new_ctype[i]); + } +#endif + + (void) fclose(fp); + if (_cClass != _C_CharClassTable) + free(__UNCONST(_cClass)); + _cClass = new_ctype; + if (_uConvT != _C_ToUpperTable) + free(__UNCONST(_uConvT)); + _uConvT = new_toupper; + if (_lConvT != _C_ToLowerTable) + free(__UNCONST(_lConvT)); + _lConvT = new_tolower; + + return 1; +bad: + free(new_tolower); + free(new_toupper); + free(new_ctype); + (void) fclose(fp); + return 0; +} + +int +__savectype( + const char *name, + unsigned short *new_ctype, + unsigned char *new_toupper, + unsigned char *new_tolower + ) +{ + FILE *fp; + u_int32_t i, len = _CTYPE_NUM_CHARS; + + _DIAGASSERT(name != NULL); + _DIAGASSERT(new_ctype != NULL); + _DIAGASSERT(new_toupper != NULL); + _DIAGASSERT(new_tolower != NULL); + + if ((fp = fopen(name, "w")) == NULL) + return 0; + + if (fwrite(_CTYPE_ID, sizeof(_CTYPE_ID) - 1, 1, fp) != 1) + goto bad; + + i = htonl(_CTYPE_REV); + if (fwrite(&i, sizeof(u_int32_t), 1, fp) != 1) + goto bad; + + i = htonl(len); + if (fwrite(&i, sizeof(u_int32_t), 1, fp) != 1) + goto bad; + +#if BYTE_ORDER == LITTLE_ENDIAN + for (i = 1; i <= len; i++) { + new_ctype[i] = htons(new_ctype[i]); + } +#endif + if (fwrite(&new_ctype[1], sizeof(UINT16), len, fp) != len) + goto bad; + + if (fwrite(&new_toupper[1], sizeof(UINT8), len, fp) != len) + goto bad; + + if (fwrite(&new_tolower[1], sizeof(UINT8), len, fp) != len) + goto bad; + + (void) fclose(fp); + return 1; +bad: + (void) fclose(fp); + return 0; +} diff --git a/StdLib/LibC/Locale/ctypeio.h b/StdLib/LibC/Locale/ctypeio.h new file mode 100644 index 0000000000..919889fa84 --- /dev/null +++ b/StdLib/LibC/Locale/ctypeio.h @@ -0,0 +1,35 @@ +/* $NetBSD: ctypeio.h,v 1.1 1997/06/02 09:52:48 kleink Exp $ */ + +/* + * Copyright (c) 1997 Christos Zoulas. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Christos Zoulas. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +__BEGIN_DECLS +int __loadctype (const char *); +int __savectype (const char *, unsigned short *, unsigned char *, unsigned char *); +__END_DECLS diff --git a/StdLib/LibC/Locale/iswctype_sb.c b/StdLib/LibC/Locale/iswctype_sb.c new file mode 100644 index 0000000000..454201543f --- /dev/null +++ b/StdLib/LibC/Locale/iswctype_sb.c @@ -0,0 +1,234 @@ +/** @file + Wide character classification and conversion functions. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1989 The Regents of the University of California. + All rights reserved. + (c) UNIX System Laboratories, Inc. + All or some portions of this file are derived from material licensed + to the University of California by American Telephone and Telegraph + Co. or Unix System Laboratories, Inc. and are reproduced herein with + the permission of UNIX System Laboratories, Inc. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + NetBSD: iswctype_sb.c,v 1.4 2004/07/21 20:27:46 tshiozak Exp +**/ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: iswctype_sb.c,v 1.4 2004/07/21 20:27:46 tshiozak Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include + +#undef iswalnum +int +iswalnum(wint_t c) +{ + return isalnum((int)c); +} + +#undef iswalpha +int +iswalpha(wint_t c) +{ + return isalpha((int)c); +} + +#undef iswblank +int +iswblank(wint_t c) +{ + return isblank((int)c); +} + +#undef iswcntrl +int +iswcntrl(wint_t c) +{ + return iscntrl((int)c); +} + +#undef iswdigit +int +iswdigit(wint_t c) +{ + return isdigit((int)c); +} + +#undef iswgraph +int +iswgraph(wint_t c) +{ + return isgraph((int)c); +} + +#undef iswlower +int +iswlower(wint_t c) +{ + return islower((int)c); +} + +#undef iswprint +int +iswprint(wint_t c) +{ + return isprint((int)c); +} + +#undef iswpunct +int +iswpunct(wint_t c) +{ + return ispunct((int)c); +} + +#undef iswspace +int +iswspace(wint_t c) +{ + return isspace((int)c); +} + +#undef iswupper +int +iswupper(wint_t c) +{ + return isupper((int)c); +} + +#undef iswxdigit +int +iswxdigit(wint_t c) +{ + return isxdigit((int)c); +} + +#undef towupper +wint_t +towupper(wint_t c) +{ + return toupper((int)c); +} + +#undef towlower +wint_t +towlower(wint_t c) +{ + return tolower((int)c); +} + +#undef wcwidth +int +/*ARGSUSED*/ +wcwidth(wchar_t c) +{ + return 1; +} + +#undef iswctype +int +iswctype(wint_t c, wctype_t charclass) +{ + /* + * SUSv3: If charclass is 0, iswctype() shall return 0. + */ + return (__isCClass((int)c, (unsigned int)charclass)); +} + +// Additional functions in but not in NetBSD _sb code. +static +struct _typestrval { + char *name; + wctype_t value; +} typestrval[] = { + { "alnum", (_CD | _CU | _CL | _XA) }, + { "alpha", (_CU | _CL | _XA) }, + { "blank", (_CB) }, + { "cntrl", (_CC) }, + { "digit", (_CD) }, + { "graph", (_CG) }, + { "lower", (_CL) }, + { "print", (_CS | _CG) }, + { "punct", (_CP) }, + { "space", (_CW) }, + { "upper", (_CU) }, + { "xdigit", (_CD | _CX) } +}; + +#define NUM_PROPVAL (sizeof(typestrval) / sizeof(struct _typestrval)) + +static +struct _transtrval { + char *name; + wctrans_t function; +} transtrval[] = { + { "tolower", towlower }, + { "toupper", towupper } +}; + +#define NUM_TRANSVAL (sizeof(transtrval) / sizeof(struct _transtrval)) + +wctype_t wctype(const char *property) +{ + int i; + + for(i = 0; i < NUM_PROPVAL; ++i) { + if( strcmp(typestrval[i].name, property) == 0) { + return typestrval[i].value; + } + } + return 0; +} + +wint_t towctrans(wint_t p1, wctrans_t tranfunc) +{ + return tranfunc(p1); +} + +wctrans_t wctrans(const char *property) +{ + int i; + + for(i = 0; i < NUM_TRANSVAL; ++i) { + if( strcmp(transtrval[i].name, property) == 0) { + return transtrval[i].function; + } + } + return NULL; +} diff --git a/StdLib/LibC/Locale/localeconv.c b/StdLib/LibC/Locale/localeconv.c new file mode 100644 index 0000000000..46430f9c48 --- /dev/null +++ b/StdLib/LibC/Locale/localeconv.c @@ -0,0 +1,85 @@ +/* $NetBSD: localeconv.c,v 1.13 2005/11/29 03:11:59 christos Exp $ */ + +/* + * Written by J.T. Conklin . + * Public domain. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: localeconv.c,v 1.13 2005/11/29 03:11:59 christos Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +/* + * The localeconv() function constructs a struct lconv from the current + * monetary and numeric locales. + * + * Because localeconv() may be called many times (especially by library + * routines like printf() & strtod()), the approprate members of the + * lconv structure are computed only when the monetary or numeric + * locale has been changed. + */ +int __mlocale_changed = 1; +int __nlocale_changed = 1; + +/* + * Return the current locale conversion. + */ +struct lconv * +localeconv() +{ + static struct lconv ret; + + if (__mlocale_changed) { + /* LC_MONETARY */ + ret.int_curr_symbol = + __UNCONST(_CurrentMonetaryLocale->int_curr_symbol); + ret.currency_symbol = + __UNCONST(_CurrentMonetaryLocale->currency_symbol); + ret.mon_decimal_point = + __UNCONST(_CurrentMonetaryLocale->mon_decimal_point); + ret.mon_thousands_sep = + __UNCONST(_CurrentMonetaryLocale->mon_thousands_sep); + ret.mon_grouping = + __UNCONST(_CurrentMonetaryLocale->mon_grouping); + ret.positive_sign = + __UNCONST(_CurrentMonetaryLocale->positive_sign); + ret.negative_sign = + __UNCONST(_CurrentMonetaryLocale->negative_sign); + ret.int_frac_digits = _CurrentMonetaryLocale->int_frac_digits; + ret.frac_digits = _CurrentMonetaryLocale->frac_digits; + ret.p_cs_precedes = _CurrentMonetaryLocale->p_cs_precedes; + ret.p_sep_by_space = _CurrentMonetaryLocale->p_sep_by_space; + ret.n_cs_precedes = _CurrentMonetaryLocale->n_cs_precedes; + ret.n_sep_by_space = _CurrentMonetaryLocale->n_sep_by_space; + ret.p_sign_posn = _CurrentMonetaryLocale->p_sign_posn; + ret.n_sign_posn = _CurrentMonetaryLocale->n_sign_posn; + ret.int_p_cs_precedes = + _CurrentMonetaryLocale->int_p_cs_precedes; + ret.int_n_cs_precedes = + _CurrentMonetaryLocale->int_n_cs_precedes; + ret.int_p_sep_by_space = + _CurrentMonetaryLocale->int_p_sep_by_space; + ret.int_n_sep_by_space = + _CurrentMonetaryLocale->int_n_sep_by_space; + ret.int_p_sign_posn = _CurrentMonetaryLocale->int_p_sign_posn; + ret.int_n_sign_posn = _CurrentMonetaryLocale->int_n_sign_posn; + __mlocale_changed = 0; + } + + if (__nlocale_changed) { + /* LC_NUMERIC */ + ret.decimal_point = + __UNCONST(_CurrentNumericLocale->decimal_point); + ret.thousands_sep = + __UNCONST(_CurrentNumericLocale->thousands_sep); + ret.grouping = + __UNCONST(_CurrentNumericLocale->grouping); + __nlocale_changed = 0; + } + + return (&ret); +} diff --git a/StdLib/LibC/Locale/multibyte_sb.c b/StdLib/LibC/Locale/multibyte_sb.c new file mode 100644 index 0000000000..6d57cd6c09 --- /dev/null +++ b/StdLib/LibC/Locale/multibyte_sb.c @@ -0,0 +1,272 @@ +/* $NetBSD: multibyte_sb.c,v 1.5 2004/07/21 20:27:46 tshiozak Exp $ */ + +/* + * Copyright (c) 1991 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char *sccsid = "from: @(#)multibyte.c 5.1 (Berkeley) 2/18/91"; +#else +__RCSID("$NetBSD: multibyte_sb.c,v 1.5 2004/07/21 20:27:46 tshiozak Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include + +/* + * Stub multibyte character functions. + * This cheezy implementation is fixed to the native single-byte + * character set. + */ + +/*ARGSUSED*/ +int +mbsinit(const mbstate_t *ps) +{ + + return 1; +} + +/*ARGSUSED*/ +size_t +mbrlen( + const char *s, + size_t n, + mbstate_t *ps + ) +{ + + /* ps appears to be unused */ + + if (s == NULL || *s == '\0') + return 0; + if (n == 0) + return (size_t)-1; + return 1; +} + +int +mblen( + const char *s, + size_t n + ) +{ + + /* s may be NULL */ + + return (int)mbrlen(s, n, NULL); +} + +/*ARGSUSED*/ +size_t +mbrtowc( + wchar_t *pwc, + const char *s, + size_t n, + mbstate_t *ps + ) +{ + + /* pwc may be NULL */ + /* s may be NULL */ + /* ps appears to be unused */ + + if (s == NULL) + return 0; + if (n == 0) + return (size_t)-1; + if (pwc) + *pwc = (wchar_t) *s; + return (*s != '\0'); +} + +int +mbtowc( + wchar_t *pwc, + const char *s, + size_t n + ) +{ + + /* pwc may be NULL */ + /* s may be NULL */ + + return (int)mbrtowc(pwc, s, n, NULL); +} + +/*ARGSUSED*/ +size_t +wcrtomb( + char *s, + wchar_t wchar, + mbstate_t *ps + ) +{ + + /* s may be NULL */ + /* ps appears to be unused */ + + if (s == NULL) + return 0; + + *s = (char) wchar; + return 1; +} + +int +wctomb( + char *s, + wchar_t wchar + ) +{ + + /* s may be NULL */ + + return (int)wcrtomb(s, wchar, NULL); +} + +/*ARGSUSED*/ +size_t +mbsrtowcs( + wchar_t *pwcs, + const char **s, + size_t n, + mbstate_t *ps + ) +{ + int count = 0; + + /* pwcs may be NULL */ + /* s may be NULL */ + /* ps appears to be unused */ + + if (!s || !*s) + return 0; + + if (n != 0) { + if (pwcs != NULL) { + do { + if ((*pwcs++ = (wchar_t) *(*s)++) == 0) + break; + count++; + } while (--n != 0); + } else { + do { + if (((wchar_t)*(*s)++) == 0) + break; + count++; + } while (--n != 0); + } + } + + return count; +} + +size_t +mbstowcs( + wchar_t *pwcs, + const char *s, + size_t n + ) +{ + + /* pwcs may be NULL */ + /* s may be NULL */ + + return mbsrtowcs(pwcs, &s, n, NULL); +} + +/*ARGSUSED*/ +size_t +wcsrtombs( + char *s, + const wchar_t **pwcs, + size_t n, + mbstate_t *ps + ) +{ + int count = 0; + + /* s may be NULL */ + /* pwcs may be NULL */ + /* ps appears to be unused */ + + if (pwcs == NULL || *pwcs == NULL) + return (0); + + if (s == NULL) { + while (*(*pwcs)++ != 0) + count++; + return(count); + } + + if (n != 0) { + do { + if ((*s++ = (char) *(*pwcs)++) == 0) + break; + count++; + } while (--n != 0); + } + + return count; +} + +size_t +wcstombs( + char *s, + const wchar_t *pwcs, + size_t n + ) +{ + + /* s may be NULL */ + /* pwcs may be NULL */ + + return wcsrtombs(s, &pwcs, n, NULL); +} + +wint_t +btowc(int c) +{ + if (c == EOF || c & ~0xFF) + return WEOF; + return (wint_t)c; +} + +int +wctob(wint_t c) +{ + if (c == WEOF || c & ~0xFF) + return EOF; + return (int)c; +} diff --git a/StdLib/LibC/Locale/nl_langinfo.c b/StdLib/LibC/Locale/nl_langinfo.c new file mode 100644 index 0000000000..cd283df380 --- /dev/null +++ b/StdLib/LibC/Locale/nl_langinfo.c @@ -0,0 +1,125 @@ +/* $NetBSD: nl_langinfo.c,v 1.11 2005/11/29 03:11:59 christos Exp $ */ + +/* + * Written by J.T. Conklin . + * Public domain. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: nl_langinfo.c,v 1.11 2005/11/29 03:11:59 christos Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include "rune.h" +#include "runetype.h" + +char * +nl_langinfo(nl_item item) +{ + const char *s; + + switch (item) { + case D_T_FMT: + s = _CurrentTimeLocale->d_t_fmt; + break; + case D_FMT: + s = _CurrentTimeLocale->d_fmt; + break; + case T_FMT: + s = _CurrentTimeLocale->t_fmt; + break; + case T_FMT_AMPM: + s = _CurrentTimeLocale->t_fmt_ampm; + break; + case AM_STR: + case PM_STR: + s = _CurrentTimeLocale->am_pm[(size_t)(item - AM_STR)]; + break; + case DAY_1: + case DAY_2: + case DAY_3: + case DAY_4: + case DAY_5: + case DAY_6: + case DAY_7: + s = _CurrentTimeLocale->day[(size_t)(item - DAY_1)]; + break; + case ABDAY_1: + case ABDAY_2: + case ABDAY_3: + case ABDAY_4: + case ABDAY_5: + case ABDAY_6: + case ABDAY_7: + s = _CurrentTimeLocale->abday[(size_t)(item - ABDAY_1)]; + break; + case MON_1: + case MON_2: + case MON_3: + case MON_4: + case MON_5: + case MON_6: + case MON_7: + case MON_8: + case MON_9: + case MON_10: + case MON_11: + case MON_12: + s = _CurrentTimeLocale->mon[(size_t)(item - MON_1)]; + break; + case ABMON_1: + case ABMON_2: + case ABMON_3: + case ABMON_4: + case ABMON_5: + case ABMON_6: + case ABMON_7: + case ABMON_8: + case ABMON_9: + case ABMON_10: + case ABMON_11: + case ABMON_12: + s = _CurrentTimeLocale->abmon[(size_t)(item - ABMON_1)]; + break; + case RADIXCHAR: + s = _CurrentNumericLocale->decimal_point; + break; + case THOUSEP: + s = _CurrentNumericLocale->thousands_sep; + break; + case YESSTR: + s = _CurrentMessagesLocale->yesstr; + break; + case YESEXPR: + s = _CurrentMessagesLocale->yesexpr; + break; + case NOSTR: + s = _CurrentMessagesLocale->nostr; + break; + case NOEXPR: + s = _CurrentMessagesLocale->noexpr; + break; + case CRNCYSTR: /* XXX */ + s = ""; + break; + case CODESET: +#ifdef WITH_RUNE + s = _CurrentRuneLocale->rl_codeset; +#else + s = NULL; +#endif + if (!s) + s = ""; + break; + default: + s = ""; + break; + } + + /* The return value should be really const, but the interface says OW */ + return __UNCONST(s); +} diff --git a/StdLib/LibC/Locale/rune.h b/StdLib/LibC/Locale/rune.h new file mode 100644 index 0000000000..93829e56ea --- /dev/null +++ b/StdLib/LibC/Locale/rune.h @@ -0,0 +1,100 @@ +/* $NetBSD: rune.h,v 1.11 2006/02/16 19:19:49 tnozaki Exp $ */ + +/*- + * Copyright (c) 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Paul Borman at Krystal Technologies. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)rune.h 8.1 (Berkeley) 6/27/93 + */ +#ifndef _RUNE_H_ +#define _RUNE_H_ + +#include + +#include +#include +#include "runetype.h" + +/* + * map _RTYPE_x to _CTYPE_x + * + * XXX: these should be defined in ctype.h and used in isxxx macros. + * (note: current isxxx macros use "old" NetBSD masks and + * _CTYPE_x are not public.) + */ +#define _CTYPE_A _RUNETYPE_A +#define _CTYPE_C _RUNETYPE_C +#define _CTYPE_D _RUNETYPE_D +#define _CTYPE_G _RUNETYPE_G +#define _CTYPE_L _RUNETYPE_L +#define _CTYPE_P _RUNETYPE_P +#define _CTYPE_S _RUNETYPE_S +#define _CTYPE_U _RUNETYPE_U +#define _CTYPE_X _RUNETYPE_X +#define _CTYPE_B _RUNETYPE_B +#define _CTYPE_R _RUNETYPE_R +#define _CTYPE_I _RUNETYPE_I +#define _CTYPE_T _RUNETYPE_T +#define _CTYPE_Q _RUNETYPE_Q +#define _CTYPE_SWM _RUNETYPE_SWM +#define _CTYPE_SWS _RUNETYPE_SWS +#define _CTYPE_SW0 _RUNETYPE_SW0 +#define _CTYPE_SW1 _RUNETYPE_SW1 +#define _CTYPE_SW2 _RUNETYPE_SW2 +#define _CTYPE_SW3 _RUNETYPE_SW3 + +/* + * Other namespace conversion. + */ + +#define rune_t __nbrune_t +#define _RUNE_ISCACHED _NB_RUNE_ISCACHED +#define _CACHED_RUNES _NB_CACHED_RUNES +#define _DEFAULT_INVALID_RUNE _NB_DEFAULT_INVALID_RUNE +#define _RuneEntry _NBRuneEntry +#define _RuneRange _NBRuneRange +#define _RuneLocale _NBRuneLocale +#define _RUNE_MAGIC_1 _NB_RUNE_MAGIC_1 +#define _RUNE_MODULE_1 _NB_RUNE_MODULE_1 +#define _RUNE_CODESET _NB_RUNE_CODESET + +/* + * global variables + */ +extern size_t __mb_len_max_runtime; +#define __MB_LEN_MAX_RUNTIME __mb_len_max_runtime + +extern _RuneLocale _DefaultRuneLocale; +extern _RuneLocale *_CurrentRuneLocale; +extern const char *_PathLocale; + +#define _LOCALE_ALIAS_NAME "locale.alias" + +#endif /*! _RUNE_H_ */ diff --git a/StdLib/LibC/Locale/runetype.h b/StdLib/LibC/Locale/runetype.h new file mode 100644 index 0000000000..2cd563e103 --- /dev/null +++ b/StdLib/LibC/Locale/runetype.h @@ -0,0 +1,221 @@ +/* $NetBSD: runetype.h,v 1.19 2005/11/29 03:11:59 christos Exp $ */ + +/*- + * Copyright (c) 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Paul Borman at Krystal Technologies. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)runetype.h 8.1 (Berkeley) 6/2/93 + */ +#ifndef _NB_RUNETYPE_H_ +#define _NB_RUNETYPE_H_ + +#include +#include + +/* for cross host tools on older systems */ +#ifndef UINT32_C +/* assumes sizeof(unsigned int)>=4 */ +#define UINT32_C(c) ((uint32_t)(c##U)) +#endif + +typedef uint32_t __nbrune_t; +typedef uint64_t __runepad_t; + +#define _NB_CACHED_RUNES (1 << 8) /* Must be a power of 2 */ +#define _NB_RUNE_ISCACHED(c) ((c)>=0 && (c)<_CACHED_RUNES) + +#define _NB_DEFAULT_INVALID_RUNE ((__nbrune_t)-3) + +/* + * The lower 8 bits of runetype[] contain the digit value of the rune. + */ +typedef uint32_t _RuneType; +#define _RUNETYPE_A UINT32_C(0x00000100) /* Alpha */ +#define _RUNETYPE_C UINT32_C(0x00000200) /* Control */ +#define _RUNETYPE_D UINT32_C(0x00000400) /* Digit */ +#define _RUNETYPE_G UINT32_C(0x00000800) /* Graph */ +#define _RUNETYPE_L UINT32_C(0x00001000) /* Lower */ +#define _RUNETYPE_P UINT32_C(0x00002000) /* Punct */ +#define _RUNETYPE_S UINT32_C(0x00004000) /* Space */ +#define _RUNETYPE_U UINT32_C(0x00008000) /* Upper */ +#define _RUNETYPE_X UINT32_C(0x00010000) /* X digit */ +#define _RUNETYPE_B UINT32_C(0x00020000) /* Blank */ +#define _RUNETYPE_R UINT32_C(0x00040000) /* Print */ +#define _RUNETYPE_I UINT32_C(0x00080000) /* Ideogram */ +#define _RUNETYPE_T UINT32_C(0x00100000) /* Special */ +#define _RUNETYPE_Q UINT32_C(0x00200000) /* Phonogram */ +#define _RUNETYPE_SWM UINT32_C(0xc0000000)/* Mask to get screen width data */ +#define _RUNETYPE_SWS 30 /* Bits to shift to get width */ +#define _RUNETYPE_SW0 UINT32_C(0x00000000) /* 0 width character */ +#define _RUNETYPE_SW1 UINT32_C(0x40000000) /* 1 width character */ +#define _RUNETYPE_SW2 UINT32_C(0x80000000) /* 2 width character */ +#define _RUNETYPE_SW3 UINT32_C(0xc0000000) /* 3 width character */ + + +/* + * rune file format. network endian. + */ +typedef struct { + int32_t fre_min; /* First rune of the range */ + int32_t fre_max; /* Last rune (inclusive) of the range */ + int32_t fre_map; /* What first maps to in maps */ + uint32_t fre_pad1; /* backward compatibility */ + __runepad_t fre_pad2; /* backward compatibility */ +} __attribute__((__packed__)) _FileRuneEntry; + + +typedef struct { + uint32_t frr_nranges; /* Number of ranges stored */ + uint32_t frr_pad1; /* backward compatibility */ + __runepad_t frr_pad2; /* backward compatibility */ +} __attribute__((__packed__)) _FileRuneRange; + + +typedef struct { + char frl_magic[8]; /* Magic saying what version we are */ + char frl_encoding[32];/* ASCII name of this encoding */ + + __runepad_t frl_pad1; /* backward compatibility */ + __runepad_t frl_pad2; /* backward compatibility */ + int32_t frl_invalid_rune; + uint32_t frl_pad3; /* backward compatibility */ + + _RuneType frl_runetype[_NB_CACHED_RUNES]; + int32_t frl_maplower[_NB_CACHED_RUNES]; + int32_t frl_mapupper[_NB_CACHED_RUNES]; + + /* + * The following are to deal with Runes larger than _CACHED_RUNES - 1. + * Their data is actually contiguous with this structure so as to make + * it easier to read/write from/to disk. + */ + _FileRuneRange frl_runetype_ext; + _FileRuneRange frl_maplower_ext; + _FileRuneRange frl_mapupper_ext; + + __runepad_t frl_pad4; /* backward compatibility */ + int32_t frl_variable_len;/* how long that data is */ + uint32_t frl_pad5; /* backward compatibility */ + + /* variable size data follows */ +} __attribute__((__packed__)) _FileRuneLocale; + + +/* + * expanded rune locale declaration. local to the host. host endian. + */ +typedef struct { + __nbrune_t re_min; /* First rune of the range */ + __nbrune_t re_max; /* Last rune (inclusive) of the range */ + __nbrune_t re_map; /* What first maps to in maps */ + _RuneType *re_rune_types; /* Array of types in range */ +} _NBRuneEntry; + + +typedef struct { + uint32_t rr_nranges; /* Number of ranges stored */ + _NBRuneEntry *rr_rune_ranges; +} _NBRuneRange; + + +/* + * wctrans stuffs. + */ +typedef struct _WCTransEntry { + const char *te_name; + __nbrune_t *te_cached; + _NBRuneRange *te_extmap; +} _WCTransEntry; +#define _WCTRANS_INDEX_LOWER 0 +#define _WCTRANS_INDEX_UPPER 1 +#define _WCTRANS_NINDEXES 2 + +/* + * wctype stuffs. + */ +typedef struct _WCTypeEntry { + const char *te_name; + _RuneType te_mask; +} _WCTypeEntry; +#define _WCTYPE_INDEX_ALNUM 0 +#define _WCTYPE_INDEX_ALPHA 1 +#define _WCTYPE_INDEX_BLANK 2 +#define _WCTYPE_INDEX_CNTRL 3 +#define _WCTYPE_INDEX_DIGIT 4 +#define _WCTYPE_INDEX_GRAPH 5 +#define _WCTYPE_INDEX_LOWER 6 +#define _WCTYPE_INDEX_PRINT 7 +#define _WCTYPE_INDEX_PUNCT 8 +#define _WCTYPE_INDEX_SPACE 9 +#define _WCTYPE_INDEX_UPPER 10 +#define _WCTYPE_INDEX_XDIGIT 11 +#define _WCTYPE_NINDEXES 12 + +/* + * ctype stuffs + */ + +typedef struct _NBRuneLocale { + /* + * copied from _FileRuneLocale + */ + char rl_magic[8]; /* Magic saying what version we are */ + char rl_encoding[32];/* ASCII name of this encoding */ + __nbrune_t rl_invalid_rune; + _RuneType rl_runetype[_NB_CACHED_RUNES]; + __nbrune_t rl_maplower[_NB_CACHED_RUNES]; + __nbrune_t rl_mapupper[_NB_CACHED_RUNES]; + _NBRuneRange rl_runetype_ext; + _NBRuneRange rl_maplower_ext; + _NBRuneRange rl_mapupper_ext; + + void *rl_variable; + size_t rl_variable_len; + + /* + * the following portion is generated on the fly + */ + const char *rl_codeset; + struct _citrus_ctype_rec *rl_citrus_ctype; + _WCTransEntry rl_wctrans[_WCTRANS_NINDEXES]; + _WCTypeEntry rl_wctype[_WCTYPE_NINDEXES]; +} _NBRuneLocale; + + +/* magic number for LC_CTYPE (rune)locale declaration */ +#define _NB_RUNE_MAGIC_1 "RuneCT10" /* Indicates version 0 of RuneLocale */ + +/* magic string for dynamic link module - type should be like "LC_CTYPE" */ +#define _NB_RUNE_MODULE_1(type) "RuneModule10." type + +/* codeset tag */ +#define _NB_RUNE_CODESET "CODESET=" + +#endif /* !_NB_RUNETYPE_H_ */ diff --git a/StdLib/LibC/Locale/setlocale.c b/StdLib/LibC/Locale/setlocale.c new file mode 100644 index 0000000000..b6090d2ea0 --- /dev/null +++ b/StdLib/LibC/Locale/setlocale.c @@ -0,0 +1,423 @@ +/* $NetBSD: setlocale.c,v 1.50 2006/02/16 19:19:49 tnozaki Exp $ */ + +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Paul Borman at Krystal Technologies. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) + #if 0 + static char sccsid[] = "@(#)setlocale.c 8.1 (Berkeley) 7/4/93"; + #else + __RCSID("$NetBSD: setlocale.c,v 1.50 2006/02/16 19:19:49 tnozaki Exp $"); + #endif +#endif /* LIBC_SCCS and not lint */ + +#if defined(_MSC_VER) + // Disable warnings about assignment within conditional expressions. + #pragma warning ( disable : 4706 ) +#endif + +#define _CTYPE_PRIVATE + +#include "namespace.h" +#include +#include +#include +#include +#include +#include +#define __SETLOCALE_SOURCE__ +#include +#include +#include +#include +#include +#include +#include "rune.h" +#ifdef WITH_RUNE + #include "rune_local.h" +#else + #include "ctypeio.h" +#endif + +#ifdef CITRUS + #include + #include + #include + #include +#else + #include "aliasname_local.h" + #define _lookup_alias(p, a, b, s, c) __unaliasname((p), (a), (b), (s)) + #define _bcs_strcasecmp(a, b) strcasecmp((a), (b)) +#endif + +#define _LOCALE_SYM_FORCE "/force" + +#ifndef WITH_RUNE + const char *_PathLocale = NULL; +#endif + +/* + * Category names for getenv() + */ +static const char *const categories[_LC_LAST] = { + "LC_ALL", + "LC_COLLATE", + "LC_CTYPE", + "LC_MONETARY", + "LC_NUMERIC", + "LC_TIME", + "LC_MESSAGES" +}; + +/* + * Current locales for each category + */ +static char current_categories[_LC_LAST][32] = { + "C", + "C", + "C", + "C", + "C", + "C", + "C" +}; + +/* + * The locales we are going to try and load + */ +static char new_categories[_LC_LAST][32]; + +static char current_locale_string[_LC_LAST * 33]; + +static char *currentlocale(void); +static void revert_to_default(int); +static int force_locale_enable(int); +static int load_locale_sub(int, const char *, int); +static char *loadlocale(int); +static const char *__get_locale_env(int); + +char * +__setlocale(int category, const char *locale) +{ + int i, loadlocale_success; + size_t len; + const char *env, *r; + + //if (issetugid() || + // (!_PathLocale && !(_PathLocale = getenv("PATH_LOCALE")))) + // _PathLocale = _PATH_LOCALE; + + if (category < 0 || category >= _LC_LAST) + return (NULL); + + if (!locale) + return (category ? + current_categories[category] : currentlocale()); + + /* + * Default to the current locale for everything. + */ + for (i = 1; i < _LC_LAST; ++i) + (void)strncpyX(new_categories[i], current_categories[i], + sizeof(new_categories[i])); + + /* + * Now go fill up new_categories from the locale argument + */ + if (!*locale) { + if (category == LC_ALL) { + for (i = 1; i < _LC_LAST; ++i) { + env = __get_locale_env(i); + (void)strncpyX(new_categories[i], env, + sizeof(new_categories[i])); + } + } + else { + env = __get_locale_env(category); + (void)strncpyX(new_categories[category], env, + sizeof(new_categories[category])); + } + } else if (category) { + (void)strncpyX(new_categories[category], locale, + sizeof(new_categories[category])); + } else { + if ((r = strchr(locale, '/')) == 0) { + for (i = 1; i < _LC_LAST; ++i) { + (void)strncpyX(new_categories[i], locale, + sizeof(new_categories[i])); + } + } else { + for (i = 1;;) { + _DIAGASSERT(*r == '/' || *r == 0); + _DIAGASSERT(*locale != 0); + if (*locale == '/') + return (NULL); /* invalid format. */ + len = r - locale; + if (len + 1 > sizeof(new_categories[i])) + return (NULL); /* too long */ + (void)memcpy(new_categories[i], locale, len); + new_categories[i][len] = '\0'; + if (*r == 0) + break; + _DIAGASSERT(*r == '/'); + if (*(locale = ++r) == 0) + /* slash followed by NUL */ + return (NULL); + /* skip until NUL or '/' */ + while (*r && *r != '/') + r++; + if (++i == _LC_LAST) + return (NULL); /* too many slashes. */ + } + if (i + 1 != _LC_LAST) + return (NULL); /* too few slashes. */ + } + } + + if (category) + return (loadlocale(category)); + + loadlocale_success = 0; + for (i = 1; i < _LC_LAST; ++i) { + if (loadlocale(i) != NULL) + loadlocale_success = 1; + } + + /* + * If all categories failed, return NULL; we don't need to back + * changes off, since none happened. + */ + if (!loadlocale_success) + return NULL; + + return (currentlocale()); +} + +static char * +currentlocale() +{ + int i; + + (void)strncpyX(current_locale_string, current_categories[1], + sizeof(current_locale_string)); + + for (i = 2; i < _LC_LAST; ++i) + if (strcmp(current_categories[1], current_categories[i])) { + (void)snprintf(current_locale_string, + sizeof(current_locale_string), "%s/%s/%s/%s/%s/%s", + current_categories[1], current_categories[2], + current_categories[3], current_categories[4], + current_categories[5], current_categories[6]); + break; + } + return (current_locale_string); +} + +static void +revert_to_default(int category) +{ + switch (category) { + case LC_CTYPE: +#ifdef WITH_RUNE + (void)_xpg4_setrunelocale("C"); + (void)__runetable_to_netbsd_ctype("C"); +#else + if (_cClass != _C_CharClassTable) { + /* LINTED const castaway */ + free((void *)_cClass); + _cClass = _C_CharClassTable; + } + if (_uConvT != _C_ToUpperTable) { + /* LINTED const castaway */ + free((void *)_uConvT); + _uConvT = _C_ToUpperTable; + } + if (_lConvT != _C_ToLowerTable) { + /* LINTED const castaway */ + free((void *)_lConvT); + _lConvT = _C_ToLowerTable; + } +#endif + break; + case LC_MESSAGES: + case LC_COLLATE: + case LC_MONETARY: + case LC_NUMERIC: + case LC_TIME: + break; + } +} + +static int +force_locale_enable(int category) +{ + revert_to_default(category); + + return 0; +} + +static int +load_locale_sub( + int category, + const char *locname, + int isspecial + ) +{ + char name[PATH_MAX]; + + /* check for the default locales */ + if (!strcmp(new_categories[category], "C") || + !strcmp(new_categories[category], "POSIX")) { + revert_to_default(category); + return 0; + } + + /* check whether special symbol */ + if (isspecial && _bcs_strcasecmp(locname, _LOCALE_SYM_FORCE) == 0) + return force_locale_enable(category); + + /* sanity check */ + if (strchr(locname, '/') != NULL) + return -1; + + (void)snprintf(name, sizeof(name), "%s/%s/%s", + _PathLocale, locname, categories[category]); + + switch (category) { + case LC_CTYPE: +#ifdef WITH_RUNE + if (_xpg4_setrunelocale(__UNCONST(locname))) + return -1; + if (__runetable_to_netbsd_ctype(locname)) { + /* very unfortunate, but need to go to "C" locale */ + revert_to_default(category); + return -1; + } +#else + if (!__loadctype(name)) + return -1; +#endif + break; + + case LC_MESSAGES: + /* + * XXX we don't have LC_MESSAGES support yet, + * but catopen may use the value of LC_MESSAGES category. + * so return successfully if locale directory is present. + */ + (void)snprintf(name, sizeof(name), "%s/%s", + _PathLocale, locname); + /* local */ + { + struct stat st; + if (stat(name, &st) < 0) + return -1; + if (!S_ISDIR(st.st_mode)) + return -1; + } + break; + + case LC_COLLATE: + case LC_MONETARY: + case LC_NUMERIC: + case LC_TIME: + return -1; + } + + return 0; +} + +static char * +loadlocale(int category) +{ + //char aliaspath[PATH_MAX], loccat[PATH_MAX], buf[PATH_MAX]; + //const char *alias; + + _DIAGASSERT(0 < category && category < _LC_LAST); + + if (strcmp(new_categories[category], current_categories[category]) == 0) + return (current_categories[category]); + + /* (1) non-aliased file */ + if (!load_locale_sub(category, new_categories[category], 0)) + goto success; + + ///* (2) lookup locname/catname type alias */ + //(void)snprintf(aliaspath, sizeof(aliaspath), + // "%s/" _LOCALE_ALIAS_NAME, _PathLocale); + //(void)snprintf(loccat, sizeof(loccat), "%s/%s", + // new_categories[category], categories[category]); + //alias = _lookup_alias(aliaspath, loccat, buf, sizeof(buf), + // _LOOKUP_CASE_SENSITIVE); + //if (!load_locale_sub(category, alias, 1)) + // goto success; + + ///* (3) lookup locname type alias */ + //alias = _lookup_alias(aliaspath, new_categories[category], + // buf, sizeof(buf), _LOOKUP_CASE_SENSITIVE); + //if (!load_locale_sub(category, alias, 1)) + // goto success; + + return NULL; + +success: + (void)strncpyX(current_categories[category], + new_categories[category], + sizeof(current_categories[category])); + return current_categories[category]; +} + +static const char * +__get_locale_env(int category) +{ + const char *env; + + //_DIAGASSERT(category != LC_ALL); + + ///* 1. check LC_ALL. */ + //env = getenv(categories[0]); + + ///* 2. check LC_* */ + //if (!env || !*env) + // env = getenv(categories[category]); + + ///* 3. check LANG */ + //if (!env || !*env) + // env = getenv("LANG"); + + ///* 4. if none is set, fall to "C" */ + //if (!env || !*env || strchr(env, '/')) + env = "C"; + + return env; +} diff --git a/StdLib/LibC/Locale/setlocale1.c b/StdLib/LibC/Locale/setlocale1.c new file mode 100644 index 0000000000..b9c30bb40d --- /dev/null +++ b/StdLib/LibC/Locale/setlocale1.c @@ -0,0 +1,53 @@ +/* $NetBSD: setlocale1.c,v 1.2 2003/03/11 17:23:07 tshiozak Exp $ */ + +/*- + * Copyright (c)1999 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: setlocale1.c,v 1.2 2003/03/11 17:23:07 tshiozak Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" +#define __SETLOCALE_SOURCE__ +#include +#include "rune.h" + +__warn_references(setlocale, + "warning: reference to compatibility setlocale(); include for correct reference") + +/* + * Preparation for the future import of multibyte locale. + * This function will ensure binary compatibility for old executables. + */ +char * +setlocale(int category, const char *locale) +{ + /* locale may be NULL */ + + __mb_len_max_runtime = 1; + return __setlocale(category, locale); +} diff --git a/StdLib/LibC/Locale/setlocale32.c b/StdLib/LibC/Locale/setlocale32.c new file mode 100644 index 0000000000..68c43bba0d --- /dev/null +++ b/StdLib/LibC/Locale/setlocale32.c @@ -0,0 +1,46 @@ +/* $NetBSD: setlocale32.c,v 1.2 2003/03/11 17:23:07 tshiozak Exp $ */ + +/*- + * Copyright (c)1999 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: setlocale32.c,v 1.2 2003/03/11 17:23:07 tshiozak Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" +#define __SETLOCALE_SOURCE__ +#include +#include "rune.h" + +char * +__setlocale_mb_len_max_32(int category, const char *locale) +{ + /* locale may be NULL */ + + __mb_len_max_runtime = 32; + return __setlocale(category, locale); +} diff --git a/StdLib/LibC/Locale/wcscoll.c b/StdLib/LibC/Locale/wcscoll.c new file mode 100644 index 0000000000..5bc72fae1d --- /dev/null +++ b/StdLib/LibC/Locale/wcscoll.c @@ -0,0 +1,47 @@ +/* $NetBSD: wcscoll.c,v 1.1 2003/03/02 22:18:16 tshiozak Exp $ */ + +/*- + * Copyright (c)2003 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: wcscoll.c,v 1.1 2003/03/02 22:18:16 tshiozak Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" + +#include +#include + +/* + * Compare strings with using collating information. + */ +int +wcscoll(const wchar_t *s1, const wchar_t *s2) +{ + /* XXX: LC_COLLATE should be implemented. */ + return (wcscmp(s1, s2)); +} diff --git a/StdLib/LibC/Locale/wcsftime.c b/StdLib/LibC/Locale/wcsftime.c new file mode 100644 index 0000000000..2eb19ca5ad --- /dev/null +++ b/StdLib/LibC/Locale/wcsftime.c @@ -0,0 +1,109 @@ +/* $NetBSD: wcsftime.c,v 1.2 2006/10/04 14:19:16 tnozaki Exp $ */ +/*- + * Copyright (c) 2002 Tim J. Robbins + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +__FBSDID("$FreeBSD: src/lib/libc/locale/wcsftime.c,v 1.4 2004/04/07 09:47:56 tjr Exp $"); +#else +__RCSID("$NetBSD: wcsftime.c,v 1.2 2006/10/04 14:19:16 tnozaki Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include +#include + +/* + * Convert date and time to a wide-character string. + * + * This is the wide-character counterpart of strftime(). So that we do not + * have to duplicate the code of strftime(), we convert the format string to + * multibyte, call strftime(), then convert the result back into wide + * characters. + * + * This technique loses in the presence of stateful multibyte encoding if any + * of the conversions in the format string change conversion state. When + * stateful encoding is implemented, we will need to reset the state between + * format specifications in the format string. + */ +size_t +wcsftime(wchar_t *wcs, size_t maxsize, + const wchar_t *format, const struct tm *timeptr) +{ + char *dst, *dstp, *sformat; + size_t n, sflen; + int sverrno; + + sformat = dst = NULL; + + /* + * Convert the supplied format string to a multibyte representation + * for strftime(), which only handles single-byte characters. + */ + sflen = wcstombs(NULL, format, 0); + if (sflen == (size_t)-1) + goto error; + if ((sformat = malloc(sflen + 1)) == NULL) + goto error; + wcstombs(sformat, format, sflen + 1); + + /* + * Allocate memory for longest multibyte sequence that will fit + * into the caller's buffer and call strftime() to fill it. + * Then, copy and convert the result back into wide characters in + * the caller's buffer. + */ + if (SIZE_T_MAX / MB_CUR_MAX <= maxsize) { + /* maxsize is preposturously large - avoid int. overflow. */ + errno = EINVAL; + goto error; + } + dst = malloc(maxsize * MB_CUR_MAX); + if (dst == NULL) + goto error; + if (strftime(dst, maxsize, sformat, timeptr) == 0) + goto error; + dstp = dst; + n = mbstowcs(wcs, dstp, maxsize); + if (n == (size_t)-2 || n == (size_t)-1) + goto error; + + free(sformat); + free(dst); + return n; + +error: + sverrno = errno; + free(sformat); + free(dst); + errno = sverrno; + return 0; +} diff --git a/StdLib/LibC/Locale/wcstod.c b/StdLib/LibC/Locale/wcstod.c new file mode 100644 index 0000000000..0ee06bd86f --- /dev/null +++ b/StdLib/LibC/Locale/wcstod.c @@ -0,0 +1,51 @@ +/* $NetBSD: wcstod.c,v 1.12 2006/04/16 17:03:32 christos Exp $ */ + +/*- + * Copyright (c)2006 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: wcstod.c,v 1.12 2006/04/16 17:03:32 christos Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include +#include +#include + +//#ifdef __weak_alias +//__strong_alias(_wcstod,wcstod) +//__weak_alias(wcstod,_wcstod) +//#endif + +#define _FUNCNAME wcstod +#define _RETURN_TYPE double +#define _STRTOD_FUNC strtod + +#include "_wcstod.h" diff --git a/StdLib/LibC/Locale/wcstof.c b/StdLib/LibC/Locale/wcstof.c new file mode 100644 index 0000000000..36b06a566d --- /dev/null +++ b/StdLib/LibC/Locale/wcstof.c @@ -0,0 +1,53 @@ +/* $NetBSD: wcstof.c,v 1.2 2006/04/16 17:03:32 christos Exp $ */ + +/*- + * Copyright (c)2006 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: wcstof.c,v 1.2 2006/04/16 17:03:32 christos Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" + +#include +#include +#include +#include +#include +#include +#include + +#ifdef __weak_alias +__strong_alias(_wcstof,wcstof) +__weak_alias(wcstof,_wcstof) +#endif + +#define _FUNCNAME wcstof +#define _RETURN_TYPE float +#define _STRTOD_FUNC strtof + +#include "_wcstod.h" diff --git a/StdLib/LibC/Locale/wcstoimax.c b/StdLib/LibC/Locale/wcstoimax.c new file mode 100644 index 0000000000..078b10b764 --- /dev/null +++ b/StdLib/LibC/Locale/wcstoimax.c @@ -0,0 +1,59 @@ +/** @file + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c)2003 Citrus Project, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + NetBSD: wcstoimax.c,v 1.2 2004/06/21 21:20:43 itojun Exp +**/ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: wcstoimax.c,v 1.2 2004/06/21 21:20:43 itojun Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "__wctoint.h" + +#define _FUNCNAME wcstoimax +#define __wINT intmax_t +#define __wINT_MIN INTMAX_MIN +#define __wINT_MAX INTMAX_MAX + +#include "_wcstol.h" diff --git a/StdLib/LibC/Locale/wcstol.c b/StdLib/LibC/Locale/wcstol.c new file mode 100644 index 0000000000..f7d92ae077 --- /dev/null +++ b/StdLib/LibC/Locale/wcstol.c @@ -0,0 +1,58 @@ +/** @file + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c)2003 Citrus Project, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + NetBSD: wcstol.c,v 1.3 2004/06/21 21:20:43 itojun Exp + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: wcstol.c,v 1.3 2004/06/21 21:20:43 itojun Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include +#include +#include + +#include "__wctoint.h" + +#define _FUNCNAME wcstol +#define __wINT long int +#define __wINT_MIN LONG_MIN +#define __wINT_MAX LONG_MAX + +#include "_wcstol.h" diff --git a/StdLib/LibC/Locale/wcstold.c b/StdLib/LibC/Locale/wcstold.c new file mode 100644 index 0000000000..4e557be13f --- /dev/null +++ b/StdLib/LibC/Locale/wcstold.c @@ -0,0 +1,53 @@ +/* $NetBSD: wcstold.c,v 1.2 2006/04/16 17:03:32 christos Exp $ */ + +/*- + * Copyright (c)2006 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: wcstold.c,v 1.2 2006/04/16 17:03:32 christos Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" + +#include +#include +#include +#include +#include +#include +#include + +#ifdef __weak_alias +__strong_alias(_wcstold,wcstold) +__weak_alias(wcstold,_wcstold) +#endif + +#define _FUNCNAME wcstold +#define _RETURN_TYPE long double +#define _STRTOD_FUNC strtold + +#include "_wcstod.h" diff --git a/StdLib/LibC/Locale/wcstoll.c b/StdLib/LibC/Locale/wcstoll.c new file mode 100644 index 0000000000..ea0e646c19 --- /dev/null +++ b/StdLib/LibC/Locale/wcstoll.c @@ -0,0 +1,58 @@ +/** @file + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c)2003 Citrus Project, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + NetBSD: wcstoll.c,v 1.2 2004/06/21 21:20:43 itojun Exp + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: wcstoll.c,v 1.2 2004/06/21 21:20:43 itojun Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include +#include +#include + +#include "__wctoint.h" + +#define _FUNCNAME wcstoll +#define __wINT /* LONGLONG */ long long int +#define __wINT_MIN LLONG_MIN +#define __wINT_MAX LLONG_MAX + +#include "_wcstol.h" diff --git a/StdLib/LibC/Locale/wcstoul.c b/StdLib/LibC/Locale/wcstoul.c new file mode 100644 index 0000000000..fd7059fdb5 --- /dev/null +++ b/StdLib/LibC/Locale/wcstoul.c @@ -0,0 +1,58 @@ +/** @file + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c)2003 Citrus Project, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + NetBSD: wcstoul.c,v 1.3 2004/06/21 21:20:43 itojun Exp + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: wcstoul.c,v 1.3 2004/06/21 21:20:43 itojun Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include +#include +#include + +#include "__wctoint.h" + +#define _FUNCNAME wcstoul +#define __wINT long int +#define __wUINT unsigned long int +#define __wUINT_MAX ULONG_MAX + +#include "_wcstoul.h" diff --git a/StdLib/LibC/Locale/wcstoull.c b/StdLib/LibC/Locale/wcstoull.c new file mode 100644 index 0000000000..f257104b2c --- /dev/null +++ b/StdLib/LibC/Locale/wcstoull.c @@ -0,0 +1,58 @@ +/** @file + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c)2003 Citrus Project, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + NetBSD: wcstoull.c,v 1.2 2004/06/21 21:20:43 itojun Exp + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: wcstoull.c,v 1.2 2004/06/21 21:20:43 itojun Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include +#include +#include + +#include "__wctoint.h" + +#define _FUNCNAME wcstoull +#define __wINT long long int +#define __wUINT /* LONGLONG */ unsigned long long int +#define __wUINT_MAX ULLONG_MAX + +#include "_wcstoul.h" diff --git a/StdLib/LibC/Locale/wcstoumax.c b/StdLib/LibC/Locale/wcstoumax.c new file mode 100644 index 0000000000..53a0de0f9e --- /dev/null +++ b/StdLib/LibC/Locale/wcstoumax.c @@ -0,0 +1,59 @@ +/** @file + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c)2003 Citrus Project, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + NetBSD: wcstoumax.c,v 1.2 2004/06/21 21:20:43 itojun Exp + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: wcstoumax.c,v 1.2 2004/06/21 21:20:43 itojun Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "__wctoint.h" + +#define _FUNCNAME wcstoumax +#define __wINT intmax_t +#define __wUINT uintmax_t +#define __wUINT_MAX UINTMAX_MAX + +#include "_wcstoul.h" diff --git a/StdLib/LibC/Locale/wcsxfrm.c b/StdLib/LibC/Locale/wcsxfrm.c new file mode 100644 index 0000000000..288a5f9a46 --- /dev/null +++ b/StdLib/LibC/Locale/wcsxfrm.c @@ -0,0 +1,66 @@ +/* $NetBSD: wcsxfrm.c,v 1.2 2006/10/15 16:14:08 christos Exp $ */ + +/*- + * Copyright (c)2003 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: wcsxfrm.c,v 1.2 2006/10/15 16:14:08 christos Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" + +#include +#include + +/* + * Compare strings with using collating information. + */ +size_t +wcsxfrm( + wchar_t *s1, + const wchar_t *s2, + size_t n + ) +{ + size_t len; + + /* XXX: LC_COLLATE should be implemented. */ + + len = wcslen(s2); + if (len +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: flt_rounds.c,v 1.3 2006/02/25 00:58:35 wiz Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +static const int map[] = { + 1, /* round to nearest */ + 2, /* round to positive infinity */ + 3, /* round to negative infinity */ + 0 /* round to zero */ +}; + +/* + * Return the current FP rounding mode + * + * Returns: + * 0 - round to zero + * 1 - round to nearest + * 2 - round to postive infinity + * 3 - round to negative infinity + * + * ok all we need to do is get the current FP rounding mode + * index our map table and return the appropriate value. + * + * HOWEVER: + * The ARM FPA codes the rounding mode into the actual FP instructions + * so there is no such thing as a global rounding mode. + * The default is round to nearest if rounding is not explicitly specified. + * FP instructions generated by GCC will not explicitly specify a rounding + * mode. + * + * So the best we can do it to return the rounding mode FP instructions + * use if rounding is not specified which is round to nearest. + * + * This could change in the future with new floating point emulators or + * soft float FP libraries. + */ + +int __flt_rounds(void); + +int +__flt_rounds() +{ + return(map[fpgetround()]); +} diff --git a/StdLib/LibC/Main/ByteSwap.c b/StdLib/LibC/Main/ByteSwap.c new file mode 100644 index 0000000000..f405bd9385 --- /dev/null +++ b/StdLib/LibC/Main/ByteSwap.c @@ -0,0 +1,72 @@ +/** @file + Byte Swap routines for endian-nes conversions. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include +#include + +#include + +// Undefine macro versions of the functions to be defined below. +#undef bswap16 +#undef bswap32 +#undef bswap64 + +/** +Switches the endianness of a 16-bit integer. + +This function swaps the bytes in a 16-bit unsigned value to switch the value +from little endian to big endian or vice versa. The byte swapped value is +returned. + +@param Value A 16-bit unsigned value. + +@return The byte swapped Value. + +**/ +uint16_t bswap16(uint16_t Value) +{ + return SwapBytes16(Value); +} + +/** +Switches the endianness of a 32-bit integer. + +This function swaps the bytes in a 32-bit unsigned value to switch the value +from little endian to big endian or vice versa. The byte swapped value is +returned. + +@param Value A 32-bit unsigned value. + +@return The byte swapped Value. + +**/ +uint32_t bswap32(uint32_t Value) +{ + return SwapBytes32(Value); +} + +/** +Switches the endianness of a 64-bit integer. + +This function swaps the bytes in a 64-bit unsigned value to switch the value +from little endian to big endian or vice versa. The byte swapped value is +returned. + +@param Value A 64-bit unsigned value. + +@return The byte swapped Value. + +**/ +uint64_t bswap64(uint64_t Value) +{ + return SwapBytes64(Value); +} diff --git a/StdLib/LibC/Main/HtoNtoH.c b/StdLib/LibC/Main/HtoNtoH.c new file mode 100644 index 0000000000..c501874b84 --- /dev/null +++ b/StdLib/LibC/Main/HtoNtoH.c @@ -0,0 +1,90 @@ +/** @File + Routines for translating between host and network byte-order. + + Copyright (c) 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#include +#include +#include + +// Undefine macro versions of the functions to be defined below. +#undef htonl +#undef htons +#undef ntohl +#undef ntohs + +/** 32-bit Host to Network byte order conversion. + + @param[in] Datum The 32-bit value to be converted. + @return Datum, converted to network byte order. +**/ +uint32_t +htonl( + IN uint32_t Datum + ) +{ +#if BYTE_ORDER == LITTLE_ENDIAN + return SwapBytes32(Datum); +#else + return Datum; +#endif +} + +/** 16-bit Host to Network byte order conversion. + + @param[in] Datum The 16-bit value to be converted. + @return Datum, converted to network byte order. +**/ +uint16_t +htons( + IN uint16_t Datum + ) +{ +#if BYTE_ORDER == LITTLE_ENDIAN + return SwapBytes16(Datum); +#else + return Datum; +#endif +} + +/** 32-bit Network to Host byte order conversion. + + @param[in] Datum The 16-bit value to be converted. + @return Datum, converted to host byte order. +**/ +uint32_t +ntohl( + IN uint32_t Datum + ) +{ +#if BYTE_ORDER == LITTLE_ENDIAN + return SwapBytes32(Datum); +#else + return Datum; +#endif +} + +/** 16-bit Network to Host byte order conversion. + + @param[in] Datum The 16-bit value to be converted. + @return Datum, converted to host byte order. +**/ +uint16_t +ntohs( + IN uint16_t Datum + ) +{ +#if BYTE_ORDER == LITTLE_ENDIAN + return SwapBytes16(Datum); +#else + return Datum; +#endif +} diff --git a/StdLib/LibC/Main/Ia32/fpu_rmode.S b/StdLib/LibC/Main/Ia32/fpu_rmode.S new file mode 100644 index 0000000000..3d012872fc --- /dev/null +++ b/StdLib/LibC/Main/Ia32/fpu_rmode.S @@ -0,0 +1,22 @@ +#------------------------------------------------------------------------------ +# +# Copyright (c) 2010, Intel Corporation. All rights reserved.
+# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php. +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +#------------------------------------------------------------------------------ + +ASM_GLOBAL ASM_PFX(internal_FPU_rmode) +ASM_PFX(internal_FPU_rmode): + subl $4,%esp + fnstcw (%esp) + movl (%esp),%eax + shrl $10,%eax + andl $3,%eax + addl $4,%esp + ret diff --git a/StdLib/LibC/Main/Ia32/fpu_rmode.asm b/StdLib/LibC/Main/Ia32/fpu_rmode.asm new file mode 100644 index 0000000000..11d78230c2 --- /dev/null +++ b/StdLib/LibC/Main/Ia32/fpu_rmode.asm @@ -0,0 +1,46 @@ +;------------------------------------------------------------------------------ +; Return the current FPU rounding mode. +; +; MASM implementation of the flt_rounds function by: +; J.T. Conklin, Apr 4, 1995 +; Public domain. +; +; Copyright (c) 2010, Intel Corporation. All rights reserved.
+; This program and the accompanying materials +; are licensed and made available under the terms and conditions of the BSD License +; which accompanies this distribution. The full text of the license may be found at +; http://opensource.org/licenses/bsd-license.php. +; +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +; +; NetBSD: flt_rounds.S,v 1.6 1999/08/23 08:45:09 kleink Exp +;------------------------------------------------------------------------------ + + .686 + .model flat,C + .code + +;_map BYTE 1 ; round to nearest +; BYTE 3 ; round to negative infinity +; BYTE 2 ; round to positive infinity +; BYTE 0 ; round to zero + +;------------------------------------------------------------------------------ +; int +; EFIAPI +; fpu_rmode( void ); +; +;------------------------------------------------------------------------------ + +internal_FPU_rmode PROC + sub esp, 4 ; Create a local variable for fnstcw + fnstcw [esp] + mov eax, [esp] + shr eax, 10 + and eax, 3 + add esp, 4 ; Delete the local variable + ret +internal_FPU_rmode ENDP + + END diff --git a/StdLib/LibC/Main/Ia32/ftol2.obj b/StdLib/LibC/Main/Ia32/ftol2.obj new file mode 100644 index 0000000000..b96f830bc0 Binary files /dev/null and b/StdLib/LibC/Main/Ia32/ftol2.obj differ diff --git a/StdLib/LibC/Main/Ia32/isinfl.c b/StdLib/LibC/Main/Ia32/isinfl.c new file mode 100644 index 0000000000..773758b14f --- /dev/null +++ b/StdLib/LibC/Main/Ia32/isinfl.c @@ -0,0 +1,68 @@ +/* $NetBSD: isinfl.c,v 1.5.16.1 2007/05/07 19:49:07 pavel Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: Header: isinf.c,v 1.1 91/07/08 19:03:34 torek Exp + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)isinf.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: isinfl.c,v 1.5.16.1 2007/05/07 19:49:07 pavel Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ + // C4700: uninitialized local variable used + #pragma warning ( disable : 4700 ) +#endif + +/* + * 7.12.3.3 isinf - test for infinity + * IEEE 754 compatible 80-bit extended-precision Intel 386 version + */ +int +__isinfl(long double x) +{ + union ieee_ext_u u; + + u.extu_ld = x; + + return (u.extu_ext.ext_exp == EXT_EXP_INFNAN && + u.extu_ext.ext_frach == 0x80000000 && u.extu_ext.ext_fracl == 0); +} diff --git a/StdLib/LibC/Main/Ia32/isnanl.c b/StdLib/LibC/Main/Ia32/isnanl.c new file mode 100644 index 0000000000..b80dc4fee2 --- /dev/null +++ b/StdLib/LibC/Main/Ia32/isnanl.c @@ -0,0 +1,69 @@ +/* $NetBSD: isnanl.c,v 1.5.16.1 2007/05/07 19:49:07 pavel Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: Header: isinf.c,v 1.1 91/07/08 19:03:34 torek Exp + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)isinf.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: isnanl.c,v 1.5.16.1 2007/05/07 19:49:07 pavel Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ + // C4700: uninitialized local variable used + #pragma warning ( disable : 4700 ) +#endif + +/* + * 7.12.3.4 isnan - test for a NaN + * IEEE 754 compatible 80-bit extended-precision Intel 386 version + */ +int +__isnanl(long double x) +{ + union ieee_ext_u u; + + u.extu_ld = x; + + return (u.extu_ext.ext_exp == EXT_EXP_INFNAN && + (u.extu_ext.ext_frach & 0x80000000) != 0 && + (u.extu_ext.ext_frach != 0x80000000 || u.extu_ext.ext_fracl != 0)); +} diff --git a/StdLib/LibC/Main/Ipf/FpuRmode.s b/StdLib/LibC/Main/Ipf/FpuRmode.s new file mode 100644 index 0000000000..caf4fba207 --- /dev/null +++ b/StdLib/LibC/Main/Ipf/FpuRmode.s @@ -0,0 +1,12 @@ + .globl internal_FPU_rmode + .proc internal_FPU_rmode +internal_FPU_rmode:: + // get the floating point rounding control bits + // bits 10 and 11 are the rc bits from main status field fpsr.sf0 + mov r8= ar.fpsr;; + shr r8 = r8, 10 + mov r9 = 3;; + and r8 = r8, r9;; + br.sptk.few b0 + + .endp internal_FPU_rmode diff --git a/StdLib/LibC/Main/Ipf/flt_rounds.c b/StdLib/LibC/Main/Ipf/flt_rounds.c new file mode 100644 index 0000000000..0a18bb7390 --- /dev/null +++ b/StdLib/LibC/Main/Ipf/flt_rounds.c @@ -0,0 +1,25 @@ +/* + * Written by J.T. Conklin, Apr 10, 1995 + * Public domain. + */ + +#include +/* __FBSDID("$FreeBSD: src/lib/libc/ia64/gen/flt_rounds.c,v 1.1 2004/07/19 08:17:24 das Exp $"); */ + +#include + +static const int map[] = { + 1, /* round to nearest */ + 3, /* round to zero */ + 2, /* round to negative infinity */ + 0 /* round to positive infinity */ +}; + +int +__flt_rounds(void) +{ + int x; + + __asm("mov %0=ar.fpsr" : "=r" (x)); + return (map[(x >> 10) & 0x03]); +} diff --git a/StdLib/LibC/Main/Main.c b/StdLib/LibC/Main/Main.c new file mode 100644 index 0000000000..0336d8b36a --- /dev/null +++ b/StdLib/LibC/Main/Main.c @@ -0,0 +1,102 @@ +/** @file + Establish the program environment and the "main" entry point. + + All of the global data in the gMD structure is initialized to 0, NULL, or + SIG_DFL; as appropriate. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include + +extern int main( int, wchar_t**); +extern int __sse2_available; + +struct __MainData *gMD; + +/* Worker function to keep GCC happy. */ +void __main() +{ + ; +} + +INTN +EFIAPI +ShellAppMain ( + IN UINTN Argc, + IN CHAR16 **Argv + ) +{ + INTN ExitVal; + INTN i; + struct __filedes *mfd; + FILE *fp; + + ExitVal = (INTN)RETURN_SUCCESS; + gMD = AllocateZeroPool(sizeof(struct __MainData)); + if( gMD == NULL ) { + ExitVal = (INTN)RETURN_OUT_OF_RESOURCES; + } + else { + /* Initialize data */ + __sse2_available = 0; + _fltused = 1; + errno = 0; + EFIerrno = 0; + +#ifdef NT32dvm + gMD->ClocksPerSecond = 0; // For NT32 only + gMD->AppStartTime = 0; // For NT32 only +#else + gMD->ClocksPerSecond = (clock_t)GetPerformanceCounterProperties( NULL, NULL); + gMD->AppStartTime = (clock_t)GetPerformanceCounter(); +#endif /* NT32 dvm */ + + // Initialize file descriptors + mfd = gMD->fdarray; + for(i = 0; i < (FOPEN_MAX); ++i) { + mfd[i].MyFD = (UINT16)i; + } + + // Open stdin, stdout, stderr + fp = freopen("stdin:", "r", stdin); + if(fp != NULL) { + fp = freopen("stdout:", "w", stdout); + if(fp != NULL) { + fp = freopen("stderr:", "w", stderr); + } + } + if(fp == NULL) { + Print(L"ERROR Initializing Standard IO: %a.\n %r\n", + strerror(errno), EFIerrno); + } + + ExitVal = (INTN)main( (int)Argc, (wchar_t **)Argv); + + if (gMD->cleanup != NULL) { + gMD->cleanup(); + } + } + if(gMD != NULL) { + FreePool( gMD ); + } + return ExitVal; +} diff --git a/StdLib/LibC/Main/X64/fpu_rmode.S b/StdLib/LibC/Main/X64/fpu_rmode.S new file mode 100644 index 0000000000..4999102582 --- /dev/null +++ b/StdLib/LibC/Main/X64/fpu_rmode.S @@ -0,0 +1,20 @@ +#------------------------------------------------------------------------------ +# +# Copyright (c) 2010, Intel Corporation. All rights reserved.
+# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php. +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +#------------------------------------------------------------------------------ + +ASM_GLOBAL ASM_PFX(internal_FPU_rmode) +ASM_PFX(internal_FPU_rmode): + fnstcw -4(%rsp) + movl -4(%rsp),%eax + shrl $10,%eax + andl $3,%eax + ret diff --git a/StdLib/LibC/Main/X64/fpu_rmode.asm b/StdLib/LibC/Main/X64/fpu_rmode.asm new file mode 100644 index 0000000000..36b0d11ccd --- /dev/null +++ b/StdLib/LibC/Main/X64/fpu_rmode.asm @@ -0,0 +1,41 @@ +;------------------------------------------------------------------------------ +; Return the current FPU rounding mode. +; +; MASM implementation of the flt_rounds function from NetBSD. +; +; Copyright (c) 2010, Intel Corporation. All rights reserved.
+; This program and the accompanying materials +; are licensed and made available under the terms and conditions of the BSD License +; which accompanies this distribution. The full text of the license may be found at +; http://opensource.org/licenses/bsd-license.php. +; +; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +; +;------------------------------------------------------------------------------ + + .code + +;_map BYTE 1 ; round to nearest +; BYTE 3 ; round to negative infinity +; BYTE 2 ; round to positive infinity +; BYTE 0 ; round to zero + +;------------------------------------------------------------------------------ +; int +; EFIAPI +; fpu_rmode( void ); +; +; VC++ always creates space for 4 parameters on the stack, whether they are +; used or not. We use one for temporary storage since the only variant of +; fnstcw saves to memory, NOT a register. +;------------------------------------------------------------------------------ +internal_FPU_rmode PROC + fnstcw [rsp + 8] ; save 16-bit FPU Control Word + mov eax, [rsp + 8] ; get the saved FPU Control Word + shr eax, 10 + and rax, 3 ; index is only the LSB two bits in RAX + ret ; Return rounding mode in RAX +internal_FPU_rmode ENDP + + END diff --git a/StdLib/LibC/Main/X64/isinfl.c b/StdLib/LibC/Main/X64/isinfl.c new file mode 100644 index 0000000000..d50577ffd1 --- /dev/null +++ b/StdLib/LibC/Main/X64/isinfl.c @@ -0,0 +1,63 @@ +/* $NetBSD: isinfl.c,v 1.5.16.1 2007/05/07 19:49:08 pavel Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: Header: isinf.c,v 1.1 91/07/08 19:03:34 torek Exp + */ + +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)isinf.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: isinfl.c,v 1.5.16.1 2007/05/07 19:49:08 pavel Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +/* + * 7.12.3.3 isinf - test for infinity + * IEEE 754 compatible 80-bit extended-precision Intel 386 version + */ +int +__isinfl(long double x) +{ + union ieee_ext_u u = {0.0}; + + u.extu_ld = x; + + return (u.extu_ext.ext_exp == EXT_EXP_INFNAN && + u.extu_ext.ext_frach == 0x80000000 && u.extu_ext.ext_fracl == 0); +} diff --git a/StdLib/LibC/Main/X64/isnanl.c b/StdLib/LibC/Main/X64/isnanl.c new file mode 100644 index 0000000000..148d674577 --- /dev/null +++ b/StdLib/LibC/Main/X64/isnanl.c @@ -0,0 +1,64 @@ +/* $NetBSD: isnanl.c,v 1.5.16.1 2007/05/07 19:49:07 pavel Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: Header: isinf.c,v 1.1 91/07/08 19:03:34 torek Exp + */ + +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)isinf.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: isnanl.c,v 1.5.16.1 2007/05/07 19:49:07 pavel Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +/* + * 7.12.3.4 isnan - test for a NaN + * IEEE 754 compatible 80-bit extended-precision Intel 386 version + */ +int +__isnanl(long double x) +{ + union ieee_ext_u u = { 0 }; + + u.extu_ld = x; + + return (u.extu_ext.ext_exp == EXT_EXP_INFNAN && + (u.extu_ext.ext_frach & 0x80000000) != 0 && + (u.extu_ext.ext_frach != 0x80000000 || u.extu_ext.ext_fracl != 0)); +} diff --git a/StdLib/LibC/Main/assert.c b/StdLib/LibC/Main/assert.c new file mode 100644 index 0000000000..6bb53d6abd --- /dev/null +++ b/StdLib/LibC/Main/assert.c @@ -0,0 +1,32 @@ +/** + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +//#include +//#include + +#include +#include + +#include +#include + +void +EFIAPI +__assert(const char *func, const char *file, int line, const char *failedexpr) +{ + if (func == NULL) + printf("Assertion failed: (%s), file %s, line %d.\n", + failedexpr, file, line); + else + printf("Assertion failed: (%s), function %s, file %s, line %d.\n", + failedexpr, func, file, line); + abort(); + /* NOTREACHED */ +} diff --git a/StdLib/LibC/Main/bswap16.c b/StdLib/LibC/Main/bswap16.c new file mode 100644 index 0000000000..c0e60f03c6 --- /dev/null +++ b/StdLib/LibC/Main/bswap16.c @@ -0,0 +1,22 @@ +/* $NetBSD: bswap16.c,v 1.1 2005/12/20 19:28:51 christos Exp $ */ + +/* + * Written by Manuel Bouyer . + * Public domain. + */ + +//#include +//#if defined(LIBC_SCCS) && !defined(lint) +//__RCSID("$NetBSD: bswap16.c,v 1.1 2005/12/20 19:28:51 christos Exp $"); +//#endif /* LIBC_SCCS and not lint */ + +//#include +//#include + +#undef bswap16 + +UINT16 +bswap16(UINT16 x) +{ + return ((x << 8) & 0xff00) | ((x >> 8) & 0x00ff); +} diff --git a/StdLib/LibC/Main/bswap32.c b/StdLib/LibC/Main/bswap32.c new file mode 100644 index 0000000000..f573a54c6c --- /dev/null +++ b/StdLib/LibC/Main/bswap32.c @@ -0,0 +1,25 @@ +/* $NetBSD: bswap32.c,v 1.1 2005/12/20 19:28:51 christos Exp $ */ + +/* + * Written by Manuel Bouyer . + * Public domain. + */ + +//#include +//#if defined(LIBC_SCCS) && !defined(lint) +//__RCSID("$NetBSD: bswap32.c,v 1.1 2005/12/20 19:28:51 christos Exp $"); +//#endif /* LIBC_SCCS and not lint */ + +//#include +//#include + +#undef bswap32 + +UINT32 +bswap32(UINT32 x) +{ + return ((x << 24) & 0xff000000 ) | + ((x << 8) & 0x00ff0000 ) | + ((x >> 8) & 0x0000ff00 ) | + ((x >> 24) & 0x000000ff ); +} diff --git a/StdLib/LibC/Main/bswap64.c b/StdLib/LibC/Main/bswap64.c new file mode 100644 index 0000000000..29e6916ea6 --- /dev/null +++ b/StdLib/LibC/Main/bswap64.c @@ -0,0 +1,44 @@ +/* $NetBSD: bswap64.c,v 1.1 2005/12/20 19:28:51 christos Exp $ */ + +/* + * Written by Manuel Bouyer . + * Public domain. + */ + +//#include +//#if defined(LIBC_SCCS) && !defined(lint) +//__RCSID("$NetBSD: bswap64.c,v 1.1 2005/12/20 19:28:51 christos Exp $"); +//#endif /* LIBC_SCCS and not lint */ + +//#include +//#include + +#undef bswap64 + +UINT64 +bswap64(UINT64 x) +{ +#ifndef _LP64 + /* + * Assume we have wide enough registers to do it without touching + * memory. + */ + return ( (x << 56) & 0xff00000000000000UL ) | + ( (x << 40) & 0x00ff000000000000UL ) | + ( (x << 24) & 0x0000ff0000000000UL ) | + ( (x << 8) & 0x000000ff00000000UL ) | + ( (x >> 8) & 0x00000000ff000000UL ) | + ( (x >> 24) & 0x0000000000ff0000UL ) | + ( (x >> 40) & 0x000000000000ff00UL ) | + ( (x >> 56) & 0x00000000000000ffUL ); +#else + /* + * Split the operation in two 32bit steps. + */ + u_int32_t tl, th; + + th = bswap32((u_int32_t)(x & 0x00000000ffffffffULL)); + tl = bswap32((u_int32_t)((x >> 32) & 0x00000000ffffffffULL)); + return ((u_int64_t)th << 32) | tl; +#endif +} diff --git a/StdLib/LibC/Main/errno.c b/StdLib/LibC/Main/errno.c new file mode 100644 index 0000000000..48eb1709b6 --- /dev/null +++ b/StdLib/LibC/Main/errno.c @@ -0,0 +1,19 @@ +/** @file + Instantiate errno as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ + +int errno = 0; +RETURN_STATUS EFIerrno = RETURN_SUCCESS; + +// This is required to keep VC++ happy if you use floating-point +int _fltused = 1; +int __sse2_available = 0; ///< Used by ftol2_sse diff --git a/StdLib/LibC/Main/infinityf_ieee754.c b/StdLib/LibC/Main/infinityf_ieee754.c new file mode 100644 index 0000000000..3f191650e2 --- /dev/null +++ b/StdLib/LibC/Main/infinityf_ieee754.c @@ -0,0 +1,20 @@ +/* $NetBSD: infinityf_ieee754.c,v 1.2 2005/06/12 05:21:27 lukem Exp $ */ + +/* + * IEEE-compatible infinityf.c -- public domain. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: infinityf_ieee754.c,v 1.2 2005/06/12 05:21:27 lukem Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +const union __float_u __infinityf = +#if BYTE_ORDER == BIG_ENDIAN + { { 0x7f, 0x80, 0, 0 } }; +#else + { { 0, 0, 0x80, 0x7f } }; +#endif diff --git a/StdLib/LibC/Main/isinfd_ieee754.c b/StdLib/LibC/Main/isinfd_ieee754.c new file mode 100644 index 0000000000..f5757b083c --- /dev/null +++ b/StdLib/LibC/Main/isinfd_ieee754.c @@ -0,0 +1,68 @@ +/* $NetBSD: isinfd_ieee754.c,v 1.1 2004/03/04 23:42:39 kleink Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: Header: isinf.c,v 1.1 91/07/08 19:03:34 torek Exp + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)isinf.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: isinfd_ieee754.c,v 1.1 2004/03/04 23:42:39 kleink Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +/* libc.so.12 ABI compatbility */ +#ifdef __weak_alias +__weak_alias(isinf,__isinfd) +#endif + +/* + * 7.12.3.3 isinf - test for infinity + * IEEE 754 double-precision version + */ +int +__isinfd(double x) +{ + union ieee_double_u u; + + u.dblu_d = x; + + return (u.dblu_dbl.dbl_exp == DBL_EXP_INFNAN && + (u.dblu_dbl.dbl_frach == 0 && u.dblu_dbl.dbl_fracl == 0)); +} diff --git a/StdLib/LibC/Main/isinff_ieee754.c b/StdLib/LibC/Main/isinff_ieee754.c new file mode 100644 index 0000000000..ada1e728f1 --- /dev/null +++ b/StdLib/LibC/Main/isinff_ieee754.c @@ -0,0 +1,63 @@ +/* $NetBSD: isinff_ieee754.c,v 1.1 2004/03/04 23:42:39 kleink Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: Header: isinf.c,v 1.1 91/07/08 19:03:34 torek Exp + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)isinf.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: isinff_ieee754.c,v 1.1 2004/03/04 23:42:39 kleink Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +/* + * 7.12.3.3 isinf - test for infinity + * IEEE 754 single-precision version + */ +int +__isinff(float x) +{ + union ieee_single_u u; + + u.sngu_f = x; + + return (u.sngu_sng.sng_exp == SNG_EXP_INFNAN && + u.sngu_sng.sng_frac == 0); +} diff --git a/StdLib/LibC/Main/isnand_ieee754.c b/StdLib/LibC/Main/isnand_ieee754.c new file mode 100644 index 0000000000..70c1535343 --- /dev/null +++ b/StdLib/LibC/Main/isnand_ieee754.c @@ -0,0 +1,68 @@ +/* $NetBSD: isnand_ieee754.c,v 1.1 2004/03/04 23:42:39 kleink Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: Header: isinf.c,v 1.1 91/07/08 19:03:34 torek Exp + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)isinf.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: isnand_ieee754.c,v 1.1 2004/03/04 23:42:39 kleink Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +/* libc.so.12 ABI compatbility */ +#ifdef __weak_alias +__weak_alias(isnan,__isnand) +#endif + +/* + * 7.12.3.4 isnan - test for a NaN + * IEEE 754 double-precision version + */ +int +__isnand(double x) +{ + union ieee_double_u u; + + u.dblu_d = x; + + return (u.dblu_dbl.dbl_exp == DBL_EXP_INFNAN && + (u.dblu_dbl.dbl_frach != 0 || u.dblu_dbl.dbl_fracl != 0)); +} diff --git a/StdLib/LibC/Main/isnanf_ieee754.c b/StdLib/LibC/Main/isnanf_ieee754.c new file mode 100644 index 0000000000..309404d320 --- /dev/null +++ b/StdLib/LibC/Main/isnanf_ieee754.c @@ -0,0 +1,63 @@ +/* $NetBSD: isnanf_ieee754.c,v 1.1 2004/03/04 23:42:39 kleink Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: Header: isinf.c,v 1.1 91/07/08 19:03:34 torek Exp + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)isinf.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: isnanf_ieee754.c,v 1.1 2004/03/04 23:42:39 kleink Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +/* + * 7.12.3.4 isnan - test for a NaN + * IEEE 754 single-precision version + */ +int +__isnanf(float x) +{ + union ieee_single_u u; + + u.sngu_f = x; + + return (u.sngu_sng.sng_exp == SNG_EXP_INFNAN && + u.sngu_sng.sng_frac != 0); +} diff --git a/StdLib/LibC/Main/longjmp.c b/StdLib/LibC/Main/longjmp.c new file mode 100644 index 0000000000..2ae9a0d455 --- /dev/null +++ b/StdLib/LibC/Main/longjmp.c @@ -0,0 +1,20 @@ +/** @file + The longjmp function. + The C standard requires that longjmp be a function and not a macro. + + Copyright (c) 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include +#include + +void longjmp(jmp_buf env, int val) +{ + LongJump(env, (UINTN)((val == 0) ? 1 : val)); +} diff --git a/StdLib/LibC/Main/x86flt_rounds.c b/StdLib/LibC/Main/x86flt_rounds.c new file mode 100644 index 0000000000..d0478e2c1b --- /dev/null +++ b/StdLib/LibC/Main/x86flt_rounds.c @@ -0,0 +1,23 @@ +/** @file + Return the current FPU rounding mode. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ + +extern int internal_FPU_rmode( void ); + +static INT8 rmode[] = { 1, 3, 2, 0 }; + +int +EFIAPI +__flt_rounds ( void ) +{ + return rmode[ internal_FPU_rmode() ]; +} diff --git a/StdLib/LibC/Math/Math.inf b/StdLib/LibC/Math/Math.inf new file mode 100644 index 0000000000..6a48d97cac --- /dev/null +++ b/StdLib/LibC/Math/Math.inf @@ -0,0 +1,101 @@ +## @file +# Standard C library: Math Library. +# +# Copyright (c) 2010, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php. +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = LibMath + FILE_GUID = a9dc6f60-f861-47d1-8751-ecaae7d27291 + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + LIBRARY_CLASS = LibMath + +# +# VALID_ARCHITECTURES = IA32 X64 IPF +# + +[Sources] + # ieee 754 specific + e_acos.c + e_asin.c + e_atan2.c + e_cosh.c + e_exp.c + e_sinh.c + e_log.c + e_log2.c + e_log10.c + e_pow.c + e_sqrt.c + e_fmod.c + e_rem_pio2.c + + # kernel functions + k_cos.c + k_sin.c + k_tan.c + k_rem_pio2.c + + # Simple, unadorned, functions + s_atan.c + s_cos.c + s_sin.c + s_tan.c + s_expm1.c + s_tanh.c + s_frexp.c + s_ldexp.c + s_scalbn.c + s_copysign.c + s_finite.c + s_infinity.c + s_modf.c + s_fabs.c + s_ceil.c + s_floor.c + + # wrapper functions + w_acos.c + w_asin.c + w_atan2.c + w_cosh.c + w_sinh.c + w_exp.c + w_log.c + w_log2.c + w_log10.c + w_pow.c + w_sqrt.c + w_fmod.c + +[Packages] + StdLib/StdLib.dec + StdLibPrivateInternalFiles/DoNotUse.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + LibC + +################################################################ +# The Build Options, below, are only used when building the C library. +# DO NOT use them when building your application! +# Nasty things could happen if you do. +# +# /Oi- is required for Microsoft VC++ to allow "intrinsic" functions to be +# defined in this library. +# /GL- is required so that LTCG generated references to functions in this library, +# such as memcpy(), can be resolved. +# +[BuildOptions] + MSFT:*_*_*_CC_FLAGS = /Oi- /GL- diff --git a/StdLib/LibC/Math/e_acos.c b/StdLib/LibC/Math/e_acos.c new file mode 100644 index 0000000000..4617729af6 --- /dev/null +++ b/StdLib/LibC/Math/e_acos.c @@ -0,0 +1,122 @@ +/** @file + Compute acos(x) using ieee FP math. + + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + + e_acos.c 5.1 93/09/24 + NetBSD: e_acos.c,v 1.12 2002/05/26 22:01:47 wiz Exp + */ +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ + // Keep older compilers quiet about floating-point divide-by-zero + #pragma warning ( disable : 4723 ) +#endif + +#include +#include + +/* __ieee754_acos(x) + * Method : + * acos(x) = pi/2 - asin(x) + * acos(-x) = pi/2 + asin(x) + * For |x|<=0.5 + * acos(x) = pi/2 - (x + x*x^2*R(x^2)) (see asin.c) + * For x>0.5 + * acos(x) = pi/2 - (pi/2 - 2asin(sqrt((1-x)/2))) + * = 2asin(sqrt((1-x)/2)) + * = 2s + 2s*z*R(z) ...z=(1-x)/2, s=sqrt(z) + * = 2f + (2c + 2s*z*R(z)) + * where f=hi part of s, and c = (z-f*f)/(s+f) is the correction term + * for f so that f+c ~ sqrt(z). + * For x<-0.5 + * acos(x) = pi - 2asin(sqrt((1-|x|)/2)) + * = pi - 0.5*(s+s*z*R(z)), where z=(1-|x|)/2,s=sqrt(z) + * + * Special cases: + * if x is NaN, return x itself; + * if |x|>1, return NaN with invalid signal. + * + * Function needed: __ieee754_sqrt + */ + +#include "math.h" +#include "math_private.h" + +static const double +one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ +pi = 3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */ +pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */ +pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */ +pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */ +pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */ +pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */ +pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */ +pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */ +pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */ +qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */ +qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */ +qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */ +qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */ + +double +__ieee754_acos(double x) +{ + double z,p,q,r,w,s,c,df; + int32_t hx,ix; + GET_HIGH_WORD(hx,x); + ix = hx&0x7fffffff; + if(ix>=0x3ff00000) { /* |x| >= 1 */ + u_int32_t lx; + + GET_LOW_WORD(lx,x); + if(((ix-0x3ff00000)|lx)==0) { /* |x|==1 */ + if(hx>0) return 0.0; /* acos(1) = 0 */ + else return pi+2.0*pio2_lo; /* acos(-1)= pi */ + } + return (x-x)/(x-x); /* acos(|x|>1) is NaN */ + } + if(ix<0x3fe00000) { /* |x| < 0.5 */ + if(ix<=0x3c600000) return pio2_hi+pio2_lo; /*if|x|<2**-57*/ + z = x*x; + p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5))))); + q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4))); + r = p/q; + return pio2_hi - (x - (pio2_lo-x*r)); + } + else if (hx<0) { /* x < -0.5 */ + z = (one+x)*0.5; + p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5))))); + q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4))); + s = __ieee754_sqrt(z); + r = p/q; + w = r*s-pio2_lo; + return pi - 2.0*(s+w); + } + else { /* x > 0.5 */ + z = (one-x)*0.5; + s = __ieee754_sqrt(z); + df = s; + SET_LOW_WORD(df,0); + c = (z-df*df)/(s+df); + p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5))))); + q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4))); + r = p/q; + w = r*s+c; + return 2.0*(df+w); + } +} diff --git a/StdLib/LibC/Math/e_asin.c b/StdLib/LibC/Math/e_asin.c new file mode 100644 index 0000000000..d1d4dc0019 --- /dev/null +++ b/StdLib/LibC/Math/e_asin.c @@ -0,0 +1,120 @@ +/* @(#)e_asin.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: e_asin.c,v 1.12 2002/05/26 22:01:48 wiz Exp $"); +#endif + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ +// C4723: potential divide by zero. +#pragma warning ( disable : 4723 ) +#endif + +/* __ieee754_asin(x) + * Method : + * Since asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ... + * we approximate asin(x) on [0,0.5] by + * asin(x) = x + x*x^2*R(x^2) + * where + * R(x^2) is a rational approximation of (asin(x)-x)/x^3 + * and its remez error is bounded by + * |(asin(x)-x)/x^3 - R(x^2)| < 2^(-58.75) + * + * For x in [0.5,1] + * asin(x) = pi/2-2*asin(sqrt((1-x)/2)) + * Let y = (1-x), z = y/2, s := sqrt(z), and pio2_hi+pio2_lo=pi/2; + * then for x>0.98 + * asin(x) = pi/2 - 2*(s+s*z*R(z)) + * = pio2_hi - (2*(s+s*z*R(z)) - pio2_lo) + * For x<=0.98, let pio4_hi = pio2_hi/2, then + * f = hi part of s; + * c = sqrt(z) - f = (z-f*f)/(s+f) ...f+c=sqrt(z) + * and + * asin(x) = pi/2 - 2*(s+s*z*R(z)) + * = pio4_hi+(pio4-2s)-(2s*z*R(z)-pio2_lo) + * = pio4_hi+(pio4-2f)-(2s*z*R(z)-(pio2_lo+2c)) + * + * Special cases: + * if x is NaN, return x itself; + * if |x|>1, return NaN with invalid signal. + * + */ + + +#include "math.h" +#include "math_private.h" + +static const double +one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ +huge = 1.000e+300, +pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */ +pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */ +pio4_hi = 7.85398163397448278999e-01, /* 0x3FE921FB, 0x54442D18 */ + /* coefficient for R(x^2) */ +pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */ +pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */ +pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */ +pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */ +pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */ +pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */ +qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */ +qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */ +qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */ +qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */ + +double +__ieee754_asin(double x) +{ + double t,w,p,q,c,r,s; + int32_t hx,ix; + + t = 0; + GET_HIGH_WORD(hx,x); + ix = hx&0x7fffffff; + if(ix>= 0x3ff00000) { /* |x|>= 1 */ + u_int32_t lx; + GET_LOW_WORD(lx,x); + if(((ix-0x3ff00000)|lx)==0) + /* asin(1)=+-pi/2 with inexact */ + return x*pio2_hi+x*pio2_lo; + return (x-x)/(x-x); /* asin(|x|>1) is NaN */ + } else if (ix<0x3fe00000) { /* |x|<0.5 */ + if(ix<0x3e400000) { /* if |x| < 2**-27 */ + if(huge+x>one) return x;/* return x with inexact if x!=0*/ + } else + t = x*x; + p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5))))); + q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4))); + w = p/q; + return x+x*w; + } + /* 1> |x|>= 0.5 */ + w = one-fabs(x); + t = w*0.5; + p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5))))); + q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4))); + s = __ieee754_sqrt(t); + if(ix>=0x3FEF3333) { /* if |x| > 0.975 */ + w = p/q; + t = pio2_hi-(2.0*(s+s*w)-pio2_lo); + } else { + w = s; + SET_LOW_WORD(w,0); + c = (t-w*w)/(s+w); + r = p/q; + p = 2.0*s*r-(pio2_lo-2.0*c); + q = pio4_hi-2.0*w; + t = pio4_hi-(p-q); + } + if(hx>0) return t; else return -t; +} diff --git a/StdLib/LibC/Math/e_atan2.c b/StdLib/LibC/Math/e_atan2.c new file mode 100644 index 0000000000..309447c0a5 --- /dev/null +++ b/StdLib/LibC/Math/e_atan2.c @@ -0,0 +1,128 @@ +/* @(#)e_atan2.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: e_atan2.c,v 1.12 2002/05/26 22:01:48 wiz Exp $"); +#endif + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ + // unary minus operator applied to unsigned type, result still unsigned + #pragma warning ( disable : 4146 ) +#endif + +/* __ieee754_atan2(y,x) + * Method : + * 1. Reduce y to positive by atan2(y,x)=-atan2(-y,x). + * 2. Reduce x to positive by (if x and y are unexceptional): + * ARG (x+iy) = arctan(y/x) ... if x > 0, + * ARG (x+iy) = pi - arctan[y/(-x)] ... if x < 0, + * + * Special cases: + * + * ATAN2((anything), NaN ) is NaN; + * ATAN2(NAN , (anything) ) is NaN; + * ATAN2(+-0, +(anything but NaN)) is +-0 ; + * ATAN2(+-0, -(anything but NaN)) is +-pi ; + * ATAN2(+-(anything but 0 and NaN), 0) is +-pi/2; + * ATAN2(+-(anything but INF and NaN), +INF) is +-0 ; + * ATAN2(+-(anything but INF and NaN), -INF) is +-pi; + * ATAN2(+-INF,+INF ) is +-pi/4 ; + * ATAN2(+-INF,-INF ) is +-3pi/4; + * ATAN2(+-INF, (anything but,0,NaN, and INF)) is +-pi/2; + * + * Constants: + * The hexadecimal values are the intended ones for the following + * constants. The decimal values may be used, provided that the + * compiler will convert from decimal to binary accurately enough + * to produce the hexadecimal values shown. + */ + +#include "math.h" +#include "math_private.h" + +static const double +tiny = 1.0e-300, +zero = 0.0, +pi_o_4 = 7.8539816339744827900E-01, /* 0x3FE921FB, 0x54442D18 */ +pi_o_2 = 1.5707963267948965580E+00, /* 0x3FF921FB, 0x54442D18 */ +pi = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */ +pi_lo = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */ + +double +__ieee754_atan2(double y, double x) +{ + double z; + int32_t k,m,hx,hy,ix,iy; + u_int32_t lx,ly; + + EXTRACT_WORDS(hx,lx,x); + ix = hx&0x7fffffff; + EXTRACT_WORDS(hy,ly,y); + iy = hy&0x7fffffff; + if(((ix|((lx|-lx)>>31))>0x7ff00000)|| + ((iy|((ly|-ly)>>31))>0x7ff00000)) /* x or y is NaN */ + return x+y; + if(((hx-0x3ff00000)|lx)==0) return atan(y); /* x=1.0 */ + m = ((hy>>31)&1)|((hx>>30)&2); /* 2*sign(x)+sign(y) */ + + /* when y = 0 */ + if((iy|ly)==0) { + switch(m) { + case 0: + case 1: return y; /* atan(+-0,+anything)=+-0 */ + case 2: return pi+tiny;/* atan(+0,-anything) = pi */ + case 3: return -pi-tiny;/* atan(-0,-anything) =-pi */ + } + } + /* when x = 0 */ + if((ix|lx)==0) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny; + + /* when x is INF */ + if(ix==0x7ff00000) { + if(iy==0x7ff00000) { + switch(m) { + case 0: return pi_o_4+tiny;/* atan(+INF,+INF) */ + case 1: return -pi_o_4-tiny;/* atan(-INF,+INF) */ + case 2: return 3.0*pi_o_4+tiny;/*atan(+INF,-INF)*/ + case 3: return -3.0*pi_o_4-tiny;/*atan(-INF,-INF)*/ + } + } else { + switch(m) { + case 0: return zero ; /* atan(+...,+INF) */ + case 1: return -zero ; /* atan(-...,+INF) */ + case 2: return pi+tiny ; /* atan(+...,-INF) */ + case 3: return -pi-tiny ; /* atan(-...,-INF) */ + } + } + } + /* when y is INF */ + if(iy==0x7ff00000) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny; + + /* compute y/x */ + k = (iy-ix)>>20; + if(k > 60) z=pi_o_2+0.5*pi_lo; /* |y/x| > 2**60 */ + else if(hx<0&&k<-60) z=0.0; /* |y|/x < -2**60 */ + else z=atan(fabs(y/x)); /* safe to do y/x */ + switch (m) { + case 0: return z ; /* atan(+,+) */ + case 1: { + u_int32_t zh; + GET_HIGH_WORD(zh,z); + SET_HIGH_WORD(z,zh ^ 0x80000000); + } + return z ; /* atan(-,+) */ + case 2: return pi-(z-pi_lo);/* atan(+,-) */ + default: /* case 3 */ + return (z-pi_lo)-pi;/* atan(-,-) */ + } +} diff --git a/StdLib/LibC/Math/e_cosh.c b/StdLib/LibC/Math/e_cosh.c new file mode 100644 index 0000000000..48ce6817d2 --- /dev/null +++ b/StdLib/LibC/Math/e_cosh.c @@ -0,0 +1,91 @@ +/* @(#)e_cosh.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: e_cosh.c,v 1.11 2002/05/26 22:01:49 wiz Exp $"); +#endif + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ + // C4756: overflow in constant arithmetic + #pragma warning ( disable : 4756 ) +#endif + +/* __ieee754_cosh(x) + * Method : + * mathematically cosh(x) if defined to be (exp(x)+exp(-x))/2 + * 1. Replace x by |x| (cosh(x) = cosh(-x)). + * 2. + * [ exp(x) - 1 ]^2 + * 0 <= x <= ln2/2 : cosh(x) := 1 + ------------------- + * 2*exp(x) + * + * exp(x) + 1/exp(x) + * ln2/2 <= x <= 22 : cosh(x) := ------------------- + * 2 + * 22 <= x <= lnovft : cosh(x) := exp(x)/2 + * lnovft <= x <= ln2ovft: cosh(x) := exp(x/2)/2 * exp(x/2) + * ln2ovft < x : cosh(x) := huge*huge (overflow) + * + * Special cases: + * cosh(x) is |x| if x is +INF, -INF, or NaN. + * only cosh(0)=1 is exact for finite x. + */ + +#include "math.h" +#include "math_private.h" + +static const double one = 1.0, half=0.5, huge = 1.0e300; + +double +__ieee754_cosh(double x) +{ + double t,w; + int32_t ix; + u_int32_t lx; + + /* High word of |x|. */ + GET_HIGH_WORD(ix,x); + ix &= 0x7fffffff; + + /* x is INF or NaN */ + if(ix>=0x7ff00000) return x*x; + + /* |x| in [0,0.5*ln2], return 1+expm1(|x|)^2/(2*exp(|x|)) */ + if(ix<0x3fd62e43) { + t = expm1(fabs(x)); + w = one+t; + if (ix<0x3c800000) return w; /* cosh(tiny) = 1 */ + return one+(t*t)/(w+w); + } + + /* |x| in [0.5*ln2,22], return (exp(|x|)+1/exp(|x|)/2; */ + if (ix < 0x40360000) { + t = __ieee754_exp(fabs(x)); + return half*t+half/t; + } + + /* |x| in [22, log(maxdouble)] return half*exp(|x|) */ + if (ix < 0x40862E42) return half*__ieee754_exp(fabs(x)); + + /* |x| in [log(maxdouble), overflowthresold] */ + GET_LOW_WORD(lx,x); + if (ix<0x408633CE || + ((ix==0x408633ce)&&(lx<=(u_int32_t)0x8fb9f87d))) { + w = __ieee754_exp(half*fabs(x)); + t = half*w; + return t*w; + } + + /* |x| > overflowthresold, cosh(x) overflow */ + return huge*huge; +} diff --git a/StdLib/LibC/Math/e_exp.c b/StdLib/LibC/Math/e_exp.c new file mode 100644 index 0000000000..f05f5397e6 --- /dev/null +++ b/StdLib/LibC/Math/e_exp.c @@ -0,0 +1,167 @@ +/* @(#)e_exp.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: e_exp.c,v 1.11 2002/05/26 22:01:49 wiz Exp $"); +#endif + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ + // C4756: overflow in constant arithmetic + #pragma warning ( disable : 4756 ) +#endif + +/* __ieee754_exp(x) + * Returns the exponential of x. + * + * Method + * 1. Argument reduction: + * Reduce x to an r so that |r| <= 0.5*ln2 ~ 0.34658. + * Given x, find r and integer k such that + * + * x = k*ln2 + r, |r| <= 0.5*ln2. + * + * Here r will be represented as r = hi-lo for better + * accuracy. + * + * 2. Approximation of exp(r) by a special rational function on + * the interval [0,0.34658]: + * Write + * R(r**2) = r*(exp(r)+1)/(exp(r)-1) = 2 + r*r/6 - r**4/360 + ... + * We use a special Reme algorithm on [0,0.34658] to generate + * a polynomial of degree 5 to approximate R. The maximum error + * of this polynomial approximation is bounded by 2**-59. In + * other words, + * R(z) ~ 2.0 + P1*z + P2*z**2 + P3*z**3 + P4*z**4 + P5*z**5 + * (where z=r*r, and the values of P1 to P5 are listed below) + * and + * | 5 | -59 + * | 2.0+P1*z+...+P5*z - R(z) | <= 2 + * | | + * The computation of exp(r) thus becomes + * 2*r + * exp(r) = 1 + ------- + * R - r + * r*R1(r) + * = 1 + r + ----------- (for better accuracy) + * 2 - R1(r) + * where + * 2 4 10 + * R1(r) = r - (P1*r + P2*r + ... + P5*r ). + * + * 3. Scale back to obtain exp(x): + * From step 1, we have + * exp(x) = 2^k * exp(r) + * + * Special cases: + * exp(INF) is INF, exp(NaN) is NaN; + * exp(-INF) is 0, and + * for finite argument, only exp(0)=1 is exact. + * + * Accuracy: + * according to an error analysis, the error is always less than + * 1 ulp (unit in the last place). + * + * Misc. info. + * For IEEE double + * if x > 7.09782712893383973096e+02 then exp(x) overflow + * if x < -7.45133219101941108420e+02 then exp(x) underflow + * + * Constants: + * The hexadecimal values are the intended ones for the following + * constants. The decimal values may be used, provided that the + * compiler will convert from decimal to binary accurately enough + * to produce the hexadecimal values shown. + */ + +#include "math.h" +#include "math_private.h" + +static const double +one = 1.0, +halF[2] = {0.5,-0.5,}, +huge = 1.0e+300, +twom1000= 9.33263618503218878990e-302, /* 2**-1000=0x01700000,0*/ +o_threshold= 7.09782712893383973096e+02, /* 0x40862E42, 0xFEFA39EF */ +u_threshold= -7.45133219101941108420e+02, /* 0xc0874910, 0xD52D3051 */ +ln2HI[2] ={ 6.93147180369123816490e-01, /* 0x3fe62e42, 0xfee00000 */ + -6.93147180369123816490e-01,},/* 0xbfe62e42, 0xfee00000 */ +ln2LO[2] ={ 1.90821492927058770002e-10, /* 0x3dea39ef, 0x35793c76 */ + -1.90821492927058770002e-10,},/* 0xbdea39ef, 0x35793c76 */ +invln2 = 1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */ +P1 = 1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */ +P2 = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */ +P3 = 6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */ +P4 = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */ +P5 = 4.13813679705723846039e-08; /* 0x3E663769, 0x72BEA4D0 */ + + +double +__ieee754_exp(double x) /* default IEEE double exp */ +{ + double y,hi,lo,c,t; + int32_t k,xsb; + u_int32_t hx; + + hi = lo = 0; + k = 0; + GET_HIGH_WORD(hx,x); + xsb = (hx>>31)&1; /* sign bit of x */ + hx &= 0x7fffffff; /* high word of |x| */ + + /* filter out non-finite argument */ + if(hx >= 0x40862E42) { /* if |x|>=709.78... */ + if(hx>=0x7ff00000) { + u_int32_t lx; + GET_LOW_WORD(lx,x); + if(((hx&0xfffff)|lx)!=0) + return x+x; /* NaN */ + else return (xsb==0)? x:0.0; /* exp(+-inf)={inf,0} */ + } + if(x > o_threshold) return huge*huge; /* overflow */ + if(x < u_threshold) return twom1000*twom1000; /* underflow */ + } + + /* argument reduction */ + if(hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */ + if(hx < 0x3FF0A2B2) { /* and |x| < 1.5 ln2 */ + hi = x-ln2HI[xsb]; lo=ln2LO[xsb]; k = 1-xsb-xsb; + } else { + k = (int32_t)(invln2*x+halF[xsb]); + t = k; + hi = x - t*ln2HI[0]; /* t*ln2HI is exact here */ + lo = t*ln2LO[0]; + } + x = hi - lo; + } + else if(hx < 0x3e300000) { /* when |x|<2**-28 */ + if(huge+x>one) return one+x;/* trigger inexact */ + } + else k = 0; + + /* x is now in primary range */ + t = x*x; + c = x - t*(P1+t*(P2+t*(P3+t*(P4+t*P5)))); + if(k==0) return one-((x*c)/(c-2.0)-x); + else y = one-((lo-(x*c)/(2.0-c))-hi); + if(k >= -1021) { + u_int32_t hy; + GET_HIGH_WORD(hy,y); + SET_HIGH_WORD(y,hy+(k<<20)); /* add k to y's exponent */ + return y; + } else { + u_int32_t hy; + GET_HIGH_WORD(hy,y); + SET_HIGH_WORD(y,hy+((k+1000)<<20)); /* add k to y's exponent */ + return y*twom1000; + } +} diff --git a/StdLib/LibC/Math/e_fmod.c b/StdLib/LibC/Math/e_fmod.c new file mode 100644 index 0000000000..3cb06c12b0 --- /dev/null +++ b/StdLib/LibC/Math/e_fmod.c @@ -0,0 +1,138 @@ +/* @(#)e_fmod.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: e_fmod.c,v 1.11 2002/05/26 22:01:49 wiz Exp $"); +#endif + +/* + * __ieee754_fmod(x,y) + * Return x mod y in exact arithmetic + * Method: shift and subtract + */ + +#include "math.h" +#include "math_private.h" + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ + // unary minus operator applied to unsigned type, result still unsigned + #pragma warning ( disable : 4146 ) +#endif + +static const double one = 1.0, Zero[] = {0.0, -0.0,}; + +double +__ieee754_fmod(double x, double y) +{ + int32_t n,hx,hy,hz,ix,iy,sx,i; + u_int32_t lx,ly,lz; + + EXTRACT_WORDS(hx,lx,x); + EXTRACT_WORDS(hy,ly,y); + sx = hx&0x80000000; /* sign of x */ + hx ^=sx; /* |x| */ + hy &= 0x7fffffff; /* |y| */ + + /* purge off exception values */ + if((hy|ly)==0||(hx>=0x7ff00000)|| /* y=0,or x not finite */ + ((hy|((ly|-ly)>>31))>0x7ff00000)) /* or y is NaN */ + return (x*y)/(x*y); + if(hx<=hy) { + if((hx>31]; /* |x|=|y| return x*0*/ + } + + /* determine ix = ilogb(x) */ + if(hx<0x00100000) { /* subnormal x */ + if(hx==0) { + for (ix = -1043, i=lx; i>0; i<<=1) ix -=1; + } else { + for (ix = -1022,i=(hx<<11); i>0; i<<=1) ix -=1; + } + } else ix = (hx>>20)-1023; + + /* determine iy = ilogb(y) */ + if(hy<0x00100000) { /* subnormal y */ + if(hy==0) { + for (iy = -1043, i=ly; i>0; i<<=1) iy -=1; + } else { + for (iy = -1022,i=(hy<<11); i>0; i<<=1) iy -=1; + } + } else iy = (hy>>20)-1023; + + /* set up {hx,lx}, {hy,ly} and align y to x */ + if(ix >= -1022) + hx = 0x00100000|(0x000fffff&hx); + else { /* subnormal x, shift x to normal */ + n = -1022-ix; + if(n<=31) { + hx = (hx<>(32-n)); + lx <<= n; + } else { + hx = lx<<(n-32); + lx = 0; + } + } + if(iy >= -1022) + hy = 0x00100000|(0x000fffff&hy); + else { /* subnormal y, shift y to normal */ + n = -1022-iy; + if(n<=31) { + hy = (hy<>(32-n)); + ly <<= n; + } else { + hy = ly<<(n-32); + ly = 0; + } + } + + /* fix point fmod */ + n = ix - iy; + while(n--) { + hz=hx-hy;lz=lx-ly; if(lx>31); lx = lx+lx;} + else { + if((hz|lz)==0) /* return sign(x)*0 */ + return Zero[(u_int32_t)sx>>31]; + hx = hz+hz+(lz>>31); lx = lz+lz; + } + } + hz=hx-hy;lz=lx-ly; if(lx=0) {hx=hz;lx=lz;} + + /* convert back to floating value and restore the sign */ + if((hx|lx)==0) /* return sign(x)*0 */ + return Zero[(u_int32_t)sx>>31]; + while(hx<0x00100000) { /* normalize x */ + hx = hx+hx+(lx>>31); lx = lx+lx; + iy -= 1; + } + if(iy>= -1022) { /* normalize output */ + hx = ((hx-0x00100000)|((iy+1023)<<20)); + INSERT_WORDS(x,hx|sx,lx); + } else { /* subnormal output */ + n = -1022 - iy; + if(n<=20) { + lx = (lx>>n)|((u_int32_t)hx<<(32-n)); + hx >>= n; + } else if (n<=31) { + lx = (hx<<(32-n))|(lx>>n); hx = sx; + } else { + lx = hx>>(n-32); hx = sx; + } + INSERT_WORDS(x,hx|sx,lx); + x *= one; /* create necessary signal */ + } + return x; /* exact output */ +} diff --git a/StdLib/LibC/Math/e_log.c b/StdLib/LibC/Math/e_log.c new file mode 100644 index 0000000000..979b7f9421 --- /dev/null +++ b/StdLib/LibC/Math/e_log.c @@ -0,0 +1,155 @@ +/** @file + Compute the logrithm of x. + + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + + e_log.c 5.1 93/09/24 + NetBSD: e_log.c,v 1.12 2002/05/26 22:01:51 wiz Exp +**/ +#include +#include + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ + // potential divide by 0 -- near line 118, (x-x)/zero is on purpose + #pragma warning ( disable : 4723 ) +#endif + +/* __ieee754_log(x) + * Return the logrithm of x + * + * Method : + * 1. Argument Reduction: find k and f such that + * x = 2^k * (1+f), + * where sqrt(2)/2 < 1+f < sqrt(2) . + * + * 2. Approximation of log(1+f). + * Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s) + * = 2s + 2/3 s**3 + 2/5 s**5 + ....., + * = 2s + s*R + * We use a special Reme algorithm on [0,0.1716] to generate + * a polynomial of degree 14 to approximate R The maximum error + * of this polynomial approximation is bounded by 2**-58.45. In + * other words, + * 2 4 6 8 10 12 14 + * R(z) ~ Lg1*s +Lg2*s +Lg3*s +Lg4*s +Lg5*s +Lg6*s +Lg7*s + * (the values of Lg1 to Lg7 are listed in the program) + * and + * | 2 14 | -58.45 + * | Lg1*s +...+Lg7*s - R(z) | <= 2 + * | | + * Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2. + * In order to guarantee error in log below 1ulp, we compute log + * by + * log(1+f) = f - s*(f - R) (if f is not too large) + * log(1+f) = f - (hfsq - s*(hfsq+R)). (better accuracy) + * + * 3. Finally, log(x) = k*ln2 + log(1+f). + * = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo))) + * Here ln2 is split into two floating point number: + * ln2_hi + ln2_lo, + * where n*ln2_hi is always exact for |n| < 2000. + * + * Special cases: + * log(x) is NaN with signal if x < 0 (including -INF) ; + * log(+INF) is +INF; log(0) is -INF with signal; + * log(NaN) is that NaN with no signal. + * + * Accuracy: + * according to an error analysis, the error is always less than + * 1 ulp (unit in the last place). + * + * Constants: + * The hexadecimal values are the intended ones for the following + * constants. The decimal values may be used, provided that the + * compiler will convert from decimal to binary accurately enough + * to produce the hexadecimal values shown. + */ + +#include "math.h" +#include "math_private.h" +#include + +static const double +ln2_hi = 6.93147180369123816490e-01, /* 3fe62e42 fee00000 */ +ln2_lo = 1.90821492927058770002e-10, /* 3dea39ef 35793c76 */ +two54 = 1.80143985094819840000e+16, /* 43500000 00000000 */ +Lg1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */ +Lg2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */ +Lg3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */ +Lg4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */ +Lg5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */ +Lg6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */ +Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */ + +static const double zero = 0.0; + +double +__ieee754_log(double x) +{ + double hfsq,f,s,z,R,w,t1,t2,dk; + int32_t k,hx,i,j; + u_int32_t lx; + + EXTRACT_WORDS(hx,lx,x); + + k=0; + if (hx < 0x00100000) { /* x < 2**-1022 */ + if (((hx&0x7fffffff)|lx)==0) + return -two54/zero; /* log(+-0)=-inf */ + if (hx<0) { + errno = EDOM; + return (x-x)/zero; /* log(-#) = NaN */ + } + k -= 54; x *= two54; /* subnormal number, scale up x */ + GET_HIGH_WORD(hx,x); + } + if (hx >= 0x7ff00000) return x+x; + k += (hx>>20)-1023; + hx &= 0x000fffff; + i = (hx+0x95f64)&0x100000; + SET_HIGH_WORD(x,hx|(i^0x3ff00000)); /* normalize x or x/2 */ + k += (i>>20); + f = x-1.0; + if((0x000fffff&(2+hx))<3) { /* |f| < 2**-20 */ + if(f==zero) { if(k==0) return zero; else {dk=(double)k; + return dk*ln2_hi+dk*ln2_lo;} + } + R = f*f*(0.5-0.33333333333333333*f); + if(k==0) return f-R; else {dk=(double)k; + return dk*ln2_hi-((R-dk*ln2_lo)-f);} + } + s = f/(2.0+f); + dk = (double)k; + z = s*s; + i = hx-0x6147a; + w = z*z; + j = 0x6b851-hx; + t1= w*(Lg2+w*(Lg4+w*Lg6)); + t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7))); + i |= j; + R = t2+t1; + if(i>0) { + hfsq=0.5*f*f; + if(k==0) return f-(hfsq-s*(hfsq+R)); else + return dk*ln2_hi-((hfsq-(s*(hfsq+R)+dk*ln2_lo))-f); + } else { + if(k==0) return f-s*(f-R); else + return dk*ln2_hi-((s*(f-R)-dk*ln2_lo)-f); + } +} diff --git a/StdLib/LibC/Math/e_log10.c b/StdLib/LibC/Math/e_log10.c new file mode 100644 index 0000000000..141dd6752a --- /dev/null +++ b/StdLib/LibC/Math/e_log10.c @@ -0,0 +1,106 @@ +/** @file + Compute the base 10 logrithm of x. + + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + + e_log10.c 5.1 93/09/24 + NetBSD: e_log10.c,v 1.12 2002/05/26 22:01:51 wiz Exp +**/ +#include +#include + +/* __ieee754_log10(x) + * Return the base 10 logarithm of x + * + * Method : + * Let log10_2hi = leading 40 bits of log10(2) and + * log10_2lo = log10(2) - log10_2hi, + * ivln10 = 1/log(10) rounded. + * Then + * n = ilogb(x), + * if(n<0) n = n+1; + * x = scalbn(x,-n); + * log10(x) := n*log10_2hi + (n*log10_2lo + ivln10*log(x)) + * + * Note 1: + * To guarantee log10(10**n)=n, where 10**n is normal, the rounding + * mode must set to Round-to-Nearest. + * Note 2: + * [1/log(10)] rounded to 53 bits has error .198 ulps; + * log10 is monotonic at all binary break points. + * + * Special cases: + * log10(x) is NaN with signal if x < 0; + * log10(+INF) is +INF with no signal; log10(0) is -INF with signal; + * log10(NaN) is that NaN with no signal; + * log10(10**N) = N for N=0,1,...,22. + * + * Constants: + * The hexadecimal values are the intended ones for the following constants. + * The decimal values may be used, provided that the compiler will convert + * from decimal to binary accurately enough to produce the hexadecimal values + * shown. + */ + +#include "math.h" +#include "math_private.h" +#include + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ + // potential divide by 0 -- near line 80, (x-x)/zero is on purpose + #pragma warning ( disable : 4723 ) +#endif + +static const double +two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */ +ivln10 = 4.34294481903251816668e-01, /* 0x3FDBCB7B, 0x1526E50E */ +log10_2hi = 3.01029995663611771306e-01, /* 0x3FD34413, 0x509F6000 */ +log10_2lo = 3.69423907715893078616e-13; /* 0x3D59FEF3, 0x11F12B36 */ + +static const double zero = 0.0; + +double +__ieee754_log10(double x) +{ + double y,z; + int32_t i,k,hx; + u_int32_t lx; + + EXTRACT_WORDS(hx,lx,x); + + k=0; + if (hx < 0x00100000) { /* x < 2**-1022 */ + if (((hx&0x7fffffff)|lx)==0) + return -two54/zero; /* log(+-0)=-inf */ + if (hx<0) { + errno = EDOM; + return (x-x)/zero; /* log(-#) = NaN */ + } + k -= 54; x *= two54; /* subnormal number, scale up x */ + GET_HIGH_WORD(hx,x); + } + if (hx >= 0x7ff00000) return x+x; + k += (hx>>20)-1023; + i = ((u_int32_t)k&0x80000000)>>31; + hx = (hx&0x000fffff)|((0x3ff-i)<<20); + y = (double)(k+i); + SET_HIGH_WORD(x,hx); + z = y*log10_2lo + ivln10*__ieee754_log(x); + return z+y*log10_2hi; +} diff --git a/StdLib/LibC/Math/e_log2.c b/StdLib/LibC/Math/e_log2.c new file mode 100644 index 0000000000..5d15cd3b01 --- /dev/null +++ b/StdLib/LibC/Math/e_log2.c @@ -0,0 +1,85 @@ + +/* @(#)e_log.c 1.3 95/01/18 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunSoft, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: e_log2.c,v 1.1 2005/07/21 12:55:58 christos Exp $"); +#endif + +#include "math.h" +#include "math_private.h" + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ + // potential divide by 0 -- near line 53, (x-x)/zero is on purpose + #pragma warning ( disable : 4723 ) +#endif + +static const double +ln2 = 0.6931471805599452862268, +two54 = 1.80143985094819840000e+16, /* 43500000 00000000 */ +Lg1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */ +Lg2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */ +Lg3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */ +Lg4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */ +Lg5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */ +Lg6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */ +Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */ + +static const double zero = 0.0; + +double +__ieee754_log2(double x) +{ + double hfsq,f,s,z,R,w,t1,t2,dk; + int32_t k,hx,i,j; + u_int32_t lx; + + EXTRACT_WORDS(hx,lx,x); + + k=0; + if (hx < 0x00100000) { /* x < 2**-1022 */ + if (((hx&0x7fffffff)|lx)==0) + return -two54/zero; /* log(+-0)=-inf */ + if (hx<0) return (x-x)/zero; /* log(-#) = NaN */ + k -= 54; x *= two54; /* subnormal number, scale up x */ + GET_HIGH_WORD(hx,x); + } + if (hx >= 0x7ff00000) return x+x; + k += (hx>>20)-1023; + hx &= 0x000fffff; + i = (hx+0x95f64)&0x100000; + SET_HIGH_WORD(x,hx|(i^0x3ff00000)); /* normalize x or x/2 */ + k += (i>>20); + f = x-1.0; + dk = (double)k; + if((0x000fffff&(2+hx))<3) { /* |f| < 2**-20 */ + if (f==zero) + return (dk); + R = f*f*(0.5-0.33333333333333333*f); + return (dk-(R-f)/ln2); + } + s = f/(2.0+f); + z = s*s; + i = hx-0x6147a; + w = z*z; + j = 0x6b851-hx; + t1= w*(Lg2+w*(Lg4+w*Lg6)); + t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7))); + i |= j; + R = t2+t1; + if(i>0) { + hfsq=0.5*f*f; + return (dk-(hfsq-s*(hfsq+R)-f)/ln2); + } else + return (dk-((s*(f-R))-f)/ln2); +} diff --git a/StdLib/LibC/Math/e_pow.c b/StdLib/LibC/Math/e_pow.c new file mode 100644 index 0000000000..6d2286b41a --- /dev/null +++ b/StdLib/LibC/Math/e_pow.c @@ -0,0 +1,323 @@ +/** @file + Compute the base 10 logrithm of x. + + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + + e_pow.c 5.1 93/09/24 + NetBSD: e_pow.c,v 1.13 2004/06/30 18:43:15 drochner Exp +**/ +#include +#include + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ + // C4723: potential divide by zero. + #pragma warning ( disable : 4723 ) + // C4756: overflow in constant arithmetic + #pragma warning ( disable : 4756 ) +#endif + +/* __ieee754_pow(x,y) return x**y + * + * n + * Method: Let x = 2 * (1+f) + * 1. Compute and return log2(x) in two pieces: + * log2(x) = w1 + w2, + * where w1 has 53-24 = 29 bit trailing zeros. + * 2. Perform y*log2(x) = n+y' by simulating multi-precision + * arithmetic, where |y'|<=0.5. + * 3. Return x**y = 2**n*exp(y'*log2) + * + * Special cases: + * 1. (anything) ** 0 is 1 + * 2. (anything) ** 1 is itself + * 3. (anything) ** NAN is NAN + * 4. NAN ** (anything except 0) is NAN + * 5. +-(|x| > 1) ** +INF is +INF + * 6. +-(|x| > 1) ** -INF is +0 + * 7. +-(|x| < 1) ** +INF is +0 + * 8. +-(|x| < 1) ** -INF is +INF + * 9. +-1 ** +-INF is NAN + * 10. +0 ** (+anything except 0, NAN) is +0 + * 11. -0 ** (+anything except 0, NAN, odd integer) is +0 + * 12. +0 ** (-anything except 0, NAN) is +INF + * 13. -0 ** (-anything except 0, NAN, odd integer) is +INF + * 14. -0 ** (odd integer) = -( +0 ** (odd integer) ) + * 15. +INF ** (+anything except 0,NAN) is +INF + * 16. +INF ** (-anything except 0,NAN) is +0 + * 17. -INF ** (anything) = -0 ** (-anything) + * 18. (-anything) ** (integer) is (-1)**(integer)*(+anything**integer) + * 19. (-anything except 0 and inf) ** (non-integer) is NAN + * + * Accuracy: + * pow(x,y) returns x**y nearly rounded. In particular + * pow(integer,integer) + * always returns the correct integer provided it is + * representable. + * + * Constants : + * The hexadecimal values are the intended ones for the following + * constants. The decimal values may be used, provided that the + * compiler will convert from decimal to binary accurately enough + * to produce the hexadecimal values shown. + */ + +#include "math.h" +#include "math_private.h" +#include + +static const double +bp[] = {1.0, 1.5,}, +dp_h[] = { 0.0, 5.84962487220764160156e-01,}, /* 0x3FE2B803, 0x40000000 */ +dp_l[] = { 0.0, 1.35003920212974897128e-08,}, /* 0x3E4CFDEB, 0x43CFD006 */ +zero = 0.0, +one = 1.0, +two = 2.0, +two53 = 9007199254740992.0, /* 0x43400000, 0x00000000 */ +huge = 1.0e300, +tiny = 1.0e-300, + /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */ +L1 = 5.99999999999994648725e-01, /* 0x3FE33333, 0x33333303 */ +L2 = 4.28571428578550184252e-01, /* 0x3FDB6DB6, 0xDB6FABFF */ +L3 = 3.33333329818377432918e-01, /* 0x3FD55555, 0x518F264D */ +L4 = 2.72728123808534006489e-01, /* 0x3FD17460, 0xA91D4101 */ +L5 = 2.30660745775561754067e-01, /* 0x3FCD864A, 0x93C9DB65 */ +L6 = 2.06975017800338417784e-01, /* 0x3FCA7E28, 0x4A454EEF */ +P1 = 1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */ +P2 = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */ +P3 = 6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */ +P4 = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */ +P5 = 4.13813679705723846039e-08, /* 0x3E663769, 0x72BEA4D0 */ +lg2 = 6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */ +lg2_h = 6.93147182464599609375e-01, /* 0x3FE62E43, 0x00000000 */ +lg2_l = -1.90465429995776804525e-09, /* 0xBE205C61, 0x0CA86C39 */ +ovt = 8.0085662595372944372e-0017, /* -(1024-log2(ovfl+.5ulp)) */ +cp = 9.61796693925975554329e-01, /* 0x3FEEC709, 0xDC3A03FD =2/(3ln2) */ +cp_h = 9.61796700954437255859e-01, /* 0x3FEEC709, 0xE0000000 =(float)cp */ +cp_l = -7.02846165095275826516e-09, /* 0xBE3E2FE0, 0x145B01F5 =tail of cp_h*/ +ivln2 = 1.44269504088896338700e+00, /* 0x3FF71547, 0x652B82FE =1/ln2 */ +ivln2_h = 1.44269502162933349609e+00, /* 0x3FF71547, 0x60000000 =24b 1/ln2*/ +ivln2_l = 1.92596299112661746887e-08; /* 0x3E54AE0B, 0xF85DDF44 =1/ln2 tail*/ + +double +__ieee754_pow(double x, double y) +{ + double z,ax,z_h,z_l,p_h,p_l; + double y1,t1,t2,r,s,t,u,v,w; + int32_t i,j,k,yisint,n; + int32_t hx,hy,ix,iy; + u_int32_t lx,ly; + + EXTRACT_WORDS(hx,lx,x); + EXTRACT_WORDS(hy,ly,y); + ix = hx&0x7fffffff; iy = hy&0x7fffffff; + + /* y==zero: x**0 = 1 */ + if((iy|ly)==0) return one; + + /* +-NaN return x+y */ + if(ix > 0x7ff00000 || ((ix==0x7ff00000)&&(lx!=0)) || + iy > 0x7ff00000 || ((iy==0x7ff00000)&&(ly!=0))) + return x+y; + + /* determine if y is an odd int when x < 0 + * yisint = 0 ... y is not an integer + * yisint = 1 ... y is an odd int + * yisint = 2 ... y is an even int + */ + yisint = 0; + if(hx<0) { + if(iy>=0x43400000) yisint = 2; /* even integer y */ + else if(iy>=0x3ff00000) { + k = (iy>>20)-0x3ff; /* exponent */ + if(k>20) { + j = ly>>(52-k); + if((u_int32_t)(j<<(52-k))==ly) yisint = 2-(j&1); + } else if(ly==0) { + j = iy>>(20-k); + if((j<<(20-k))==iy) yisint = 2-(j&1); + } + } + } + + /* special value of y */ + if(ly==0) { + if (iy==0x7ff00000) { /* y is +-inf */ + if(((ix-0x3ff00000)|lx)==0) + return y - y; /* inf**+-1 is NaN */ + else if (ix >= 0x3ff00000)/* (|x|>1)**+-inf = inf,0 */ + return (hy>=0)? y: zero; + else /* (|x|<1)**-,+inf = inf,0 */ + return (hy<0)?-y: zero; + } + if(iy==0x3ff00000) { /* y is +-1 */ + if(hy<0) return one/x; else return x; + } + if(hy==0x40000000) return x*x; /* y is 2 */ + if(hy==0x3fe00000) { /* y is 0.5 */ + if(hx>=0) /* x >= +0 */ + return __ieee754_sqrt(x); + } + } + + ax = fabs(x); + /* special value of x */ + if(lx==0) { + if(ix==0x7ff00000||ix==0||ix==0x3ff00000){ + z = ax; /*x is +-0,+-inf,+-1*/ + if(hy<0) z = one/z; /* z = (1/|x|) */ + if(hx<0) { + if(((ix-0x3ff00000)|yisint)==0) { + z = (z-z)/(z-z); /* (-1)**non-int is NaN */ + } else if(yisint==1) + z = -z; /* (x<0)**odd = -(|x|**odd) */ + } + return z; + } + } + + n = (hx>>31)+1; + + /* (x<0)**(non-int) is NaN */ + if((n|yisint)==0) { + errno = EDOM; + return (x-x)/(x-x); + } + + s = one; /* s (sign of result -ve**odd) = -1 else = 1 */ + if((n|(yisint-1))==0) s = -one;/* (-ve)**(odd int) */ + + /* |y| is huge */ + if(iy>0x41e00000) { /* if |y| > 2**31 */ + if(iy>0x43f00000){ /* if |y| > 2**64, must o/uflow */ + if(ix<=0x3fefffff) return (hy<0)? huge*huge:tiny*tiny; + if(ix>=0x3ff00000) return (hy>0)? huge*huge:tiny*tiny; + } + /* over/underflow if x is not close to one */ + if(ix<0x3fefffff) return (hy<0)? s*huge*huge:s*tiny*tiny; + if(ix>0x3ff00000) return (hy>0)? s*huge*huge:s*tiny*tiny; + /* now |1-x| is tiny <= 2**-20, suffice to compute + log(x) by x-x^2/2+x^3/3-x^4/4 */ + t = ax-one; /* t has 20 trailing zeros */ + w = (t*t)*(0.5-t*(0.3333333333333333333333-t*0.25)); + u = ivln2_h*t; /* ivln2_h has 21 sig. bits */ + v = t*ivln2_l-w*ivln2; + t1 = u+v; + SET_LOW_WORD(t1,0); + t2 = v-(t1-u); + } else { + double ss,s2,s_h,s_l,t_h,t_l; + n = 0; + /* take care subnormal number */ + if(ix<0x00100000) + {ax *= two53; n -= 53; GET_HIGH_WORD(ix,ax); } + n += ((ix)>>20)-0x3ff; + j = ix&0x000fffff; + /* determine interval */ + ix = j|0x3ff00000; /* normalize ix */ + if(j<=0x3988E) k=0; /* |x|>1)|0x20000000)+0x00080000+(k<<18)); + t_l = ax - (t_h-bp[k]); + s_l = v*((u-s_h*t_h)-s_h*t_l); + /* compute log(ax) */ + s2 = ss*ss; + r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6))))); + r += s_l*(s_h+ss); + s2 = s_h*s_h; + t_h = 3.0+s2+r; + SET_LOW_WORD(t_h,0); + t_l = r-((t_h-3.0)-s2); + /* u+v = ss*(1+...) */ + u = s_h*t_h; + v = s_l*t_h+t_l*ss; + /* 2/(3log2)*(ss+...) */ + p_h = u+v; + SET_LOW_WORD(p_h,0); + p_l = v-(p_h-u); + z_h = cp_h*p_h; /* cp_h+cp_l = 2/(3*log2) */ + z_l = cp_l*p_h+p_l*cp+dp_l[k]; + /* log2(ax) = (ss+..)*2/(3*log2) = n + dp_h + z_h + z_l */ + t = (double)n; + t1 = (((z_h+z_l)+dp_h[k])+t); + SET_LOW_WORD(t1,0); + t2 = z_l-(((t1-t)-dp_h[k])-z_h); + } + + /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */ + y1 = y; + SET_LOW_WORD(y1,0); + p_l = (y-y1)*t1+y*t2; + p_h = y1*t1; + z = p_l+p_h; + EXTRACT_WORDS(j,i,z); + if (j>=0x40900000) { /* z >= 1024 */ + if(((j-0x40900000)|i)!=0) /* if z > 1024 */ + return s*huge*huge; /* overflow */ + else { + if(p_l+ovt>z-p_h) return s*huge*huge; /* overflow */ + } + } else if((j&0x7fffffff)>=0x4090cc00 ) { /* z <= -1075 */ + if(((j-0xc090cc00)|i)!=0) /* z < -1075 */ + return s*tiny*tiny; /* underflow */ + else { + if(p_l<=z-p_h) return s*tiny*tiny; /* underflow */ + } + } + /* + * compute 2**(p_h+p_l) + */ + i = j&0x7fffffff; + k = (i>>20)-0x3ff; + n = 0; + if(i>0x3fe00000) { /* if |z| > 0.5, set n = [z+0.5] */ + n = j+(0x00100000>>(k+1)); + k = ((n&0x7fffffff)>>20)-0x3ff; /* new k for n */ + t = zero; + SET_HIGH_WORD(t,n&~(0x000fffff>>k)); + n = ((n&0x000fffff)|0x00100000)>>(20-k); + if(j<0) n = -n; + p_h -= t; + } + t = p_l+p_h; + SET_LOW_WORD(t,0); + u = t*lg2_h; + v = (p_l-(t-p_h))*lg2+t*lg2_l; + z = u+v; + w = v-(z-u); + t = z*z; + t1 = z - t*(P1+t*(P2+t*(P3+t*(P4+t*P5)))); + r = (z*t1)/(t1-two)-(w+z*w); + z = one-(r-z); + GET_HIGH_WORD(j,z); + j += (n<<20); + if((j>>20)<=0) z = scalbn(z,n); /* subnormal output */ + else SET_HIGH_WORD(z,j); + return s*z; +} diff --git a/StdLib/LibC/Math/e_rem_pio2.c b/StdLib/LibC/Math/e_rem_pio2.c new file mode 100644 index 0000000000..7b06d1775f --- /dev/null +++ b/StdLib/LibC/Math/e_rem_pio2.c @@ -0,0 +1,169 @@ +/* @(#)e_rem_pio2.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: e_rem_pio2.c,v 1.11 2002/05/26 22:01:52 wiz Exp $"); +#endif + +/* __ieee754_rem_pio2(x,y) + * + * return the remainder of x rem pi/2 in y[0]+y[1] + * use __kernel_rem_pio2() + */ + +#include "math.h" +#include "math_private.h" + +/* + * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi + */ +static const int32_t two_over_pi[] = { +0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62, +0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A, +0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129, +0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41, +0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8, +0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF, +0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5, +0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08, +0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3, +0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880, +0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B, +}; + +static const int32_t npio2_hw[] = { +0x3FF921FB, 0x400921FB, 0x4012D97C, 0x401921FB, 0x401F6A7A, 0x4022D97C, +0x4025FDBB, 0x402921FB, 0x402C463A, 0x402F6A7A, 0x4031475C, 0x4032D97C, +0x40346B9C, 0x4035FDBB, 0x40378FDB, 0x403921FB, 0x403AB41B, 0x403C463A, +0x403DD85A, 0x403F6A7A, 0x40407E4C, 0x4041475C, 0x4042106C, 0x4042D97C, +0x4043A28C, 0x40446B9C, 0x404534AC, 0x4045FDBB, 0x4046C6CB, 0x40478FDB, +0x404858EB, 0x404921FB, +}; + +/* + * invpio2: 53 bits of 2/pi + * pio2_1: first 33 bit of pi/2 + * pio2_1t: pi/2 - pio2_1 + * pio2_2: second 33 bit of pi/2 + * pio2_2t: pi/2 - (pio2_1+pio2_2) + * pio2_3: third 33 bit of pi/2 + * pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) + */ + +static const double +zero = 0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */ +half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */ +two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */ +invpio2 = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */ +pio2_1 = 1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */ +pio2_1t = 6.07710050650619224932e-11, /* 0x3DD0B461, 0x1A626331 */ +pio2_2 = 6.07710050630396597660e-11, /* 0x3DD0B461, 0x1A600000 */ +pio2_2t = 2.02226624879595063154e-21, /* 0x3BA3198A, 0x2E037073 */ +pio2_3 = 2.02226624871116645580e-21, /* 0x3BA3198A, 0x2E000000 */ +pio2_3t = 8.47842766036889956997e-32; /* 0x397B839A, 0x252049C1 */ + +int32_t +__ieee754_rem_pio2(double x, double *y) +{ + double z,w,t,r,fn; + double tx[3]; + int32_t e0,i,j,nx,n,ix,hx; + u_int32_t low; + + z = 0; + GET_HIGH_WORD(hx,x); /* high word of x */ + ix = hx&0x7fffffff; + if(ix<=0x3fe921fb) /* |x| ~<= pi/4 , no need for reduction */ + {y[0] = x; y[1] = 0; return 0;} + if(ix<0x4002d97c) { /* |x| < 3pi/4, special case with n=+-1 */ + if(hx>0) { + z = x - pio2_1; + if(ix!=0x3ff921fb) { /* 33+53 bit pi is good enough */ + y[0] = z - pio2_1t; + y[1] = (z-y[0])-pio2_1t; + } else { /* near pi/2, use 33+33+53 bit pi */ + z -= pio2_2; + y[0] = z - pio2_2t; + y[1] = (z-y[0])-pio2_2t; + } + return 1; + } else { /* negative x */ + z = x + pio2_1; + if(ix!=0x3ff921fb) { /* 33+53 bit pi is good enough */ + y[0] = z + pio2_1t; + y[1] = (z-y[0])+pio2_1t; + } else { /* near pi/2, use 33+33+53 bit pi */ + z += pio2_2; + y[0] = z + pio2_2t; + y[1] = (z-y[0])+pio2_2t; + } + return -1; + } + } + if(ix<=0x413921fb) { /* |x| ~<= 2^19*(pi/2), medium size */ + t = fabs(x); + n = (int32_t) (t*invpio2+half); + fn = (double)n; + r = t-fn*pio2_1; + w = fn*pio2_1t; /* 1st round good to 85 bit */ + if(n<32&&ix!=npio2_hw[n-1]) { + y[0] = r-w; /* quick check no cancellation */ + } else { + u_int32_t high; + j = ix>>20; + y[0] = r-w; + GET_HIGH_WORD(high,y[0]); + i = j-((high>>20)&0x7ff); + if(i>16) { /* 2nd iteration needed, good to 118 */ + t = r; + w = fn*pio2_2; + r = t-w; + w = fn*pio2_2t-((t-r)-w); + y[0] = r-w; + GET_HIGH_WORD(high,y[0]); + i = j-((high>>20)&0x7ff); + if(i>49) { /* 3rd iteration need, 151 bits acc */ + t = r; /* will cover all possible cases */ + w = fn*pio2_3; + r = t-w; + w = fn*pio2_3t-((t-r)-w); + y[0] = r-w; + } + } + } + y[1] = (r-y[0])-w; + if(hx<0) {y[0] = -y[0]; y[1] = -y[1]; return -n;} + else return n; + } + /* + * all other (large) arguments + */ + if(ix>=0x7ff00000) { /* x is inf or NaN */ + y[0]=y[1]=x-x; return 0; + } + /* set z = scalbn(|x|,ilogb(x)-23) */ + GET_LOW_WORD(low,x); + SET_LOW_WORD(z,low); + e0 = (ix>>20)-1046; /* e0 = ilogb(z)-23; */ + SET_HIGH_WORD(z, ix - ((int32_t)(e0<<20))); + for(i=0;i<2;i++) { + tx[i] = (double)((int32_t)(z)); + z = (z-tx[i])*two24; + } + tx[2] = z; + nx = 3; + while(tx[nx-1]==zero) nx--; /* skip zero term */ + n = __kernel_rem_pio2(tx,y,e0,nx,2,two_over_pi); + if(hx<0) {y[0] = -y[0]; y[1] = -y[1]; return -n;} + return n; +} diff --git a/StdLib/LibC/Math/e_sinh.c b/StdLib/LibC/Math/e_sinh.c new file mode 100644 index 0000000000..421b515cd4 --- /dev/null +++ b/StdLib/LibC/Math/e_sinh.c @@ -0,0 +1,79 @@ +/* @(#)e_sinh.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: e_sinh.c,v 1.11 2002/05/26 22:01:52 wiz Exp $"); +#endif + +#include "math.h" +#include "math_private.h" + +/* __ieee754_sinh(x) + * Method : + * mathematically sinh(x) if defined to be (exp(x)-exp(-x))/2 + * 1. Replace x by |x| (sinh(-x) = -sinh(x)). + * 2. + * E + E/(E+1) + * 0 <= x <= 22 : sinh(x) := --------------, E=expm1(x) + * 2 + * + * 22 <= x <= lnovft : sinh(x) := exp(x)/2 + * lnovft <= x <= ln2ovft: sinh(x) := exp(x/2)/2 * exp(x/2) + * ln2ovft < x : sinh(x) := x*shuge (overflow) + * + * Special cases: + * sinh(x) is |x| if x is +INF, -INF, or NaN. + * only sinh(0)=0 is exact for finite x. + */ + +static const double one = 1.0, shuge = 1.0e307; + +double +__ieee754_sinh(double x) +{ + double t,w,h; + int32_t ix,jx; + u_int32_t lx; + + /* High word of |x|. */ + GET_HIGH_WORD(jx,x); + ix = jx&0x7fffffff; + + /* x is INF or NaN */ + if(ix>=0x7ff00000) return x+x; + + h = 0.5; + if (jx<0) h = -h; + /* |x| in [0,22], return sign(x)*0.5*(E+E/(E+1))) */ + if (ix < 0x40360000) { /* |x|<22 */ + if (ix<0x3e300000) /* |x|<2**-28 */ + if(shuge+x>one) return x;/* sinh(tiny) = tiny with inexact */ + t = expm1(fabs(x)); + if(ix<0x3ff00000) return h*(2.0*t-t*t/(t+one)); + return h*(t+t/(t+one)); + } + + /* |x| in [22, log(maxdouble)] return 0.5*exp(|x|) */ + if (ix < 0x40862E42) return h*__ieee754_exp(fabs(x)); + + /* |x| in [log(maxdouble), overflowthresold] */ + GET_LOW_WORD(lx,x); + if (ix<0x408633CE || ((ix==0x408633ce)&&(lx<=(u_int32_t)0x8fb9f87d))) { + w = __ieee754_exp(0.5*fabs(x)); + t = h*w; + return t*w; + } + + /* |x| > overflowthresold, sinh(x) overflow */ + return x*shuge; +} diff --git a/StdLib/LibC/Math/e_sqrt.c b/StdLib/LibC/Math/e_sqrt.c new file mode 100644 index 0000000000..2a772f60b4 --- /dev/null +++ b/StdLib/LibC/Math/e_sqrt.c @@ -0,0 +1,464 @@ +/** @file + Compute the logrithm of x. + + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + + e_sqrt.c 5.1 93/09/24 + NetBSD: e_sqrt.c,v 1.12 2002/05/26 22:01:52 wiz Exp +**/ +#include +#include + +#include +#include "math.h" +#include "math_private.h" + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ +// potential divide by 0 -- near line 129, (x-x)/(x-x) is on purpose +#pragma warning ( disable : 4723 ) +#endif + +/* __ieee754_sqrt(x) + * Return correctly rounded sqrt. + * ------------------------------------------ + * | Use the hardware sqrt if you have one | + * ------------------------------------------ + * Method: + * Bit by bit method using integer arithmetic. (Slow, but portable) + * 1. Normalization + * Scale x to y in [1,4) with even powers of 2: + * find an integer k such that 1 <= (y=x*2^(2k)) < 4, then + * sqrt(x) = 2^k * sqrt(y) + * 2. Bit by bit computation + * Let q = sqrt(y) truncated to i bit after binary point (q = 1), + * i 0 + * i+1 2 + * s = 2*q , and y = 2 * ( y - q ). (1) + * i i i i + * + * To compute q from q , one checks whether + * i+1 i + * + * -(i+1) 2 + * (q + 2 ) <= y. (2) + * i + * -(i+1) + * If (2) is false, then q = q ; otherwise q = q + 2 . + * i+1 i i+1 i + * + * With some algebric manipulation, it is not difficult to see + * that (2) is equivalent to + * -(i+1) + * s + 2 <= y (3) + * i i + * + * The advantage of (3) is that s and y can be computed by + * i i + * the following recurrence formula: + * if (3) is false + * + * s = s , y = y ; (4) + * i+1 i i+1 i + * + * otherwise, + * -i -(i+1) + * s = s + 2 , y = y - s - 2 (5) + * i+1 i i+1 i i + * + * One may easily use induction to prove (4) and (5). + * Note. Since the left hand side of (3) contain only i+2 bits, + * it does not necessary to do a full (53-bit) comparison + * in (3). + * 3. Final rounding + * After generating the 53 bits result, we compute one more bit. + * Together with the remainder, we can decide whether the + * result is exact, bigger than 1/2ulp, or less than 1/2ulp + * (it will never equal to 1/2ulp). + * The rounding mode can be detected by checking whether + * huge + tiny is equal to huge, and whether huge - tiny is + * equal to huge for some floating point number "huge" and "tiny". + * + * Special cases: + * sqrt(+-0) = +-0 ... exact + * sqrt(inf) = inf + * sqrt(-ve) = NaN ... with invalid signal + * sqrt(NaN) = NaN ... with invalid signal for signaling NaN + * + * Other methods : see the appended file at the end of the program below. + *--------------- + */ + +static const double one = 1.0, tiny=1.0e-300; + +double +__ieee754_sqrt(double x) +{ + double z; + int32_t sign = (int)0x80000000; + int32_t ix0,s0,q,m,t,i; + u_int32_t r,t1,s1,ix1,q1; + + EXTRACT_WORDS(ix0,ix1,x); + + /* take care of Inf and NaN */ + if((ix0&0x7ff00000)==0x7ff00000) { + return x*x+x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf + sqrt(-inf)=sNaN */ + } + /* take care of zero */ + if(ix0<=0) { + if(((ix0&(~sign))|ix1)==0) return x;/* sqrt(+-0) = +-0 */ + else if(ix0<0) { + errno = EDOM; + return (x-x)/(x-x); /* sqrt(-ve) = sNaN */ + } + } + /* normalize x */ + m = (ix0>>20); + if(m==0) { /* subnormal x */ + while(ix0==0) { + m -= 21; + ix0 |= (ix1>>11); ix1 <<= 21; + } + for(i=0;(ix0&0x00100000)==0;i++) ix0<<=1; + m -= i-1; + ix0 |= (ix1>>(32-i)); + ix1 <<= i; + } + m -= 1023; /* unbias exponent */ + ix0 = (ix0&0x000fffff)|0x00100000; + if(m&1){ /* odd m, double x to make it even */ + ix0 += ix0 + ((ix1&sign)>>31); + ix1 += ix1; + } + m >>= 1; /* m = [m/2] */ + + /* generate sqrt(x) bit by bit */ + ix0 += ix0 + ((ix1&sign)>>31); + ix1 += ix1; + q = q1 = s0 = s1 = 0; /* [q,q1] = sqrt(x) */ + r = 0x00200000; /* r = moving bit from right to left */ + + while(r!=0) { + t = s0+r; + if(t<=ix0) { + s0 = t+r; + ix0 -= t; + q += r; + } + ix0 += ix0 + ((ix1&sign)>>31); + ix1 += ix1; + r>>=1; + } + + r = sign; + while(r!=0) { + t1 = s1+r; + t = s0; + if((t>31); + ix1 += ix1; + r>>=1; + } + + /* use floating add to find out rounding direction */ + if((ix0|ix1)!=0) { + z = one-tiny; /* trigger inexact flag */ + if (z>=one) { + z = one+tiny; + if (q1==(u_int32_t)0xffffffff) { q1=0; q += 1;} + else if (z>one) { + if (q1==(u_int32_t)0xfffffffe) q+=1; + q1+=2; + } else + q1 += (q1&1); + } + } + ix0 = (q>>1)+0x3fe00000; + ix1 = q1>>1; + if ((q&1)==1) ix1 |= sign; + ix0 += (m <<20); + INSERT_WORDS(z,ix0,ix1); + return z; +} + +/* +Other methods (use floating-point arithmetic) +------------- +(This is a copy of a drafted paper by Prof W. Kahan +and K.C. Ng, written in May, 1986) + + Two algorithms are given here to implement sqrt(x) + (IEEE double precision arithmetic) in software. + Both supply sqrt(x) correctly rounded. The first algorithm (in + Section A) uses newton iterations and involves four divisions. + The second one uses reciproot iterations to avoid division, but + requires more multiplications. Both algorithms need the ability + to chop results of arithmetic operations instead of round them, + and the INEXACT flag to indicate when an arithmetic operation + is executed exactly with no roundoff error, all part of the + standard (IEEE 754-1985). The ability to perform shift, add, + subtract and logical AND operations upon 32-bit words is needed + too, though not part of the standard. + +A. sqrt(x) by Newton Iteration + + (1) Initial approximation + + Let x0 and x1 be the leading and the trailing 32-bit words of + a floating point number x (in IEEE double format) respectively + + 1 11 52 ...widths + ------------------------------------------------------ + x: |s| e | f | + ------------------------------------------------------ + msb lsb msb lsb ...order + + + ------------------------ ------------------------ + x0: |s| e | f1 | x1: | f2 | + ------------------------ ------------------------ + + By performing shifts and subtracts on x0 and x1 (both regarded + as integers), we obtain an 8-bit approximation of sqrt(x) as + follows. + + k := (x0>>1) + 0x1ff80000; + y0 := k - T1[31&(k>>15)]. ... y ~ sqrt(x) to 8 bits + Here k is a 32-bit integer and T1[] is an integer array containing + correction terms. Now magically the floating value of y (y's + leading 32-bit word is y0, the value of its trailing word is 0) + approximates sqrt(x) to almost 8-bit. + + Value of T1: + static int T1[32]= { + 0, 1024, 3062, 5746, 9193, 13348, 18162, 23592, + 29598, 36145, 43202, 50740, 58733, 67158, 75992, 85215, + 83599, 71378, 60428, 50647, 41945, 34246, 27478, 21581, + 16499, 12183, 8588, 5674, 3403, 1742, 661, 130,}; + + (2) Iterative refinement + + Apply Heron's rule three times to y, we have y approximates + sqrt(x) to within 1 ulp (Unit in the Last Place): + + y := (y+x/y)/2 ... almost 17 sig. bits + y := (y+x/y)/2 ... almost 35 sig. bits + y := y-(y-x/y)/2 ... within 1 ulp + + + Remark 1. + Another way to improve y to within 1 ulp is: + + y := (y+x/y) ... almost 17 sig. bits to 2*sqrt(x) + y := y - 0x00100006 ... almost 18 sig. bits to sqrt(x) + + 2 + (x-y )*y + y := y + 2* ---------- ...within 1 ulp + 2 + 3y + x + + + This formula has one division fewer than the one above; however, + it requires more multiplications and additions. Also x must be + scaled in advance to avoid spurious overflow in evaluating the + expression 3y*y+x. Hence it is not recommended uless division + is slow. If division is very slow, then one should use the + reciproot algorithm given in section B. + + (3) Final adjustment + + By twiddling y's last bit it is possible to force y to be + correctly rounded according to the prevailing rounding mode + as follows. Let r and i be copies of the rounding mode and + inexact flag before entering the square root program. Also we + use the expression y+-ulp for the next representable floating + numbers (up and down) of y. Note that y+-ulp = either fixed + point y+-1, or multiply y by nextafter(1,+-inf) in chopped + mode. + + I := FALSE; ... reset INEXACT flag I + R := RZ; ... set rounding mode to round-toward-zero + z := x/y; ... chopped quotient, possibly inexact + If(not I) then { ... if the quotient is exact + if(z=y) { + I := i; ... restore inexact flag + R := r; ... restore rounded mode + return sqrt(x):=y. + } else { + z := z - ulp; ... special rounding + } + } + i := TRUE; ... sqrt(x) is inexact + If (r=RN) then z=z+ulp ... rounded-to-nearest + If (r=RP) then { ... round-toward-+inf + y = y+ulp; z=z+ulp; + } + y := y+z; ... chopped sum + y0:=y0-0x00100000; ... y := y/2 is correctly rounded. + I := i; ... restore inexact flag + R := r; ... restore rounded mode + return sqrt(x):=y. + + (4) Special cases + + Square root of +inf, +-0, or NaN is itself; + Square root of a negative number is NaN with invalid signal. + + +B. sqrt(x) by Reciproot Iteration + + (1) Initial approximation + + Let x0 and x1 be the leading and the trailing 32-bit words of + a floating point number x (in IEEE double format) respectively + (see section A). By performing shifs and subtracts on x0 and y0, + we obtain a 7.8-bit approximation of 1/sqrt(x) as follows. + + k := 0x5fe80000 - (x0>>1); + y0:= k - T2[63&(k>>14)]. ... y ~ 1/sqrt(x) to 7.8 bits + + Here k is a 32-bit integer and T2[] is an integer array + containing correction terms. Now magically the floating + value of y (y's leading 32-bit word is y0, the value of + its trailing word y1 is set to zero) approximates 1/sqrt(x) + to almost 7.8-bit. + + Value of T2: + static int T2[64]= { + 0x1500, 0x2ef8, 0x4d67, 0x6b02, 0x87be, 0xa395, 0xbe7a, 0xd866, + 0xf14a, 0x1091b,0x11fcd,0x13552,0x14999,0x15c98,0x16e34,0x17e5f, + 0x18d03,0x19a01,0x1a545,0x1ae8a,0x1b5c4,0x1bb01,0x1bfde,0x1c28d, + 0x1c2de,0x1c0db,0x1ba73,0x1b11c,0x1a4b5,0x1953d,0x18266,0x16be0, + 0x1683e,0x179d8,0x18a4d,0x19992,0x1a789,0x1b445,0x1bf61,0x1c989, + 0x1d16d,0x1d77b,0x1dddf,0x1e2ad,0x1e5bf,0x1e6e8,0x1e654,0x1e3cd, + 0x1df2a,0x1d635,0x1cb16,0x1be2c,0x1ae4e,0x19bde,0x1868e,0x16e2e, + 0x1527f,0x1334a,0x11051,0xe951, 0xbe01, 0x8e0d, 0x5924, 0x1edd,}; + + (2) Iterative refinement + + Apply Reciproot iteration three times to y and multiply the + result by x to get an approximation z that matches sqrt(x) + to about 1 ulp. To be exact, we will have + -1ulp < sqrt(x)-z<1.0625ulp. + + ... set rounding mode to Round-to-nearest + y := y*(1.5-0.5*x*y*y) ... almost 15 sig. bits to 1/sqrt(x) + y := y*((1.5-2^-30)+0.5*x*y*y)... about 29 sig. bits to 1/sqrt(x) + ... special arrangement for better accuracy + z := x*y ... 29 bits to sqrt(x), with z*y<1 + z := z + 0.5*z*(1-z*y) ... about 1 ulp to sqrt(x) + + Remark 2. The constant 1.5-2^-30 is chosen to bias the error so that + (a) the term z*y in the final iteration is always less than 1; + (b) the error in the final result is biased upward so that + -1 ulp < sqrt(x) - z < 1.0625 ulp + instead of |sqrt(x)-z|<1.03125ulp. + + (3) Final adjustment + + By twiddling y's last bit it is possible to force y to be + correctly rounded according to the prevailing rounding mode + as follows. Let r and i be copies of the rounding mode and + inexact flag before entering the square root program. Also we + use the expression y+-ulp for the next representable floating + numbers (up and down) of y. Note that y+-ulp = either fixed + point y+-1, or multiply y by nextafter(1,+-inf) in chopped + mode. + + R := RZ; ... set rounding mode to round-toward-zero + switch(r) { + case RN: ... round-to-nearest + if(x<= z*(z-ulp)...chopped) z = z - ulp; else + if(x<= z*(z+ulp)...chopped) z = z; else z = z+ulp; + break; + case RZ:case RM: ... round-to-zero or round-to--inf + R:=RP; ... reset rounding mod to round-to-+inf + if(x=(z+ulp)*(z+ulp) ...rounded up) z = z+ulp; + break; + case RP: ... round-to-+inf + if(x>(z+ulp)*(z+ulp)...chopped) z = z+2*ulp; else + if(x>z*z ...chopped) z = z+ulp; + break; + } + + Remark 3. The above comparisons can be done in fixed point. For + example, to compare x and w=z*z chopped, it suffices to compare + x1 and w1 (the trailing parts of x and w), regarding them as + two's complement integers. + + ...Is z an exact square root? + To determine whether z is an exact square root of x, let z1 be the + trailing part of z, and also let x0 and x1 be the leading and + trailing parts of x. + + If ((z1&0x03ffffff)!=0) ... not exact if trailing 26 bits of z!=0 + I := 1; ... Raise Inexact flag: z is not exact + else { + j := 1 - [(x0>>20)&1] ... j = logb(x) mod 2 + k := z1 >> 26; ... get z's 25-th and 26-th + fraction bits + I := i or (k&j) or ((k&(j+j+1))!=(x1&3)); + } + R:= r ... restore rounded mode + return sqrt(x):=z. + + If multiplication is cheaper than the foregoing red tape, the + Inexact flag can be evaluated by + + I := i; + I := (z*z!=x) or I. + + Note that z*z can overwrite I; this value must be sensed if it is + True. + + Remark 4. If z*z = x exactly, then bit 25 to bit 0 of z1 must be + zero. + + -------------------- + z1: | f2 | + -------------------- + bit 31 bit 0 + + Further more, bit 27 and 26 of z1, bit 0 and 1 of x1, and the odd + or even of logb(x) have the following relations: + + ------------------------------------------------- + bit 27,26 of z1 bit 1,0 of x1 logb(x) + ------------------------------------------------- + 00 00 odd and even + 01 01 even + 10 10 odd + 10 00 even + 11 01 even + ------------------------------------------------- + + (4) Special cases (see (4) of Section A). + + */ + diff --git a/StdLib/LibC/Math/k_cos.c b/StdLib/LibC/Math/k_cos.c new file mode 100644 index 0000000000..e1746a11d3 --- /dev/null +++ b/StdLib/LibC/Math/k_cos.c @@ -0,0 +1,89 @@ +/* @(#)k_cos.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: k_cos.c,v 1.11 2002/05/26 22:01:53 wiz Exp $"); +#endif + +/* + * __kernel_cos( x, y ) + * kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164 + * Input x is assumed to be bounded by ~pi/4 in magnitude. + * Input y is the tail of x. + * + * Algorithm + * 1. Since cos(-x) = cos(x), we need only to consider positive x. + * 2. if x < 2^-27 (hx<0x3e400000 0), return 1 with inexact if x!=0. + * 3. cos(x) is approximated by a polynomial of degree 14 on + * [0,pi/4] + * 4 14 + * cos(x) ~ 1 - x*x/2 + C1*x + ... + C6*x + * where the remez error is + * + * | 2 4 6 8 10 12 14 | -58 + * |cos(x)-(1-.5*x +C1*x +C2*x +C3*x +C4*x +C5*x +C6*x )| <= 2 + * | | + * + * 4 6 8 10 12 14 + * 4. let r = C1*x +C2*x +C3*x +C4*x +C5*x +C6*x , then + * cos(x) = 1 - x*x/2 + r + * since cos(x+y) ~ cos(x) - sin(x)*y + * ~ cos(x) - x*y, + * a correction term is necessary in cos(x) and hence + * cos(x+y) = 1 - (x*x/2 - (r - x*y)) + * For better accuracy when x > 0.3, let qx = |x|/4 with + * the last 32 bits mask off, and if x > 0.78125, let qx = 0.28125. + * Then + * cos(x+y) = (1-qx) - ((x*x/2-qx) - (r-x*y)). + * Note that 1-qx and (x*x/2-qx) is EXACT here, and the + * magnitude of the latter is at least a quarter of x*x/2, + * thus, reducing the rounding error in the subtraction. + */ + +#include "math.h" +#include "math_private.h" + +static const double +one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ +C1 = 4.16666666666666019037e-02, /* 0x3FA55555, 0x5555554C */ +C2 = -1.38888888888741095749e-03, /* 0xBF56C16C, 0x16C15177 */ +C3 = 2.48015872894767294178e-05, /* 0x3EFA01A0, 0x19CB1590 */ +C4 = -2.75573143513906633035e-07, /* 0xBE927E4F, 0x809C52AD */ +C5 = 2.08757232129817482790e-09, /* 0x3E21EE9E, 0xBDB4B1C4 */ +C6 = -1.13596475577881948265e-11; /* 0xBDA8FAE9, 0xBE8838D4 */ + +double +__kernel_cos(double x, double y) +{ + double a,hz,z,r,qx; + int32_t ix; + GET_HIGH_WORD(ix,x); + ix &= 0x7fffffff; /* ix = |x|'s high word*/ + if(ix<0x3e400000) { /* if x < 2**27 */ + if(((int)x)==0) return one; /* generate inexact */ + } + z = x*x; + r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*C6))))); + if(ix < 0x3FD33333) /* if |x| < 0.3 */ + return one - (0.5*z - (z*r - x*y)); + else { + if(ix > 0x3fe90000) { /* x > 0.78125 */ + qx = 0.28125; + } else { + INSERT_WORDS(qx,ix-0x00200000,0); /* x/4 */ + } + hz = 0.5*z-qx; + a = one-qx; + return a - (hz - (z*r-x*y)); + } +} diff --git a/StdLib/LibC/Math/k_rem_pio2.c b/StdLib/LibC/Math/k_rem_pio2.c new file mode 100644 index 0000000000..af2857778d --- /dev/null +++ b/StdLib/LibC/Math/k_rem_pio2.c @@ -0,0 +1,305 @@ +/* @(#)k_rem_pio2.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: k_rem_pio2.c,v 1.11 2003/01/04 23:43:03 wiz Exp $"); +#endif + +/* + * __kernel_rem_pio2(x,y,e0,nx,prec,ipio2) + * double x[],y[]; int e0,nx,prec; int ipio2[]; + * + * __kernel_rem_pio2 return the last three digits of N with + * y = x - N*pi/2 + * so that |y| < pi/2. + * + * The method is to compute the integer (mod 8) and fraction parts of + * (2/pi)*x without doing the full multiplication. In general we + * skip the part of the product that are known to be a huge integer ( + * more accurately, = 0 mod 8 ). Thus the number of operations are + * independent of the exponent of the input. + * + * (2/pi) is represented by an array of 24-bit integers in ipio2[]. + * + * Input parameters: + * x[] The input value (must be positive) is broken into nx + * pieces of 24-bit integers in double precision format. + * x[i] will be the i-th 24 bit of x. The scaled exponent + * of x[0] is given in input parameter e0 (i.e., x[0]*2^e0 + * match x's up to 24 bits. + * + * Example of breaking a double positive z into x[0]+x[1]+x[2]: + * e0 = ilogb(z)-23 + * z = scalbn(z,-e0) + * for i = 0,1,2 + * x[i] = floor(z) + * z = (z-x[i])*2**24 + * + * + * y[] output result in an array of double precision numbers. + * The dimension of y[] is: + * 24-bit precision 1 + * 53-bit precision 2 + * 64-bit precision 2 + * 113-bit precision 3 + * The actual value is the sum of them. Thus for 113-bit + * precison, one may have to do something like: + * + * long double t,w,r_head, r_tail; + * t = (long double)y[2] + (long double)y[1]; + * w = (long double)y[0]; + * r_head = t+w; + * r_tail = w - (r_head - t); + * + * e0 The exponent of x[0] + * + * nx dimension of x[] + * + * prec an integer indicating the precision: + * 0 24 bits (single) + * 1 53 bits (double) + * 2 64 bits (extended) + * 3 113 bits (quad) + * + * ipio2[] + * integer array, contains the (24*i)-th to (24*i+23)-th + * bit of 2/pi after binary point. The corresponding + * floating value is + * + * ipio2[i] * 2^(-24(i+1)). + * + * External function: + * double scalbn(), floor(); + * + * + * Here is the description of some local variables: + * + * jk jk+1 is the initial number of terms of ipio2[] needed + * in the computation. The recommended value is 2,3,4, + * 6 for single, double, extended,and quad. + * + * jz local integer variable indicating the number of + * terms of ipio2[] used. + * + * jx nx - 1 + * + * jv index for pointing to the suitable ipio2[] for the + * computation. In general, we want + * ( 2^e0*x[0] * ipio2[jv-1]*2^(-24jv) )/8 + * is an integer. Thus + * e0-3-24*jv >= 0 or (e0-3)/24 >= jv + * Hence jv = max(0,(e0-3)/24). + * + * jp jp+1 is the number of terms in PIo2[] needed, jp = jk. + * + * q[] double array with integral value, representing the + * 24-bits chunk of the product of x and 2/pi. + * + * q0 the corresponding exponent of q[0]. Note that the + * exponent for q[i] would be q0-24*i. + * + * PIo2[] double precision array, obtained by cutting pi/2 + * into 24 bits chunks. + * + * f[] ipio2[] in floating point + * + * iq[] integer array by breaking up q[] in 24-bits chunk. + * + * fq[] final product of x*(2/pi) in fq[0],..,fq[jk] + * + * ih integer. If >0 it indicates q[] is >= 0.5, hence + * it also indicates the *sign* of the result. + * + */ + + +/* + * Constants: + * The hexadecimal values are the intended ones for the following + * constants. The decimal values may be used, provided that the + * compiler will convert from decimal to binary accurately enough + * to produce the hexadecimal values shown. + */ + +#include "math.h" +#include "math_private.h" + +static const int init_jk[] = {2,3,4,6}; /* initial value for jk */ + +static const double PIo2[] = { + 1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */ + 7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */ + 5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */ + 3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */ + 1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */ + 1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */ + 2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */ + 2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */ +}; + +static const double +zero = 0.0, +one = 1.0, +two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */ +twon24 = 5.96046447753906250000e-08; /* 0x3E700000, 0x00000000 */ + +int +__kernel_rem_pio2(double *x, double *y, int e0, int nx, int prec, const int32_t *ipio2) +{ + int32_t jz,jx,jv,jp,jk,carry,n,iq[20],i,j,k,m,q0,ih; + double z,fw,f[20],fq[20],q[20]; + + /* initialize jk*/ + jk = init_jk[prec]; + jp = jk; + + /* determine jx,jv,q0, note that 3>q0 */ + jx = nx-1; + jv = (e0-3)/24; if(jv<0) jv=0; + q0 = e0-24*(jv+1); + + /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */ + j = jv-jx; m = jx+jk; + for(i=0;i<=m;i++,j++) f[i] = (j<0)? zero : (double) ipio2[j]; + + /* compute q[0],q[1],...q[jk] */ + for (i=0;i<=jk;i++) { + for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j]; q[i] = fw; + } + + jz = jk; +recompute: + /* distill q[] into iq[] reversingly */ + for(i=0,j=jz,z=q[jz];j>0;i++,j--) { + fw = (double)((int32_t)(twon24* z)); + iq[i] = (int32_t)(z-two24*fw); + z = q[j-1]+fw; + } + + /* compute n */ + z = scalbn(z,q0); /* actual value of z */ + z -= 8.0*floor(z*0.125); /* trim off integer >= 8 */ + n = (int32_t) z; + z -= (double)n; + ih = 0; + if(q0>0) { /* need iq[jz-1] to determine n */ + i = (iq[jz-1]>>(24-q0)); n += i; + iq[jz-1] -= i<<(24-q0); + ih = iq[jz-1]>>(23-q0); + } + else if(q0==0) ih = iq[jz-1]>>23; + else if(z>=0.5) ih=2; + + if(ih>0) { /* q > 0.5 */ + n += 1; carry = 0; + for(i=0;i0) { /* rare case: chance is 1 in 12 */ + switch(q0) { + case 1: + iq[jz-1] &= 0x7fffff; break; + case 2: + iq[jz-1] &= 0x3fffff; break; + } + } + if(ih==2) { + z = one - z; + if(carry!=0) z -= scalbn(one,q0); + } + } + + /* check if recomputation is needed */ + if(z==zero) { + j = 0; + for (i=jz-1;i>=jk;i--) j |= iq[i]; + if(j==0) { /* need recomputation */ + for(k=1;iq[jk-k]==0;k++); /* k = no. of terms needed */ + + for(i=jz+1;i<=jz+k;i++) { /* add q[jz+1] to q[jz+k] */ + f[jx+i] = (double) ipio2[jv+i]; + for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j]; + q[i] = fw; + } + jz += k; + goto recompute; + } + } + + /* chop off zero terms */ + if(z==0.0) { + jz -= 1; q0 -= 24; + while(iq[jz]==0) { jz--; q0-=24;} + } else { /* break z into 24-bit if necessary */ + z = scalbn(z,-q0); + if(z>=two24) { + fw = (double)((int32_t)(twon24*z)); + iq[jz] = (int32_t)(z-two24*fw); + jz += 1; q0 += 24; + iq[jz] = (int32_t) fw; + } else iq[jz] = (int32_t) z ; + } + + /* convert integer "bit" chunk to floating-point value */ + fw = scalbn(one,q0); + for(i=jz;i>=0;i--) { + q[i] = fw*(double)iq[i]; fw*=twon24; + } + + /* compute PIo2[0,...,jp]*q[jz,...,0] */ + for(i=jz;i>=0;i--) { + for(fw=0.0,k=0;k<=jp&&k<=jz-i;k++) fw += PIo2[k]*q[i+k]; + fq[jz-i] = fw; + } + + /* compress fq[] into y[] */ + switch(prec) { + case 0: + fw = 0.0; + for (i=jz;i>=0;i--) fw += fq[i]; + y[0] = (ih==0)? fw: -fw; + break; + case 1: + case 2: + fw = 0.0; + for (i=jz;i>=0;i--) fw += fq[i]; + y[0] = (ih==0)? fw: -fw; + fw = fq[0]-fw; + for (i=1;i<=jz;i++) fw += fq[i]; + y[1] = (ih==0)? fw: -fw; + break; + case 3: /* painful */ + for (i=jz;i>0;i--) { + fw = fq[i-1]+fq[i]; + fq[i] += fq[i-1]-fw; + fq[i-1] = fw; + } + for (i=jz;i>1;i--) { + fw = fq[i-1]+fq[i]; + fq[i] += fq[i-1]-fw; + fq[i-1] = fw; + } + for (fw=0.0,i=jz;i>=2;i--) fw += fq[i]; + if(ih==0) { + y[0] = fq[0]; y[1] = fq[1]; y[2] = fw; + } else { + y[0] = -fq[0]; y[1] = -fq[1]; y[2] = -fw; + } + } + return n&7; +} diff --git a/StdLib/LibC/Math/k_sin.c b/StdLib/LibC/Math/k_sin.c new file mode 100644 index 0000000000..9e4c22d03d --- /dev/null +++ b/StdLib/LibC/Math/k_sin.c @@ -0,0 +1,72 @@ +/* @(#)k_sin.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: k_sin.c,v 1.11 2002/05/26 22:01:53 wiz Exp $"); +#endif + +/* __kernel_sin( x, y, iy) + * kernel sin function on [-pi/4, pi/4], pi/4 ~ 0.7854 + * Input x is assumed to be bounded by ~pi/4 in magnitude. + * Input y is the tail of x. + * Input iy indicates whether y is 0. (if iy=0, y assume to be 0). + * + * Algorithm + * 1. Since sin(-x) = -sin(x), we need only to consider positive x. + * 2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0. + * 3. sin(x) is approximated by a polynomial of degree 13 on + * [0,pi/4] + * 3 13 + * sin(x) ~ x + S1*x + ... + S6*x + * where + * + * |sin(x) 2 4 6 8 10 12 | -58 + * |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2 + * | x | + * + * 4. sin(x+y) = sin(x) + sin'(x')*y + * ~ sin(x) + (1-x*x/2)*y + * For better accuracy, let + * 3 2 2 2 2 + * r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6)))) + * then 3 2 + * sin(x) = x + (S1*x + (x *(r-y/2)+y)) + */ + +#include "math.h" +#include "math_private.h" + +static const double +half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */ +S1 = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */ +S2 = 8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */ +S3 = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */ +S4 = 2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */ +S5 = -2.50507602534068634195e-08, /* 0xBE5AE5E6, 0x8A2B9CEB */ +S6 = 1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */ + +double +__kernel_sin(double x, double y, int iy) +{ + double z,r,v; + int32_t ix; + GET_HIGH_WORD(ix,x); + ix &= 0x7fffffff; /* high word of x */ + if(ix<0x3e400000) /* |x| < 2**-27 */ + {if((int)x==0) return x;} /* generate inexact */ + z = x*x; + v = z*x; + r = S2+z*(S3+z*(S4+z*(S5+z*S6))); + if(iy==0) return x+v*(S1+z*r); + else return x-((z*(half*y-v*r)-y)-v*S1); +} diff --git a/StdLib/LibC/Math/k_tan.c b/StdLib/LibC/Math/k_tan.c new file mode 100644 index 0000000000..ad83a21d3b --- /dev/null +++ b/StdLib/LibC/Math/k_tan.c @@ -0,0 +1,156 @@ +/* @(#)k_tan.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: k_tan.c,v 1.12 2004/07/22 18:24:09 drochner Exp $"); +#endif + +/* __kernel_tan( x, y, k ) + * kernel tan function on [-pi/4, pi/4], pi/4 ~ 0.7854 + * Input x is assumed to be bounded by ~pi/4 in magnitude. + * Input y is the tail of x. + * Input k indicates whether tan (if k=1) or + * -1/tan (if k= -1) is returned. + * + * Algorithm + * 1. Since tan(-x) = -tan(x), we need only to consider positive x. + * 2. if x < 2^-28 (hx<0x3e300000 0), return x with inexact if x!=0. + * 3. tan(x) is approximated by a odd polynomial of degree 27 on + * [0,0.67434] + * 3 27 + * tan(x) ~ x + T1*x + ... + T13*x + * where + * + * |tan(x) 2 4 26 | -59.2 + * |----- - (1+T1*x +T2*x +.... +T13*x )| <= 2 + * | x | + * + * Note: tan(x+y) = tan(x) + tan'(x)*y + * ~ tan(x) + (1+x*x)*y + * Therefore, for better accuracy in computing tan(x+y), let + * 3 2 2 2 2 + * r = x *(T2+x *(T3+x *(...+x *(T12+x *T13)))) + * then + * 3 2 + * tan(x+y) = x + (T1*x + (x *(r+y)+y)) + * + * 4. For x in [0.67434,pi/4], let y = pi/4 - x, then + * tan(x) = tan(pi/4-y) = (1-tan(y))/(1+tan(y)) + * = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y))) + */ + +#include "math.h" +#include "math_private.h" + +static const double xxx[] = { + 3.33333333333334091986e-01, /* 3FD55555, 55555563 */ + 1.33333333333201242699e-01, /* 3FC11111, 1110FE7A */ + 5.39682539762260521377e-02, /* 3FABA1BA, 1BB341FE */ + 2.18694882948595424599e-02, /* 3F9664F4, 8406D637 */ + 8.86323982359930005737e-03, /* 3F8226E3, E96E8493 */ + 3.59207910759131235356e-03, /* 3F6D6D22, C9560328 */ + 1.45620945432529025516e-03, /* 3F57DBC8, FEE08315 */ + 5.88041240820264096874e-04, /* 3F4344D8, F2F26501 */ + 2.46463134818469906812e-04, /* 3F3026F7, 1A8D1068 */ + 7.81794442939557092300e-05, /* 3F147E88, A03792A6 */ + 7.14072491382608190305e-05, /* 3F12B80F, 32F0A7E9 */ + -1.85586374855275456654e-05, /* BEF375CB, DB605373 */ + 2.59073051863633712884e-05, /* 3EFB2A70, 74BF7AD4 */ +/* one */ 1.00000000000000000000e+00, /* 3FF00000, 00000000 */ +/* pio4 */ 7.85398163397448278999e-01, /* 3FE921FB, 54442D18 */ +/* pio4lo */ 3.06161699786838301793e-17 /* 3C81A626, 33145C07 */ +}; +#define one xxx[13] +#define pio4 xxx[14] +#define pio4lo xxx[15] +#define T xxx + +double +__kernel_tan(double x, double y, int iy) +{ + double z, r, v, w, s; + int32_t ix, hx; + + GET_HIGH_WORD(hx, x); /* high word of x */ + ix = hx & 0x7fffffff; /* high word of |x| */ + if (ix < 0x3e300000) { /* x < 2**-28 */ + if ((int) x == 0) { /* generate inexact */ + u_int32_t low; + GET_LOW_WORD(low, x); + if(((ix | low) | (iy + 1)) == 0) + return one / fabs(x); + else { + if (iy == 1) + return x; + else { /* compute -1 / (x+y) carefully */ + double a, t; + + z = w = x + y; + SET_LOW_WORD(z, 0); + v = y - (z - x); + t = a = -one / w; + SET_LOW_WORD(t, 0); + s = one + t * z; + return t + a * (s + t * v); + } + } + } + } + if (ix >= 0x3FE59428) { /* |x| >= 0.6744 */ + if (hx < 0) { + x = -x; + y = -y; + } + z = pio4 - x; + w = pio4lo - y; + x = z + w; + y = 0.0; + } + z = x * x; + w = z * z; + /* + * Break x^5*(T[1]+x^2*T[2]+...) into + * x^5(T[1]+x^4*T[3]+...+x^20*T[11]) + + * x^5(x^2*(T[2]+x^4*T[4]+...+x^22*[T12])) + */ + r = T[1] + w * (T[3] + w * (T[5] + w * (T[7] + w * (T[9] + + w * T[11])))); + v = z * (T[2] + w * (T[4] + w * (T[6] + w * (T[8] + w * (T[10] + + w * T[12]))))); + s = z * x; + r = y + z * (s * (r + v) + y); + r += T[0] * s; + w = x + r; + if (ix >= 0x3FE59428) { + v = (double) iy; + return (double) (1 - ((hx >> 30) & 2)) * + (v - 2.0 * (x - (w * w / (w + v) - r))); + } + if (iy == 1) + return w; + else { + /* + * if allow error up to 2 ulp, simply return + * -1.0 / (x+r) here + */ + /* compute -1.0 / (x+r) accurately */ + double a, t; + z = w; + SET_LOW_WORD(z, 0); + v = r - (z - x); /* z+v = r+x */ + t = a = -1.0 / w; /* a = -1.0/w */ + SET_LOW_WORD(t, 0); + s = 1.0 + t * z; + return t + a * (s + t * v); + } +} diff --git a/StdLib/LibC/Math/math_private.h b/StdLib/LibC/Math/math_private.h new file mode 100644 index 0000000000..0aed7e7950 --- /dev/null +++ b/StdLib/LibC/Math/math_private.h @@ -0,0 +1,229 @@ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +/* + * from: @(#)fdlibm.h 5.1 93/09/24 + * $NetBSD: math_private.h,v 1.12 2005/07/21 12:55:58 christos Exp $ + */ + +#ifndef _MATH_PRIVATE_H_ +#define _MATH_PRIVATE_H_ + +#include + +/* The original fdlibm code used statements like: + n0 = ((*(int*)&one)>>29)^1; * index of high word * + ix0 = *(n0+(int*)&x); * high word of x * + ix1 = *((1-n0)+(int*)&x); * low word of x * + to dig two 32 bit words out of the 64 bit IEEE floating point + value. That is non-ANSI, and, moreover, the gcc instruction + scheduler gets it wrong. We instead use the following macros. + Unlike the original code, we determine the endianness at compile + time, not at run time; I don't see much benefit to selecting + endianness at run time. */ + +/* A union which permits us to convert between a double and two 32 bit + ints. */ + +/* + * The ARM ports are little endian except for the FPA word order which is + * big endian. + */ + +#if (BYTE_ORDER == BIG_ENDIAN) || (defined(__arm__) && !defined(__VFP_FP__)) + +typedef union +{ + double value; + struct + { + u_int32_t msw; + u_int32_t lsw; + } parts; +} ieee_double_shape_type; + +#endif + +#if (BYTE_ORDER == LITTLE_ENDIAN) && \ + !(defined(__arm__) && !defined(__VFP_FP__)) + +typedef union +{ + double value; + struct + { + u_int32_t lsw; + u_int32_t msw; + } parts; +} ieee_double_shape_type; + +#endif + +/* Get two 32 bit ints from a double. */ + +#define EXTRACT_WORDS(ix0,ix1,d) \ +do { \ + ieee_double_shape_type ew_u; \ + ew_u.value = (d); \ + (ix0) = ew_u.parts.msw; \ + (ix1) = ew_u.parts.lsw; \ +} while (0) + +/* Get the more significant 32 bit int from a double. */ + +#define GET_HIGH_WORD(i,d) \ +do { \ + ieee_double_shape_type gh_u; \ + gh_u.value = (d); \ + (i) = gh_u.parts.msw; \ +} while (0) + +/* Get the less significant 32 bit int from a double. */ + +#define GET_LOW_WORD(i,d) \ +do { \ + ieee_double_shape_type gl_u; \ + gl_u.value = (d); \ + (i) = gl_u.parts.lsw; \ +} while (0) + +/* Set a double from two 32 bit ints. */ + +#define INSERT_WORDS(d,ix0,ix1) \ +do { \ + ieee_double_shape_type iw_u; \ + iw_u.parts.msw = (ix0); \ + iw_u.parts.lsw = (ix1); \ + (d) = iw_u.value; \ +} while (0) + +/* Set the more significant 32 bits of a double from an int. */ + +#define SET_HIGH_WORD(d,v) \ +do { \ + ieee_double_shape_type sh_u; \ + sh_u.value = (d); \ + sh_u.parts.msw = (v); \ + (d) = sh_u.value; \ +} while (0) + +/* Set the less significant 32 bits of a double from an int. */ + +#define SET_LOW_WORD(d,v) \ +do { \ + ieee_double_shape_type sl_u; \ + sl_u.value = (d); \ + sl_u.parts.lsw = (v); \ + (d) = sl_u.value; \ +} while (0) + +/* A union which permits us to convert between a float and a 32 bit + int. */ + +typedef union +{ + float value; + u_int32_t word; +} ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i,d) \ +do { \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ +} while (0) + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD(d,i) \ +do { \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ +} while (0) + +/* ieee style elementary functions */ +extern double __ieee754_sqrt (double); +extern double __ieee754_acos (double); +extern double __ieee754_acosh (double); +extern double __ieee754_log (double); +extern double __ieee754_atanh (double); +extern double __ieee754_asin (double); +extern double __ieee754_atan2 (double, double); +extern double __ieee754_exp (double); +extern double __ieee754_cosh (double); +extern double __ieee754_fmod (double, double); +extern double __ieee754_pow (double, double); +extern double __ieee754_lgamma_r (double, int *); +extern double __ieee754_gamma_r (double, int *); +extern double __ieee754_lgamma (double); +extern double __ieee754_gamma (double); +extern double __ieee754_log10 (double); +extern double __ieee754_log2 (double); +extern double __ieee754_sinh (double); +extern double __ieee754_hypot (double, double); +extern double __ieee754_j0 (double); +extern double __ieee754_j1 (double); +extern double __ieee754_y0 (double); +extern double __ieee754_y1 (double); +extern double __ieee754_jn (int, double); +extern double __ieee754_yn (int, double); +extern double __ieee754_remainder (double, double); +extern int __ieee754_rem_pio2 (double,double*); +extern double __ieee754_scalb (double, double); + +/* fdlibm kernel function */ +extern double __kernel_standard (double, double, int); +extern double __kernel_sin (double, double, int); +extern double __kernel_cos (double, double); +extern double __kernel_tan (double, double, int); +extern int __kernel_rem_pio2 (double*,double*,int,int,int,const int*); + + +///* ieee style elementary float functions */ +//extern float __ieee754_sqrtf __P((float)); +//extern float __ieee754_acosf __P((float)); +//extern float __ieee754_acoshf __P((float)); +//extern float __ieee754_logf __P((float)); +//extern float __ieee754_atanhf __P((float)); +//extern float __ieee754_asinf __P((float)); +//extern float __ieee754_atan2f __P((float,float)); +//extern float __ieee754_expf __P((float)); +//extern float __ieee754_coshf __P((float)); +//extern float __ieee754_fmodf __P((float,float)); +//extern float __ieee754_powf __P((float,float)); +//extern float __ieee754_lgammaf_r __P((float,int *)); +//extern float __ieee754_gammaf_r __P((float,int *)); +//extern float __ieee754_lgammaf __P((float)); +//extern float __ieee754_gammaf __P((float)); +//extern float __ieee754_log10f __P((float)); +//extern float __ieee754_log2f __P((float)); +//extern float __ieee754_sinhf __P((float)); +//extern float __ieee754_hypotf __P((float,float)); +//extern float __ieee754_j0f __P((float)); +//extern float __ieee754_j1f __P((float)); +//extern float __ieee754_y0f __P((float)); +//extern float __ieee754_y1f __P((float)); +//extern float __ieee754_jnf __P((int,float)); +//extern float __ieee754_ynf __P((int,float)); +//extern float __ieee754_remainderf __P((float,float)); +//extern int __ieee754_rem_pio2f __P((float,float*)); +//extern float __ieee754_scalbf __P((float,float)); + +///* float versions of fdlibm kernel functions */ +//extern float __kernel_sinf __P((float,float,int)); +//extern float __kernel_cosf __P((float,float)); +//extern float __kernel_tanf __P((float,float,int)); +//extern int __kernel_rem_pio2f __P((float*,float*,int,int,int,const int*)); + +#endif /* _MATH_PRIVATE_H_ */ diff --git a/StdLib/LibC/Math/s_atan.c b/StdLib/LibC/Math/s_atan.c new file mode 100644 index 0000000000..cbaf359936 --- /dev/null +++ b/StdLib/LibC/Math/s_atan.c @@ -0,0 +1,120 @@ +/* @(#)s_atan.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: s_atan.c,v 1.11 2002/05/26 22:01:54 wiz Exp $"); +#endif + +/* atan(x) + * Method + * 1. Reduce x to positive by atan(x) = -atan(-x). + * 2. According to the integer k=4t+0.25 chopped, t=x, the argument + * is further reduced to one of the following intervals and the + * arctangent of t is evaluated by the corresponding formula: + * + * [0,7/16] atan(x) = t-t^3*(a1+t^2*(a2+...(a10+t^2*a11)...) + * [7/16,11/16] atan(x) = atan(1/2) + atan( (t-0.5)/(1+t/2) ) + * [11/16.19/16] atan(x) = atan( 1 ) + atan( (t-1)/(1+t) ) + * [19/16,39/16] atan(x) = atan(3/2) + atan( (t-1.5)/(1+1.5t) ) + * [39/16,INF] atan(x) = atan(INF) + atan( -1/t ) + * + * Constants: + * The hexadecimal values are the intended ones for the following + * constants. The decimal values may be used, provided that the + * compiler will convert from decimal to binary accurately enough + * to produce the hexadecimal values shown. + */ + +#include "math.h" +#include "math_private.h" + +static const double atanhi[] = { + 4.63647609000806093515e-01, /* atan(0.5)hi 0x3FDDAC67, 0x0561BB4F */ + 7.85398163397448278999e-01, /* atan(1.0)hi 0x3FE921FB, 0x54442D18 */ + 9.82793723247329054082e-01, /* atan(1.5)hi 0x3FEF730B, 0xD281F69B */ + 1.57079632679489655800e+00, /* atan(inf)hi 0x3FF921FB, 0x54442D18 */ +}; + +static const double atanlo[] = { + 2.26987774529616870924e-17, /* atan(0.5)lo 0x3C7A2B7F, 0x222F65E2 */ + 3.06161699786838301793e-17, /* atan(1.0)lo 0x3C81A626, 0x33145C07 */ + 1.39033110312309984516e-17, /* atan(1.5)lo 0x3C700788, 0x7AF0CBBD */ + 6.12323399573676603587e-17, /* atan(inf)lo 0x3C91A626, 0x33145C07 */ +}; + +static const double aT[] = { + 3.33333333333329318027e-01, /* 0x3FD55555, 0x5555550D */ + -1.99999999998764832476e-01, /* 0xBFC99999, 0x9998EBC4 */ + 1.42857142725034663711e-01, /* 0x3FC24924, 0x920083FF */ + -1.11111104054623557880e-01, /* 0xBFBC71C6, 0xFE231671 */ + 9.09088713343650656196e-02, /* 0x3FB745CD, 0xC54C206E */ + -7.69187620504482999495e-02, /* 0xBFB3B0F2, 0xAF749A6D */ + 6.66107313738753120669e-02, /* 0x3FB10D66, 0xA0D03D51 */ + -5.83357013379057348645e-02, /* 0xBFADDE2D, 0x52DEFD9A */ + 4.97687799461593236017e-02, /* 0x3FA97B4B, 0x24760DEB */ + -3.65315727442169155270e-02, /* 0xBFA2B444, 0x2C6A6C2F */ + 1.62858201153657823623e-02, /* 0x3F90AD3A, 0xE322DA11 */ +}; + + static const double +one = 1.0, +huge = 1.0e300; + +double +atan(double x) +{ + double w,s1,s2,z; + int32_t ix,hx,id; + + GET_HIGH_WORD(hx,x); + ix = hx&0x7fffffff; + if(ix>=0x44100000) { /* if |x| >= 2^66 */ + u_int32_t low; + GET_LOW_WORD(low,x); + if(ix>0x7ff00000|| + (ix==0x7ff00000&&(low!=0))) + return x+x; /* NaN */ + if(hx>0) return atanhi[3]+atanlo[3]; + else return -atanhi[3]-atanlo[3]; + } if (ix < 0x3fdc0000) { /* |x| < 0.4375 */ + if (ix < 0x3e200000) { /* |x| < 2^-29 */ + if(huge+x>one) return x; /* raise inexact */ + } + id = -1; + } else { + x = fabs(x); + if (ix < 0x3ff30000) { /* |x| < 1.1875 */ + if (ix < 0x3fe60000) { /* 7/16 <=|x|<11/16 */ + id = 0; x = (2.0*x-one)/(2.0+x); + } else { /* 11/16<=|x|< 19/16 */ + id = 1; x = (x-one)/(x+one); + } + } else { + if (ix < 0x40038000) { /* |x| < 2.4375 */ + id = 2; x = (x-1.5)/(one+1.5*x); + } else { /* 2.4375 <= |x| < 2^66 */ + id = 3; x = -1.0/x; + } + }} + /* end of argument reduction */ + z = x*x; + w = z*z; + /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */ + s1 = z*(aT[0]+w*(aT[2]+w*(aT[4]+w*(aT[6]+w*(aT[8]+w*aT[10]))))); + s2 = w*(aT[1]+w*(aT[3]+w*(aT[5]+w*(aT[7]+w*aT[9])))); + if (id<0) return x - x*(s1+s2); + else { + z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x); + return (hx<0)? -z:z; + } +} diff --git a/StdLib/LibC/Math/s_ceil.c b/StdLib/LibC/Math/s_ceil.c new file mode 100644 index 0000000000..e9579fab72 --- /dev/null +++ b/StdLib/LibC/Math/s_ceil.c @@ -0,0 +1,74 @@ +/* @(#)s_ceil.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: s_ceil.c,v 1.11 2002/05/26 22:01:54 wiz Exp $"); +#endif + +/* + * ceil(x) + * Return x rounded toward -inf to integral value + * Method: + * Bit twiddling. + * Exception: + * Inexact flag raised if x not equal to ceil(x). + */ + +#include "math.h" +#include "math_private.h" + +static const double huge = 1.0e300; + +double +ceil(double x) +{ + int32_t i0,i1,j0; + u_int32_t i,j; + + EXTRACT_WORDS(i0,i1,x); + j0 = ((i0>>20)&0x7ff)-0x3ff; + if(j0<20) { + if(j0<0) { /* raise inexact if x != 0 */ + if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */ + if(i0<0) {i0=0x80000000;i1=0;} + else if((i0|i1)!=0) { i0=0x3ff00000;i1=0;} + } + } else { + i = (0x000fffff)>>j0; + if(((i0&i)|i1)==0) return x; /* x is integral */ + if(huge+x>0.0) { /* raise inexact flag */ + if(i0>0) i0 += (0x00100000)>>j0; + i0 &= (~i); i1=0; + } + } + } else if (j0>51) { + if(j0==0x400) return x+x; /* inf or NaN */ + else return x; /* x is integral */ + } else { + i = ((u_int32_t)(0xffffffff))>>(j0-20); + if((i1&i)==0) return x; /* x is integral */ + if(huge+x>0.0) { /* raise inexact flag */ + if(i0>0) { + if(j0==20) i0+=1; + else { + j = i1 + (1<<(52-j0)); + if((int32_t)j +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: s_copysign.c,v 1.11 2002/05/26 22:01:54 wiz Exp $"); +#endif + +/* + * copysign(double x, double y) + * copysign(x,y) returns a value with the magnitude of x and + * with the sign bit of y. + */ + +#include "math.h" +#include "math_private.h" + +double +copysign(double x, double y) +{ + u_int32_t hx,hy; + GET_HIGH_WORD(hx,x); + GET_HIGH_WORD(hy,y); + SET_HIGH_WORD(x,(hx&0x7fffffff)|(hy&0x80000000)); + return x; +} diff --git a/StdLib/LibC/Math/s_cos.c b/StdLib/LibC/Math/s_cos.c new file mode 100644 index 0000000000..ef04e5d34c --- /dev/null +++ b/StdLib/LibC/Math/s_cos.c @@ -0,0 +1,79 @@ +/* @(#)s_cos.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: s_cos.c,v 1.10 2002/05/26 22:01:54 wiz Exp $"); +#endif + +/* cos(x) + * Return cosine function of x. + * + * kernel function: + * __kernel_sin ... sine function on [-pi/4,pi/4] + * __kernel_cos ... cosine function on [-pi/4,pi/4] + * __ieee754_rem_pio2 ... argument reduction routine + * + * Method. + * Let S,C and T denote the sin, cos and tan respectively on + * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2 + * in [-pi/4 , +pi/4], and let n = k mod 4. + * We have + * + * n sin(x) cos(x) tan(x) + * ---------------------------------------------------------- + * 0 S C T + * 1 C -S -1/T + * 2 -S -C T + * 3 -C S -1/T + * ---------------------------------------------------------- + * + * Special cases: + * Let trig be any of sin, cos, or tan. + * trig(+-INF) is NaN, with signals; + * trig(NaN) is that NaN; + * + * Accuracy: + * TRIG(x) returns trig(x) nearly rounded + */ + +#include "math.h" +#include "math_private.h" + +double +cos(double x) +{ + double y[2],z=0.0; + int32_t n, ix; + + /* High word of x. */ + GET_HIGH_WORD(ix,x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if(ix <= 0x3fe921fb) return __kernel_cos(x,z); + + /* cos(Inf or NaN) is NaN */ + else if (ix>=0x7ff00000) return x-x; + + /* argument reduction needed */ + else { + n = __ieee754_rem_pio2(x,y); + switch(n&3) { + case 0: return __kernel_cos(y[0],y[1]); + case 1: return -__kernel_sin(y[0],y[1],1); + case 2: return -__kernel_cos(y[0],y[1]); + default: + return __kernel_sin(y[0],y[1],1); + } + } +} diff --git a/StdLib/LibC/Math/s_expm1.c b/StdLib/LibC/Math/s_expm1.c new file mode 100644 index 0000000000..338f377fa4 --- /dev/null +++ b/StdLib/LibC/Math/s_expm1.c @@ -0,0 +1,228 @@ +/* @(#)s_expm1.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: s_expm1.c,v 1.12 2002/05/26 22:01:55 wiz Exp $"); +#endif + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ + // C4756: overflow in constant arithmetic + #pragma warning ( disable : 4756 ) +#endif + +/* expm1(x) + * Returns exp(x)-1, the exponential of x minus 1. + * + * Method + * 1. Argument reduction: + * Given x, find r and integer k such that + * + * x = k*ln2 + r, |r| <= 0.5*ln2 ~ 0.34658 + * + * Here a correction term c will be computed to compensate + * the error in r when rounded to a floating-point number. + * + * 2. Approximating expm1(r) by a special rational function on + * the interval [0,0.34658]: + * Since + * r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 - r^4/360 + ... + * we define R1(r*r) by + * r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 * R1(r*r) + * That is, + * R1(r**2) = 6/r *((exp(r)+1)/(exp(r)-1) - 2/r) + * = 6/r * ( 1 + 2.0*(1/(exp(r)-1) - 1/r)) + * = 1 - r^2/60 + r^4/2520 - r^6/100800 + ... + * We use a special Reme algorithm on [0,0.347] to generate + * a polynomial of degree 5 in r*r to approximate R1. The + * maximum error of this polynomial approximation is bounded + * by 2**-61. In other words, + * R1(z) ~ 1.0 + Q1*z + Q2*z**2 + Q3*z**3 + Q4*z**4 + Q5*z**5 + * where Q1 = -1.6666666666666567384E-2, + * Q2 = 3.9682539681370365873E-4, + * Q3 = -9.9206344733435987357E-6, + * Q4 = 2.5051361420808517002E-7, + * Q5 = -6.2843505682382617102E-9; + * (where z=r*r, and the values of Q1 to Q5 are listed below) + * with error bounded by + * | 5 | -61 + * | 1.0+Q1*z+...+Q5*z - R1(z) | <= 2 + * | | + * + * expm1(r) = exp(r)-1 is then computed by the following + * specific way which minimize the accumulation rounding error: + * 2 3 + * r r [ 3 - (R1 + R1*r/2) ] + * expm1(r) = r + --- + --- * [--------------------] + * 2 2 [ 6 - r*(3 - R1*r/2) ] + * + * To compensate the error in the argument reduction, we use + * expm1(r+c) = expm1(r) + c + expm1(r)*c + * ~ expm1(r) + c + r*c + * Thus c+r*c will be added in as the correction terms for + * expm1(r+c). Now rearrange the term to avoid optimization + * screw up: + * ( 2 2 ) + * ({ ( r [ R1 - (3 - R1*r/2) ] ) } r ) + * expm1(r+c)~r - ({r*(--- * [--------------------]-c)-c} - --- ) + * ({ ( 2 [ 6 - r*(3 - R1*r/2) ] ) } 2 ) + * ( ) + * + * = r - E + * 3. Scale back to obtain expm1(x): + * From step 1, we have + * expm1(x) = either 2^k*[expm1(r)+1] - 1 + * = or 2^k*[expm1(r) + (1-2^-k)] + * 4. Implementation notes: + * (A). To save one multiplication, we scale the coefficient Qi + * to Qi*2^i, and replace z by (x^2)/2. + * (B). To achieve maximum accuracy, we compute expm1(x) by + * (i) if x < -56*ln2, return -1.0, (raise inexact if x!=inf) + * (ii) if k=0, return r-E + * (iii) if k=-1, return 0.5*(r-E)-0.5 + * (iv) if k=1 if r < -0.25, return 2*((r+0.5)- E) + * else return 1.0+2.0*(r-E); + * (v) if (k<-2||k>56) return 2^k(1-(E-r)) - 1 (or exp(x)-1) + * (vi) if k <= 20, return 2^k((1-2^-k)-(E-r)), else + * (vii) return 2^k(1-((E+2^-k)-r)) + * + * Special cases: + * expm1(INF) is INF, expm1(NaN) is NaN; + * expm1(-INF) is -1, and + * for finite argument, only expm1(0)=0 is exact. + * + * Accuracy: + * according to an error analysis, the error is always less than + * 1 ulp (unit in the last place). + * + * Misc. info. + * For IEEE double + * if x > 7.09782712893383973096e+02 then expm1(x) overflow + * + * Constants: + * The hexadecimal values are the intended ones for the following + * constants. The decimal values may be used, provided that the + * compiler will convert from decimal to binary accurately enough + * to produce the hexadecimal values shown. + */ + +#include "math.h" +#include "math_private.h" + +static const double +one = 1.0, +huge = 1.0e+300, +tiny = 1.0e-300, +o_threshold = 7.09782712893383973096e+02,/* 0x40862E42, 0xFEFA39EF */ +ln2_hi = 6.93147180369123816490e-01,/* 0x3fe62e42, 0xfee00000 */ +ln2_lo = 1.90821492927058770002e-10,/* 0x3dea39ef, 0x35793c76 */ +invln2 = 1.44269504088896338700e+00,/* 0x3ff71547, 0x652b82fe */ + /* scaled coefficients related to expm1 */ +Q1 = -3.33333333333331316428e-02, /* BFA11111 111110F4 */ +Q2 = 1.58730158725481460165e-03, /* 3F5A01A0 19FE5585 */ +Q3 = -7.93650757867487942473e-05, /* BF14CE19 9EAADBB7 */ +Q4 = 4.00821782732936239552e-06, /* 3ED0CFCA 86E65239 */ +Q5 = -2.01099218183624371326e-07; /* BE8AFDB7 6E09C32D */ + +double +expm1(double x) +{ + double y,hi,lo,c,t,e,hxs,hfx,r1; + int32_t k,xsb; + u_int32_t hx; + + c = 0; + GET_HIGH_WORD(hx,x); + xsb = hx&0x80000000; /* sign bit of x */ + if(xsb==0) y=x; else y= -x; /* y = |x| */ + hx &= 0x7fffffff; /* high word of |x| */ + + /* filter out huge and non-finite argument */ + if(hx >= 0x4043687A) { /* if |x|>=56*ln2 */ + if(hx >= 0x40862E42) { /* if |x|>=709.78... */ + if(hx>=0x7ff00000) { + u_int32_t low; + GET_LOW_WORD(low,x); + if(((hx&0xfffff)|low)!=0) + return x+x; /* NaN */ + else return (xsb==0)? x:-1.0;/* exp(+-inf)={inf,-1} */ + } + if(x > o_threshold) return huge*huge; /* overflow */ + } + if(xsb!=0) { /* x < -56*ln2, return -1.0 with inexact */ + if(x+tiny<0.0) /* raise inexact */ + return tiny-one; /* return -1 */ + } + } + + /* argument reduction */ + if(hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */ + if(hx < 0x3FF0A2B2) { /* and |x| < 1.5 ln2 */ + if(xsb==0) + {hi = x - ln2_hi; lo = ln2_lo; k = 1;} + else + {hi = x + ln2_hi; lo = -ln2_lo; k = -1;} + } else { + k = (int32_t)(invln2*x+((xsb==0)?0.5:-0.5)); + t = k; + hi = x - t*ln2_hi; /* t*ln2_hi is exact here */ + lo = t*ln2_lo; + } + x = hi - lo; + c = (hi-x)-lo; + } + else if(hx < 0x3c900000) { /* when |x|<2**-54, return x */ + t = huge+x; /* return x with inexact flags when x!=0 */ + return x - (t-(huge+x)); + } + else k = 0; + + /* x is now in primary range */ + hfx = 0.5*x; + hxs = x*hfx; + r1 = one+hxs*(Q1+hxs*(Q2+hxs*(Q3+hxs*(Q4+hxs*Q5)))); + t = 3.0-r1*hfx; + e = hxs*((r1-t)/(6.0 - x*t)); + if(k==0) return x - (x*e-hxs); /* c is 0 */ + else { + e = (x*(e-c)-c); + e -= hxs; + if(k== -1) return 0.5*(x-e)-0.5; + if(k==1) { + if(x < -0.25) return -2.0*(e-(x+0.5)); + else return one+2.0*(x-e); + } + if (k <= -2 || k>56) { /* suffice to return exp(x)-1 */ + u_int32_t high; + y = one-(e-x); + GET_HIGH_WORD(high,y); + SET_HIGH_WORD(y,high+(k<<20)); /* add k to y's exponent */ + return y-one; + } + t = one; + if(k<20) { + u_int32_t high; + SET_HIGH_WORD(t,0x3ff00000 - (0x200000>>k)); /* t=1-2^-k */ + y = t-(e-x); + GET_HIGH_WORD(high,y); + SET_HIGH_WORD(y,high+(k<<20)); /* add k to y's exponent */ + } else { + u_int32_t high; + SET_HIGH_WORD(t,((0x3ff-k)<<20)); /* 2^-k */ + y = x-(e+t); + y += one; + GET_HIGH_WORD(high,y); + SET_HIGH_WORD(y,high+(k<<20)); /* add k to y's exponent */ + } + } + return y; +} diff --git a/StdLib/LibC/Math/s_fabs.c b/StdLib/LibC/Math/s_fabs.c new file mode 100644 index 0000000000..4cd5a5e52a --- /dev/null +++ b/StdLib/LibC/Math/s_fabs.c @@ -0,0 +1,32 @@ +/* @(#)s_fabs.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: s_fabs.c,v 1.10 2002/05/26 22:01:55 wiz Exp $"); +#endif + +/* + * fabs(x) returns the absolute value of x. + */ + +#include "math.h" +#include "math_private.h" + +double +fabs(double x) +{ + u_int32_t high; + GET_HIGH_WORD(high,x); + SET_HIGH_WORD(x,high&0x7fffffff); + return x; +} diff --git a/StdLib/LibC/Math/s_finite.c b/StdLib/LibC/Math/s_finite.c new file mode 100644 index 0000000000..3f66feb981 --- /dev/null +++ b/StdLib/LibC/Math/s_finite.c @@ -0,0 +1,32 @@ +/* @(#)s_finite.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: s_finite.c,v 1.11 2002/05/26 22:01:55 wiz Exp $"); +#endif + +/* + * finite(x) returns 1 is x is finite, else 0; + * no branching! + */ + +#include "math.h" +#include "math_private.h" + +int +finite(double x) +{ + int32_t hx; + GET_HIGH_WORD(hx,x); + return (int)((u_int32_t)((hx&0x7fffffff)-0x7ff00000)>>31); +} diff --git a/StdLib/LibC/Math/s_floor.c b/StdLib/LibC/Math/s_floor.c new file mode 100644 index 0000000000..d63ef13c0d --- /dev/null +++ b/StdLib/LibC/Math/s_floor.c @@ -0,0 +1,74 @@ +/* @(#)s_floor.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: s_floor.c,v 1.11 2002/05/26 22:01:56 wiz Exp $"); +#endif + +/* + * floor(x) + * Return x rounded toward -inf to integral value + * Method: + * Bit twiddling. + * Exception: + * Inexact flag raised if x not equal to floor(x). + */ + +#include "math.h" +#include "math_private.h" + +static const double huge = 1.0e300; + +double +floor(double x) +{ + int32_t i0,i1,j0; + u_int32_t i,j; + EXTRACT_WORDS(i0,i1,x); + j0 = ((i0>>20)&0x7ff)-0x3ff; + if(j0<20) { + if(j0<0) { /* raise inexact if x != 0 */ + if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */ + if(i0>=0) {i0=i1=0;} + else if(((i0&0x7fffffff)|i1)!=0) + { i0=0xbff00000;i1=0;} + } + } else { + i = (0x000fffff)>>j0; + if(((i0&i)|i1)==0) return x; /* x is integral */ + if(huge+x>0.0) { /* raise inexact flag */ + if(i0<0) i0 += (0x00100000)>>j0; + i0 &= (~i); i1=0; + } + } + } else if (j0>51) { + if(j0==0x400) return x+x; /* inf or NaN */ + else return x; /* x is integral */ + } else { + i = ((u_int32_t)(0xffffffff))>>(j0-20); + if((i1&i)==0) return x; /* x is integral */ + if(huge+x>0.0) { /* raise inexact flag */ + if(i0<0) { + if(j0==20) i0+=1; + else { + j = i1+(1<<(52-j0)); + if((int32_t)j +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: s_frexp.c,v 1.12 2002/05/26 22:01:56 wiz Exp $"); +#endif + +/* + * for non-zero x + * x = frexp(arg,&exp); + * return a double fp quantity x such that 0.5 <= |x| <1.0 + * and the corresponding binary exponent "exp". That is + * arg = x*2^exp. + * If arg is inf, 0.0, or NaN, then frexp(arg,&exp) returns arg + * with *exp=0. + */ + +#include "math.h" +#include "math_private.h" + +static const double +two54 = 1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */ + +double +frexp(double x, int *eptr) +{ + int32_t hx, ix, lx; + EXTRACT_WORDS(hx,lx,x); + ix = 0x7fffffff&hx; + *eptr = 0; + if(ix>=0x7ff00000||((ix|lx)==0)) return x; /* 0,inf,nan */ + if (ix<0x00100000) { /* subnormal */ + x *= two54; + GET_HIGH_WORD(hx,x); + ix = hx&0x7fffffff; + *eptr = -54; + } + *eptr += (ix>>20)-1022; + hx = (hx&0x800fffff)|0x3fe00000; + SET_HIGH_WORD(x,hx); + return x; +} diff --git a/StdLib/LibC/Math/s_infinity.c b/StdLib/LibC/Math/s_infinity.c new file mode 100644 index 0000000000..9ee1abd0b4 --- /dev/null +++ b/StdLib/LibC/Math/s_infinity.c @@ -0,0 +1,27 @@ +/* $NetBSD: s_infinity.c,v 1.5 2003/07/26 19:25:05 salo Exp $ */ + +/* + * Written by J.T. Conklin . + * Public domain. + */ +#include + +#include + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ + // Force 8-byte alignment + #define ALIGN8 __declspec(align(8)) + + // C4742: identifier has different alignment in 'X' and 'Y' + #pragma warning ( disable : 4742 ) + // C4744: identifier has different type in 'X' and 'Y' + #pragma warning ( disable : 4744 ) +#else + #define ALIGN8 +#endif + +#if BYTE_ORDER == LITTLE_ENDIAN +ALIGN8 char __infinity[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x7f }; +#else +ALIGN8 char __infinity[] = { 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +#endif diff --git a/StdLib/LibC/Math/s_ldexp.c b/StdLib/LibC/Math/s_ldexp.c new file mode 100644 index 0000000000..6c843c7fe9 --- /dev/null +++ b/StdLib/LibC/Math/s_ldexp.c @@ -0,0 +1,29 @@ +/* @(#)s_ldexp.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: s_ldexp.c,v 1.9 2002/05/26 22:01:56 wiz Exp $"); +#endif + +#include +#include "math.h" +#include "math_private.h" + +double +ldexp(double value, int exp) +{ + if(!finite(value)||value==0.0) return value; + value = scalbn(value,exp); + if(!finite(value)||value==0.0) errno = ERANGE; + return value; +} diff --git a/StdLib/LibC/Math/s_modf.c b/StdLib/LibC/Math/s_modf.c new file mode 100644 index 0000000000..bf4faf42e0 --- /dev/null +++ b/StdLib/LibC/Math/s_modf.c @@ -0,0 +1,76 @@ +/* @(#)s_modf.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: s_modf.c,v 1.11 2002/05/26 22:01:57 wiz Exp $"); +#endif + +/* + * modf(double x, double *iptr) + * return fraction part of x, and return x's integral part in *iptr. + * Method: + * Bit twiddling. + * + * Exception: + * No exception. + */ + +#include "math.h" +#include "math_private.h" + +static const double one = 1.0; + +double +modf(double x, double *iptr) +{ + int32_t i0,i1,j0; + u_int32_t i; + EXTRACT_WORDS(i0,i1,x); + j0 = ((i0>>20)&0x7ff)-0x3ff; /* exponent of x */ + if(j0<20) { /* integer part in high x */ + if(j0<0) { /* |x|<1 */ + INSERT_WORDS(*iptr,i0&0x80000000,0); /* *iptr = +-0 */ + return x; + } else { + i = (0x000fffff)>>j0; + if(((i0&i)|i1)==0) { /* x is integral */ + u_int32_t high; + *iptr = x; + GET_HIGH_WORD(high,x); + INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */ + return x; + } else { + INSERT_WORDS(*iptr,i0&(~i),0); + return x - *iptr; + } + } + } else if (j0>51) { /* no fraction part */ + u_int32_t high; + *iptr = x*one; + GET_HIGH_WORD(high,x); + INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */ + return x; + } else { /* fraction part in low x */ + i = ((u_int32_t)(0xffffffff))>>(j0-20); + if((i1&i)==0) { /* x is integral */ + u_int32_t high; + *iptr = x; + GET_HIGH_WORD(high,x); + INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */ + return x; + } else { + INSERT_WORDS(*iptr,i0,i1&(~i)); + return x - *iptr; + } + } +} diff --git a/StdLib/LibC/Math/s_scalbn.c b/StdLib/LibC/Math/s_scalbn.c new file mode 100644 index 0000000000..072f1c7c89 --- /dev/null +++ b/StdLib/LibC/Math/s_scalbn.c @@ -0,0 +1,60 @@ +/* @(#)s_scalbn.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: s_scalbn.c,v 1.12 2002/05/26 22:01:58 wiz Exp $"); +#endif + +/* + * scalbn (double x, int n) + * scalbn(x,n) returns x* 2**n computed by exponent + * manipulation rather than by actually performing an + * exponentiation or a multiplication. + */ + +#include "math.h" +#include "math_private.h" + +static const double +two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */ +twom54 = 5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */ +huge = 1.0e+300, +tiny = 1.0e-300; + +double +scalbn(double x, int n) +{ + int32_t k,hx,lx; + EXTRACT_WORDS(hx,lx,x); + k = (hx&0x7ff00000)>>20; /* extract exponent */ + if (k==0) { /* 0 or subnormal x */ + if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */ + x *= two54; + GET_HIGH_WORD(hx,x); + k = ((hx&0x7ff00000)>>20) - 54; + if (n< -50000) return tiny*x; /*underflow*/ + } + if (k==0x7ff) return x+x; /* NaN or Inf */ + k = k+n; + if (k > 0x7fe) return huge*copysign(huge,x); /* overflow */ + if (k > 0) /* normal result */ + {SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;} + if (k <= -54) { + if (n > 50000) /* in case integer overflow in n+k */ + return huge*copysign(huge,x); /*overflow*/ + else return tiny*copysign(tiny,x); /*underflow*/ + } + k += 54; /* subnormal result */ + SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); + return x*twom54; +} diff --git a/StdLib/LibC/Math/s_sin.c b/StdLib/LibC/Math/s_sin.c new file mode 100644 index 0000000000..2f373c984e --- /dev/null +++ b/StdLib/LibC/Math/s_sin.c @@ -0,0 +1,79 @@ +/* @(#)s_sin.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: s_sin.c,v 1.10 2002/05/26 22:01:58 wiz Exp $"); +#endif + +/* sin(x) + * Return sine function of x. + * + * kernel function: + * __kernel_sin ... sine function on [-pi/4,pi/4] + * __kernel_cos ... cose function on [-pi/4,pi/4] + * __ieee754_rem_pio2 ... argument reduction routine + * + * Method. + * Let S,C and T denote the sin, cos and tan respectively on + * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2 + * in [-pi/4 , +pi/4], and let n = k mod 4. + * We have + * + * n sin(x) cos(x) tan(x) + * ---------------------------------------------------------- + * 0 S C T + * 1 C -S -1/T + * 2 -S -C T + * 3 -C S -1/T + * ---------------------------------------------------------- + * + * Special cases: + * Let trig be any of sin, cos, or tan. + * trig(+-INF) is NaN, with signals; + * trig(NaN) is that NaN; + * + * Accuracy: + * TRIG(x) returns trig(x) nearly rounded + */ + +#include "math.h" +#include "math_private.h" + +double +sin(double x) +{ + double y[2],z=0.0; + int32_t n, ix; + + /* High word of x. */ + GET_HIGH_WORD(ix,x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if(ix <= 0x3fe921fb) return __kernel_sin(x,z,0); + + /* sin(Inf or NaN) is NaN */ + else if (ix>=0x7ff00000) return x-x; + + /* argument reduction needed */ + else { + n = __ieee754_rem_pio2(x,y); + switch(n&3) { + case 0: return __kernel_sin(y[0],y[1],1); + case 1: return __kernel_cos(y[0],y[1]); + case 2: return -__kernel_sin(y[0],y[1],1); + default: + return -__kernel_cos(y[0],y[1]); + } + } +} diff --git a/StdLib/LibC/Math/s_tan.c b/StdLib/LibC/Math/s_tan.c new file mode 100644 index 0000000000..6c2a26de5a --- /dev/null +++ b/StdLib/LibC/Math/s_tan.c @@ -0,0 +1,73 @@ +/* @(#)s_tan.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: s_tan.c,v 1.10 2002/05/26 22:01:58 wiz Exp $"); +#endif + +/* tan(x) + * Return tangent function of x. + * + * kernel function: + * __kernel_tan ... tangent function on [-pi/4,pi/4] + * __ieee754_rem_pio2 ... argument reduction routine + * + * Method. + * Let S,C and T denote the sin, cos and tan respectively on + * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2 + * in [-pi/4 , +pi/4], and let n = k mod 4. + * We have + * + * n sin(x) cos(x) tan(x) + * ---------------------------------------------------------- + * 0 S C T + * 1 C -S -1/T + * 2 -S -C T + * 3 -C S -1/T + * ---------------------------------------------------------- + * + * Special cases: + * Let trig be any of sin, cos, or tan. + * trig(+-INF) is NaN, with signals; + * trig(NaN) is that NaN; + * + * Accuracy: + * TRIG(x) returns trig(x) nearly rounded + */ + +#include "math.h" +#include "math_private.h" + +double +tan(double x) +{ + double y[2],z=0.0; + int32_t n, ix; + + /* High word of x. */ + GET_HIGH_WORD(ix,x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if(ix <= 0x3fe921fb) return __kernel_tan(x,z,1); + + /* tan(Inf or NaN) is NaN */ + else if (ix>=0x7ff00000) return x-x; /* NaN */ + + /* argument reduction needed */ + else { + n = __ieee754_rem_pio2(x,y); + return __kernel_tan(y[0],y[1],1-((n&1)<<1)); /* 1 -- n even + -1 -- n odd */ + } +} diff --git a/StdLib/LibC/Math/s_tanh.c b/StdLib/LibC/Math/s_tanh.c new file mode 100644 index 0000000000..f6e17a7b4f --- /dev/null +++ b/StdLib/LibC/Math/s_tanh.c @@ -0,0 +1,79 @@ +/* @(#)s_tanh.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: s_tanh.c,v 1.10 2002/05/26 22:01:59 wiz Exp $"); +#endif + +/* Tanh(x) + * Return the Hyperbolic Tangent of x + * + * Method : + * x -x + * e - e + * 0. tanh(x) is defined to be ----------- + * x -x + * e + e + * 1. reduce x to non-negative by tanh(-x) = -tanh(x). + * 2. 0 <= x <= 2**-55 : tanh(x) := x*(one+x) + * -t + * 2**-55 < x <= 1 : tanh(x) := -----; t = expm1(-2x) + * t + 2 + * 2 + * 1 <= x <= 22.0 : tanh(x) := 1- ----- ; t=expm1(2x) + * t + 2 + * 22.0 < x <= INF : tanh(x) := 1. + * + * Special cases: + * tanh(NaN) is NaN; + * only tanh(0)=0 is exact for finite argument. + */ + +#include "math.h" +#include "math_private.h" + +static const double one=1.0, two=2.0, tiny = 1.0e-300; + +double +tanh(double x) +{ + double t,z; + int32_t jx,ix; + + /* High word of |x|. */ + GET_HIGH_WORD(jx,x); + ix = jx&0x7fffffff; + + /* x is INF or NaN */ + if(ix>=0x7ff00000) { + if (jx>=0) return one/x+one; /* tanh(+-inf)=+-1 */ + else return one/x-one; /* tanh(NaN) = NaN */ + } + + /* |x| < 22 */ + if (ix < 0x40360000) { /* |x|<22 */ + if (ix<0x3c800000) /* |x|<2**-55 */ + return x*(one+x); /* tanh(small) = small */ + if (ix>=0x3ff00000) { /* |x|>=1 */ + t = expm1(two*fabs(x)); + z = one - two/(t+two); + } else { + t = expm1(-two*fabs(x)); + z= -t/(t+two); + } + /* |x| > 22, return +-1 */ + } else { + z = one - tiny; /* raised inexact flag */ + } + return (jx>=0)? z: -z; +} diff --git a/StdLib/LibC/Math/w_acos.c b/StdLib/LibC/Math/w_acos.c new file mode 100644 index 0000000000..7e6aa10254 --- /dev/null +++ b/StdLib/LibC/Math/w_acos.c @@ -0,0 +1,40 @@ +/* @(#)w_acos.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: w_acos.c,v 1.9 2002/05/26 22:01:59 wiz Exp $"); +#endif + +/* + * wrap_acos(x) + */ + +#include "math.h" +#include "math_private.h" + + +double +acos(double x) /* wrapper acos */ +{ +#ifdef _IEEE_LIBM + return __ieee754_acos(x); +#else + double z; + z = __ieee754_acos(x); + if(_LIB_VERSION == _IEEE_ || isnan(x)) return z; + if(fabs(x)>1.0) { + return __kernel_standard(x,x,1); /* acos(|x|>1) */ + } else + return z; +#endif +} diff --git a/StdLib/LibC/Math/w_asin.c b/StdLib/LibC/Math/w_asin.c new file mode 100644 index 0000000000..988c42dc1f --- /dev/null +++ b/StdLib/LibC/Math/w_asin.c @@ -0,0 +1,41 @@ +/* @(#)w_asin.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: w_asin.c,v 1.9 2002/05/26 22:01:59 wiz Exp $"); +#endif + +/* + * wrapper asin(x) + */ + + +#include "math.h" +#include "math_private.h" + + +double +asin(double x) /* wrapper asin */ +{ +#ifdef _IEEE_LIBM + return __ieee754_asin(x); +#else + double z; + z = __ieee754_asin(x); + if(_LIB_VERSION == _IEEE_ || isnan(x)) return z; + if(fabs(x)>1.0) { + return __kernel_standard(x,x,2); /* asin(|x|>1) */ + } else + return z; +#endif +} diff --git a/StdLib/LibC/Math/w_atan2.c b/StdLib/LibC/Math/w_atan2.c new file mode 100644 index 0000000000..dbf38de42f --- /dev/null +++ b/StdLib/LibC/Math/w_atan2.c @@ -0,0 +1,40 @@ +/* @(#)w_atan2.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: w_atan2.c,v 1.9 2002/05/26 22:01:59 wiz Exp $"); +#endif + +/* + * wrapper atan2(y,x) + */ + +#include "math.h" +#include "math_private.h" + + +double +atan2(double y, double x) /* wrapper atan2 */ +{ +#ifdef _IEEE_LIBM + return __ieee754_atan2(y,x); +#else + double z; + z = __ieee754_atan2(y,x); + if(_LIB_VERSION == _IEEE_||isnan(x)||isnan(y)) return z; + if(x==0.0&&y==0.0) { + return __kernel_standard(y,x,3); /* atan2(+-0,+-0) */ + } else + return z; +#endif +} diff --git a/StdLib/LibC/Math/w_cosh.c b/StdLib/LibC/Math/w_cosh.c new file mode 100644 index 0000000000..3d73bff961 --- /dev/null +++ b/StdLib/LibC/Math/w_cosh.c @@ -0,0 +1,39 @@ +/* @(#)w_cosh.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: w_cosh.c,v 1.9 2002/05/26 22:02:00 wiz Exp $"); +#endif + +/* + * wrapper cosh(x) + */ + +#include "math.h" +#include "math_private.h" + +double +cosh(double x) /* wrapper cosh */ +{ +#ifdef _IEEE_LIBM + return __ieee754_cosh(x); +#else + double z; + z = __ieee754_cosh(x); + if(_LIB_VERSION == _IEEE_ || isnan(x)) return z; + if(fabs(x)>7.10475860073943863426e+02) { + return __kernel_standard(x,x,5); /* cosh overflow */ + } else + return z; +#endif +} diff --git a/StdLib/LibC/Math/w_exp.c b/StdLib/LibC/Math/w_exp.c new file mode 100644 index 0000000000..29a2bb2906 --- /dev/null +++ b/StdLib/LibC/Math/w_exp.c @@ -0,0 +1,46 @@ +/* @(#)w_exp.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: w_exp.c,v 1.9 2002/05/26 22:02:00 wiz Exp $"); +#endif + +/* + * wrapper exp(x) + */ + +#include "math.h" +#include "math_private.h" + +static const double +o_threshold= 7.09782712893383973096e+02, /* 0x40862E42, 0xFEFA39EF */ +u_threshold= -7.45133219101941108420e+02; /* 0xc0874910, 0xD52D3051 */ + +double +exp(double x) /* wrapper exp */ +{ +#ifdef _IEEE_LIBM + return __ieee754_exp(x); +#else + double z; + z = __ieee754_exp(x); + if(_LIB_VERSION == _IEEE_) return z; + if(finite(x)) { + if(x>o_threshold) + return __kernel_standard(x,x,6); /* exp overflow */ + else if(x +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: w_fmod.c,v 1.9 2002/05/26 22:02:00 wiz Exp $"); +#endif + +/* + * wrapper fmod(x,y) + */ + +#include "math.h" +#include "math_private.h" + + +double +fmod(double x, double y) /* wrapper fmod */ +{ +#ifdef _IEEE_LIBM + return __ieee754_fmod(x,y); +#else + double z; + z = __ieee754_fmod(x,y); + if(_LIB_VERSION == _IEEE_ ||isnan(y)||isnan(x)) return z; + if(y==0.0) { + return __kernel_standard(x,y,27); /* fmod(x,0) */ + } else + return z; +#endif +} diff --git a/StdLib/LibC/Math/w_log.c b/StdLib/LibC/Math/w_log.c new file mode 100644 index 0000000000..ae8a5a2338 --- /dev/null +++ b/StdLib/LibC/Math/w_log.c @@ -0,0 +1,40 @@ +/* @(#)w_log.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: w_log.c,v 1.9 2002/05/26 22:02:02 wiz Exp $"); +#endif + +/* + * wrapper log(x) + */ + +#include "math.h" +#include "math_private.h" + + +double +log(double x) /* wrapper log */ +{ +#ifdef _IEEE_LIBM + return __ieee754_log(x); +#else + double z; + z = __ieee754_log(x); + if(_LIB_VERSION == _IEEE_ || isnan(x) || x > 0.0) return z; + if(x==0.0) + return __kernel_standard(x,x,16); /* log(0) */ + else + return __kernel_standard(x,x,17); /* log(x<0) */ +#endif +} diff --git a/StdLib/LibC/Math/w_log10.c b/StdLib/LibC/Math/w_log10.c new file mode 100644 index 0000000000..4c82dfbccc --- /dev/null +++ b/StdLib/LibC/Math/w_log10.c @@ -0,0 +1,43 @@ +/* @(#)w_log10.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: w_log10.c,v 1.9 2002/05/26 22:02:02 wiz Exp $"); +#endif + +/* + * wrapper log10(X) + */ + +#include "math.h" +#include "math_private.h" + + +double +log10(double x) /* wrapper log10 */ +{ +#ifdef _IEEE_LIBM + return __ieee754_log10(x); +#else + double z; + z = __ieee754_log10(x); + if(_LIB_VERSION == _IEEE_ || isnan(x)) return z; + if(x<=0.0) { + if(x==0.0) + return __kernel_standard(x,x,18); /* log10(0) */ + else + return __kernel_standard(x,x,19); /* log10(x<0) */ + } else + return z; +#endif +} diff --git a/StdLib/LibC/Math/w_log2.c b/StdLib/LibC/Math/w_log2.c new file mode 100644 index 0000000000..35e4d1fccd --- /dev/null +++ b/StdLib/LibC/Math/w_log2.c @@ -0,0 +1,43 @@ +/* @(#)w_log10.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: w_log2.c,v 1.1 2005/07/21 16:58:39 christos Exp $"); +#endif + +/* + * wrapper log2(X) + */ + +#include "math.h" +#include "math_private.h" + + +double +log2(double x) /* wrapper log10 */ +{ +#ifdef _IEEE_LIBM + return __ieee754_log2(x); +#else + double z; + z = __ieee754_log2(x); + if(_LIB_VERSION == _IEEE_ || isnan(x)) return z; + if(x<=0.0) { + if(x==0.0) + return __kernel_standard(x,x,48); /* log2(0) */ + else + return __kernel_standard(x,x,49); /* log2(x<0) */ + } else + return z; +#endif +} diff --git a/StdLib/LibC/Math/w_pow.c b/StdLib/LibC/Math/w_pow.c new file mode 100644 index 0000000000..f5c4a39a90 --- /dev/null +++ b/StdLib/LibC/Math/w_pow.c @@ -0,0 +1,62 @@ + + +/* @(#)w_pow.c 5.2 93/10/01 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: w_pow.c,v 1.7 2002/05/26 22:02:02 wiz Exp $"); +#endif + +/* + * wrapper pow(x,y) return x**y + */ + +#include "math.h" +#include "math_private.h" + + +double +pow(double x, double y) /* wrapper pow */ +{ +#ifdef _IEEE_LIBM + return __ieee754_pow(x,y); +#else + double z; + z=__ieee754_pow(x,y); + if(_LIB_VERSION == _IEEE_|| isnan(y)) return z; + if(isnan(x)) { + if(y==0.0) + return __kernel_standard(x,y,42); /* pow(NaN,0.0) */ + else + return z; + } + if(x==0.0){ + if(y==0.0) + return __kernel_standard(x,y,20); /* pow(0.0,0.0) */ + if(finite(y)&&y<0.0) + return __kernel_standard(x,y,23); /* pow(0.0,negative) */ + return z; + } + if(!finite(z)) { + if(finite(x)&&finite(y)) { + if(isnan(z)) + return __kernel_standard(x,y,24); /* pow neg**non-int */ + else + return __kernel_standard(x,y,21); /* pow overflow */ + } + } + if(z==0.0&&finite(x)&&finite(y)) + return __kernel_standard(x,y,22); /* pow underflow */ + return z; +#endif +} diff --git a/StdLib/LibC/Math/w_sinh.c b/StdLib/LibC/Math/w_sinh.c new file mode 100644 index 0000000000..f653738a3c --- /dev/null +++ b/StdLib/LibC/Math/w_sinh.c @@ -0,0 +1,39 @@ +/* @(#)w_sinh.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: w_sinh.c,v 1.9 2002/05/26 22:02:03 wiz Exp $"); +#endif + +/* + * wrapper sinh(x) + */ + +#include "math.h" +#include "math_private.h" + +double +sinh(double x) /* wrapper sinh */ +{ +#ifdef _IEEE_LIBM + return __ieee754_sinh(x); +#else + double z; + z = __ieee754_sinh(x); + if(_LIB_VERSION == _IEEE_) return z; + if(!finite(z)&&finite(x)) { + return __kernel_standard(x,x,25); /* sinh overflow */ + } else + return z; +#endif +} diff --git a/StdLib/LibC/Math/w_sqrt.c b/StdLib/LibC/Math/w_sqrt.c new file mode 100644 index 0000000000..e55b4d8953 --- /dev/null +++ b/StdLib/LibC/Math/w_sqrt.c @@ -0,0 +1,39 @@ +/* @(#)w_sqrt.c 5.1 93/09/24 */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ +#include +#include +#if defined(LIBM_SCCS) && !defined(lint) +__RCSID("$NetBSD: w_sqrt.c,v 1.9 2002/05/26 22:02:03 wiz Exp $"); +#endif + +/* + * wrapper sqrt(x) + */ + +#include "math.h" +#include "math_private.h" + +double +sqrt(double x) /* wrapper sqrt */ +{ +#ifdef _IEEE_LIBM + return __ieee754_sqrt(x); +#else + double z; + z = __ieee754_sqrt(x); + if(_LIB_VERSION == _IEEE_ || isnan(x)) return z; + if(x<0.0) { + return __kernel_standard(x,x,26); /* sqrt(negative) */ + } else + return z; +#endif +} diff --git a/StdLib/LibC/NetUtil/NetUtil.inf b/StdLib/LibC/NetUtil/NetUtil.inf new file mode 100644 index 0000000000..537fe9cd42 --- /dev/null +++ b/StdLib/LibC/NetUtil/NetUtil.inf @@ -0,0 +1,59 @@ +## @file +# BSD Socket Library, Infrastructure functions. +# +# Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license. +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = LibNetUtil + FILE_GUID = f3c9667b-c50c-4e9c-a1f1-78c3b1ddf2c2 + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + LIBRARY_CLASS = LibNetUtil + +# +# VALID_ARCHITECTURES = IA32 X64 IPF +# + +[Sources] + inet_addr.c # + inet_makeaddr.c # + inet_lnaof.c # + inet_netof.c # + inet_network.c # + inet_ntoa.c # + inet_ntop.c # + +[Packages] + StdLib/StdLib.dec + StdLibPrivateInternalFiles/DoNotUse.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + UefiLib + BaseLib + BaseMemoryLib + MemoryAllocationLib + LibStdLib + LibStdio + LibString + +################################################################ +# +# The Build Options, below, are only used when building the Socket library. +# DO NOT use them when building your application! +# Nasty things could happen if you do. +# +#[BuildOptions] +# MSFT:*_*_IA32_CC_FLAGS = /GL- diff --git a/StdLib/LibC/NetUtil/inet_addr.c b/StdLib/LibC/NetUtil/inet_addr.c new file mode 100644 index 0000000000..fadc09de34 --- /dev/null +++ b/StdLib/LibC/NetUtil/inet_addr.c @@ -0,0 +1,225 @@ +/** @file + Convert a string internet address into an integer (32-bit) address. + + Copyright (c) 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + * Copyright (c) 1983, 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + + * Portions Copyright (c) 1993 by Digital Equipment Corporation. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies, and that + * the name of Digital Equipment Corporation not be used in advertising or + * publicity pertaining to distribution of the document or software without + * specific, written prior permission. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT + * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + + * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") + * Portions Copyright (c) 1996-1999 by Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + NetBSD: inet_addr.c,v 1.1 2005/12/20 19:28:51 christos Exp + inet_addr.c 8.1 (Berkeley) 6/17/93 + inet_addr.c,v 1.2.206.2 2004/03/17 00:29:45 marka Exp +**/ + +#if !defined(_KERNEL) && !defined(_STANDALONE) +#include + +//#include "port_before.h" + +#include +#include +#include + +#include +#include + +#include + +//#include "port_after.h" + +#ifdef __weak_alias + __weak_alias(inet_aton,_inet_aton) +#endif + +#else // NOT (!defined(_KERNEL) && !defined(_STANDALONE)) + #include + #include +#endif + +/* + * Ascii internet address interpretation routine. + * The value returned is in network order. + */ +u_int32_t +inet_addr(const char *cp) { + struct in_addr val; + + if (inet_aton(cp, &val)) + return (val.s_addr); + return (INADDR_NONE); +} + +/* + * Check whether "cp" is a valid ascii representation + * of an Internet address and convert to a binary address. + * Returns 1 if the address is valid, 0 if not. + * This replaces inet_addr, the return value from which + * cannot distinguish between failure and a local broadcast address. + */ +int +inet_aton(const char *cp, struct in_addr *addr) { + u_int32_t val; + int base, n; + char c; + u_int8_t parts[4]; + u_int8_t *pp = parts; + int digit; + + c = *cp; + for (;;) { + /* + * Collect number up to ``.''. + * Values are specified as for C: + * 0x=hex, 0=octal, isdigit=decimal. + */ + if (!isdigit((unsigned char)c)) + return (0); + val = 0; base = 10; digit = 0; + if (c == '0') { + c = *++cp; + if (c == 'x' || c == 'X') + base = 16, c = *++cp; + else { + base = 8; + digit = 1 ; + } + } + for (;;) { + if (isascii(c) && isdigit((unsigned char)c)) { + if (base == 8 && (c == '8' || c == '9')) + return (0); + val = (val * base) + (c - '0'); + c = *++cp; + digit = 1; + } else if (base == 16 && isascii(c) && + isxdigit((unsigned char)c)) { + val = (val << 4) | + (c + 10 - (islower((unsigned char)c) ? 'a' : 'A')); + c = *++cp; + digit = 1; + } else + break; + } + if (c == '.') { + /* + * Internet format: + * a.b.c.d + * a.b.c (with c treated as 16 bits) + * a.b (with b treated as 24 bits) + */ + if (pp >= parts + 3 || val > 0xffU) + return (0); + *pp++ = (u_int8_t)val; + c = *++cp; + } else + break; + } + /* + * Check for trailing characters. + */ + if (c != '\0' && (!isascii(c) || !isspace((unsigned char)c))) + return (0); + /* + * Did we get a valid digit? + */ + if (!digit) + return (0); + /* + * Concoct the address according to + * the number of parts specified. + */ + n = (int)(pp - parts + 1); + switch (n) { + case 1: /* a -- 32 bits */ + break; + + case 2: /* a.b -- 8.24 bits */ + if (val > 0xffffffU) + return (0); + val |= parts[0] << 24; + break; + + case 3: /* a.b.c -- 8.8.16 bits */ + if (val > 0xffffU) + return (0); + val |= (parts[0] << 24) | (parts[1] << 16); + break; + + case 4: /* a.b.c.d -- 8.8.8.8 bits */ + if (val > 0xffU) + return (0); + val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); + break; + } + if (addr != NULL) + addr->s_addr = htonl(val); + return (1); +} diff --git a/StdLib/LibC/NetUtil/inet_lnaof.c b/StdLib/LibC/NetUtil/inet_lnaof.c new file mode 100644 index 0000000000..39f09d1fde --- /dev/null +++ b/StdLib/LibC/NetUtil/inet_lnaof.c @@ -0,0 +1,70 @@ +/** @File + Return the local network address portion of an internet address. + + Copyright (c) 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + + NetBSD: inet_lnaof.c,v 1.1 2004/05/20 23:13:02 christos Exp + inet_lnaof.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include "namespace.h" +#include +#include +#include + +#ifdef __weak_alias + __weak_alias(inet_lnaof,_inet_lnaof) +#endif + +/* + * Return the local network address portion of an + * internet address; handles class a/b/c network + * number formats. + */ +in_addr_t +inet_lnaof(struct in_addr in) +{ + in_addr_t i = ntohl(in.s_addr); + + if (IN_CLASSA(i)) + return ((i)&IN_CLASSA_HOST); + else if (IN_CLASSB(i)) + return ((i)&IN_CLASSB_HOST); + else + return ((i)&IN_CLASSC_HOST); +} diff --git a/StdLib/LibC/NetUtil/inet_makeaddr.c b/StdLib/LibC/NetUtil/inet_makeaddr.c new file mode 100644 index 0000000000..5ead092015 --- /dev/null +++ b/StdLib/LibC/NetUtil/inet_makeaddr.c @@ -0,0 +1,74 @@ +/** @File + Formulate an Internet address from network + host. + + Copyright (c) 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + + NetBSD: inet_makeaddr.c,v 1.1 2004/05/20 23:13:02 christos Exp + inet_makeaddr.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include "namespace.h" +#include +#include +#include + +#ifdef __weak_alias +__weak_alias(inet_makeaddr,_inet_makeaddr) +#endif + +/* + * Formulate an Internet address from network + host. Used in + * building addresses stored in the ifnet structure. + */ +struct in_addr +inet_makeaddr(in_addr_t net, in_addr_t host) +{ + in_addr_t addr; + struct in_addr ret; + + if (net < 128) + addr = (net << IN_CLASSA_NSHIFT) | (host & IN_CLASSA_HOST); + else if (net < 65536) + addr = (net << IN_CLASSB_NSHIFT) | (host & IN_CLASSB_HOST); + else if (net < 16777216L) + addr = (net << IN_CLASSC_NSHIFT) | (host & IN_CLASSC_HOST); + else + addr = net | host; + ret.s_addr = htonl(addr); + return ret; +} diff --git a/StdLib/LibC/NetUtil/inet_netof.c b/StdLib/LibC/NetUtil/inet_netof.c new file mode 100644 index 0000000000..dabb768389 --- /dev/null +++ b/StdLib/LibC/NetUtil/inet_netof.c @@ -0,0 +1,69 @@ +/** @File + Return the network number from an internet address. + + Copyright (c) 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + + NetBSD: inet_netof.c,v 1.1 2004/05/20 23:13:02 christos Exp + inet_netof.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include "namespace.h" +#include +#include +#include + +#ifdef __weak_alias +__weak_alias(inet_netof,_inet_netof) +#endif + +/* + * Return the network number from an internet + * address; handles class a/b/c network #'s. + */ +in_addr_t +inet_netof(struct in_addr in) +{ + in_addr_t i = ntohl(in.s_addr); + + if (IN_CLASSA(i)) + return (((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT); + else if (IN_CLASSB(i)) + return (((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT); + else + return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT); +} diff --git a/StdLib/LibC/NetUtil/inet_network.c b/StdLib/LibC/NetUtil/inet_network.c new file mode 100644 index 0000000000..8cec75dc0c --- /dev/null +++ b/StdLib/LibC/NetUtil/inet_network.c @@ -0,0 +1,120 @@ +/** @File + Internet network address interpretation routine. + + Copyright (c) 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + + NetBSD: inet_network.c,v 1.1 2004/05/20 23:13:02 christos Exp + inet_network.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include "namespace.h" +#include +#include +#include + +#include +#include +#ifdef _DIAGNOSTIC +#include /* for NULL */ +#endif + +#ifdef __weak_alias +__weak_alias(inet_network,_inet_network) +#endif + +/* + * Internet network address interpretation routine. + * The library routines call this routine to interpret + * network numbers. + */ +in_addr_t +inet_network(const char *cp) +{ + in_addr_t val; + size_t i, n; + u_char c; + in_addr_t parts[4], *pp = parts; + int digit, base; + + _DIAGASSERT(cp != NULL); + +again: + val = 0; base = 10; digit = 0; + if (*cp == '0') + digit = 1, base = 8, cp++; + if (*cp == 'x' || *cp == 'X') + base = 16, cp++; + while ((c = *cp) != 0) { + if (isdigit(c)) { + if (base == 8 && (c == '8' || c == '9')) + return (INADDR_NONE); + val = (val * base) + (c - '0'); + cp++; + digit = 1; + continue; + } + if (base == 16 && isxdigit(c)) { + val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A')); + cp++; + digit = 1; + continue; + } + break; + } + if (!digit) + return (INADDR_NONE); + if (*cp == '.') { + if (pp >= parts + 4 || val > 0xff) + return (INADDR_NONE); + *pp++ = val, cp++; + goto again; + } + if (*cp && !isspace((u_char) *cp)) + return (INADDR_NONE); + if (pp >= parts + 4 || val > 0xff) + return (INADDR_NONE); + *pp++ = val; + n = pp - parts; + if (n > 4) + return (INADDR_NONE); + for (val = 0, i = 0; i < n; i++) { + val <<= 8; + val |= parts[i] & 0xff; + } + return (val); +} diff --git a/StdLib/LibC/NetUtil/inet_ntoa.c b/StdLib/LibC/NetUtil/inet_ntoa.c new file mode 100644 index 0000000000..11bd842a48 --- /dev/null +++ b/StdLib/LibC/NetUtil/inet_ntoa.c @@ -0,0 +1,69 @@ +/** @File + Convert network-format internet address to base 256 d.d.d.d representation. + + Copyright (c) 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + + NetBSD: inet_ntoa.c,v 1.1 2004/05/20 23:13:02 christos Exp + inet_ntoa.c 8.1 (Berkeley) 6/4/93 + */ +#include + +#include "namespace.h" +#include +#include +#include +#include +#include +#include + +#ifdef __weak_alias + __weak_alias(inet_ntoa,_inet_ntoa) +#endif + +/* + * Convert network-format internet address + * to base 256 d.d.d.d representation. + */ +/*const*/ char * +inet_ntoa(struct in_addr in) { + static char ret[18]; + + //strlcpy(ret, "[inet_ntoa error]", sizeof(ret)); + strncpyX(ret, "[inet_ntoa error]", sizeof(ret)); + (void) inet_ntop(AF_INET, &in, ret, sizeof ret); + return (ret); +} diff --git a/StdLib/LibC/NetUtil/inet_ntop.c b/StdLib/LibC/NetUtil/inet_ntop.c new file mode 100644 index 0000000000..c16935c369 --- /dev/null +++ b/StdLib/LibC/NetUtil/inet_ntop.c @@ -0,0 +1,238 @@ +/** @File + Convert a binary network address into a presentable (printable) format. + + Copyright (c) 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") + * Copyright (c) 1996-1999 by Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + NetBSD: inet_ntop.c,v 1.3.4.2 2007/05/17 21:25:14 jdc Exp + inet_ntop.c,v 1.3.18.2 2005/11/03 23:02:22 marka Exp +**/ +#include + +//#include "port_before.h" + +#include "namespace.h" +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +//#include "port_after.h" + +#ifdef __weak_alias + __weak_alias(inet_ntop,_inet_ntop) +#endif + +/*% + * WARNING: Don't even consider trying to compile this on a system where + * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. + */ + +static const char *inet_ntop4(const u_char *src, char *dst, socklen_t size); +static const char *inet_ntop6(const u_char *src, char *dst, socklen_t size); + +/* char * + * inet_ntop(af, src, dst, size) + * convert a network format address to presentation format. + * return: + * pointer to presentation format address (`dst'), or NULL (see errno). + * author: + * Paul Vixie, 1996. + */ +const char * +inet_ntop(int af, const void *src, char *dst, socklen_t size) +{ + + _DIAGASSERT(src != NULL); + _DIAGASSERT(dst != NULL); + + switch (af) { + case AF_INET: + return (inet_ntop4(src, dst, size)); + case AF_INET6: + return (inet_ntop6(src, dst, size)); + default: + errno = EAFNOSUPPORT; + return (NULL); + } + /* NOTREACHED */ +} + +/* const char * + * inet_ntop4(src, dst, size) + * format an IPv4 address, more or less like inet_ntoa() + * return: + * `dst' (as a const) + * notes: + * (1) uses no statics + * (2) takes a u_char* not an in_addr as input + * author: + * Paul Vixie, 1996. + */ +static const char * +inet_ntop4(const u_char *src, char *dst, socklen_t size) +{ + char tmp[sizeof "255.255.255.255"]; + int l; + + _DIAGASSERT(src != NULL); + _DIAGASSERT(dst != NULL); + + l = snprintf(tmp, sizeof(tmp), "%u.%u.%u.%u", + src[0], src[1], src[2], src[3]); + if (l <= 0 || (socklen_t) l >= size) { + errno = ENOSPC; + return (NULL); + } + //strlcpy(dst, tmp, size); + strncpyX(dst, tmp, (size_t)size); + return (dst); +} + +/* const char * + * inet_ntop6(src, dst, size) + * convert IPv6 binary address into presentation (printable) format + * author: + * Paul Vixie, 1996. + */ +static const char * +inet_ntop6(const u_char *src, char *dst, socklen_t size) +{ + /* + * Note that int32_t and int16_t need only be "at least" large enough + * to contain a value of the specified size. On some systems, like + * Crays, there is no such thing as an integer variable with 16 bits. + * Keep this in mind if you think this function should have been coded + * to use pointer overlays. All the world's not a VAX. + */ + char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"]; + char *tp, *ep; + struct { int base, len; } best, cur; + unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ]; + int i; + int advance; + + _DIAGASSERT(src != NULL); + _DIAGASSERT(dst != NULL); + + /* + * Preprocess: + * Copy the input (bytewise) array into a wordwise array. + * Find the longest run of 0x00's in src[] for :: shorthanding. + */ + memset(words, '\0', sizeof words); + for (i = 0; i < NS_IN6ADDRSZ; i++) + words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); + best.base = -1; + best.len = 0; + cur.base = -1; + cur.len = 0; + for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { + if (words[i] == 0) { + if (cur.base == -1) + cur.base = i, cur.len = 1; + else + cur.len++; + } else { + if (cur.base != -1) { + if (best.base == -1 || cur.len > best.len) + best = cur; + cur.base = -1; + } + } + } + if (cur.base != -1) { + if (best.base == -1 || cur.len > best.len) + best = cur; + } + if (best.base != -1 && best.len < 2) + best.base = -1; + + /* + * Format the result. + */ + tp = tmp; + ep = tmp + sizeof(tmp); + for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { + /* Are we inside the best run of 0x00's? */ + if (best.base != -1 && i >= best.base && + i < (best.base + best.len)) { + if (i == best.base) + *tp++ = ':'; + continue; + } + /* Are we following an initial run of 0x00s or any real hex? */ + if (i != 0) { + if (tp + 1 >= ep) + return (NULL); + *tp++ = ':'; + } + /* Is this address an encapsulated IPv4? */ + if (i == 6 && best.base == 0 && + (best.len == 6 || + (best.len == 7 && words[7] != 0x0001) || + (best.len == 5 && words[5] == 0xffff))) { + if (!inet_ntop4(src+12, tp, (socklen_t)(ep - tp))) + return (NULL); + tp += strlen(tp); + break; + } + advance = snprintf(tp, (size_t)(ep - tp), "%x", words[i]); + if (advance <= 0 || advance >= ep - tp) + return (NULL); + tp += advance; + } + /* Was it a trailing run of 0x00's? */ + if (best.base != -1 && (best.base + best.len) == + (NS_IN6ADDRSZ / NS_INT16SZ)) { + if (tp + 1 >= ep) + return (NULL); + *tp++ = ':'; + } + if (tp + 1 >= ep) + return (NULL); + *tp++ = '\0'; + + /* + * Check for overflow, copy, and we're done. + */ + if ((size_t)(tp - tmp) > size) { + errno = ENOSPC; + return (NULL); + } + //strlcpy(dst, tmp, size); + strncpyX(dst, tmp, (size_t)size); + return (dst); +} + +/*! \file */ diff --git a/StdLib/LibC/Signal/Signal.c b/StdLib/LibC/Signal/Signal.c new file mode 100644 index 0000000000..15b9ecabc2 --- /dev/null +++ b/StdLib/LibC/Signal/Signal.c @@ -0,0 +1,93 @@ +/** @file + Implementation of the signal and raise functions as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#include +#include + +#include +#include +#include +#include + +/** The signal function associates a "signal handler" with a signal number. + + The signal function chooses one of three ways in which receipt of the + signal number, sig, is to be subsequently handled. If the value of func + is SIG_DFL, default handling for that signal will occur. If the value of + func is SIG_IGN, the signal will be ignored. Otherwise, func shall point + to a function to be called when that signal occurs. An invocation of such a + function because of a signal, or (recursively) of any further functions + called by that invocation (other than functions in the standard library), + is called a signal handler. + + At program startup, the equivalent of signal(sig, SIG_IGN); may be executed + for some signals selected in an implementation-defined manner; the + equivalent of signal(sig, SIG_DFL); is executed for all other signals + defined by the implementation. + + @return If the request can be honored, the signal function returns the + value of func for the most recent successful call to signal for + the specified signal sig. Otherwise, a value of SIG_ERR is + returned and a positive value is stored in errno. + */ +__sighandler_t * +signal(int sig, __sighandler_t *func) +{ + __sighandler_t *OldHandler; + + if (sig < 0 || sig >= SIG_LAST) { + errno = EINVAL; + return SIG_ERR; + } + OldHandler = gMD->sigarray[sig]; + gMD->sigarray[sig] = func; + + return OldHandler; +} + +static +void +_defaultSignalHandler( int sig ) +{ + Print(L"\nCaught signal %d.\n", sig); +} + +/** Send a signal. + + The raise function carries out the actions described for signal, above, + for the signal sig. + + If a signal handler is called, the raise function shall not return until + after the signal handler does. + + @return The raise function returns zero if successful, + nonzero if unsuccessful. +**/ +int +raise( int sig) +{ + __sighandler_t *Handler; + + if (sig < 0 || sig >= SIG_LAST) { + return EINVAL; + } + Handler = gMD->sigarray[sig]; + + if(Handler == SIG_DFL) { + _defaultSignalHandler( sig ); + } + else if( Handler != SIG_IGN) { + Handler( sig ); + } + return 0; +} diff --git a/StdLib/LibC/Signal/Signal.inf b/StdLib/LibC/Signal/Signal.inf new file mode 100644 index 0000000000..1d991887dd --- /dev/null +++ b/StdLib/LibC/Signal/Signal.inf @@ -0,0 +1,39 @@ +## @file +# Standard C library: StdLib implementations. +# +# Copyright (c) 2010, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php. +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = LibSignal + FILE_GUID = 00c86db8-013b-4ff4-b8e9-208f4fcf1c00 + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + LIBRARY_CLASS = LibSignal + +# +# VALID_ARCHITECTURES = IA32 X64 IPF +# + +[Sources] + Signal.c + +[Packages] + StdLib/StdLib.dec + StdLibPrivateInternalFiles/DoNotUse.dec + MdePkg/MdePkg.dec + ShellPkg/ShellPkg.dec + +[LibraryClasses] + UefiLib + LibC diff --git a/StdLib/LibC/StdLib/Bsearch.c b/StdLib/LibC/StdLib/Bsearch.c new file mode 100644 index 0000000000..90a42bfd12 --- /dev/null +++ b/StdLib/LibC/StdLib/Bsearch.c @@ -0,0 +1,105 @@ +/** @file + Binary search utility function. + + This utility makes use of a comparison function to search arrays of + unspecified type. Where an argument declared as size_t nmemb specifies the + length of the array for a function, nmemb can have the value zero on a call + to that function; the comparison function is not called, a search finds no + matching element. Pointer arguments on such a call shall still have valid + values. + + The implementation shall ensure that the second argument of the comparison + function is a pointer to an element of the array. The first argument shall + equal key. + + The comparison function shall not alter the contents of the array. The + implementation may reorder elements of the array between calls to the + comparison function, but shall not alter the contents of any individual + element. + + When the same objects (consisting of size bytes, irrespective of their + current positions in the array) are passed more than once to the comparison + function, the results shall be consistent with one another. That is, the same + object shall always compare the same way with the key. + + A sequence point occurs immediately before and immediately after each call to + the comparison function, and also between any call to the comparison function + and any movement of the objects passed as arguments to that call. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + + ("$FreeBSD: src/lib/libc/stdlib/bsearch.c,v 1.4.10.1.2.1 2009/10/25 01:10:29 kensmith Exp $"); +**/ +#include +#include +#include + +/* + * Perform a binary search. + * + * The code below is a bit sneaky. After a comparison fails, we + * divide the work in half by moving either left or right. If lim + * is odd, moving left simply involves halving lim: e.g., when lim + * is 5 we look at item 2, so we change lim to 2 so that we will + * look at items 0 & 1. If lim is even, the same applies. If lim + * is odd, moving right again involes halving lim, this time moving + * the base up one item past p: e.g., when lim is 5 we change base + * to item 3 and make lim 2 so that we will look at items 3 and 4. + * If lim is even, however, we have to shrink it by one before + * halving: e.g., when lim is 4, we still looked at item 2, so we + * have to make lim 3, then halve, obtaining 1, so that we will only + * look at item 3. + */ +void * +bsearch( + const void *key, + const void *base0, + size_t nmemb, + size_t size, + int (*compar)(const void *, const void *) + ) +{ + const char *base = base0; + size_t lim; + int cmp; + const void *p; + + for (lim = nmemb; lim != 0; lim >>= 1) { + p = base + (lim >> 1) * size; + cmp = (*compar)(key, p); + if (cmp == 0) + return ((void *)p); + if (cmp > 0) { /* key > p: move right */ + base = (char *)p + size; + lim--; + } /* else move left */ + } + return (NULL); +} diff --git a/StdLib/LibC/StdLib/Environs.c b/StdLib/LibC/StdLib/Environs.c new file mode 100644 index 0000000000..5d1584ddea --- /dev/null +++ b/StdLib/LibC/StdLib/Environs.c @@ -0,0 +1,208 @@ +/** @file + Implementation of the functions responsible for communication with + the environment: + - abort(void) + - atexit(void(*handler)(void)) + - exit(int status) + - _Exit(int status) + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +/* ################# Public Functions ################################### */ + +/** The abort function causes abnormal program termination to occur, unless + the signal SIGABRT is being caught and the signal handler does not return. + + Open streams with unwritten buffered data are not flushed, open + streams are not closed, and temporary files are not removed by abort. + +**/ +void +abort(void) +{ + if (!gMD->aborting) { + gMD->aborting = TRUE; + + if (gMD->cleanup != NULL) { + gMD->cleanup(); + } + } + raise(SIGABRT); + _Exit(EXIT_FAILURE); // In case raise returns. +} + +/** The atexit function registers the function pointed to by func, to be + called without arguments at normal program termination. + + The implementation shall support the registration of + at least 32 functions. + + @return The atexit function returns zero if the registration succeeds, + nonzero if it fails. +**/ +int +atexit(void (*handler)(void)) +{ + int retval = 1; + + if((handler != NULL) && (gMD->num_atexit < ATEXIT_MAX)) { + gMD->atexit_handler[gMD->num_atexit++] = handler; + retval = 0; + } + return retval; +} + +/** The exit function causes normal program termination to occur. If more than + one call to the exit function is executed by a program, + the behavior is undefined. + + First, all functions registered by the atexit function are called, in the + reverse order of their registration. If, during the call to any such function, a + call to the longjmp function is made that would terminate the call to the + registered function, the behavior is undefined. + + Next, all open streams with unwritten buffered data are flushed, all open + streams are closed, and all files created by the tmpfile function + are removed. + + The status returned to the host environment is determined in the same way + as for the _Exit function. +**/ +void +exit(int status) +{ + int i = gMD->num_atexit; + + // Call all registered atexit functions in reverse order + if( i > 0) { + do { + (gMD->atexit_handler[--i])(); + } while( i > 0); + } + + if (gMD->cleanup != NULL) { + gMD->cleanup(); + } + _Exit(status); +} + +typedef +EFI_STATUS +(EFIAPI *ExitFuncPtr)( + IN EFI_HANDLE ImageHandle, + IN EFI_STATUS ExitStatus, + IN UINTN ExitDataSize, + IN CHAR16 *ExitData OPTIONAL +) __noreturn; + +/** The _Exit function causes normal program termination to occur and control + to be returned to the host environment. + + No functions registered by the atexit function or signal handlers + registered by the signal function are called. Open streams with unwritten + buffered data are not flushed, open streams are not closed, and temporary + files are not removed by abort. + + Finally, control is returned to the host environment. If the value of + status is zero, or EXIT_SUCCESS, status is returned unchanged. If the value + of status is EXIT_FAILURE, RETURN_ABORTED is returned. + Otherwise, status is returned unchanged. +**/ +void +_Exit(int status) +{ + RETURN_STATUS ExitVal = (RETURN_STATUS)status; + ExitFuncPtr ExitFunc; + + if( ExitVal == EXIT_FAILURE) { + ExitVal = RETURN_ABORTED; + } + + ExitFunc = (ExitFuncPtr)gBS->Exit; + + //gBS->Exit(gImageHandle, ExitVal, 0, NULL); /* abort() */ + ExitFunc(gImageHandle, ExitVal, 0, NULL); /* abort() */ +} + +/** If string is a null pointer, the system function determines whether the + host environment has a command processor. If string is not a null pointer, + the system function passes the string pointed to by string to that command + processor to be executed in a manner which the implementation shall + document; this might then cause the program calling system to behave in a + non-conforming manner or to terminate. + + @retval EXIT_FAILURE EFIerrno will contain the EFI status code + indicating the cause of failure. + + @retval EXIT_SUCCESS EFIerrno will contain the EFI status returned + by the executed command string. + @retval 0 If string is NULL, 0 means a command processor + is not available. + @retval 1 If string is NULL, 1 means a command processor + is available. +**/ +int +system(const char *string) +{ + EFI_STATUS CmdStat; + EFI_STATUS OpStat; + EFI_HANDLE MyHandle = gImageHandle; + + if( string == NULL) { + return 1; + } + (void)AsciiStrToUnicodeStr( string, gMD->UString); + OpStat = ShellExecute( &MyHandle, gMD->UString, FALSE, NULL, &CmdStat); + if(OpStat == RETURN_SUCCESS) { + EFIerrno = CmdStat; + return EXIT_SUCCESS; + } + EFIerrno = OpStat; + return EXIT_FAILURE; +} + +/** The getenv function searches an environment list, provided by the host + environment, for a string that matches the string pointed to by name. The + set of environment names and the method for altering the environment list + are determined by the underlying UEFI Shell implementation. + + @return The getenv function returns a pointer to a string associated with + the matched list member. The string pointed to shall not be + modified by the program, but may be overwritten by a subsequent + call to the getenv function. If the specified name cannot be + found, a null pointer is returned. +**/ +char *getenv(const char *name) +{ + const CHAR16 *EfiEnv; + char *retval = NULL; + + (void)AsciiStrToUnicodeStr( name, gMD->UString); + EfiEnv = ShellGetEnvironmentVariable(gMD->UString); + if(EfiEnv != NULL) { + retval = UnicodeStrToAsciiStr( EfiEnv, gMD->ASgetenv); + } + + return retval; +} diff --git a/StdLib/LibC/StdLib/Malloc.c b/StdLib/LibC/StdLib/Malloc.c new file mode 100644 index 0000000000..51068d3a06 --- /dev/null +++ b/StdLib/LibC/StdLib/Malloc.c @@ -0,0 +1,226 @@ +/** @file + Definitions for memory allocation routines: calloc, malloc, realloc, free. + + The order and contiguity of storage allocated by successive calls to the + calloc, malloc, and realloc functions is unspecified. The pointer returned + if the allocation succeeds is suitably aligned so that it may be assigned to + a pointer of any type of object and then used to access such an object or an + array of such objects in the space allocated (until the space is explicitly + freed or reallocated). Each such allocation shall yield a pointer to an + object disjoint from any other object. The pointer returned points to the + start (lowest byte address) of the allocated space. If the space can not be + allocated, a null pointer is returned. If the size of the space requested + is zero, the behavior is implementation-defined; the value returned shall be + either a null pointer or a unique pointer. The value of a pointer that + refers to freed space is indeterminate. + +Copyright (c) 2010, Intel Corporation. All rights reserved.
+This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + */ +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +/** The UEFI functions do not provide a way to determine the size of an + allocated region of memory given just a pointer to the start of that + region. Since this is required for the implementation of realloc, + the memory head structure from Core/Dxe/Mem/Pool.c has been reproduced + here. + + NOTE: If the UEFI implementation is changed, the realloc function may cease + to function properly. +**/ +#define POOL_HEAD_SIGNATURE SIGNATURE_32('p','h','d','0') +typedef struct { + UINT32 Signature; + UINT32 Size; + EFI_MEMORY_TYPE Type; + UINTN Reserved; + CHAR8 Data[1]; +} POOL_HEAD; + +/****************************/ + +/** The malloc function allocates space for an object whose size is specified + by size and whose value is indeterminate. + + This implementation uses the UEFI memory allocation boot services to get a + region of memory that is 8-byte aligned and of the specified size. The + region is allocated with type EfiLoaderData. + + @param size Size, in bytes, of the region to allocate. + + @return NULL is returned if the space could not be allocated and errno + contains the cause. Otherwise, a pointer to an 8-byte aligned + region of the requested size is returned.
+ If NULL is returned, errno may contain: + - EINVAL: Requested Size is zero. + - ENOMEM: Memory could not be allocated. +**/ +void * +malloc(size_t Size) +{ + void *RetVal; + EFI_STATUS Status; + + if( Size == 0) { + errno = EINVAL; // Make errno diffenent, just in case of a lingering ENOMEM. + return NULL; + } + + Status = gBS->AllocatePool( EfiLoaderData, (UINTN)Size, &RetVal); + if( Status != EFI_SUCCESS) { + RetVal = NULL; + errno = ENOMEM; + } + return RetVal; +} + +/** The calloc function allocates space for an array of Num objects, each of + whose size is Size. The space is initialized to all bits zero. + + This implementation uses the UEFI memory allocation boot services to get a + region of memory that is 8-byte aligned and of the specified size. The + region is allocated with type EfiLoaderData. + + @param Num Number of objects to allocate. + @param Size Size, in bytes, of the objects to allocate space for. + + @return NULL is returned if the space could not be allocated and errno + contains the cause. Otherwise, a pointer to an 8-byte aligned + region of the requested size is returned. +**/ +void * +calloc(size_t Num, size_t Size) +{ + void *RetVal; + size_t NumSize; + + NumSize = Num * Size; + if (NumSize == 0) { + return NULL; + } + RetVal = malloc(NumSize); + if( RetVal != NULL) { + (VOID)ZeroMem( RetVal, NumSize); + } + return RetVal; +} + +/** The free function causes the space pointed to by Ptr to be deallocated, + that is, made available for further allocation. + + If Ptr is a null pointer, no action occurs. Otherwise, if the argument + does not match a pointer earlier returned by the calloc, malloc, or realloc + function, or if the space has been deallocated by a call to free or + realloc, the behavior is undefined. + + @param Ptr Pointer to a previously allocated region of memory to be freed. + +**/ +void +free(void *Ptr) +{ + (void) gBS->FreePool (Ptr); +} + +/** The realloc function changes the size of the object pointed to by Ptr to + the size specified by NewSize. + + The contents of the object are unchanged up to the lesser of the new and + old sizes. If the new size is larger, the value of the newly allocated + portion of the object is indeterminate. + + If Ptr is a null pointer, the realloc function behaves like the malloc + function for the specified size. + + If Ptr does not match a pointer earlier returned by the calloc, malloc, or + realloc function, or if the space has been deallocated by a call to the free + or realloc function, the behavior is undefined. + + If the space cannot be allocated, the object pointed to by Ptr is unchanged. + + If NewSize is zero and Ptr is not a null pointer, the object it points to + is freed. + + This implementation uses the UEFI memory allocation boot services to get a + region of memory that is 8-byte aligned and of the specified size. The + region is allocated with type EfiLoaderData. + + The following combinations of Ptr and NewSize can occur:
+ Ptr NewSize
+ -------- -------------------
+ - NULL 0 Returns NULL; + - NULL > 0 Same as malloc(NewSize) + - invalid X Returns NULL; + - valid NewSize >= OldSize Returns malloc(NewSize) with Oldsize bytes copied from Ptr + - valid NewSize < OldSize Returns new buffer with Oldsize bytes copied from Ptr + - valid 0 Return NULL. Frees Ptr. + + + @param Ptr Pointer to a previously allocated region of memory to be resized. + @param NewSize Size, in bytes, of the new object to allocate space for. + + @return NULL is returned if the space could not be allocated and errno + contains the cause. Otherwise, a pointer to an 8-byte aligned + region of the requested size is returned. If NewSize is zero, + NULL is returned and errno will be unchanged. +**/ +void * +realloc(void *Ptr, size_t NewSize) +{ + void *RetVal = NULL; + POOL_HEAD *Head; + UINTN OldSize = 0; + UINTN NumCpy; + + // Find out the size of the OLD memory region + if( Ptr != NULL) { + Head = BASE_CR (Ptr, POOL_HEAD, Data); + assert(Head != NULL); + if (Head->Signature != POOL_HEAD_SIGNATURE) { + errno = EFAULT; + return NULL; + } + OldSize = Head->Size; + } + + // At this point, Ptr is either NULL or a valid pointer to an allocated space + + if( NewSize > 0) { + RetVal = malloc(NewSize); // Get the NEW memory region + if( Ptr != NULL) { // If there is an OLD region... + if( RetVal != NULL) { // and the NEW region was successfully allocated + NumCpy = OldSize; + if( OldSize > NewSize) { + NumCpy = NewSize; + } + (VOID)CopyMem( RetVal, Ptr, NumCpy); // Copy old data to the new region. + free( Ptr); // and reclaim the old region. + } + } + } + else { + if( Ptr != NULL) { + free( Ptr); // Reclaim the old region. + } + } + + return RetVal; +} diff --git a/StdLib/LibC/StdLib/NumericInt.c b/StdLib/LibC/StdLib/NumericInt.c new file mode 100644 index 0000000000..058ad04959 --- /dev/null +++ b/StdLib/LibC/StdLib/NumericInt.c @@ -0,0 +1,398 @@ +/** @file + Integer Numeric Conversion Functions. + + The atoi, atol, and atoll functions convert the initial portion of the string + pointed to by nptr to int, long int, and long long int representation, + respectively. They are equivalent to: + - atoi: (int)strtol(nptr, (char **)NULL, 10) + - atol: strtol(nptr, (char **)NULL, 10) + - atoll: strtoll(nptr, (char **)NULL, 10) + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include +#include + +#include + +#include +#include +#include +#include + +/** The atoi function converts the initial portion of the string pointed to by + nptr to int representation. Except for the behavior on error, it is + equivalent to: + - (int)strtol(nptr, (char **)NULL, 10) + + @return The atoi function returns the converted value. +**/ +int +atoi(const char *nptr) +{ + int Retval; + BOOLEAN Negative = FALSE; + + while(isspace((const unsigned char)*nptr)) ++nptr; // Skip leading spaces + + if(*nptr == '+') { + Negative = FALSE; + ++nptr; + } + else if(*nptr == '-') { + Negative = TRUE; + ++nptr; + } + Retval = (int)AsciiStrDecimalToUintn(nptr); + if(Negative) { + Retval = -Retval; + } + return Retval; +} + +/** The atol function converts the initial portion of the string pointed to by + nptr to long int representation. Except for the behavior on error, it is + equivalent to: + - strtol(nptr, (char **)NULL, 10) + + @return The atol function returns the converted value. +**/ +long int +atol(const char *nptr) +{ + long int Retval; + BOOLEAN Negative = FALSE; + + while(isspace(*nptr)) ++nptr; // Skip leading spaces + + if(*nptr == '+') { + Negative = FALSE; + ++nptr; + } + else if(*nptr == '-') { + Negative = TRUE; + ++nptr; + } + Retval = (long int)AsciiStrDecimalToUint64(nptr); + if(Negative) { + Retval = -Retval; + } + return Retval; +} + +/** The atoll function converts the initial portion of the string pointed to by + nptr to long long int representation. Except for the behavior on error, it + is equivalent to: + - strtoll(nptr, (char **)NULL, 10) + + @return The atoll function returns the converted value. +**/ +long long int +atoll(const char *nptr) +{ + long long int Retval; + BOOLEAN Negative = FALSE; + + while(isspace(*nptr)) ++nptr; // Skip leading spaces + + if(*nptr == '+') { + Negative = FALSE; + ++nptr; + } + else if(*nptr == '-') { + Negative = TRUE; + ++nptr; + } + Retval = (long long int)AsciiStrDecimalToUint64(nptr); + if(Negative) { + Retval = -Retval; + } + return Retval; +} + +static int +Digit2Val( int c) +{ + if(__isHexLetter(c)) { /* If c is one of [A-Fa-f]... */ + c = toupper(c) - 7; // Adjust so 'A' is ('9' + 1) + } + return c - '0'; // Value returned is between 0 and 35, inclusive. +} + +/** The strtol, strtoll, strtoul, and strtoull functions convert the initial + portion of the string pointed to by nptr to long int, long long int, + unsigned long int, and unsigned long long int representation, respectively. + First, they decompose the input string into three parts: an initial, + possibly empty, sequence of white-space characters (as specified by the + isspace function), a subject sequence resembling an integer represented in + some radix determined by the value of base, and a final string of one or + more unrecognized characters, including the terminating null character of + the input string. Then, they attempt to convert the subject sequence to an + integer, and return the result. + + If the value of base is zero, the expected form of the subject sequence is + that of an integer constant, optionally preceded + by a plus or minus sign, but not including an integer suffix. If the value + of base is between 2 and 36 (inclusive), the expected form of the subject + sequence is a sequence of letters and digits representing an integer with + the radix specified by base, optionally preceded by a plus or minus sign, + but not including an integer suffix. The letters from a (or A) through z + (or Z) are ascribed the values 10 through 35; only letters and digits whose + ascribed values are less than that of base are permitted. If the value of + base is 16, the characters 0x or 0X may optionally precede the sequence of + letters and digits, following the sign if present. + + The subject sequence is defined as the longest initial subsequence of the + input string, starting with the first non-white-space character, that is of + the expected form. The subject sequence contains no characters if the input + string is empty or consists entirely of white space, or if the first + non-white-space character is other than a sign or a permissible letter or digit. + + If the subject sequence has the expected form and the value of base is + zero, the sequence of characters starting with the first digit is + interpreted as an integer constant. If the subject sequence has the + expected form and the value of base is between 2 and 36, it is used as the + base for conversion, ascribing to each letter its value as given above. If + the subject sequence begins with a minus sign, the value resulting from the + conversion is negated (in the return type). A pointer to the final string + is stored in the object pointed to by endptr, provided that endptr is + not a null pointer. + + In other than the "C" locale, additional locale-specific subject sequence + forms may be accepted. + + If the subject sequence is empty or does not have the expected form, no + conversion is performed; the value of nptr is stored in the object pointed + to by endptr, provided that endptr is not a null pointer. + + @return The strtol, strtoll, strtoul, and strtoull functions return the + converted value, if any. If no conversion could be performed, zero + is returned. If the correct value is outside the range of + representable values, LONG_MIN, LONG_MAX, LLONG_MIN, LLONG_MAX, + ULONG_MAX, or ULLONG_MAX is returned (according to the return type + and sign of the value, if any), and the value of the macro ERANGE + is stored in errno. +**/ +long +strtol(const char * __restrict nptr, char ** __restrict endptr, int base) +{ + long Result = 0; + long Previous; + int temp; + BOOLEAN Negative = FALSE; + + if((base < 0) || (base == 1) || (base > 36)) { + *endptr = NULL; + return 0; + } + // Skip leading spaces. + while(isspace(*nptr)) ++nptr; + + // Process Subject sequence: optional sign followed by digits. + if(*nptr == '+') { + Negative = FALSE; + ++nptr; + } + else if(*nptr == '-') { + Negative = TRUE; + ++nptr; + } + if( (base == 16) && (*nptr == '0') && (toupper(nptr[1]) == 'X')) { + nptr += 2; + } + while( isalnum(*nptr) && ((temp = Digit2Val(*nptr)) < base)) { + Previous = Result; + Result = (Result * base) + (long int)temp; + if( Result <= Previous) { // Detect Overflow + if(Negative) { + Result = LONG_MIN; + } + else { + Result = LONG_MAX; + } + Negative = FALSE; + errno = ERANGE; + break; + } + ++nptr; + } + if(Negative) { + Result = -Result; + } + + // Save pointer to final sequence + if( endptr != NULL) { + *endptr = (char *)nptr; + } + return Result; +} + +/** The strtoul function converts the initial portion of the string pointed to + by nptr to unsigned long int representation. + + See the description for strtol for more information. + + @return The strtoul function returns the converted value, if any. If no + conversion could be performed, zero is returned. If the correct + value is outside the range of representable values, ULONG_MAX is + returned and the value of the macro ERANGE is stored in errno. +**/ +unsigned long +strtoul(const char * __restrict nptr, char ** __restrict endptr, int base) +{ + unsigned long Result = 0; + unsigned long Previous; + int temp; + + if((base < 0) || (base == 1) || (base > 36)) { + *endptr = NULL; + return 0; + } + // Skip leading spaces. + while(isspace(*nptr)) ++nptr; + + // Process Subject sequence: optional + sign followed by digits. + if(*nptr == '+') { + ++nptr; + } + if( (base == 16) && (*nptr == '0') && (toupper(nptr[1]) == 'X')) { + nptr += 2; + } + while( isalnum(*nptr) && ((temp = Digit2Val(*nptr)) < base)) { + Previous = Result; + Result = (Result * base) + (unsigned long)temp; + if( Result < Previous) { // If we overflowed + Result = ULONG_MAX; + errno = ERANGE; + break; + } + ++nptr; + } + + // Save pointer to final sequence + if( endptr != NULL) { + *endptr = (char *)nptr; + } + return Result; +} + +/** The strtoll function converts the initial portion of the string pointed to + by nptr to long long int representation. + + See the description for strtol for more information. + + @return The strtoll function returns the converted value, if any. If no + conversion could be performed, zero is returned. If the correct + value is outside the range of representable values, LLONG_MIN or + LLONG_MAX is returned (according to the sign of the value, if any), + and the value of the macro ERANGE is stored in errno. +**/ +long long +strtoll(const char * __restrict nptr, char ** __restrict endptr, int base) +{ + long long Result = 0; + long long Previous; + int temp; + BOOLEAN Negative = FALSE; + + if((base < 0) || (base == 1) || (base > 36)) { + *endptr = NULL; + return 0; + } + // Skip leading spaces. + while(isspace(*nptr)) ++nptr; + + // Process Subject sequence: optional sign followed by digits. + if(*nptr == '+') { + Negative = FALSE; + ++nptr; + } + else if(*nptr == '-') { + Negative = TRUE; + ++nptr; + } + if( (base == 16) && (*nptr == '0') && (toupper(nptr[1]) == 'X')) { + nptr += 2; + } + while( isalnum(*nptr) && ((temp = Digit2Val(*nptr)) < base)) { + Previous = Result; + Result = (Result * base) + (long long int)temp; + if( Result <= Previous) { // Detect Overflow + if(Negative) { + Result = LLONG_MIN; + } + else { + Result = LLONG_MAX; + } + Negative = FALSE; + errno = ERANGE; + break; + } + ++nptr; + } + if(Negative) { + Result = -Result; + } + + // Save pointer to final sequence + if( endptr != NULL) { + *endptr = (char *)nptr; + } + return Result; +} + +/** The strtoull function converts the initial portion of the string pointed to + by nptr to unsigned long long int representation. + + See the description for strtol for more information. + + @return The strtoull function returns the converted value, if any. If no + conversion could be performed, zero is returned. If the correct + value is outside the range of representable values, ULLONG_MAX is + returned and the value of the macro ERANGE is stored in errno. +**/ +unsigned long long +strtoull(const char * __restrict nptr, char ** __restrict endptr, int base) +{ + unsigned long long Result = 0; + unsigned long long Previous; + int temp; + + if((base < 0) || (base == 1) || (base > 36)) { + *endptr = NULL; + return 0; + } + // Skip leading spaces. + while(isspace(*nptr)) ++nptr; + + // Process Subject sequence: optional + sign followed by digits. + if(*nptr == '+') { + ++nptr; + } + if( (base == 16) && (*nptr == '0') && (toupper(nptr[1]) == 'X')) { + nptr += 2; + } + while( isalnum(*nptr) && ((temp = Digit2Val(*nptr)) < base)) { + Previous = Result; + Result = (Result * base) + (unsigned long long)temp; + if( Result < Previous) { // If we overflowed + Result = ULLONG_MAX; + errno = ERANGE; + break; + } + ++nptr; + } + + // Save pointer to final sequence + if( endptr != NULL) { + *endptr = (char *)nptr; + } + return Result; +} diff --git a/StdLib/LibC/StdLib/Qsort.c b/StdLib/LibC/StdLib/Qsort.c new file mode 100644 index 0000000000..3c98c6aa9e --- /dev/null +++ b/StdLib/LibC/StdLib/Qsort.c @@ -0,0 +1,205 @@ +/** @file + Quick Sort utility function. + + This utility makes use of a comparison function to search arrays of + unspecified type. Where an argument declared as size_t nmemb specifies the + length of the array for a function, nmemb can have the value zero on a call + to that function; the comparison function is not called, a search finds no + matching element. Pointer arguments on such a call shall still have valid + values. + + The implementation shall ensure that both arguments of the comparison + function are pointers to elements of the array. + + The comparison function shall not alter the contents of the array. The + implementation may reorder elements of the array between calls to the + comparison function, but shall not alter the contents of any individual + element. + + When the same objects (consisting of size bytes, irrespective of their + current positions in the array) are passed more than once to the comparison + function, the results shall be consistent with one another. That is, they + define a total ordering on the array. + + A sequence point occurs immediately before and immediately after each call to + the comparison function, and also between any call to the comparison function + and any movement of the objects passed as arguments to that call. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + + ("$FreeBSD: src/lib/libc/stdlib/qsort.c,v 1.15.2.1.2.1 2009/10/25 01:10:29 kensmith Exp $"); + */ +#include + +#include + +typedef int cmp_t(const void *, const void *); + +static __inline char *med3(char *, char *, char *, cmp_t *); +static __inline void swapfunc(char *, char *, size_t, int); + +/* + * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". + */ +#define swapcode(TYPE, parmi, parmj, n) { \ + size_t i = (n) / sizeof (TYPE); \ + TYPE *pi = (TYPE *) (parmi); \ + TYPE *pj = (TYPE *) (parmj); \ + do { \ + TYPE t = *pi; \ + *pi++ = *pj; \ + *pj++ = t; \ + } while (--i > 0); \ +} + +#define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \ + es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1; + +static __inline void +swapfunc(char *a, char *b, size_t n, int swaptype) +{ + if(swaptype <= 1) + swapcode(long, a, b, n) + else + swapcode(char, a, b, n) +} + +#define swap(a, b) \ + if (swaptype == 0) { \ + long t = *(long *)(a); \ + *(long *)(a) = *(long *)(b); \ + *(long *)(b) = t; \ + } else \ + swapfunc(a, b, es, swaptype) + +#define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype) + +static __inline char * +med3(char *a, char *b, char *c, cmp_t *cmp ) +{ + return cmp(a, b) < 0 ? + (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a )) + :(cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c )); +} + +/* The qsort function sorts an array of nmemb objects, the initial element of + which is pointed to by base. The size of each object is specified by size. + + The contents of the array are sorted into ascending order according to a + comparison function pointed to by compar, which is called with two + arguments that point to the objects being compared. The function shall + return an integer less than, equal to, or greater than zero if the first + argument is considered to be respectively less than, equal to, or greater + than the second. + + If two elements compare as equal, their order in the resulting sorted array + is unspecified. +*/ +void +qsort(void *a, size_t n, size_t es, cmp_t *cmp) +{ + char *pa, *pb, *pc, *pd, *pl, *pm, *pn; + size_t d, r; + int cmp_result; + int swaptype, swap_cnt; + +loop: SWAPINIT(a, es); + swap_cnt = 0; + if (n < 7) { + for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) + for (pl = pm; + pl > (char *)a && cmp(pl - es, pl) > 0; + pl -= es) + swap(pl, pl - es); + return; + } + pm = (char *)a + (n / 2) * es; + if (n > 7) { + pl = a; + pn = (char *)a + (n - 1) * es; + if (n > 40) { + d = (n / 8) * es; + pl = med3(pl, pl + d, pl + 2 * d, cmp); + pm = med3(pm - d, pm, pm + d, cmp); + pn = med3(pn - 2 * d, pn - d, pn, cmp); + } + pm = med3(pl, pm, pn, cmp); + } + swap(a, pm); + pa = pb = (char *)a + es; + + pc = pd = (char *)a + (n - 1) * es; + for (;;) { + while (pb <= pc && (cmp_result = cmp(pb, a)) <= 0) { + if (cmp_result == 0) { + swap_cnt = 1; + swap(pa, pb); + pa += es; + } + pb += es; + } + while (pb <= pc && (cmp_result = cmp(pc, a)) >= 0) { + if (cmp_result == 0) { + swap_cnt = 1; + swap(pc, pd); + pd -= es; + } + pc -= es; + } + if (pb > pc) + break; + swap(pb, pc); + swap_cnt = 1; + pb += es; + pc -= es; + } + if (swap_cnt == 0) { /* Switch to insertion sort */ + for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es) + for (pl = pm; + pl > (char *)a && cmp(pl - es, pl) > 0; + pl -= es) + swap(pl, pl - es); + return; + } + + pn = (char *)a + n * es; + r = MIN(pa - (char *)a, pb - pa); + vecswap(a, pb - r, r); + r = MIN((size_t)(pd - pc), ((size_t)(pn - pd)) - es); + vecswap(pb, pn - r, r); + if ((size_t)(r = pb - pa) > es) + qsort(a, r / es, es, cmp); + if ((size_t)(r = pd - pc) > es) { + /* Iterate rather than recurse to save stack space */ + a = pn - r; + n = r / es; + goto loop; + } +/* qsort(pn - r, r / es, es, cmp);*/ +} diff --git a/StdLib/LibC/StdLib/Rand.c b/StdLib/LibC/StdLib/Rand.c new file mode 100644 index 0000000000..4e17ff1313 --- /dev/null +++ b/StdLib/LibC/StdLib/Rand.c @@ -0,0 +1,67 @@ +/*- + * Portions Copyright (c) 2010, Intel Corporation. All rights reserved.
+ * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +//__FBSDID("$FreeBSD: src/lib/libc/stdlib/rand.c,v 1.17.2.1.2.1 2009/10/25 01:10:29 kensmith Exp $"); +#include + +#include + +static UINT32 next = 1; + +/** Compute a pseudo-random number. + * + * Compute x = (7^5 * x) mod (2^31 - 1) + * without overflowing 31 bits: + * (2^31 - 1) = 127773 * (7^5) + 2836 + * From "Random number generators: good ones are hard to find", + * Park and Miller, Communications of the ACM, vol. 31, no. 10, + * October 1988, p. 1195. +**/ +int +rand() +{ + INT32 hi, lo, x; + + /* Can't be initialized with 0, so use another value. */ + if (next == 0) + next = 123459876; + hi = next / 127773; + lo = next % 127773; + x = 16807 * lo - 2836 * hi; + if (x < 0) + x += 0x7fffffff; + return ((next = x) % ((UINT32)RAND_MAX + 1)); +} + +void +srand(unsigned int seed) +{ + next = (UINT32)seed; +} diff --git a/StdLib/LibC/StdLib/StdLib.inf b/StdLib/LibC/StdLib/StdLib.inf new file mode 100644 index 0000000000..21d1c1f4aa --- /dev/null +++ b/StdLib/LibC/StdLib/StdLib.inf @@ -0,0 +1,67 @@ +## @file +# Standard C library: StdLib implementations. +# +# Copyright (c) 2010, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php. +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = LibStdLib + FILE_GUID = f8a312f8-bccc-479f-b49b-ce129568b06a + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + LIBRARY_CLASS = LibStdLib + +# +# VALID_ARCHITECTURES = IA32 X64 IPF +# + +[Sources] + Bsearch.c + Environs.c + Malloc.c + NumericInt.c + Qsort.c + Rand.c + strtoimax.c + strtoumax.c + Xabs.c + Xdiv.c + +[Packages] + StdLib/StdLib.dec + StdLibPrivateInternalFiles/DoNotUse.dec + MdePkg/MdePkg.dec + ShellPkg/ShellPkg.dec + +[LibraryClasses] + UefiBootServicesTableLib + DebugLib + BaseLib + BaseMemoryLib + MemoryAllocationLib + ShellLib + LibC + LibCType + LibSignal + +################################################################ +# +# The Build Options, below, are only used when building the C library. +# DO NOT use them when building your application! +# Nasty things could happen if you do. +# +# /Oi- is required for Microsoft VC++ to allow "intrinsic" functions to be +# defined in this library. +# +[BuildOptions] + MSFT:*_*_*_CC_FLAGS = /Oi- diff --git a/StdLib/LibC/StdLib/Xabs.c b/StdLib/LibC/StdLib/Xabs.c new file mode 100644 index 0000000000..1b289857ab --- /dev/null +++ b/StdLib/LibC/StdLib/Xabs.c @@ -0,0 +1,36 @@ +/** @file + The abs, labs, and llabs functions compute the absolute value of an integer j. + If the result cannot be represented, the behavior is undefined. + + The abs, labs, and llabs, functions return the absolute value of their + parameter. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include +#include + +int +abs(int j) +{ + return(j < 0 ? -j : j); +} + +long +labs(long j) +{ + return(j < 0 ? -j : j); +} + +long long +llabs(long long j) +{ + return (j < 0 ? -j : j); +} diff --git a/StdLib/LibC/StdLib/Xdiv.c b/StdLib/LibC/StdLib/Xdiv.c new file mode 100644 index 0000000000..111a0be1a2 --- /dev/null +++ b/StdLib/LibC/StdLib/Xdiv.c @@ -0,0 +1,76 @@ +/** @file + The div, ldiv, and lldiv, functions compute numer / denom and + numer % denom in a single operation. + + The div, ldiv, and lldiv functions return a structure of type div_t, ldiv_t, + and lldiv_t, respectively, comprising both the quotient and the remainder. + The structures shall contain (in either order) the members quot + (the quotient) and rem (the remainder), each of which has the same type as + the arguments numer and denom. If either part of the result cannot be + represented, the behavior is undefined. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include +#include + +#include +#include /* div_t, ldiv_t, lldiv_t */ + +/* DivS64x64Remainder will write the remainder as a 64-bit value, so we store + it first into bigrem and then into r.rem. This avoids writing the remainder + beyond the end of the div_t structure. +*/ +div_t +div(int num, int denom) +{ + div_t r; + INT64 bigrem; + + r.quot = (int)DivS64x64Remainder( (INT64)num, (INT64)denom, &bigrem); + r.rem = (int)bigrem; + + return (r); +} + +/* DivS64x64Remainder will write the remainder as a 64-bit value, so we store + it first into bigrem and then into r.rem. This avoids writing the remainder + beyond the end of the div_t structure. +*/ +ldiv_t +ldiv(long num, long denom) +{ + ldiv_t r; + INT64 bigrem; + + r.quot = (long)DivS64x64Remainder( (INT64)num, (INT64)denom, &bigrem); + r.rem = (long)bigrem; + + return (r); +} + +/* DivS64x64Remainder will write the remainder as a 64-bit value, so we store + it first into bigrem and then into r.rem. This avoids writing the remainder + beyond the end of the div_t structure if r.rem is narrower than 64-bits. + + Even though most implementations make long long 64 bits wide, we still go + through bigrem, just-in-case. +*/ +lldiv_t +lldiv(long long num, long long denom) +{ + lldiv_t r; + INT64 bigrem; + + r.quot = (long long)DivS64x64Remainder( (INT64)num, (INT64)denom, &bigrem); + r.rem = (long long)bigrem; + + return (r); +} diff --git a/StdLib/LibC/StdLib/strtoimax.c b/StdLib/LibC/StdLib/strtoimax.c new file mode 100644 index 0000000000..c5c40abcb2 --- /dev/null +++ b/StdLib/LibC/StdLib/strtoimax.c @@ -0,0 +1,166 @@ +/* $NetBSD: strtoimax.c,v 1.4 2005/11/29 03:12:00 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "from: @(#)strtoq.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: strtoimax.c,v 1.4 2005/11/29 03:12:00 christos Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" + +#include +#include +#include +#include +#include + +#ifdef __weak_alias +__weak_alias(strtoimax, _strtoimax) +#endif + +/* + * Convert a string to an intmax_t. + * + * Ignores `locale' stuff. Assumes that the upper and lower case + * alphabets and digits are each contiguous. + */ +intmax_t +_strtoimax(const char *nptr, char **endptr, int base) +{ + const char *s; + intmax_t acc, cutoff; + int c; + int neg, any, cutlim; + + _DIAGASSERT(nptr != NULL); + /* endptr may be NULL */ + +#ifdef __GNUC__ + /* This outrageous construct just to shut up a GCC warning. */ + (void) &acc; (void) &cutoff; +#endif + + /* + * Skip white space and pick up leading +/- sign if any. + * If base is 0, allow 0x for hex and 0 for octal, else + * assume decimal; if base is already 16, allow 0x. + */ + s = nptr; + do { + c = (unsigned char) *s++; + } while (isspace(c)); + if (c == '-') { + neg = 1; + c = *s++; + } else { + neg = 0; + if (c == '+') + c = *s++; + } + if ((base == 0 || base == 16) && + c == '0' && (*s == 'x' || *s == 'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == '0' ? 8 : 10; + + /* + * Compute the cutoff value between legal numbers and illegal + * numbers. That is the largest legal value, divided by the + * base. An input number that is greater than this value, if + * followed by a legal input character, is too big. One that + * is equal to this value may be valid or not; the limit + * between valid and invalid numbers is then based on the last + * digit. For instance, if the range for intmax_t is + * [-9223372036854775808..9223372036854775807] and the input base + * is 10, cutoff will be set to 922337203685477580 and cutlim to + * either 7 (neg==0) or 8 (neg==1), meaning that if we have + * accumulated a value > 922337203685477580, or equal but the + * next digit is > 7 (or 8), the number is too big, and we will + * return a range error. + * + * Set any if any `digits' consumed; make it negative to indicate + * overflow. + */ + cutoff = neg ? INTMAX_MIN : INTMAX_MAX; + cutlim = (int)(cutoff % base); + cutoff /= base; + if (neg) { + if (cutlim > 0) { + cutlim -= base; + cutoff += 1; + } + cutlim = -cutlim; + } + for (acc = 0, any = 0;; c = (unsigned char) *s++) { + if (isdigit(c)) + c -= '0'; + else if (isalpha(c)) + c -= isupper(c) ? 'A' - 10 : 'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0) + continue; + if (neg) { + if (acc < cutoff || (acc == cutoff && c > cutlim)) { + any = -1; + acc = INTMAX_MIN; + errno = ERANGE; + } else { + any = 1; + acc *= base; + acc -= c; + } + } else { + if (acc > cutoff || (acc == cutoff && c > cutlim)) { + any = -1; + acc = INTMAX_MAX; + errno = ERANGE; + } else { + any = 1; + acc *= base; + acc += c; + } + } + } + if (endptr != 0) + *endptr = (char *)(any ? s - 1 : nptr); + //*endptr = __UNCONST(any ? s - 1 : nptr); + return (acc); +} diff --git a/StdLib/LibC/StdLib/strtoumax.c b/StdLib/LibC/StdLib/strtoumax.c new file mode 100644 index 0000000000..5bf64383d4 --- /dev/null +++ b/StdLib/LibC/StdLib/strtoumax.c @@ -0,0 +1,139 @@ +/* $NetBSD: strtoumax.c,v 1.1 2006/04/22 15:33:33 thorpej Exp $ */ + +/* + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include + +#if !defined(_KERNEL) && !defined(_STANDALONE) +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "from: @(#)strtoul.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: strtoumax.c,v 1.1 2006/04/22 15:33:33 thorpej Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" + +#include +#include +#include +#include +#include + +#ifdef __weak_alias +__weak_alias(strtoumax, _strtoumax) +#endif + +#else /* !_KERNEL && !_STANDALONE */ +#include +#include +#endif /* !_KERNEL && !_STANDALONE */ + +/* + * Convert a string to an uintmax_t. + * + * Ignores `locale' stuff. Assumes that the upper and lower case + * alphabets and digits are each contiguous. + */ +uintmax_t +strtoumax(const char *nptr, char **endptr, int base) +{ + const char *s; + uintmax_t acc, cutoff; + int c; + int neg, any, cutlim; + + _DIAGASSERT(nptr != NULL); + /* endptr may be NULL */ + + /* + * See strtol for comments as to the logic used. + */ + s = nptr; + do { + c = (unsigned char) *s++; + } while (isspace(c)); + if (c == '-') { + neg = 1; + c = *s++; + } else { + neg = 0; + if (c == '+') + c = *s++; + } + if ((base == 0 || base == 16) && + c == '0' && (*s == 'x' || *s == 'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == '0' ? 8 : 10; + + cutoff = UINTMAX_MAX / (uintmax_t)base; + cutlim = (int)(UINTMAX_MAX % (uintmax_t)base); + for (acc = 0, any = 0;; c = (unsigned char) *s++) { + if (isdigit(c)) + c -= '0'; + else if (isalpha(c)) { +#if defined(_KERNEL) || defined(_STANDALONE) + c = toupper(c) - 'A' + 10; +#else + c -= isupper(c) ? 'A' - 10 : 'a' - 10; +#endif + } else + break; + if (c >= base) + break; + if (any < 0) + continue; + if (acc > cutoff || (acc == cutoff && c > cutlim)) { +#if defined(_KERNEL) || defined(_STANDALONE) + if (endptr) + *endptr = __UNCONST(nptr); + return UINTMAX_MAX; +#else + any = -1; + acc = UINTMAX_MAX; + errno = ERANGE; +#endif + } else { + any = 1; + acc *= (uintmax_t)base; + acc += c; + } + } + if (neg && any > 0) + acc = (uintmax_t)(-((intmax_t)acc)); + if (endptr != 0) + *endptr = __UNCONST(any ? s - 1 : nptr); + return (acc); +} diff --git a/StdLib/LibC/Stdio/Stdio.inf b/StdLib/LibC/Stdio/Stdio.inf new file mode 100644 index 0000000000..56eaae3291 --- /dev/null +++ b/StdLib/LibC/Stdio/Stdio.inf @@ -0,0 +1,142 @@ +## @file +# Standard C library: Implementation for . +# +# Copyright (c) 2010, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php. +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = LibStdio + FILE_GUID = 7d2bd134-500d-4f42-aee2-26accfb6cb1d + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + LIBRARY_CLASS = LibStdio + +# +# VALID_ARCHITECTURES = IA32 X64 IPF +# + +[Sources] + clrerr.c # + fclose.c # + fdopen.c # + feof.c # + ferror.c # + fflush.c # + fgetc.c # + fgetln.c # + fgetpos.c # + fgets.c # + fopen.c # + fprintf.c # + fputc.c # + fputs.c # + fread.c # + freopen.c # + fscanf.c # + fseek.c # + fsetpos.c # + ftell.c # + fwrite.c # + getc.c # + getchar.c # + gets.c # + perror.c # + printf.c # + putc.c # + putchar.c # + puts.c # + remove.c # + rewind.c # + scanf.c # + setbuf.c # + setvbuf.c # + sprintf.c # + sscanf.c # + tmpfile.c # + tmpnam.c # + ungetc.c # + vfprintf.c # + vfwprintf.c # + vprintf.c # + vsprintf.c # + + # Wide character functions + fgetwc.c # + fgetws.c # + fputwc.c # + fputws.c # + fwide.c # + fwprintf.c # + fwscanf.c # + getwc.c # + getwchar.c # + putwc.c # + putwchar.c # + swprintf.c # + swscanf.c # + ungetwc.c # + vfwscanf.c # + vswprintf.c # + vswscanf.c # + vwprintf.c # + vwscanf.c # + wprintf.c # + wscanf.c # + + + # Files internal to the implementation + fgetstr.c # + findfp.c # + flags.c # + fseeko.c # + ftello.c # + fvwrite.c # + fwalk.c # + gettemp.c # + makebuf.c # + mkstemp.c # + mktemp.c # + refill.c # + rget.c # + snprintf.c # + stdio.c # + vfscanf.c # + wbuf.c # + wsetup.c # + + +[Packages] + StdLib/StdLib.dec + StdLibPrivateInternalFiles/DoNotUse.dec + MdePkg/MdePkg.dec + ShellPkg/ShellPkg.dec + +[LibraryClasses] + LibC + LibCType + LibGdtoa + LibLocale + LibStdLib + LibString + LibTime + LibUefi + LibWchar + +################################################################ +# +# The Build Options, below, are only used when building the C library. +# DO NOT use them when building your application! +# Nasty things could happen if you do. +# +[BuildOptions] + GCC:*_*_*_CC_FLAGS = -fno-builtin -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast diff --git a/StdLib/LibC/Stdio/clrerr.c b/StdLib/LibC/Stdio/clrerr.c new file mode 100644 index 0000000000..bda0d04ce8 --- /dev/null +++ b/StdLib/LibC/Stdio/clrerr.c @@ -0,0 +1,63 @@ +/** @file + Implementation of clearerr as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: clrerr.c,v 1.10 2003/08/07 16:43:21 agc Exp + clrerr.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include "reentrant.h" +#include "local.h" + +#undef clearerr + +void +clearerr(FILE *fp) +{ + //_DIAGASSERT(fp != NULL); + + FLOCKFILE(fp); + __sclearerr(fp); + FUNLOCKFILE(fp); +} diff --git a/StdLib/LibC/Stdio/fclose.c b/StdLib/LibC/Stdio/fclose.c new file mode 100644 index 0000000000..3745e20f94 --- /dev/null +++ b/StdLib/LibC/Stdio/fclose.c @@ -0,0 +1,83 @@ +/** @file + Implementation of fclose as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: fclose.c,v 1.16 2003/08/07 16:43:22 agc Exp + fclose.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +int +fclose(FILE *fp) +{ + int r; + + _DIAGASSERT(fp != NULL); + + if (fp->_flags == 0) { /* not open! */ + errno = EBADF; + return (EOF); + } + FLOCKFILE(fp); + WCIO_FREE(fp); + r = fp->_flags & __SWR ? __sflush(fp) : 0; + if (fp->_close != NULL && (*fp->_close)(fp->_cookie) < 0) + r = EOF; + if (fp->_flags & __SMBF) + free((char *)fp->_bf._base); + if (HASUB(fp)) + FREEUB(fp); + if (HASLB(fp)) + FREELB(fp); + FUNLOCKFILE(fp); + fp->_file = -1; + fp->_flags = 0; /* Release this FILE for reuse. */ + fp->_r = fp->_w = 0; /* Mess up if reaccessed. */ + return (r); +} diff --git a/StdLib/LibC/Stdio/fdopen.c b/StdLib/LibC/Stdio/fdopen.c new file mode 100644 index 0000000000..3a728951f6 --- /dev/null +++ b/StdLib/LibC/Stdio/fdopen.c @@ -0,0 +1,108 @@ +/* $NetBSD: fdopen.c,v 1.14 2003/08/07 16:43:22 agc Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)fdopen.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: fdopen.c,v 1.14 2003/08/07 16:43:22 agc Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" +#include + +#include +#include +#include +#include +#include + +#include "reentrant.h" +#include "local.h" + +#ifdef __weak_alias +__weak_alias(fdopen,_fdopen) +#endif + +FILE * +fdopen(int fd, const char *mode) +{ + FILE *fp; + int flags, oflags, fdflags, tmp; + + _DIAGASSERT(fd != -1); + + if ((flags = __sflags(mode, &oflags)) == 0) + return (NULL); + + /* Make sure the mode the user wants is a subset of the actual mode. */ + if ((fdflags = fcntl(fd, F_GETFL, 0)) < 0) + return (NULL); + tmp = fdflags & O_ACCMODE; + if (tmp != O_RDWR && (tmp != (oflags & O_ACCMODE))) { + errno = EINVAL; + return (NULL); + } + + if (oflags & O_NONBLOCK) { + struct stat st; + if (fstat(fd, &st) == -1) { + return (NULL); + } + if (!S_ISREG(st.st_mode)) { + errno = EFTYPE; + return (NULL); + } + } + + if ((fp = __sfp()) == NULL) + return (NULL); + fp->_flags = (unsigned short)flags; + /* + * If opened for appending, but underlying descriptor does not have + * O_APPEND bit set, assert __SAPP so that __swrite() will lseek to + * end before each write. + */ + if ((oflags & O_APPEND) && !(fdflags & O_APPEND)) + fp->_flags |= __SAPP; + fp->_file = (short)fd; + fp->_cookie = fp; + fp->_read = __sread; + fp->_write = __swrite; + fp->_seek = __sseek; + fp->_close = __sclose; + return (fp); +} diff --git a/StdLib/LibC/Stdio/feof.c b/StdLib/LibC/Stdio/feof.c new file mode 100644 index 0000000000..70b5e5090e --- /dev/null +++ b/StdLib/LibC/Stdio/feof.c @@ -0,0 +1,67 @@ +/** @file + Implementation of a subroutine version of the macro feof, + as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: feof.c,v 1.11 2003/08/07 16:43:22 agc Exp + feof.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include "reentrant.h" +#include "local.h" + +#undef feof + +int +feof(FILE *fp) +{ + int r; + + _DIAGASSERT(fp != NULL); + + FLOCKFILE(fp); + r = __sfeof(fp); + FUNLOCKFILE(fp); + return r; +} diff --git a/StdLib/LibC/Stdio/ferror.c b/StdLib/LibC/Stdio/ferror.c new file mode 100644 index 0000000000..5641b48038 --- /dev/null +++ b/StdLib/LibC/Stdio/ferror.c @@ -0,0 +1,67 @@ +/** @file + Implementation of a subroutine version of the macro ferror, + as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: ferror.c,v 1.11 2003/08/07 16:43:22 agc Exp + ferror.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include "reentrant.h" +#include "local.h" + +#undef ferror + +int +ferror(FILE *fp) +{ + int r; + + _DIAGASSERT(fp != NULL); + + FLOCKFILE(fp); + r = __sferror(fp); + FUNLOCKFILE(fp); + return r; +} diff --git a/StdLib/LibC/Stdio/fflush.c b/StdLib/LibC/Stdio/fflush.c new file mode 100644 index 0000000000..fd21e37a13 --- /dev/null +++ b/StdLib/LibC/Stdio/fflush.c @@ -0,0 +1,115 @@ +/** @file + Implementation of fflush as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: fflush.c,v 1.15 2003/08/07 16:43:22 agc Exp + fflush.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +#ifdef _REENTRANT +extern rwlock_t __sfp_lock; +#endif + +/* Flush a single file, or (if fp is NULL) all files. */ +int +fflush(FILE *fp) +{ + int r; + + if (fp == NULL) { + rwlock_rdlock(&__sfp_lock); + r = _fwalk(__sflush); + rwlock_unlock(&__sfp_lock); + return r; + } + + FLOCKFILE(fp); + if ((fp->_flags & (__SWR | __SRW)) == 0) { + errno = EBADF; + r = EOF; + } else { + r = __sflush(fp); + } + FUNLOCKFILE(fp); + return r; +} + +int +__sflush(FILE *fp) +{ + unsigned char *p; + INT64 n; + int t; + + _DIAGASSERT(fp != NULL); + + t = fp->_flags; + if ((t & __SWR) == 0) + return (0); + + if ((p = fp->_bf._base) == NULL) + return (0); + + n = fp->_p - p; /* write this much */ + + /* + * Set these immediately to avoid problems with longjmp and to allow + * exchange buffering (via setvbuf) in user write function. + */ + fp->_p = p; + fp->_w = t & (__SLBF|__SNBF) ? 0 : fp->_bf._size; + + for (; n > 0; n -= t, p += t) { + t = (*fp->_write)(fp->_cookie, (char *)p, (int)n); + if (t <= 0) { + fp->_flags |= __SERR; + return (EOF); + } + } + return (0); +} diff --git a/StdLib/LibC/Stdio/fgetc.c b/StdLib/LibC/Stdio/fgetc.c new file mode 100644 index 0000000000..b6e1a258ba --- /dev/null +++ b/StdLib/LibC/Stdio/fgetc.c @@ -0,0 +1,65 @@ +/** @file + Implementation of fgetc as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: fgetc.c,v 1.11 2003/08/07 16:43:22 agc Exp + fgetc.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +int +fgetc(FILE *fp) +{ + int r; + + _DIAGASSERT(fp != NULL); + + FLOCKFILE(fp); + r = __sgetc(fp); + FUNLOCKFILE(fp); + return r; +} diff --git a/StdLib/LibC/Stdio/fgetln.c b/StdLib/LibC/Stdio/fgetln.c new file mode 100644 index 0000000000..b18c7b66c0 --- /dev/null +++ b/StdLib/LibC/Stdio/fgetln.c @@ -0,0 +1,71 @@ +/* $NetBSD: fgetln.c,v 1.14 2004/05/10 16:47:11 drochner Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)fgetline.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: fgetln.c,v 1.14 2004/05/10 16:47:11 drochner Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" + +#include + +#include "reentrant.h" +#include "local.h" + +#ifdef __weak_alias +__weak_alias(fgetln,_fgetln) +#endif + +/* + * Get an input line. The returned pointer often (but not always) + * points into a stdio buffer. Fgetline does not alter the text of + * the returned line (which is thus not a C string because it will + * not necessarily end with '\0'), but does allow callers to modify + * it if they wish. Thus, we set __SMOD in case the caller does. + */ +char * +fgetln(FILE *fp, size_t *lenp) +{ + char *cp; + + FLOCKFILE(fp); + cp = __fgetstr(fp, lenp, '\n'); + FUNLOCKFILE(fp); + return cp; +} diff --git a/StdLib/LibC/Stdio/fgetpos.c b/StdLib/LibC/Stdio/fgetpos.c new file mode 100644 index 0000000000..f076718278 --- /dev/null +++ b/StdLib/LibC/Stdio/fgetpos.c @@ -0,0 +1,60 @@ +/** @file + Implementation of fgetpos as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: fgetpos.c,v 1.11 2003/08/07 16:43:23 agc Exp + fgetpos.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include "namespace.h" +#include +#include +#include + +int +fgetpos(FILE *fp, fpos_t *pos) +{ + _DIAGASSERT(fp != NULL); + _DIAGASSERT(pos != NULL); + + return((*pos = (off_t)ftello(fp)) == (off_t)-1); +} diff --git a/StdLib/LibC/Stdio/fgets.c b/StdLib/LibC/Stdio/fgets.c new file mode 100644 index 0000000000..cf107ab867 --- /dev/null +++ b/StdLib/LibC/Stdio/fgets.c @@ -0,0 +1,119 @@ +/** @file + Implementation of fgets as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: fgets.c,v 1.20 2003/12/14 23:56:28 lukem Exp + fgets.c 8.2 (Berkeley) 12/22/93 +**/ +#include + +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +/* + * Read at most n-1 characters from the given file. + * Stop when a newline has been read, or the count runs out. + * Return first argument, or NULL if no characters were read. + */ +char * +fgets(char *buf, int n, FILE *fp) +{ + size_t len; + char *s; + unsigned char *p, *t; + + _DIAGASSERT(buf != NULL); + _DIAGASSERT(fp != NULL); + if (n <= 0) /* sanity check */ + return (NULL); + + FLOCKFILE(fp); + _SET_ORIENTATION(fp, -1); + s = buf; + n--; /* leave space for NUL */ + while (n != 0) { + /* + * If the buffer is empty, refill it. + */ + if (fp->_r <= 0) { + if (__srefill(fp)) { + /* EOF/error: stop with partial or no line */ + if (s == buf) { + FUNLOCKFILE(fp); + return (NULL); + } + break; + } + } + len = fp->_r; + p = fp->_p; + + /* + * Scan through at most n bytes of the current buffer, + * looking for '\n'. If found, copy up to and including + * newline, and stop. Otherwise, copy entire chunk + * and loop. + */ + if (len > (size_t)n) + len = n; + t = memchr((void *)p, '\n', len); + if (t != NULL) { + len = ++t - p; + fp->_r -= (int)len; + fp->_p = t; + (void)memcpy((void *)s, (void *)p, len); + s[len] = 0; + FUNLOCKFILE(fp); + return (buf); + } + fp->_r -= (int)len; + fp->_p += len; + (void)memcpy((void *)s, (void *)p, len); + s += len; + n -= (int)len; + } + *s = 0; + FUNLOCKFILE(fp); + return (buf); +} diff --git a/StdLib/LibC/Stdio/fgetstr.c b/StdLib/LibC/Stdio/fgetstr.c new file mode 100644 index 0000000000..7364d3b891 --- /dev/null +++ b/StdLib/LibC/Stdio/fgetstr.c @@ -0,0 +1,169 @@ +/* $NetBSD: fgetstr.c,v 1.4 2006/11/24 19:46:58 christos Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)fgetline.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: fgetstr.c,v 1.4 2006/11/24 19:46:58 christos Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" + +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +/* + * Expand the line buffer. Return -1 on error. +#ifdef notdef + * The `new size' does not account for a terminating '\0', + * so we add 1 here. +#endif + */ +int +__slbexpand(FILE *fp, size_t newsize) +{ + void *p; + +#ifdef notdef + ++newsize; +#endif + _DIAGASSERT(fp != NULL); + + if ((size_t)fp->_lb._size >= newsize) + return (0); + if ((p = realloc(fp->_lb._base, newsize)) == NULL) + return (-1); + fp->_lb._base = p; + fp->_lb._size = (int)newsize; + return (0); +} + +/* + * Get an input line. The returned pointer often (but not always) + * points into a stdio buffer. Fgetline does not alter the text of + * the returned line (which is thus not a C string because it will + * not necessarily end with '\0'), but does allow callers to modify + * it if they wish. Thus, we set __SMOD in case the caller does. + */ +char * +__fgetstr(FILE *fp, size_t *lenp, int sep) +{ + unsigned char *p; + size_t len; + size_t off; + + _DIAGASSERT(fp != NULL); + _DIAGASSERT(lenp != NULL); + + /* make sure there is input */ + if (fp->_r <= 0 && __srefill(fp)) { + *lenp = 0; + return (NULL); + } + + /* look for a newline in the input */ + if ((p = memchr((void *)fp->_p, sep, (size_t)fp->_r)) != NULL) { + char *ret; + + /* + * Found one. Flag buffer as modified to keep fseek from + * `optimising' a backward seek, in case the user stomps on + * the text. + */ + p++; /* advance over it */ + ret = (char *)fp->_p; + *lenp = len = p - fp->_p; + fp->_flags |= __SMOD; + fp->_r -= (int)len; + fp->_p = p; + return (ret); + } + + /* + * We have to copy the current buffered data to the line buffer. + * As a bonus, though, we can leave off the __SMOD. + * + * OPTIMISTIC is length that we (optimistically) expect will + * accommodate the `rest' of the string, on each trip through the + * loop below. + */ +#define OPTIMISTIC 80 + + for (len = fp->_r, off = 0;; len += fp->_r) { + size_t diff; + + /* + * Make sure there is room for more bytes. Copy data from + * file buffer to line buffer, refill file and look for + * newline. The loop stops only when we find a newline. + */ + if (__slbexpand(fp, len + OPTIMISTIC)) + goto error; + (void)memcpy((void *)(fp->_lb._base + off), (void *)fp->_p, + len - off); + off = len; + if (__srefill(fp)) + break; /* EOF or error: return partial line */ + if ((p = memchr((void *)fp->_p, sep, (size_t)fp->_r)) == NULL) + continue; + + /* got it: finish up the line (like code above) */ + p++; + diff = p - fp->_p; + len += diff; + if (__slbexpand(fp, len)) + goto error; + (void)memcpy((void *)(fp->_lb._base + off), (void *)fp->_p, + diff); + fp->_r -= (int)diff; + fp->_p = p; + break; + } + *lenp = len; +#ifdef notdef + fp->_lb._base[len] = 0; +#endif + return ((char *)fp->_lb._base); + +error: + *lenp = 0; /* ??? */ + return (NULL); /* ??? */ +} diff --git a/StdLib/LibC/Stdio/fgetwc.c b/StdLib/LibC/Stdio/fgetwc.c new file mode 100644 index 0000000000..548192390d --- /dev/null +++ b/StdLib/LibC/Stdio/fgetwc.c @@ -0,0 +1,100 @@ +/*- + * Copyright (c)2001 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Citrus$ + + NetBSD: fgetwc.c,v 1.5 2006/07/03 17:06:36 tnozaki Exp + */ +#include +#include + +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +wint_t +__fgetwc_unlock(FILE *fp) +{ + struct wchar_io_data *wcio; + mbstate_t *st; + wchar_t wc; + size_t size; + + _DIAGASSERT(fp != NULL); + + _SET_ORIENTATION(fp, 1); + wcio = WCIO_GET(fp); + if (wcio == 0) { + errno = ENOMEM; + return WEOF; + } + + /* if there're ungetwc'ed wchars, use them */ + if (wcio->wcio_ungetwc_inbuf) { + wc = wcio->wcio_ungetwc_buf[--wcio->wcio_ungetwc_inbuf]; + + return wc; + } + + st = &wcio->wcio_mbstate_in; + + do { + char c; + int ch = __sgetc(fp); + + if (ch == EOF) { + return WEOF; + } + + c = (char)ch; + size = mbrtowc(&wc, &c, 1, st); + if (size == (size_t)-1) { + errno = EILSEQ; + fp->_flags |= __SERR; + return WEOF; + } + } while (size == (size_t)-2); + + _DIAGASSERT(size == 1); + + return wc; +} + +wint_t +fgetwc(FILE *fp) +{ + wint_t r; + + _DIAGASSERT(fp != NULL); + + FLOCKFILE(fp); + r = __fgetwc_unlock(fp); + FUNLOCKFILE(fp); + + return (r); +} diff --git a/StdLib/LibC/Stdio/fgetws.c b/StdLib/LibC/Stdio/fgetws.c new file mode 100644 index 0000000000..0113557965 --- /dev/null +++ b/StdLib/LibC/Stdio/fgetws.c @@ -0,0 +1,92 @@ +/* $NetBSD: fgetws.c,v 1.2 2006/07/03 17:06:36 tnozaki Exp $ */ + +/*- + * Copyright (c) 2002 Tim J. Robbins. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Original version ID: + * FreeBSD: src/lib/libc/stdio/fgetws.c,v 1.4 2002/09/20 13:25:40 tjr Exp + * + */ +#include +#include +#if defined(LIB_SCCS) && !defined(lint) +__RCSID("$NetBSD: fgetws.c,v 1.2 2006/07/03 17:06:36 tnozaki Exp $"); +#endif + +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +wchar_t * +fgetws( + wchar_t * __restrict ws, + int n, + FILE * __restrict fp + ) +{ + wchar_t *wsp; + wint_t wc; + + _DIAGASSERT(fp != NULL); + _DIAGASSERT(ws != NULL); + + FLOCKFILE(fp); + _SET_ORIENTATION(fp, 1); + + if (n <= 0) { + errno = EINVAL; + goto error; + } + + wsp = ws; + while (n-- > 1) { + wc = __fgetwc_unlock(fp); + if (__sferror(fp) != 0) + goto error; + if (__sfeof(fp) != 0) { + if (wsp == ws) { + /* EOF/error, no characters read yet. */ + goto error; + } + break; + } + *wsp++ = (wchar_t)wc; + if (wc == L'\n') { + break; + } + } + + *wsp++ = L'\0'; + FUNLOCKFILE(fp); + + return (ws); + +error: + FUNLOCKFILE(fp); + return (NULL); +} diff --git a/StdLib/LibC/Stdio/fileext.h b/StdLib/LibC/Stdio/fileext.h new file mode 100644 index 0000000000..0ad78468b9 --- /dev/null +++ b/StdLib/LibC/Stdio/fileext.h @@ -0,0 +1,66 @@ +/* $NetBSD: fileext.h,v 1.5 2003/07/18 21:46:41 nathanw Exp $ */ + +/*- + * Copyright (c)2001 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Citrus$ + */ + +/* + * file extension + */ +struct __sfileext { + struct __sbuf _ub; /* ungetc buffer */ + struct wchar_io_data _wcio; /* wide char i/o status */ +#ifdef _REENTRANT + mutex_t _lock; /* Lock for FLOCKFILE/FUNLOCKFILE */ + cond_t _lockcond; /* Condition variable for signalling lock releases */ + thr_t _lockowner; /* The thread currently holding the lock */ + int _lockcount; /* Count of recursive locks */ + int _lockinternal; /* Flag of whether the lock is held inside stdio */ + int _lockcancelstate; /* Stashed cancellation state on internal lock */ +#endif +}; + +#define _EXT(fp) ((struct __sfileext *)(void *)((fp)->_ext._base)) +#define _UB(fp) _EXT(fp)->_ub +#ifdef _REENTRANT +#define _LOCK(fp) (_EXT(fp)->_lock) +#define _LOCKCOND(fp) (_EXT(fp)->_lockcond) +#define _LOCKOWNER(fp) (_EXT(fp)->_lockowner) +#define _LOCKCOUNT(fp) (_EXT(fp)->_lockcount) +#define _LOCKINTERNAL(fp) (_EXT(fp)->_lockinternal) +#define _LOCKCANCELSTATE(fp) (_EXT(fp)->_lockcancelstate) +#define _FILEEXT_SETUP(f, fext) do { \ + /* LINTED */(f)->_ext._base = (unsigned char *)(fext); \ + mutex_init(&_LOCK(f), NULL); \ + cond_init(&_LOCKCOND(f), 0, NULL); \ + _LOCKOWNER(f) = NULL; \ + _LOCKCOUNT(f) = 0; \ + _LOCKINTERNAL(f) = 0; \ + } while (/* LINTED */ 0) +#else +#define _FILEEXT_SETUP(f, fext) /* LINTED */(f)->_ext._base = (unsigned char *)(fext) +#endif diff --git a/StdLib/LibC/Stdio/fileno.c b/StdLib/LibC/Stdio/fileno.c new file mode 100644 index 0000000000..b9468c7cfc --- /dev/null +++ b/StdLib/LibC/Stdio/fileno.c @@ -0,0 +1,71 @@ +/* $NetBSD: fileno.c,v 1.12 2004/05/09 17:27:53 kleink Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)fileno.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: fileno.c,v 1.12 2004/05/09 17:27:53 kleink Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +/* + * A subroutine version of the macro fileno. + */ +#undef fileno +int _fileno __P((FILE *)); /* XXX */ + +__weak_alias(fileno,_fileno) + +int +_fileno(fp) + FILE *fp; +{ + int r; + + _DIAGASSERT(fp != NULL); + + FLOCKFILE(fp); + r = __sfileno(fp); + FUNLOCKFILE(fp); + return r; +} diff --git a/StdLib/LibC/Stdio/findfp.c b/StdLib/LibC/Stdio/findfp.c new file mode 100644 index 0000000000..b6495c3bcb --- /dev/null +++ b/StdLib/LibC/Stdio/findfp.c @@ -0,0 +1,211 @@ +/* $NetBSD: findfp.c,v 1.23 2006/10/07 21:40:46 thorpej Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)findfp.c 8.2 (Berkeley) 1/4/94"; +#else +__RCSID("$NetBSD: findfp.c,v 1.23 2006/10/07 21:40:46 thorpej Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" +#include +#include +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" +#include "glue.h" +#include + +int __sdidinit; + +#define NDYNAMIC 10 /* add ten more whenever necessary */ + +#define std(flags, file) \ +/* p r w flags file bf lfbsize cookie close */ \ + { NULL, 0, 0, flags, file, { NULL, 0 }, 0, __sF + file, __sclose, \ +/* read seek write ext up */ \ + __sread, __sseek, __swrite, { (void *)(__sFext + file), 0 }, NULL, \ +/* ur ubuf, nbuf lb blksize offset */ \ + 0, { '\0', '\0', '\0' }, { '\0' }, { NULL, 0 }, 0, (fpos_t)0 } + + /* the usual - (stdin + stdout + stderr) */ +static FILE usual[FOPEN_MAX - 3]; +static struct __sfileext usualext[FOPEN_MAX - 3]; +static struct glue uglue = { 0, FOPEN_MAX - 3, usual }; + +#if defined(_REENTRANT) && !defined(__lint__) /* XXX lint is busted */ +#define STDEXT { ._lock = MUTEX_INITIALIZER, ._lockcond = COND_INITIALIZER } +struct __sfileext __sFext[3] = { STDEXT, + STDEXT, + STDEXT}; +#else +struct __sfileext __sFext[3]; +#endif + +FILE __sF[3] = { + std(__SRD, STDIN_FILENO), /* stdin */ + std(__SWR, STDOUT_FILENO), /* stdout */ + std(__SWR|__SNBF, STDERR_FILENO) /* stderr */ +}; +struct glue __sglue = { &uglue, 3, __sF }; + +static struct glue *moreglue(int); +void f_prealloc(void); + +#ifdef _REENTRANT +rwlock_t __sfp_lock = RWLOCK_INITIALIZER; +#endif + +static struct glue * +moreglue(int n) +{ + struct glue *g; + FILE *p; + struct __sfileext *pext; + static FILE empty; + + g = (struct glue *)malloc(sizeof(*g) + ALIGNBYTES + n * sizeof(FILE) + + n * sizeof(struct __sfileext)); + if (g == NULL) + return (NULL); + p = (FILE *)ALIGN((g + 1)); + g->next = NULL; + g->niobs = n; + g->iobs = p; + pext = (void *)(p + n); + while (--n >= 0) { + *p = empty; + _FILEEXT_SETUP(p, pext); + p++; + pext++; + } + return (g); +} + +/* + * Find a free FILE for fopen et al. + */ +FILE * +__sfp() +{ + FILE *fp; + int n; + struct glue *g; + + if (!__sdidinit) + __sinit(); + + rwlock_wrlock(&__sfp_lock); + for (g = &__sglue;; g = g->next) { + for (fp = g->iobs, n = g->niobs; --n >= 0; fp++) + if (fp->_flags == 0) + goto found; + if (g->next == NULL && (g->next = moreglue(NDYNAMIC)) == NULL) + break; + } + rwlock_unlock(&__sfp_lock); + return (NULL); +found: + fp->_flags = 1; /* reserve this slot; caller sets real flags */ + fp->_p = NULL; /* no current pointer */ + fp->_w = 0; /* nothing to read or write */ + fp->_r = 0; + fp->_bf._base = NULL; /* no buffer */ + fp->_bf._size = 0; + fp->_lbfsize = 0; /* not line buffered */ + fp->_file = -1; /* no file */ +/* fp->_cookie = ; */ /* caller sets cookie, _read/_write etc */ + _UB(fp)._base = NULL; /* no ungetc buffer */ + _UB(fp)._size = 0; + fp->_lb._base = NULL; /* no line buffer */ + fp->_lb._size = 0; + memset(WCIO_GET(fp), 0, sizeof(struct wchar_io_data)); + rwlock_unlock(&__sfp_lock); + return (fp); +} + +#if 0 +/* + * XXX. Force immediate allocation of internal memory. Not used by stdio, + * but documented historically for certain applications. Bad applications. + */ +void +f_prealloc() +{ + struct glue *g; + int n; + + n = (int)sysconf(_SC_OPEN_MAX) - FOPEN_MAX + 20; /* 20 for slop. */ + for (g = &__sglue; (n -= g->niobs) > 0 && g->next; g = g->next) + /* void */; + if (n > 0) + g->next = moreglue(n); +} +#endif + +/* + * exit() calls _cleanup() through *gMD->cleanup, set whenever we + * open or buffer a file. This chicanery is done so that programs + * that do not use stdio need not link it all in. + * + * The name `_cleanup' is, alas, fairly well known outside stdio. + */ +void +_cleanup( void ) +{ + /* (void) _fwalk(fclose); */ + (void) fflush(NULL); /* `cheating' */ +} + +/* + * __sinit() is called whenever stdio's internal variables must be set up. + */ +void +__sinit( void ) +{ + int i; + + for (i = 0; i < FOPEN_MAX - 3; i++) + _FILEEXT_SETUP(&usual[i], &usualext[i]); + + /* make sure we clean up on exit */ + gMD->cleanup = _cleanup; /* conservative */ + __sdidinit = 1; +} diff --git a/StdLib/LibC/Stdio/flags.c b/StdLib/LibC/Stdio/flags.c new file mode 100644 index 0000000000..59ce8e30d6 --- /dev/null +++ b/StdLib/LibC/Stdio/flags.c @@ -0,0 +1,115 @@ +/** @file + Implementation of internal function to return the (stdio) flags for a given mode. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: flags.c,v 1.14 2003/08/07 16:43:23 agc Exp + flags.c 8.1 (Berkeley) 6/4/93 +**/ +#include +#include + +#include +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +/* + * Return the (stdio) flags for a given mode. Store the flags + * to be passed to an open() syscall through *optr. + * Return 0 on error. + */ +int +__sflags(const char *mode, int *optr) +{ + int ret, m, o; + + _DIAGASSERT(mode != NULL); + + switch (*mode++) { + + case 'r': /* open for reading */ + ret = __SRD; + m = O_RDONLY; + o = 0; + break; + + case 'w': /* open for writing */ + ret = __SWR; + m = O_WRONLY; + o = O_CREAT | O_TRUNC; + break; + + case 'a': /* open for appending */ + ret = __SWR; + m = O_WRONLY; + o = O_CREAT | O_APPEND; + break; + + default: /* illegal mode */ + errno = EINVAL; + return (0); + } + + /* + * [rwa]\+ or [rwa]b\+ means read and write + * f means open only plain files. + */ + for (; *mode; mode++) + switch (*mode) { + case '+': + ret = __SRW; + m = O_RDWR; + break; + case 'f': + o |= O_NONBLOCK; + break; + case 'b': + break; + default: /* We could produce a warning here */ + break; + } + + *optr = m | o; + return (ret); +} diff --git a/StdLib/LibC/Stdio/floatio.h b/StdLib/LibC/Stdio/floatio.h new file mode 100644 index 0000000000..1cb0bad181 --- /dev/null +++ b/StdLib/LibC/Stdio/floatio.h @@ -0,0 +1,55 @@ +/* $NetBSD: floatio.h,v 1.5 2005/05/14 23:51:02 christos Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)floatio.h 8.1 (Berkeley) 6/4/93 + */ + +/* + * Floating point scanf/printf (input/output) definitions. + */ + +/* 11-bit exponent (VAX G floating point) is 308 decimal digits */ +#define MAXEXP 308 +/* 128 bit fraction takes up 39 decimal digits; max reasonable precision */ +#define MAXFRACT 39 +/* + * MAXEXPDIG is the maximum number of decimal digits needed to store a + * floating point exponent in the largest supported format. It should + * be ceil(log10(LDBL_MAX_10_EXP)) or, if hexadecimal floating point + * conversions are supported, ceil(log10(LDBL_MAX_EXP)). But since it + * is presently never greater than 5 in practice, we fudge it. + */ +#define MAXEXPDIG 6 +#if LDBL_MAX_EXP > 999999 +#error "floating point buffers too small" +#endif diff --git a/StdLib/LibC/Stdio/flockfile.c b/StdLib/LibC/Stdio/flockfile.c new file mode 100644 index 0000000000..386164e89f --- /dev/null +++ b/StdLib/LibC/Stdio/flockfile.c @@ -0,0 +1,192 @@ +/* $NetBSD: flockfile.c,v 1.8 2003/07/22 00:56:25 nathanw Exp $ */ + +/*- + * Copyright (c) 2002 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Nathan J. Williams. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: flockfile.c,v 1.8 2003/07/22 00:56:25 nathanw Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" + +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +#ifdef __weak_alias +__weak_alias(flockfile,_flockfile) +__weak_alias(ftrylockfile,_ftrylockfile) +__weak_alias(funlockfile,_funlockfile) +#endif + +#ifdef _REENTRANT +/* + * XXX This code makes the assumption that a thr_t (pthread_t) is a + * XXX pointer. + */ + +extern int __isthreaded; + +void +flockfile(FILE *fp) +{ + + __flockfile_internal(fp, 0); +} + +int +ftrylockfile(FILE *fp) +{ + int retval; + + if (__isthreaded == 0) + return 0; + + retval = 0; + mutex_lock(&_LOCK(fp)); + + if (_LOCKOWNER(fp) == thr_self()) { + _LOCKCOUNT(fp)++; + } else if (_LOCKOWNER(fp) == NULL) { + _LOCKOWNER(fp) = thr_self(); + _LOCKCOUNT(fp) = 1; + } else + retval = -1; + + mutex_unlock(&_LOCK(fp)); + + return retval; +} + +void +funlockfile(FILE *fp) +{ + + __funlockfile_internal(fp, 0); +} + +void +__flockfile_internal(FILE *fp, int internal) +{ + + if (__isthreaded == 0) + return; + + mutex_lock(&_LOCK(fp)); + + if (_LOCKOWNER(fp) == thr_self()) { + _LOCKCOUNT(fp)++; + if (internal) + _LOCKINTERNAL(fp)++; + } else { + /* danger! cond_wait() is a cancellation point. */ + int oldstate; + thr_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate); + while (_LOCKOWNER(fp) != NULL) + cond_wait(&_LOCKCOND(fp), &_LOCK(fp)); + thr_setcancelstate(oldstate, NULL); + _LOCKOWNER(fp) = thr_self(); + _LOCKCOUNT(fp) = 1; + if (internal) + _LOCKINTERNAL(fp) = 1; + } + + if (_LOCKINTERNAL(fp) == 1) + /* stash cancellation state and disable */ + thr_setcancelstate(PTHREAD_CANCEL_DISABLE, + &_LOCKCANCELSTATE(fp)); + + mutex_unlock(&_LOCK(fp)); +} + +void +__funlockfile_internal(FILE *fp, int internal) +{ + + if (__isthreaded == 0) + return; + + mutex_lock(&_LOCK(fp)); + + if (internal) { + _LOCKINTERNAL(fp)--; + if (_LOCKINTERNAL(fp) == 0) + thr_setcancelstate(_LOCKCANCELSTATE(fp), NULL); + } + + _LOCKCOUNT(fp)--; + if (_LOCKCOUNT(fp) == 0) { + _LOCKOWNER(fp) = NULL; + cond_signal(&_LOCKCOND(fp)); + } + + mutex_unlock(&_LOCK(fp)); +} + +#else /* _REENTRANT */ + +void +flockfile(FILE *fp) +{ + /* LINTED deliberate lack of effect */ + (void)fp; + + return; +} + +int +ftrylockfile(FILE *fp) +{ + /* LINTED deliberate lack of effect */ + (void)fp; + + return (0); +} + +void +funlockfile(FILE *fp) +{ + /* LINTED deliberate lack of effect */ + (void)fp; + + return; +} + +#endif /* _REENTRANT */ diff --git a/StdLib/LibC/Stdio/fopen.c b/StdLib/LibC/Stdio/fopen.c new file mode 100644 index 0000000000..4b3c14cd28 --- /dev/null +++ b/StdLib/LibC/Stdio/fopen.c @@ -0,0 +1,109 @@ +/** @file + Implementation of fopen as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: fopen.c,v 1.12 2003/08/07 16:43:24 agc Exp + fopen.c 8.1 (Berkeley) 6/4/93" +**/ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +FILE * +fopen(const char *file, const char *mode) +{ + FILE *fp; + int f; + int flags, oflags; + + _DIAGASSERT(file != NULL); + if ((flags = __sflags(mode, &oflags)) == 0) + return (NULL); + if ((fp = __sfp()) == NULL) + return (NULL); + if ((f = open(file, oflags, DEFFILEMODE)) < 0) + goto release; + if (oflags & O_NONBLOCK) { + struct stat st; + if (fstat(f, &st) == -1) { + int sverrno = errno; + (void)close(f); + errno = sverrno; + goto release; + } + if (!S_ISREG(st.st_mode)) { + (void)close(f); + errno = EFTYPE; + goto release; + } + } + fp->_file = (short)f; + fp->_flags = (unsigned short)flags; + fp->_cookie = fp; + fp->_read = __sread; + fp->_write = __swrite; + fp->_seek = __sseek; + fp->_close = __sclose; + + /* + * When opening in append mode, even though we use O_APPEND, + * we need to seek to the end so that ftell() gets the right + * answer. If the user then alters the seek pointer, or + * the file extends, this will fail, but there is not much + * we can do about this. (We could set __SAPP and check in + * fseek and ftell.) + */ + if (oflags & O_APPEND) + (void) __sseek((void *)fp, (fpos_t)0, SEEK_END); + return (fp); +release: + fp->_flags = 0; /* release */ + return (NULL); +} diff --git a/StdLib/LibC/Stdio/fparseln.c b/StdLib/LibC/Stdio/fparseln.c new file mode 100644 index 0000000000..c1ce12be2e --- /dev/null +++ b/StdLib/LibC/Stdio/fparseln.c @@ -0,0 +1,248 @@ +/* $NetBSD: fparseln.c,v 1.5 2004/06/20 22:20:15 jmc Exp $ */ + +/* + * Copyright (c) 1997 Christos Zoulas. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Christos Zoulas. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: fparseln.c,v 1.5 2004/06/20 22:20:15 jmc Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" + +#include +#include +#include +#include +#include + +#ifdef __weak_alias +__weak_alias(fparseln,_fparseln) +#endif + +#if ! HAVE_FPARSELN + +#ifndef HAVE_NBTOOL_CONFIG_H +#include "reentrant.h" +#include "local.h" +#else +#define FLOCKFILE(fp) +#define FUNLOCKFILE(fp) +#endif + +#if defined(_REENTRANT) && !HAVE_NBTOOL_CONFIG_H +#define __fgetln(f, l) __fgetstr(f, l, '\n') +#else +#define __fgetln(f, l) fgetln(f, l) +#endif + +static int isescaped(const char *, const char *, int); + +/* isescaped(): + * Return true if the character in *p that belongs to a string + * that starts in *sp, is escaped by the escape character esc. + */ +static int +isescaped(const char *sp, const char *p, int esc) +{ + const char *cp; + size_t ne; + + _DIAGASSERT(sp != NULL); + _DIAGASSERT(p != NULL); + + /* No escape character */ + if (esc == '\0') + return 1; + + /* Count the number of escape characters that precede ours */ + for (ne = 0, cp = p; --cp >= sp && *cp == esc; ne++) + continue; + + /* Return true if odd number of escape characters */ + return (ne & 1) != 0; +} + + +/* fparseln(): + * Read a line from a file parsing continuations ending in \ + * and eliminating trailing newlines, or comments starting with + * the comment char. + */ +char * +fparseln(FILE *fp, size_t *size, size_t *lineno, const char str[3], int flags) +{ + static const char dstr[3] = { '\\', '\\', '#' }; + + size_t s, len; + char *buf; + char *ptr, *cp; + int cnt; + char esc, con, nl, com; + + _DIAGASSERT(fp != NULL); + + len = 0; + buf = NULL; + cnt = 1; + + if (str == NULL) + str = dstr; + + esc = str[0]; + con = str[1]; + com = str[2]; + /* + * XXX: it would be cool to be able to specify the newline character, + * but unfortunately, fgetln does not let us + */ + nl = '\n'; + + FLOCKFILE(fp); + + while (cnt) { + cnt = 0; + + if (lineno) + (*lineno)++; + + if ((ptr = __fgetln(fp, &s)) == NULL) + break; + + if (s && com) { /* Check and eliminate comments */ + for (cp = ptr; cp < ptr + s; cp++) + if (*cp == com && !isescaped(ptr, cp, esc)) { + s = cp - ptr; + cnt = s == 0 && buf == NULL; + break; + } + } + + if (s && nl) { /* Check and eliminate newlines */ + cp = &ptr[s - 1]; + + if (*cp == nl) + s--; /* forget newline */ + } + + if (s && con) { /* Check and eliminate continuations */ + cp = &ptr[s - 1]; + + if (*cp == con && !isescaped(ptr, cp, esc)) { + s--; /* forget escape */ + cnt = 1; + } + } + + if (s == 0 && buf != NULL) + continue; + + if ((cp = realloc(buf, len + s + 1)) == NULL) { + FUNLOCKFILE(fp); + free(buf); + return NULL; + } + buf = cp; + + (void) memcpy(buf + len, ptr, s); + len += s; + buf[len] = '\0'; + } + + FUNLOCKFILE(fp); + + if ((flags & FPARSELN_UNESCALL) != 0 && esc && buf != NULL && + strchr(buf, esc) != NULL) { + ptr = cp = buf; + while (cp[0] != '\0') { + int skipesc; + + while (cp[0] != '\0' && cp[0] != esc) + *ptr++ = *cp++; + if (cp[0] == '\0' || cp[1] == '\0') + break; + + skipesc = 0; + if (cp[1] == com) + skipesc += (flags & FPARSELN_UNESCCOMM); + if (cp[1] == con) + skipesc += (flags & FPARSELN_UNESCCONT); + if (cp[1] == esc) + skipesc += (flags & FPARSELN_UNESCESC); + if (cp[1] != com && cp[1] != con && cp[1] != esc) + skipesc = (flags & FPARSELN_UNESCREST); + + if (skipesc) + cp++; + else + *ptr++ = *cp++; + *ptr++ = *cp++; + } + *ptr = '\0'; + len = strlen(buf); + } + + if (size) + *size = len; + return buf; +} + +#ifdef TEST + +int main(int, char **); + +int +main(int argc, char **argv) +{ + char *ptr; + size_t size, line; + + line = 0; + while ((ptr = fparseln(stdin, &size, &line, NULL, + FPARSELN_UNESCALL)) != NULL) + printf("line %d (%d) |%s|\n", line, size, ptr); + return 0; +} + +/* + +# This is a test +line 1 +line 2 \ +line 3 # Comment +line 4 \# Not comment \\\\ + +# And a comment \ +line 5 \\\ +line 6 + +*/ + +#endif /* TEST */ +#endif /* ! HAVE_FPARSELN */ diff --git a/StdLib/LibC/Stdio/fprintf.c b/StdLib/LibC/Stdio/fprintf.c new file mode 100644 index 0000000000..ba6ec0c22e --- /dev/null +++ b/StdLib/LibC/Stdio/fprintf.c @@ -0,0 +1,66 @@ +/** @file + Implementation of fprintf as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: fprintf.c,v 1.11 2003/08/07 16:43:24 agc Exp + fprintf.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include + +int +fprintf(FILE *fp, const char *fmt, ...) +{ + int ret; + va_list ap; + + _DIAGASSERT(fp != NULL); + _DIAGASSERT(fmt != NULL); + + va_start(ap, fmt); + ret = vfprintf(fp, fmt, ap); + va_end(ap); + return (ret); +} diff --git a/StdLib/LibC/Stdio/fpurge.c b/StdLib/LibC/Stdio/fpurge.c new file mode 100644 index 0000000000..cc649eee49 --- /dev/null +++ b/StdLib/LibC/Stdio/fpurge.c @@ -0,0 +1,76 @@ +/* $NetBSD: fpurge.c,v 1.13 2003/08/07 16:43:24 agc Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)fpurge.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: fpurge.c,v 1.13 2003/08/07 16:43:24 agc Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +/* + * fpurge: like fflush, but without writing anything: leave the + * given FILE's buffer empty. + */ +int +fpurge(fp) + FILE *fp; +{ + + _DIAGASSERT(fp != NULL); + + if (fp->_flags == 0) { + errno = EBADF; + return (EOF); + } + FLOCKFILE(fp); + if (HASUB(fp)) + FREEUB(fp); + WCIO_FREE(fp); + fp->_p = fp->_bf._base; + fp->_r = 0; + fp->_w = fp->_flags & (__SLBF|__SNBF) ? 0 : fp->_bf._size; + FUNLOCKFILE(fp); + return (0); +} diff --git a/StdLib/LibC/Stdio/fputc.c b/StdLib/LibC/Stdio/fputc.c new file mode 100644 index 0000000000..b9ae5aa828 --- /dev/null +++ b/StdLib/LibC/Stdio/fputc.c @@ -0,0 +1,65 @@ +/** @file + Implementation of fputc as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: fputc.c,v 1.12 2003/08/07 16:43:24 agc Exp + fputc.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +int +fputc(int c, FILE *fp) +{ + int r; + + _DIAGASSERT(fp != NULL); + + FLOCKFILE(fp); + r = __sputc(c, fp); + FUNLOCKFILE(fp); + return r; +} diff --git a/StdLib/LibC/Stdio/fputs.c b/StdLib/LibC/Stdio/fputs.c new file mode 100644 index 0000000000..081ee1a099 --- /dev/null +++ b/StdLib/LibC/Stdio/fputs.c @@ -0,0 +1,81 @@ +/** @file + Implementation of fputs as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: fputs.c,v 1.14 2005/06/22 19:45:22 christos Exp + fputs.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" +#include "fvwrite.h" + +/* + * Write the given string to the given file. + */ +int +fputs(const char *s, FILE *fp) +{ + struct __suio uio; + struct __siov iov; + int r; + + _DIAGASSERT(s != NULL); + _DIAGASSERT(fp != NULL); + + if (s == NULL) + s = "(null)"; + + iov.iov_base = __UNCONST(s); + uio.uio_resid = (int)(iov.iov_len = strlen(s)); + uio.uio_iov = &iov; + uio.uio_iovcnt = 1; + FLOCKFILE(fp); + _SET_ORIENTATION(fp, -1); + r = __sfvwrite(fp, &uio); + FUNLOCKFILE(fp); + return r; +} diff --git a/StdLib/LibC/Stdio/fputwc.c b/StdLib/LibC/Stdio/fputwc.c new file mode 100644 index 0000000000..49f6702227 --- /dev/null +++ b/StdLib/LibC/Stdio/fputwc.c @@ -0,0 +1,100 @@ +/* $NetBSD: fputwc.c,v 1.4 2005/06/12 05:21:27 lukem Exp $ */ + +/*- + * Copyright (c)2001 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Citrus$ + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: fputwc.c,v 1.4 2005/06/12 05:21:27 lukem Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" +#include "fvwrite.h" + +wint_t +__fputwc_unlock(wchar_t wc, FILE *fp) +{ + struct wchar_io_data *wcio; + mbstate_t *st; + size_t size; + char buf[MB_LEN_MAX]; + struct __suio uio; + struct __siov iov; + + _DIAGASSERT(fp != NULL); + + /* LINTED we don't play with buf */ + iov.iov_base = (void *)buf; + uio.uio_iov = &iov; + uio.uio_iovcnt = 1; + + _SET_ORIENTATION(fp, 1); + wcio = WCIO_GET(fp); + if (wcio == 0) { + errno = ENOMEM; + return WEOF; + } + + wcio->wcio_ungetwc_inbuf = 0; + st = &wcio->wcio_mbstate_out; + + size = wcrtomb(buf, wc, st); + if (size == (size_t)-1) { + errno = EILSEQ; + return WEOF; + } + + _DIAGASSERT(size != 0); + + uio.uio_resid = (int)(iov.iov_len = size); + if (__sfvwrite(fp, &uio)) { + return WEOF; + } + + return (wint_t)wc; +} + +wint_t +fputwc(wchar_t wc, FILE *fp) +{ + wint_t r; + + _DIAGASSERT(fp != NULL); + + FLOCKFILE(fp); + r = __fputwc_unlock(wc, fp); + FUNLOCKFILE(fp); + + return (r); +} diff --git a/StdLib/LibC/Stdio/fputws.c b/StdLib/LibC/Stdio/fputws.c new file mode 100644 index 0000000000..ce373bb402 --- /dev/null +++ b/StdLib/LibC/Stdio/fputws.c @@ -0,0 +1,65 @@ +/* $NetBSD: fputws.c,v 1.1 2003/03/07 07:11:37 tshiozak Exp $ */ + +/*- + * Copyright (c) 2002 Tim J. Robbins. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Original version ID: + * FreeBSD: src/lib/libc/stdio/fputws.c,v 1.4 2002/09/20 13:25:40 tjr Exp + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: fputws.c,v 1.1 2003/03/07 07:11:37 tshiozak Exp $"); +#endif + +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +int +fputws( + const wchar_t * __restrict ws, + FILE * __restrict fp + ) +{ + _DIAGASSERT(fp != NULL); + _DIAGASSERT(ws != NULL); + + FLOCKFILE(fp); + _SET_ORIENTATION(fp, 1); + + while (*ws != '\0') { + if (__fputwc_unlock(*ws++, fp) == WEOF) { + FUNLOCKFILE(fp); + return (-1); + } + } + FUNLOCKFILE(fp); + + return (0); +} diff --git a/StdLib/LibC/Stdio/fread.c b/StdLib/LibC/Stdio/fread.c new file mode 100644 index 0000000000..21013d7ff4 --- /dev/null +++ b/StdLib/LibC/Stdio/fread.c @@ -0,0 +1,96 @@ +/** @file + Implementation of fread as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: fread.c,v 1.16 2003/08/07 16:43:25 agc Exp + fread.c 8.2 (Berkeley) 12/11/93 +**/ +#include + +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +size_t +fread(void *buf, size_t size, size_t count, FILE *fp) +{ + size_t resid; + char *p; + int r; + size_t total; + + _DIAGASSERT(fp != NULL); + /* + * The ANSI standard requires a return value of 0 for a count + * or a size of 0. Whilst ANSI imposes no such requirements on + * fwrite, the SUSv2 does. + */ + if ((resid = count * size) == 0) + return (0); + + _DIAGASSERT(buf != NULL); + + FLOCKFILE(fp); + if (fp->_r < 0) + fp->_r = 0; + total = resid; + p = buf; + while (resid > (size_t)(r = fp->_r)) { + (void)memcpy((void *)p, (void *)fp->_p, (size_t)r); + fp->_p += r; + /* fp->_r = 0 ... done in __srefill */ + p += r; + resid -= r; + if (__srefill(fp)) { + /* no more input: return partial result */ + FUNLOCKFILE(fp); + return ((total - resid) / size); + } + } + (void)memcpy((void *)p, (void *)fp->_p, resid); + fp->_r -= (int)resid; + fp->_p += resid; + FUNLOCKFILE(fp); + return (count); +} diff --git a/StdLib/LibC/Stdio/freopen.c b/StdLib/LibC/Stdio/freopen.c new file mode 100644 index 0000000000..186ab9ad66 --- /dev/null +++ b/StdLib/LibC/Stdio/freopen.c @@ -0,0 +1,196 @@ +/** @file + Implementation of freopen as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: freopen.c,v 1.14 2003/08/07 16:43:25 agc Exp + freopen.c 8.1 (Berkeley) 6/4/93 +**/ +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +/* + * Re-direct an existing, open (probably) file to some other file. + * ANSI is written such that the original file gets closed if at + * all possible, no matter what. + */ +FILE * +freopen(const char *file, const char *mode, FILE *fp) +{ + int f; + int flags, isopen, oflags, sverrno, wantfd; + + _DIAGASSERT(file != NULL); + _DIAGASSERT(mode != NULL); + _DIAGASSERT(fp != NULL); + + if ((flags = __sflags(mode, &oflags)) == 0) { + (void) fclose(fp); + return (NULL); + } + + if (!__sdidinit) + __sinit(); + + /* + * There are actually programs that depend on being able to "freopen" + * descriptors that weren't originally open. Keep this from breaking. + * Remember whether the stream was open to begin with, and which file + * descriptor (if any) was associated with it. If it was attached to + * a descriptor, defer closing it; freopen("/dev/stdin", "r", stdin) + * should work. This is unnecessary if it was not a Unix file. + */ + if (fp->_flags == 0) { + fp->_flags = __SEOF; /* hold on to it */ + isopen = 0; + wantfd = -1; + } else { + /* flush the stream; ANSI doesn't require this. */ + if (fp->_flags & __SWR) + (void) __sflush(fp); + /* if close is NULL, closing is a no-op, hence pointless */ + isopen = fp->_close != NULL; + if ((wantfd = fp->_file) < 0 && isopen) { + (void) (*fp->_close)(fp->_cookie); + isopen = 0; + } + } + + /* Get a new descriptor to refer to the new file. */ + f = open(file, oflags, DEFFILEMODE); + if (f < 0 && isopen) { + /* If out of fd's close the old one and try again. */ + if (errno == ENFILE || errno == EMFILE) { + (void) (*fp->_close)(fp->_cookie); + isopen = 0; + f = open(file, oflags, DEFFILEMODE); + } + } + sverrno = errno; + + /* + * Finish closing fp. Even if the open succeeded above, we cannot + * keep fp->_base: it may be the wrong size. This loses the effect + * of any setbuffer calls, but stdio has always done this before. + */ + if (isopen && f != wantfd) + (void) (*fp->_close)(fp->_cookie); + if (fp->_flags & __SMBF) + free((char *)fp->_bf._base); + fp->_w = 0; + fp->_r = 0; + fp->_p = NULL; + fp->_bf._base = NULL; + fp->_bf._size = 0; + fp->_lbfsize = 0; + if (HASUB(fp)) + FREEUB(fp); + WCIO_FREE(fp); + _UB(fp)._size = 0; + if (HASLB(fp)) + FREELB(fp); + fp->_lb._size = 0; + + if (f < 0) { /* did not get it after all */ + fp->_flags = 0; /* set it free */ + errno = sverrno; /* restore in case _close clobbered */ + return (NULL); + } + + if (oflags & O_NONBLOCK) { + struct stat st; + if (fstat(f, &st) == -1) { + sverrno = errno; + (void)close(f); + errno = sverrno; + return (NULL); + } + if (!S_ISREG(st.st_mode)) { + (void)close(f); + errno = EFTYPE; + return (NULL); + } + } + + /* + * If reopening something that was open before on a real file, try + * to maintain the descriptor. Various C library routines (perror) + * assume stderr is always fd STDERR_FILENO, even if being freopen'd. + */ + if (wantfd >= 0 && f != wantfd) { + if (dup2(f, wantfd) >= 0) { + (void) close(f); + f = wantfd; + } + } + + fp->_flags = (unsigned short)flags; + fp->_file = (short)f; + fp->_cookie = fp; + fp->_read = __sread; + fp->_write = __swrite; + fp->_seek = __sseek; + fp->_close = __sclose; + + /* + * When reopening in append mode, even though we use O_APPEND, + * we need to seek to the end so that ftell() gets the right + * answer. If the user then alters the seek pointer, or + * the file extends, this will fail, but there is not much + * we can do about this. (We could set __SAPP and check in + * fseek and ftell.) + */ + if (oflags & O_APPEND) + (void) __sseek((void *)fp, (fpos_t)0, SEEK_END); + return (fp); +} diff --git a/StdLib/LibC/Stdio/fscanf.c b/StdLib/LibC/Stdio/fscanf.c new file mode 100644 index 0000000000..72d55e50cd --- /dev/null +++ b/StdLib/LibC/Stdio/fscanf.c @@ -0,0 +1,66 @@ +/** @file + Implementation of fscanf as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: fscanf.c,v 1.12 2003/08/07 16:43:25 agc Exp + fscanf.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include + +#include "reentrant.h" +#include "local.h" + +int +fscanf(FILE *fp, char const *fmt, ...) +{ + int ret; + va_list ap; + + va_start(ap, fmt); + ret = __svfscanf(fp, fmt, ap); + va_end(ap); + return (ret); +} diff --git a/StdLib/LibC/Stdio/fseek.c b/StdLib/LibC/Stdio/fseek.c new file mode 100644 index 0000000000..ac06f29fcb --- /dev/null +++ b/StdLib/LibC/Stdio/fseek.c @@ -0,0 +1,74 @@ +/** @file + Implementation of fseek as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to The NetBSD Foundation + by David Laight. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: fseek.c,v 1.22 2006/01/26 10:48:18 kleink Exp +**/ +#include +#include + +#include +#include + +#include "namespace.h" +#include +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +/* + * Seek the given file to the given offset. + * Zero extend the offset if SEEK_SET to allow access to 4GB files + */ +int +fseek(FILE *fp, long l_offset, int whence) +{ + off_t offset; + + if (whence == SEEK_SET) + offset = (off_t)((UINT64)l_offset); // Coerce to unsigned to prevent sign extension + else + offset = (off_t)l_offset; // OK for this one to be negative + return fseeko(fp, offset, whence); +} diff --git a/StdLib/LibC/Stdio/fseeko.c b/StdLib/LibC/Stdio/fseeko.c new file mode 100644 index 0000000000..3c406eaec8 --- /dev/null +++ b/StdLib/LibC/Stdio/fseeko.c @@ -0,0 +1,290 @@ +/* $NetBSD: fseeko.c,v 1.5 2005/03/04 16:04:58 dsl Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +//#include // REMOVE, For DEBUG only +//#include // REMOVE, For DEBUG only + +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: fseeko.c,v 1.5 2005/03/04 16:04:58 dsl Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" +#include +#include + +#include +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +#ifdef __weak_alias +__weak_alias(fseeko, _fseeko) +#endif + +#define POS_ERR (-(fpos_t)1) + +/* + * Seek the given file to the given offset. + * `Whence' must be one of the three SEEK_* macros. + */ +int +fseeko(FILE *fp, off_t offset, int whence) +{ + fpos_t (*seekfn)(void *, fpos_t, int); + fpos_t target, curoff; + size_t n; + struct stat st; + int havepos; + + _DIAGASSERT(fp != NULL); + +#ifdef __GNUC__ + /* This outrageous construct just to shut up a GCC warning. */ + (void) &curoff; +#endif + + /* make sure stdio is set up */ + if (!__sdidinit) + __sinit(); + +//Print(L"%a( %d, %Ld, %d)\n", __func__, fp->_file, offset, whence); + FLOCKFILE(fp); + + /* + * Have to be able to seek. + */ + if ((seekfn = fp->_seek) == NULL) { + errno = ESPIPE; /* historic practice */ + FUNLOCKFILE(fp); +//Print(L"%a: %d\n", __func__, __LINE__); + return (-1); + } + + /* + * Change any SEEK_CUR to SEEK_SET, and check `whence' argument. + * After this, whence is either SEEK_SET or SEEK_END. + */ + switch (whence) { + + case SEEK_CUR: + /* + * In order to seek relative to the current stream offset, + * we have to first find the current stream offset a la + * ftell (see ftell for details). + */ + __sflush(fp); /* may adjust seek offset on append stream */ + if (fp->_flags & __SOFF) + curoff = fp->_offset; + else { + curoff = (*seekfn)(fp->_cookie, (fpos_t)0, SEEK_CUR); + if (curoff == POS_ERR) { + FUNLOCKFILE(fp); +//Print(L"%a: %d\n", __func__, __LINE__); + return (-1); + } + } + if (fp->_flags & __SRD) { + curoff -= fp->_r; + if (HASUB(fp)) + curoff -= fp->_ur; + } else if (fp->_flags & __SWR && fp->_p != NULL) + curoff += fp->_p - fp->_bf._base; + + offset += curoff; + whence = SEEK_SET; + havepos = 1; + break; + + case SEEK_SET: + case SEEK_END: + curoff = 0; /* XXX just to keep gcc quiet */ + havepos = 0; + break; + + default: + errno = EINVAL; + FUNLOCKFILE(fp); +//Print(L"%a: %d\n", __func__, __LINE__); + return (-1); + } + + /* + * Can only optimise if: + * reading (and not reading-and-writing); + * not unbuffered; and + * this is a `regular' Unix file (and hence seekfn==__sseek). + * We must check __NBF first, because it is possible to have __NBF + * and __SOPT both set. + */ + if (fp->_bf._base == NULL) + __smakebuf(fp); + if (fp->_flags & (__SWR | __SRW | __SNBF | __SNPT)) + goto dumb; + if ((fp->_flags & __SOPT) == 0) { + if (seekfn != __sseek || + fp->_file < 0 || fstat(fp->_file, &st) || + !S_ISREG(st.st_mode)) { + fp->_flags |= __SNPT; + goto dumb; + } + fp->_blksize = st.st_blksize; + fp->_flags |= __SOPT; + } + + /* + * We are reading; we can try to optimise. + * Figure out where we are going and where we are now. + */ + if (whence == SEEK_SET) + target = offset; + else { + if (fstat(fp->_file, &st)) + { +//Print(L"%a: %d\n", __func__, __LINE__); + goto dumb; + } + target = st.st_size + offset; + } + + if (!havepos) { + if (fp->_flags & __SOFF) + curoff = fp->_offset; + else { + curoff = (*seekfn)(fp->_cookie, (fpos_t)0, SEEK_CUR); + if (curoff == POS_ERR) + { +//Print(L"%a: %d\n", __func__, __LINE__); + goto dumb; + } + } + curoff -= fp->_r; + if (HASUB(fp)) + curoff -= fp->_ur; + } + + /* + * Compute the number of bytes in the input buffer (pretending + * that any ungetc() input has been discarded). Adjust current + * offset backwards by this count so that it represents the + * file offset for the first byte in the current input buffer. + */ + if (HASUB(fp)) { + curoff += fp->_r; /* kill off ungetc */ + n = fp->_up - fp->_bf._base; + curoff -= n; + n += fp->_ur; + } else { + n = fp->_p - fp->_bf._base; + curoff -= n; + n += fp->_r; + } + + /* + * If the target offset is within the current buffer, + * simply adjust the pointers, clear EOF, undo ungetc(), + * and return. (If the buffer was modified, we have to + * skip this; see fgetln.c.) + */ + if ((fp->_flags & __SMOD) == 0 && + target >= curoff && target < (fpos_t)(curoff + n)) { + int o = (int)(target - curoff); + + fp->_p = fp->_bf._base + o; + fp->_r = (int)(n - o); + if (HASUB(fp)) + FREEUB(fp); + fp->_flags &= ~__SEOF; + FUNLOCKFILE(fp); + return (0); + } + + /* + * The place we want to get to is not within the current buffer, + * but we can still be kind to the kernel copyout mechanism. + * By aligning the file offset to a block boundary, we can let + * the kernel use the VM hardware to map pages instead of + * copying bytes laboriously. Using a block boundary also + * ensures that we only read one block, rather than two. + */ + curoff = target & ~(fp->_blksize - 1); + if ((*seekfn)(fp->_cookie, curoff, SEEK_SET) == POS_ERR) + { +//Print(L"%a: %d\n", __func__, __LINE__); + goto dumb; + } + fp->_r = 0; + fp->_p = fp->_bf._base; + if (HASUB(fp)) + FREEUB(fp); + fp->_flags &= ~__SEOF; + n = (int)(target - curoff); + if (n) { + if (__srefill(fp) || fp->_r < (int)n) + { +//Print(L"%a: %d\n", __func__, __LINE__); + goto dumb; + } + fp->_p += n; + fp->_r -= (int)n; + } + FUNLOCKFILE(fp); + return (0); + + /* + * We get here if we cannot optimise the seek ... just + * do it. Allow the seek function to change fp->_bf._base. + */ +dumb: +//Print(L"%a: %d\n", __func__, __LINE__); + if (__sflush(fp) || + (*seekfn)(fp->_cookie, (fpos_t)offset, whence) == POS_ERR) { + FUNLOCKFILE(fp); +//Print(L"%a: %d\n", __func__, __LINE__); + return (-1); + } + /* success: clear EOF indicator and discard ungetc() data */ + if (HASUB(fp)) + FREEUB(fp); + fp->_p = fp->_bf._base; + fp->_r = 0; + /* fp->_w = 0; */ /* unnecessary (I think...) */ + fp->_flags &= ~__SEOF; + FUNLOCKFILE(fp); +//Print(L"%a: %d\n", __func__, __LINE__); + return (0); +} diff --git a/StdLib/LibC/Stdio/fsetpos.c b/StdLib/LibC/Stdio/fsetpos.c new file mode 100644 index 0000000000..c8c12f4e83 --- /dev/null +++ b/StdLib/LibC/Stdio/fsetpos.c @@ -0,0 +1,63 @@ +/** @file + Implementation of fsetpos as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: fsetpos.c,v 1.10 2003/08/07 16:43:25 agc Exp + fsetpos.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include "namespace.h" +#include +#include +#include + +/* + * fsetpos: like fseek. + */ +int +fsetpos(FILE *iop, const fpos_t *pos) +{ + _DIAGASSERT(iop != NULL); + _DIAGASSERT(pos != NULL); + + return (fseeko(iop, (off_t)*pos, SEEK_SET)); +} diff --git a/StdLib/LibC/Stdio/ftell.c b/StdLib/LibC/Stdio/ftell.c new file mode 100644 index 0000000000..1d325e90f9 --- /dev/null +++ b/StdLib/LibC/Stdio/ftell.c @@ -0,0 +1,103 @@ +/** @file + Implementation of ftell as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: ftell.c,v 1.15 2003/08/07 16:43:25 agc Exp + ftell.c 8.2 (Berkeley) 5/4/95 +**/ +#include + +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +/* + * ftell: return current offset. + */ +long +ftell(FILE *fp) +{ + fpos_t pos; + + FLOCKFILE(fp); + + if (fp->_seek == NULL) { + FUNLOCKFILE(fp); + errno = ESPIPE; /* historic practice */ + return (-1L); + } + + /* + * Find offset of underlying I/O object, then + * adjust for buffered bytes. + */ + __sflush(fp); /* may adjust seek offset on append stream */ + if (fp->_flags & __SOFF) + pos = fp->_offset; + else { + pos = (*fp->_seek)(fp->_cookie, (fpos_t)0, SEEK_CUR); + if (pos == -1L) { + FUNLOCKFILE(fp); + return (long)(pos); + } + } + if (fp->_flags & __SRD) { + /* + * Reading. Any unread characters (including + * those from ungetc) cause the position to be + * smaller than that in the underlying object. + */ + pos -= fp->_r; + if (HASUB(fp)) + pos -= fp->_ur; + } else if (fp->_flags & __SWR && fp->_p != NULL) { + /* + * Writing. Any buffered characters cause the + * position to be greater than that in the + * underlying object. + */ + pos += fp->_p - fp->_bf._base; + } + FUNLOCKFILE(fp); + return (long)(pos); +} diff --git a/StdLib/LibC/Stdio/ftello.c b/StdLib/LibC/Stdio/ftello.c new file mode 100644 index 0000000000..0677d1a355 --- /dev/null +++ b/StdLib/LibC/Stdio/ftello.c @@ -0,0 +1,100 @@ +/* $NetBSD: ftello.c,v 1.4 2003/08/07 16:43:26 agc Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: ftello.c,v 1.4 2003/08/07 16:43:26 agc Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +#ifdef __weak_alias +__weak_alias(ftello, _ftello) +#endif + +/* + * ftell: return current offset. + */ +off_t +ftello(FILE *fp) +{ + fpos_t pos; + + FLOCKFILE(fp); + + if (fp->_seek == NULL) { + FUNLOCKFILE(fp); + errno = ESPIPE; /* historic practice */ + return ((off_t)-1); + } + + /* + * Find offset of underlying I/O object, then + * adjust for buffered bytes. + */ + __sflush(fp); /* may adjust seek offset on append stream */ + if (fp->_flags & __SOFF) + pos = fp->_offset; + else { + pos = (*fp->_seek)(fp->_cookie, (fpos_t)0, SEEK_CUR); + if (pos == (fpos_t)-1) { + FUNLOCKFILE(fp); + return (pos); + } + } + if (fp->_flags & __SRD) { + /* + * Reading. Any unread characters (including + * those from ungetc) cause the position to be + * smaller than that in the underlying object. + */ + pos -= fp->_r; + if (HASUB(fp)) + pos -= fp->_ur; + } else if (fp->_flags & __SWR && fp->_p != NULL) { + /* + * Writing. Any buffered characters cause the + * position to be greater than that in the + * underlying object. + */ + pos += fp->_p - fp->_bf._base; + } + FUNLOCKFILE(fp); + return (pos); +} diff --git a/StdLib/LibC/Stdio/funopen.c b/StdLib/LibC/Stdio/funopen.c new file mode 100644 index 0000000000..313af4da08 --- /dev/null +++ b/StdLib/LibC/Stdio/funopen.c @@ -0,0 +1,82 @@ +/* $NetBSD: funopen.c,v 1.10 2005/11/29 03:12:00 christos Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)funopen.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: funopen.c,v 1.10 2005/11/29 03:12:00 christos Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include "reentrant.h" +#include "local.h" + +FILE * +funopen(cookie, readfn, writefn, seekfn, closefn) + const void *cookie; + int (*readfn) __P((void *, char *, int)); + int (*writefn) __P((void *, const char *, int)); + fpos_t (*seekfn) __P((void *, fpos_t, int)); + int (*closefn) __P((void *)); +{ + FILE *fp; + int flags; + + if (readfn == NULL) { + if (writefn == NULL) { /* illegal */ + errno = EINVAL; + return (NULL); + } else + flags = __SWR; /* write only */ + } else { + if (writefn == NULL) + flags = __SRD; /* read only */ + else + flags = __SRW; /* read-write */ + } + if ((fp = __sfp()) == NULL) + return (NULL); + fp->_flags = flags; + fp->_file = -1; + fp->_cookie = __UNCONST(cookie); + fp->_read = readfn; + fp->_write = writefn; + fp->_seek = seekfn; + fp->_close = closefn; + return (fp); +} diff --git a/StdLib/LibC/Stdio/fvwrite.c b/StdLib/LibC/Stdio/fvwrite.c new file mode 100644 index 0000000000..fcbb256067 --- /dev/null +++ b/StdLib/LibC/Stdio/fvwrite.c @@ -0,0 +1,221 @@ +/* $NetBSD: fvwrite.c,v 1.16.2.1 2007/05/07 19:49:09 pavel Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)fvwrite.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: fvwrite.c,v 1.16.2.1 2007/05/07 19:49:09 pavel Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" +#include "fvwrite.h" + +/* + * Write some memory regions. Return zero on success, EOF on error. + * + * This routine is large and unsightly, but most of the ugliness due + * to the three different kinds of output buffering is handled here. + */ +int +__sfvwrite(FILE *fp, struct __suio *uio) +{ + size_t len; + char *p; + struct __siov *iov; + int w, s; + char *nl; + int nlknown, nldist; + + _DIAGASSERT(fp != NULL); + _DIAGASSERT(uio != NULL); + + if ((len = uio->uio_resid) == 0) + return (0); + /* make sure we can write */ + if (cantwrite(fp)) { + errno = EBADF; + return (EOF); + } + +//#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define COPY(n) (void)memcpy((void *)fp->_p, (void *)p, (size_t)(n)) + + iov = uio->uio_iov; + p = iov->iov_base; + len = iov->iov_len; + iov++; +#define GETIOV(extra_work) \ + while (len == 0) { \ + extra_work; \ + p = iov->iov_base; \ + len = iov->iov_len; \ + iov++; \ + } + if (fp->_flags & __SNBF) { + /* + * Unbuffered: write up to BUFSIZ bytes at a time. + */ + do { + GETIOV(;); + w = (*fp->_write)(fp->_cookie, p, + (int)MIN(len, BUFSIZ)); + if (w <= 0) + goto err; + p += w; + len -= w; + } while ((uio->uio_resid -= w) != 0); + } else if ((fp->_flags & __SLBF) == 0) { + /* + * Fully buffered: fill partially full buffer, if any, + * and then flush. If there is no partial buffer, write + * one _bf._size byte chunk directly (without copying). + * + * String output is a special case: write as many bytes + * as fit, but pretend we wrote everything. This makes + * snprintf() return the number of bytes needed, rather + * than the number used, and avoids its write function + * (so that the write function can be invalid). + */ + do { + GETIOV(;); + if ((fp->_flags & (__SALC | __SSTR)) == + (__SALC | __SSTR) && fp->_w < (int)len) { + size_t blen = fp->_p - fp->_bf._base; + unsigned char *_base; + int _size; + + /* Allocate space exponentially. */ + _size = fp->_bf._size; + do { + _size = (_size << 1) + 1; + } while (_size < (int)(blen + len)); + _base = realloc(fp->_bf._base, + (size_t)(_size + 1)); + if (_base == NULL) + goto err; + fp->_w += _size - fp->_bf._size; + fp->_bf._base = _base; + fp->_bf._size = _size; + fp->_p = _base + blen; + } + w = fp->_w; + if (fp->_flags & __SSTR) { + if (len < (size_t)w) + w = (int)len; + COPY(w); /* copy MIN(fp->_w,len), */ + fp->_w -= w; + fp->_p += w; + w = (int)len; /* but pretend copied all */ + } else if (fp->_p > fp->_bf._base && len > (size_t)w) { + /* fill and flush */ + COPY(w); + /* fp->_w -= w; */ /* unneeded */ + fp->_p += w; + if (fflush(fp)) + goto err; + } else if (len >= (size_t)(w = fp->_bf._size)) { + /* write directly */ + w = (*fp->_write)(fp->_cookie, p, w); + if (w <= 0) + goto err; + } else { + /* fill and done */ + w = (int)len; + COPY(w); + fp->_w -= w; + fp->_p += w; + } + p += w; + len -= w; + } while ((uio->uio_resid -= w) != 0); + } else { + /* + * Line buffered: like fully buffered, but we + * must check for newlines. Compute the distance + * to the first newline (including the newline), + * or `infinity' if there is none, then pretend + * that the amount to write is MIN(len,nldist). + */ + nlknown = 0; + nldist = 0; /* XXX just to keep gcc happy */ + do { + GETIOV(nlknown = 0); + if (!nlknown) { + nl = memchr((void *)p, '\n', len); // Divide the string at the first '\n' + nldist = (int)(nl ? nl + 1 - p : len + 1); + nlknown = 1; + } + s = (int)(MIN((int)len, nldist)); + w = fp->_w + fp->_bf._size; + if (fp->_p > fp->_bf._base && s > w) { + COPY(w); + /* fp->_w -= w; */ + fp->_p += w; + if (fflush(fp)) + goto err; + } else if (s >= (w = fp->_bf._size)) { + w = (*fp->_write)(fp->_cookie, p, w); + if (w <= 0) + goto err; + } else { + w = s; + COPY(w); + fp->_w -= w; + fp->_p += w; + } + if ((nldist -= w) == 0) { + /* copied the newline: flush and forget */ + if (fflush(fp)) + goto err; + nlknown = 0; + } + p += w; + len -= w; + } while ((uio->uio_resid -= w) != 0); + } + return (0); + +err: + fp->_flags |= __SERR; + return (EOF); +} diff --git a/StdLib/LibC/Stdio/fvwrite.h b/StdLib/LibC/Stdio/fvwrite.h new file mode 100644 index 0000000000..bde2b4bc50 --- /dev/null +++ b/StdLib/LibC/Stdio/fvwrite.h @@ -0,0 +1,50 @@ +/* $NetBSD: fvwrite.h,v 1.7 2003/08/07 16:43:26 agc Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)fvwrite.h 8.1 (Berkeley) 6/4/93 + */ + +/* + * I/O descriptors for __sfvwrite(). + */ +struct __siov { + void *iov_base; + size_t iov_len; +}; +struct __suio { + struct __siov *uio_iov; + int uio_iovcnt; + int uio_resid; +}; + +extern int __sfvwrite(FILE *, struct __suio *); diff --git a/StdLib/LibC/Stdio/fwalk.c b/StdLib/LibC/Stdio/fwalk.c new file mode 100644 index 0000000000..fcc3ef3bdf --- /dev/null +++ b/StdLib/LibC/Stdio/fwalk.c @@ -0,0 +1,70 @@ +/** @file + Implementation of the internal fwalk function for . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: fwalk.c,v 1.11 2003/08/07 16:43:26 agc Exp + fwalk.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include "reentrant.h" +#include "local.h" +#include "glue.h" + +int +_fwalk(int (*function)(FILE *)) +{ + FILE *fp; + int n, ret; + struct glue *g; + + _DIAGASSERT(function != NULL); + + ret = 0; + for (g = &__sglue; g != NULL; g = g->next) + for (fp = g->iobs, n = g->niobs; --n >= 0; fp++) + if (fp->_flags != 0) + ret |= (*function)(fp); + return (ret); +} diff --git a/StdLib/LibC/Stdio/fwide.c b/StdLib/LibC/Stdio/fwide.c new file mode 100644 index 0000000000..b89b7a3811 --- /dev/null +++ b/StdLib/LibC/Stdio/fwide.c @@ -0,0 +1,72 @@ +/* $NetBSD: fwide.c,v 1.3 2005/06/12 05:21:27 lukem Exp $ */ + +/*- + * Copyright (c)2001 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Citrus$ + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: fwide.c,v 1.3 2005/06/12 05:21:27 lukem Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +int +fwide(FILE *fp, int mode) +{ + struct wchar_io_data *wcio; + + _DIAGASSERT(fp != NULL); + + /* + * this implementation use only -1, 0, 1 + * for mode value. + * (we don't need to do this, but + * this can make things simpler.) + */ + if (mode > 0) + mode = 1; + else if (mode < 0) + mode = -1; + + FLOCKFILE(fp); + wcio = WCIO_GET(fp); + if (!wcio) + return 0; /* XXX */ + + if (wcio->wcio_mode == 0 && mode != 0) + wcio->wcio_mode = mode; + else + mode = wcio->wcio_mode; + FUNLOCKFILE(fp); + + return mode; +} diff --git a/StdLib/LibC/Stdio/fwprintf.c b/StdLib/LibC/Stdio/fwprintf.c new file mode 100644 index 0000000000..8f65916fa3 --- /dev/null +++ b/StdLib/LibC/Stdio/fwprintf.c @@ -0,0 +1,53 @@ +/* $NetBSD: fwprintf.c,v 1.1 2005/05/14 23:51:02 christos Exp $ */ + +/*- + * Copyright (c) 2002 Tim J. Robbins + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +__FBSDID("$FreeBSD: src/lib/libc/stdio/fwprintf.c,v 1.1 2002/09/21 13:00:30 tjr Exp $"); +#else +__RCSID("$NetBSD: fwprintf.c,v 1.1 2005/05/14 23:51:02 christos Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include + +int +fwprintf(FILE * __restrict fp, const wchar_t * __restrict fmt, ...) +{ + int ret; + va_list ap; + + va_start(ap, fmt); + ret = vfwprintf(fp, fmt, ap); + va_end(ap); + + return (ret); +} diff --git a/StdLib/LibC/Stdio/fwrite.c b/StdLib/LibC/Stdio/fwrite.c new file mode 100644 index 0000000000..9416e67aea --- /dev/null +++ b/StdLib/LibC/Stdio/fwrite.c @@ -0,0 +1,89 @@ +/** @file + Implementation of fwrite as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: fwrite.c,v 1.16 2005/11/29 03:12:00 christos Exp + fwrite.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include "reentrant.h" +#include "local.h" +#include "fvwrite.h" + +/* + * Write `count' objects (each size `size') from memory to the given file. + * Return the number of whole objects written. + */ +size_t +fwrite(const void *buf, size_t size, size_t count, FILE *fp) +{ + size_t n; + struct __suio uio; + struct __siov iov; + + _DIAGASSERT(fp != NULL); + /* + * SUSv2 requires a return value of 0 for a count or a size of 0. + */ + if ((n = count * size) == 0) + return (0); + _DIAGASSERT(buf != NULL); + + iov.iov_base = __UNCONST(buf); + uio.uio_resid = (int)(iov.iov_len = n); + uio.uio_iov = &iov; + uio.uio_iovcnt = 1; + + /* + * The usual case is success (__sfvwrite returns 0); + * skip the divide if this happens, since divides are + * generally slow and since this occurs whenever size==0. + */ + FLOCKFILE(fp); + if (__sfvwrite(fp, &uio) != 0) + count = ((n - uio.uio_resid) / size); + FUNLOCKFILE(fp); + return (count); +} diff --git a/StdLib/LibC/Stdio/fwscanf.c b/StdLib/LibC/Stdio/fwscanf.c new file mode 100644 index 0000000000..462f7d0fff --- /dev/null +++ b/StdLib/LibC/Stdio/fwscanf.c @@ -0,0 +1,53 @@ +/* $NetBSD: fwscanf.c,v 1.1 2005/05/14 23:51:02 christos Exp $ */ + +/*- + * Copyright (c) 2002 Tim J. Robbins + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +__FBSDID("$FreeBSD: src/lib/libc/stdio/fwscanf.c,v 1.1 2002/09/23 12:40:06 tjr Exp $"); +#else +__RCSID("$NetBSD: fwscanf.c,v 1.1 2005/05/14 23:51:02 christos Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include + +int +fwscanf(FILE * __restrict fp, const wchar_t * __restrict fmt, ...) +{ + va_list ap; + int r; + + va_start(ap, fmt); + r = vfwscanf(fp, fmt, ap); + va_end(ap); + + return (r); +} diff --git a/StdLib/LibC/Stdio/getc.c b/StdLib/LibC/Stdio/getc.c new file mode 100644 index 0000000000..c0f367b892 --- /dev/null +++ b/StdLib/LibC/Stdio/getc.c @@ -0,0 +1,80 @@ +/** @file + Implementation of getc as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: getc.c,v 1.11 2003/08/07 16:43:26 agc Exp + getc.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +/* + * A subroutine version of the macro getc. + */ +#undef getc +#undef getc_unlocked + +int +getc(FILE *fp) +{ + int r; + + _DIAGASSERT(fp != NULL); + + FLOCKFILE(fp); + r = __sgetc(fp); + FUNLOCKFILE(fp); + return r; +} + +int +getc_unlocked(FILE *fp) +{ + + _DIAGASSERT(fp != NULL); + + return (__sgetc(fp)); +} diff --git a/StdLib/LibC/Stdio/getchar.c b/StdLib/LibC/Stdio/getchar.c new file mode 100644 index 0000000000..d074e03924 --- /dev/null +++ b/StdLib/LibC/Stdio/getchar.c @@ -0,0 +1,72 @@ +/** @file + Implementation of a subroutine version of the macro getchar, + as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: getchar.c,v 1.9 2003/08/07 16:43:27 agc Exp + getchar.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include "reentrant.h" +#include "local.h" + +#undef getchar +#undef getchar_unlocked + +int +getchar( void ) +{ + FILE *fp = stdin; + int r; + + FLOCKFILE(fp); + r = __sgetc(fp); + FUNLOCKFILE(fp); + return r; +} + +int +getchar_unlocked( void ) +{ + return (__sgetc(stdin)); +} diff --git a/StdLib/LibC/Stdio/gets.c b/StdLib/LibC/Stdio/gets.c new file mode 100644 index 0000000000..093fb3f743 --- /dev/null +++ b/StdLib/LibC/Stdio/gets.c @@ -0,0 +1,80 @@ +/** @file + Implementation of gets as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: gets.c,v 1.15 2003/08/07 16:43:27 agc Exp + gets.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +__warn_references(gets, "warning: this program uses gets(), which is unsafe.") + +char * +gets(char *buf) +{ + int c; + char *s; + + _DIAGASSERT(buf != NULL); + + FLOCKFILE(stdin); + for (s = buf; (c = getchar_unlocked()) != '\n'; ) { + if (c == EOF) { + if (s == buf) { + FUNLOCKFILE(stdin); + return (NULL); + } else { + break; + } + } else { + *s++ = (char)c; + } + } + *s = 0; + FUNLOCKFILE(stdin); + return (buf); +} diff --git a/StdLib/LibC/Stdio/gettemp.c b/StdLib/LibC/Stdio/gettemp.c new file mode 100644 index 0000000000..1bd7dd3924 --- /dev/null +++ b/StdLib/LibC/Stdio/gettemp.c @@ -0,0 +1,183 @@ +/** @file + Internal function to generate temporary file name for tmpnam. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1987, 1993 + The Regents of the University of California. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + NetBSD: gettemp.c,v 1.13 2003/12/05 00:57:36 uebayasi Exp +**/ +#include + +#if HAVE_NBTOOL_CONFIG_H +#include "nbtool_config.h" +#endif + +#if !HAVE_NBTOOL_CONFIG_H || !HAVE_MKSTEMP || !HAVE_MKDTEMP + +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)mktemp.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: gettemp.c,v 1.13 2003/12/05 00:57:36 uebayasi Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#if HAVE_NBTOOL_CONFIG_H +#define GETTEMP gettemp +#else +#include "reentrant.h" +#include "local.h" +#define GETTEMP __gettemp +#endif + +int +GETTEMP( + char *path, + int *doopen, + int domkdir + ) +{ + char *start, *trv; + struct stat sbuf; + + /* To guarantee multiple calls generate unique names even if + the file is not created. 676 different possibilities with 7 + or more X's, 26 with 6 or less. */ + static char xtra[] = "aa"; + int xcnt = 0; + + _DIAGASSERT(path != NULL); + /* doopen may be NULL */ + + /* Move to end of path and count trailing X's. */ + for (trv = path; *trv; ++trv) { + if (*trv == 'X') { + xcnt++; + } + else { + xcnt = 0; + } + } + + /* Use at least one from xtra. Use 2 if more than 6 X's. */ + if (*(trv - 1) == 'X') + *--trv = xtra[0]; + if (xcnt > 6 && *(trv - 1) == 'X') + *--trv = xtra[1]; + + /* Set remaining X's to 0's. */ + while (*--trv == 'X') { + *trv = '0'; + } + + /* update xtra for next call. */ + if (xtra[0] != 'z') + xtra[0]++; + else { + xtra[0] = 'a'; + if (xtra[1] != 'z') + xtra[1]++; + else + xtra[1] = 'a'; + } + + /* + * check the target directory; if you have six X's and it + * doesn't exist this runs for a *very* long time. + */ + for (start = trv + 1;; --trv) { + if (trv <= path) + break; + if (*trv == '/') { + *trv = '\0'; + if (stat(path, &sbuf)) + return (0); + if (!S_ISDIR(sbuf.st_mode)) { + errno = ENOTDIR; + return (0); + } + *trv = '/'; + break; + } + } + + for (;;) { + if (doopen) { + if ((*doopen = + open(path, O_CREAT | O_EXCL | O_RDWR, 0600)) >= 0) + return (1); + if (errno != EEXIST) + return (0); + } else if (domkdir) { + if (mkdir(path, 0700) >= 0) + return (1); + if (errno != EEXIST) + return (0); + } else if (lstat(path, &sbuf)) + return (errno == ENOENT ? 1 : 0); + + /* tricky little algorithm for backward compatibility */ + for (trv = start;;) { + if (!*trv) + return (0); + if (*trv == 'z') { + *trv++ = 'a'; + } + else { + if (isdigit((unsigned char)*trv)) + *trv = 'a'; + else + ++*trv; + break; + } + } + } + /*NOTREACHED*/ +} + +#endif /* !HAVE_NBTOOL_CONFIG_H || !HAVE_MKSTEMP || !HAVE_MKDTEMP */ diff --git a/StdLib/LibC/Stdio/getwc.c b/StdLib/LibC/Stdio/getwc.c new file mode 100644 index 0000000000..128ff692bc --- /dev/null +++ b/StdLib/LibC/Stdio/getwc.c @@ -0,0 +1,49 @@ +/* $NetBSD: getwc.c,v 1.3 2005/06/12 05:21:27 lukem Exp $ */ + +/*- + * Copyright (c)2001 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Citrus$ + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: getwc.c,v 1.3 2005/06/12 05:21:27 lukem Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +/* + * A subroutine version of the macro getwc. + */ +#undef getwc + +wint_t +getwc(FILE *fp) +{ + + return fgetwc(fp); +} diff --git a/StdLib/LibC/Stdio/getwchar.c b/StdLib/LibC/Stdio/getwchar.c new file mode 100644 index 0000000000..df9e86bdc1 --- /dev/null +++ b/StdLib/LibC/Stdio/getwchar.c @@ -0,0 +1,49 @@ +/* $NetBSD: getwchar.c,v 1.3 2005/06/12 05:21:27 lukem Exp $ */ + +/*- + * Copyright (c)2001 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Citrus$ + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: getwchar.c,v 1.3 2005/06/12 05:21:27 lukem Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +/* + * A subroutine version of the macro getwchar. + */ +#undef getwchar + +wint_t +getwchar() +{ + + return fgetwc(stdin); +} diff --git a/StdLib/LibC/Stdio/glue.h b/StdLib/LibC/Stdio/glue.h new file mode 100644 index 0000000000..f2e8fc0db3 --- /dev/null +++ b/StdLib/LibC/Stdio/glue.h @@ -0,0 +1,47 @@ +/* $NetBSD: glue.h,v 1.5 2003/08/07 16:43:27 agc Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)glue.h 8.1 (Berkeley) 6/4/93 + */ + +/* + * The first few FILEs are statically allocated; others are dynamically + * allocated and linked in via this glue structure. + */ +struct glue { + struct glue *next; + int niobs; + FILE *iobs; +}; + +extern struct glue __sglue; diff --git a/StdLib/LibC/Stdio/local.h b/StdLib/LibC/Stdio/local.h new file mode 100644 index 0000000000..f9eaba9989 --- /dev/null +++ b/StdLib/LibC/Stdio/local.h @@ -0,0 +1,113 @@ +/** @file + Information local to this implementation of stdio, + in particular, function declarations and macros. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: local.h,v 1.20 2005/05/14 23:51:02 christos Exp + local.h 8.3 (Berkeley) 7/3/94 +**/ + +#include "wcio.h" +#include "fileext.h" + +extern int __sflush(FILE *); +extern FILE *__sfp(void); +extern int __srefill(FILE *); +extern int __sread(void *, char *, int); +extern int __swrite(void *, char const *, int); +extern fpos_t __sseek(void *, fpos_t, int); +extern int __sclose(void *); +extern void __sinit(void); +extern void _cleanup(void); +//extern void (*__cleanup)(void); // Now in MainData.h. Ref. as gMD->cleanup +extern void __smakebuf(FILE *); +extern int __swhatbuf(FILE *, size_t *, int *); +extern int _fwalk(int (*)(FILE *)); +extern char *_mktemp(char *); +extern int __swsetup(FILE *); +extern int __sflags(const char *, int *); +extern int __svfscanf(FILE * __restrict, const char * __restrict, _BSD_VA_LIST_) + __attribute__((__format__(__scanf__, 2, 0))); +extern int __svfscanf_unlocked(FILE * __restrict, const char * __restrict, _BSD_VA_LIST_) + __attribute__((__format__(__scanf__, 2, 0))); +extern int __vfprintf_unlocked(FILE * __restrict, const char * __restrict, _BSD_VA_LIST_); + + +extern int __sdidinit; + +extern int __gettemp(char *, int *, int); + +extern wint_t __fgetwc_unlock(FILE *); +extern wint_t __fputwc_unlock(wchar_t, FILE *); + +extern char *__fgetstr(FILE * __restrict, size_t * __restrict, int); +extern int __slbexpand(FILE *, size_t); +extern int __vfwprintf_unlocked(FILE *, const wchar_t *, _BSD_VA_LIST_); +extern int __vfwscanf_unlocked(FILE * __restrict, const wchar_t * __restrict, _BSD_VA_LIST_); + +/* + * Return true iff the given FILE cannot be written now. + */ +#define cantwrite(fp) \ + ((((fp)->_flags & __SWR) == 0 || (fp)->_bf._base == NULL) && __swsetup(fp)) + +/* + * Test whether the given stdio file has an active ungetc buffer; + * release such a buffer, without restoring ordinary unread data. + */ +#define HASUB(fp) (_UB(fp)._base != NULL) +#define FREEUB(fp) { \ + if (_UB(fp)._base != (fp)->_ubuf) \ + free((char *)_UB(fp)._base); \ + _UB(fp)._base = NULL; \ + } + +/* + * test for an fgetln() buffer. + */ +#define HASLB(fp) ((fp)->_lb._base != NULL) +#define FREELB(fp) { \ + free((char *)(fp)->_lb._base); \ + (fp)->_lb._base = NULL; \ + } + +extern void __flockfile_internal (FILE *, int); +extern void __funlockfile_internal(FILE *, int); diff --git a/StdLib/LibC/Stdio/makebuf.c b/StdLib/LibC/Stdio/makebuf.c new file mode 100644 index 0000000000..75c475c3a5 --- /dev/null +++ b/StdLib/LibC/Stdio/makebuf.c @@ -0,0 +1,132 @@ +/** @file + Implementation of internal file buffer allocation functions. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: makebuf.c,v 1.14 2003/08/07 16:43:28 agc Exp + makebuf.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include "namespace.h" + +#include +#include +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" +#include + +/* + * Allocate a file buffer, or switch to unbuffered I/O. + * Per the ANSI C standard, ALL tty devices default to line buffered. + * + * As a side effect, we set __SOPT or __SNPT (en/dis-able fseek + * optimisation) right after the fstat() that finds the buffer size. + */ +void +__smakebuf(FILE *fp) +{ + void *p; + int flags; + size_t size; + int couldbetty; + + _DIAGASSERT(fp != NULL); + + if (fp->_flags & __SNBF) { + fp->_bf._base = fp->_p = fp->_nbuf; + fp->_bf._size = 1; + return; + } + flags = __swhatbuf(fp, &size, &couldbetty); + if ((p = malloc(size)) == NULL) { + fp->_flags |= __SNBF; + fp->_bf._base = fp->_p = fp->_nbuf; + fp->_bf._size = 1; + return; + } + gMD->cleanup = _cleanup; + flags |= __SMBF; + fp->_bf._base = fp->_p = p; + fp->_bf._size = (int)size; + if (couldbetty || isatty(fp->_file)) + flags |= __SLBF; + fp->_flags |= flags; +} + +/* + * Internal routine to determine `proper' buffering for a file. + */ +int +__swhatbuf(FILE *fp, size_t *bufsize, int *couldbetty) +{ + struct stat st; + + _DIAGASSERT(fp != NULL); + _DIAGASSERT(bufsize != NULL); + _DIAGASSERT(couldbetty != NULL); + + if (fp->_file < 0 || fstat(fp->_file, &st) < 0) { + *couldbetty = 0; + *bufsize = BUFSIZ; + return (__SNPT); + } + + /* could be a tty iff it is a character device */ + *couldbetty = S_ISCHR(st.st_mode); + if (st.st_blksize == 0) { + *bufsize = BUFSIZ; + return (__SNPT); + } + + /* + * Optimise fseek() only if it is a regular file. (The test for + * __sseek is mainly paranoia.) It is safe to set _blksize + * unconditionally; it will only be used if __SOPT is also set. + */ + *bufsize = st.st_blksize; + fp->_blksize = st.st_blksize; + return ((st.st_mode & S_IFMT) == S_IFREG && fp->_seek == __sseek ? + __SOPT : __SNPT); +} diff --git a/StdLib/LibC/Stdio/mkdtemp.c b/StdLib/LibC/Stdio/mkdtemp.c new file mode 100644 index 0000000000..e30c2f55e0 --- /dev/null +++ b/StdLib/LibC/Stdio/mkdtemp.c @@ -0,0 +1,69 @@ +/* $NetBSD: mkdtemp.c,v 1.9 2003/10/27 00:12:42 lukem Exp $ */ + +/* + * Copyright (c) 1987, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include + +#if HAVE_NBTOOL_CONFIG_H +#include "nbtool_config.h" +#endif + +#if !HAVE_NBTOOL_CONFIG_H || !HAVE_MKDTEMP + +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)mktemp.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: mkdtemp.c,v 1.9 2003/10/27 00:12:42 lukem Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#if HAVE_NBTOOL_CONFIG_H +#define GETTEMP gettemp +#else +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" +#define GETTEMP __gettemp +#endif + +char * +mkdtemp(path) + char *path; +{ + _DIAGASSERT(path != NULL); + + return (GETTEMP(path, (int *)NULL, 1) ? path : (char *)NULL); +} + +#endif /* !HAVE_NBTOOL_CONFIG_H || !HAVE_MKDTEMP */ diff --git a/StdLib/LibC/Stdio/mkstemp.c b/StdLib/LibC/Stdio/mkstemp.c new file mode 100644 index 0000000000..7ea578ce4a --- /dev/null +++ b/StdLib/LibC/Stdio/mkstemp.c @@ -0,0 +1,76 @@ +/* $NetBSD: mkstemp.c,v 1.9 2005/02/09 21:35:47 kleink Exp $ */ + +/* + * Copyright (c) 1987, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include + +#if HAVE_NBTOOL_CONFIG_H +#include "nbtool_config.h" +#endif + +#if !HAVE_NBTOOL_CONFIG_H || !HAVE_MKSTEMP + +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)mktemp.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: mkstemp.c,v 1.9 2005/02/09 21:35:47 kleink Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" + +#if HAVE_NBTOOL_CONFIG_H +#define GETTEMP gettemp +#else +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" +#define GETTEMP __gettemp +#endif + +#ifdef __weak_alias +__weak_alias(mkstemp,_mkstemp) +#endif + +int +mkstemp(char *path) +{ + int fd; + + _DIAGASSERT(path != NULL); + + return (GETTEMP(path, &fd, 0) ? fd : -1); +} + +#endif /* !HAVE_NBTOOL_CONFIG_H || !HAVE_MKSTEMP */ diff --git a/StdLib/LibC/Stdio/mktemp.c b/StdLib/LibC/Stdio/mktemp.c new file mode 100644 index 0000000000..4c9e4752cc --- /dev/null +++ b/StdLib/LibC/Stdio/mktemp.c @@ -0,0 +1,71 @@ +/** @file + Internal function for tmpnam. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +NetBSD: mktemp.c,v 1.19 2003/08/07 16:43:28 agc Exp +mktemp.c 8.1 (Berkeley) 6/4/93 + **/ +#include + +#include +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +char * +_mktemp(char *path) +{ + _DIAGASSERT(path != NULL); + + return (__gettemp(path, (int *)NULL, 0) ? path : (char *)NULL); +} + +__warn_references(mktemp, + "warning: mktemp() possibly used unsafely, use mkstemp() or mkdtemp()") + +char * +mktemp(char *path) +{ + + _DIAGASSERT(path != NULL); + + return (__gettemp(path, (int *)NULL, 0) ? path : (char *)NULL); +} diff --git a/StdLib/LibC/Stdio/perror.c b/StdLib/LibC/Stdio/perror.c new file mode 100644 index 0000000000..b34cd4c479 --- /dev/null +++ b/StdLib/LibC/Stdio/perror.c @@ -0,0 +1,72 @@ +/** @file + Implementation of perror as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Portions Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: perror.c,v 1.24 2006/01/26 11:13:42 kleink Exp + perror.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include "namespace.h" +#include +#include +#include +#include +#include "extern.h" + +/* + * Since perror() is not allowed to change the contents of strerror()'s + * static buffer, both functions supply their own buffers to strerror_r(). + */ + +void +perror(const char *s) +{ + static char buf[ASCII_STRING_MAX]; + const char *separator; + + if (s == NULL) + s = ""; + if (*s == '\0') + separator = ""; + else + separator = ": "; + + (void)strerror_r(errno, buf, sizeof(buf)); + (void)fprintf(stderr, "%s%s%s\n", s, separator, buf); +} diff --git a/StdLib/LibC/Stdio/printf.c b/StdLib/LibC/Stdio/printf.c new file mode 100644 index 0000000000..2a36757b08 --- /dev/null +++ b/StdLib/LibC/Stdio/printf.c @@ -0,0 +1,63 @@ +/** @file + Implementation of printf as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: printf.c,v 1.11 2003/08/07 16:43:29 agc Exp + printf.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include + +int +printf(char const *fmt, ...) +{ + int ret; + va_list ap; + + va_start(ap, fmt); + ret = vfprintf(stdout, fmt, ap); + va_end(ap); + return (ret); +} diff --git a/StdLib/LibC/Stdio/putc.c b/StdLib/LibC/Stdio/putc.c new file mode 100644 index 0000000000..891e747a56 --- /dev/null +++ b/StdLib/LibC/Stdio/putc.c @@ -0,0 +1,80 @@ +/** @file + Implementation of a subroutine version of the macro putc, + as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: putc.c,v 1.11 2003/08/07 16:43:29 agc Exp + putc.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +/* + * putc. + */ +#undef putc +#undef putc_unlocked + +int +putc(int c, FILE *fp) +{ + int r; + + _DIAGASSERT(fp != NULL); + + FLOCKFILE(fp); + r = __sputc(c, fp); + FUNLOCKFILE(fp); + return r; +} + +int +putc_unlocked(int c, FILE *fp) +{ + _DIAGASSERT(fp != NULL); + + return (__sputc(c, fp)); +} diff --git a/StdLib/LibC/Stdio/putchar.c b/StdLib/LibC/Stdio/putchar.c new file mode 100644 index 0000000000..ac6edc888b --- /dev/null +++ b/StdLib/LibC/Stdio/putchar.c @@ -0,0 +1,75 @@ +/** @file + Implementation of a subroutine version of the macro putchar, + as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: putchar.c,v 1.9 2003/08/07 16:43:29 agc Exp + putchar.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include "reentrant.h" +#include "local.h" + +#undef putchar +#undef putchar_unlocked + +/* + * putchar + */ +int +putchar(int c) +{ + FILE *fp = stdout; + int r; + + FLOCKFILE(fp); + r = __sputc(c, fp); + FUNLOCKFILE(fp); + return r; +} + +int +putchar_unlocked(int c) +{ + return (__sputc(c, stdout)); +} diff --git a/StdLib/LibC/Stdio/puts.c b/StdLib/LibC/Stdio/puts.c new file mode 100644 index 0000000000..3585bb7f06 --- /dev/null +++ b/StdLib/LibC/Stdio/puts.c @@ -0,0 +1,85 @@ +/** @file + Implementation of puts as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: puts.c,v 1.15 2006/03/17 02:25:23 chris Exp + puts.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include +#include "fvwrite.h" +#include "reentrant.h" +#include "local.h" + +/* + * Write the given string to stdout, appending a newline. + */ +int +puts(char const *s) +{ + size_t c; + struct __suio uio; + struct __siov iov[2]; + int r; + + _DIAGASSERT(s != NULL); + + if (s == NULL) + s = "(null)"; + + c = strlen(s); + + iov[0].iov_base = __UNCONST(s); + iov[0].iov_len = c; + iov[1].iov_base = __UNCONST("\n"); + iov[1].iov_len = 1; + uio.uio_resid = (int)(c + 1); + uio.uio_iov = &iov[0]; + uio.uio_iovcnt = 2; + FLOCKFILE(stdout); + r = __sfvwrite(stdout, &uio); + FUNLOCKFILE(stdout); + return (r ? EOF : '\n'); +} diff --git a/StdLib/LibC/Stdio/putwc.c b/StdLib/LibC/Stdio/putwc.c new file mode 100644 index 0000000000..84354f1d92 --- /dev/null +++ b/StdLib/LibC/Stdio/putwc.c @@ -0,0 +1,49 @@ +/* $NetBSD: putwc.c,v 1.4 2005/06/12 05:21:27 lukem Exp $ */ + +/*- + * Copyright (c)2001 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Citrus$ + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: putwc.c,v 1.4 2005/06/12 05:21:27 lukem Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +/* + * A subroutine version of the macro putwc. + */ +#undef putwc + +wint_t +putwc(wchar_t wc, FILE *fp) +{ + + return fputwc(wc, fp); +} diff --git a/StdLib/LibC/Stdio/putwchar.c b/StdLib/LibC/Stdio/putwchar.c new file mode 100644 index 0000000000..8bf91c5a88 --- /dev/null +++ b/StdLib/LibC/Stdio/putwchar.c @@ -0,0 +1,49 @@ +/* $NetBSD: putwchar.c,v 1.4 2005/06/12 05:21:27 lukem Exp $ */ + +/*- + * Copyright (c)2001 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Citrus$ + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: putwchar.c,v 1.4 2005/06/12 05:21:27 lukem Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +/* + * A subroutine version of the macro putwchar. + */ +#undef putwchar + +wint_t +putwchar(wchar_t wc) +{ + + return fputwc(wc, stdout); +} diff --git a/StdLib/LibC/Stdio/refill.c b/StdLib/LibC/Stdio/refill.c new file mode 100644 index 0000000000..e2d162375b --- /dev/null +++ b/StdLib/LibC/Stdio/refill.c @@ -0,0 +1,162 @@ +/* $NetBSD: refill.c,v 1.13 2003/08/07 16:43:30 agc Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include // REMOVE, For DEBUG only +#include // REMOVE, For DEBUG only + +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)refill.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: refill.c,v 1.13 2003/08/07 16:43:30 agc Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +#ifdef _REENTRANT +extern rwlock_t __sfp_lock; +#endif + +static int lflush(FILE *); + +static int +lflush(FILE *fp) +{ + + //_DIAGASSERT(fp != NULL); + + if ((fp->_flags & (__SLBF|__SWR)) == (__SLBF|__SWR)) + return (__sflush(fp)); + return (0); +} + +/* + * Refill a stdio buffer. + * Return EOF on eof or error, 0 otherwise. + */ +int +__srefill(FILE *fp) +{ + + //_DIAGASSERT(fp != NULL); + + /* make sure stdio is set up */ + if (!__sdidinit) + __sinit(); + +//Print(L"%a( %d)\n", __func__, fp->_file); + fp->_r = 0; /* largely a convenience for callers */ + + /* SysV does not make this test; take it out for compatibility */ + if (fp->_flags & __SEOF) { +//Print(L"%a: %d\n", __func__, __LINE__); + return (EOF); + } + + /* if not already reading, have to be reading and writing */ + if ((fp->_flags & __SRD) == 0) { +//Print(L"%a: %d\n", __func__, __LINE__); + if ((fp->_flags & __SRW) == 0) { + errno = EBADF; + fp->_flags |= __SERR; // Allows differentiation between errors and EOF +//Print(L"%a: %d\n", __func__, __LINE__); + return (EOF); + } + /* switch to reading */ + if (fp->_flags & __SWR) { + if (__sflush(fp)) { +//Print(L"%a: %d\n", __func__, __LINE__); + return (EOF); + } + fp->_flags &= ~__SWR; + fp->_w = 0; + fp->_lbfsize = 0; + } + fp->_flags |= __SRD; + } else { +//Print(L"%a: %d\n", __func__, __LINE__); + /* + * We were reading. If there is an ungetc buffer, + * we must have been reading from that. Drop it, + * restoring the previous buffer (if any). If there + * is anything in that buffer, return. + */ + if (HASUB(fp)) { + FREEUB(fp); + if ((fp->_r = fp->_ur) != 0) { + fp->_p = fp->_up; +//Print(L"%a: %d\n", __func__, __LINE__); + return (0); + } + } + } + + if (fp->_bf._base == NULL) + __smakebuf(fp); + +//Print(L"%a: %d\n", __func__, __LINE__); + /* + * Before reading from a line buffered or unbuffered file, + * flush all line buffered output files, per the ANSI C + * standard. + */ + if (fp->_flags & (__SLBF|__SNBF)) { + rwlock_rdlock(&__sfp_lock); + (void) _fwalk(lflush); + rwlock_unlock(&__sfp_lock); +//Print(L"%a: %d\n", __func__, __LINE__); + } + fp->_p = fp->_bf._base; + fp->_r = (*fp->_read)(fp->_cookie, (char *)fp->_p, fp->_bf._size); + fp->_flags &= ~__SMOD; /* buffer contents are again pristine */ + if (fp->_r <= 0) { + if (fp->_r == 0) + fp->_flags |= __SEOF; + else { + fp->_r = 0; + fp->_flags |= __SERR; + } +//Print(L"%a: %d\n", __func__, __LINE__); + return (EOF); + } +//Print(L"%a: %d\n", __func__, __LINE__); + return (0); +} diff --git a/StdLib/LibC/Stdio/remove.c b/StdLib/LibC/Stdio/remove.c new file mode 100644 index 0000000000..826471cde5 --- /dev/null +++ b/StdLib/LibC/Stdio/remove.c @@ -0,0 +1,70 @@ +/* $NetBSD: remove.c,v 1.13 2003/08/07 16:43:30 agc Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)remove.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: remove.c,v 1.13 2003/08/07 16:43:30 agc Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +#include +#include +#include +#include + +int +remove(const char *file) +{ + struct stat sb; + + _DIAGASSERT(file != NULL); + + if (lstat(file, &sb) < 0) + return (-1); + + /* + * The file system may prohibit using unlink(2) on directories, + * so always use rmdir(2) in that case. + */ + if (S_ISDIR(sb.st_mode)) + return (rmdir(file)); + else + return (unlink(file)); +} diff --git a/StdLib/LibC/Stdio/rewind.c b/StdLib/LibC/Stdio/rewind.c new file mode 100644 index 0000000000..4f2ab041a2 --- /dev/null +++ b/StdLib/LibC/Stdio/rewind.c @@ -0,0 +1,63 @@ +/** @file + Implementation of rewind as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: rewind.c,v 1.13 2003/08/07 16:43:30 agc Exp + rewind.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +void +rewind(FILE *fp) +{ + _DIAGASSERT(fp != NULL); + + FLOCKFILE(fp); + (void) fseek(fp, 0L, SEEK_SET); + __sclearerr(fp); + FUNLOCKFILE(fp); +} diff --git a/StdLib/LibC/Stdio/rget.c b/StdLib/LibC/Stdio/rget.c new file mode 100644 index 0000000000..ba97ac201b --- /dev/null +++ b/StdLib/LibC/Stdio/rget.c @@ -0,0 +1,70 @@ +/** @file + Internal function to refill the buffer when getc() empties it. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: rget.c,v 1.12 2003/08/07 16:43:30 agc Exp + rget.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +/* + * Handle getc() when the buffer ran out: + * Refill, then return the first character + * in the newly-filled buffer. + */ +int +__srget(FILE *fp) +{ + _DIAGASSERT(fp != NULL); + + _SET_ORIENTATION(fp, -1); + if (__srefill(fp) == 0) { + fp->_r--; + return (*fp->_p++); + } + return (EOF); +} diff --git a/StdLib/LibC/Stdio/scanf.c b/StdLib/LibC/Stdio/scanf.c new file mode 100644 index 0000000000..1962fbaf74 --- /dev/null +++ b/StdLib/LibC/Stdio/scanf.c @@ -0,0 +1,64 @@ +/* $NetBSD: scanf.c,v 1.12 2003/08/07 16:43:31 agc Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)scanf.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: scanf.c,v 1.12 2003/08/07 16:43:31 agc Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include + +#include "reentrant.h" +#include "local.h" + +int +scanf(char const *fmt, ...) +{ + int ret; + va_list ap; + + _DIAGASSERT(fmt != NULL); + + va_start(ap, fmt); + ret = __svfscanf(stdin, fmt, ap); + va_end(ap); + return (ret); +} diff --git a/StdLib/LibC/Stdio/setbuf.c b/StdLib/LibC/Stdio/setbuf.c new file mode 100644 index 0000000000..7484832d50 --- /dev/null +++ b/StdLib/LibC/Stdio/setbuf.c @@ -0,0 +1,63 @@ +/** @file + Implementation of setbuf as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: setbuf.c,v 1.9 2003/08/07 16:43:31 agc Exp + setbuf.c 8.1 (Berkeley) 6/4/93 +**/ +#include +#include + +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +void +setbuf(FILE *fp, char *buf) +{ + + _DIAGASSERT(fp != NULL); + /* buf may be NULL */ + + (void) setvbuf(fp, buf, buf ? _IOFBF : _IONBF, BUFSIZ); +} diff --git a/StdLib/LibC/Stdio/setbuffer.c b/StdLib/LibC/Stdio/setbuffer.c new file mode 100644 index 0000000000..9527a4b3f6 --- /dev/null +++ b/StdLib/LibC/Stdio/setbuffer.c @@ -0,0 +1,72 @@ +/* $NetBSD: setbuffer.c,v 1.10 2003/08/07 16:43:31 agc Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)setbuffer.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: setbuffer.c,v 1.10 2003/08/07 16:43:31 agc Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include + +void +setbuffer(fp, buf, size) + FILE *fp; + char *buf; + int size; +{ + + _DIAGASSERT(fp != NULL); + /* buf may be NULL */ + + (void)setvbuf(fp, buf, buf ? _IOFBF : _IONBF, (size_t)size); +} + +/* + * set line buffering + */ +int +setlinebuf(fp) + FILE *fp; +{ + + _DIAGASSERT(fp != NULL); + + return (setvbuf(fp, (char *)NULL, _IOLBF, (size_t)0)); +} diff --git a/StdLib/LibC/Stdio/setvbuf.c b/StdLib/LibC/Stdio/setvbuf.c new file mode 100644 index 0000000000..3ea96ff6da --- /dev/null +++ b/StdLib/LibC/Stdio/setvbuf.c @@ -0,0 +1,176 @@ +/** @file + Implementation of setvbuf as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: setvbuf.c,v 1.17 2003/08/07 16:43:31 agc Exp + setvbuf.c 8.2 (Berkeley) 11/16/93 +**/ +#include + +#include +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" +#include + +/* + * Set one of the three kinds of buffering, optionally including + * a buffer. + */ +int +setvbuf(FILE *fp, char *buf, int mode, size_t size) +{ + int ret, flags; + size_t iosize; + int ttyflag; + + _DIAGASSERT(fp != NULL); + /* buf may be NULL */ + + /* + * Verify arguments. The `int' limit on `size' is due to this + * particular implementation. Note, buf and size are ignored + * when setting _IONBF. + */ + if (mode != _IONBF) + if ((mode != _IOFBF && mode != _IOLBF) || (int)size < 0) + return (-1); + + FLOCKFILE(fp); + /* + * Write current buffer, if any. Discard unread input (including + * ungetc data), cancel line buffering, and free old buffer if + * malloc()ed. We also clear any eof condition, as if this were + * a seek. + */ + ret = 0; + (void)__sflush(fp); + if (HASUB(fp)) + FREEUB(fp); + WCIO_FREE(fp); + fp->_r = fp->_lbfsize = 0; + flags = fp->_flags; + if (flags & __SMBF) + free((void *)fp->_bf._base); + flags &= ~(__SLBF | __SNBF | __SMBF | __SOPT | __SNPT | __SEOF); + + /* If setting unbuffered mode, skip all the hard work. */ + if (mode == _IONBF) + goto nbf; + + /* + * Find optimal I/O size for seek optimization. This also returns + * a `tty flag' to suggest that we check isatty(fd), but we do not + * care since our caller told us how to buffer. + */ + flags |= __swhatbuf(fp, &iosize, &ttyflag); + if (size == 0) { + buf = NULL; /* force local allocation */ + size = iosize; + } + + /* Allocate buffer if needed. */ + if (buf == NULL) { + if ((buf = malloc(size)) == NULL) { + /* + * Unable to honor user's request. We will return + * failure, but try again with file system size. + */ + ret = -1; + if (size != iosize) { + size = iosize; + buf = malloc(size); + } + } + if (buf == NULL) { + /* No luck; switch to unbuffered I/O. */ +nbf: + fp->_flags = (unsigned short)(flags | __SNBF); + fp->_w = 0; + fp->_bf._base = fp->_p = fp->_nbuf; + fp->_bf._size = 1; + FUNLOCKFILE(fp); + return (ret); + } + flags |= __SMBF; + } + + /* + * Kill any seek optimization if the buffer is not the + * right size. + * + * SHOULD WE ALLOW MULTIPLES HERE (i.e., ok iff (size % iosize) == 0)? + */ + if (size != iosize) + flags |= __SNPT; + + /* + * Fix up the FILE fields, and set gMD->cleanup for output flush on + * exit (since we are buffered in some way). + */ + if (mode == _IOLBF) + flags |= __SLBF; + fp->_flags = (unsigned short)flags; + fp->_bf._base = fp->_p = (unsigned char *)buf; + fp->_bf._size = (int)size; + /* fp->_lbfsize is still 0 */ + if (flags & __SWR) { + /* + * Begin or continue writing: see __swsetup(). Note + * that __SNBF is impossible (it was handled earlier). + */ + if (flags & __SLBF) { + fp->_w = 0; + fp->_lbfsize = -fp->_bf._size; + } else + fp->_w = (int)size; + } else { + /* begin/continue reading, or stay in intermediate state */ + fp->_w = 0; + } + gMD->cleanup = _cleanup; + + FUNLOCKFILE(fp); + return (ret); +} diff --git a/StdLib/LibC/Stdio/snprintf.c b/StdLib/LibC/Stdio/snprintf.c new file mode 100644 index 0000000000..c92641508c --- /dev/null +++ b/StdLib/LibC/Stdio/snprintf.c @@ -0,0 +1,93 @@ +/** @file + Implementation of internal snprintf function for . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: snprintf.c,v 1.20 2005/02/09 21:35:47 kleink Exp + snprintf.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include "namespace.h" + +#include +#include +#include +#include + +#include "reentrant.h" +#include "local.h" + +#ifdef __weak_alias +__weak_alias(snprintf,_snprintf) +#endif + +int +snprintf(char *str, size_t n, char const *fmt, ...) +{ + int ret; + va_list ap; + FILE f; + struct __sfileext fext; + unsigned char dummy[1]; + + _DIAGASSERT(n == 0 || str != NULL); + _DIAGASSERT(fmt != NULL); + + if ((int)n < 0) { + errno = EINVAL; + return (-1); + } + va_start(ap, fmt); + _FILEEXT_SETUP(&f, &fext); + f._file = -1; + f._flags = __SWR | __SSTR; + if (n == 0) { + f._bf._base = f._p = dummy; + f._bf._size = f._w = 0; + } else { + f._bf._base = f._p = (unsigned char *)str; + f._bf._size = f._w = (int)(n - 1); + } + ret = __vfprintf_unlocked(&f, fmt, ap); + *f._p = 0; + va_end(ap); + return (ret); +} diff --git a/StdLib/LibC/Stdio/snprintf_ss.c b/StdLib/LibC/Stdio/snprintf_ss.c new file mode 100644 index 0000000000..e5047b15ab --- /dev/null +++ b/StdLib/LibC/Stdio/snprintf_ss.c @@ -0,0 +1,69 @@ +/* $NetBSD: snprintf_ss.c,v 1.3.2.1 2007/05/07 19:49:08 pavel Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)snprintf.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: snprintf_ss.c,v 1.3.2.1 2007/05/07 19:49:08 pavel Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" + +#include +#include +#include +#include + +#include "reentrant.h" +#include "extern.h" +#include "local.h" + +#ifdef __weak_alias +__weak_alias(snprintf_ss,_snprintf_ss) +#endif + +int +snprintf_ss(char *str, size_t n, char const *fmt, ...) +{ + va_list ap; + int ret; + + va_start(ap, fmt); + ret = vsnprintf_ss(str, n, fmt, ap); + va_end(ap); + return ret; +} diff --git a/StdLib/LibC/Stdio/sprintf.c b/StdLib/LibC/Stdio/sprintf.c new file mode 100644 index 0000000000..6861b4355e --- /dev/null +++ b/StdLib/LibC/Stdio/sprintf.c @@ -0,0 +1,78 @@ +/** @file + Implementation of sprintf as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: sprintf.c,v 1.14 2005/02/09 21:35:47 kleink Exp + sprintf.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include +#include + +#include "reentrant.h" +#include "local.h" + +int +sprintf(char *str, char const *fmt, ...) +{ + int ret; + va_list ap; + FILE f; + struct __sfileext fext; + + _DIAGASSERT(str != NULL); + _DIAGASSERT(fmt != NULL); + + _FILEEXT_SETUP(&f, &fext); + f._file = -1; + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *)str; + f._bf._size = f._w = INT_MAX; + va_start(ap, fmt); + ret = __vfprintf_unlocked(&f, fmt, ap); + va_end(ap); + *f._p = 0; + return (ret); +} diff --git a/StdLib/LibC/Stdio/sscanf.c b/StdLib/LibC/Stdio/sscanf.c new file mode 100644 index 0000000000..c9fb87aaa5 --- /dev/null +++ b/StdLib/LibC/Stdio/sscanf.c @@ -0,0 +1,89 @@ +/** @file + Implementation of sscanf as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: sscanf.c,v 1.16 2005/11/29 03:12:00 christos Exp + sscanf.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include +#include + +#include "reentrant.h" +#include "local.h" + +static int eofread(void *, char *, int); + +/* ARGSUSED */ +static int +eofread(void *cookie, char *buf, int len) +{ + + return (0); +} + +int +sscanf(const char *str, char const *fmt, ...) +{ + int ret; + va_list ap; + FILE f; + struct __sfileext fext; + + _DIAGASSERT(str != NULL); + _DIAGASSERT(fmt != NULL); + + _FILEEXT_SETUP(&f, &fext); + f._flags = __SRD; + f._bf._base = f._p = __UNCONST(str); + f._bf._size = f._r = (int)strlen(str); + f._read = eofread; + _UB(&f)._base = NULL; + f._lb._base = NULL; + va_start(ap, fmt); + ret = __svfscanf_unlocked(&f, fmt, ap); + va_end(ap); + return (ret); +} diff --git a/StdLib/LibC/Stdio/stdio.c b/StdLib/LibC/Stdio/stdio.c new file mode 100644 index 0000000000..005a4388df --- /dev/null +++ b/StdLib/LibC/Stdio/stdio.c @@ -0,0 +1,117 @@ +/** @file + Small standard I/O/seek/close functions. + These maintain the `known seek offset' for seek optimisation. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: stdio.c,v 1.13 2003/08/07 16:43:33 agc Exp + stdio.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include "namespace.h" + +#include +#include +#include +#include +#include + +#include "reentrant.h" +#include "local.h" + +int +__sread(void *cookie, char *buf, int n) +{ + FILE *fp = cookie; + int ret; + + _DIAGASSERT(fp != NULL); + _DIAGASSERT(buf != NULL); + + ret = (int)read(fp->_file, buf, (size_t)n); + /* if the read succeeded, update the current offset */ + if (ret >= 0) + fp->_offset += ret; + else + fp->_flags &= ~__SOFF; /* paranoia */ + return (ret); +} + +int +__swrite(void *cookie, char const *buf, int n) +{ + FILE *fp = cookie; + + _DIAGASSERT(cookie != NULL); + _DIAGASSERT(buf != NULL); + + if (fp->_flags & __SAPP) + (void) lseek(fp->_file, (off_t)0, SEEK_END); + fp->_flags &= ~__SOFF; /* in case FAPPEND mode is set */ + return (int)(write(fp->_file, (char *)buf, (size_t)n)); +} + +fpos_t +__sseek(void *cookie, fpos_t offset, int whence) +{ + FILE *fp = cookie; + off_t ret; + + _DIAGASSERT(fp != NULL); + + ret = lseek(fp->_file, (off_t)offset, whence); + if (ret == -1L) + fp->_flags &= ~__SOFF; + else { + fp->_flags |= __SOFF; + fp->_offset = ret; + } + return (ret); +} + +int +__sclose(void *cookie) +{ + + _DIAGASSERT(cookie != NULL); + + return (close(((FILE *)cookie)->_file)); +} diff --git a/StdLib/LibC/Stdio/swprintf.c b/StdLib/LibC/Stdio/swprintf.c new file mode 100644 index 0000000000..d0f05612f6 --- /dev/null +++ b/StdLib/LibC/Stdio/swprintf.c @@ -0,0 +1,47 @@ +/*- + * Copyright (c) 2002 Tim J. Robbins + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + + FreeBSD: src/lib/libc/stdio/swprintf.c,v 1.1 2002/09/21 13:00:30 tjr Exp + NetBSD: swprintf.c,v 1.1 2005/05/14 23:51:02 christos Exp + */ +#include +#include + +#include +#include +#include + +int +swprintf(wchar_t * __restrict s, size_t n, const wchar_t * __restrict fmt, ...) +{ + int ret; + va_list ap; + + va_start(ap, fmt); + ret = vswprintf(s, n, fmt, ap); + va_end(ap); + + return (ret); +} diff --git a/StdLib/LibC/Stdio/swscanf.c b/StdLib/LibC/Stdio/swscanf.c new file mode 100644 index 0000000000..03b90e827a --- /dev/null +++ b/StdLib/LibC/Stdio/swscanf.c @@ -0,0 +1,47 @@ +/*- + * Copyright (c) 2002 Tim J. Robbins + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + + FreeBSD: src/lib/libc/stdio/swscanf.c,v 1.1 2002/09/23 12:40:06 tjr Exp + NetBSD: swscanf.c,v 1.1 2005/05/14 23:51:02 christos Exp + */ +#include +#include + +#include +#include +#include + +int +swscanf(const wchar_t * __restrict str, const wchar_t * __restrict fmt, ...) +{ + va_list ap; + int r; + + va_start(ap, fmt); + r = vswscanf(str, fmt, ap); + va_end(ap); + + return (r); +} diff --git a/StdLib/LibC/Stdio/tempnam.c b/StdLib/LibC/Stdio/tempnam.c new file mode 100644 index 0000000000..368da844d0 --- /dev/null +++ b/StdLib/LibC/Stdio/tempnam.c @@ -0,0 +1,102 @@ +/* $NetBSD: tempnam.c,v 1.19 2005/07/27 13:23:07 drochner Exp $ */ + +/* + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)tempnam.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: tempnam.c,v 1.19 2005/07/27 13:23:07 drochner Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" +#include +#include +#include +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +__warn_references(tempnam, + "warning: tempnam() possibly used unsafely, use mkstemp() or mkdtemp()") + +static const char * +trailsl(const char *f) +{ + const char *s = f; + while (*s) + s++; + return (f != s && s[-1] == '/') ? "" : "/"; +} + +static char * +gentemp(char *name, size_t len, const char *tmp, const char *pfx) +{ + (void)snprintf(name, len, "%s%s%sXXXX", tmp, trailsl(tmp), pfx); + return _mktemp(name); +} + +char * +tempnam(const char *dir, const char *pfx) +{ + int sverrno; + char *name, *f; + const char *tmp; + + if (!(name = malloc((size_t)MAXPATHLEN))) + return NULL; + + if (!pfx) + pfx = "tmp."; + + if ((tmp = getenv("TMPDIR")) != NULL && + (f = gentemp(name, (size_t)MAXPATHLEN, tmp, pfx)) != NULL) + return f; + + if (dir != NULL && + (f = gentemp(name, (size_t)MAXPATHLEN, dir, pfx)) != NULL) + return f; + + //if ((f = gentemp(name, (size_t)MAXPATHLEN, P_tmpdir, pfx)) != NULL) + // return f; + + if ((f = gentemp(name, (size_t)MAXPATHLEN, _PATH_TMP, pfx)) != NULL) + return f; + + sverrno = errno; + free(name); + errno = sverrno; + return(NULL); +} diff --git a/StdLib/LibC/Stdio/tmpfile.c b/StdLib/LibC/Stdio/tmpfile.c new file mode 100644 index 0000000000..bfcf77c49d --- /dev/null +++ b/StdLib/LibC/Stdio/tmpfile.c @@ -0,0 +1,86 @@ +/* $NetBSD: tmpfile.c,v 1.11 2003/08/07 16:43:33 agc Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)tmpfile.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: tmpfile.c,v 1.11 2003/08/07 16:43:33 agc Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#define TRAILER "tmp.XXXX" + +FILE * +tmpfile() +{ + //sigset_t set, oset; + FILE *fp; + int fd, sverrno; + char buf[sizeof(_PATH_TMP) + sizeof(TRAILER)]; + + (void)memcpy(buf, _PATH_TMP, sizeof(_PATH_TMP) - 1); + (void)memcpy(buf + sizeof(_PATH_TMP) - 1, TRAILER, sizeof(TRAILER)); + + //sigfillset(&set); + //(void)sigprocmask(SIG_BLOCK, &set, &oset); + + fd = mkstemp(buf); + if (fd != -1) + (void)unlink(buf); + + //(void)sigprocmask(SIG_SETMASK, &oset, NULL); + + if (fd == -1) + return (NULL); + + if ((fp = fdopen(fd, "w+")) == NULL) { + sverrno = errno; + (void)close(fd); + errno = sverrno; + return (NULL); + } + return (fp); +} diff --git a/StdLib/LibC/Stdio/tmpnam.c b/StdLib/LibC/Stdio/tmpnam.c new file mode 100644 index 0000000000..74dd77325a --- /dev/null +++ b/StdLib/LibC/Stdio/tmpnam.c @@ -0,0 +1,70 @@ +/** @file + Implementation of tmpnam as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: tmpnam.c,v 1.14 2003/08/07 16:43:33 agc Exp + tmpnam.c 8.3 (Berkeley) 3/28/94 +**/ +#include +#include + +#include "namespace.h" +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +__warn_references(tmpnam,"warning: tmpnam() possibly used unsafely, use mkstemp() or mkdtemp()") + +char * +tmpnam(char *s) +{ + static long unsigned int tmpcount = 0; // Must be long to satisfy the %lu in snprintf below. + static char buf[L_tmpnam]; + + if (s == NULL) + s = buf; + (void)snprintf(s, L_tmpnam, "%stmp_%lu_XXXX", _PATH_TMP, tmpcount); + ++tmpcount; + return (_mktemp(s)); +} diff --git a/StdLib/LibC/Stdio/ungetc.c b/StdLib/LibC/Stdio/ungetc.c new file mode 100644 index 0000000000..e9d3807fcb --- /dev/null +++ b/StdLib/LibC/Stdio/ungetc.c @@ -0,0 +1,172 @@ +/** @file + Implementation of ungetc as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: ungetc.c,v 1.14 2003/08/07 16:43:34 agc Exp + ungetc.c 8.2 (Berkeley) 11/3/93 +**/ +#include + +#include +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +static int __submore(FILE *); +/* + * Expand the ungetc buffer `in place'. That is, adjust fp->_p when + * the buffer moves, so that it points the same distance from the end, + * and move the bytes in the buffer around as necessary so that they + * are all at the end (stack-style). + */ +static int +__submore(FILE *fp) +{ + int i; + unsigned char *p; + + _DIAGASSERT(fp != NULL); + + if (_UB(fp)._base == fp->_ubuf) { + /* + * Get a new buffer (rather than expanding the old one). + */ + if ((p = malloc((size_t)BUFSIZ)) == NULL) + return (EOF); + _UB(fp)._base = p; + _UB(fp)._size = BUFSIZ; + p += BUFSIZ - sizeof(fp->_ubuf); + for (i = sizeof(fp->_ubuf); --i >= 0;) + p[i] = fp->_ubuf[i]; + fp->_p = p; + return (0); + } + i = _UB(fp)._size; + p = realloc(_UB(fp)._base, (size_t)(i << 1)); + if (p == NULL) + return (EOF); + /* no overlap (hence can use memcpy) because we doubled the size */ + (void)memcpy((void *)(p + i), (void *)p, (size_t)i); + fp->_p = p + i; + _UB(fp)._base = p; + _UB(fp)._size = i << 1; + return (0); +} + +int +ungetc(int c, FILE *fp) +{ + _DIAGASSERT(fp != NULL); + + if (c == EOF) + return (EOF); + if (!__sdidinit) + __sinit(); + FLOCKFILE(fp); + _SET_ORIENTATION(fp, -1); + if ((fp->_flags & __SRD) == 0) { + /* + * Not already reading: no good unless reading-and-writing. + * Otherwise, flush any current write stuff. + */ + if ((fp->_flags & __SRW) == 0) { + FUNLOCKFILE(fp); + return (EOF); + } + if (fp->_flags & __SWR) { + if (__sflush(fp)) { + FUNLOCKFILE(fp); + return (EOF); + } + fp->_flags &= ~__SWR; + fp->_w = 0; + fp->_lbfsize = 0; + } + fp->_flags |= __SRD; + } + c = (unsigned char)c; + + /* + * If we are in the middle of ungetc'ing, just continue. + * This may require expanding the current ungetc buffer. + */ + if (HASUB(fp)) { + if (fp->_r >= _UB(fp)._size && __submore(fp)) { + FUNLOCKFILE(fp); + return (EOF); + } + *--fp->_p = (unsigned char)c; + fp->_r++; + FUNLOCKFILE(fp); + return (c); + } + fp->_flags &= ~__SEOF; + + /* + * If we can handle this by simply backing up, do so, + * but never replace the original character. + * (This makes sscanf() work when scanning `const' data.) + */ + if (fp->_bf._base != NULL && fp->_p > fp->_bf._base && + fp->_p[-1] == c) { + fp->_p--; + fp->_r++; + FUNLOCKFILE(fp); + return (c); + } + + /* + * Create an ungetc buffer. + * Initially, we will use the `reserve' buffer. + */ + fp->_ur = fp->_r; + fp->_up = fp->_p; + _UB(fp)._base = fp->_ubuf; + _UB(fp)._size = sizeof(fp->_ubuf); + fp->_ubuf[sizeof(fp->_ubuf) - 1] = (unsigned char)c; + fp->_p = &fp->_ubuf[sizeof(fp->_ubuf) - 1]; + fp->_r = 1; + FUNLOCKFILE(fp); + return (c); +} diff --git a/StdLib/LibC/Stdio/ungetwc.c b/StdLib/LibC/Stdio/ungetwc.c new file mode 100644 index 0000000000..8155043cf7 --- /dev/null +++ b/StdLib/LibC/Stdio/ungetwc.c @@ -0,0 +1,75 @@ +/*- + * Copyright (c)2001 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Citrus$ + + NetBSD: ungetwc.c,v 1.3 2005/06/12 05:21:27 lukem Exp + */ +#include +#include + +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +wint_t +ungetwc(wint_t wc, FILE *fp) +{ + struct wchar_io_data *wcio; + + _DIAGASSERT(fp); + + if (wc == WEOF) + return WEOF; + + FLOCKFILE(fp); + _SET_ORIENTATION(fp, 1); + /* + * XXX since we have no way to transform a wchar string to + * a char string in reverse order, we can't use ungetc. + */ + /* XXX should we flush ungetc buffer? */ + + wcio = WCIO_GET(fp); + if (wcio == 0) { + FUNLOCKFILE(fp); + errno = ENOMEM; /* XXX */ + return WEOF; + } + + if (wcio->wcio_ungetwc_inbuf >= WCIO_UNGETWC_BUFSIZE) { + FUNLOCKFILE(fp); + return WEOF; + } + + wcio->wcio_ungetwc_buf[wcio->wcio_ungetwc_inbuf++] = (wchar_t)wc; + __sclearerr(fp); + FUNLOCKFILE(fp); + + return wc; +} diff --git a/StdLib/LibC/Stdio/vasprintf.c b/StdLib/LibC/Stdio/vasprintf.c new file mode 100644 index 0000000000..3a36468b49 --- /dev/null +++ b/StdLib/LibC/Stdio/vasprintf.c @@ -0,0 +1,79 @@ +/* $NetBSD: vasprintf.c,v 1.10 2005/02/09 21:35:47 kleink Exp $ */ + +/* + * Copyright (c) 1997 Todd C. Miller + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: vasprintf.c,v 1.10 2005/02/09 21:35:47 kleink Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +int +vasprintf(str, fmt, ap) + char **str; + const char *fmt; + _BSD_VA_LIST_ ap; +{ + int ret; + FILE f; + struct __sfileext fext; + unsigned char *_base; + + _DIAGASSERT(str != NULL); + _DIAGASSERT(fmt != NULL); + + _FILEEXT_SETUP(&f, &fext); + f._file = -1; + f._flags = __SWR | __SSTR | __SALC; + f._bf._base = f._p = (unsigned char *)malloc(128); + if (f._bf._base == NULL) + goto err; + f._bf._size = f._w = 127; /* Leave room for the NUL */ + ret = __vfprintf_unlocked(&f, fmt, ap); + if (ret == -1) + goto err; + *f._p = '\0'; + _base = realloc(f._bf._base, (size_t)(ret + 1)); + if (_base == NULL) + goto err; + *str = (char *)_base; + return (ret); + +err: + if (f._bf._base) + free(f._bf._base); + *str = NULL; + errno = ENOMEM; + return (-1); +} diff --git a/StdLib/LibC/Stdio/vfprintf.c b/StdLib/LibC/Stdio/vfprintf.c new file mode 100644 index 0000000000..8f5c649942 --- /dev/null +++ b/StdLib/LibC/Stdio/vfprintf.c @@ -0,0 +1,2 @@ +#define NARROW +#include "vfwprintf.c" diff --git a/StdLib/LibC/Stdio/vfscanf.c b/StdLib/LibC/Stdio/vfscanf.c new file mode 100644 index 0000000000..724fd2a747 --- /dev/null +++ b/StdLib/LibC/Stdio/vfscanf.c @@ -0,0 +1,1129 @@ +/** @file + Implementation of scanf internals for . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: vfscanf.c,v 1.37.4.1 2007/05/07 19:49:08 pavel Exp + FreeBSD: src/lib/libc/stdio/vfscanf.c,v 1.41 2007/01/09 00:28:07 imp Exp + vfscanf.c 8.1 (Berkeley) 6/4/93 +**/ +//#include // REMOVE, For DEBUG only +//#include // REMOVE, For DEBUG only + +#include + +#include "namespace.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "reentrant.h" +#include "local.h" + +#ifndef NO_FLOATING_POINT +#include +#endif + +/* + * Provide an external name for vfscanf. Note, we don't use the normal + * namespace.h method; stdio routines explicitly use the internal name + * __svfscanf. + */ +#ifdef __weak_alias +__weak_alias(vfscanf,__svfscanf) +#endif + +#define BUF 513 /* Maximum length of numeric string. */ + +/* + * Flags used during conversion. + */ +#define LONG 0x0001 /* l: long or double */ +#define LONGDBL 0x0002 /* L: long double */ +#define SHORT 0x0004 /* h: short */ +#define SUPPRESS 0x0008 /* *: suppress assignment */ +#define POINTER 0x0010 /* p: void * (as hex) */ +#define NOSKIP 0x0020 /* [ or c: do not skip blanks */ +#define LONGLONG 0x0400 /* ll: long long (+ deprecated q: quad) */ +#define INTMAXT 0x0800 /* j: intmax_t */ +#define PTRDIFFT 0x1000 /* t: ptrdiff_t */ +#define SIZET 0x2000 /* z: size_t */ +#define SHORTSHORT 0x4000 /* hh: char */ +#define UNSIGNED 0x8000 /* %[oupxX] conversions */ + +/* + * The following are used in integral conversions only: + * SIGNOK, NDIGITS, PFXOK, and NZDIGITS + */ +#define SIGNOK 0x00040 /* +/- is (still) legal */ +#define NDIGITS 0x00080 /* no digits detected */ +#define PFXOK 0x00100 /* 0x prefix is (still) legal */ +#define NZDIGITS 0x00200 /* no zero digits detected */ +#define HAVESIGN 0x10000 /* sign detected */ + +/* + * Conversion types. + */ +#define CT_CHAR 0 /* %c conversion */ +#define CT_CCL 1 /* %[...] conversion */ +#define CT_STRING 2 /* %s conversion */ +#define CT_INT 3 /* %[dioupxX] conversion */ +#define CT_FLOAT 4 /* %[efgEFG] conversion */ + +static const u_char *__sccl(char *, const u_char *); +#ifndef NO_FLOATING_POINT + static int parsefloat(FILE *, char *, char *); +#endif + +int __scanfdebug = 0; + +#define __collate_load_error /*CONSTCOND*/0 +static int +__collate_range_cmp(int c1, int c2) +{ + static char s1[2], s2[2]; + + s1[0] = (char)c1; + s2[0] = (char)c2; + return strcoll(s1, s2); +} + + +/* + * __svfscanf - MT-safe version + */ +int +__svfscanf(FILE *fp, char const *fmt0, va_list ap) +{ + int ret; + + FLOCKFILE(fp); + ret = __svfscanf_unlocked(fp, fmt0, ap); + FUNLOCKFILE(fp); + return (ret); +} + +/* + * __svfscanf_unlocked - non-MT-safe version of __svfscanf + */ +int +__svfscanf_unlocked(FILE *fp, const char *fmt0, va_list ap) +{ + const u_char *fmt = (const u_char *)fmt0; + int c; /* character from format, or conversion */ + size_t width; /* field width, or 0 */ + char *p; /* points into all kinds of strings */ + size_t n; /* handy size_t */ + int flags; /* flags as defined above */ + char *p0; /* saves original value of p when necessary */ + int nassigned; /* number of fields assigned */ + int nconversions; /* number of conversions */ + int nread; /* number of characters consumed from fp */ + int base; /* base argument to conversion function */ + char ccltab[256]; /* character class table for %[...] */ + char buf[BUF]; /* buffer for numeric and mb conversions */ + wchar_t *wcp; /* handy wide character pointer */ + size_t nconv; /* length of multibyte sequence converted */ + static const mbstate_t initial = { 0 }; + mbstate_t mbs; + + /* `basefix' is used to avoid `if' tests in the integer scanner */ + static const short basefix[17] = + { 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; + + _DIAGASSERT(fp != NULL); + _DIAGASSERT(fmt0 != NULL); + + _SET_ORIENTATION(fp, -1); + +//Print(L"%a( %d, \"%a\", ...)\n", __func__, fp->_file, fmt0); + nassigned = 0; + nconversions = 0; + nread = 0; + base = 0; + for (;;) { + c = (unsigned char)*fmt++; + if (c == 0) + return (nassigned); + if (isspace(c)) { + while ((fp->_r > 0 || __srefill(fp) == 0) && + isspace(*fp->_p)) + nread++, fp->_r--, fp->_p++; + continue; + } +//Print(L"%a: %d\n", __func__, __LINE__); + if (c != '%') + goto literal; + width = 0; + flags = 0; + /* + * switch on the format. continue if done; + * break once format type is derived. + */ +again: c = *fmt++; +//Print(L"%a: %d\n", __func__, __LINE__); + switch (c) { + case '%': +literal: +//Print(L"%a: %d\n", __func__, __LINE__); + if (fp->_r <= 0 && __srefill(fp)) + goto input_failure; + if (*fp->_p != c) + goto match_failure; + fp->_r--, fp->_p++; + nread++; + continue; + + case '*': + flags |= SUPPRESS; + goto again; + case 'j': + flags |= INTMAXT; + goto again; + case 'l': + if (flags & LONG) { + flags &= ~LONG; + flags |= LONGLONG; + } else + flags |= LONG; + goto again; + case 'q': + flags |= LONGLONG; /* not quite */ + goto again; + case 't': + flags |= PTRDIFFT; + goto again; + case 'z': + flags |= SIZET; + goto again; + case 'L': + flags |= LONGDBL; + goto again; + case 'h': + if (flags & SHORT) { + flags &= ~SHORT; + flags |= SHORTSHORT; + } else + flags |= SHORT; + goto again; + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + width = width * 10 + c - '0'; + goto again; + + /* + * Conversions. + */ + case 'd': + c = CT_INT; + base = 10; + break; + + case 'i': + c = CT_INT; + base = 0; + break; + + case 'o': + c = CT_INT; + flags |= UNSIGNED; + base = 8; + break; + + case 'u': + c = CT_INT; + flags |= UNSIGNED; + base = 10; + break; + + case 'X': + case 'x': + flags |= PFXOK; /* enable 0x prefixing */ + c = CT_INT; + flags |= UNSIGNED; + base = 16; + break; + +#ifndef NO_FLOATING_POINT + case 'A': case 'E': case 'F': case 'G': + case 'a': case 'e': case 'f': case 'g': + c = CT_FLOAT; + break; +#endif + + case 'S': + flags |= LONG; + /* FALLTHROUGH */ + case 's': + c = CT_STRING; + break; + + case '[': + fmt = __sccl(ccltab, fmt); + flags |= NOSKIP; + c = CT_CCL; + break; + + case 'C': + flags |= LONG; + /* FALLTHROUGH */ + case 'c': + flags |= NOSKIP; + c = CT_CHAR; + break; + + case 'p': /* pointer format is like hex */ + flags |= POINTER | PFXOK; + c = CT_INT; /* assumes sizeof(uintmax_t) */ + flags |= UNSIGNED; /* >= sizeof(uintptr_t) */ + base = 16; + break; + + case 'n': + nconversions++; + if (flags & SUPPRESS) /* ??? */ + continue; + if (flags & SHORTSHORT) + *va_arg(ap, char *) = (char)nread; + else if (flags & SHORT) + *va_arg(ap, short *) = (short)nread; + else if (flags & LONG) + *va_arg(ap, long *) = nread; + else if (flags & LONGLONG) + *va_arg(ap, long long *) = nread; + else if (flags & INTMAXT) + *va_arg(ap, intmax_t *) = nread; + else if (flags & SIZET) + *va_arg(ap, size_t *) = nread; + else if (flags & PTRDIFFT) + *va_arg(ap, ptrdiff_t *) = nread; + else + *va_arg(ap, int *) = nread; + continue; + + default: + goto match_failure; + + /* + * Disgusting backwards compatibility hack. XXX + */ + case '\0': /* compat */ + return (EOF); + } +//Print(L"%a: %d\n", __func__, __LINE__); + + /* + * We have a conversion that requires input. + */ + if (fp->_r <= 0 && __srefill(fp)) + { +//Print(L"%a: %d\n", __func__, __LINE__); + goto input_failure; + } + + /* + * Consume leading white space, except for formats + * that suppress this. + */ + if ((flags & NOSKIP) == 0) { + while (isspace(*fp->_p)) { + nread++; + if (--fp->_r > 0) + fp->_p++; + else if (__srefill(fp)) + { +//Print(L"%a: %d\n", __func__, __LINE__); + goto input_failure; + } + } + /* + * Note that there is at least one character in + * the buffer, so conversions that do not set NOSKIP + * ca no longer result in an input failure. + */ + } + + /* + * Do the conversion. + */ +//Print(L"%a: %d\n", __func__, __LINE__); + switch (c) { + + case CT_CHAR: + /* scan arbitrary characters (sets NOSKIP) */ + if (width == 0) + width = 1; + if (flags & LONG) { + if ((flags & SUPPRESS) == 0) + wcp = va_arg(ap, wchar_t *); + else + wcp = NULL; + n = 0; + while (width != 0) { + if (n == MB_CUR_MAX) { + fp->_flags |= __SERR; + goto input_failure; + } + buf[n++] = *fp->_p; + fp->_p++; + fp->_r--; + mbs = initial; + nconv = mbrtowc(wcp, buf, n, &mbs); + if (nconv == (size_t)-1) { + fp->_flags |= __SERR; + goto input_failure; + } + if (nconv == 0 && !(flags & SUPPRESS)) + *wcp = L'\0'; + if (nconv != (size_t)-2) { + nread += (int)n; + width--; + if (!(flags & SUPPRESS)) + wcp++; + n = 0; + } + if (fp->_r <= 0 && __srefill(fp)) { + if (n != 0) { + fp->_flags |= __SERR; + goto input_failure; + } + break; + } + } + if (!(flags & SUPPRESS)) + nassigned++; + } else if (flags & SUPPRESS) { + size_t sum = 0; + for (;;) { + if ((n = fp->_r) < width) { + sum += n; + width -= n; + fp->_p += n; + if (__srefill(fp)) { + if (sum == 0) + goto input_failure; + break; + } + } else { + sum += width; + fp->_r -= (int)width; + fp->_p += width; + break; + } + } + nread += (int)sum; + } else { + size_t r = fread(va_arg(ap, char *), 1, + width, fp); + + if (r == 0) + goto input_failure; + nread += (int)r; + nassigned++; + } + nconversions++; + break; + + case CT_CCL: + /* scan a (nonempty) character class (sets NOSKIP) */ + if (width == 0) + width = (size_t)~0; /* `infinity' */ + /* take only those things in the class */ + if (flags & LONG) { + wchar_t twc; + int nchars; + + if ((flags & SUPPRESS) == 0) + wcp = va_arg(ap, wchar_t *); + else + wcp = &twc; + n = 0; + nchars = 0; + while (width != 0) { + if (n == MB_CUR_MAX) { + fp->_flags |= __SERR; + goto input_failure; + } + buf[n++] = *fp->_p; + fp->_p++; + fp->_r--; + mbs = initial; + nconv = mbrtowc(wcp, buf, n, &mbs); + if (nconv == (size_t)-1) { + fp->_flags |= __SERR; + goto input_failure; + } + if (nconv == 0) + *wcp = L'\0'; + if (nconv != (size_t)-2) { + if (wctob(*wcp) != EOF && + !ccltab[wctob(*wcp)]) { + while (n != 0) { + n--; + (void)ungetc(buf[n], + fp); + } + break; + } + nread += (int)n; + width--; + if (!(flags & SUPPRESS)) + wcp++; + nchars++; + n = 0; + } + if (fp->_r <= 0 && __srefill(fp)) { + if (n != 0) { + fp->_flags |= __SERR; + goto input_failure; + } + break; + } + } + if (n != 0) { + fp->_flags |= __SERR; + goto input_failure; + } + n = nchars; + if (n == 0) + goto match_failure; + if (!(flags & SUPPRESS)) { + *wcp = L'\0'; + nassigned++; + } + } else if (flags & SUPPRESS) { + n = 0; + while (ccltab[*fp->_p]) { + n++, fp->_r--, fp->_p++; + if (--width == 0) + break; + if (fp->_r <= 0 && __srefill(fp)) { + if (n == 0) + goto input_failure; + break; + } + } + if (n == 0) + goto match_failure; + } else { + p0 = p = va_arg(ap, char *); + while (ccltab[*fp->_p]) { + fp->_r--; + *p++ = *fp->_p++; + if (--width == 0) + break; + if (fp->_r <= 0 && __srefill(fp)) { + if (p == p0) + goto input_failure; + break; + } + } + n = p - p0; + if (n == 0) + goto match_failure; + *p = 0; + nassigned++; + } + nread += (int)n; + nconversions++; + break; + + case CT_STRING: + /* like CCL, but zero-length string OK, & no NOSKIP */ + if (width == 0) + width = (size_t)~0; + if (flags & LONG) { + wchar_t twc; + + if ((flags & SUPPRESS) == 0) + wcp = va_arg(ap, wchar_t *); + else + wcp = &twc; + n = 0; + while (!isspace(*fp->_p) && width != 0) { + if (n == MB_CUR_MAX) { + fp->_flags |= __SERR; + goto input_failure; + } + buf[n++] = *fp->_p; + fp->_p++; + fp->_r--; + mbs = initial; + nconv = mbrtowc(wcp, buf, n, &mbs); + if (nconv == (size_t)-1) { + fp->_flags |= __SERR; + goto input_failure; + } + if (nconv == 0) + *wcp = L'\0'; + if (nconv != (size_t)-2) { + if (iswspace(*wcp)) { + while (n != 0) { + n--; + (void)ungetc(buf[n], + fp); + } + break; + } + nread += (int)n; + width--; + if (!(flags & SUPPRESS)) + wcp++; + n = 0; + } + if (fp->_r <= 0 && __srefill(fp)) { + if (n != 0) { + fp->_flags |= __SERR; + goto input_failure; + } + break; + } + } + if (!(flags & SUPPRESS)) { + *wcp = L'\0'; + nassigned++; + } + } else if (flags & SUPPRESS) { + n = 0; + while (!isspace(*fp->_p)) { + n++, fp->_r--, fp->_p++; + if (--width == 0) + break; + if (fp->_r <= 0 && __srefill(fp)) + break; + } + nread += (int)n; + } else { + p0 = p = va_arg(ap, char *); + while (!isspace(*fp->_p)) { + fp->_r--; + *p++ = *fp->_p++; + if (--width == 0) + break; + if (fp->_r <= 0 && __srefill(fp)) + break; + } + *p = 0; + nread += (int)(p - p0); + nassigned++; + } + nconversions++; + continue; + + case CT_INT: +//Print(L"%a: %d\n", __func__, __LINE__); + /* scan an integer as if by the conversion function */ +#ifdef hardway + if (width == 0 || width > sizeof(buf) - 1) + width = sizeof(buf) - 1; +#else + /* size_t is unsigned, hence this optimisation */ + if (--width > sizeof(buf) - 2) + width = sizeof(buf) - 2; + width++; +#endif + flags |= SIGNOK | NDIGITS | NZDIGITS; + for (p = buf; width; width--) { + c = *fp->_p; + /* + * Switch on the character; `goto ok' + * if we accept it as a part of number. + */ + switch (c) { + + /* + * The digit 0 is always legal, but is + * special. For %i conversions, if no + * digits (zero or nonzero) have been + * scanned (only signs), we will have + * base==0. In that case, we should set + * it to 8 and enable 0x prefixing. + * Also, if we have not scanned zero digits + * before this, do not turn off prefixing + * (someone else will turn it off if we + * have scanned any nonzero digits). + */ + case '0': + if (base == 0) { + base = 8; + flags |= PFXOK; + } + if (flags & NZDIGITS) + flags &= ~(SIGNOK|NZDIGITS|NDIGITS); + else + flags &= ~(SIGNOK|PFXOK|NDIGITS); + goto ok; + + /* 1 through 7 always legal */ + case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + base = basefix[base]; + flags &= ~(SIGNOK | PFXOK | NDIGITS); + goto ok; + + /* digits 8 and 9 ok iff decimal or hex */ + case '8': case '9': + base = basefix[base]; + if (base <= 8) + break; /* not legal here */ + flags &= ~(SIGNOK | PFXOK | NDIGITS); + goto ok; + + /* letters ok iff hex */ + case 'A': case 'B': case 'C': + case 'D': case 'E': case 'F': + case 'a': case 'b': case 'c': + case 'd': case 'e': case 'f': + /* no need to fix base here */ + if (base <= 10) + break; /* not legal here */ + flags &= ~(SIGNOK | PFXOK | NDIGITS); + goto ok; + + /* sign ok only as first character */ + case '+': case '-': + if (flags & SIGNOK) { + flags &= ~SIGNOK; + flags |= HAVESIGN; + goto ok; + } + break; + + /* + * x ok iff flag still set & 2nd char (or + * 3rd char if we have a sign). + */ + case 'x': case 'X': + if (flags & PFXOK && p == + buf + 1 + !!(flags & HAVESIGN)) { + base = 16; /* if %i */ + flags &= ~PFXOK; + goto ok; + } + break; + } + + /* + * If we got here, c is not a legal character + * for a number. Stop accumulating digits. + */ + break; + ok: + /* + * c is legal: store it and look at the next. + */ + *p++ = (char)c; + if (--fp->_r > 0) + fp->_p++; + else if (__srefill(fp)) + break; /* EOF */ + } + /* + * If we had only a sign, it is no good; push + * back the sign. If the number ends in `x', + * it was [sign] '0' 'x', so push back the x + * and treat it as [sign] '0'. + */ + if (flags & NDIGITS) { + if (p > buf) + (void)ungetc(*(u_char *)--p, fp); + goto match_failure; + } + c = ((u_char *)p)[-1]; + if (c == 'x' || c == 'X') { + --p; + (void)ungetc(c, fp); + } + if ((flags & SUPPRESS) == 0) { + //uintmax_t res; + // Use a union to get around the truncation warnings. + union { + uintmax_t umax; + intmax_t imax; + void *vp; + ptrdiff_t pdt; + size_t sz; + long long ll; + long lo; + int in; + short hw; + char ch; + } res; + + *p = 0; + if ((flags & UNSIGNED) == 0) + res.imax = strtoimax(buf, (char **)NULL, base); + else + res.umax = strtoumax(buf, (char **)NULL, base); + if (flags & POINTER) + *va_arg(ap, void **) = res.vp; + //(void *)((uintptr_t)res); + else if (flags & SHORTSHORT) + *va_arg(ap, char *) = res.ch; + else if (flags & SHORT) + *va_arg(ap, short *) = res.hw; + else if (flags & LONG) + *va_arg(ap, long *) = res.lo; + else if (flags & LONGLONG) + *va_arg(ap, long long *) = res.ll; + else if (flags & INTMAXT) + *va_arg(ap, intmax_t *) = res.imax; + else if (flags & PTRDIFFT) + *va_arg(ap, ptrdiff_t *) = res.pdt; + //(ptrdiff_t)res; + else if (flags & SIZET) + *va_arg(ap, size_t *) = res.sz; + else + *va_arg(ap, int *) = res.in; + nassigned++; + } + nread += (int)(p - buf); + nconversions++; +//Print(L"%a: %d\n", __func__, __LINE__); + break; + +#ifndef NO_FLOATING_POINT + case CT_FLOAT: + /* scan a floating point number as if by strtod */ + if (width == 0 || width > sizeof(buf) - 1) + width = sizeof(buf) - 1; + if ((width = parsefloat(fp, buf, buf + width)) == 0) + goto match_failure; + if ((flags & SUPPRESS) == 0) { + if (flags & LONGDBL) { +/*dvm*/ long double **mp = (long double **)ap; + long double res = strtold(buf, &p); + +/*dvm*/ *(*mp) = res; +/*dvm*/ ap += sizeof(long double *); +/*dvm*/ //*va_arg(ap, long double *) = res; + } else if (flags & LONG) { + double res = strtod(buf, &p); + *va_arg(ap, double *) = res; + } else { + float res = strtof(buf, &p); + *va_arg(ap, float *) = res; + } + if (__scanfdebug && p - buf != (ptrdiff_t)width) + abort(); + nassigned++; + } + nread += (int)width; + nconversions++; + break; +#endif /* !NO_FLOATING_POINT */ + } + } +input_failure: +//Print(L"%a: %d\n", __func__, __LINE__); + return (nconversions != 0 ? nassigned : EOF); +match_failure: + return (nassigned); +} + +/* + * Fill in the given table from the scanset at the given format + * (just after `['). Return a pointer to the character past the + * closing `]'. The table has a 1 wherever characters should be + * considered part of the scanset. + */ +static const u_char * +__sccl(char *tab, const u_char *fmt) +{ + int c, n, v, i; + + _DIAGASSERT(tab != NULL); + _DIAGASSERT(fmt != NULL); + /* first `clear' the whole table */ + c = *fmt++; /* first char hat => negated scanset */ + if (c == '^') { + v = 1; /* default => accept */ + c = *fmt++; /* get new first char */ + } else + v = 0; /* default => reject */ + + /* XXX: Will not work if sizeof(tab*) > sizeof(char) */ + (void)memset(tab, v, 256); + + if (c == 0) + return (fmt - 1);/* format ended before closing ] */ + + /* + * Now set the entries corresponding to the actual scanset + * to the opposite of the above. + * + * The first character may be ']' (or '-') without being special; + * the last character may be '-'. + */ + v = 1 - v; + for (;;) { + tab[c] = (char)v; /* take character c */ +doswitch: + n = *fmt++; /* and examine the next */ + switch (n) { + + case 0: /* format ended too soon */ + return (fmt - 1); + + case '-': + /* + * A scanset of the form + * [01+-] + * is defined as `the digit 0, the digit 1, + * the character +, the character -', but + * the effect of a scanset such as + * [a-zA-Z0-9] + * is implementation defined. The V7 Unix + * scanf treats `a-z' as `the letters a through + * z', but treats `a-a' as `the letter a, the + * character -, and the letter a'. + * + * For compatibility, the `-' is not considerd + * to define a range if the character following + * it is either a close bracket (required by ANSI) + * or is not numerically greater than the character + * we just stored in the table (c). + */ + n = *fmt; + if (n == ']' || (__collate_load_error ? n < c : + __collate_range_cmp(n, c) < 0)) { + c = '-'; + break; /* resume the for(;;) */ + } + fmt++; + /* fill in the range */ + if (__collate_load_error) { + do + tab[++c] = (char)v; + while (c < n); + } else { + for (i = 0; i < 256; i ++) + if (__collate_range_cmp(c, i) < 0 && + __collate_range_cmp(i, n) <= 0) + tab[i] = (char)v; + } +#if 1 /* XXX another disgusting compatibility hack */ + c = n; + /* + * Alas, the V7 Unix scanf also treats formats + * such as [a-c-e] as `the letters a through e'. + * This too is permitted by the standard.... + */ + goto doswitch; +#else + c = *fmt++; + if (c == 0) + return (fmt - 1); + if (c == ']') + return (fmt); +#endif + + case ']': /* end of scanset */ + return (fmt); + + default: /* just another character */ + c = n; + break; + } + } + /* NOTREACHED */ +} + +#ifndef NO_FLOATING_POINT +static int +parsefloat(FILE *fp, char *buf, char *end) +{ + char *commit, *p; + int infnanpos = 0; + enum { + S_START, S_GOTSIGN, S_INF, S_NAN, S_MAYBEHEX, + S_DIGITS, S_FRAC, S_EXP, S_EXPDIGITS + } state = S_START; + unsigned char c; + char decpt = *localeconv()->decimal_point; + _Bool gotmantdig = 0, ishex = 0; + + /* + * We set commit = p whenever the string we have read so far + * constitutes a valid representation of a floating point + * number by itself. At some point, the parse will complete + * or fail, and we will ungetc() back to the last commit point. + * To ensure that the file offset gets updated properly, it is + * always necessary to read at least one character that doesn't + * match; thus, we can't short-circuit "infinity" or "nan(...)". + */ + commit = buf - 1; + for (p = buf; p < end; ) { + c = *fp->_p; +reswitch: + switch (state) { + case S_START: + state = S_GOTSIGN; + if (c == '-' || c == '+') + break; + else + goto reswitch; + case S_GOTSIGN: + switch (c) { + case '0': + state = S_MAYBEHEX; + commit = p; + break; + case 'I': + case 'i': + state = S_INF; + break; + case 'N': + case 'n': + state = S_NAN; + break; + default: + state = S_DIGITS; + goto reswitch; + } + break; + case S_INF: + if (infnanpos > 6 || + (c != "nfinity"[infnanpos] && + c != "NFINITY"[infnanpos])) + goto parsedone; + if (infnanpos == 1 || infnanpos == 6) + commit = p; /* inf or infinity */ + infnanpos++; + break; + case S_NAN: + switch (infnanpos) { + case -1: /* XXX kludge to deal with nan(...) */ + goto parsedone; + case 0: + if (c != 'A' && c != 'a') + goto parsedone; + break; + case 1: + if (c != 'N' && c != 'n') + goto parsedone; + else + commit = p; + break; + case 2: + if (c != '(') + goto parsedone; + break; + default: + if (c == ')') { + commit = p; + infnanpos = -2; + } else if (!isalnum(c) && c != '_') + goto parsedone; + break; + } + infnanpos++; + break; + case S_MAYBEHEX: + state = S_DIGITS; + if (c == 'X' || c == 'x') { + ishex = 1; + break; + } else { /* we saw a '0', but no 'x' */ + gotmantdig = 1; + goto reswitch; + } + case S_DIGITS: + if ((ishex && isxdigit(c)) || isdigit(c)) + gotmantdig = 1; + else { + state = S_FRAC; + if (c != decpt) + goto reswitch; + } + if (gotmantdig) + commit = p; + break; + case S_FRAC: + if (((c == 'E' || c == 'e') && !ishex) || + ((c == 'P' || c == 'p') && ishex)) { + if (!gotmantdig) + goto parsedone; + else + state = S_EXP; + } else if ((ishex && isxdigit(c)) || isdigit(c)) { + commit = p; + gotmantdig = 1; + } else + goto parsedone; + break; + case S_EXP: + state = S_EXPDIGITS; + if (c == '-' || c == '+') + break; + else + goto reswitch; + case S_EXPDIGITS: + if (isdigit(c)) + commit = p; + else + goto parsedone; + break; + default: + abort(); + } + *p++ = c; + if (--fp->_r > 0) + fp->_p++; + else if (__srefill(fp)) + break; /* EOF */ + } + +parsedone: + while (commit < --p) + (void)ungetc(*(u_char *)p, fp); + *++commit = '\0'; + return (int)(commit - buf); +} +#endif diff --git a/StdLib/LibC/Stdio/vfwprintf.c b/StdLib/LibC/Stdio/vfwprintf.c new file mode 100644 index 0000000000..bf31ddb664 --- /dev/null +++ b/StdLib/LibC/Stdio/vfwprintf.c @@ -0,0 +1,2035 @@ +/** @file + Implementation of internals for printf and wprintf. + + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: vfwprintf.c,v 1.9.2.1.4.1 2008/04/08 21:10:55 jdc Exp + vfprintf.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include "namespace.h" +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "reentrant.h" +#include "local.h" +#include "extern.h" +#include "fvwrite.h" + +#ifdef _MSC_VER + // Keep compiler quiet about conversions from larger to smaller types. + #pragma warning ( disable : 4244 ) +#endif + +#ifndef NARROW +#define MCHAR_T char +#define CHAR_T wchar_t +#define STRLEN(a) wcslen(a) +#define MEMCHR(a, b, c) wmemchr(a, b, c) +#define SCONV(a, b) __mbsconv(a, b) +#define STRCONST(a) L ## a +#define WDECL(a, b) a ## w ## b +#define END_OF_FILE WEOF +#define MULTI 0 +#else +#define MCHAR_T wchar_t +#define CHAR_T char +#define STRLEN(a) strlen(a) +#define MEMCHR(a, b, c) memchr(a, b, c) +#define SCONV(a, b) __wcsconv(a, b) +#define STRCONST(a) a +#define WDECL(a, b) a ## b +#define END_OF_FILE EOF +#define MULTI 1 +#endif + +union arg { + int intarg; + u_int uintarg; + long longarg; + unsigned long ulongarg; + long long longlongarg; + unsigned long long ulonglongarg; + ptrdiff_t ptrdiffarg; + size_t sizearg; + intmax_t intmaxarg; + uintmax_t uintmaxarg; + void *pvoidarg; + char *pchararg; + signed char *pschararg; + short *pshortarg; + int *pintarg; + long *plongarg; + long long *plonglongarg; + ptrdiff_t *pptrdiffarg; + size_t *psizearg; + intmax_t *pintmaxarg; +#ifndef NO_FLOATING_POINT + double doublearg; + long double longdoublearg; +#endif + wint_t wintarg; + wchar_t *pwchararg; +}; + +/* + * Type ids for argument type table. + */ +enum typeid { + T_UNUSED, TP_SHORT, T_INT, T_U_INT, TP_INT, + T_LONG, T_U_LONG, TP_LONG, T_LLONG, T_U_LLONG, + TP_LLONG, T_PTRDIFFT, TP_PTRDIFFT, T_SIZET, TP_SIZET, + T_INTMAXT, T_UINTMAXT, TP_INTMAXT, TP_VOID, TP_CHAR, + TP_SCHAR, T_DOUBLE, T_LONG_DOUBLE, T_WINT, TP_WCHAR +}; + +static int __sbprintf(FILE *, const CHAR_T *, va_list); +static CHAR_T *__ujtoa(uintmax_t, CHAR_T *, int, int, const char *, int, + char, const char *); +static CHAR_T *__ultoa(u_long, CHAR_T *, int, int, const char *, int, + char, const char *); +#ifndef NARROW +static CHAR_T *__mbsconv(char *, int); +static wint_t __xfputwc(CHAR_T, FILE *); +#else +static char *__wcsconv(wchar_t *, int); +static int __sprint(FILE *, struct __suio *); +#endif +static int __find_arguments(const CHAR_T *, va_list, union arg **); +static int __grow_type_table(int, enum typeid **, int *); + +/* + * Helper function for `fprintf to unbuffered unix file': creates a + * temporary buffer. We only work on write-only files; this avoids + * worries about ungetc buffers and so forth. + */ +static int +__sbprintf(FILE *fp, const CHAR_T *fmt, va_list ap) +{ + int ret; + FILE fake; + struct __sfileext fakeext; + unsigned char buf[BUFSIZ]; + + _DIAGASSERT(fp != NULL); + _DIAGASSERT(fmt != NULL); + + _FILEEXT_SETUP(&fake, &fakeext); + + /* copy the important variables */ + fake._flags = fp->_flags & ~__SNBF; + fake._file = fp->_file; + fake._cookie = fp->_cookie; + fake._write = fp->_write; + + /* set up the buffer */ + fake._bf._base = fake._p = buf; + fake._bf._size = fake._w = sizeof(buf); + fake._lbfsize = 0; /* not actually used, but Just In Case */ + + /* do the work, then copy any error status */ + ret = WDECL(__vf,printf_unlocked)(&fake, fmt, ap); + if (ret >= 0 && fflush(&fake)) + ret = END_OF_FILE; + if (fake._flags & __SERR) + fp->_flags |= __SERR; + return (ret); +} + +#ifndef NARROW +/* + * Like __fputwc, but handles fake string (__SSTR) files properly. + * File must already be locked. + */ +static wint_t +__xfputwc(wchar_t wc, FILE *fp) +{ + static const mbstate_t initial = { 0 }; + mbstate_t mbs; + char buf[MB_LEN_MAX]; + struct __suio uio; + struct __siov iov; + size_t len; + + if ((fp->_flags & __SSTR) == 0) + return (__fputwc_unlock(wc, fp)); + + mbs = initial; + if ((len = wcrtomb(buf, wc, &mbs)) == (size_t)-1) { + fp->_flags |= __SERR; + return (END_OF_FILE); + } + uio.uio_iov = &iov; + uio.uio_resid = (int)len; + uio.uio_iovcnt = 1; + iov.iov_base = buf; + iov.iov_len = len; + return (__sfvwrite(fp, &uio) != EOF ? (wint_t)wc : END_OF_FILE); +} +#else +/* + * Flush out all the vectors defined by the given uio, + * then reset it so that it can be reused. + */ +static int +__sprint(FILE *fp, struct __suio *uio) +{ + int err; + + _DIAGASSERT(fp != NULL); + _DIAGASSERT(uio != NULL); + + if (uio->uio_resid == 0) { + uio->uio_iovcnt = 0; + return (0); + } + err = __sfvwrite(fp, uio); + uio->uio_resid = 0; + uio->uio_iovcnt = 0; + return (err); +} +#endif + +/* + * Macros for converting digits to letters and vice versa + */ +#define to_digit(c) ((c) - '0') +#define is_digit(c) ((unsigned)to_digit(c) <= 9) +#define to_char(n) (CHAR_T)((n) + '0') + +/* + * Convert an unsigned long to ASCII for printf purposes, returning + * a pointer to the first character of the string representation. + * Octal numbers can be forced to have a leading zero; hex numbers + * use the given digits. + */ +static CHAR_T * +__ultoa(u_long val, CHAR_T *endp, int base, int octzero, const char *xdigs, + int needgrp, char thousep, const char *grp) +{ + CHAR_T *cp = endp; + LONGN sval; + int ndig; + + /* + * Handle the three cases separately, in the hope of getting + * better/faster code. + */ + switch (base) { + case 10: + if (val < 10) { /* many numbers are 1 digit */ + *--cp = to_char(val); + return (cp); + } + ndig = 0; + /* + * On many machines, unsigned arithmetic is harder than + * signed arithmetic, so we do at most one unsigned mod and + * divide; this is sufficient to reduce the range of + * the incoming value to where signed arithmetic works. + */ + if (val > LONG_MAX) { + *--cp = to_char(val % 10); + ndig++; + sval = (LONGN)(val / 10); + } else + sval = (LONGN)val; + do { + *--cp = to_char(sval % 10); + ndig++; + /* + * If (*grp == CHAR_MAX) then no more grouping + * should be performed. + */ + if (needgrp && ndig == *grp && *grp != CHAR_MAX + && sval > 9) { + *--cp = thousep; + ndig = 0; + /* + * If (*(grp+1) == '\0') then we have to + * use *grp character (last grouping rule) + * for all next cases + */ + if (*(grp+1) != '\0') + grp++; + } + sval /= 10; + } while (sval != 0); + break; + + case 8: + do { + *--cp = to_char(val & 7); + val >>= 3; + } while (val); + if (octzero && *cp != '0') + *--cp = '0'; + break; + + case 16: + do { + *--cp = xdigs[(size_t)val & 15]; + val >>= 4; + } while (val); + break; + + default: /* oops */ + abort(); + } + return (cp); +} + +/* Identical to __ultoa, but for intmax_t. */ +static CHAR_T * +__ujtoa(uintmax_t val, CHAR_T *endp, int base, int octzero, + const char *xdigs, int needgrp, char thousep, const char *grp) +{ + CHAR_T *cp = endp; + intmax_t sval; + int ndig; + + /* quick test for small values; __ultoa is typically much faster */ + /* (perhaps instead we should run until small, then call __ultoa?) */ + if (val <= ULONG_MAX) + return (__ultoa((u_long)val, endp, base, octzero, xdigs, + needgrp, thousep, grp)); + switch (base) { + case 10: + if (val < 10) { + *--cp = to_char(val % 10); + return (cp); + } + ndig = 0; + if (val > INTMAX_MAX) { + *--cp = to_char(val % 10); + ndig++; + sval = val / 10; + } else + sval = val; + do { + *--cp = to_char(sval % 10); + ndig++; + /* + * If (*grp == CHAR_MAX) then no more grouping + * should be performed. + */ + if (needgrp && *grp != CHAR_MAX && ndig == *grp + && sval > 9) { + *--cp = thousep; + ndig = 0; + /* + * If (*(grp+1) == '\0') then we have to + * use *grp character (last grouping rule) + * for all next cases + */ + if (*(grp+1) != '\0') + grp++; + } + sval /= 10; + } while (sval != 0); + break; + + case 8: + do { + *--cp = to_char(val & 7); + val >>= 3; + } while (val); + if (octzero && *cp != '0') + *--cp = '0'; + break; + + case 16: + do { + *--cp = xdigs[(size_t)val & 15]; + val >>= 4; + } while (val); + break; + + default: + abort(); + } + return (cp); +} + +#ifndef NARROW +/* + * Convert a multibyte character string argument for the %s format to a wide + * string representation. ``prec'' specifies the maximum number of bytes + * to output. If ``prec'' is greater than or equal to zero, we can't assume + * that the multibyte char. string ends in a null character. + */ +static wchar_t * +__mbsconv(char *mbsarg, int prec) +{ + static const mbstate_t initial = { 0 }; + mbstate_t mbs; + wchar_t *convbuf, *wcp; + const char *p; + size_t insize, nchars, nconv; + + if (mbsarg == NULL) + return (NULL); + + /* + * Supplied argument is a multibyte string; convert it to wide + * characters first. + */ + if (prec >= 0) { + /* + * String is not guaranteed to be NUL-terminated. Find the + * number of characters to print. + */ + p = mbsarg; + insize = nchars = nconv = 0; + mbs = initial; + while (nchars != (size_t)prec) { + nconv = mbrlen(p, MB_CUR_MAX, &mbs); + if (nconv == 0 || nconv == (size_t)-1 || + nconv == (size_t)-2) + break; + p += nconv; + nchars++; + insize += nconv; + } + if (nconv == (size_t)-1 || nconv == (size_t)-2) + return (NULL); + } else + insize = strlen(mbsarg); + + /* + * Allocate buffer for the result and perform the conversion, + * converting at most `size' bytes of the input multibyte string to + * wide characters for printing. + */ + convbuf = malloc((insize + 1) * sizeof(*convbuf)); + if (convbuf == NULL) + return (NULL); + wcp = convbuf; + p = mbsarg; + mbs = initial; + nconv = 0; + while (insize != 0) { + nconv = mbrtowc(wcp, p, insize, &mbs); + if (nconv == 0 || nconv == (size_t)-1 || nconv == (size_t)-2) + break; + wcp++; + p += nconv; + insize -= nconv; + } + if (nconv == (size_t)-1 || nconv == (size_t)-2) { + free(convbuf); + return (NULL); + } + *wcp = L'\0'; + + return (convbuf); +} +#else +/* + * Convert a wide character string argument for the %ls format to a multibyte + * string representation. If not -1, prec specifies the maximum number of + * bytes to output, and also means that we can't assume that the wide char. + * string ends is null-terminated. + */ +static char * +__wcsconv(wchar_t *wcsarg, int prec) +{ + static const mbstate_t initial = { 0 }; + mbstate_t mbs; + char buf[MB_LEN_MAX]; + wchar_t *p; + char *convbuf; + size_t clen, nbytes; + + /* Allocate space for the maximum number of bytes we could output. */ + if (prec < 0) { + p = wcsarg; + mbs = initial; + nbytes = wcsrtombs(NULL, (const wchar_t **)&p, 0, &mbs); + if (nbytes == (size_t)-1) + return (NULL); + } else { + /* + * Optimisation: if the output precision is small enough, + * just allocate enough memory for the maximum instead of + * scanning the string. + */ + if (prec < 128) + nbytes = prec; + else { + nbytes = 0; + p = wcsarg; + mbs = initial; + for (;;) { + clen = wcrtomb(buf, *p++, &mbs); + if (clen == 0 || clen == (size_t)-1 || + nbytes + clen > (size_t)prec) + break; + nbytes += clen; + } + } + } + if ((convbuf = malloc(nbytes + 1)) == NULL) + return (NULL); + + /* Fill the output buffer. */ + p = wcsarg; + mbs = initial; + if ((nbytes = wcsrtombs(convbuf, (const wchar_t **)&p, + nbytes, &mbs)) == (size_t)-1) { + free(convbuf); + return (NULL); + } + convbuf[nbytes] = '\0'; + return (convbuf); +} +#endif + +/* + * MT-safe version + */ +int +WDECL(vf,printf)(FILE * __restrict fp, const CHAR_T * __restrict fmt0, va_list ap) +{ + int ret; + + FLOCKFILE(fp); + ret = WDECL(__vf,printf_unlocked)(fp, fmt0, ap); + FUNLOCKFILE(fp); + return (ret); +} + +#ifndef NO_FLOATING_POINT + +#include +#include +#include "floatio.h" + +#define DEFPREC 6 + +static int exponent(CHAR_T *, int, int); +#ifndef WIDE_DOUBLE +static char *cvt(double, int, int, char *, int *, int, int *); +#endif + +#endif /* !NO_FLOATING_POINT */ + +/* + * The size of the buffer we use as scratch space for integer + * conversions, among other things. Technically, we would need the + * most space for base 10 conversions with thousands' grouping + * characters between each pair of digits. 100 bytes is a + * conservative overestimate even for a 128-bit uintmax_t. + */ +#define BUF 100 + +#define STATIC_ARG_TBL_SIZE 8 /* Size of static argument table. */ + +/* + * Flags used during conversion. + */ +#define ALT 0x001 /* alternate form */ +#define LADJUST 0x004 /* left adjustment */ +#define LONGDBL 0x008 /* long double */ +#define LONGINT 0x010 /* long integer */ +#define LLONGINT 0x020 /* long long integer */ +#define SHORTINT 0x040 /* short integer */ +#define ZEROPAD 0x080 /* zero (as opposed to blank) pad */ +#define FPT 0x100 /* Floating point number */ +#define GROUPING 0x200 /* use grouping ("'" flag) */ + /* C99 additional size modifiers: */ +#define SIZET 0x400 /* size_t */ +#define PTRDIFFT 0x800 /* ptrdiff_t */ +#define INTMAXT 0x1000 /* intmax_t */ +#define CHARINT 0x2000 /* print char using int format */ + +/* + * Non-MT-safe version + */ +int +WDECL(__vf,printf_unlocked)(FILE *fp, const CHAR_T *fmt0, va_list ap) +{ + CHAR_T *fmt; /* format string */ + int ch; /* character from fmt */ + int n, n2; /* handy integer (short term usage) */ + CHAR_T *cp; /* handy char pointer (short term usage) */ + int flags; /* flags as above */ + int ret; /* return value accumulator (number of items converted)*/ + int width; /* width from format (%8d), or 0 */ + int prec; /* precision from format; <0 for N/A */ + CHAR_T sign; /* sign prefix (' ', '+', '-', or \0) */ + char thousands_sep; /* locale specific thousands separator */ + const char *grouping; /* locale specific numeric grouping rules */ +#ifndef NO_FLOATING_POINT + /* + * We can decompose the printed representation of floating + * point numbers into several parts, some of which may be empty: + * + * [+|-| ] [0x|0X] MMM . NNN [e|E|p|P] [+|-] ZZ + * A B ---C--- D E F + * + * A: 'sign' holds this value if present; '\0' otherwise + * B: ox[1] holds the 'x' or 'X'; '\0' if not hexadecimal + * C: cp points to the string MMMNNN. Leading and trailing + * zeros are not in the string and must be added. + * D: expchar holds this character; '\0' if no exponent, e.g. %f + * F: at least two digits for decimal, at least one digit for hex + */ + char *decimal_point; /* locale specific decimal point */ +#ifdef WIDE_DOUBLE + int signflag; /* true if float is negative */ + union { /* floating point arguments %[aAeEfFgG] */ + double dbl; + long double ldbl; + } fparg; + char *dtoaend; /* pointer to end of converted digits */ +#else + double _double; /* double precision arguments %[eEfgG] */ + char softsign; /* temporary negative sign for floats */ +#endif + char *dtoaresult; /* buffer allocated by dtoa */ + int expt = 0; /* integer value of exponent */ + char expchar; /* exponent character: [eEpP\0] */ + int expsize; /* character count for expstr */ + int lead; /* sig figs before decimal or group sep */ + int ndig; /* actual number of digits returned by dtoa */ + CHAR_T expstr[MAXEXPDIG+2]; /* buffer for exponent string: e+ZZZ */ + int nseps; /* number of group separators with ' */ + int nrepeats; /* number of repeats of the last group */ +#endif + u_long ulval; /* integer arguments %[diouxX] */ + uintmax_t ujval; /* %j, %ll, %q, %t, %z integers */ + int base; /* base for [diouxX] conversion */ + int dprec; /* a copy of prec if [diouxX], 0 otherwise */ + int realsz; /* field size expanded by dprec, sign, etc */ + int size; /* size of converted field or string */ + int prsize; /* max size of printed field */ + const char *xdigs; /* digits for %[xX] conversion */ +#ifdef NARROW +#define NIOV 8 + struct __siov *iovp; /* for PRINT macro */ + struct __suio uio; /* output information: summary */ + struct __siov iov[NIOV];/* ... and individual io vectors */ +#else + int n3; +#endif + CHAR_T buf[BUF]; /* buffer with space for digits of uintmax_t */ + CHAR_T ox[2]; /* space for 0x hex-prefix */ + union arg *argtable; /* args, built due to positional arg */ + union arg statargtable [STATIC_ARG_TBL_SIZE]; + int nextarg; /* 1-based argument index */ + va_list orgap; /* original argument pointer */ + CHAR_T *convbuf; /* multibyte to wide conversion result */ + + /* + * Choose PADSIZE to trade efficiency vs. size. If larger printf + * fields occur frequently, increase PADSIZE and make the initialisers + * below longer. + */ +#define PADSIZE 16 /* pad chunk size */ + static CHAR_T blanks[PADSIZE] = + {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}; + static CHAR_T zeroes[PADSIZE] = + {'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'}; + + static const char xdigs_lower[17] = "0123456789abcdef"; + static const char xdigs_upper[17] = "0123456789ABCDEF"; + + /* + * BEWARE, these `goto error' on error, PRINT uses `n2' and + * PAD uses `n'. + */ +#ifndef NARROW +#define PRINT(ptr, len) do { \ + for (n3 = 0; n3 < (len); n3++) \ + __xfputwc((ptr)[n3], fp); \ +} while (/*CONSTCOND*/0) +#define FLUSH() +#else +#define PRINT(ptr, len) do { \ + iovp->iov_base = __UNCONST(ptr); \ + iovp->iov_len = (len); \ + uio.uio_resid += (len); \ + iovp++; \ + if (++uio.uio_iovcnt >= NIOV) { \ + if (__sprint(fp, &uio)) \ + goto error; \ + iovp = iov; \ + } \ +} while (/*CONSTCOND*/0) +#define FLUSH() do { \ + if (uio.uio_resid && __sprint(fp, &uio)) \ + goto error; \ + uio.uio_iovcnt = 0; \ + iovp = iov; \ +} while (/*CONSTCOND*/0) +#endif /* NARROW */ + +#define PAD(howmany, with) do { \ + if ((n = (howmany)) > 0) { \ + while (n > PADSIZE) { \ + PRINT(with, PADSIZE); \ + n -= PADSIZE; \ + } \ + PRINT(with, n); \ + } \ +} while (/*CONSTCOND*/0) +#define PRINTANDPAD(p, ep, len, with) do { \ + n2 = (ep) - (p); \ + if (n2 > (len)) \ + n2 = (len); \ + if (n2 > 0) \ + PRINT((p), n2); \ + PAD((len) - (n2 > 0 ? n2 : 0), (with)); \ +} while(/*CONSTCOND*/0) + + /* + * Get the argument indexed by nextarg. If the argument table is + * built, use it to get the argument. If its not, get the next + * argument (and arguments must be gotten sequentially). + */ +#define GETARG(type) \ + ((/*CONSTCOND*/argtable != NULL) ? *((type*)(void*)(&argtable[nextarg++])) : \ + (nextarg++, va_arg(ap, type))) + + /* + * To extend shorts properly, we need both signed and unsigned + * argument extraction methods. + */ +#define SARG() \ + ((long)(flags&LONGINT ? GETARG(long) : \ + flags&SHORTINT ? (short)GETARG(int) : \ + flags&CHARINT ? (signed char)GETARG(int) : \ + GETARG(int))) + +#define UARG() \ + ((u_long)(flags&LONGINT ? GETARG(u_long) : \ + flags&SHORTINT ? (u_long)(u_short)GETARG(int) : \ + flags&CHARINT ? (u_long)(u_char)GETARG(int) : \ + (u_long)GETARG(u_int))) + +#define INTMAX_SIZE (INTMAXT|SIZET|PTRDIFFT|LLONGINT) + +#define SJARG() \ + (flags&INTMAXT ? GETARG(intmax_t) : \ + flags&SIZET ? (intmax_t)GETARG(size_t) : \ + flags&PTRDIFFT ? (intmax_t)GETARG(ptrdiff_t) : \ + (intmax_t)GETARG(long long)) + +#define UJARG() \ + (flags&INTMAXT ? GETARG(uintmax_t) : \ + flags&SIZET ? (uintmax_t)GETARG(size_t) : \ + flags&PTRDIFFT ? (uintmax_t)GETARG(ptrdiff_t) : \ + (uintmax_t)GETARG(unsigned long long)) + + /* + * Get * arguments, including the form *nn$. Preserve the nextarg + * that the argument can be gotten once the type is determined. + */ +#define GETASTER(val) \ + n2 = 0; \ + cp = fmt; \ + while (is_digit(*cp)) { \ + n2 = 10 * n2 + to_digit(*cp); \ + cp++; \ + } \ + if (*cp == '$') { \ + int hold = nextarg; \ + if (argtable == NULL) { \ + argtable = statargtable; \ + if (__find_arguments(fmt0, orgap, &argtable) == -1) \ + goto oomem; \ + } \ + nextarg = n2; \ + val = GETARG (int); \ + nextarg = hold; \ + fmt = ++cp; \ + } else { \ + val = GETARG (int); \ + } + + _DIAGASSERT(fp != NULL); + _DIAGASSERT(fmt0 != NULL); + + _SET_ORIENTATION(fp, -1); + + ndig = -1; /* XXX gcc */ + + thousands_sep = '\0'; + grouping = NULL; +#ifndef NO_FLOATING_POINT + decimal_point = localeconv()->decimal_point; + expsize = 0; /* XXXGCC -Wuninitialized [sh3,m68000] */ +#endif + convbuf = NULL; + /* sorry, f{w,}printf(read_only_file, L"") returns {W,}EOF, not 0 */ + if (cantwrite(fp)) { + errno = EBADF; + return (END_OF_FILE); + } + + /* optimise fprintf(stderr) (and other unbuffered Unix files) */ + if ((fp->_flags & (__SNBF|__SWR|__SRW)) == (__SNBF|__SWR) && + fp->_file >= 0) + return (__sbprintf(fp, fmt0, ap)); + + fmt = (CHAR_T *)__UNCONST(fmt0); + argtable = NULL; + nextarg = 1; + va_copy(orgap, ap); +#ifdef NARROW + uio.uio_iov = iovp = iov; + uio.uio_resid = 0; + uio.uio_iovcnt = 0; +#endif + ret = 0; + + /* + * Scan the format for conversions (`%' character). + */ + for (;;) + { + const CHAR_T *result; + + for (cp = fmt; (ch = *fmt) != '\0' && ch != '%'; fmt++) + continue; + if ((n = (int)(fmt - cp)) != 0) { + if ((unsigned)ret + n > INT_MAX) { + ret = END_OF_FILE; + goto error; + } + PRINT(cp, n); + ret += n; + } + if (ch == '\0') + goto done; + fmt++; /* skip over '%' */ + + flags = 0; + dprec = 0; + width = 0; + prec = -1; + sign = '\0'; + ox[1] = '\0'; + expchar = '\0'; + lead = 0; + nseps = nrepeats = 0; + ulval = 0; + ujval = 0; + xdigs = NULL; + +rflag: ch = *fmt++; +reswitch: switch (ch) { + case ' ': + /*- + * ``If the space and + flags both appear, the space + * flag will be ignored.'' + * -- ANSI X3J11 + */ + if (!sign) + sign = ' '; + goto rflag; + case '#': + flags |= ALT; + goto rflag; + case '*': + /*- + * ``A negative field width argument is taken as a + * - flag followed by a positive field width.'' + * -- ANSI X3J11 + * They don't exclude field widths read from args. + */ + GETASTER (width); + if (width >= 0) + goto rflag; + width = -width; + /* FALLTHROUGH */ + case '-': + flags |= LADJUST; + goto rflag; + case '+': + sign = '+'; + goto rflag; + case '\'': + flags |= GROUPING; + thousands_sep = *(localeconv()->thousands_sep); + grouping = localeconv()->grouping; + goto rflag; + case '.': + if ((ch = *fmt++) == '*') { + GETASTER (prec); + goto rflag; + } + prec = 0; + while (is_digit(ch)) { + prec = 10 * prec + to_digit(ch); + ch = *fmt++; + } + goto reswitch; + case '0': + /*- + * ``Note that 0 is taken as a flag, not as the + * beginning of a field width.'' + * -- ANSI X3J11 + */ + flags |= ZEROPAD; + goto rflag; + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + n = 0; + do { + n = 10 * n + to_digit(ch); + ch = *fmt++; + } while (is_digit(ch)); + if (ch == '$') { + nextarg = n; + if (argtable == NULL) { + argtable = statargtable; + if (__find_arguments(fmt0, orgap, + &argtable) == -1) + goto oomem; + } + goto rflag; + } + width = n; + goto reswitch; +#ifndef NO_FLOATING_POINT + case 'L': + flags |= LONGDBL; + goto rflag; +#endif + case 'h': + if (flags & SHORTINT) { + flags &= ~SHORTINT; + flags |= CHARINT; + } else + flags |= SHORTINT; + goto rflag; + case 'j': + flags |= INTMAXT; + goto rflag; + case 'l': + if (flags & LONGINT) { + flags &= ~LONGINT; + flags |= LLONGINT; + } else + flags |= LONGINT; + goto rflag; + case 'q': + flags |= LLONGINT; /* not necessarily */ + goto rflag; + case 't': + flags |= PTRDIFFT; + goto rflag; + case 'z': + flags |= SIZET; + goto rflag; + case 'C': + flags |= LONGINT; + /*FALLTHROUGH*/ + case 'c': +#ifdef NARROW + if (flags & LONGINT) { + static const mbstate_t initial = { 0 }; + mbstate_t mbs; + size_t mbseqlen; + + mbs = initial; + mbseqlen = wcrtomb(buf, + (wchar_t)GETARG(wint_t), &mbs); + if (mbseqlen == (size_t)-1) { + fp->_flags |= __SERR; + goto error; + } + size = (int)mbseqlen; + } else { + *buf = (char)(GETARG(int)); + size = 1; + } +#else + if (flags & LONGINT) + *buf = (wchar_t)GETARG(wint_t); + else + *buf = (wchar_t)btowc(GETARG(int)); + size = 1; +#endif + result = buf; + sign = '\0'; + break; + case 'D': + flags |= LONGINT; + /*FALLTHROUGH*/ + case 'd': + case 'i': + if (flags & INTMAX_SIZE) { + ujval = SJARG(); + if ((intmax_t)ujval < 0) { + ujval = (uintmax_t)(-((intmax_t)ujval)); + sign = '-'; + } + } else { + ulval = SARG(); + if ((long)ulval < 0) { + ulval = (u_long)(-((long)ulval)); + sign = '-'; + } + } + base = 10; + goto number; +#ifndef NO_FLOATING_POINT +#ifdef WIDE_DOUBLE + case 'a': + case 'A': + if (ch == 'a') { + ox[1] = 'x'; + xdigs = xdigs_lower; + expchar = 'p'; + } else { + ox[1] = 'X'; + xdigs = xdigs_upper; + expchar = 'P'; + } + if (prec >= 0) + prec++; + if (flags & LONGDBL) { + fparg.ldbl = GETARG(long double); + dtoaresult = + __hldtoa(fparg.ldbl, xdigs, prec, + &expt, &signflag, &dtoaend); + } else { + fparg.dbl = GETARG(double); + dtoaresult = + __hdtoa(fparg.dbl, xdigs, prec, + &expt, &signflag, &dtoaend); + } + if (dtoaresult == NULL) + goto oomem; + + if (prec < 0) + prec = dtoaend - dtoaresult; + if (expt == INT_MAX) + ox[1] = '\0'; + ndig = dtoaend - dtoaresult; + if (convbuf != NULL) + free(convbuf); +#ifndef NARROW + result = convbuf = __mbsconv(dtoaresult, -1); +#else + /*XXX inefficient*/ + result = convbuf = strdup(dtoaresult); +#endif + if (result == NULL) + goto oomem; + __freedtoa(dtoaresult); + goto fp_common; + case 'e': + case 'E': + expchar = ch; + if (prec < 0) /* account for digit before decpt */ + prec = DEFPREC + 1; + else + prec++; + goto fp_begin; + case 'f': + case 'F': + expchar = '\0'; + goto fp_begin; + case 'g': + case 'G': + expchar = ch - ('g' - 'e'); + if (prec == 0) + prec = 1; +fp_begin: + if (prec < 0) + prec = DEFPREC; + if (flags & LONGDBL) { + fparg.ldbl = GETARG(long double); + dtoaresult = + __ldtoa(&fparg.ldbl, expchar ? 2 : 3, prec, + &expt, &signflag, &dtoaend); + } else { + fparg.dbl = GETARG(double); + dtoaresult = + __dtoa(fparg.dbl, expchar ? 2 : 3, prec, + &expt, &signflag, &dtoaend); + if (expt == 9999) + expt = INT_MAX; + } + if (dtoaresult == NULL) + goto oomem; + ndig = dtoaend - dtoaresult; + if (convbuf != NULL) + free(convbuf); +#ifndef NARROW + result = convbuf = __mbsconv(dtoaresult, -1); +#else + /*XXX inefficient*/ + result = convbuf = strdup(dtoaresult); +#endif + if (result == NULL) + goto oomem; + __freedtoa(dtoaresult); +fp_common: + if (signflag) + sign = '-'; + if (expt == INT_MAX) { /* inf or nan */ + if (*result == 'N') { + result = (ch >= 'a') ? STRCONST("nan") : + STRCONST("NAN"); + sign = '\0'; + } else + result = (ch >= 'a') ? STRCONST("inf") : + STRCONST("INF"); + size = 3; + break; + } +#else + //case 'e': + //case 'E': + //case 'f': + //case 'F': + //case 'g': + //case 'G': + // if (prec == -1) { + // prec = DEFPREC; + // } else if ((ch == 'g' || ch == 'G') && prec == 0) { + // prec = 1; + // } + case 'e': + case 'E': + expchar = ch; + if (prec < 0) /* account for digit before decpt */ + prec = DEFPREC /* + 1*/ ; + else + prec++; + goto fp_begin; + case 'f': + case 'F': + expchar = '\0'; + goto fp_begin; + case 'g': + case 'G': + expchar = ch - ('g' - 'e'); + if (prec == 0) + prec = 1; +fp_begin: + if (prec < 0) + prec = DEFPREC; + + if (flags & LONGDBL) { + _double = (double) GETARG(long double); + } else { + _double = GETARG(double); + } + + /* do this before tricky precision changes */ + if (isinf(_double)) { + if (_double < 0) + sign = '-'; + if (ch == 'E' || ch == 'F' || ch == 'G') + result = STRCONST("INF"); + else + result = STRCONST("inf"); + size = 3; + break; + } + if (isnan(_double)) { + if (ch == 'E' || ch == 'F' || ch == 'G') + result = STRCONST("NAN"); + else + result = STRCONST("nan"); + size = 3; + break; + } + + flags |= FPT; + dtoaresult = cvt(_double, prec, flags, &softsign, &expt, ch, &ndig); + if (dtoaresult == NULL) + goto oomem; + if (convbuf != NULL) + free(convbuf); +#ifndef NARROW + result = convbuf = __mbsconv(dtoaresult, -1); +#else + /*XXX inefficient*/ + result = convbuf = strdup(dtoaresult); +#endif + if (result == NULL) + goto oomem; + __freedtoa(dtoaresult); + if (softsign) + sign = '-'; +#endif + flags |= FPT; + if (ch == 'g' || ch == 'G') { + if (expt > -4 && expt <= prec) { + /* Make %[gG] smell like %[fF] */ + expchar = '\0'; + if (flags & ALT) + prec -= expt; + else + prec = ndig - expt; + if (prec < 0) + prec = 0; + } else { + /* + * Make %[gG] smell like %[eE], but + * trim trailing zeroes if no # flag. + */ + if (!(flags & ALT)) + prec = ndig; + } + } + if (expchar) { + expsize = exponent(expstr, expt - 1, expchar); + size = expsize + prec; + if (prec > 1 || flags & ALT) + ++size; + } else { + /* space for digits before decimal point */ + if (expt > 0) + size = expt; + else /* "0" */ + size = 1; + /* space for decimal pt and following digits */ + if (prec || flags & ALT) + size += prec + 1; + if (grouping && expt > 0) { + /* space for thousands' grouping */ + nseps = nrepeats = 0; + lead = expt; + while (*grouping != CHAR_MAX) { + if (lead <= *grouping) + break; + lead -= *grouping; + if (*(grouping+1)) { + nseps++; + grouping++; + } else + nrepeats++; + } + size += nseps + nrepeats; + } else + lead = expt; + } + break; +#endif /* !NO_FLOATING_POINT */ + case 'n': + /* + * Assignment-like behavior is specified if the + * value overflows or is otherwise unrepresentable. + * C99 says to use `signed char' for %hhn conversions. + */ + if (flags & LLONGINT) + *GETARG(long long *) = ret; + else if (flags & SIZET) + *GETARG(ssize_t *) = (ssize_t)ret; + else if (flags & PTRDIFFT) + *GETARG(ptrdiff_t *) = ret; + else if (flags & INTMAXT) + *GETARG(intmax_t *) = ret; + else if (flags & LONGINT) + *GETARG(long *) = ret; + else if (flags & SHORTINT) + *GETARG(short *) = ret; + else if (flags & CHARINT) + *GETARG(signed char *) = ret; + else + *GETARG(int *) = ret; + continue; /* no output */ + case 'O': + flags |= LONGINT; + /*FALLTHROUGH*/ + case 'o': + if (flags & INTMAX_SIZE) + ujval = UJARG(); + else + ulval = UARG(); + base = 8; + goto nosign; + case 'p': + /*- + * ``The argument shall be a pointer to void. The + * value of the pointer is converted to a sequence + * of printable characters, in an implementation- + * defined manner.'' + * -- ANSI X3J11 + */ + ujval = (uintmax_t)GETARG(void *); + base = 16; + xdigs = xdigs_lower; + flags = flags | INTMAXT; + ox[1] = 'x'; + goto nosign; + case 'S': + flags |= LONGINT; + /*FALLTHROUGH*/ + case 's': + if ((flags & LONGINT) != MULTI) { + if ((result = GETARG(CHAR_T *)) == NULL) + result = STRCONST("(null)"); + } else { + MCHAR_T *mc; + + if (convbuf != NULL) + free(convbuf); + if ((mc = GETARG(MCHAR_T *)) == NULL) + result = STRCONST("(null)"); + else { + convbuf = SCONV(mc, prec); + if (convbuf == NULL) { + fp->_flags |= __SERR; + goto error; + } + result = convbuf; + } + } + + if (prec >= 0) { + /* + * can't use STRLEN; can only look for the + * NUL in the first `prec' characters, and + * STRLEN() will go further. + */ + CHAR_T *p = MEMCHR(result, 0, (size_t)prec); + + if (p != NULL) { + size = p - result; + if (size > prec) + size = prec; + } else + size = prec; + } else + size = (int)STRLEN(result); + sign = '\0'; + break; + case 'U': + flags |= LONGINT; + /*FALLTHROUGH*/ + case 'u': + if (flags & INTMAX_SIZE) + ujval = UJARG(); + else + ulval = UARG(); + base = 10; + goto nosign; + case 'X': + xdigs = xdigs_upper; + goto hex; + case 'x': + xdigs = xdigs_lower; +hex: + if (flags & INTMAX_SIZE) + ujval = UJARG(); + else + ulval = UARG(); + base = 16; + /* leading 0x/X only if non-zero */ + if (flags & ALT && + (flags & INTMAX_SIZE ? ujval != 0 : ulval != 0)) + ox[1] = ch; + + flags &= ~GROUPING; + /* unsigned conversions */ +nosign: sign = '\0'; + /*- + * ``... diouXx conversions ... if a precision is + * specified, the 0 flag will be ignored.'' + * -- ANSI X3J11 + */ +number: if ((dprec = prec) >= 0) + flags &= ~ZEROPAD; + + /*- + * ``The result of converting a zero value with an + * explicit precision of zero is no characters.'' + * -- ANSI X3J11 + * + * ``The C Standard is clear enough as is. The call + * printf("%#.0o", 0) should print 0.'' + * -- Defect Report #151 + */ + result = cp = buf + BUF; + if (flags & INTMAX_SIZE) { + if (ujval != 0 || prec != 0 || + (flags & ALT && base == 8)) + { + result = __ujtoa(ujval, cp, base, + flags & ALT, xdigs, + flags & GROUPING, thousands_sep, + grouping); + } + } else { + if (ulval != 0 || prec != 0 || + (flags & ALT && base == 8)) + result = __ultoa(ulval, cp, base, + flags & ALT, xdigs, + flags & GROUPING, thousands_sep, + grouping); + } + size = buf + BUF - result; + if (size > BUF) /* should never happen */ + abort(); + break; + default: /* "%?" prints ?, unless ? is NUL */ + if (ch == '\0') + goto done; + /* pretend it was %c with argument ch */ + *buf = ch; + result = buf; + size = 1; + sign = '\0'; + break; + } + + /* + * All reasonable formats wind up here. At this point, `result' + * points to a string which (if not flags&LADJUST) should be + * padded out to `width' places. If flags&ZEROPAD, it should + * first be prefixed by any sign or other prefix; otherwise, + * it should be blank padded before the prefix is emitted. + * After any left-hand padding and prefixing, emit zeroes + * required by a decimal [diouxX] precision, then print the + * string proper, then emit zeroes required by any leftover + * floating precision; finally, if LADJUST, pad with blanks. + * + * Compute actual size, so we know how much to pad. + * size excludes decimal prec; realsz includes it. + */ + realsz = dprec > size ? dprec : size; + if (sign) + realsz++; + if (ox[1]) + realsz += 2; + + prsize = width > realsz ? width : realsz; + if ((unsigned)ret + prsize > INT_MAX) { + ret = END_OF_FILE; + goto error; + } + + /* right-adjusting blank padding */ + if ((flags & (LADJUST|ZEROPAD)) == 0) + PAD(width - realsz, blanks); + + /* prefix */ + if (sign) + PRINT(&sign, 1); + + if (ox[1]) { /* ox[1] is either x, X, or \0 */ + ox[0] = '0'; + PRINT(ox, 2); + } + + /* right-adjusting zero padding */ + if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) + PAD(width - realsz, zeroes); + + /* leading zeroes from decimal precision */ + PAD(dprec - size, zeroes); + + /* the string or number proper */ +#ifndef NO_FLOATING_POINT + if ((flags & FPT) == 0) { + PRINT(result, size); + } else { /* glue together f_p fragments */ + if (!expchar) { /* %[fF] or sufficiently short %[gG] */ + if (expt <= 0) { + PRINT(zeroes, 1); + if (prec || flags & ALT) + PRINT(decimal_point, 1); + PAD(-expt, zeroes); + /* already handled initial 0's */ + prec += expt; + } else { + PRINTANDPAD(result, convbuf + ndig, + lead, zeroes); + result += lead; + if (grouping) { + while (nseps>0 || nrepeats>0) { + if (nrepeats > 0) + nrepeats--; + else { + grouping--; + nseps--; + } + PRINT(&thousands_sep, + 1); + PRINTANDPAD(result, + convbuf + ndig, + *grouping, zeroes); + result += *grouping; + } + if (result > convbuf + ndig) + result = convbuf + ndig; + } + if (prec || flags & ALT) { + buf[0] = *decimal_point; + PRINT(buf, 1); + } + } + PRINTANDPAD(result, convbuf + ndig, prec, + zeroes); + } else { /* %[eE] or sufficiently long %[gG] */ + if (prec > 1 || flags & ALT) { + buf[0] = *result++; + buf[1] = *decimal_point; + PRINT(buf, 2); + PRINT(result, ndig-1); + PAD(prec - ndig, zeroes); + } else /* XeYYY */ + PRINT(result, 1); + PRINT(expstr, expsize); + } + } +#else + PRINT(result, size); +#endif + /* left-adjusting padding (always blank) */ + if (flags & LADJUST) + PAD(width - realsz, blanks); + + /* finally, adjust ret */ + ret += prsize; + FLUSH(); + } +done: + FLUSH(); +error: + va_end(orgap); + if (convbuf != NULL) + free(convbuf); + if (__sferror(fp)) + ret = END_OF_FILE; + if ((argtable != NULL) && (argtable != statargtable)) + free (argtable); + return (ret); + /* NOTREACHED */ +oomem: + errno = ENOMEM; + ret = END_OF_FILE; + goto error; +} + +/* + * Find all arguments when a positional parameter is encountered. Returns a + * table, indexed by argument number, of pointers to each arguments. The + * initial argument table should be an array of STATIC_ARG_TBL_SIZE entries. + * It will be replaces with a malloc-ed one if it overflows. + */ +static int +__find_arguments(const CHAR_T *fmt0, va_list ap, union arg **argtable) +{ + CHAR_T *fmt; /* format string */ + int ch; /* character from fmt */ + int n, n2; /* handy integer (short term usage) */ + CHAR_T *cp; /* handy char pointer (short term usage) */ + int flags; /* flags as above */ + enum typeid *typetable; /* table of types */ + enum typeid stattypetable [STATIC_ARG_TBL_SIZE]; + int tablesize; /* current size of type table */ + int tablemax; /* largest used index in table */ + int nextarg; /* 1-based argument index */ + + /* + * Add an argument type to the table, expanding if necessary. + */ +#define ADDTYPE(type) \ + do { \ + if (nextarg >= tablesize) \ + if (__grow_type_table(nextarg, &typetable, \ + &tablesize) == -1) \ + return -1; \ + if (nextarg > tablemax) \ + tablemax = nextarg; \ + typetable[nextarg++] = type; \ + } while (/*CONSTCOND*/0) + +#define ADDSARG() \ + do { \ + if (flags & INTMAXT) \ + ADDTYPE(T_INTMAXT); \ + else if (flags & SIZET) \ + ADDTYPE(T_SIZET); \ + else if (flags & PTRDIFFT) \ + ADDTYPE(T_PTRDIFFT); \ + else if (flags & LLONGINT) \ + ADDTYPE(T_LLONG); \ + else if (flags & LONGINT) \ + ADDTYPE(T_LONG); \ + else \ + ADDTYPE(T_INT); \ + } while (/*CONSTCOND*/0) + +#define ADDUARG() \ + do { \ + if (flags & INTMAXT) \ + ADDTYPE(T_UINTMAXT); \ + else if (flags & SIZET) \ + ADDTYPE(T_SIZET); \ + else if (flags & PTRDIFFT) \ + ADDTYPE(T_PTRDIFFT); \ + else if (flags & LLONGINT) \ + ADDTYPE(T_U_LLONG); \ + else if (flags & LONGINT) \ + ADDTYPE(T_U_LONG); \ + else \ + ADDTYPE(T_U_INT); \ + } while (/*CONSTCOND*/0) + /* + * Add * arguments to the type array. + */ +#define ADDASTER() \ + n2 = 0; \ + cp = fmt; \ + while (is_digit(*cp)) { \ + n2 = 10 * n2 + to_digit(*cp); \ + cp++; \ + } \ + if (*cp == '$') { \ + int hold = nextarg; \ + nextarg = n2; \ + ADDTYPE(T_INT); \ + nextarg = hold; \ + fmt = ++cp; \ + } else { \ + ADDTYPE(T_INT); \ + } + fmt = (CHAR_T *)__UNCONST(fmt0); + typetable = stattypetable; + tablesize = STATIC_ARG_TBL_SIZE; + tablemax = 0; + nextarg = 1; + for (n = 0; n < STATIC_ARG_TBL_SIZE; n++) + typetable[n] = T_UNUSED; + + /* + * Scan the format for conversions (`%' character). + */ + for (;;) { + for (cp = fmt; (ch = *fmt) != '\0' && ch != '%'; fmt++) + /* void */; + if (ch == '\0') + goto done; + fmt++; /* skip over '%' */ + + flags = 0; + +rflag: ch = *fmt++; +reswitch: switch (ch) { + case ' ': + case '#': + goto rflag; + case '*': + ADDASTER (); + goto rflag; + case '-': + case '+': + case '\'': + goto rflag; + case '.': + if ((ch = *fmt++) == '*') { + ADDASTER (); + goto rflag; + } + while (is_digit(ch)) { + ch = *fmt++; + } + goto reswitch; + case '0': + goto rflag; + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + n = 0; + do { + n = 10 * n + to_digit(ch); + ch = *fmt++; + } while (is_digit(ch)); + if (ch == '$') { + nextarg = n; + goto rflag; + } + goto reswitch; +#ifndef NO_FLOATING_POINT + case 'L': + flags |= LONGDBL; + goto rflag; +#endif + case 'h': + if (flags & SHORTINT) { + flags &= ~SHORTINT; + flags |= CHARINT; + } else + flags |= SHORTINT; + goto rflag; + case 'j': + flags |= INTMAXT; + goto rflag; + case 'l': + if (flags & LONGINT) { + flags &= ~LONGINT; + flags |= LLONGINT; + } else + flags |= LONGINT; + goto rflag; + case 'q': + flags |= LLONGINT; /* not necessarily */ + goto rflag; + case 't': + flags |= PTRDIFFT; + goto rflag; + case 'z': + flags |= SIZET; + goto rflag; + case 'C': + flags |= LONGINT; + /*FALLTHROUGH*/ + case 'c': + if (flags & LONGINT) + ADDTYPE(T_WINT); + else + ADDTYPE(T_INT); + break; + case 'D': + flags |= LONGINT; + /*FALLTHROUGH*/ + case 'd': + case 'i': + ADDSARG(); + break; +#ifndef NO_FLOATING_POINT + case 'a': + case 'A': + case 'e': + case 'E': + case 'f': + case 'g': + case 'G': + if (flags & LONGDBL) + ADDTYPE(T_LONG_DOUBLE); + else + ADDTYPE(T_DOUBLE); + break; +#endif /* !NO_FLOATING_POINT */ + case 'n': + if (flags & INTMAXT) + ADDTYPE(TP_INTMAXT); + else if (flags & PTRDIFFT) + ADDTYPE(TP_PTRDIFFT); + else if (flags & SIZET) + ADDTYPE(TP_SIZET); + else if (flags & LLONGINT) + ADDTYPE(TP_LLONG); + else if (flags & LONGINT) + ADDTYPE(TP_LONG); + else if (flags & SHORTINT) + ADDTYPE(TP_SHORT); + else if (flags & CHARINT) + ADDTYPE(TP_SCHAR); + else + ADDTYPE(TP_INT); + continue; /* no output */ + case 'O': + flags |= LONGINT; + /*FALLTHROUGH*/ + case 'o': + ADDUARG(); + break; + case 'p': + ADDTYPE(TP_VOID); + break; + case 'S': + flags |= LONGINT; + /*FALLTHROUGH*/ + case 's': + if (flags & LONGINT) + ADDTYPE(TP_WCHAR); + else + ADDTYPE(TP_CHAR); + break; + case 'U': + flags |= LONGINT; + /*FALLTHROUGH*/ + case 'u': + case 'X': + case 'x': + ADDUARG(); + break; + default: /* "%?" prints ?, unless ? is NUL */ + if (ch == '\0') + goto done; + break; + } + } +done: + /* + * Build the argument table. + */ + if (tablemax >= STATIC_ARG_TBL_SIZE) { + *argtable = (union arg *) + malloc (sizeof (union arg) * (tablemax + 1)); + if (*argtable == NULL) + return -1; + } + + (*argtable) [0].intarg = 0; + for (n = 1; n <= tablemax; n++) { + switch (typetable [n]) { + case T_UNUSED: /* whoops! */ + (*argtable) [n].intarg = va_arg (ap, int); + break; + case TP_SCHAR: + (*argtable) [n].pschararg = va_arg (ap, signed char *); + break; + case TP_SHORT: + (*argtable) [n].pshortarg = va_arg (ap, short *); + break; + case T_INT: + (*argtable) [n].intarg = va_arg (ap, int); + break; + case T_U_INT: + (*argtable) [n].uintarg = va_arg (ap, unsigned int); + break; + case TP_INT: + (*argtable) [n].pintarg = va_arg (ap, int *); + break; + case T_LONG: + (*argtable) [n].longarg = va_arg (ap, long); + break; + case T_U_LONG: + (*argtable) [n].ulongarg = va_arg (ap, unsigned long); + break; + case TP_LONG: + (*argtable) [n].plongarg = va_arg (ap, long *); + break; + case T_LLONG: + (*argtable) [n].longlongarg = va_arg (ap, long long); + break; + case T_U_LLONG: + (*argtable) [n].ulonglongarg = va_arg (ap, unsigned long long); + break; + case TP_LLONG: + (*argtable) [n].plonglongarg = va_arg (ap, long long *); + break; + case T_PTRDIFFT: + (*argtable) [n].ptrdiffarg = va_arg (ap, ptrdiff_t); + break; + case TP_PTRDIFFT: + (*argtable) [n].pptrdiffarg = va_arg (ap, ptrdiff_t *); + break; + case T_SIZET: + (*argtable) [n].sizearg = va_arg (ap, size_t); + break; + case TP_SIZET: + (*argtable) [n].psizearg = va_arg (ap, size_t *); + break; + case T_INTMAXT: + (*argtable) [n].intmaxarg = va_arg (ap, intmax_t); + break; + case T_UINTMAXT: + (*argtable) [n].uintmaxarg = va_arg (ap, uintmax_t); + break; + case TP_INTMAXT: + (*argtable) [n].pintmaxarg = va_arg (ap, intmax_t *); + break; + case T_DOUBLE: +#ifndef NO_FLOATING_POINT + (*argtable) [n].doublearg = va_arg (ap, double); +#endif + break; + case T_LONG_DOUBLE: +#ifndef NO_FLOATING_POINT + (*argtable) [n].longdoublearg = va_arg (ap, long double); +#endif + break; + case TP_CHAR: + (*argtable) [n].pchararg = va_arg (ap, char *); + break; + case TP_VOID: + (*argtable) [n].pvoidarg = va_arg (ap, void *); + break; + case T_WINT: + (*argtable) [n].wintarg = va_arg (ap, wint_t); + break; + case TP_WCHAR: + (*argtable) [n].pwchararg = va_arg (ap, wchar_t *); + break; + } + } + + if ((typetable != NULL) && (typetable != stattypetable)) + free (typetable); + return 0; +} + +/* + * Increase the size of the type table. + */ +static int +__grow_type_table (int nextarg, enum typeid **typetable, int *tablesize) +{ + enum typeid *const oldtable = *typetable; + const int oldsize = *tablesize; + enum typeid *newtable; + int n, newsize = oldsize * 2; + + if (newsize < nextarg + 1) + newsize = nextarg + 1; + if (oldsize == STATIC_ARG_TBL_SIZE) { + if ((newtable = malloc(newsize * sizeof(enum typeid))) == NULL) + return -1; + memcpy(newtable, oldtable, oldsize * sizeof(enum typeid)); + } else { + newtable = realloc(oldtable, newsize * sizeof(enum typeid)); + if (newtable == NULL) { + free(oldtable); + return -1; + } + } + for (n = oldsize; n < newsize; n++) + newtable[n] = T_UNUSED; + + *typetable = newtable; + *tablesize = newsize; + return 0; +} + + +#ifndef NO_FLOATING_POINT +#ifndef WIDE_DOUBLE +static char * +cvt(double value, int ndigits, int flags, char *sign, int *decpt, int ch, + int *length) +{ + int mode, dsgn; + char *digits, *bp, *rve; + + _DIAGASSERT(decpt != NULL); + _DIAGASSERT(length != NULL); + _DIAGASSERT(sign != NULL); + + if (ch == 'f') { + mode = 3; /* ndigits after the decimal point */ + } else { + /* To obtain ndigits after the decimal point for the 'e' + * and 'E' formats, round to ndigits + 1 significant + * figures. + */ + if (ch == 'e' || ch == 'E') { + ndigits++; + } + mode = 2; /* ndigits significant digits */ + } + + digits = __dtoa(value, mode, ndigits, decpt, &dsgn, &rve); + if (digits == NULL) + return NULL; + if (dsgn) { + value = -value; + *sign = '-'; + } else + *sign = '\000'; + if ((ch != 'g' && ch != 'G') || flags & ALT) { /* Print trailing zeros */ + bp = digits + ndigits; + if (ch == 'f') { + if (*digits == '0' && value) + *decpt = -ndigits + 1; + bp += *decpt; + } + if (value == 0) /* kludge for __dtoa irregularity */ + rve = bp; + while (rve < bp) + *rve++ = '0'; + } + *length = rve - digits; + return digits; +} +#endif + +static int +exponent(CHAR_T *p0, int expo, int fmtch) +{ + CHAR_T *p, *t; + CHAR_T expbuf[MAXEXPDIG]; + + p = p0; + *p++ = fmtch; + if (expo < 0) { + expo = -expo; + *p++ = '-'; + } + else + *p++ = '+'; + t = expbuf + MAXEXPDIG; + if (expo > 9) { + do { + *--t = to_char(expo % 10); + } while ((expo /= 10) > 9); + *--t = to_char(expo); + for (; t < expbuf + MAXEXPDIG; *p++ = *t++); + } + else { + /* + * Exponents for decimal floating point conversions + * (%[eEgG]) must be at least two characters long, + * whereas exponents for hexadecimal conversions can + * be only one character long. + */ + if (fmtch == 'e' || fmtch == 'E') + *p++ = '0'; + *p++ = to_char(expo); + } + return (p - p0); +} +#endif /* !NO_FLOATING_POINT */ diff --git a/StdLib/LibC/Stdio/vfwscanf.c b/StdLib/LibC/Stdio/vfwscanf.c new file mode 100644 index 0000000000..3d7404171b --- /dev/null +++ b/StdLib/LibC/Stdio/vfwscanf.c @@ -0,0 +1,909 @@ +/*- + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + + FreeBSD: src/lib/libc/stdio/vfwscanf.c,v 1.12 2004/05/02 20:13:29 obrien Exp + NetBSD: vfwscanf.c,v 1.2 2005/06/12 05:48:41 lukem Exp + */ +#include +#include + +#include "namespace.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "reentrant.h" +#include "local.h" + +#ifndef NO_FLOATING_POINT +#include +#endif + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ + #pragma warning ( disable : 4244 ) // Allow wint_t to wchar_t conversions + #pragma warning ( disable : 4305 ) // Allow truncation from UINT64 to void* + #pragma warning ( disable : 4701 ) // Disable false warning for local variable p near line 375 +#endif + + +#define BUF 513 /* Maximum length of numeric string. */ + +/* + * Flags used during conversion. + */ +#define LONG 0x01 /* l: long or double */ +#define LONGDBL 0x02 /* L: long double */ +#define SHORT 0x04 /* h: short */ +#define SUPPRESS 0x08 /* *: suppress assignment */ +#define POINTER 0x10 /* p: void * (as hex) */ +#define NOSKIP 0x20 /* [ or c: do not skip blanks */ +#define LONGLONG 0x400 /* ll: quad_t (+ deprecated q: quad) */ +#define INTMAXT 0x800 /* j: intmax_t */ +#define PTRDIFFT 0x1000 /* t: ptrdiff_t */ +#define SIZET 0x2000 /* z: size_t */ +#define SHORTSHORT 0x4000 /* hh: char */ +#define UNSIGNED 0x8000 /* %[oupxX] conversions */ + +/* + * The following are used in integral conversions only: + * SIGNOK, NDIGITS, PFXOK, and NZDIGITS + */ +#define SIGNOK 0x40 /* +/- is (still) legal */ +#define NDIGITS 0x80 /* no digits detected */ +#define PFXOK 0x100 /* 0x prefix is (still) legal */ +#define NZDIGITS 0x200 /* no zero digits detected */ +#define HAVESIGN 0x10000 /* sign detected */ + +/* + * Conversion types. + */ +#define CT_CHAR 0 /* %c conversion */ +#define CT_CCL 1 /* %[...] conversion */ +#define CT_STRING 2 /* %s conversion */ +#define CT_INT 3 /* %[dioupxX] conversion */ +#define CT_FLOAT 4 /* %[efgEFG] conversion */ + +static int parsefloat(FILE *, wchar_t *, wchar_t *); + +#define INCCL(_c) \ + (cclcompl ? (wmemchr(ccls, (_c), (size_t)(ccle - ccls)) == NULL) : \ + (wmemchr(ccls, (_c), (size_t)(ccle - ccls)) != NULL)) + +/* + * MT-safe version. + */ +int +vfwscanf(FILE * __restrict fp, const wchar_t * __restrict fmt, va_list ap) +{ + int ret; + + FLOCKFILE(fp); + _SET_ORIENTATION(fp, 1); + ret = __vfwscanf_unlocked(fp, fmt, ap); + FUNLOCKFILE(fp); + return (ret); +} + +/* + * Non-MT-safe version. + */ +int +__vfwscanf_unlocked(FILE * __restrict fp, const wchar_t * __restrict fmt, va_list ap) +{ + wint_t c; /* character from format, or conversion */ + size_t width; /* field width, or 0 */ + wchar_t *p; /* points into all kinds of strings */ + int n; /* handy integer */ + int flags; /* flags as defined above */ + wchar_t *p0; /* saves original value of p when necessary */ + int nassigned; /* number of fields assigned */ + int nconversions; /* number of conversions */ + int nread; /* number of characters consumed from fp */ + int base; /* base argument to conversion function */ + wchar_t buf[BUF]; /* buffer for numeric conversions */ + const wchar_t *ccls; /* character class start */ + const wchar_t *ccle; /* character class end */ + int cclcompl; /* ccl is complemented? */ + wint_t wi; /* handy wint_t */ + char *mbp; /* multibyte string pointer for %c %s %[ */ + size_t nconv; /* number of bytes in mb. conversion */ + char mbbuf[MB_LEN_MAX]; /* temporary mb. character buffer */ + static const mbstate_t initial = { 0 }; + mbstate_t mbs; + + /* `basefix' is used to avoid `if' tests in the integer scanner */ + static short basefix[17] = + { 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; + + nassigned = 0; + nconversions = 0; + nread = 0; + ccls = ccle = NULL; + base = 0; + cclcompl = 0; + mbp = NULL; + for (;;) { + c = *fmt++; + if (c == 0) + return (nassigned); + if (iswspace(c)) { + while ((c = __fgetwc_unlock(fp)) != WEOF && + iswspace(c)) + ; + if (c != WEOF) + ungetwc(c, fp); + continue; + } + if (c != '%') + goto literal; + width = 0; + flags = 0; + /* + * switch on the format. continue if done; + * break once format type is derived. + */ +again: c = *fmt++; + switch (c) { + case '%': +literal: + if ((wi = __fgetwc_unlock(fp)) == WEOF) + goto input_failure; + if (wi != c) { + ungetwc(wi, fp); + goto input_failure; + } + nread++; + continue; + + case '*': + flags |= SUPPRESS; + goto again; + case 'j': + flags |= INTMAXT; + goto again; + case 'l': + if (flags & LONG) { + flags &= ~LONG; + flags |= LONGLONG; + } else + flags |= LONG; + goto again; + case 'q': + flags |= LONGLONG; /* not quite */ + goto again; + case 't': + flags |= PTRDIFFT; + goto again; + case 'z': + flags |= SIZET; + goto again; + case 'L': + flags |= LONGDBL; + goto again; + case 'h': + if (flags & SHORT) { + flags &= ~SHORT; + flags |= SHORTSHORT; + } else + flags |= SHORT; + goto again; + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + width = width * 10 + c - '0'; + goto again; + + /* + * Conversions. + */ + case 'd': + c = CT_INT; + base = 10; + break; + + case 'i': + c = CT_INT; + base = 0; + break; + + case 'o': + c = CT_INT; + flags |= UNSIGNED; + base = 8; + break; + + case 'u': + c = CT_INT; + flags |= UNSIGNED; + base = 10; + break; + + case 'X': + case 'x': + flags |= PFXOK; /* enable 0x prefixing */ + c = CT_INT; + flags |= UNSIGNED; + base = 16; + break; + +#ifndef NO_FLOATING_POINT + //case 'A': + case 'E': case 'F': case 'G': + //case 'a': + case 'e': case 'f': case 'g': + c = CT_FLOAT; + break; +#endif + + case 'S': + flags |= LONG; + /* FALLTHROUGH */ + case 's': + c = CT_STRING; + break; + + case '[': + ccls = fmt; + if (*fmt == '^') { + cclcompl = 1; + fmt++; + } else + cclcompl = 0; + if (*fmt == ']') + fmt++; + while (*fmt != '\0' && *fmt != ']') + fmt++; + ccle = fmt; + fmt++; + flags |= NOSKIP; + c = CT_CCL; + break; + + case 'C': + flags |= LONG; + /* FALLTHROUGH */ + case 'c': + flags |= NOSKIP; + c = CT_CHAR; + break; + + case 'p': /* pointer format is like hex */ + flags |= POINTER | PFXOK; + c = CT_INT; /* assumes sizeof(uintmax_t) */ + flags |= UNSIGNED; /* >= sizeof(uintptr_t) */ + base = 16; + break; + + case 'n': + nconversions++; + if (flags & SUPPRESS) /* ??? */ + continue; + if (flags & SHORTSHORT) + *va_arg(ap, char *) = (char)nread; + else if (flags & SHORT) + *va_arg(ap, short *) = (short)nread; + else if (flags & LONG) + *va_arg(ap, long *) = (long)nread; + else if (flags & LONGLONG) + *va_arg(ap, INT64 *) = (INT64)nread; // was quad_t + else if (flags & INTMAXT) + *va_arg(ap, intmax_t *) = (intmax_t)nread; + else if (flags & SIZET) + *va_arg(ap, size_t *) = (size_t)nread; + else if (flags & PTRDIFFT) + *va_arg(ap, ptrdiff_t *) = (ptrdiff_t)nread; + else + *va_arg(ap, int *) = nread; + continue; + + default: + goto match_failure; + + /* + * Disgusting backwards compatibility hack. XXX + */ + case '\0': /* compat */ + return (EOF); + } + + /* + * Consume leading white space, except for formats + * that suppress this. + */ + if ((flags & NOSKIP) == 0) { + while ((wi = __fgetwc_unlock(fp)) != WEOF && iswspace(wi)) + nread++; + if (wi == WEOF) + goto input_failure; + ungetwc(wi, fp); + } + + /* + * Do the conversion. + */ + switch (c) { + + case CT_CHAR: + /* scan arbitrary characters (sets NOSKIP) */ + if (width == 0) + width = 1; + if (flags & LONG) { + if (!(flags & SUPPRESS)) + p = va_arg(ap, wchar_t *); + n = 0; + while (width-- != 0 && + (wi = __fgetwc_unlock(fp)) != WEOF) { + if (!(flags & SUPPRESS)) + *p++ = (wchar_t)wi; + n++; + } + if (n == 0) + goto input_failure; + nread += n; + if (!(flags & SUPPRESS)) + nassigned++; + } else { + if (!(flags & SUPPRESS)) + mbp = va_arg(ap, char *); + n = 0; + mbs = initial; + while (width != 0 && + (wi = __fgetwc_unlock(fp)) != WEOF) { + if (width >= MB_CUR_MAX && + !(flags & SUPPRESS)) { + nconv = wcrtomb(mbp, (wchar_t)wi, &mbs); + if (nconv == (size_t)-1) + goto input_failure; + } else { + nconv = wcrtomb(mbbuf, (wchar_t)wi, + &mbs); + if (nconv == (size_t)-1) + goto input_failure; + if (nconv > width) { + ungetwc(wi, fp); + break; + } + if (!(flags & SUPPRESS)) + memcpy(mbp, mbbuf, + nconv); + } + if (!(flags & SUPPRESS)) + mbp += nconv; + width -= nconv; + n++; + } + if (n == 0) + goto input_failure; + nread += n; + if (!(flags & SUPPRESS)) + nassigned++; + } + nconversions++; + break; + + case CT_CCL: + /* scan a (nonempty) character class (sets NOSKIP) */ + if (width == 0) + width = (size_t)~0; /* `infinity' */ + /* take only those things in the class */ + if ((flags & SUPPRESS) && (flags & LONG)) { + n = 0; + while ((wi = __fgetwc_unlock(fp)) != WEOF && + width-- != 0 && INCCL(wi)) + n++; + if (wi != WEOF) + ungetwc(wi, fp); + if (n == 0) + goto match_failure; + } else if (flags & LONG) { + p0 = p = va_arg(ap, wchar_t *); + while ((wi = __fgetwc_unlock(fp)) != WEOF && + width-- != 0 && INCCL(wi)) + *p++ = (wchar_t)wi; + if (wi != WEOF) + ungetwc(wi, fp); + n = p - p0; + if (n == 0) + goto match_failure; + *p = 0; + nassigned++; + } else { + if (!(flags & SUPPRESS)) + mbp = va_arg(ap, char *); + n = 0; + mbs = initial; + while ((wi = __fgetwc_unlock(fp)) != WEOF && + width != 0 && INCCL(wi)) { + if (width >= MB_CUR_MAX && + !(flags & SUPPRESS)) { + nconv = wcrtomb(mbp, wi, &mbs); + if (nconv == (size_t)-1) + goto input_failure; + } else { + nconv = wcrtomb(mbbuf, wi, + &mbs); + if (nconv == (size_t)-1) + goto input_failure; + if (nconv > width) + break; + if (!(flags & SUPPRESS)) + memcpy(mbp, mbbuf, + nconv); + } + if (!(flags & SUPPRESS)) + mbp += nconv; + width -= nconv; + n++; + } + if (wi != WEOF) + ungetwc(wi, fp); + if (!(flags & SUPPRESS)) { + *mbp = 0; + nassigned++; + } + } + nread += n; + nconversions++; + break; + + case CT_STRING: + /* like CCL, but zero-length string OK, & no NOSKIP */ + if (width == 0) + width = (size_t)~0; + if ((flags & SUPPRESS) && (flags & LONG)) { + while ((wi = __fgetwc_unlock(fp)) != WEOF && + width-- != 0 && + !iswspace(wi)) + nread++; + if (wi != WEOF) + ungetwc(wi, fp); + } else if (flags & LONG) { + p0 = p = va_arg(ap, wchar_t *); + while ((wi = __fgetwc_unlock(fp)) != WEOF && + width-- != 0 && + !iswspace(wi)) { + *p++ = (wchar_t)wi; + nread++; + } + if (wi != WEOF) + ungetwc(wi, fp); + *p = '\0'; + nassigned++; + } else { + if (!(flags & SUPPRESS)) + mbp = va_arg(ap, char *); + mbs = initial; + while ((wi = __fgetwc_unlock(fp)) != WEOF && + width != 0 && + !iswspace(wi)) { + if (width >= MB_CUR_MAX && + !(flags & SUPPRESS)) { + nconv = wcrtomb(mbp, wi, &mbs); + if (nconv == (size_t)-1) + goto input_failure; + } else { + nconv = wcrtomb(mbbuf, wi, + &mbs); + if (nconv == (size_t)-1) + goto input_failure; + if (nconv > width) + break; + if (!(flags & SUPPRESS)) + memcpy(mbp, mbbuf, + nconv); + } + if (!(flags & SUPPRESS)) + mbp += nconv; + width -= nconv; + nread++; + } + if (wi != WEOF) + ungetwc(wi, fp); + if (!(flags & SUPPRESS)) { + *mbp = 0; + nassigned++; + } + } + nconversions++; + continue; + + case CT_INT: + /* scan an integer as if by the conversion function */ + if (width == 0 || width > sizeof(buf) / + sizeof(*buf) - 1) + width = sizeof(buf) / sizeof(*buf) - 1; + flags |= SIGNOK | NDIGITS | NZDIGITS; + for (p = buf; width; width--) { + c = __fgetwc_unlock(fp); + /* + * Switch on the character; `goto ok' + * if we accept it as a part of number. + */ + switch (c) { + + /* + * The digit 0 is always legal, but is + * special. For %i conversions, if no + * digits (zero or nonzero) have been + * scanned (only signs), we will have + * base==0. In that case, we should set + * it to 8 and enable 0x prefixing. + * Also, if we have not scanned zero digits + * before this, do not turn off prefixing + * (someone else will turn it off if we + * have scanned any nonzero digits). + */ + case '0': + if (base == 0) { + base = 8; + flags |= PFXOK; + } + if (flags & NZDIGITS) + flags &= ~(SIGNOK|NZDIGITS|NDIGITS); + else + flags &= ~(SIGNOK|PFXOK|NDIGITS); + goto ok; + + /* 1 through 7 always legal */ + case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + base = basefix[base]; + flags &= ~(SIGNOK | PFXOK | NDIGITS); + goto ok; + + /* digits 8 and 9 ok iff decimal or hex */ + case '8': case '9': + base = basefix[base]; + if (base <= 8) + break; /* not legal here */ + flags &= ~(SIGNOK | PFXOK | NDIGITS); + goto ok; + + /* letters ok iff hex */ + case 'A': case 'B': case 'C': + case 'D': case 'E': case 'F': + case 'a': case 'b': case 'c': + case 'd': case 'e': case 'f': + /* no need to fix base here */ + if (base <= 10) + break; /* not legal here */ + flags &= ~(SIGNOK | PFXOK | NDIGITS); + goto ok; + + /* sign ok only as first character */ + case '+': case '-': + if (flags & SIGNOK) { + flags &= ~SIGNOK; + flags |= HAVESIGN; + goto ok; + } + break; + + /* + * x ok iff flag still set & 2nd char (or + * 3rd char if we have a sign). + */ + case 'x': case 'X': + if (flags & PFXOK && p == + buf + 1 + !!(flags & HAVESIGN)) { + base = 16; /* if %i */ + flags &= ~PFXOK; + goto ok; + } + break; + } + + /* + * If we got here, c is not a legal character + * for a number. Stop accumulating digits. + */ + if (c != WEOF) + ungetwc(c, fp); + break; + ok: + /* + * c is legal: store it and look at the next. + */ + *p++ = (wchar_t)c; + } + /* + * If we had only a sign, it is no good; push + * back the sign. If the number ends in `x', + * it was [sign] '0' 'x', so push back the x + * and treat it as [sign] '0'. + */ + if (flags & NDIGITS) { + if (p > buf) + ungetwc(*--p, fp); + goto match_failure; + } + c = p[-1]; + if (c == 'x' || c == 'X') { + --p; + ungetwc(c, fp); + } + if ((flags & SUPPRESS) == 0) { + uintmax_t res; + + *p = 0; + if ((flags & UNSIGNED) == 0) + res = wcstoimax(buf, NULL, base); + else + res = wcstoumax(buf, NULL, base); + + if (flags & POINTER) { + *va_arg(ap, void **) = (void *)res; + } + else if (flags & SHORTSHORT) { + *va_arg(ap, char *) = (char)res; + } + else if (flags & SHORT) { + *va_arg(ap, short *) = (short)res; + } + else if (flags & LONG) { + *va_arg(ap, long *) = (long)res; + } + else if (flags & LONGLONG) { + *va_arg(ap, INT64 *) = res; // was quad_t + } + else if (flags & INTMAXT) { + *va_arg(ap, intmax_t *) = res; + } + else if (flags & PTRDIFFT) { + *va_arg(ap, ptrdiff_t *) = (ptrdiff_t)res; + } + else if (flags & SIZET) { + *va_arg(ap, size_t *) = (size_t)res; + } + else { + *va_arg(ap, int *) = (int)res; + } + nassigned++; + } + nread += p - buf; + nconversions++; + break; + +#ifndef NO_FLOATING_POINT + case CT_FLOAT: + /* scan a floating point number as if by strtod */ + if (width == 0 || width > sizeof(buf) / + sizeof(*buf) - 1) + width = sizeof(buf) / sizeof(*buf) - 1; + if ((width = parsefloat(fp, buf, buf + width)) == 0) + goto match_failure; + if ((flags & SUPPRESS) == 0) { +#ifdef notyet + if (flags & LONGDBL) { + long double res = wcstold(buf, &p); + *va_arg(ap, long double *) = res; + } else +#endif + if (flags & LONG) { + double res = wcstod(buf, &p); + *va_arg(ap, double *) = res; +#ifdef notyet + } else { + float res = wcstof(buf, &p); + *va_arg(ap, float *) = res; +#endif + } +#ifdef DEBUG + if (p - buf != width) + abort(); +#endif + nassigned++; + } + nread += (int)width; + nconversions++; + break; +#endif /* !NO_FLOATING_POINT */ + } + } +input_failure: + return (nconversions != 0 ? nassigned : EOF); +match_failure: + return (nassigned); +} + +#ifndef NO_FLOATING_POINT +static int +parsefloat(FILE *fp, wchar_t *buf, wchar_t *end) +{ + wchar_t *commit, *p; + int infnanpos = 0; + enum { + S_START, S_GOTSIGN, S_INF, S_NAN, S_MAYBEHEX, + S_DIGITS, S_FRAC, S_EXP, S_EXPDIGITS + } state = S_START; + wchar_t c; + wchar_t decpt = (wchar_t)(unsigned char)*localeconv()->decimal_point; + int gotmantdig = 0, ishex = 0; + + /* + * We set commit = p whenever the string we have read so far + * constitutes a valid representation of a floating point + * number by itself. At some point, the parse will complete + * or fail, and we will ungetc() back to the last commit point. + * To ensure that the file offset gets updated properly, it is + * always necessary to read at least one character that doesn't + * match; thus, we can't short-circuit "infinity" or "nan(...)". + */ + commit = buf - 1; + c = (wchar_t)WEOF; + for (p = buf; p < end; ) { + if ((wint_t)(c = __fgetwc_unlock(fp)) == WEOF) + break; +reswitch: + switch (state) { + case S_START: + state = S_GOTSIGN; + if (c == '-' || c == '+') + break; + else + goto reswitch; + case S_GOTSIGN: + switch (c) { + case '0': + state = S_MAYBEHEX; + commit = p; + break; + case 'I': + case 'i': + state = S_INF; + break; + case 'N': + case 'n': + state = S_NAN; + break; + default: + state = S_DIGITS; + goto reswitch; + } + break; + case S_INF: + if (infnanpos > 6 || + (c != "nfinity"[infnanpos] && + c != "NFINITY"[infnanpos])) + goto parsedone; + if (infnanpos == 1 || infnanpos == 6) + commit = p; /* inf or infinity */ + infnanpos++; + break; + case S_NAN: + switch (infnanpos) { + case -1: /* XXX kludge to deal with nan(...) */ + goto parsedone; + case 0: + if (c != 'A' && c != 'a') + goto parsedone; + break; + case 1: + if (c != 'N' && c != 'n') + goto parsedone; + else + commit = p; + break; + case 2: + if (c != '(') + goto parsedone; + break; + default: + if (c == ')') { + commit = p; + infnanpos = -2; + } else if (!iswalnum(c) && c != '_') + goto parsedone; + break; + } + infnanpos++; + break; + case S_MAYBEHEX: + state = S_DIGITS; + if (c == 'X' || c == 'x') { + ishex = 1; + break; + } else { /* we saw a '0', but no 'x' */ + gotmantdig = 1; + goto reswitch; + } + case S_DIGITS: + if ((ishex && iswxdigit(c)) || iswdigit(c)) + gotmantdig = 1; + else { + state = S_FRAC; + if (c != decpt) + goto reswitch; + } + if (gotmantdig) + commit = p; + break; + case S_FRAC: + if (((c == 'E' || c == 'e') && !ishex) || + ((c == 'P' || c == 'p') && ishex)) { + if (!gotmantdig) + goto parsedone; + else + state = S_EXP; + } else if ((ishex && iswxdigit(c)) || iswdigit(c)) { + commit = p; + gotmantdig = 1; + } else + goto parsedone; + break; + case S_EXP: + state = S_EXPDIGITS; + if (c == '-' || c == '+') + break; + else + goto reswitch; + case S_EXPDIGITS: + if (iswdigit(c)) + commit = p; + else + goto parsedone; + break; + default: + abort(); + } + *p++ = c; + c = (wchar_t)WEOF; + } + +parsedone: + if ((wint_t)c != WEOF) + ungetwc(c, fp); + while (commit < --p) + ungetwc(*p, fp); + *++commit = '\0'; + return (commit - buf); +} +#endif diff --git a/StdLib/LibC/Stdio/vprintf.c b/StdLib/LibC/Stdio/vprintf.c new file mode 100644 index 0000000000..96d43ee7a0 --- /dev/null +++ b/StdLib/LibC/Stdio/vprintf.c @@ -0,0 +1,58 @@ +/** @file + Implementation of vprintf as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: vprintf.c,v 1.10 2003/08/07 16:43:34 agc Exp + vprintf.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include + +int +vprintf(char const *fmt, _BSD_VA_LIST_ ap) +{ + _DIAGASSERT(fmt != NULL); + + return (vfprintf(stdout, fmt, ap)); +} diff --git a/StdLib/LibC/Stdio/vscanf.c b/StdLib/LibC/Stdio/vscanf.c new file mode 100644 index 0000000000..518a8010da --- /dev/null +++ b/StdLib/LibC/Stdio/vscanf.c @@ -0,0 +1,60 @@ +/* $NetBSD: vscanf.c,v 1.12 2003/08/07 16:43:35 agc Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Donn Seeley at UUNET Technologies, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)vscanf.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: vscanf.c,v 1.12 2003/08/07 16:43:35 agc Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include + +#include "reentrant.h" +#include "local.h" + +int +vscanf(fmt, ap) + const char *fmt; + _BSD_VA_LIST_ ap; +{ + + _DIAGASSERT(fmt != NULL); + + return (__svfscanf(stdin, fmt, ap)); +} diff --git a/StdLib/LibC/Stdio/vsnprintf.c b/StdLib/LibC/Stdio/vsnprintf.c new file mode 100644 index 0000000000..b2a2f63a91 --- /dev/null +++ b/StdLib/LibC/Stdio/vsnprintf.c @@ -0,0 +1,89 @@ +/* $NetBSD: vsnprintf.c,v 1.20 2005/02/09 21:35:47 kleink Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)vsnprintf.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: vsnprintf.c,v 1.20 2005/02/09 21:35:47 kleink Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" + +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +#ifdef __weak_alias +__weak_alias(vsnprintf,_vsnprintf) +#endif + +int +vsnprintf(str, n, fmt, ap) + char *str; + size_t n; + const char *fmt; + _BSD_VA_LIST_ ap; +{ + int ret; + FILE f; + struct __sfileext fext; + unsigned char dummy[1]; + + _DIAGASSERT(n == 0 || str != NULL); + _DIAGASSERT(fmt != NULL); + + if ((int)n < 0) { + errno = EINVAL; + return (-1); + } + + _FILEEXT_SETUP(&f, &fext); + f._file = -1; + f._flags = __SWR | __SSTR; + if (n == 0) { + f._bf._base = f._p = dummy; + f._bf._size = f._w = 0; + } else { + f._bf._base = f._p = (unsigned char *)str; + f._bf._size = f._w = n - 1; + } + ret = __vfprintf_unlocked(&f, fmt, ap); + *f._p = 0; + return (ret); +} diff --git a/StdLib/LibC/Stdio/vsnprintf_ss.c b/StdLib/LibC/Stdio/vsnprintf_ss.c new file mode 100644 index 0000000000..77a2887ea6 --- /dev/null +++ b/StdLib/LibC/Stdio/vsnprintf_ss.c @@ -0,0 +1,494 @@ +/* $NetBSD: vsnprintf_ss.c,v 1.2.2.1 2007/05/07 19:49:09 pavel Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)vsnprintf.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: vsnprintf_ss.c,v 1.2.2.1 2007/05/07 19:49:09 pavel Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" + +#include +#include +#include +#include +#include +#include +#include +#include "reentrant.h" +#include "extern.h" +#include "local.h" + +#ifdef __weak_alias +__weak_alias(vsnprintf_ss,_vsnprintf_ss) +#endif + +/* + * vsnprintf_ss: scaled down version of printf(3). + * + * this version based on vfprintf() from libc which was derived from + * software contributed to Berkeley by Chris Torek. + * + */ + +/* + * macros for converting digits to letters and vice versa + */ +#define to_digit(c) ((c) - '0') +#define is_digit(c) ((unsigned)to_digit(c) <= 9) +#define to_char(n) (char)((n) + '0') + +/* + * flags used during conversion. + */ +#define ALT 0x001 /* alternate form */ +#define HEXPREFIX 0x002 /* add 0x or 0X prefix */ +#define LADJUST 0x004 /* left adjustment */ +#define LONGDBL 0x008 /* long double; unimplemented */ +#define LONGINT 0x010 /* long integer */ +#define QUADINT 0x020 /* quad integer */ +#define SHORTINT 0x040 /* short integer */ +#define MAXINT 0x080 /* intmax_t */ +#define PTRINT 0x100 /* intptr_t */ +#define SIZEINT 0x200 /* size_t */ +#define ZEROPAD 0x400 /* zero (as opposed to blank) pad */ +#define FPT 0x800 /* Floating point number */ + + /* + * To extend shorts properly, we need both signed and unsigned + * argument extraction methods. + */ +#define SARG() \ + ((INT64)(flags&MAXINT ? va_arg(ap, intmax_t) : \ + flags&PTRINT ? va_arg(ap, intptr_t) : \ + flags&SIZEINT ? va_arg(ap, ssize_t) : /* XXX */ \ + flags&QUADINT ? va_arg(ap, quad_t) : \ + flags&LONGINT ? va_arg(ap, long) : \ + flags&SHORTINT ? (short)va_arg(ap, int) : \ + va_arg(ap, int))) + +#define UARG() \ + ((UINT64)(flags&MAXINT ? va_arg(ap, uintmax_t) : \ + flags&PTRINT ? va_arg(ap, uintptr_t) : \ + flags&SIZEINT ? va_arg(ap, size_t) : \ + flags&QUADINT ? va_arg(ap, u_quad_t) : \ + flags&LONGINT ? va_arg(ap, unsigned long) : \ + flags&SHORTINT ? (u_short)va_arg(ap, int) : \ + va_arg(ap, u_int))) + +#define PUTCHAR(C) do { \ + if (sbuf < tailp) \ + *sbuf++ = (C); \ +} while (/*CONSTCOND*/0) + +int +vsnprintf_ss(char *sbuf, size_t slen, const char *fmt0, _BSD_VA_LIST_ ap) +{ + const char *fmt; /* format string */ + int ch; /* character from fmt */ + int n; /* handy integer (short term usage) */ + char *cp; /* handy char pointer (short term usage) */ + int flags; /* flags as above */ + int ret; /* return value accumulator */ + int width; /* width from format (%8d), or 0 */ + int prec; /* precision from format (%.3d), or -1 */ + char sign; /* sign prefix (' ', '+', '-', or \0) */ + + u_quad_t _uquad; /* integer arguments %[diouxX] */ + enum { OCT, DEC, HEX } base;/* base for [diouxX] conversion */ + int dprec; /* a copy of prec if [diouxX], 0 otherwise */ + int realsz; /* field size expanded by dprec */ + int size; /* size of converted field or string */ + const char *xdigs; /* digits for [xX] conversion */ + char bf[128]; /* space for %c, %[diouxX] */ + char *tailp; /* tail pointer for snprintf */ + + static const char xdigs_lower[16] = "0123456789abcdef"; + static const char xdigs_upper[16] = "0123456789ABCDEF"; + + + _DIAGASSERT(n == 0 || sbuf != NULL); + _DIAGASSERT(fmt != NULL); + + tailp = sbuf + slen; + + cp = NULL; /* XXX: shutup gcc */ + size = 0; /* XXX: shutup gcc */ + + fmt = fmt0; + ret = 0; + + xdigs = NULL; /* XXX: shut up gcc warning */ + + /* + * Scan the format for conversions (`%' character). + */ + for (;;) { + while (*fmt != '%' && *fmt) { + ret++; + PUTCHAR(*fmt++); + } + if (*fmt == 0) + goto done; + + fmt++; /* skip over '%' */ + + flags = 0; + dprec = 0; + width = 0; + prec = -1; + sign = '\0'; + +rflag: ch = *fmt++; +reswitch: switch (ch) { + case ' ': + /* + * ``If the space and + flags both appear, the space + * flag will be ignored.'' + * -- ANSI X3J11 + */ + if (!sign) + sign = ' '; + goto rflag; + case '#': + flags |= ALT; + goto rflag; + case '*': + /* + * ``A negative field width argument is taken as a + * - flag followed by a positive field width.'' + * -- ANSI X3J11 + * They don't exclude field widths read from args. + */ + if ((width = va_arg(ap, int)) >= 0) + goto rflag; + width = -width; + /* FALLTHROUGH */ + case '-': + flags |= LADJUST; + goto rflag; + case '+': + sign = '+'; + goto rflag; + case '.': + if ((ch = *fmt++) == '*') { + n = va_arg(ap, int); + prec = n < 0 ? -1 : n; + goto rflag; + } + n = 0; + while (is_digit(ch)) { + n = 10 * n + to_digit(ch); + ch = *fmt++; + } + prec = n < 0 ? -1 : n; + goto reswitch; + case '0': + /* + * ``Note that 0 is taken as a flag, not as the + * beginning of a field width.'' + * -- ANSI X3J11 + */ + flags |= ZEROPAD; + goto rflag; + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + n = 0; + do { + n = 10 * n + to_digit(ch); + ch = *fmt++; + } while (is_digit(ch)); + width = n; + goto reswitch; + case 'h': + flags |= SHORTINT; + goto rflag; + case 'j': + flags |= MAXINT; + goto rflag; + case 'l': + if (*fmt == 'l') { + fmt++; + flags |= QUADINT; + } else { + flags |= LONGINT; + } + goto rflag; + case 'q': + flags |= QUADINT; + goto rflag; + case 't': + flags |= PTRINT; + goto rflag; + case 'z': + flags |= SIZEINT; + goto rflag; + case 'c': + *(cp = bf) = va_arg(ap, int); + size = 1; + sign = '\0'; + break; + case 'D': + flags |= LONGINT; + /*FALLTHROUGH*/ + case 'd': + case 'i': + _uquad = SARG(); + if ((quad_t)_uquad < 0) { + _uquad = -_uquad; + sign = '-'; + } + base = DEC; + goto number; + case 'n': + if (flags & MAXINT) + *va_arg(ap, intmax_t *) = ret; + else if (flags & PTRINT) + *va_arg(ap, intptr_t *) = ret; + else if (flags & SIZEINT) + *va_arg(ap, ssize_t *) = ret; + else if (flags & QUADINT) + *va_arg(ap, quad_t *) = ret; + else if (flags & LONGINT) + *va_arg(ap, long *) = (long)ret; + else if (flags & SHORTINT) + *va_arg(ap, short *) = (short)ret; + else + *va_arg(ap, int *) = ret; + continue; /* no output */ + case 'O': + flags |= LONGINT; + /*FALLTHROUGH*/ + case 'o': + _uquad = UARG(); + base = OCT; + goto nosign; + case 'p': + /* + * ``The argument shall be a pointer to void. The + * value of the pointer is converted to a sequence + * of printable characters, in an implementation- + * defined manner.'' + * -- ANSI X3J11 + */ + /* NOSTRICT */ + _uquad = (u_long)va_arg(ap, void *); + base = HEX; + xdigs = xdigs_lower; + flags |= HEXPREFIX; + ch = 'x'; + goto nosign; + case 's': + if ((cp = va_arg(ap, char *)) == NULL) + /*XXXUNCONST*/ + cp = __UNCONST("(null)"); + if (prec >= 0) { + /* + * can't use strlen; can only look for the + * NUL in the first `prec' characters, and + * strlen() will go further. + */ + char *p = memchr(cp, 0, (size_t)prec); + + if (p != NULL) { + size = p - cp; + if (size > prec) + size = prec; + } else + size = prec; + } else + size = strlen(cp); + sign = '\0'; + break; + case 'U': + flags |= LONGINT; + /*FALLTHROUGH*/ + case 'u': + _uquad = UARG(); + base = DEC; + goto nosign; + case 'X': + xdigs = xdigs_upper; + goto hex; + case 'x': + xdigs = xdigs_lower; +hex: _uquad = UARG(); + base = HEX; + /* leading 0x/X only if non-zero */ + if (flags & ALT && _uquad != 0) + flags |= HEXPREFIX; + + /* unsigned conversions */ +nosign: sign = '\0'; + /* + * ``... diouXx conversions ... if a precision is + * specified, the 0 flag will be ignored.'' + * -- ANSI X3J11 + */ +number: if ((dprec = prec) >= 0) + flags &= ~ZEROPAD; + + /* + * ``The result of converting a zero value with an + * explicit precision of zero is no characters.'' + * -- ANSI X3J11 + */ + cp = bf + sizeof(bf); + if (_uquad != 0 || prec != 0) { + /* + * Unsigned mod is hard, and unsigned mod + * by a constant is easier than that by + * a variable; hence this switch. + */ + switch (base) { + case OCT: + do { + *--cp = to_char(_uquad & 7); + _uquad >>= 3; + } while (_uquad); + /* handle octal leading 0 */ + if (flags & ALT && *cp != '0') + *--cp = '0'; + break; + + case DEC: + /* many numbers are 1 digit */ + while (_uquad >= 10) { + *--cp = to_char(_uquad % 10); + _uquad /= 10; + } + *--cp = to_char(_uquad); + break; + + case HEX: + do { + *--cp = xdigs[(size_t)_uquad & 15]; + _uquad >>= 4; + } while (_uquad); + break; + + default: + /*XXXUNCONST*/ + cp = __UNCONST("bug bad base"); + size = strlen(cp); + goto skipsize; + } + } + size = bf + sizeof(bf) - cp; + skipsize: + break; + default: /* "%?" prints ?, unless ? is NUL */ + if (ch == '\0') + goto done; + /* pretend it was %c with argument ch */ + cp = bf; + *cp = ch; + size = 1; + sign = '\0'; + break; + } + + /* + * All reasonable formats wind up here. At this point, `cp' + * points to a string which (if not flags&LADJUST) should be + * padded out to `width' places. If flags&ZEROPAD, it should + * first be prefixed by any sign or other prefix; otherwise, + * it should be blank padded before the prefix is emitted. + * After any left-hand padding and prefixing, emit zeroes + * required by a decimal [diouxX] precision, then print the + * string proper, then emit zeroes required by any leftover + * floating precision; finally, if LADJUST, pad with blanks. + * + * Compute actual size, so we know how much to pad. + * size excludes decimal prec; realsz includes it. + */ + realsz = dprec > size ? dprec : size; + if (sign) + realsz++; + else if (flags & HEXPREFIX) + realsz+= 2; + + /* adjust ret */ + ret += width > realsz ? width : realsz; + + /* right-adjusting blank padding */ + if ((flags & (LADJUST|ZEROPAD)) == 0) { + n = width - realsz; + while (n-- > 0) + PUTCHAR(' '); + } + + /* prefix */ + if (sign) { + PUTCHAR(sign); + } else if (flags & HEXPREFIX) { + PUTCHAR('0'); + PUTCHAR(ch); + } + + /* right-adjusting zero padding */ + if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) { + n = width - realsz; + while (n-- > 0) + PUTCHAR('0'); + } + + /* leading zeroes from decimal precision */ + n = dprec - size; + while (n-- > 0) + PUTCHAR('0'); + + /* the string or number proper */ + while (size--) + PUTCHAR(*cp++); + /* left-adjusting padding (always blank) */ + if (flags & LADJUST) { + n = width - realsz; + while (n-- > 0) + PUTCHAR(' '); + } + } + +done: + if (sbuf == tailp) + sbuf[-1] = '\0'; + else + *sbuf = '\0'; + return (ret); + /* NOTREACHED */ +} diff --git a/StdLib/LibC/Stdio/vsprintf.c b/StdLib/LibC/Stdio/vsprintf.c new file mode 100644 index 0000000000..4fb8d28155 --- /dev/null +++ b/StdLib/LibC/Stdio/vsprintf.c @@ -0,0 +1,74 @@ +/** @file + Implementation of vsprintf as declared in . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990, 1993 + The Regents of the University of California. All rights reserved. + + This code is derived from software contributed to Berkeley by + Chris Torek. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: vsprintf.c,v 1.14 2005/02/09 21:35:47 kleink Exp + vsprintf.c 8.1 (Berkeley) 6/4/93 +**/ +#include + +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +int +vsprintf(char *str, const char *fmt, _BSD_VA_LIST_ ap) +{ + int ret; + FILE f; + struct __sfileext fext; + + _DIAGASSERT(str != NULL); + _DIAGASSERT(fmt != NULL); + + _FILEEXT_SETUP(&f, &fext); + f._file = -1; + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *)str; + f._bf._size = f._w = INT_MAX; + ret = __vfprintf_unlocked(&f, fmt, ap); + *f._p = 0; + + return (ret); +} diff --git a/StdLib/LibC/Stdio/vsscanf.c b/StdLib/LibC/Stdio/vsscanf.c new file mode 100644 index 0000000000..34b08cc30d --- /dev/null +++ b/StdLib/LibC/Stdio/vsscanf.c @@ -0,0 +1,83 @@ +/* $NetBSD: vsscanf.c,v 1.14 2005/11/29 03:12:00 christos Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Donn Seeley at UUNET Technologies, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)vsscanf.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: vsscanf.c,v 1.14 2005/11/29 03:12:00 christos Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +static int eofread __P((void *, char *, int)); + +/* ARGSUSED */ +static int +eofread(cookie, buf, len) + void *cookie; + char *buf; + int len; +{ + return (0); +} + +int +vsscanf(str, fmt, ap) + const char *str; + const char *fmt; + _BSD_VA_LIST_ ap; +{ + FILE f; + struct __sfileext fext; + + _DIAGASSERT(str != NULL); + _DIAGASSERT(fmt != NULL); + + _FILEEXT_SETUP(&f, &fext); + f._flags = __SRD; + f._bf._base = f._p = __UNCONST(str); + f._bf._size = f._r = strlen(str); + f._read = eofread; + _UB(&f)._base = NULL; + f._lb._base = NULL; + return (__svfscanf_unlocked(&f, fmt, ap)); +} diff --git a/StdLib/LibC/Stdio/vswprintf.c b/StdLib/LibC/Stdio/vswprintf.c new file mode 100644 index 0000000000..6d4cc3e656 --- /dev/null +++ b/StdLib/LibC/Stdio/vswprintf.c @@ -0,0 +1,94 @@ +/* + * Copyright (c) 1997 Todd C. Miller + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + FreeBSD: src/lib/libc/stdio/vswprintf.c,v 1.6 2005/02/21 19:41:44 fjoe Exp + NetBSD: vswprintf.c,v 1.1 2005/05/14 23:51:02 christos Exp + */ +#include +#include + +#include +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +int +vswprintf(wchar_t * __restrict s, size_t n, const wchar_t * __restrict fmt, + va_list ap) +{ + static const mbstate_t initial = { 0 }; + mbstate_t mbs; + FILE f; + char *mbp; + int ret, sverrno; + size_t nwc; + struct __sfileext fext; + + if (n == 0) { + errno = EINVAL; + return (-1); + } + + _FILEEXT_SETUP(&f, &fext); + f._file = -1; + f._flags = __SWR | __SSTR | __SALC; + f._bf._base = f._p = (unsigned char *)malloc(128); + if (f._bf._base == NULL) { + errno = ENOMEM; + return (-1); + } + f._bf._size = f._w = 127; /* Leave room for the NUL */ + ret = __vfwprintf_unlocked(&f, fmt, ap); + if (ret < 0) { + sverrno = errno; + free(f._bf._base); + errno = sverrno; + return (-1); + } + *f._p = '\0'; + mbp = (char *)f._bf._base; + /* + * XXX Undo the conversion from wide characters to multibyte that + * fputwc() did in __vfwprintf(). + */ + mbs = initial; + nwc = mbsrtowcs(s, (const char **)&mbp, n, &mbs); + free(f._bf._base); + if (nwc == (size_t)-1) { + errno = EILSEQ; + return (-1); + } + if (nwc == n) { + s[n - 1] = L'\0'; + errno = EOVERFLOW; + return (-1); + } + + return (ret); +} diff --git a/StdLib/LibC/Stdio/vswscanf.c b/StdLib/LibC/Stdio/vswscanf.c new file mode 100644 index 0000000000..3f62666652 --- /dev/null +++ b/StdLib/LibC/Stdio/vswscanf.c @@ -0,0 +1,100 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Donn Seeley at UUNET Technologies, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + + FreeBSD: src/lib/libc/stdio/vswscanf.c,v 1.3 2004/04/07 09:55:05 tjr Exp + NetBSD: vswscanf.c,v 1.3 2005/12/02 13:51:22 yamt Exp + */ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +static int eofread(void *, char *, int); + +static int +/*ARGSUSED*/ +eofread(void *cookie, char *buf, int len) +{ + return (0); +} + +int +vswscanf( + const wchar_t * __restrict str, + const wchar_t * __restrict fmt, + va_list ap + ) +{ + static const mbstate_t initial = { 0 }; + mbstate_t mbs; + FILE f; + char *mbstr; + size_t mlen; + int r; + const wchar_t *rstr = str; + struct __sfileext fext = { 0 }; + + /* + * XXX Convert the wide character string to multibyte, which + * __vfwscanf() will convert back to wide characters. + */ + if ((mbstr = malloc(wcslen(str) * MB_CUR_MAX + 1)) == NULL) + return (EOF); + mbs = initial; + if ((mlen = wcsrtombs(mbstr, &rstr, SIZE_T_MAX, &mbs)) == (size_t)-1) { + free(mbstr); + return (EOF); + } + _FILEEXT_SETUP(&f, &fext); + f._file = -1; + f._flags = __SRD; + f._bf._base = f._p = (unsigned char *)mbstr; + f._bf._size = f._r = (int)mlen; + f._read = eofread; + _UB(&f)._base = NULL; + f._lb._base = NULL; + r = __vfwscanf_unlocked(&f, fmt, ap); + free(mbstr); + + return (r); +} diff --git a/StdLib/LibC/Stdio/vwprintf.c b/StdLib/LibC/Stdio/vwprintf.c new file mode 100644 index 0000000000..ebd42b07d4 --- /dev/null +++ b/StdLib/LibC/Stdio/vwprintf.c @@ -0,0 +1,41 @@ +/*- + * Copyright (c) 2002 Tim J. Robbins + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + + FreeBSD: src/lib/libc/stdio/vwprintf.c,v 1.1 2002/09/21 13:00:30 tjr Exp + NetBSD: vwprintf.c,v 1.1 2005/05/14 23:51:02 christos Exp + */ +#include +#include + +#include +#include +#include + +int +vwprintf(const wchar_t * __restrict fmt, va_list ap) +{ + + return (vfwprintf(stdout, fmt, ap)); +} diff --git a/StdLib/LibC/Stdio/vwscanf.c b/StdLib/LibC/Stdio/vwscanf.c new file mode 100644 index 0000000000..25f795f157 --- /dev/null +++ b/StdLib/LibC/Stdio/vwscanf.c @@ -0,0 +1,47 @@ +/* $NetBSD: vwscanf.c,v 1.1 2005/05/14 23:51:02 christos Exp $ */ + +/*- + * Copyright (c) 2002 Tim J. Robbins + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +__FBSDID("$FreeBSD: src/lib/libc/stdio/vwscanf.c,v 1.1 2002/09/23 12:40:06 tjr Exp $"); +#else +__RCSID("$NetBSD: vwscanf.c,v 1.1 2005/05/14 23:51:02 christos Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include + +int +vwscanf(const wchar_t * __restrict fmt, va_list ap) +{ + + return (vfwscanf(stdin, fmt, ap)); +} diff --git a/StdLib/LibC/Stdio/wbuf.c b/StdLib/LibC/Stdio/wbuf.c new file mode 100644 index 0000000000..8482a18e87 --- /dev/null +++ b/StdLib/LibC/Stdio/wbuf.c @@ -0,0 +1,99 @@ +/* $NetBSD: wbuf.c,v 1.13 2003/08/07 16:43:35 agc Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)wbuf.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: wbuf.c,v 1.13 2003/08/07 16:43:35 agc Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +/* + * Write the given character into the (probably full) buffer for + * the given file. Flush the buffer out if it is or becomes full, + * or if c=='\n' and the file is line buffered. + */ +int +__swbuf(int c, FILE *fp) +{ + int n; + + //_DIAGASSERT(fp != NULL); + + _SET_ORIENTATION(fp, -1); + + /* + * In case we cannot write, or longjmp takes us out early, + * make sure _w is 0 (if fully- or un-buffered) or -_bf._size + * (if line buffered) so that we will get called again. + * If we did not do this, a sufficient number of putc() + * calls might wrap _w from negative to positive. + */ + fp->_w = fp->_lbfsize; + if (cantwrite(fp)) { + errno = EBADF; + return (EOF); + } + c = (unsigned char)c; + + /* + * If it is completely full, flush it out. Then, in any case, + * stuff c into the buffer. If this causes the buffer to fill + * completely, or if c is '\n' and the file is line buffered, + * flush it (perhaps a second time). The second flush will always + * happen on unbuffered streams, where _bf._size==1; fflush() + * guarantees that putc() will always call wbuf() by setting _w + * to 0, so we need not do anything else. + */ + n = (int)(fp->_p - fp->_bf._base); + if (n >= fp->_bf._size) { + if (fflush(fp)) + return (EOF); + n = 0; + } + fp->_w--; + *fp->_p++ = (unsigned char)c; + if (++n == fp->_bf._size || (fp->_flags & __SLBF && c == '\n')) + if (fflush(fp)) + return (EOF); + return (c); +} diff --git a/StdLib/LibC/Stdio/wcio.h b/StdLib/LibC/Stdio/wcio.h new file mode 100644 index 0000000000..ab15bb53d5 --- /dev/null +++ b/StdLib/LibC/Stdio/wcio.h @@ -0,0 +1,72 @@ +/* $NetBSD: wcio.h,v 1.3 2003/01/18 11:30:00 thorpej Exp $ */ + +/*- + * Copyright (c)2001 Citrus Project, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Citrus$ + */ + +#ifndef _WCIO_H_ +#define _WCIO_H_ + +#include /* for mbstate_t and wchar_t */ + +/* minimal requirement of SUSv2 */ +#define WCIO_UNGETWC_BUFSIZE 1 + +#define WCIO_GET(fp) (&(_EXT(fp)->_wcio)) + +struct wchar_io_data { + mbstate_t wcio_mbstate_in; + mbstate_t wcio_mbstate_out; + + wchar_t wcio_ungetwc_buf[WCIO_UNGETWC_BUFSIZE]; + size_t wcio_ungetwc_inbuf; + + int wcio_mode; /* orientation */ +}; + +#define _SET_ORIENTATION(fp, mode) \ +do {\ + struct wchar_io_data *_wcio = WCIO_GET(fp);\ + if (_wcio && _wcio->wcio_mode == 0)\ + _wcio->wcio_mode = (mode);\ +} while (/*CONSTCOND*/0) + +/* + * WCIO_FREE should be called by fclose + */ +#define WCIO_FREE(fp) \ +do {\ + _EXT(fp)->_wcio.wcio_mode = 0;\ + WCIO_FREEUB(fp);\ +} while (/*CONSTCOND*/0) + +#define WCIO_FREEUB(fp) \ +do {\ + _EXT(fp)->_wcio.wcio_ungetwc_inbuf = 0;\ +} while (/*CONSTCOND*/0) + +#endif /*_WCIO_H_*/ diff --git a/StdLib/LibC/Stdio/wprintf.c b/StdLib/LibC/Stdio/wprintf.c new file mode 100644 index 0000000000..18b83a7927 --- /dev/null +++ b/StdLib/LibC/Stdio/wprintf.c @@ -0,0 +1,53 @@ +/* $NetBSD: wprintf.c,v 1.1 2005/05/14 23:51:02 christos Exp $ */ + +/*- + * Copyright (c) 2002 Tim J. Robbins + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +__FBSDID("$FreeBSD: src/lib/libc/stdio/wprintf.c,v 1.1 2002/09/21 13:00:30 tjr Exp $"); +#else +__RCSID("$NetBSD: wprintf.c,v 1.1 2005/05/14 23:51:02 christos Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include + +int +wprintf(const wchar_t * __restrict fmt, ...) +{ + int ret; + va_list ap; + + va_start(ap, fmt); + ret = vfwprintf(stdout, fmt, ap); + va_end(ap); + + return (ret); +} diff --git a/StdLib/LibC/Stdio/wscanf.c b/StdLib/LibC/Stdio/wscanf.c new file mode 100644 index 0000000000..4240c72056 --- /dev/null +++ b/StdLib/LibC/Stdio/wscanf.c @@ -0,0 +1,53 @@ +/* $NetBSD: wscanf.c,v 1.1 2005/05/14 23:51:02 christos Exp $ */ + +/*- + * Copyright (c) 2002 Tim J. Robbins + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +__FBSDID("$FreeBSD: src/lib/libc/stdio/wscanf.c,v 1.1 2002/09/23 12:40:06 tjr Exp $"); +#else +__RCSID("$NetBSD: wscanf.c,v 1.1 2005/05/14 23:51:02 christos Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include + +int +wscanf(const wchar_t * __restrict fmt, ...) +{ + va_list ap; + int r; + + va_start(ap, fmt); + r = vfwscanf(stdin, fmt, ap); + va_end(ap); + + return (r); +} diff --git a/StdLib/LibC/Stdio/wsetup.c b/StdLib/LibC/Stdio/wsetup.c new file mode 100644 index 0000000000..c1077bc9df --- /dev/null +++ b/StdLib/LibC/Stdio/wsetup.c @@ -0,0 +1,99 @@ +/* $NetBSD: wsetup.c,v 1.11 2003/08/07 16:43:35 agc Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)wsetup.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: wsetup.c,v 1.11 2003/08/07 16:43:35 agc Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include "reentrant.h" +#include "local.h" + +/* + * Various output routines call wsetup to be sure it is safe to write, + * because either _flags does not include __SWR, or _buf is NULL. + * _wsetup returns 0 if OK to write, nonzero otherwise. + */ +int +__swsetup(FILE *fp) +{ + + _DIAGASSERT(fp != NULL); + + /* make sure stdio is set up */ + if (!__sdidinit) + __sinit(); + + /* + * If we are not writing, we had better be reading and writing. + */ + if ((fp->_flags & __SWR) == 0) { + if ((fp->_flags & __SRW) == 0) + return (EOF); + if (fp->_flags & __SRD) { + /* clobber any ungetc data */ + if (HASUB(fp)) + FREEUB(fp); + fp->_flags &= ~(__SRD|__SEOF); + fp->_r = 0; + fp->_p = fp->_bf._base; + } + fp->_flags |= __SWR; + } + + /* + * Make a buffer if necessary, then set _w. + */ + if (fp->_bf._base == NULL) + __smakebuf(fp); + if (fp->_flags & __SLBF) { + /* + * It is line buffered, so make _lbfsize be -_bufsize + * for the putc() macro. We will change _lbfsize back + * to 0 whenever we turn off __SWR. + */ + fp->_w = 0; + fp->_lbfsize = -fp->_bf._size; + } else + fp->_w = fp->_flags & __SNBF ? 0 : fp->_bf._size; + return (0); +} diff --git a/StdLib/LibC/String/Comparison.c b/StdLib/LibC/String/Comparison.c new file mode 100644 index 0000000000..e656fe73f5 --- /dev/null +++ b/StdLib/LibC/String/Comparison.c @@ -0,0 +1,118 @@ +/** @file + Comparison Functions for . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include +#include +#include + +#include + +#include +#include + +/** The memcmp function compares the first n characters of the object pointed + to by s1 to the first n characters of the object pointed to by s2. + + @return The memcmp function returns an integer greater than, equal to, or + less than zero, accordingly as the object pointed to by s1 is + greater than, equal to, or less than the object pointed to by s2. +**/ +int memcmp(const void *s1, const void *s2, size_t n) +{ + return (int)CompareMem( s1, s2, n); +} + +/** The strcmp function compares the string pointed to by s1 to the string + pointed to by s2. + + @return The strcmp function returns an integer greater than, equal to, or + less than zero, accordingly as the string pointed to by s1 is + greater than, equal to, or less than the string pointed to by s2. +**/ +int strcmp(const char *s1, const char *s2) +{ + return (int)AsciiStriCmp( s1, s2); +} + +/** The strcoll function compares the string pointed to by s1 to the string + pointed to by s2, both interpreted as appropriate to the LC_COLLATE + category of the current locale. + + @return The strcoll function returns an integer greater than, equal to, + or less than zero, accordingly as the string pointed to by s1 is + greater than, equal to, or less than the string pointed to by s2 + when both are interpreted as appropriate to the current locale. +**/ +int strcoll(const char *s1, const char *s2) +{ + /* LC_COLLATE is unimplemented, hence always "C" */ + return (strcmp(s1, s2)); +} + +/** The strncmp function compares not more than n characters (characters that + follow a null character are not compared) from the array pointed to by s1 + to the array pointed to by s2. + + @return The strncmp function returns an integer greater than, equal to, + or less than zero, accordingly as the possibly null-terminated + array pointed to by s1 is greater than, equal to, or less than + the possibly null-terminated array pointed to by s2. +**/ +int strncmp(const char *s1, const char *s2, size_t n) +{ + return (int)AsciiStrnCmp( s1, s2, n); +} + +/** The strxfrm function transforms the string pointed to by s2 and places the + resulting string into the array pointed to by s1. The transformation is + such that if the strcmp function is applied to two transformed strings, it + returns a value greater than, equal to, or less than zero, corresponding to + the result of the strcoll function applied to the same two original + strings. No more than n characters are placed into the resulting array + pointed to by s1, including the terminating null character. If n is zero, + s1 is permitted to be a null pointer. If copying takes place between + objects that overlap, the behavior is undefined. + + @return The strxfrm function returns the length of the transformed string + (not including the terminating null character). If the value + returned is n or more, the contents of the array pointed to by s1 + are indeterminate. +**/ +size_t strxfrm(char * __restrict s1, const char * __restrict s2, size_t n) +{ + size_t srclen, copysize; + + /* + * Since locales are unimplemented, this is just a copy. + */ + srclen = strlen(s2); + if (n != 0) { + copysize = srclen < n ? srclen : n - 1; + (void)memcpy(s1, s2, copysize); + s1[copysize] = 0; + } + return (srclen); +} + +/** Case agnostic string comparison for NetBSD compatibility. **/ +int +strcasecmp(const char *s1, const char *s2) +{ + const unsigned char *us1 = (const unsigned char *)s1, + *us2 = (const unsigned char *)s2; + + while (tolower(*us1) == tolower(*us2++)) + if (*us1++ == '\0') + return (0); + return (tolower(*us1) - tolower(*--us2)); +} + diff --git a/StdLib/LibC/String/Concatenation.c b/StdLib/LibC/String/Concatenation.c new file mode 100644 index 0000000000..e76bea0bf8 --- /dev/null +++ b/StdLib/LibC/String/Concatenation.c @@ -0,0 +1,83 @@ +/** @file + Concatenation Functions for . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include +#include + +#include + +#include + +/** The strcat function appends a copy of the string pointed to by s2 + (including the terminating null character) to the end of the string pointed + to by s1. The initial character of s2 overwrites the null character at the + end of s1. If copying takes place between objects that overlap, the + behavior is undefined. + + @return The strcat function returns the value of s1. +**/ +char * +strcat(char * __restrict s1, const char * __restrict s2) +{ + return AsciiStrCat( s1, s2); +} + +/** The strncat function appends not more than n characters (a null character + and characters that follow it are not appended) from the array pointed to + by s2 to the end of the string pointed to by s1. The initial character of + s2 overwrites the null character at the end of s1. A terminating null + character is always appended to the result. If copying takes place + between objects that overlap, the behavior is undefined. + + @return The strncat function returns the value of s1. +**/ +char * +strncat(char * __restrict s1, const char * __restrict s2, size_t n) +{ + return AsciiStrnCat( s1, s2, n); +} + +/** The strncatX function appends not more than n characters (a null character + and characters that follow it are not appended) from the array pointed to + by s2 to the end of the string pointed to by s1. The initial character of + s2 overwrites the null character at the end of s1. The result is always + terminated with a null character. If copying takes place between objects + that overlap, the behavior is undefined. + + strncatX exists because normal strncat does not indicate if the operation + was terminated because of exhausting n or reaching the end of s2. + + @return The strncatX function returns 0 if the operation was terminated + because it reached the end of s1. Otherwise, a non-zero value is + returned indicating how many characters remain in s1. +**/ +int +strncatX(char * __restrict s1, const char * __restrict s2, size_t n) +{ + int NumLeft; + + // Find s1's terminating NUL + for( ; n != 0; --n) { + if( *s1++ == '\0') break; + } + + // Now copy *s2 into s1, overwriting s1's terminating NUL + for( --s1; n != 0; --n) { + if((*s1++ = *s2++) == '\0') break; + } + NumLeft = (int)n; + + // Guarantee that s1 is NUL terminated. + *--s1 = '\0'; + + return NumLeft; // Zero if we ran out of buffer ( strlen(s1) < strlen(s2) ) +} diff --git a/StdLib/LibC/String/Copying.c b/StdLib/LibC/String/Copying.c new file mode 100644 index 0000000000..2d5200e3c5 --- /dev/null +++ b/StdLib/LibC/String/Copying.c @@ -0,0 +1,141 @@ +/** @file + Copying Functions for . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +//#include + +#include +#include +#include + +#include + +#include +#include + +/** The memcpy function copies n characters from the object pointed to by s2 + into the object pointed to by s1. + + The implementation is reentrant and handles the case where s2 overlaps s1. + + @return The memcpy function returns the value of s1. +**/ +void * +memcpy(void * __restrict s1, const void * __restrict s2, size_t n) +{ + return CopyMem( s1, s2, n); +} + +/** The memmove function copies n characters from the object pointed to by s2 + into the object pointed to by s1. Copying takes place as if the n + characters from the object pointed to by s2 are first copied into a + temporary array of n characters that does not overlap the objects pointed + to by s1 and s2, and then the n characters from the temporary array are + copied into the object pointed to by s1. + + This is a version of memcpy that is guaranteed to work when s1 and s2 + overlap. Since our implementation of memcpy already handles overlap, + memmove can be identical to memcpy. + + @return The memmove function returns the value of s1. +**/ +void * +memmove(void *s1, const void *s2, size_t n) +{ + return CopyMem( s1, s2, n); +} + +/** The strcpy function copies the string pointed to by s2 (including the + terminating null character) into the array pointed to by s1. If copying + takes place between objects that overlap, the behavior is undefined. + + @return The strcpy function returns the value of s1. +**/ +char * +strcpy(char * __restrict s1, const char * __restrict s2) +{ + //char *s1ret = s1; + + //while ( *s1++ = *s2++) /* Empty Body */; + //return(s1ret); + return AsciiStrCpy( s1, s2); +} + +/** The strncpy function copies not more than n characters (characters that + follow a null character are not copied) from the array pointed to by s2 to + the array pointed to by s1. If copying takes place between objects that + overlap, the behavior is undefined. + + If the array pointed to by s2 is a string that is shorter than n + characters, null characters are appended to the copy in the array pointed + to by s1, until n characters in all have been written. + + @return The strncpy function returns the value of s1. +**/ +char *strncpy(char * __restrict s1, const char * __restrict s2, size_t n) +{ + return AsciiStrnCpy( s1, s2, n); + //char *dest = s1; + + //while(n != 0) { + // --n; + // if((*dest++ = *s2++) == '\0') break; + //} + //while(n != 0) { + // *dest++ = '\0'; + // --n; + //} + //return (s1); +} + +/** The strncpyX function copies not more than n-1 characters (characters that + follow a null character are not copied) from the array pointed to by s2 to + the array pointed to by s1. Array s1 is guaranteed to be NULL terminated. + If copying takes place between objects that overlap, + the behavior is undefined. + + strncpyX exists because normal strncpy does not indicate if the copy was + terminated because of exhausting the buffer or reaching the end of s2. + + @return The strncpyX function returns 0 if the copy operation was + terminated because it reached the end of s1. Otherwise, + a non-zero value is returned indicating how many characters + remain in s1. +**/ +int strncpyX(char * __restrict s1, const char * __restrict s2, size_t n) +{ + int NumLeft; + + for( ; n != 0; --n) { + if((*s1++ = *s2++) == '\0') break; + } + NumLeft = (int)n; + + for( --s1; n != 0; --n) { + *s1++ = '\0'; + } + + return NumLeft; // Zero if we ran out of buffer ( strlen(s1) < strlen(s2) ) +} + +/** NetBSD Compatibility Function strdup creates a duplicate copy of a string. **/ +char * +strdup(const char *str) +{ + size_t len; + char *copy; + + len = strlen(str) + 1; + if ((copy = malloc(len)) == NULL) + return (NULL); + memcpy(copy, str, len); + return (copy); +} diff --git a/StdLib/LibC/String/ErrorList.c b/StdLib/LibC/String/ErrorList.c new file mode 100644 index 0000000000..56c286011f --- /dev/null +++ b/StdLib/LibC/String/ErrorList.c @@ -0,0 +1,144 @@ +/** @file + This header defines the human readable descriptions of the errors declared + in errno.h. + + The string literals defined in this file must be kept in sync with the + error numbers declared in . This is because the error numbers are + used to index into the sys_errlist array to retrieve its associated + string literal. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#include +#include + +/* Describe the error numbers, sequentially, beginning at 0. */ +const char *const +sys_errlist[] = { + "No Error Detected", /* 0 errno reset or no error yet detected */ + "Operation not permitted", /* 1 EPERM */ + "No such file or directory", /* 2 ENOENT */ + "No such process", /* 3 ESRCH */ + "Interrupted system call", /* 4 EINTR */ + "Input/output error", /* 5 EIO */ + "Device not configured", /* 6 ENXIO */ + "Argument list too long", /* 7 E2BIG */ + "Exec format error", /* 8 ENOEXEC */ + "Bad file descriptor", /* 9 EBADF */ + "No child processes", /* 10 ECHILD */ + "Resource deadlock avoided", /* 11 EDEADLK */ + "Cannot allocate memory", /* 12 ENOMEM */ + "Permission denied", /* 13 EACCES */ + "Bad address", /* 14 EFAULT */ + "Block device required", /* 15 ENOTBLK */ + "Device busy", /* 16 EBUSY */ + "File exists", /* 17 EEXIST */ + "Cross-device link", /* 18 EXDEV */ + "Operation not supported by device", /* 19 ENODEV */ + "Not a directory", /* 20 ENOTDIR */ + "Is a directory", /* 21 EISDIR */ + "Invalid argument", /* 22 EINVAL */ + "Too many open files in system", /* 23 ENFILE */ + "Too many open files", /* 24 EMFILE */ + "Inappropriate ioctl for device", /* 25 ENOTTY */ + "Text file busy", /* 26 ETXTBSY */ + "File too large", /* 27 EFBIG */ + "No space left on device", /* 28 ENOSPC */ + "Illegal seek", /* 29 ESPIPE */ + "Read-only filesystem", /* 30 EROFS */ + "Too many links", /* 31 EMLINK */ + "Broken pipe", /* 32 EPIPE */ + + /* math software -- these are the only two values required by the C Standard */ + "Numerical argument out of domain", /* 33 EDOM */ + "Result too large", /* 34 ERANGE */ + + /* non-blocking and interrupt i/o */ + "Resource temporarily unavailable", /* 35 EAGAIN or EWOULDBLOCK */ + "Operation now in progress", /* 36 EINPROGRESS */ + "Operation already in progress", /* 37 EALREADY */ + + /* ipc/network software -- argument errors */ + "Socket operation on non-socket", /* 38 ENOTSOCK */ + "Destination address required", /* 39 EDESTADDRREQ */ + "Message too long", /* 40 EMSGSIZE */ + "Protocol wrong type for socket", /* 41 EPROTOTYPE */ + "Protocol not available", /* 42 ENOPROTOOPT */ + "Protocol not supported", /* 43 EPROTONOSUPPORT */ + "Socket type not supported", /* 44 ESOCKTNOSUPPORT */ + "Operation not supported", /* 45 EOPNOTSUPP or ENOTSUP */ + "Protocol family not supported", /* 46 EPFNOSUPPORT */ + "Address family not supported by protocol family", /* 47 EAFNOSUPPORT */ + "Address already in use", /* 48 EADDRINUSE */ + "Can't assign requested address", /* 49 EADDRNOTAVAIL */ + + /* ipc/network software -- operational errors */ + "Network is down", /* 50 ENETDOWN */ + "Network is unreachable", /* 51 ENETUNREACH */ + "Network dropped connection on reset", /* 52 ENETRESET */ + "Software caused connection abort", /* 53 ECONNABORTED */ + "Connection reset by peer", /* 54 ECONNRESET */ + "No buffer space available", /* 55 ENOBUFS */ + "Socket is already connected", /* 56 EISCONN */ + "Socket is not connected", /* 57 ENOTCONN */ + "Can't send after socket shutdown", /* 58 ESHUTDOWN */ + "Too many references: can't splice", /* 59 ETOOMANYREFS */ + "Operation timed out", /* 60 ETIMEDOUT */ + "Connection refused", /* 61 ECONNREFUSED */ + "Too many levels of symbolic links", /* 62 ELOOP */ + "File name too long", /* 63 ENAMETOOLONG */ + "Host is down", /* 64 EHOSTDOWN */ + "No route to host", /* 65 EHOSTUNREACH */ + "Directory not empty", /* 66 ENOTEMPTY */ + + /* quotas, etc. */ + "Too many processes", /* 67 EPROCLIM */ + "Too many users", /* 68 EUSERS */ + "Disc quota exceeded", /* 69 EDQUOT */ + + /* Network File System */ + "Stale NFS file handle", /* 70 ESTALE */ + "Too many levels of remote in path", /* 71 EREMOTE */ + "RPC struct is bad", /* 72 EBADRPC */ + "RPC version wrong", /* 73 ERPCMISMATCH */ + "RPC prog. not avail", /* 74 EPROGUNAVAIL */ + "Program version wrong", /* 75 EPROGMISMATCH */ + "Bad procedure for program", /* 76 EPROCUNAVAIL */ + "No locks available", /* 77 ENOLCK */ + "Function not implemented", /* 78 ENOSYS */ + "Inappropriate file type or format", /* 79 EFTYPE */ + "Authentication error", /* 80 EAUTH */ + "Need authenticator", /* 81 ENEEDAUTH */ + "Identifier removed", /* 82 EIDRM */ + "No message of desired type", /* 83 ENOMSG */ + "Value too large to be stored in data type", /* 84 EOVERFLOW */ + "Illegal byte sequence", /* 85 EILSEQ */ + "Bad errno 86", /* 86 ENOTHING_1 */ + "Operation canceled", /* 87 ECANCELED */ + + "Bad message", /* 88 EBADMSG */ + "No message available", /* 89 ENODATA */ + "No STREAM resources", /* 90 ENOSR */ + "Not a STREAM", /* 91 ENOSTR */ + "STREAM ioctl timeout", /* 92 ETIME */ + + "Attribute not found", /* 93 ENOATTR */ + + "Programming error", /* 94 EDOOFUS */ + + "Multihop attempted", /* 95 EMULTIHOP */ + "Link has been severed", /* 96 ENOLINK */ + "Protocol error", /* 97 EPROTO */ + + "Buffer too small to hold result", /* 98 EBUFSIZE */ + + "System Error list and errno.h are out-of-sync" /* EMAXERRORVAL - Should always be last. */ +}; diff --git a/StdLib/LibC/String/Misc.c b/StdLib/LibC/String/Misc.c new file mode 100644 index 0000000000..99328252ed --- /dev/null +++ b/StdLib/LibC/String/Misc.c @@ -0,0 +1,99 @@ +/** @file + Miscellaneous Functions for . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +//#include + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +extern char *sys_errlist[]; + +/** The memset function copies the value of c (converted to an unsigned char) + into each of the first n characters of the object pointed to by s. + + @return The memset function returns the value of s. +**/ +void * +memset(void *s, int c, size_t n) +{ + return SetMem( s, (UINTN)n, (UINT8)c); +} + +int +strerror_r(int errnum, char *buf, size_t buflen) +{ + const char *estring; + INTN i; + int retval = 0; + + if( (errnum < 0) || (errnum >= EMAXERRORVAL)) { + (void) AsciiSPrint( buf, ASCII_STRING_MAX, "Unknown Error: %d.", errnum); + retval = EINVAL; + } + else { + estring = sys_errlist[errnum]; + for( i = buflen; i > 0; --i) { + if( (*buf++ = *estring++) == '\0') { + break; + } + } + if(i == 0) { + retval = ERANGE; + } + } + return retval; +} + +/** The strerror function maps the number in errnum to a message string. + Typically, the values for errnum come from errno, but strerror shall map + any value of type int to a message. + + The implementation shall behave as if no library function calls the + strerror function. + + @return The strerror function returns a pointer to the string, the + contents of which are locale specific. The array pointed to + shall not be modified by the program, but may be overwritten by + a subsequent call to the strerror function. +**/ +char * +strerror(int errnum) +{ + static char errorbuf[ASCII_STRING_MAX]; + int status; + + status = strerror_r(errnum, errorbuf, sizeof(errorbuf)); + if(status != 0) { + errno = status; + } + return errorbuf; +} + +/** The strlen function computes the length of the string pointed to by s. + + @return The strlen function returns the number of characters that + precede the terminating null character. +**/ +size_t +strlen(const char *s) +{ + return (size_t)AsciiStrLen( s); +} diff --git a/StdLib/LibC/String/Searching.c b/StdLib/LibC/String/Searching.c new file mode 100644 index 0000000000..e22655621c --- /dev/null +++ b/StdLib/LibC/String/Searching.c @@ -0,0 +1,262 @@ +/** @file + Search Functions for . + + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include +#include +#include + +#include +#include +#include + +/** The memchr function locates the first occurrence of c (converted to an + unsigned char) in the initial n characters (each interpreted as + unsigned char) of the object pointed to by s. + + @return The memchr function returns a pointer to the located character, + or a null pointer if the character does not occur in the object. +**/ +void * +memchr(const void *s, int c, size_t n) +{ + return ScanMem8( s, (UINTN)n, (UINT8)c); +} + +/** The strchr function locates the first occurrence of c (converted to a char) + in the string pointed to by s. The terminating null character is considered + to be part of the string. + + @return The strchr function returns a pointer to the located character, + or a null pointer if the character does not occur in the string. +**/ +char * +strchr(const char *s, int c) +{ + char tgt = (char)c; + + do { + if( *s == tgt) { + return (char *)s; + } + } while(*s++ != '\0'); + return NULL; +} + +static UINT8 BitMask[] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 + }; + +#define WHICH8(c) ((unsigned char)(c) >> 3) +#define WHICH_BIT(c) (BitMask[((c) & 0x7)]) +#define BITMAP64 ((UINT64 *)bitmap) + +static +void +BuildBitmap(unsigned char * bitmap, const char *s2, int n) +{ + unsigned char bit; + int index; + + // Initialize bitmap. Bit 0 is always 1 which corresponds to '\0' + for (BITMAP64[0] = index = 1; index < n; index++) + BITMAP64[index] = 0; + + // Set bits in bitmap corresponding to the characters in s2 + for (; *s2 != '\0'; s2++) { + index = WHICH8(*s2); + bit = WHICH_BIT(*s2); + bitmap[index] = bitmap[index] | bit; + } +} + +/** The strcspn function computes the length of the maximum initial segment of + the string pointed to by s1 which consists entirely of characters not from + the string pointed to by s2. + + @return The strcspn function returns the length of the segment. +**/ +size_t +strcspn(const char *s1, const char *s2) +{ + UINT8 bitmap[ (((UCHAR_MAX + 1) / CHAR_BIT) + (CHAR_BIT - 1)) & ~7U]; + const char *str; + UINT8 bit; + int index; + + if(*s1 == '\0') return 0; + + BuildBitmap( bitmap, s2, sizeof(bitmap) / sizeof(UINT64)); + + for(str = s1; ; str++) { + index = WHICH8(*str); + bit = WHICH_BIT(*str); + if ((bitmap[index] & bit) != 0) + break; + } + return (str - s1); +} + +/** The strpbrk function locates the first occurrence in the string pointed to + by s1 of any character from the string pointed to by s2. + + @return The strpbrk function returns a pointer to the character, or a + null pointer if no character from s2 occurs in s1. +**/ +char * +strpbrk(const char *s1, const char *s2) +{ + UINT8 bitmap[ (((UCHAR_MAX + 1) / CHAR_BIT) + (CHAR_BIT - 1)) & ~7U]; + UINT8 bit; + int index; + + BuildBitmap( bitmap, s2, sizeof(bitmap) / sizeof(UINT64)); + + for( ; *s1 != '\0'; ++s1) { + index = WHICH8(*s1); + bit = WHICH_BIT(*s1); + if( (bitmap[index] & bit) != 0) { + return (char *)s1; + } + } + return NULL; +} + +/** The strrchr function locates the last occurrence of c (converted to a char) + in the string pointed to by s. The terminating null character is considered + to be part of the string. + + @return The strrchr function returns a pointer to the character, or a + null pointer if c does not occur in the string. +**/ +char * +strrchr(const char *s, int c) +{ + char *found = NULL; + char tgt = (char)c; + + do { + if( *s == tgt) found = (char *)s; + } while( *s++ != '\0'); + + return found; +} + +/** The strspn function computes the length of the maximum initial segment of + the string pointed to by s1 which consists entirely of characters from the + string pointed to by s2. + + @return The strspn function returns the length of the segment. +**/ +size_t +strspn(const char *s1 , const char *s2) +{ + UINT8 bitmap[ (((UCHAR_MAX + 1) / CHAR_BIT) + (CHAR_BIT - 1)) & ~7U]; + size_t length = 0; + int index; + UINT8 bit; + + BuildBitmap( bitmap, s2, sizeof(bitmap) / sizeof(UINT64)); + + for( ; *s1 != '\0'; ++s1) { + index = WHICH8(*s1); + bit = WHICH_BIT(*s1); + if( (bitmap[index] & bit) == 0) break; + ++length; + } + return length; +} + +/** The strstr function locates the first occurrence in the string pointed to + by s1 of the sequence of characters (excluding the terminating null + character) in the string pointed to by s2. + + @return The strstr function returns a pointer to the located string, or a + null pointer if the string is not found. If s2 points to a string + with zero length, the function returns s1. +**/ +char * +strstr(const char *s1 , const char *s2) +{ + return AsciiStrStr( s1, s2); +} + +/** A sequence of calls to the strtok function breaks the string pointed to by + s1 into a sequence of tokens, each of which is delimited by a character + from the string pointed to by s2. The first call in the sequence has a + non-null first argument; subsequent calls in the sequence have a null first + argument. The separator string pointed to by s2 may be different from call + to call. + + The first call in the sequence searches the string pointed to by s1 for the + first character that is not contained in the current separator string + pointed to by s2. If no such character is found, then there are no tokens + in the string pointed to by s1 and the strtok function returns a null + pointer. If such a character is found, it is the start of the first token. + + The strtok function then searches from there for a character that is + contained in the current separator string. If no such character is found, + the current token extends to the end of the string pointed to by s1, and + subsequent searches for a token will return a null pointer. If such a + character is found, it is overwritten by a null character, which terminates + the current token. The strtok function saves a pointer to the following + character, from which the next search for a token will start. + + Each subsequent call, with a null pointer as the value of the first + argument, starts searching from the saved pointer and behaves as + described above. + + @return The strtok function returns a pointer to the first character of a + token, or a null pointer if there is no token. +**/ +char * +strtok(char * __restrict s1, const char * __restrict s2) +{ + static char *Next = NULL; + UINT8 bitmap[ (((UCHAR_MAX + 1) / CHAR_BIT) + (CHAR_BIT - 1)) & ~7U]; + char *Token = NULL; + int index; + UINT8 bit; + + if( (s1 == NULL) + && ((s1 = Next) == NULL)) + { + return NULL; + } + + // s2 can be different on each call, so build the bitmap each time. + BuildBitmap( bitmap, s2, sizeof(bitmap) / sizeof(UINT64)); + + // skip leading delimiters: all chars in s2 + for( ; *s1 != '\0'; ++s1) { + index = WHICH8(*s1); + bit = WHICH_BIT(*s1); + if( (bitmap[index] & bit) == 0) break; + } + if( *s1 != 0) + { + // Remember this point, it is the start of the token + Token = s1++; + + // find the next delimiter and replace it with a '\0' + for( ; *s1 != '\0'; ++s1) { + index = WHICH8(*s1); + bit = WHICH_BIT(*s1); + if( (bitmap[index] & bit) != 0) { + *s1++ = '\0'; + Next = s1; + return Token; + } + } + } + Next = NULL; + return Token; +} diff --git a/StdLib/LibC/String/String.inf b/StdLib/LibC/String/String.inf new file mode 100644 index 0000000000..1614b1cb11 --- /dev/null +++ b/StdLib/LibC/String/String.inf @@ -0,0 +1,62 @@ +## @file +# Standard C library: Miscelaneous implementations. +# +# Copyright (c) 2010, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php. +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = LibString + FILE_GUID = caee2f3b-3191-4da0-ad10-a5c07e636cd1 + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + LIBRARY_CLASS = LibString + +# +# VALID_ARCHITECTURES = IA32 X64 IPF +# + +[Sources] + Misc.c + Copying.c + Concatenation.c + Comparison.c + Searching.c + ErrorList.c + +[Packages] + StdLib/StdLib.dec + StdLibPrivateInternalFiles/DoNotUse.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + PrintLib # Used for strerror() + PcdLib + LibC + LibCType + LibStdLib + +################################################################ +# +# The Build Options, below, are only used when building the C library. +# DO NOT use them when building your application! +# Nasty things could happen if you do. +# +# /Oi- is required for Microsoft VC++ to allow "intrinsic" functions to be +# defined in this library. +# /GL- is required so that LTCG generated references to functions in this library, +# such as memcpy(), can be resolved. +# +[BuildOptions] + MSFT:*_*_*_CC_FLAGS = /Oi- /GL- diff --git a/StdLib/LibC/Time/Theory.txt b/StdLib/LibC/Time/Theory.txt new file mode 100644 index 0000000000..f8e77adbdf --- /dev/null +++ b/StdLib/LibC/Time/Theory.txt @@ -0,0 +1,553 @@ +# $NetBSD: Theory,v 1.8 2004/05/27 20:39:49 kleink Exp $ +@(#)Theory 7.15 + + +----- Outline ----- + + Time and date functions + Names of time zone regions + Time zone abbreviations + Calendrical issues + Time and time zones on Mars + + +----- Time and date functions ----- + +These time and date functions are upwards compatible with POSIX.1, +an international standard for UNIX-like systems. +As of this writing, the current edition of POSIX.1 is: + + Information technology --Portable Operating System Interface (POSIX (R)) + -- Part 1: System Application Program Interface (API) [C Language] + ISO/IEC 9945-1:1996 + ANSI/IEEE Std 1003.1, 1996 Edition + 1996-07-12 + +POSIX.1 has the following properties and limitations. + +* In POSIX.1, time display in a process is controlled by the + environment variable TZ. Unfortunately, the POSIX.1 TZ string takes + a form that is hard to describe and is error-prone in practice. + Also, POSIX.1 TZ strings can't deal with other (for example, Israeli) + daylight saving time rules, or situations where more than two + time zone abbreviations are used in an area. + + The POSIX.1 TZ string takes the following form: + + stdoffset[dst[offset],date[/time],date[/time]] + + where: + + std and dst + are 3 or more characters specifying the standard + and daylight saving time (DST) zone names. + offset + is of the form `[-]hh:[mm[:ss]]' and specifies the + offset west of UTC. The default DST offset is one hour + ahead of standard time. + date[/time],date[/time] + specifies the beginning and end of DST. If this is absent, + the system supplies its own rules for DST, and these can + differ from year to year; typically US DST rules are used. + time + takes the form `hh:[mm[:ss]]' and defaults to 02:00. + date + takes one of the following forms: + Jn (1<=n<=365) + origin-1 day number not counting February 29 + n (0<=n<=365) + origin-0 day number counting February 29 if present + Mm.n.d (0[Sunday]<=d<=6[Saturday], 1<=n<=5, 1<=m<=12) + for the dth day of week n of month m of the year, + where week 1 is the first week in which day d appears, + and `5' stands for the last week in which day d appears + (which may be either the 4th or 5th week). + +* In POSIX.1, when a TZ value like "EST5EDT" is parsed, + typically the current US DST rules are used, + but this means that the US DST rules are compiled into each program + that does time conversion. This means that when US time conversion + rules change (as in the United States in 1987), all programs that + do time conversion must be recompiled to ensure proper results. + +* In POSIX.1, there's no tamper-proof way for a process to learn the + system's best idea of local wall clock. (This is important for + applications that an administrator wants used only at certain times-- + without regard to whether the user has fiddled the "TZ" environment + variable. While an administrator can "do everything in UTC" to get + around the problem, doing so is inconvenient and precludes handling + daylight saving time shifts--as might be required to limit phone + calls to off-peak hours.) + +* POSIX.1 requires that systems ignore leap seconds. + +These are the extensions that have been made to the POSIX.1 functions: + +* The "TZ" environment variable is used in generating the name of a file + from which time zone information is read (or is interpreted a la + POSIX); "TZ" is no longer constrained to be a three-letter time zone + name followed by a number of hours and an optional three-letter + daylight time zone name. The daylight saving time rules to be used + for a particular time zone are encoded in the time zone file; + the format of the file allows U.S., Australian, and other rules to be + encoded, and allows for situations where more than two time zone + abbreviations are used. + + It was recognized that allowing the "TZ" environment variable to + take on values such as "America/New_York" might cause "old" programs + (that expect "TZ" to have a certain form) to operate incorrectly; + consideration was given to using some other environment variable + (for example, "TIMEZONE") to hold the string used to generate the + time zone information file name. In the end, however, it was decided + to continue using "TZ": it is widely used for time zone purposes; + separately maintaining both "TZ" and "TIMEZONE" seemed a nuisance; + and systems where "new" forms of "TZ" might cause problems can simply + use TZ values such as "EST5EDT" which can be used both by + "new" programs (a la POSIX) and "old" programs (as zone names and + offsets). + +* To handle places where more than two time zone abbreviations are used, + the functions "localtime" and "gmtime" set tzname[tmp->tm_isdst] + (where "tmp" is the value the function returns) to the time zone + abbreviation to be used. This differs from POSIX.1, where the elements + of tzname are only changed as a result of calls to tzset. + +* Since the "TZ" environment variable can now be used to control time + conversion, the "daylight" and "timezone" variables are no longer + needed. (These variables are defined and set by "tzset"; however, their + values will not be used by "localtime.") + +* The "localtime" function has been set up to deliver correct results + for near-minimum or near-maximum time_t values. (A comment in the + source code tells how to get compatibly wrong results). + +* A function "tzsetwall" has been added to arrange for the system's + best approximation to local wall clock time to be delivered by + subsequent calls to "localtime." Source code for portable + applications that "must" run on local wall clock time should call + "tzsetwall();" if such code is moved to "old" systems that don't + provide tzsetwall, you won't be able to generate an executable program. + (These time zone functions also arrange for local wall clock time to be + used if tzset is called--directly or indirectly--and there's no "TZ" + environment variable; portable applications should not, however, rely + on this behavior since it's not the way SVR2 systems behave.) + +* These functions can account for leap seconds, thanks to Bradley White + (bww@k.cs.cmu.edu). + +Points of interest to folks with other systems: + +* This package is already part of many POSIX-compliant hosts, + including BSD, HP, Linux, Network Appliance, SCO, SGI, and Sun. + On such hosts, the primary use of this package + is to update obsolete time zone rule tables. + To do this, you may need to compile the time zone compiler + `zic' supplied with this package instead of using the system `zic', + since the format of zic's input changed slightly in late 1994, + and many vendors still do not support the new input format. + +* The UNIX Version 7 "timezone" function is not present in this package; + it's impossible to reliably map timezone's arguments (a "minutes west + of GMT" value and a "daylight saving time in effect" flag) to a + time zone abbreviation, and we refuse to guess. + Programs that in the past used the timezone function may now examine + tzname[localtime(&clock)->tm_isdst] to learn the correct time + zone abbreviation to use. Alternatively, use + localtime(&clock)->tm_zone if this has been enabled. + +* The 4.2BSD gettimeofday function is not used in this package. + This formerly let users obtain the current UTC offset and DST flag, + but this functionality was removed in later versions of BSD. + +* In SVR2, time conversion fails for near-minimum or near-maximum + time_t values when doing conversions for places that don't use UTC. + This package takes care to do these conversions correctly. + +The functions that are conditionally compiled if STD_INSPIRED is defined +should, at this point, be looked on primarily as food for thought. They are +not in any sense "standard compatible"--some are not, in fact, specified in +*any* standard. They do, however, represent responses of various authors to +standardization proposals. + +Other time conversion proposals, in particular the one developed by folks at +Hewlett Packard, offer a wider selection of functions that provide capabilities +beyond those provided here. The absence of such functions from this package +is not meant to discourage the development, standardization, or use of such +functions. Rather, their absence reflects the decision to make this package +contain valid extensions to POSIX.1, to ensure its broad +acceptability. If more powerful time conversion functions can be standardized, +so much the better. + + +----- Names of time zone rule files ----- + +The time zone rule file naming conventions attempt to strike a balance +among the following goals: + + * Uniquely identify every national region where clocks have all + agreed since 1970. This is essential for the intended use: static + clocks keeping local civil time. + + * Indicate to humans as to where that region is. This simplifes use. + + * Be robust in the presence of political changes. This reduces the + number of updates and backward-compatibility hacks. For example, + names of countries are ordinarily not used, to avoid + incompatibilities when countries change their name + (e.g. Zaire->Congo) or when locations change countries + (e.g. Hong Kong from UK colony to China). + + * Be portable to a wide variety of implementations. + This promotes use of the technology. + + * Use a consistent naming convention over the entire world. + This simplifies both use and maintenance. + +This naming convention is not intended for use by inexperienced users +to select TZ values by themselves (though they can of course examine +and reuse existing settings). Distributors should provide +documentation and/or a simple selection interface that explains the +names; see the 'tzselect' program supplied with this distribution for +one example. + +Names normally have the form AREA/LOCATION, where AREA is the name +of a continent or ocean, and LOCATION is the name of a specific +location within that region. North and South America share the same +area, `America'. Typical names are `Africa/Cairo', `America/New_York', +and `Pacific/Honolulu'. + +Here are the general rules used for choosing location names, +in decreasing order of importance: + + Use only valid POSIX file name components (i.e., the parts of + names other than `/'). Within a file name component, + use only ASCII letters, `.', `-' and `_'. Do not use + digits, as that might create an ambiguity with POSIX + TZ strings. A file name component must not exceed 14 + characters or start with `-'. E.g., prefer `Brunei' + to `Bandar_Seri_Begawan'. + Include at least one location per time zone rule set per country. + One such location is enough. Use ISO 3166 (see the file + iso3166.tab) to help decide whether something is a country. + If all the clocks in a country's region have agreed since 1970, + don't bother to include more than one location + even if subregions' clocks disagreed before 1970. + Otherwise these tables would become annoyingly large. + If a name is ambiguous, use a less ambiguous alternative; + e.g. many cities are named San Jose and Georgetown, so + prefer `Costa_Rica' to `San_Jose' and `Guyana' to `Georgetown'. + Keep locations compact. Use cities or small islands, not countries + or regions, so that any future time zone changes do not split + locations into different time zones. E.g. prefer `Paris' + to `France', since France has had multiple time zones. + Use mainstream English spelling, e.g. prefer `Rome' to `Roma', and + prefer `Athens' to the true name (which uses Greek letters). + The POSIX file name restrictions encourage this rule. + Use the most populous among locations in a country's time zone, + e.g. prefer `Shanghai' to `Beijing'. Among locations with + similar populations, pick the best-known location, + e.g. prefer `Rome' to `Milan'. + Use the singular form, e.g. prefer `Canary' to `Canaries'. + Omit common suffixes like `_Islands' and `_City', unless that + would lead to ambiguity. E.g. prefer `Cayman' to + `Cayman_Islands' and `Guatemala' to `Guatemala_City', + but prefer `Mexico_City' to `Mexico' because the country + of Mexico has several time zones. + Use `_' to represent a space. + Omit `.' from abbreviations in names, e.g. prefer `St_Helena' + to `St._Helena'. + Do not change established names if they only marginally + violate the above rules. For example, don't change + the existing name `Rome' to `Milan' merely because + Milan's population has grown to be somewhat greater + than Rome's. + If a name is changed, put its old spelling in the `backward' file. + +The file `zone.tab' lists the geographical locations used to name +time zone rule files. + +Older versions of this package used a different naming scheme, +and these older names are still supported. +See the file `backward' for most of these older names +(e.g. `US/Eastern' instead of `America/New_York'). +The other old-fashioned names still supported are +`WET', `CET', `MET', `EET' (see the file `europe'), +and `Factory' (see the file `factory'). + + +----- Time zone abbreviations ----- + +When this package is installed, it generates time zone abbreviations +like `EST' to be compatible with human tradition and POSIX.1. +Here are the general rules used for choosing time zone abbreviations, +in decreasing order of importance: + + Use abbreviations that consist of three or more ASCII letters. + Previous editions of this database also used characters like + ' ' and '?', but these characters have a special meaning to + the shell and cause commands like + set `date` + to have unexpected effects. + Previous editions of this rule required upper-case letters, + but the Congressman who introduced Chamorro Standard Time + preferred "ChST", so the rule has been relaxed. + + This rule guarantees that all abbreviations could have + been specified by a POSIX.1 TZ string. POSIX.1 + requires at least three characters for an + abbreviation. POSIX.1-1996 says that an abbreviation + cannot start with ':', and cannot contain ',', '-', + '+', NUL, or a digit. Draft 7 of POSIX 1003.1-200x + changes this rule to say that an abbreviation can + contain only '-', '+', and alphanumeric characters in + the current locale. To be portable to both sets of + rules, an abbreviation must therefore use only ASCII + letters, as these are the only letters that are + alphabetic in all locales. + + Use abbreviations that are in common use among English-speakers, + e.g. `EST' for Eastern Standard Time in North America. + We assume that applications translate them to other languages + as part of the normal localization process; for example, + a French application might translate `EST' to `HNE'. + + For zones whose times are taken from a city's longitude, use the + traditional xMT notation, e.g. `PMT' for Paris Mean Time. + The only name like this in current use is `GMT'. + + If there is no common English abbreviation, abbreviate the English + translation of the usual phrase used by native speakers. + If this is not available or is a phrase mentioning the country + (e.g. ``Cape Verde Time''), then: + + When a country has a single or principal time zone region, + append `T' to the country's ISO code, e.g. `CVT' for + Cape Verde Time. For summer time append `ST'; + for double summer time append `DST'; etc. + When a country has multiple time zones, take the first three + letters of an English place name identifying each zone + and then append `T', `ST', etc. as before; + e.g. `VLAST' for VLAdivostok Summer Time. + + Use "zzz" for locations while uninhabited. The mnemonic is that + these locations are, in some sense, asleep. + +Application writers should note that these abbreviations are ambiguous +in practice: e.g. `EST' has a different meaning in Australia than +it does in the United States. In new applications, it's often better +to use numeric UTC offsets like `-0500' instead of time zone +abbreviations like `EST'; this avoids the ambiguity. + + +----- Calendrical issues ----- + +Calendrical issues are a bit out of scope for a time zone database, +but they indicate the sort of problems that we would run into if we +extended the time zone database further into the past. An excellent +resource in this area is Nachum Dershowitz and Edward M. Reingold, + +Calendrical Calculations +, Cambridge University Press (1997). Other information and +sources are given below. They sometimes disagree. + + +France + +Gregorian calendar adopted 1582-12-20. +French Revolutionary calendar used 1793-11-24 through 1805-12-31, +and (in Paris only) 1871-05-06 through 1871-05-23. + + +Russia + +From Chris Carrier <72157.3334@CompuServe.COM> (1996-12-02): +On 1929-10-01 the Soviet Union instituted an ``Eternal Calendar'' +with 30-day months plus 5 holidays, with a 5-day week. +On 1931-12-01 it changed to a 6-day week; in 1934 it reverted to the +Gregorian calendar while retaining the 6-day week; on 1940-06-27 it +reverted to the 7-day week. With the 6-day week the usual days +off were the 6th, 12th, 18th, 24th and 30th of the month. +(Source: Evitiar Zerubavel, _The Seven Day Circle_) + + +Mark Brader reported a similar story in "The Book of Calendars", edited +by Frank Parise (1982, Facts on File, ISBN 0-8719-6467-8), page 377. But: + +From: Petteri Sulonen (via Usenet) +Date: 14 Jan 1999 00:00:00 GMT +Message-ID: + +If your source is correct, how come documents between 1929 -- 1940 were +still dated using the conventional, Gregorian calendar? + +I can post a scan of a document dated December 1, 1934, signed by +Yenukidze, the secretary, on behalf of Kalinin, the President of the +Executive Committee of the Supreme Soviet, if you like. + + + +Sweden (and Finland) + +From: msb@sq.com (Mark Brader) + +Subject: Re: Gregorian reform -- a part of locale? + +Date: 1996-07-06 + +In 1700, Denmark made the transition from Julian to Gregorian. Sweden +decided to *start* a transition in 1700 as well, but rather than have one of +those unsightly calendar gaps :-), they simply decreed that the next leap +year after 1696 would be in 1744 -- putting the whole country on a calendar +different from both Julian and Gregorian for a period of 40 years. + +However, in 1704 something went wrong and the plan was not carried through; +they did, after all, have a leap year that year. And one in 1708. In 1712 +they gave it up and went back to Julian, putting 30 days in February that +year!... + +Then in 1753, Sweden made the transition to Gregorian in the usual manner, +getting there only 13 years behind the original schedule. + +(A previous posting of this story was challenged, and Swedish readers +produced the following references to support it: "Tiderakning och historia" +by Natanael Beckman (1924) and "Tid, en bok om tiderakning och +kalendervasen" by Lars-Olof Lode'n (no date was given).) + + +Grotefend's data + +From: "Michael Palmer" [with one obvious typo fixed] +Subject: Re: Gregorian Calendar (was Re: Another FHC related question +Newsgroups: soc.genealogy.german +Date: Tue, 9 Feb 1999 02:32:48 -800 +Message-ID: <199902091032.CAA09644@netcom10.netcom.com> + +The following is a(n incomplete) listing, arranged chronologically, of +European states, with the date they converted from the Julian to the +Gregorian calendar: + +04/15 Oct 1582 - Italy (with exceptions), Spain, Portugal, Poland (Roman + Catholics and Danzig only) +09/20 Dec 1582 - France, Lorraine + +21 Dec 1582/ + 01 Jan 1583 - Holland, Brabant, Flanders, Hennegau +10/21 Feb 1583 - bishopric of Liege (L"uttich) +13/24 Feb 1583 - bishopric of Augsburg +04/15 Oct 1583 - electorate of Trier +05/16 Oct 1583 - Bavaria, bishoprics of Freising, Eichstedt, Regensburg, + Salzburg, Brixen +13/24 Oct 1583 - Austrian Oberelsass and Breisgau +20/31 Oct 1583 - bishopric of Basel +02/13 Nov 1583 - duchy of J"ulich-Berg +02/13 Nov 1583 - electorate and city of K"oln +04/15 Nov 1583 - bishopric of W"urzburg +11/22 Nov 1583 - electorate of Mainz +16/27 Nov 1583 - bishopric of Strassburg and the margraviate of Baden +17/28 Nov 1583 - bishopric of M"unster and duchy of Cleve +14/25 Dec 1583 - Steiermark + +06/17 Jan 1584 - Austria and Bohemia +11/22 Jan 1584 - Luzern, Uri, Schwyz, Zug, Freiburg, Solothurn +12/23 Jan 1584 - Silesia and the Lausitz +22 Jan/ + 02 Feb 1584 - Hungary (legally on 21 Oct 1587) + Jun 1584 - Unterwalden +01/12 Jul 1584 - duchy of Westfalen + +16/27 Jun 1585 - bishopric of Paderborn + +14/25 Dec 1590 - Transylvania + +22 Aug/ + 02 Sep 1612 - duchy of Prussia + +13/24 Dec 1614 - Pfalz-Neuburg + + 1617 - duchy of Kurland (reverted to the Julian calendar in + 1796) + + 1624 - bishopric of Osnabr"uck + + 1630 - bishopric of Minden + +15/26 Mar 1631 - bishopric of Hildesheim + + 1655 - Kanton Wallis + +05/16 Feb 1682 - city of Strassburg + +18 Feb/ + 01 Mar 1700 - Protestant Germany (including Swedish possessions in + Germany), Denmark, Norway +30 Jun/ + 12 Jul 1700 - Gelderland, Zutphen +10 Nov/ + 12 Dec 1700 - Utrecht, Overijssel + +31 Dec 1700/ + 12 Jan 1701 - Friesland, Groningen, Z"urich, Bern, Basel, Geneva, + Turgau, and Schaffhausen + + 1724 - Glarus, Appenzell, and the city of St. Gallen + +01 Jan 1750 - Pisa and Florence + +02/14 Sep 1752 - Great Britain + +17 Feb/ + 01 Mar 1753 - Sweden + +1760-1812 - Graub"unden + +The Russian empire (including Finland and the Baltic states) did not +convert to the Gregorian calendar until the Soviet revolution of 1917. + +Source: H. Grotefend, _Taschenbuch der Zeitrechnung des deutschen +Mittelalters und der Neuzeit_, herausgegeben von Dr. O. Grotefend +(Hannover: Hahnsche Buchhandlung, 1941), pp. 26-28. + + +----- Time and time zones on Mars ----- + +Some people have adjusted their work schedules to fit Mars time. +Dozens of special Mars watches were built for Jet Propulsion +Laboratory workers who kept Mars time during the Mars Exploration +Rovers mission (2004). These timepieces look like normal Seikos and +Citizens but use Mars seconds rather than terrestrial seconds. + +A Mars solar day is called a "sol" and has a mean period equal to +about 24 hours 39 minutes 35.244 seconds in terrestrial time. It is +divided into a conventional 24-hour clock, so each Mars second equals +about 1.02749125 terrestrial seconds. + +The prime meridian of Mars goes through the center of the crater +Airy-0, named in honor of the British astronomer who built the +Greenwich telescope that defines Earth's prime meridian. Mean solar +time on the Mars prime meridian is called Mars Coordinated Time (MTC). + +Each landed mission on Mars has adopted a different reference for +solar time keeping, so there is no real standard for Mars time zones. +For example, the Mars Exploration Rover project (2004) defined two +time zones "Local Solar Time A" and "Local Solar Time B" for its two +missions, each zone designed so that its time equals local true solar +time at approximately the middle of the nominal mission. Such a "time +zone" is not particularly suited for any application other than the +mission itself. + +Many calendars have been proposed for Mars, but none have achieved +wide acceptance. Astronomers often use Mars Sol Date (MSD) which is a +sequential count of Mars solar days elapsed since about 1873-12-29 +12:00 GMT. + +The tz database does not currently support Mars time, but it is +documented here in the hopes that support will be added eventually. + +Sources: + +Michael Allison and Robert Schmunk, +"Technical Notes on Mars Solar Time as Adopted by the Mars24 Sunclock" + (2004-03-15). + +Jia-Rui Chong, "Workdays Fit for a Martian", Los Angeles Times +(2004-01-14), pp A1, A20-A21. diff --git a/StdLib/LibC/Time/Time.c b/StdLib/LibC/Time/Time.c new file mode 100644 index 0000000000..3192696f4a --- /dev/null +++ b/StdLib/LibC/Time/Time.c @@ -0,0 +1,780 @@ +/** + Definitions and Implementation for . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Portions derived from the NIH time zone package file, localtime.c, + which contains the following notice: + + This file is in the public domain, so clarified as of + 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov). + + NetBSD: localtime.c,v 1.39 2006/03/22 14:01:30 christos Exp +**/ +#include +#include +#include +#include +#include +//#include + +#include + +#include +#include +#include +#include +#include "tzfile.h" +#include "TimeVals.h" +#include +#include // Library/include/extern.h: Private to implementation + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ +// Keep compiler quiet about casting from function to data pointers +#pragma warning ( disable : 4054 ) +#endif /* defined(_MSC_VER) */ + +/* ####################### Private Data ################################# */ + +#if 0 +static EFI_TIME TimeBuffer; + + static UINT16 MonthOffs[12] = { + 00, + 31, 59, 90, 120, + 151, 181, 212, 243, + 273, 304, 334 + }; + static clock_t y2kOffs = 730485; +#endif + +const int mon_lengths[2][MONSPERYEAR] = { + { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, + { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } +}; + +const int year_lengths[2] = { + DAYSPERNYEAR, DAYSPERLYEAR +}; + + +static const char *wday_name[7] = { + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" +}; + +static const char *mon_name[12] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +}; + +static int gmt_is_set; + +/* ############### Implementation Functions ############################ */ +// Forward reference +static void +localsub(const time_t * const timep, const long offset, struct tm * const tmp); + +clock_t +EFIAPI +__getCPS(void) +{ + return gMD->ClocksPerSecond; +} + +static void +timesub( + const time_t * const timep, + const long offset, + const struct state * const sp, + struct tm * const tmp + ) +{ + const struct lsinfo * lp; + time_t /*INTN*/ days; + time_t /*INTN*/ rem; + time_t /*INTN*/ y; + int yleap; + const int * ip; + time_t /*INTN*/ corr; + int hit; + int i; + + corr = 0; + hit = 0; +#ifdef ALL_STATE + i = (sp == NULL) ? 0 : sp->leapcnt; +#endif /* defined ALL_STATE */ +#ifndef ALL_STATE + i = sp->leapcnt; +#endif /* State Farm */ + while (--i >= 0) { + lp = &sp->lsis[i]; + if (*timep >= lp->ls_trans) { + if (*timep == lp->ls_trans) { + hit = ((i == 0 && lp->ls_corr > 0) || + lp->ls_corr > sp->lsis[i - 1].ls_corr); + if (hit) + while (i > 0 && + sp->lsis[i].ls_trans == sp->lsis[i - 1].ls_trans + 1 && + sp->lsis[i].ls_corr == sp->lsis[i - 1].ls_corr + 1 ) + { + ++hit; + --i; + } + } + corr = lp->ls_corr; + break; + } + } + days = *timep / SECSPERDAY; + rem = *timep % SECSPERDAY; + rem += (offset - corr); + while (rem < 0) { + rem += SECSPERDAY; + --days; + } + while (rem >= SECSPERDAY) { + rem -= SECSPERDAY; + ++days; + } + tmp->tm_hour = (int) (rem / SECSPERHOUR); + rem = rem % SECSPERHOUR; + tmp->tm_min = (int) (rem / SECSPERMIN); + /* + ** A positive leap second requires a special + ** representation. This uses "... ??:59:60" et seq. + */ + tmp->tm_sec = (int) (rem % SECSPERMIN) + hit; + tmp->tm_wday = (int) ((EPOCH_WDAY + days) % DAYSPERWEEK); + if (tmp->tm_wday < 0) + tmp->tm_wday += DAYSPERWEEK; + y = EPOCH_YEAR; + while (days < 0 || days >= (LONG32) year_lengths[yleap = isleap(y)]) { + time_t /*INTN*/ newy; + + newy = (y + days / DAYSPERNYEAR); + if (days < 0) + --newy; + days -= (newy - y) * DAYSPERNYEAR + + LEAPS_THRU_END_OF(newy - 1) - + LEAPS_THRU_END_OF(y - 1); + y = newy; + } + tmp->tm_year = (int)(y - TM_YEAR_BASE); + tmp->tm_yday = (int) days; + ip = mon_lengths[yleap]; + for (tmp->tm_mon = 0; days >= (LONG32) ip[tmp->tm_mon]; ++(tmp->tm_mon)) + days = days - (LONG32) ip[tmp->tm_mon]; + tmp->tm_mday = (int) (days + 1); + tmp->tm_isdst = 0; +#ifdef TM_GMTOFF + tmp->TM_GMTOFF = offset; +#endif /* defined TM_GMTOFF */ +} + +/* ############### Time Manipulation Functions ########################## */ + +/** The clock function determines the processor time used. + + @return The clock function returns the implementation’s best + approximation to the processor time used by the program since the + beginning of an implementation-defined era related only to the + program invocation. To determine the time in seconds, the value + returned by the clock function should be divided by the value of + the macro CLOCKS_PER_SEC. If the processor time used is not + available or its value cannot be represented, the function + returns the value (clock_t)(-1). + + On IA32 or X64 platforms, the value returned is the number of + CPU TimeStamp Counter ticks since the appliation started. +**/ +clock_t +EFIAPI +clock(void) +{ + clock_t temp; + +#ifdef NT32dvm + temp = 0; +#else + temp = (clock_t)GetPerformanceCounter(); +#endif /* NT32dvm */ + + return temp - gMD->AppStartTime; +} + +/** +**/ +double +EFIAPI +difftime(time_t time1, time_t time0) +{ + return (double)(time1 - time0); +} + +/* +** Adapted from code provided by Robert Elz, who writes: +** The "best" way to do mktime I think is based on an idea of Bob +** Kridle's (so its said...) from a long time ago. +** [kridle@xinet.com as of 1996-01-16.] +** It does a binary search of the time_t space. Since time_t's are +** just 32 bits, its a max of 32 iterations (even at 64 bits it +** would still be very reasonable). +*/ + +#ifndef WRONG +#define WRONG (-1) +#endif /* !defined WRONG */ + +/* +** Simplified normalize logic courtesy Paul Eggert (eggert@twinsun.com). +*/ + +static int +increment_overflow(int * number, int delta) +{ + int number0; + + number0 = *number; + *number += delta; + return (*number < number0) != (delta < 0); +} + +static int +normalize_overflow(int * const tensptr, int * const unitsptr, const int base) +{ + register int tensdelta; + + tensdelta = (*unitsptr >= 0) ? + (*unitsptr / base) : (-1 - (-1 - *unitsptr) / base); + *unitsptr -= tensdelta * base; + return increment_overflow(tensptr, tensdelta); +} + +static int +tmcomp(const struct tm * const atmp, const struct tm * const btmp) +{ + register int result; + + if ((result = (atmp->tm_year - btmp->tm_year)) == 0 && + (result = (atmp->tm_mon - btmp->tm_mon)) == 0 && + (result = (atmp->tm_mday - btmp->tm_mday)) == 0 && + (result = (atmp->tm_hour - btmp->tm_hour)) == 0 && + (result = (atmp->tm_min - btmp->tm_min)) == 0) + result = atmp->tm_sec - btmp->tm_sec; + return result; +} + +static time_t +time2sub( + struct tm * const tmp, + void (* const funcp)(const time_t*, long, struct tm*), + const long offset, + int * const okayp, + const int do_norm_secs + ) +{ + register const struct state * sp; + register int dir; + register int bits; + register int i, j ; + register int saved_seconds; + time_t newt; + time_t t; + struct tm yourtm, mytm; + + *okayp = FALSE; + yourtm = *tmp; // Create a copy of tmp + if (do_norm_secs) { + if (normalize_overflow(&yourtm.tm_min, &yourtm.tm_sec, + SECSPERMIN)) + return WRONG; + } + if (normalize_overflow(&yourtm.tm_hour, &yourtm.tm_min, MINSPERHOUR)) + return WRONG; + if (normalize_overflow(&yourtm.tm_mday, &yourtm.tm_hour, HOURSPERDAY)) + return WRONG; + if (normalize_overflow(&yourtm.tm_year, &yourtm.tm_mon, MONSPERYEAR)) + return WRONG; + /* + ** Turn yourtm.tm_year into an actual year number for now. + ** It is converted back to an offset from TM_YEAR_BASE later. + */ + if (increment_overflow(&yourtm.tm_year, TM_YEAR_BASE)) + return WRONG; + while (yourtm.tm_mday <= 0) { + if (increment_overflow(&yourtm.tm_year, -1)) + return WRONG; + i = yourtm.tm_year + (1 < yourtm.tm_mon); + yourtm.tm_mday += year_lengths[isleap(i)]; + } + while (yourtm.tm_mday > DAYSPERLYEAR) { + i = yourtm.tm_year + (1 < yourtm.tm_mon); + yourtm.tm_mday -= year_lengths[isleap(i)]; + if (increment_overflow(&yourtm.tm_year, 1)) + return WRONG; + } + for ( ; ; ) { + i = mon_lengths[isleap(yourtm.tm_year)][yourtm.tm_mon]; + if (yourtm.tm_mday <= i) + break; + yourtm.tm_mday -= i; + if (++yourtm.tm_mon >= MONSPERYEAR) { + yourtm.tm_mon = 0; + if (increment_overflow(&yourtm.tm_year, 1)) + return WRONG; + } + } + if (increment_overflow(&yourtm.tm_year, -TM_YEAR_BASE)) + return WRONG; + if (yourtm.tm_sec >= 0 && yourtm.tm_sec < SECSPERMIN) + saved_seconds = 0; + else if (yourtm.tm_year + TM_YEAR_BASE < EPOCH_YEAR) { + /* + ** We can't set tm_sec to 0, because that might push the + ** time below the minimum representable time. + ** Set tm_sec to 59 instead. + ** This assumes that the minimum representable time is + ** not in the same minute that a leap second was deleted from, + ** which is a safer assumption than using 58 would be. + */ + if (increment_overflow(&yourtm.tm_sec, 1 - SECSPERMIN)) + return WRONG; + saved_seconds = yourtm.tm_sec; + yourtm.tm_sec = SECSPERMIN - 1; + } else { + saved_seconds = yourtm.tm_sec; + yourtm.tm_sec = 0; + } + /* + ** Divide the search space in half + ** (this works whether time_t is signed or unsigned). + */ + bits = TYPE_BIT(time_t) - 1; + /* + ** Set t to the midpoint of our binary search. + ** + ** If time_t is signed, then 0 is just above the median, + ** assuming two's complement arithmetic. + ** If time_t is unsigned, then (1 << bits) is just above the median. + */ + t = TYPE_SIGNED(time_t) ? 0 : (((time_t) 1) << bits); + for ( ; ; ) { + (*funcp)(&t, offset, &mytm); // Convert t to broken-down time in mytm + dir = tmcomp(&mytm, &yourtm); // Is mytm larger, equal, or less than yourtm? + if (dir != 0) { // If mytm != yourtm... + if (bits-- < 0) // If we have exhausted all the bits.. + return WRONG; // Return that we failed + if (bits < 0) // If on the last bit... + --t; /* may be needed if new t is minimal */ + else if (dir > 0) // else if mytm > yourtm... + t -= ((time_t) 1) << bits; // subtract half the remaining time-space + else t += ((time_t) 1) << bits; // otherwise add half the remaining time-space + continue; // Repeat for the next half + } + if (yourtm.tm_isdst < 0 || mytm.tm_isdst == yourtm.tm_isdst) + break; + /* + ** Right time, wrong type. + ** Hunt for right time, right type. + ** It's okay to guess wrong since the guess + ** gets checked. + */ + /* + ** The (void *) casts are the benefit of SunOS 3.3 on Sun 2's. + */ + sp = (const struct state *) + (((void *) funcp == (void *) localsub) ? + lclptr : gmtptr); +#ifdef ALL_STATE + if (sp == NULL) + return WRONG; +#endif /* defined ALL_STATE */ + for (i = sp->typecnt - 1; i >= 0; --i) { + if (sp->ttis[i].tt_isdst != yourtm.tm_isdst) + continue; + for (j = sp->typecnt - 1; j >= 0; --j) { + if (sp->ttis[j].tt_isdst == yourtm.tm_isdst) + continue; + newt = t + sp->ttis[j].tt_gmtoff - + sp->ttis[i].tt_gmtoff; + (*funcp)(&newt, offset, &mytm); + if (tmcomp(&mytm, &yourtm) != 0) + continue; + if (mytm.tm_isdst != yourtm.tm_isdst) + continue; + /* + ** We have a match. + */ + t = newt; + goto label; + } + } + return WRONG; + } + label: + newt = t + saved_seconds; + if ((newt < t) != (saved_seconds < 0)) + return WRONG; + t = newt; + (*funcp)(&t, offset, tmp); + *okayp = TRUE; + return t; +} + +static time_t +time2(struct tm * const tmp, void (* const funcp)(const time_t*, long, struct tm*), + const long offset, int * const okayp) +{ + time_t t; + + /* + ** First try without normalization of seconds + ** (in case tm_sec contains a value associated with a leap second). + ** If that fails, try with normalization of seconds. + */ + t = time2sub(tmp, funcp, offset, okayp, FALSE); + return *okayp ? t : time2sub(tmp, funcp, offset, okayp, TRUE); +} + +static time_t +time1( + struct tm * const tmp, + void (* const funcp)(const time_t *, long, struct tm *), + const long offset + ) +{ + register time_t t; + register const struct state * sp; + register int samei, otheri; + register int sameind, otherind; + register int i; + register int nseen; + int seen[TZ_MAX_TYPES]; + int types[TZ_MAX_TYPES]; + int okay; + + if (tmp->tm_isdst > 1) + tmp->tm_isdst = 1; + t = time2(tmp, funcp, offset, &okay); +#ifdef PCTS + /* + ** PCTS code courtesy Grant Sullivan (grant@osf.org). + */ + if (okay) + return t; + if (tmp->tm_isdst < 0) + tmp->tm_isdst = 0; /* reset to std and try again */ +#endif /* defined PCTS */ +#ifndef PCTS + if (okay || tmp->tm_isdst < 0) + return t; +#endif /* !defined PCTS */ + /* + ** We're supposed to assume that somebody took a time of one type + ** and did some math on it that yielded a "struct tm" that's bad. + ** We try to divine the type they started from and adjust to the + ** type they need. + */ + /* + ** The (void *) casts are the benefit of SunOS 3.3 on Sun 2's. + */ + sp = (const struct state *) (((void *) funcp == (void *) localsub) ? + lclptr : gmtptr); +#ifdef ALL_STATE + if (sp == NULL) + return WRONG; +#endif /* defined ALL_STATE */ + for (i = 0; i < sp->typecnt; ++i) + seen[i] = FALSE; + nseen = 0; + for (i = sp->timecnt - 1; i >= 0; --i) + if (!seen[sp->types[i]]) { + seen[sp->types[i]] = TRUE; + types[nseen++] = sp->types[i]; + } + for (sameind = 0; sameind < nseen; ++sameind) { + samei = types[sameind]; + if (sp->ttis[samei].tt_isdst != tmp->tm_isdst) + continue; + for (otherind = 0; otherind < nseen; ++otherind) { + otheri = types[otherind]; + if (sp->ttis[otheri].tt_isdst == tmp->tm_isdst) + continue; + tmp->tm_sec += (int)(sp->ttis[otheri].tt_gmtoff - + sp->ttis[samei].tt_gmtoff); + tmp->tm_isdst = !tmp->tm_isdst; + t = time2(tmp, funcp, offset, &okay); + if (okay) + return t; + tmp->tm_sec -= (int)(sp->ttis[otheri].tt_gmtoff - + sp->ttis[samei].tt_gmtoff); + tmp->tm_isdst = !tmp->tm_isdst; + } + } + return WRONG; +} + +/** The mktime function converts the broken-down time, expressed as local time, + in the structure pointed to by timeptr into a calendar time value with the + same encoding as that of the values returned by the time function. The + original values of the tm_wday and tm_yday components of the structure are + ignored, and the original values of the other components are not restricted + to the ranges indicated above. Thus, a positive or zero value for tm_isdst + causes the mktime function to presume initially that Daylight Saving Time, + respectively, is or is not in effect for the specified time. A negative + value causes it to attempt to determine whether Daylight Saving Time is in + effect for the specified time. On successful completion, the values of the + tm_wday and tm_yday components of the structure are set appropriately, and + the other components are set to represent the specified calendar time, but + with their values forced to the ranges indicated above; the final value of + tm_mday is not set until tm_mon and tm_year are determined. + + @return The mktime function returns the specified calendar time encoded + as a value of type time_t. If the calendar time cannot be + represented, the function returns the value (time_t)(-1). +**/ +time_t +EFIAPI +mktime(struct tm *timeptr) +{ + /* From NetBSD */ + time_t result; + + rwlock_wrlock(&lcl_lock); + tzset(); + result = time1(timeptr, &localsub, 0L); + rwlock_unlock(&lcl_lock); + return (result); +} + +/** The time function determines the current calendar time. The encoding of + the value is unspecified. + + @return The time function returns the implementation’s best approximation + to the current calendar time. The value (time_t)(-1) is returned + if the calendar time is not available. If timer is not a null + pointer, the return value is also assigned to the object it + points to. +**/ +time_t +EFIAPI +time(time_t *timer) +{ + time_t CalTime; + EFI_STATUS Status; + EFI_TIME *ET; + struct tm *BT; + + ET = &gMD->TimeBuffer; + BT = &gMD->BDTime; + + // Get EFI Time + Status = gRT->GetTime( ET, NULL); +// Status = EfiGetTime( ET, NULL); + EFIerrno = Status; + if( Status != RETURN_SUCCESS) { + return (time_t)-1; + } + + // Convert EFI time to broken-down time. + Efi2Tm( ET, BT); + + // Convert to time_t + CalTime = mktime(&gMD->BDTime); + + if( timer != NULL) { + *timer = CalTime; + } + return CalTime; // Return calendar time in microseconds +} + +/* ################# Time Conversion Functions ########################## */ +/* + Except for the strftime function, these functions each return a pointer to + one of two types of static objects: a broken-down time structure or an + array of char. Execution of any of the functions that return a pointer to + one of these object types may overwrite the information in any object of + the same type pointed to by the value returned from any previous call to + any of them. The implementation shall behave as if no other library + functions call these functions. +*/ + +/** The asctime function converts the broken-down time in the structure pointed + to by timeptr into a string in the form + Sun Sep 16 01:03:52 1973\n\0 + using the equivalent of the following algorithm. + + char *asctime(const struct tm *timeptr) + { + static const char wday_name[7][3] = { + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" + }; + static const char mon_name[12][3] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" + }; + static char result[26]; + sprintf(result, "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n", + wday_name[timeptr->tm_wday], + mon_name[timeptr->tm_mon], + timeptr->tm_mday, timeptr->tm_hour, + timeptr->tm_min, timeptr->tm_sec, + 1900 + timeptr->tm_year); + return result; + } + @return The asctime function returns a pointer to the string. +**/ +char * +EFIAPI +asctime(const struct tm *timeptr) +{ + register const char * wn; + register const char * mn; + + if (timeptr->tm_wday < 0 || timeptr->tm_wday >= DAYSPERWEEK) + wn = "???"; + else wn = wday_name[timeptr->tm_wday]; + if (timeptr->tm_mon < 0 || timeptr->tm_mon >= MONSPERYEAR) + mn = "???"; + else mn = mon_name[timeptr->tm_mon]; + /* + ** The X3J11-suggested format is + ** "%.3s %.3s%3d %02.2d:%02.2d:%02.2d %d\n" + ** Since the .2 in 02.2d is ignored, we drop it. + */ + (void)snprintf(gMD->ASasctime, + sizeof (char[ASCTIME_BUFLEN]), + "%.3s %.3s%3d %02d:%02d:%02d %d\r\n", // explicit CRLF for EFI + wn, mn, + timeptr->tm_mday, timeptr->tm_hour, + timeptr->tm_min, timeptr->tm_sec, + TM_YEAR_BASE + timeptr->tm_year); + return gMD->ASasctime; +} + +/** +**/ +char * +EFIAPI +ctime(const time_t *timer) +{ + return asctime(localtime(timer)); +} + +/* +** gmtsub is to gmtime as localsub is to localtime. +*/ +static void +gmtsub( + const time_t * const timep, + const long offset, + struct tm * const tmp + ) +{ +#ifdef _REENTRANT + static mutex_t gmt_mutex = MUTEX_INITIALIZER; +#endif + + mutex_lock(&gmt_mutex); + if (!gmt_is_set) { + gmt_is_set = TRUE; +#ifdef ALL_STATE + gmtptr = (struct state *) malloc(sizeof *gmtptr); + if (gmtptr != NULL) +#endif /* defined ALL_STATE */ + gmtload(gmtptr); + } + mutex_unlock(&gmt_mutex); + timesub(timep, offset, gmtptr, tmp); +#ifdef TM_ZONE + /* + ** Could get fancy here and deliver something such as + ** "UTC+xxxx" or "UTC-xxxx" if offset is non-zero, + ** but this is no time for a treasure hunt. + */ + if (offset != 0) + tmp->TM_ZONE = (__aconst char *)__UNCONST(wildabbr); + else { +#ifdef ALL_STATE + if (gmtptr == NULL) + tmp->TM_ZONE = (__aconst char *)__UNCONST(gmt); + else tmp->TM_ZONE = gmtptr->chars; +#endif /* defined ALL_STATE */ +#ifndef ALL_STATE + tmp->TM_ZONE = gmtptr->chars; +#endif /* State Farm */ + } +#endif /* defined TM_ZONE */ +} + +/** +**/ +struct tm * +EFIAPI +gmtime(const time_t *timer) +{ + gmtsub(timer, 0L, &gMD->BDTime); + return &gMD->BDTime; +} + +static void +localsub(const time_t * const timep, const long offset, struct tm * const tmp) +{ + register struct state * sp; + register const struct ttinfo * ttisp; + register int i; + const time_t t = *timep; + + sp = lclptr; +#ifdef ALL_STATE + if (sp == NULL) { + gmtsub(timep, offset, tmp); + return; + } +#endif /* defined ALL_STATE */ + if (sp->timecnt == 0 || t < sp->ats[0]) { + i = 0; + while (sp->ttis[i].tt_isdst) + if (++i >= sp->typecnt) { + i = 0; + break; + } + } else { + for (i = 1; i < sp->timecnt; ++i) + if (t < sp->ats[i]) + break; + i = sp->types[i - 1]; + } + ttisp = &sp->ttis[i]; + /* + ** To get (wrong) behavior that's compatible with System V Release 2.0 + ** you'd replace the statement below with + ** t += ttisp->tt_gmtoff; + ** timesub(&t, 0L, sp, tmp); + */ + timesub(&t, ttisp->tt_gmtoff, sp, tmp); + tmp->tm_isdst = ttisp->tt_isdst; + tzname[tmp->tm_isdst] = &sp->chars[ttisp->tt_abbrind]; +#ifdef TM_ZONE + tmp->TM_ZONE = &sp->chars[ttisp->tt_abbrind]; +#endif /* defined TM_ZONE */ +} + +/** +**/ +struct tm * +EFIAPI +localtime(const time_t *timer) +{ + tzset(); + localsub(timer, 0L, &gMD->BDTime); + return &gMD->BDTime; +} diff --git a/StdLib/LibC/Time/Time.inf b/StdLib/LibC/Time/Time.inf new file mode 100644 index 0000000000..8bbb248bd1 --- /dev/null +++ b/StdLib/LibC/Time/Time.inf @@ -0,0 +1,53 @@ +## @file +# Standard C library: Time implementations. +# +# Copyright (c) 2010, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php. +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = LibTime + FILE_GUID = c5847038-ff75-4074-9e4c-c36a2eb398a5 + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + LIBRARY_CLASS = LibTime + +# +# VALID_ARCHITECTURES = IA32 X64 IPF +# + +[Sources] + Time.c + ZoneProc.c + strftime.c + TimeEfi.c + +[Packages] + StdLib/StdLib.dec + StdLibPrivateInternalFiles/DoNotUse.dec + MdePkg/MdePkg.dec + ShellPkg/ShellPkg.dec + +[LibraryClasses] + UefiLib + TimerLib + BaseLib + UefiRuntimeServicesTableLib + +################################################################ +# +# The Build Options, below, are only used when building the C library. +# DO NOT use them when building your application! +# Nasty things could happen if you do. +# +[BuildOptions] + GCC:*_*_*_CC_FLAGS = -fno-strict-overflow -fno-builtin-strftime diff --git a/StdLib/LibC/Time/TimeEfi.c b/StdLib/LibC/Time/TimeEfi.c new file mode 100644 index 0000000000..7b062c917b --- /dev/null +++ b/StdLib/LibC/Time/TimeEfi.c @@ -0,0 +1,48 @@ +/** @file + Transformations between the EFI_TIME structure and struct tm or time_t. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#include + +#include + +#include +#include "tzfile.h" +#include + +/* Convert an EFI_TIME structure into a C Standard tm structure. */ +void +EFIAPI +Efi2Tm( EFI_TIME *ET, struct tm *BT) +{ + // Convert EFI time to broken-down time. + BT->tm_year = ET->Year - TM_YEAR_BASE; + BT->tm_mon = ET->Month - 1; // BD time is zero based, EFI is 1 based + BT->tm_mday = ET->Day; + BT->tm_hour = ET->Hour; + BT->tm_min = ET->Minute; + BT->tm_sec = ET->Second; + BT->tm_isdst = -1; + BT->tm_zoneoff = ET->TimeZone; + BT->tm_daylight = ET->Daylight; + BT->tm_Nano = ET->Nanosecond; +} + +/* Convert an EFI_TIME structure into a time_t value. */ +time_t +EFIAPI +Efi2Time( EFI_TIME *EfiBDtime) +{ + Efi2Tm( EfiBDtime, &gMD->BDTime); + + return mktime( &gMD->BDTime); +} diff --git a/StdLib/LibC/Time/TimeVals.h b/StdLib/LibC/Time/TimeVals.h new file mode 100644 index 0000000000..72827f9a91 --- /dev/null +++ b/StdLib/LibC/Time/TimeVals.h @@ -0,0 +1,117 @@ +/** @file + Definitions private to the Implementation of . + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Portions derived from the NIH time zone package files, + which contain the following notice: + + This file is in the public domain, so clarified as of + 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov). +**/ +#ifndef _TIMEVAL_H +#define _TIMEVAL_H + +extern struct state * lclptr; +extern struct state * gmtptr; +extern char * tzname[2]; +extern const char gmt[4]; +extern const char wildabbr[9]; +extern const int year_lengths[2]; +extern const int mon_lengths[2][MONSPERYEAR]; +extern long int timezone; +extern int daylight; + +#define EFI_UNSPECIFIED_TIMEZONE 0x07FF + +/* +** The DST rules to use if TZ has no rules and we can't load TZDEFRULES. +** We default to US rules as of 1999-08-17. +** POSIX 1003.1 section 8.1.1 says that the default DST rules are +** implementation dependent; for historical reasons, US rules are a +** common default. +*/ +#ifndef TZDEFRULESTRING +#define TZDEFRULESTRING ",M4.1.0,M10.5.0" +#endif + +// Facilities for external time-zone definition files do not currently exist +#define NO_ZONEINFO_FILES + +#define EPOCH_DAY 5 +#define DAY_TO_uSEC 86400000000 + +/* Rule type values for the r_type member of a rule structure */ +#define JULIAN_DAY 0 /* Jn - Julian day */ +#define DAY_OF_YEAR 1 /* n - day of year */ +#define MONTH_NTH_DAY_OF_WEEK 2 /* Mm.n.d - month, week, day of week */ + +#ifdef TZNAME_MAX + #define MY_TZNAME_MAX TZNAME_MAX +#endif /* defined TZNAME_MAX */ + +#ifndef TZNAME_MAX + #define MY_TZNAME_MAX 255 +#endif /* !defined TZNAME_MAX */ + +/* Unlike 's isdigit, this also works if c < 0 | c > UCHAR_MAX. */ +#define is_digit(c) ((unsigned)(c) - '0' <= 9) + +#define LEAPS_THRU_END_OF(y) ((y) / 4 - (y) / 100 + (y) / 400) + +#define BIGGEST(a, b) (((a) > (b)) ? (a) : (b)) + +#ifndef INITIALIZE +#define INITIALIZE(x) ((x) = 0) +#endif /* !defined INITIALIZE */ + +struct ttinfo { /* time type information */ + LONG32 tt_gmtoff; /* UTC offset in seconds */ + int tt_isdst; /* used to set tm_isdst */ + int tt_abbrind; /* abbreviation list index */ + int tt_ttisstd; /* TRUE if transition is std time */ + int tt_ttisgmt; /* TRUE if transition is UTC */ +}; + +struct lsinfo { /* leap second information */ + time_t ls_trans; /* transition time */ + LONG32 ls_corr; /* correction to apply */ +}; + +struct state { + int leapcnt; + int timecnt; + int typecnt; + int charcnt; + time_t ats[TZ_MAX_TIMES]; + unsigned char types[TZ_MAX_TIMES]; + struct ttinfo ttis[TZ_MAX_TYPES]; + char chars[BIGGEST(BIGGEST(TZ_MAX_CHARS + 1, sizeof gmt), (2 * (MY_TZNAME_MAX + 1)))]; + struct lsinfo lsis[TZ_MAX_LEAPS]; +}; + +struct rule { + int r_type; /* type of rule--see below */ + int r_day; /* day number of rule */ + int r_week; /* week number of rule */ + int r_mon; /* month number of rule */ + LONG32 r_time; /* transition time of rule */ +}; + +#define JULIAN_DAY 0 /* Jn - Julian day */ +#define DAY_OF_YEAR 1 /* n - day of year */ +#define MONTH_NTH_DAY_OF_WEEK 2 /* Mm.n.d - month, week, day of week */ + +__BEGIN_DECLS +extern void EFIAPI gmtload(struct state * const sp); +extern void EFIAPI tzset(void); +__END_DECLS + +#endif /* _TIMEVAL_H */ diff --git a/StdLib/LibC/Time/ZoneProc.c b/StdLib/LibC/Time/ZoneProc.c new file mode 100644 index 0000000000..e33b99ed68 --- /dev/null +++ b/StdLib/LibC/Time/ZoneProc.c @@ -0,0 +1,830 @@ +/** @file + Time Zone processing. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Portions derived from the NIH time zone package file, localtime.c, + which contains the following notice: + + This file is in the public domain, so clarified as of + 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov). + + NetBSD: localtime.c,v 1.39 2006/03/22 14:01:30 christos Exp +**/ +#include +#include + +#include +#include +#include +#include +#include +#include +#include "tzfile.h" +#include "TimeVals.h" + +#ifndef WILDABBR +/* +** Someone might make incorrect use of a time zone abbreviation: +** 1. They might reference tzname[0] before calling tzset (explicitly +** or implicitly). +** 2. They might reference tzname[1] before calling tzset (explicitly +** or implicitly). +** 3. They might reference tzname[1] after setting to a time zone +** in which Daylight Saving Time is never observed. +** 4. They might reference tzname[0] after setting to a time zone +** in which Standard Time is never observed. +** 5. They might reference tm.TM_ZONE after calling offtime. +** What's best to do in the above cases is open to debate; +** for now, we just set things up so that in any of the five cases +** WILDABBR is used. Another possibility: initialize tzname[0] to the +** string "tzname[0] used before set", and similarly for the other cases. +** And another: initialize tzname[0] to "ERA", with an explanation in the +** manual page of what this "time zone abbreviation" means (doing this so +** that tzname[0] has the "normal" length of three characters). +*/ +#define WILDABBR " " +#endif /* !defined WILDABBR */ + +const char wildabbr[9] = "WILDABBR"; +const char gmt[4] = "GMT"; + +struct state * lclptr = NULL; +struct state * gmtptr = NULL; + +#ifndef TZ_STRLEN_MAX +#define TZ_STRLEN_MAX 255 +#endif /* !defined TZ_STRLEN_MAX */ + +static char lcl_TZname[TZ_STRLEN_MAX + 1]; +static int lcl_is_set = 0; +//static int gmt_is_set = 0; + +char * tzname[2] = { + (char *)__UNCONST(wildabbr), + (char *)__UNCONST(wildabbr) +}; + +long int timezone = 0; +int daylight = 0; + +#ifndef NO_ZONEINFO_FILES +/** Get first 4 characters of codep as a 32-bit integer. + + The first character of codep becomes the MSB of the resultant integer. +**/ +static INT32 +detzcode(const char * const codep) +{ + register INT32 result; + + /* + ** The first character must be sign extended on systems with >32bit + ** longs. This was solved differently in the master tzcode sources + ** (the fix first appeared in tzcode95c.tar.gz). But I believe + ** that this implementation is superior. + */ +#define SIGN_EXTEND_CHAR(x) ((signed char) x) + + result = (SIGN_EXTEND_CHAR(codep[0]) << 24) \ + | (codep[1] & 0xff) << 16 \ + | (codep[2] & 0xff) << 8 + | (codep[3] & 0xff); + return result; +} +#endif /* NO_ZONEINFO_FILES */ + +static void +settzname (void) +{ + register struct state * const sp = lclptr; + register int i; + + tzname[0] = (char *)__UNCONST(wildabbr); + tzname[1] = (char *)__UNCONST(wildabbr); + daylight = 0; + timezone = 0; + if (sp == NULL) { + tzname[0] = tzname[1] = (char *)__UNCONST(gmt); + return; + } + for (i = 0; i < sp->typecnt; ++i) { + register const struct ttinfo * const ttisp = &sp->ttis[i]; + + tzname[ttisp->tt_isdst] = + &sp->chars[ttisp->tt_abbrind]; + if (ttisp->tt_isdst) + daylight = 1; + if (i == 0 || !ttisp->tt_isdst) + timezone = -(ttisp->tt_gmtoff); + } + /* + ** And to get the latest zone names into tzname. . . + */ + for (i = 0; i < sp->timecnt; ++i) { + register const struct ttinfo * const ttisp = + &sp->ttis[ sp->types[i] ]; + + tzname[ttisp->tt_isdst] = + &sp->chars[ttisp->tt_abbrind]; + } +} + +/* +** Given a pointer into a time zone string, scan until a character that is not +** a valid character in a zone name is found. Return a pointer to that +** character. +*/ +static const char * +getzname(register const char *strp) +{ + register char c; + + while ((c = *strp) != '\0' && !is_digit(c) && c != ',' && c != '-' && + c != '+') + ++strp; + return strp; +} + +/* +** Given a pointer into a time zone string, extract a number from that string. +** Check that the number is within a specified range; if it is not, return +** NULL. +** Otherwise, return a pointer to the first character not part of the number. +*/ +static const char * +getnum( + register const char *strp, + int * const nump, + const int min, + const int max + ) +{ + register char c; + register int num; + + if (strp == NULL || !is_digit(c = *strp)) + return NULL; + num = 0; + do { + num = num * 10 + (c - '0'); + if (num > max) + return NULL; /* illegal value */ + c = *++strp; + } while (is_digit(c)); + if (num < min) + return NULL; /* illegal value */ + *nump = num; + return strp; +} + +/* +** Given a pointer into a time zone string, extract a number of seconds, +** in hh[:mm[:ss]] form, from the string. +** If any error occurs, return NULL. +** Otherwise, return a pointer to the first character not part of the number +** of seconds. +*/ +static const char * +getsecs( + register const char *strp, + LONG32 * const secsp + ) +{ + int num; + + /* + ** `HOURSPERDAY * DAYSPERWEEK - 1' allows quasi-Posix rules like + ** "M10.4.6/26", which does not conform to Posix, + ** but which specifies the equivalent of + ** ``02:00 on the first Sunday on or after 23 Oct''. + */ + strp = getnum(strp, &num, 0, HOURSPERDAY * DAYSPERWEEK - 1); + if (strp == NULL) + return NULL; + *secsp = (long)(num * SECSPERHOUR); + if (*strp == ':') { + ++strp; + strp = getnum(strp, &num, 0, MINSPERHOUR - 1); + if (strp == NULL) + return NULL; + *secsp += num * SECSPERMIN; + if (*strp == ':') { + ++strp; + /* `SECSPERMIN' allows for leap seconds. */ + strp = getnum(strp, &num, 0, SECSPERMIN); + if (strp == NULL) + return NULL; + *secsp += num; + } + } + return strp; +} + +/* +** Given a pointer into a time zone string, extract an offset, in +** [+-]hh[:mm[:ss]] form, from the string. +** If any error occurs, return NULL. +** Otherwise, return a pointer to the first character not part of the time. +*/ +static const char * +getoffset( + register const char *strp, + LONG32 * const offsetp + ) +{ + register int neg = 0; + + if (*strp == '-') { + neg = 1; + ++strp; + } else if (*strp == '+') + ++strp; + strp = getsecs(strp, offsetp); + if (strp == NULL) + return NULL; /* illegal time */ + if (neg) + *offsetp = -*offsetp; + return strp; +} + +/* +** Given a pointer into a time zone string, extract a rule in the form +** date[/time]. See POSIX section 8 for the format of "date" and "time". +** If a valid rule is not found, return NULL. +** Otherwise, return a pointer to the first character not part of the rule. +*/ +static const char * +getrule( + const char *strp, + register struct rule * const rulep + ) +{ + if (*strp == 'J') { + /* + ** Julian day. + */ + rulep->r_type = JULIAN_DAY; + ++strp; + strp = getnum(strp, &rulep->r_day, 1, DAYSPERNYEAR); + } else if (*strp == 'M') { + /* + ** Month, week, day. + */ + rulep->r_type = MONTH_NTH_DAY_OF_WEEK; + ++strp; + strp = getnum(strp, &rulep->r_mon, 1, MONSPERYEAR); + if (strp == NULL) + return NULL; + if (*strp++ != '.') + return NULL; + strp = getnum(strp, &rulep->r_week, 1, 5); + if (strp == NULL) + return NULL; + if (*strp++ != '.') + return NULL; + strp = getnum(strp, &rulep->r_day, 0, DAYSPERWEEK - 1); + } else if (is_digit(*strp)) { + /* + ** Day of year. + */ + rulep->r_type = DAY_OF_YEAR; + strp = getnum(strp, &rulep->r_day, 0, DAYSPERLYEAR - 1); + } else return NULL; /* invalid format */ + if (strp == NULL) + return NULL; + if (*strp == '/') { + /* + ** Time specified. + */ + ++strp; + strp = getsecs(strp, &rulep->r_time); + } else rulep->r_time = 2 * SECSPERHOUR; /* default = 2:00:00 */ + return strp; +} + +static int +tzload(register const char *name, register struct state * const sp) +{ +#ifndef NO_ZONEINFO_FILES + register const char * p; + register int i; + register int fid; + + if (name == NULL && (name = TZDEFAULT) == NULL) + return -1; + + { + register int doaccess; + /* + ** Section 4.9.1 of the C standard says that + ** "FILENAME_MAX expands to an integral constant expression + ** that is the size needed for an array of char large enough + ** to hold the longest file name string that the implementation + ** guarantees can be opened." + */ + char fullname[FILENAME_MAX + 1]; + + if (name[0] == ':') + ++name; + doaccess = name[0] == '/'; + if (!doaccess) { + if ((p = TZDIR) == NULL) + return -1; + if ((strlen(p) + strlen(name) + 1) >= sizeof fullname) + return -1; + (void) strcpy(fullname, p); /* XXX strcpy is safe */ + (void) strcat(fullname, "/"); /* XXX strcat is safe */ + (void) strcat(fullname, name); /* XXX strcat is safe */ + /* + ** Set doaccess if '.' (as in "../") shows up in name. + */ + if (strchr(name, '.') != NULL) + doaccess = TRUE; + name = fullname; + } + if (doaccess && access(name, R_OK) != 0) + return -1; + /* + * XXX potential security problem here if user of a set-id + * program has set TZ (which is passed in as name) here, + * and uses a race condition trick to defeat the access(2) + * above. + */ + if ((fid = open(name, OPEN_MODE)) == -1) + return -1; + } + { + struct tzhead * tzhp; + union { + struct tzhead tzhead; + char buf[sizeof *sp + sizeof *tzhp]; + } u; + int ttisstdcnt; + int ttisgmtcnt; + + i = read(fid, u.buf, sizeof u.buf); + if (close(fid) != 0) + return -1; + ttisstdcnt = (int) detzcode(u.tzhead.tzh_ttisstdcnt); + ttisgmtcnt = (int) detzcode(u.tzhead.tzh_ttisgmtcnt); + sp->leapcnt = (int) detzcode(u.tzhead.tzh_leapcnt); + sp->timecnt = (int) detzcode(u.tzhead.tzh_timecnt); + sp->typecnt = (int) detzcode(u.tzhead.tzh_typecnt); + sp->charcnt = (int) detzcode(u.tzhead.tzh_charcnt); + p = u.tzhead.tzh_charcnt + sizeof u.tzhead.tzh_charcnt; + if (sp->leapcnt < 0 || sp->leapcnt > TZ_MAX_LEAPS || + sp->typecnt <= 0 || sp->typecnt > TZ_MAX_TYPES || + sp->timecnt < 0 || sp->timecnt > TZ_MAX_TIMES || + sp->charcnt < 0 || sp->charcnt > TZ_MAX_CHARS || + (ttisstdcnt != sp->typecnt && ttisstdcnt != 0) || + (ttisgmtcnt != sp->typecnt && ttisgmtcnt != 0)) + return -1; + if (i - (p - u.buf) < sp->timecnt * 4 + /* ats */ + sp->timecnt + /* types */ + sp->typecnt * (4 + 2) + /* ttinfos */ + sp->charcnt + /* chars */ + sp->leapcnt * (4 + 4) + /* lsinfos */ + ttisstdcnt + /* ttisstds */ + ttisgmtcnt) /* ttisgmts */ + return -1; + for (i = 0; i < sp->timecnt; ++i) { + sp->ats[i] = detzcode(p); + p += 4; + } + for (i = 0; i < sp->timecnt; ++i) { + sp->types[i] = (unsigned char) *p++; + if (sp->types[i] >= sp->typecnt) + return -1; + } + for (i = 0; i < sp->typecnt; ++i) { + register struct ttinfo * ttisp; + + ttisp = &sp->ttis[i]; + ttisp->tt_gmtoff = detzcode(p); + p += 4; + ttisp->tt_isdst = (unsigned char) *p++; + if (ttisp->tt_isdst != 0 && ttisp->tt_isdst != 1) + return -1; + ttisp->tt_abbrind = (unsigned char) *p++; + if (ttisp->tt_abbrind < 0 || + ttisp->tt_abbrind > sp->charcnt) + return -1; + } + for (i = 0; i < sp->charcnt; ++i) + sp->chars[i] = *p++; + sp->chars[i] = '\0'; /* ensure '\0' at end */ + for (i = 0; i < sp->leapcnt; ++i) { + register struct lsinfo * lsisp; + + lsisp = &sp->lsis[i]; + lsisp->ls_trans = detzcode(p); + p += 4; + lsisp->ls_corr = detzcode(p); + p += 4; + } + for (i = 0; i < sp->typecnt; ++i) { + register struct ttinfo * ttisp; + + ttisp = &sp->ttis[i]; + if (ttisstdcnt == 0) + ttisp->tt_ttisstd = FALSE; + else { + ttisp->tt_ttisstd = *p++; + if (ttisp->tt_ttisstd != TRUE && + ttisp->tt_ttisstd != FALSE) + return -1; + } + } + for (i = 0; i < sp->typecnt; ++i) { + register struct ttinfo * ttisp; + + ttisp = &sp->ttis[i]; + if (ttisgmtcnt == 0) + ttisp->tt_ttisgmt = FALSE; + else { + ttisp->tt_ttisgmt = *p++; + if (ttisp->tt_ttisgmt != TRUE && + ttisp->tt_ttisgmt != FALSE) + return -1; + } + } + } + return 0; +#else /* ! NO_ZONEINFO_FILES */ + return -1; +#endif +} + +/* +** Given the Epoch-relative time of January 1, 00:00:00 UTC, in a year, the +** year, a rule, and the offset from UTC at the time that rule takes effect, +** calculate the Epoch-relative time that rule takes effect. +*/ +static +time_t +transtime( + const time_t janfirst, + const int year, + const struct rule * const rulep, + const LONG32 offset + ) +{ + register int leapyear; + register time_t value; + register int i; + int d, m1, yy0, yy1, yy2, dow; + + INITIALIZE(value); + leapyear = isleap(year); + switch (rulep->r_type) { + + case JULIAN_DAY: + /* + ** Jn - Julian day, 1 == January 1, 60 == March 1 even in leap + ** years. + ** In non-leap years, or if the day number is 59 or less, just + ** add SECSPERDAY times the day number-1 to the time of + ** January 1, midnight, to get the day. + */ + value = janfirst + (rulep->r_day - 1) * SECSPERDAY; + if (leapyear && rulep->r_day >= 60) + value += SECSPERDAY; + break; + + case DAY_OF_YEAR: + /* + ** n - day of year. + ** Just add SECSPERDAY times the day number to the time of + ** January 1, midnight, to get the day. + */ + value = janfirst + rulep->r_day * SECSPERDAY; + break; + + case MONTH_NTH_DAY_OF_WEEK: + /* + ** Mm.n.d - nth "dth day" of month m. + */ + value = janfirst; + for (i = 0; i < rulep->r_mon - 1; ++i) + value += mon_lengths[leapyear][i] * SECSPERDAY; + + /* + ** Use Zeller's Congruence to get day-of-week of first day of + ** month. + */ + m1 = (rulep->r_mon + 9) % 12 + 1; + yy0 = (rulep->r_mon <= 2) ? (year - 1) : year; + yy1 = yy0 / 100; + yy2 = yy0 % 100; + dow = ((26 * m1 - 2) / 10 + + 1 + yy2 + yy2 / 4 + yy1 / 4 - 2 * yy1) % 7; + if (dow < 0) + dow += DAYSPERWEEK; + + /* + ** "dow" is the day-of-week of the first day of the month. Get + ** the day-of-month (zero-origin) of the first "dow" day of the + ** month. + */ + d = rulep->r_day - dow; + if (d < 0) + d += DAYSPERWEEK; + for (i = 1; i < rulep->r_week; ++i) { + if (d + DAYSPERWEEK >= + mon_lengths[leapyear][rulep->r_mon - 1]) + break; + d += DAYSPERWEEK; + } + + /* + ** "d" is the day-of-month (zero-origin) of the day we want. + */ + value += d * SECSPERDAY; + break; + } + + /* + ** "value" is the Epoch-relative time of 00:00:00 UTC on the day in + ** question. To get the Epoch-relative time of the specified local + ** time on that day, add the transition time and the current offset + ** from UTC. + */ + return value + rulep->r_time + offset; +} + +/* +** Given a POSIX section 8-style TZ string, fill in the rule tables as +** appropriate. +*/ +static int +tzparse( + const char * name, + struct state * const sp, + const int lastditch + ) +{ + const char *stdname; + const char *dstname; + size_t stdlen; + size_t dstlen; + LONG32 stdoffset; + LONG32 dstoffset; + time_t *atp; + unsigned char *typep; + char *cp; + int load_result; + + dstname = NULL; + stdname = name; + if (lastditch) { + stdlen = strlen(name); /* length of standard zone name */ + name += stdlen; + if (stdlen >= sizeof sp->chars) + stdlen = (sizeof sp->chars) - 1; + stdoffset = 0; + } else { + name = getzname(name); + stdlen = name - stdname; + if (stdlen < 3) + return -1; + if (*name == '\0') + return -1; + name = getoffset(name, &stdoffset); + if (name == NULL) + return -1; + } + load_result = tzload(TZDEFRULES, sp); + if (load_result != 0) + sp->leapcnt = 0; /* so, we're off a little */ + if (*name != '\0') { + dstname = name; + name = getzname(name); + dstlen = name - dstname; /* length of DST zone name */ + if (dstlen < 3) + return -1; + if (*name != '\0' && *name != ',' && *name != ';') { + name = getoffset(name, &dstoffset); + if (name == NULL) + return -1; + } else dstoffset = stdoffset - SECSPERHOUR; + if (*name == '\0' && load_result != 0) + name = TZDEFRULESTRING; + if (*name == ',' || *name == ';') { + struct rule start; + struct rule end; + register int year; + register time_t janfirst; + time_t starttime; + time_t endtime; + + ++name; + if ((name = getrule(name, &start)) == NULL) + return -1; + if (*name++ != ',') + return -1; + if ((name = getrule(name, &end)) == NULL) + return -1; + if (*name != '\0') + return -1; + sp->typecnt = 2; /* standard time and DST */ + /* + ** Two transitions per year, from EPOCH_YEAR to 2037. + */ + sp->timecnt = 2 * (2037 - EPOCH_YEAR + 1); + if (sp->timecnt > TZ_MAX_TIMES) + return -1; + sp->ttis[0].tt_gmtoff = -dstoffset; + sp->ttis[0].tt_isdst = 1; + sp->ttis[0].tt_abbrind = (int)stdlen + 1; + sp->ttis[1].tt_gmtoff = -stdoffset; + sp->ttis[1].tt_isdst = 0; + sp->ttis[1].tt_abbrind = 0; + atp = sp->ats; + typep = sp->types; + janfirst = 0; + for (year = EPOCH_YEAR; year <= 2037; ++year) { + starttime = transtime(janfirst, year, &start, + stdoffset); + endtime = transtime(janfirst, year, &end, + dstoffset); + if (starttime > endtime) { + *atp++ = endtime; + *typep++ = 1; /* DST ends */ + *atp++ = starttime; + *typep++ = 0; /* DST begins */ + } else { + *atp++ = starttime; + *typep++ = 0; /* DST begins */ + *atp++ = endtime; + *typep++ = 1; /* DST ends */ + } + janfirst += year_lengths[isleap(year)] * + SECSPERDAY; + } + } else { + register LONG32 theirstdoffset; + register LONG32 theiroffset; + register int i; + register int j; + + if (*name != '\0') + return -1; + /* + ** Initial values of theirstdoffset + */ + theirstdoffset = 0; + for (i = 0; i < sp->timecnt; ++i) { + j = sp->types[i]; + if (!sp->ttis[j].tt_isdst) { + theirstdoffset = + -sp->ttis[j].tt_gmtoff; + break; + } + } + /* + ** Initially we're assumed to be in standard time. + */ + theiroffset = theirstdoffset; + /* + ** Now juggle transition times and types + ** tracking offsets as you do. + */ + for (i = 0; i < sp->timecnt; ++i) { + j = sp->types[i]; + sp->types[i] = (unsigned char)sp->ttis[j].tt_isdst; + if (sp->ttis[j].tt_ttisgmt) { + /* No adjustment to transition time */ + } else { + /* + ** If summer time is in effect, and the + ** transition time was not specified as + ** standard time, add the summer time + ** offset to the transition time; + ** otherwise, add the standard time + ** offset to the transition time. + */ + /* + ** Transitions from DST to DDST + ** will effectively disappear since + ** POSIX provides for only one DST + ** offset. + */ + sp->ats[i] += stdoffset - + theirstdoffset; + } + theiroffset = -sp->ttis[j].tt_gmtoff; + if (!sp->ttis[j].tt_isdst) + theirstdoffset = theiroffset; + } + /* + ** Finally, fill in ttis. + ** ttisstd and ttisgmt need not be handled. + */ + sp->ttis[0].tt_gmtoff = -stdoffset; + sp->ttis[0].tt_isdst = FALSE; + sp->ttis[0].tt_abbrind = 0; + sp->ttis[1].tt_gmtoff = -dstoffset; + sp->ttis[1].tt_isdst = TRUE; + sp->ttis[1].tt_abbrind = (int)stdlen + 1; + sp->typecnt = 2; + } + } else { + dstlen = 0; + sp->typecnt = 1; /* only standard time */ + sp->timecnt = 0; + sp->ttis[0].tt_gmtoff = -stdoffset; + sp->ttis[0].tt_isdst = 0; + sp->ttis[0].tt_abbrind = 0; + } + sp->charcnt = (int)stdlen + 1; + if (dstlen != 0) + sp->charcnt += (int)dstlen + 1; + if ((size_t) sp->charcnt > sizeof sp->chars) + return -1; + cp = sp->chars; + (void) strncpy(cp, stdname, stdlen); + cp += stdlen; + *cp++ = '\0'; + if (dstlen != 0) { + (void) strncpy(cp, dstname, dstlen); + *(cp + dstlen) = '\0'; + } + return 0; +} + +void +EFIAPI +gmtload(struct state * const sp) +{ + if (tzload(gmt, sp) != 0) + (void) tzparse(gmt, sp, TRUE); +} + +static void +tzsetwall(void) +{ + if (lcl_is_set < 0) + return; + lcl_is_set = -1; + + if (lclptr == NULL) { + lclptr = (struct state *) malloc(sizeof *lclptr); + if (lclptr == NULL) { + settzname(); /* all we can do */ + return; + } + } + if (tzload((char *) NULL, lclptr) != 0) + gmtload(lclptr); + settzname(); +} + +void +EFIAPI +tzset(void) +{ + register const char * name; + + name = getenv("TZ"); + if (name == NULL) { + tzsetwall(); + return; + } + + if (lcl_is_set > 0 && strcmp(lcl_TZname, name) == 0) + return; + lcl_is_set = strlen(name) < sizeof lcl_TZname; + if (lcl_is_set) + (void)strncpyX(lcl_TZname, name, sizeof(lcl_TZname)); + + if (lclptr == NULL) { + lclptr = (struct state *) malloc(sizeof *lclptr); + if (lclptr == NULL) { + settzname(); /* all we can do */ + return; + } + } + if (*name == '\0') { + /* + ** User wants it fast rather than right. + */ + lclptr->leapcnt = 0; /* so, we're off a little */ + lclptr->timecnt = 0; + lclptr->typecnt = 0; + lclptr->ttis[0].tt_isdst = 0; + lclptr->ttis[0].tt_gmtoff = 0; + lclptr->ttis[0].tt_abbrind = 0; + (void)strncpyX(lclptr->chars, gmt, sizeof(lclptr->chars)); + } else if (tzload(name, lclptr) != 0) + if (name[0] == ':' || tzparse(name, lclptr, FALSE) != 0) + (void) gmtload(lclptr); + settzname(); +} diff --git a/StdLib/LibC/Time/strftime.c b/StdLib/LibC/Time/strftime.c new file mode 100644 index 0000000000..a9da3e2f7d --- /dev/null +++ b/StdLib/LibC/Time/strftime.c @@ -0,0 +1,602 @@ +/** @file + Implementation of the strftime function for . + + Based on the UCB version with the ID appearing below. + This is ANSIish only when "multibyte character == plain character". + + Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1989, 1993 + The Regents of the University of California. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: + This product includes software developed by the University of + California, Berkeley and its contributors. + 4. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + NetBSD: strftime.c,v 1.17.4.1 2007/08/21 20:08:21 liamjfoy Exp +**/ +#include +#include + +#include "namespace.h" +#include +#include "tzfile.h" +#include +#include "fcntl.h" +#include "locale.h" + +#include "sys/localedef.h" +#include + +/* +** We don't use these extensions in strftime operation even when +** supported by the local tzcode configuration. A strictly +** conforming C application may leave them in undefined state. +*/ + +#ifdef _LIBC +#undef TM_ZONE +#undef TM_GMTOFF +#endif + +#define Locale _CurrentTimeLocale + +static char * EFIAPI _add(const char *, char *, const char * const); +static char * EFIAPI _conv(const int, const char * const, char * const, const char * const); +static char * EFIAPI _fmt(const char *, const struct tm * const, char *, const char * const, int *); + +#define NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU + +#ifndef YEAR_2000_NAME +#define YEAR_2000_NAME "CHECK_STRFTIME_FORMATS_FOR_TWO_DIGIT_YEARS" +#endif /* !defined YEAR_2000_NAME */ + + +#define IN_NONE 0 +#define IN_SOME 1 +#define IN_THIS 2 +#define IN_ALL 3 + +size_t +EFIAPI +strftime( + char * __restrict s, + size_t maxsize, + const char * __restrict format, + const struct tm * __restrict timeptr + ) +{ + char * p; + int warn; + + tzset(); + warn = IN_NONE; + p = _fmt(((format == NULL) ? "%c" : format), timeptr, s, s + maxsize, &warn); + +#ifndef NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU + if (warn != IN_NONE && getenv(YEAR_2000_NAME) != NULL) { + (void) fprintf(stderr, "\n"); + if (format == NULL) + (void) fprintf(stderr, "NULL strftime format "); + else (void) fprintf(stderr, "strftime format \"%s\" ", + format); + (void) fprintf(stderr, "yields only two digits of years in "); + if (warn == IN_SOME) + (void) fprintf(stderr, "some locales"); + else if (warn == IN_THIS) + (void) fprintf(stderr, "the current locale"); + else (void) fprintf(stderr, "all locales"); + (void) fprintf(stderr, "\n"); + } +#endif /* !defined NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU */ + + if (p == s + maxsize) + return 0; + *p = '\0'; + return p - s; +} + +static char * +EFIAPI +_fmt( + const char * format, + const struct tm * const t, + char * pt, + const char * const ptlim, + int * warnp + ) +{ + for ( ; *format; ++format) { + if (*format == '%') { +label: + switch (*++format) { + case '\0': + --format; + break; + case 'A': + pt = _add((t->tm_wday < 0 || + t->tm_wday >= DAYSPERWEEK) ? + "?" : Locale->day[t->tm_wday], + pt, ptlim); + continue; + case 'a': + pt = _add((t->tm_wday < 0 || + t->tm_wday >= DAYSPERWEEK) ? + "?" : Locale->abday[t->tm_wday], + pt, ptlim); + continue; + case 'B': + pt = _add((t->tm_mon < 0 || + t->tm_mon >= MONSPERYEAR) ? + "?" : Locale->mon[t->tm_mon], + pt, ptlim); + continue; + case 'b': + case 'h': + pt = _add((t->tm_mon < 0 || + t->tm_mon >= MONSPERYEAR) ? + "?" : Locale->abmon[t->tm_mon], + pt, ptlim); + continue; + case 'C': + /* + ** %C used to do a... + ** _fmt("%a %b %e %X %Y", t); + ** ...whereas now POSIX 1003.2 calls for + ** something completely different. + ** (ado, 1993-05-24) + */ + pt = _conv((t->tm_year + TM_YEAR_BASE) / 100, + "%02d", pt, ptlim); + continue; + case 'c': + { + int warn2 = IN_SOME; + + pt = _fmt(Locale->d_t_fmt, t, pt, ptlim, &warn2); + if (warn2 == IN_ALL) + warn2 = IN_THIS; + if (warn2 > *warnp) + *warnp = warn2; + } + continue; + case 'D': + pt = _fmt("%m/%d/%y", t, pt, ptlim, warnp); + continue; + case 'd': + pt = _conv(t->tm_mday, "%02d", pt, ptlim); + continue; + case 'E': + case 'O': + /* + ** C99 locale modifiers. + ** The sequences + ** %Ec %EC %Ex %EX %Ey %EY + ** %Od %oe %OH %OI %Om %OM + ** %OS %Ou %OU %OV %Ow %OW %Oy + ** are supposed to provide alternate + ** representations. + */ + goto label; + case 'e': + pt = _conv(t->tm_mday, "%2d", pt, ptlim); + continue; + case 'F': + pt = _fmt("%Y-%m-%d", t, pt, ptlim, warnp); + continue; + case 'H': + pt = _conv(t->tm_hour, "%02d", pt, ptlim); + continue; + case 'I': + pt = _conv((t->tm_hour % 12) ? + (t->tm_hour % 12) : 12, + "%02d", pt, ptlim); + continue; + case 'j': + pt = _conv(t->tm_yday + 1, "%03d", pt, ptlim); + continue; + case 'k': + /* + ** This used to be... + ** _conv(t->tm_hour % 12 ? + ** t->tm_hour % 12 : 12, 2, ' '); + ** ...and has been changed to the below to + ** match SunOS 4.1.1 and Arnold Robbins' + ** strftime version 3.0. That is, "%k" and + ** "%l" have been swapped. + ** (ado, 1993-05-24) + */ + pt = _conv(t->tm_hour, "%2d", pt, ptlim); + continue; +#ifdef KITCHEN_SINK + case 'K': + /* + ** After all this time, still unclaimed! + */ + pt = _add("kitchen sink", pt, ptlim); + continue; +#endif /* defined KITCHEN_SINK */ + case 'l': + /* + ** This used to be... + ** _conv(t->tm_hour, 2, ' '); + ** ...and has been changed to the below to + ** match SunOS 4.1.1 and Arnold Robbin's + ** strftime version 3.0. That is, "%k" and + ** "%l" have been swapped. + ** (ado, 1993-05-24) + */ + pt = _conv((t->tm_hour % 12) ? + (t->tm_hour % 12) : 12, + "%2d", pt, ptlim); + continue; + case 'M': + pt = _conv(t->tm_min, "%02d", pt, ptlim); + continue; + case 'm': + pt = _conv(t->tm_mon + 1, "%02d", pt, ptlim); + continue; + case 'n': + pt = _add("\n", pt, ptlim); + continue; + case 'p': + pt = _add((t->tm_hour >= (HOURSPERDAY / 2)) ? + Locale->am_pm[1] : + Locale->am_pm[0], + pt, ptlim); + continue; + case 'R': + pt = _fmt("%H:%M", t, pt, ptlim, warnp); + continue; + case 'r': + pt = _fmt(Locale->t_fmt_ampm, t, pt, ptlim, + warnp); + continue; + case 'S': + pt = _conv(t->tm_sec, "%02d", pt, ptlim); + continue; + case 's': + { + struct tm tm; + char buf[INT_STRLEN_MAXIMUM( + time_t) + 1]; + time_t mkt; + + tm = *t; + mkt = mktime(&tm); + /* CONSTCOND */ + if (TYPE_SIGNED(time_t)) + (void) sprintf(buf, "%ld", + (long) mkt); + else (void) sprintf(buf, "%lu", + (unsigned long) mkt); + pt = _add(buf, pt, ptlim); + } + continue; + case 'T': + pt = _fmt("%H:%M:%S", t, pt, ptlim, warnp); + continue; + case 't': + pt = _add("\t", pt, ptlim); + continue; + case 'U': + pt = _conv((t->tm_yday + DAYSPERWEEK - + t->tm_wday) / DAYSPERWEEK, + "%02d", pt, ptlim); + continue; + case 'u': + /* + ** From Arnold Robbins' strftime version 3.0: + ** "ISO 8601: Weekday as a decimal number + ** [1 (Monday) - 7]" + ** (ado, 1993-05-24) + */ + pt = _conv((t->tm_wday == 0) ? + DAYSPERWEEK : t->tm_wday, + "%d", pt, ptlim); + continue; + case 'V': /* ISO 8601 week number */ + case 'G': /* ISO 8601 year (four digits) */ + case 'g': /* ISO 8601 year (two digits) */ +/* +** From Arnold Robbins' strftime version 3.0: "the week number of the +** year (the first Monday as the first day of week 1) as a decimal number +** (01-53)." +** (ado, 1993-05-24) +** +** From "http://www.ft.uni-erlangen.de/~mskuhn/iso-time.html" by Markus Kuhn: +** "Week 01 of a year is per definition the first week which has the +** Thursday in this year, which is equivalent to the week which contains +** the fourth day of January. In other words, the first week of a new year +** is the week which has the majority of its days in the new year. Week 01 +** might also contain days from the previous year and the week before week +** 01 of a year is the last week (52 or 53) of the previous year even if +** it contains days from the new year. A week starts with Monday (day 1) +** and ends with Sunday (day 7). For example, the first week of the year +** 1997 lasts from 1996-12-30 to 1997-01-05..." +** (ado, 1996-01-02) +*/ + { + int year; + int yday; + int wday; + int w; + + year = t->tm_year + TM_YEAR_BASE; + yday = t->tm_yday; + wday = t->tm_wday; + for ( ; ; ) { + int len; + int bot; + int top; + + len = isleap(year) ? + DAYSPERLYEAR : + DAYSPERNYEAR; + /* + ** What yday (-3 ... 3) does + ** the ISO year begin on? + */ + bot = ((yday + 11 - wday) % + DAYSPERWEEK) - 3; + /* + ** What yday does the NEXT + ** ISO year begin on? + */ + top = bot - + (len % DAYSPERWEEK); + if (top < -3) + top += DAYSPERWEEK; + top += len; + if (yday >= top) { + ++year; + w = 1; + break; + } + if (yday >= bot) { + w = 1 + ((yday - bot) / + DAYSPERWEEK); + break; + } + --year; + yday += isleap(year) ? + DAYSPERLYEAR : + DAYSPERNYEAR; + } +#ifdef XPG4_1994_04_09 + if ((w == 52 + && t->tm_mon == TM_JANUARY) + || (w == 1 + && t->tm_mon == TM_DECEMBER)) + w = 53; +#endif /* defined XPG4_1994_04_09 */ + if (*format == 'V') + pt = _conv(w, "%02d", + pt, ptlim); + else if (*format == 'g') { + *warnp = IN_ALL; + pt = _conv(year % 100, "%02d", + pt, ptlim); + } else pt = _conv(year, "%04d", + pt, ptlim); + } + continue; + case 'v': + /* + ** From Arnold Robbins' strftime version 3.0: + ** "date as dd-bbb-YYYY" + ** (ado, 1993-05-24) + */ + pt = _fmt("%e-%b-%Y", t, pt, ptlim, warnp); + continue; + case 'W': + pt = _conv((t->tm_yday + DAYSPERWEEK - + (t->tm_wday ? + (t->tm_wday - 1) : + (DAYSPERWEEK - 1))) / DAYSPERWEEK, + "%02d", pt, ptlim); + continue; + case 'w': + pt = _conv(t->tm_wday, "%d", pt, ptlim); + continue; + case 'X': + pt = _fmt(Locale->t_fmt, t, pt, ptlim, warnp); + continue; + case 'x': + { + int warn2 = IN_SOME; + + pt = _fmt(Locale->d_fmt, t, pt, ptlim, &warn2); + if (warn2 == IN_ALL) + warn2 = IN_THIS; + if (warn2 > *warnp) + *warnp = warn2; + } + continue; + case 'y': + *warnp = IN_ALL; + pt = _conv((t->tm_year + TM_YEAR_BASE) % 100, + "%02d", pt, ptlim); + continue; + case 'Y': + pt = _conv(t->tm_year + TM_YEAR_BASE, "%04d", + pt, ptlim); + continue; + case 'Z': +#ifdef TM_ZONE + if (t->TM_ZONE != NULL) + pt = _add(t->TM_ZONE, pt, ptlim); + else +#endif /* defined TM_ZONE */ + if (t->tm_isdst >= 0) + pt = _add(tzname[t->tm_isdst != 0], + pt, ptlim); + /* + ** C99 says that %Z must be replaced by the + ** empty string if the time zone is not + ** determinable. + */ + continue; + case 'z': + { + int diff; + char const * sign; + + if (t->tm_isdst < 0) + continue; +#ifdef TM_GMTOFF + diff = (int)t->TM_GMTOFF; +#else /* !defined TM_GMTOFF */ + /* + ** C99 says that the UTC offset must + ** be computed by looking only at + ** tm_isdst. This requirement is + ** incorrect, since it means the code + ** must rely on magic (in this case + ** altzone and timezone), and the + ** magic might not have the correct + ** offset. Doing things correctly is + ** tricky and requires disobeying C99; + ** see GNU C strftime for details. + ** For now, punt and conform to the + ** standard, even though it's incorrect. + ** + ** C99 says that %z must be replaced by the + ** empty string if the time zone is not + ** determinable, so output nothing if the + ** appropriate variables are not available. + */ +#ifndef STD_INSPIRED + if (t->tm_isdst == 0) +#ifdef USG_COMPAT + diff = -timezone; +#else /* !defined USG_COMPAT */ + continue; +#endif /* !defined USG_COMPAT */ + else +#ifdef ALTZONE + diff = -altzone; +#else /* !defined ALTZONE */ + continue; +#endif /* !defined ALTZONE */ +#else /* defined STD_INSPIRED */ + { + struct tm tmp; + time_t lct, gct; + + /* + ** Get calendar time from t + ** being treated as local. + */ + tmp = *t; /* mktime discards const */ + lct = mktime(&tmp); + + if (lct == (time_t)-1) + continue; + + /* + ** Get calendar time from t + ** being treated as GMT. + **/ + tmp = *t; /* mktime discards const */ + gct = timegm(&tmp); + + if (gct == (time_t)-1) + continue; + + /* LINTED difference will fit int */ + diff = (intmax_t)gct - (intmax_t)lct; + } +#endif /* defined STD_INSPIRED */ +#endif /* !defined TM_GMTOFF */ + if (diff < 0) { + sign = "-"; + diff = -diff; + } else sign = "+"; + pt = _add(sign, pt, ptlim); + diff /= 60; + pt = _conv((diff/60)*100 + diff%60, + "%04d", pt, ptlim); + } + continue; +#if 0 + case '+': + pt = _fmt(Locale->date_fmt, t, pt, ptlim, + warnp); + continue; +#endif + case '%': + /* + ** X311J/88-090 (4.12.3.5): if conversion char is + ** undefined, behavior is undefined. Print out the + ** character itself as printf(3) also does. + */ + default: + break; + } + } + if (pt == ptlim) + break; + *pt++ = *format; + } + return pt; +} + +static char * +EFIAPI +_conv( + const int n, + const char * const format, + char * const pt, + const char * const ptlim +) +{ + char buf[INT_STRLEN_MAXIMUM(int) + 1]; + + (void) sprintf(buf, format, n); + return _add(buf, pt, ptlim); +} + +static char * +EFIAPI +_add( + const char * str, + char * pt, + const char * const ptlim +) +{ + while (pt < ptlim && (*pt = *str++) != '\0') + ++pt; + return pt; +} diff --git a/StdLib/LibC/Time/tzfile.h b/StdLib/LibC/Time/tzfile.h new file mode 100644 index 0000000000..11c20ebd39 --- /dev/null +++ b/StdLib/LibC/Time/tzfile.h @@ -0,0 +1,168 @@ +/** @file + Time Zone processing, declarations and macros. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Derived from the NIH time zone package file, tzfile.h, which contains the following notice: + + This file is in the public domain, so clarified as of + 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov). + + This header is for use ONLY with the time conversion code. + There is no guarantee that it will remain unchanged, + or that it will remain at all. + Do NOT copy it to any system include directory. + Thank you! + + NetBSD: tzfile.h,v 1.8 1998/01/22 07:06:59 jtc Exp +**/ +#ifndef TZFILE_H +#define TZFILE_H + +/* +** Information about time zone files. +*/ + +#ifndef TZDIR /* Time zone object file directory */ +#define TZDIR "/usr/share/zoneinfo" +#endif /* !defined TZDIR */ + +#ifndef TZDEFAULT +#define TZDEFAULT "/etc/localtime" +#endif /* !defined TZDEFAULT */ + +#ifndef TZDEFRULES +#define TZDEFRULES "posixrules" +#endif /* !defined TZDEFRULES */ + +/* +** Each file begins with. . . +*/ + +#define TZ_MAGIC "TZif" + +struct tzhead { + char tzh_magic[4]; /* TZ_MAGIC */ + char tzh_reserved[16]; /* reserved for future use */ + char tzh_ttisgmtcnt[4]; /* coded number of trans. time flags */ + char tzh_ttisstdcnt[4]; /* coded number of trans. time flags */ + char tzh_leapcnt[4]; /* coded number of leap seconds */ + char tzh_timecnt[4]; /* coded number of transition times */ + char tzh_typecnt[4]; /* coded number of local time types */ + char tzh_charcnt[4]; /* coded number of abbr. chars */ +}; + +/* +** . . .followed by. . . +** +** tzh_timecnt (char [4])s coded transition times a la time(2) +** tzh_timecnt (unsigned char)s types of local time starting at above +** tzh_typecnt repetitions of +** one (char [4]) coded UTC offset in seconds +** one (unsigned char) used to set tm_isdst +** one (unsigned char) that's an abbreviation list index +** tzh_charcnt (char)s '\0'-terminated zone abbreviations +** tzh_leapcnt repetitions of +** one (char [4]) coded leap second transition times +** one (char [4]) total correction after above +** tzh_ttisstdcnt (char)s indexed by type; if TRUE, transition +** time is standard time, if FALSE, +** transition time is wall clock time +** if absent, transition times are +** assumed to be wall clock time +** tzh_ttisgmtcnt (char)s indexed by type; if TRUE, transition +** time is UTC, if FALSE, +** transition time is local time +** if absent, transition times are +** assumed to be local time +*/ + +/* +** In the current implementation, "tzset()" refuses to deal with files that +** exceed any of the limits below. +*/ + +#ifndef TZ_MAX_TIMES +/* +** The TZ_MAX_TIMES value below is enough to handle a bit more than a +** year's worth of solar time (corrected daily to the nearest second) or +** 138 years of Pacific Presidential Election time +** (where there are three time zone transitions every fourth year). +*/ +#define TZ_MAX_TIMES 370 +#endif /* !defined TZ_MAX_TIMES */ + +#ifndef TZ_MAX_TYPES +#ifndef NOSOLAR +#define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */ +#endif /* !defined NOSOLAR */ +#ifdef NOSOLAR +/* +** Must be at least 14 for Europe/Riga as of Jan 12 1995, +** as noted by Earl Chew . +*/ +#define TZ_MAX_TYPES 20 /* Maximum number of local time types */ +#endif /* !defined NOSOLAR */ +#endif /* !defined TZ_MAX_TYPES */ + +#ifndef TZ_MAX_CHARS +#define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */ + /* (limited by what unsigned chars can hold) */ +#endif /* !defined TZ_MAX_CHARS */ + +#ifndef TZ_MAX_LEAPS +#define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */ +#endif /* !defined TZ_MAX_LEAPS */ + +#define SECSPERMIN 60 +#define MINSPERHOUR 60 +#define HOURSPERDAY 24 +#define DAYSPERWEEK 7 +#define DAYSPERNYEAR 365 +#define DAYSPERLYEAR 366 +#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR) +#define SECSPERDAY ((LONG32)(SECSPERHOUR * HOURSPERDAY)) +#define MONSPERYEAR 12 + +#define TM_SUNDAY 0 +#define TM_MONDAY 1 +#define TM_TUESDAY 2 +#define TM_WEDNESDAY 3 +#define TM_THURSDAY 4 +#define TM_FRIDAY 5 +#define TM_SATURDAY 6 + +#define TM_JANUARY 0 +#define TM_FEBRUARY 1 +#define TM_MARCH 2 +#define TM_APRIL 3 +#define TM_MAY 4 +#define TM_JUNE 5 +#define TM_JULY 6 +#define TM_AUGUST 7 +#define TM_SEPTEMBER 8 +#define TM_OCTOBER 9 +#define TM_NOVEMBER 10 +#define TM_DECEMBER 11 + +#define TM_YEAR_BASE 1900 + +#define EPOCH_YEAR 1970 +#define EPOCH_WDAY TM_THURSDAY // Use this for 32-bit time_t +//#define EPOCH_WDAY TM_SUNDAY // Use this for 64-bit time_t + +/* +** Accurate only for the past couple of centuries; +** that will probably do. +*/ + +#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) + +#endif /* !defined TZFILE_H */ diff --git a/StdLib/LibC/Uefi/Console.c b/StdLib/LibC/Uefi/Console.c new file mode 100644 index 0000000000..0c3a21cf45 --- /dev/null +++ b/StdLib/LibC/Uefi/Console.c @@ -0,0 +1,393 @@ +/** @file + File abstractions of the console. + + Manipulates EFI_FILE_PROTOCOL abstractions for stdin, stdout, stderr. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +static const CHAR16 * stdioNames[NUM_SPECIAL] = { + L"stdin:", L"stdout:", L"stderr:" +}; +static const int stdioFlags[NUM_SPECIAL] = { + O_RDONLY, // stdin + O_WRONLY, // stdout + O_WRONLY // stderr +}; + +static const int stdioMode[NUM_SPECIAL] = { + 0444, // stdin + 0222, // stdout + 0222 // stderr +}; + +static +EFI_STATUS +EFIAPI +ConClose( + IN EFI_FILE_PROTOCOL *This + ) +{ + ConInstance *Stream; + + Stream = BASE_CR(This, ConInstance, Abstraction); + // Quick check to see if Stream looks reasonable + if(Stream->Cookie != 0x62416F49) { // Cookie == 'IoAb' + return RETURN_INVALID_PARAMETER; // Looks like a bad This pointer + } + // Nothing to Flush. + // Mark the Stream as closed. + Stream->Dev = NULL; + + return RETURN_SUCCESS; +} + +static +EFI_STATUS +EFIAPI +ConDelete( + IN EFI_FILE_PROTOCOL *This + ) +{ + return RETURN_UNSUPPORTED; +} + +static +EFI_STATUS +EFIAPI +ConRead( + IN EFI_FILE_PROTOCOL *This, + IN OUT UINTN *BufferSize, + OUT VOID *Buffer + ) +{ + EFI_SIMPLE_TEXT_INPUT_PROTOCOL *Proto; + ConInstance *Stream; + CHAR16 *OutPtr; + EFI_INPUT_KEY Key; + UINTN NumChar; + UINTN Edex; + EFI_STATUS Status; + UINTN i; + + Stream = BASE_CR(This, ConInstance, Abstraction); + // Quick check to see if Stream looks reasonable + if(Stream->Cookie != 0x62416F49) { // Cookie == 'IoAb' + return RETURN_INVALID_PARAMETER; // Looks like a bad This pointer + } + if(Stream->Dev == NULL) { + // Can't read from an unopened Stream + return RETURN_DEVICE_ERROR; + } + if(Stream != &gMD->StdIo[0]) { + // Read only valid for stdin + return RETURN_UNSUPPORTED; + } + // It looks like things are OK for trying to read + // We will accumulate *BufferSize characters or until we encounter + // an "activation" character. Currently any control character. + Proto = (EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)Stream->Dev; + OutPtr = Buffer; + NumChar = (*BufferSize - 1) / sizeof(CHAR16); + i = 0; + do { + Status = gBS->WaitForEvent( 1, &Proto->WaitForKey, &Edex); + if(Status != EFI_SUCCESS) { + break; + } + Status = Proto->ReadKeyStroke(Proto, &Key); + if(Status != EFI_SUCCESS) { + break; + } + if(Key.ScanCode == SCAN_NULL) { + *OutPtr++ = Key.UnicodeChar; + ++i; + } + if(Key.UnicodeChar < 0x0020) { // If a control character, or a scan code + break; + } + } while(i < NumChar); + *BufferSize = i * sizeof(CHAR16); + return Status; +} + +/* Write a NULL terminated WCS to the EFI console. + + @param[in,out] BufferSize Number of bytes in Buffer. Set to zero if + the string couldn't be displayed. + @parem[in] Buffer The WCS string to be displayed + +*/ +static +EFI_STATUS +EFIAPI +ConWrite( + IN EFI_FILE_PROTOCOL *This, + IN OUT UINTN *BufferSize, + IN VOID *Buffer + ) +{ + EFI_STATUS Status; + EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *Proto; + ConInstance *Stream; + CHAR16 *MyBuf; + UINTN NumChar; + + Stream = BASE_CR(This, ConInstance, Abstraction); + // Quick check to see if Stream looks reasonable + if(Stream->Cookie != 0x62416F49) { // Cookie == 'IoAb' + return RETURN_INVALID_PARAMETER; // Looks like a bad This pointer + } + if(Stream->Dev == NULL) { + // Can't write to an unopened Stream + return RETURN_DEVICE_ERROR; + } + if(Stream == &gMD->StdIo[0]) { + // Write is not valid for stdin + return RETURN_UNSUPPORTED; + } + // Everything is OK to do the write. + Proto = (EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *)Stream->Dev; + MyBuf = (CHAR16 *)Buffer; + NumChar = *BufferSize; + + // Send MyBuf to the console + Status = Proto->OutputString( Proto, MyBuf); + // Depending on status, update BufferSize and return + if(Status != EFI_SUCCESS) { + *BufferSize = 0; // We don't really know how many characters made it out + } + else { + *BufferSize = NumChar; + Stream->NumWritten += NumChar; + } + return Status; +} + +static +EFI_STATUS +EFIAPI +ConGetPosition( + IN EFI_FILE_PROTOCOL *This, + OUT UINT64 *Position + ) +{ + ConInstance *Stream; + EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *Proto; + XYoffset CursorPos; + + Stream = BASE_CR(This, ConInstance, Abstraction); + // Quick check to see if Stream looks reasonable + if(Stream->Cookie != 0x62416F49) { // Cookie == 'IoAb' + return RETURN_INVALID_PARAMETER; // Looks like a bad This pointer + } + if(Stream == &gMD->StdIo[0]) { + // This is stdin + *Position = Stream->NumRead; + } + else { + Proto = (EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *)Stream->Dev; + CursorPos.XYpos.Column = (UINT32)Proto->Mode->CursorColumn; + CursorPos.XYpos.Row = (UINT32)Proto->Mode->CursorRow; + *Position = CursorPos.Offset; + } + return RETURN_SUCCESS; +} + +static +EFI_STATUS +EFIAPI +ConSetPosition( + IN EFI_FILE_PROTOCOL *This, + IN UINT64 Position + ) +{ + ConInstance *Stream; + EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *Proto; + XYoffset CursorPos; + + Stream = BASE_CR(This, ConInstance, Abstraction); + // Quick check to see if Stream looks reasonable + if(Stream->Cookie != 0x62416F49) { // Cookie == 'IoAb' + return RETURN_INVALID_PARAMETER; // Looks like a bad This pointer + } + if(Stream->Dev == NULL) { + // Can't write to an unopened Stream + return RETURN_DEVICE_ERROR; + } + if(Stream == &gMD->StdIo[0]) { + // Seek is not valid for stdin + return RETURN_UNSUPPORTED; + } + // Everything is OK to do the final verification and "seek". + Proto = (EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *)Stream->Dev; + CursorPos.Offset = Position; + + return Proto->SetCursorPosition(Proto, + (INTN)CursorPos.XYpos.Column, + (INTN)CursorPos.XYpos.Row); +} + +static +EFI_STATUS +EFIAPI +ConGetInfo( + IN EFI_FILE_PROTOCOL *This, + IN EFI_GUID *InformationType, + IN OUT UINTN *BufferSize, + OUT VOID *Buffer + ) +{ + EFI_FILE_INFO *InfoBuf; + ConInstance *Stream; + + Stream = BASE_CR(This, ConInstance, Abstraction); + // Quick check to see if Stream looks reasonable + if((Stream->Cookie != 0x62416F49) || // Cookie == 'IoAb' + (Buffer == NULL)) + { + return RETURN_INVALID_PARAMETER; + } + if(*BufferSize < sizeof(EFI_FILE_INFO)) { + *BufferSize = sizeof(EFI_FILE_INFO); + return RETURN_BUFFER_TOO_SMALL; + } + // All of our parameters are correct, so fill in the information. + (void) ZeroMem(Buffer, sizeof(EFI_FILE_INFO)); + InfoBuf = (EFI_FILE_INFO *)Buffer; + InfoBuf->Size = sizeof(EFI_FILE_INFO); + InfoBuf->FileSize = 1; + InfoBuf->PhysicalSize = 1; + *BufferSize = sizeof(EFI_FILE_INFO); + + return RETURN_SUCCESS; +} + +static +EFI_STATUS +EFIAPI +ConSetInfo( + IN EFI_FILE_PROTOCOL *This, + IN EFI_GUID *InformationType, + IN UINTN BufferSize, + IN VOID *Buffer + ) +{ + return RETURN_UNSUPPORTED; +} + +static +EFI_STATUS +EFIAPI +ConFlush( + IN EFI_FILE_PROTOCOL *This + ) +{ + return RETURN_SUCCESS; +} + +EFI_STATUS +EFIAPI +ConOpen( + IN EFI_FILE_PROTOCOL *This, + OUT EFI_FILE_PROTOCOL **NewHandle, + IN CHAR16 *FileName, + IN UINT64 OpenMode, // Ignored + IN UINT64 Attributes // Ignored + ) +{ + ConInstance *Stream; + EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *Proto; + UINTN Columns; + UINTN Rows; + int i; + + if((NewHandle == NULL) || + (FileName == NULL)) + { + return RETURN_INVALID_PARAMETER; + } + // Process FileName + for(i = 0; i < NUM_SPECIAL; ++i) { + if(StrCmp( stdioNames[i], FileName) == 0) { + break; + } + } + if(i >= NUM_SPECIAL) { + return RETURN_NO_MAPPING; + } + // Get pointer to instance. + Stream = &gMD->StdIo[i]; + if(Stream->Dev == NULL) { + // If this stream has been closed, then + // Initialize instance. + Stream->Cookie = 0x62416F49; + Stream->NumRead = 0; + Stream->NumWritten = 0; + switch(i) { + case 0: + Stream->Dev = gST->ConIn; + break; + case 1: + Stream->Dev = gST->ConOut; + break; + case 2: + if(gST->StdErr == NULL) { + Stream->Dev = gST->ConOut; + } + else { + Stream->Dev = gST->StdErr; + } + break; + default: + return RETURN_VOLUME_CORRUPTED; // This is a "should never happen" case. + } + Stream->Abstraction.Revision = 0x00010000; + Stream->Abstraction.Open = &ConOpen; + Stream->Abstraction.Close = &ConClose; + Stream->Abstraction.Delete = &ConDelete; + Stream->Abstraction.Read = &ConRead; + Stream->Abstraction.Write = &ConWrite; + Stream->Abstraction.GetPosition = &ConGetPosition; + Stream->Abstraction.SetPosition = &ConSetPosition; + Stream->Abstraction.GetInfo = &ConGetInfo; + Stream->Abstraction.SetInfo = &ConSetInfo; + Stream->Abstraction.Flush = &ConFlush; + // Get additional information if this is an Output stream + if(i != 0) { + Proto = Stream->Dev; + Stream->ConOutMode = Proto->Mode->Mode; + if( Proto->QueryMode(Proto, Stream->ConOutMode, &Columns, &Rows) != RETURN_SUCCESS) { + Stream->Dev = NULL; // Mark this stream as closed + return RETURN_INVALID_PARAMETER; + } + Stream->MaxConXY.XYpos.Column = (UINT32)Columns; + Stream->MaxConXY.XYpos.Row = (UINT32)Rows; + } + } + // Save NewHandle and return. + *NewHandle = &Stream->Abstraction; + + return RETURN_SUCCESS; +} diff --git a/StdLib/LibC/Uefi/SysCalls.c b/StdLib/LibC/Uefi/SysCalls.c new file mode 100644 index 0000000000..624d45878e --- /dev/null +++ b/StdLib/LibC/Uefi/SysCalls.c @@ -0,0 +1,1198 @@ +/** @file + EFI versions of NetBSD system calls. + + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include "SysEfi.h" +#include +#include // Library/include/extern.h: Private to implementation +#include + +/* Macros only used in this file. */ +// Parameters for the ValidateFD function. +#define VALID_OPEN 1 +#define VALID_CLOSED 0 +#define VALID_DONT_CARE -1 + + +/* EFI versions of BSD system calls used in stdio */ + +/* Normalize path so that forward slashes are replaced with backslashes. + Backslashes are required for UEFI. +*/ +static void +NormalizePath( const CHAR16 *path) +{ + CHAR16 *temp; + + for( temp = (CHAR16 *)path; *temp; ++temp) { + if(*temp == L'/') { + *temp = L'\\'; + } + } +} + +/* Validate that fd refers to a valid file descriptor. + IsOpen is interpreted as follows: + - Positive fd must be OPEN + - Zero fd must be CLOSED + - Negative fd may be OPEN or CLOSED + + @retval TRUE fd is VALID + @retval FALSE fd is INVALID +*/ +static BOOLEAN +ValidateFD( int fd, int IsOpen) +{ + BOOLEAN retval = FALSE; + + if((fd >= 0) && (fd < OPEN_MAX)) { + retval = TRUE; + if(IsOpen >= 0) { + retval = (BOOLEAN)(gMD->fdarray[fd].State != 0); // TRUE if OPEN + if(IsOpen == VALID_CLOSED) { + retval = (BOOLEAN)!retval; // We want TRUE if CLOSED + } + } + } + return retval; +} + +/* Find and reserve a free File Descriptor. + + Returns the first free File Descriptor greater than or equal to the, + already validated, fd specified by Minfd. + + @return Returns -1 if there are no free FDs. Otherwise returns the + found fd. +*/ +static int +FindFreeFD( int MinFd ) +{ + struct __filedes *Mfd; + int i; + int fd = -1; + + Mfd = gMD->fdarray; + + // Get an available fd + for(i=MinFd; i < OPEN_MAX; ++i) { + if(Mfd[i].State == 0) { + Mfd[i].State = S_ISYSTEM; // Temporarily mark this fd as reserved + fd = i; + break; + } + } + return fd; +} + +/** The isatty() function tests whether fildes, an open file descriptor, + is associated with a terminal device. + + @retval 1 fildes is associated with a terminal. + @retval 0 fildes is not associated with a terminal. errno is set to + EBADF if fildes is not a valid open FD. +**/ +int +isatty (int fildes) +{ + int retval = 0; + EFI_FILE_HANDLE FileHandle; + + if(ValidateFD( fildes, VALID_OPEN)) { + FileHandle = gMD->fdarray[fildes].FileHandle; + retval = (FileHandle >= &gMD->StdIo[0].Abstraction) && + (FileHandle <= &gMD->StdIo[2].Abstraction); + } + else { + errno = EBADF; + } + return retval; +} + +static BOOLEAN +IsDupFd( int fd) +{ + EFI_FILE_HANDLE FileHandle; + int i; + BOOLEAN Ret = FALSE; + + if(ValidateFD( fd, VALID_OPEN )) { + FileHandle = gMD->fdarray[fd].FileHandle; + for(i=0; i < OPEN_MAX; ++i) { + if(i == fd) continue; + if(gMD->fdarray[i].State != 0) { // TRUE if fd is OPEN + if(gMD->fdarray[i].FileHandle == FileHandle) { + Ret = TRUE; + break; + } + } + } + } + return Ret; +} + +static int +_closeX (int fd, int NewState) +{ + struct __filedes *Mfd; + RETURN_STATUS Status; + int retval = 0; + + Status = EFIerrno = RETURN_SUCCESS; // In case of error before the EFI call. + + // Verify my pointers and get my FD. + if(ValidateFD( fd, VALID_OPEN )) { + Mfd = &gMD->fdarray[fd]; + // Check if there are duplicates using this FileHandle + if(! IsDupFd(fd)) { + // Only do the close if no one else is using the FileHandle + if(isatty(fd)) { + Status = Mfd->FileHandle->Close( Mfd->FileHandle); + } + else { + Status = ShellCloseFile( (SHELL_FILE_HANDLE *)&Mfd->FileHandle); + } + } + Mfd->State = NewState; // Close this FD or reserve it + if(Status != RETURN_SUCCESS) { + errno = EFI2errno(Status); + EFIerrno = Status; + retval = -1; + } + } + else { + // Bad FD + errno = EBADF; + retval = -1; + } + return retval; +} + +/** The close() function shall deallocate the file descriptor indicated by fd. + To deallocate means to make the file descriptor available for return by + subsequent calls to open() or other functions that allocate file + descriptors. All outstanding record locks owned by the process on the file + associated with the file descriptor shall be removed (that is, unlocked). + + @return Upon successful completion, 0 shall be returned; otherwise, + -1 shall be returned and errno set to indicate the error. +**/ +int +close (int fd) +{ + //Print(L"Closing fd %d\n", fd); + return _closeX(fd, 0); +} + +/* Wide character version of unlink */ +int +Uunlink (const wchar_t *Path) +{ + EFI_FILE_HANDLE FileHandle; + RETURN_STATUS Status; + + EFIerrno = RETURN_SUCCESS; + + NormalizePath( Path); + // We can only delete open files. + Status = ShellOpenFileByName( Path, (SHELL_FILE_HANDLE *)&FileHandle, 3, 0); + if(Status != RETURN_SUCCESS) { + errno = EFI2errno(Status); + EFIerrno = Status; + return -1; + } + Status = ShellDeleteFile( (SHELL_FILE_HANDLE *)&FileHandle); + if(Status != RETURN_SUCCESS) { + errno = EFI2errno(Status); + EFIerrno = Status; + return -1; + } + return 0; +} + +/** +**/ +int +unlink (const char *path) +{ + // Convert path from MBCS to WCS + (void)AsciiStrToUnicodeStr( path, gMD->UString); + + return Uunlink(gMD->UString); +} + +/** The fcntl() function shall perform the operations described below on open + files. The fildes argument is a file descriptor. + + The available values for cmd are defined in and are as follows: + - F_DUPFD - Return a new file descriptor which shall be the lowest + numbered available (that is, not already open) file + descriptor greater than or equal to the third argument, arg, + taken as an integer of type int. The new file descriptor + shall refer to the same open file description as the original + file descriptor, and shall share any locks. The FD_CLOEXEC + flag associated with the new file descriptor shall be cleared + to keep the file open across calls to one of the exec functions. + - F_GETFD - Get the file descriptor flags defined in that are + associated with the file descriptor fildes. File descriptor + flags are associated with a single file descriptor and do not + affect other file descriptors that refer to the same file. + - F_SETFD - Set the file descriptor flags defined in , that are + associated with fildes, to the third argument, arg, taken + as type int. If the FD_CLOEXEC flag in the third argument + is 0, the file shall remain open across the exec + functions; otherwise, the file shall be closed upon + successful execution of one of the exec functions. + - F_GETFL - Get the file status flags and file access modes, defined in + , for the file description associated with fildes. + The file access modes can be extracted from the return + value using the mask O_ACCMODE, which is defined in + . File status flags and file access modes are + associated with the file description and do not affect + other file descriptors that refer to the same file with + different open file descriptions. + - F_SETFL - Set the file status flags, defined in , for the file + description associated with fildes from the corresponding + bits in the third argument, arg, taken as type int. Bits + corresponding to the file access mode and the file creation + flags, as defined in , that are set in arg shall + be ignored. If any bits in arg other than those mentioned + here are changed by the application, the result is unspecified. + - F_GETOWN - If fildes refers to a socket, get the process or process group + ID specified to receive SIGURG signals when out-of-band + data is available. Positive values indicate a process ID; + negative values, other than -1, indicate a process group + ID. If fildes does not refer to a socket, the results are + unspecified. + - F_SETOWN - If fildes refers to a socket, set the process or process + group ID specified to receive SIGURG signals when + out-of-band data is available, using the value of the third + argument, arg, taken as type int. Positive values indicate + a process ID; negative values, other than -1, indicate a + process group ID. If fildes does not refer to a socket, the + results are unspecified. + + The fcntl() function shall fail if: + + [EBADF] The fildes argument is not a valid open file descriptor. + [EINVAL] The cmd argument is invalid, or the cmd argument is F_DUPFD + and arg is negative or greater than or equal to {OPEN_MAX}. + [EMFILE] The argument cmd is F_DUPFD and {OPEN_MAX} file descriptors + are currently open in the calling process, or no file + descriptors greater than or equal to arg are available. + [EOVERFLOW] One of the values to be returned cannot be represented correctly. + + @return Upon successful completion, the value returned shall depend on + cmd as follows: + - F_DUPFD - A new file descriptor. + - F_GETFD - Value of flags defined in . The return value + shall not be negative. + - F_SETFD - Value other than -1. + - F_GETFL - Value of file status flags and access modes. The return + value is not negative. + - F_SETFL - Value other than -1. + - F_GETOWN - Value of the socket owner process or process group; + this will not be -1. + - F_SETOWN - Value other than -1. + Otherwise, -1 shall be returned and errno set to indicate the error. + +**/ +int +fcntl (int fildes, int cmd, ...) +{ + va_list p3; + struct __filedes *MyFd; + int retval = -1; + int temp; + +//Print(L"%a( %d, %d, ...)\n", __func__, fildes, cmd); + va_start(p3, cmd); + + if(ValidateFD( fildes, VALID_OPEN )) { + MyFd = &gMD->fdarray[fildes]; + + switch(cmd) { + case F_DUPFD: + temp = va_arg(p3, int); + if(ValidateFD( temp, VALID_DONT_CARE )) { + temp = FindFreeFD( temp ); + if(temp < 0) { + errno = EMFILE; + break; + } + /* temp is now a valid fd reserved for further use + so copy fd into temp. + */ + (void)memcpy(&gMD->fdarray[temp], MyFd, sizeof(struct __filedes)); + retval = temp; + } + else { + errno = EINVAL; + } + break; + //case F_SETFD: + case F_SETFL: + retval = MyFd->Oflags; // Get original value + temp = va_arg(p3, int); + temp &= O_SETMASK; // Only certain bits can be set + temp |= retval & O_SETMASK; + MyFd->Oflags = temp; // Set new value + break; + //case F_SETFL: + case F_SETFD: + retval = MyFd->State; + break; + case F_SETOWN: + retval = MyFd->SocProc; + MyFd->SocProc = va_arg(p3, int); + break; + case F_GETFD: + //retval = MyFd->Oflags; + retval = MyFd->State; + break; + case F_GETFL: + //retval = MyFd->State; + retval = MyFd->Oflags; + break; + case F_GETOWN: + retval = MyFd->SocProc; + break; + default: + errno = EINVAL; + break; + } + } + else { + // Bad FD + errno = EBADF; + } + va_end(p3); + return retval;; +} + +/** The dup() function provides an alternative interface to the + service provided by fcntl() using the F_DUPFD command. The call: + - fid = dup(fildes); + shall be equivalent to: + - fid = fcntl(fildes, F_DUPFD, 0); + + @return Upon successful completion a non-negative integer, namely the + file descriptor, shall be returned; otherwise, -1 shall be + returned and errno set to indicate the error. +**/ +int +dup (int fildes) +{ + return fcntl(fildes, F_DUPFD, 0); +} + +/** The dup2() function provides an alternative interface to the + service provided by fcntl() using the F_DUPFD command. The call: + - fid = dup2(fildes, fildes2); + shall be equivalent to: + - close(fildes2); + - fid = fcntl(fildes, F_DUPFD, fildes2); + except for the following: + - If fildes2 is less than 0 or greater than or equal to {OPEN_MAX}, + dup2() shall return -1 with errno set to [EBADF]. + - If fildes is a valid file descriptor and is equal to fildes2, dup2() + shall return fildes2 without closing it. + - If fildes is not a valid file descriptor, dup2() shall return -1 and + shall not close fildes2. + - The value returned shall be equal to the value of fildes2 upon + successful completion, or -1 upon failure. + + @return Upon successful completion a non-negative integer, namely + fildes2, shall be returned; otherwise, -1 shall be + returned and errno set to EBADF indicate the error. +**/ +int +dup2 (int fildes, int fildes2) +{ + int retval = -1; + + if(ValidateFD( fildes, VALID_OPEN)) { + retval = fildes2; + if( fildes != fildes2) { + if(ValidateFD( fildes2, VALID_DONT_CARE)) { + gMD->fdarray[fildes2].State = S_ISYSTEM; // Mark the file closed, but reserved + (void)memcpy(&gMD->fdarray[fildes2], // Duplicate fildes into fildes2 + &gMD->fdarray[fildes], sizeof(struct __filedes)); + } + else { + errno = EBADF; + retval = -1; + } + } + } + else { + errno = EBADF; + } + return retval; +} + +/** Reposition a file's read/write offset. + + The lseek() function repositions the offset of the file descriptor fildes + to the argument offset according to the directive how. The argument + fildes must be an open file descriptor. lseek() repositions the file + pointer fildes as follows: + + If how is SEEK_SET, the offset is set to offset bytes. + + If how is SEEK_CUR, the offset is set to its current location + plus offset bytes. + + If how is SEEK_END, the offset is set to the size of the file + plus offset bytes. + + The lseek() function allows the file offset to be set beyond the end of + the existing end-of-file of the file. If data is later written at this + point, subsequent reads of the data in the gap return bytes of zeros + (until data is actually written into the gap). + + Some devices are incapable of seeking. The value of the pointer associ- + ated with such a device is undefined. + + @return Upon successful completion, lseek() returns the resulting offset + location as measured in bytes from the beginning of the file. + Otherwise, a value of -1 is returned and errno is set to + indicate the error. +**/ +__off_t +lseek (int fildes, __off_t offset, int how) +{ + __off_t CurPos = -1; + RETURN_STATUS Status = RETURN_SUCCESS; + EFI_FILE_HANDLE FileHandle; + + EFIerrno = RETURN_SUCCESS; // In case of error without an EFI call + + if( how == SEEK_SET || how == SEEK_CUR || how == SEEK_END) { + if(ValidateFD( fildes, VALID_OPEN)) { + // Both of our parameters have been verified as valid + FileHandle = gMD->fdarray[fildes].FileHandle; + CurPos = 0; + if(isatty(fildes)) { + Status = FileHandle->SetPosition( FileHandle, offset); + CurPos = offset; + } + else { + if(how != SEEK_SET) { + // We are doing a relative seek + if(how == SEEK_END) { + // seeking relative to EOF, so position there first. + Status = ShellSetFilePosition( (SHELL_FILE_HANDLE)FileHandle, 0xFFFFFFFFFFFFFFFFULL); + } + if(Status == RETURN_SUCCESS) { + // Now, determine our current position. + Status = ShellGetFilePosition( (SHELL_FILE_HANDLE)FileHandle, (UINT64 *)&CurPos); + } + } + if(Status == RETURN_SUCCESS) { + /* CurPos now indicates the point we are seeking from, so seek... */ + Status = ShellSetFilePosition( (SHELL_FILE_HANDLE)FileHandle, (UINT64)(CurPos + offset)); + if(Status == RETURN_SUCCESS) { + // Now, determine our final position. + Status = ShellGetFilePosition( (SHELL_FILE_HANDLE)FileHandle, (UINT64 *)&CurPos); + } + } + if(Status != RETURN_SUCCESS) { + EFIerrno = Status; + CurPos = -1; + if(Status == EFI_UNSUPPORTED) { + errno = EISDIR; + } + else { + errno = EFI2errno(Status); + } + } + } + } + else { + errno = EBADF; // Bad File Descriptor + } + } + else { + errno = EINVAL; // Invalid how argument + } + return CurPos; +} + +/** The directory path is created with the access permissions specified by + perms. + + The directory is closed after it is created. + + @retval 0 The directory was created successfully. + @retval -1 An error occurred and an error code is stored in errno. +**/ +int +mkdir (const char *path, __mode_t perms) +{ + EFI_FILE_HANDLE FileHandle; + RETURN_STATUS Status; + EFI_FILE_INFO *FileInfo; + + // Convert name from MBCS to WCS + (void)AsciiStrToUnicodeStr( path, gMD->UString); + NormalizePath( gMD->UString); + +//Print(L"%a( \"%s\", 0x%8X)\n", __func__, gMD->UString, perms); + Status = ShellCreateDirectory( gMD->UString, (SHELL_FILE_HANDLE *)&FileHandle); + if(Status == RETURN_SUCCESS) { + FileInfo = ShellGetFileInfo( FileHandle); + if(FileInfo != NULL) { + FileInfo->Attribute = Omode2EFI(perms); + Status = ShellSetFileInfo( FileHandle, FileInfo); + FreePool(FileInfo); + if(Status == RETURN_SUCCESS) { + (void)ShellCloseFile((SHELL_FILE_HANDLE *)&FileHandle); + return 0; + } + } + } + errno = EFI2errno(Status); + EFIerrno = Status; + + return -1; +} + +/** Open a file. + + The EFI ShellOpenFileByName() function is used to perform the low-level + file open operation. The primary task of open() is to translate from the + flags used in the environment to those used by the EFI function. + + The only valid flag combinations for ShellOpenFileByName() are: + - Read + - Read/Write + - Create/Read/Write + + The mode value is saved in the FD to indicate permissions for further operations. + + O_RDONLY -- flags = EFI_FILE_MODE_READ -- this is always done + O_WRONLY -- flags |= EFI_FILE_MODE_WRITE + O_RDWR -- flags |= EFI_FILE_MODE_WRITE -- READ is already set + + O_NONBLOCK -- ignored + O_APPEND -- Seek to EOF before every write + O_CREAT -- flags |= EFI_FILE_MODE_CREATE + O_TRUNC -- delete first then create new + O_EXCL -- if O_CREAT is also set, open will fail if the file already exists. +**/ +int +open (const char *name, int oflags, int mode) +{ + EFI_FILE_HANDLE FileHandle; + struct __filedes *Mfd; + RETURN_STATUS Status; + UINT64 OpenMode; + UINT64 Attributes; + int fd = -1; + UINT32 NewState; + + EFIerrno = RETURN_SUCCESS; + Mfd = gMD->fdarray; + + // Convert name from MBCS to WCS + (void)AsciiStrToUnicodeStr( name, gMD->UString); + NormalizePath( gMD->UString); + + // Convert oflags to Attributes + OpenMode = Oflags2EFI(oflags); + if(OpenMode == 0) { + errno = EINVAL; + return -1; + } + + //Attributes = Omode2EFI(mode); + Attributes = 0; + + // Could add a test to see if the file name begins with a period. + // If it does, then add the HIDDEN flag to Attributes. + + // Get an available fd + fd = FindFreeFD( 0 ); + + if( fd < 0 ) { + // All available FDs are in use + errno = EMFILE; + return -1; + } + + Status = ConOpen( NULL, &FileHandle, gMD->UString, OpenMode, Attributes); + if(Status == RETURN_NO_MAPPING) { + // Not a console device, how about a regular file device? + + /* Do we care if the file already exists? + If O_TRUNC, then delete the file. It will be created anew subsequently. + If O_EXCL, then error if the file exists and O_CREAT is set. + + !!!!!!!!! Change this to use ShellSetFileInfo() to actually truncate the file + !!!!!!!!! instead of deleting and re-creating it. + */ + if((oflags & O_TRUNC) || ((oflags & (O_EXCL | O_CREAT)) == (O_EXCL | O_CREAT))) { + Status = ShellIsFile( gMD->UString ); + if(Status == RETURN_SUCCESS) { + // The file exists + if(oflags & O_TRUNC) { + // We do a truncate by deleting the existing file and creating a new one. + if(Uunlink(gMD->UString) != 0) { + Mfd[fd].State = 0; // Release our reservation on this FD + return -1; // errno and EFIerrno are already set. + } + } + else if(oflags & (O_EXCL | O_CREAT)) { + errno = EEXIST; + EFIerrno = Status; + Mfd[fd].State = 0; // Release our reservation on this FD + return -1; + } + } + } + // Call the EFI Shell's Open function + Status = ShellOpenFileByName( gMD->UString, (SHELL_FILE_HANDLE *)&FileHandle, OpenMode, Attributes); + if(RETURN_ERROR(Status)) { + Mfd[fd].State = 0; // Release our reservation on this FD + // Set errno based upon Status + errno = EFI2errno(Status); + EFIerrno = Status; + return -1; + } + // Successfully got a regular File + NewState = S_IFREG; + } + else if(Status != RETURN_SUCCESS) { + // Set errno based upon Status + errno = EFI2errno(Status); + EFIerrno = Status; + return -1; + } + else { + // Succesfully got a Console stream + NewState = S_IFREG | _S_ITTY | _S_IFCHR; + } + + // Update the info in the fd + Mfd[fd].FileHandle = FileHandle; + Mfd[fd].Oflags = oflags; + Mfd[fd].Omode = mode; + + // Re-use OpenMode in order to build our final State value + OpenMode = ( mode & S_ACC_READ ) ? S_ACC_READ : 0; + OpenMode |= ( mode & S_ACC_WRITE ) ? S_ACC_WRITE : 0; + + Mfd[fd].State = NewState | (UINT32)OpenMode; + + // return the fd of our now open file + return fd; +} + +/** The rename() function changes the name of a file. + The old argument points to the pathname of the file to be renamed. The new + argument points to the new pathname of the file. + + If the old argument points to the pathname of a file that is not a + directory, the new argument shall not point to the pathname of a + directory. If the file named by the new argument exists, it shall be + removed and old renamed to new. Write access permission is required for + both the directory containing old and the directory containing new. + + If the old argument points to the pathname of a directory, the new + argument shall not point to the pathname of a file that is not a + directory. If the directory named by the new argument exists, it shall be + removed and old renamed to new. + + The new pathname shall not contain a path prefix that names old. Write + access permission is required for the directory containing old and the + directory containing new. If the old argument points to the pathname of a + directory, write access permission may be required for the directory named + by old, and, if it exists, the directory named by new. + + If the rename() function fails for any reason other than [EIO], any file + named by new shall be unaffected. + + @return Upon successful completion, rename() shall return 0; otherwise, + -1 shall be returned, errno shall be set to indicate the error, + and neither the file named by old nor the file named by new + shall be changed or created. +**/ +int +rename (const char *old, const char *new) +{ + // UINT64 InfoSize; + // RETURN_STATUS Status; + // EFI_FILE_INFO *NewFileInfo = NULL; + // EFI_FILE_INFO *OldFileInfo; + // char *Newfn; + // int OldFd; + + //// Open old file + // OldFd = open(old, O_RDONLY, 0); + // if(OldFd >= 0) { + // NewFileInfo = malloc(sizeof(EFI_FILE_INFO) + PATH_MAX); + // if(NewFileInfo != NULL) { + // OldFileInfo = ShellGetFileInfo( FileHandle); + // if(OldFileInfo != NULL) { + // // Copy the Old file info into our new buffer, and free the old. + // memcpy(OldFileInfo, NewFileInfo, sizeof(EFI_FILE_INFO)); + // FreePool(OldFileInfo); + // // Strip off all but the file name portion of new + // NewFn = strrchr(new, '/'); + // if(NewFn == NULL) { + // NewFn = strrchr(new '\\'); + // if(NewFn == NULL) { + // NewFn = new; + // } + // } + // // Convert new name from MBCS to WCS + // (void)AsciiStrToUnicodeStr( NewFn, gMD->UString); + // // Copy the new file name into our new file info buffer + // wcsncpy(NewFileInfo->FileName, gMD->UString, wcslen(gMD->UString)+1); + // // Apply the new file name + // Status = ShellSetFileInfo(FileHandle); + // if(Status == EFI_SUCCESS) { + // // File has been successfully renamed. We are DONE! + // return 0; + // } + // errno = EFI2errno( Status ); + // EFIerrno = Status; + // } + // else { + // errno = EIO; + // } + // } + // else { + // errno = ENOMEM; + // } + // } + return -1; +} + +/** +**/ +int +rmdir (const char *path) +{ + EFI_FILE_HANDLE FileHandle; + RETURN_STATUS Status; + EFI_FILE_INFO *FileInfo = NULL; + int Count = 0; + BOOLEAN NoFile = FALSE; + + errno = 0; // Make it easier to see if we have an error later + + // Convert name from MBCS to WCS + (void)AsciiStrToUnicodeStr( path, gMD->UString); + NormalizePath( gMD->UString); + +//Print(L"%a( \"%s\")\n", __func__, gMD->UString); + Status = ShellOpenFileByName( gMD->UString, (SHELL_FILE_HANDLE *)&FileHandle, + (EFI_FILE_MODE_READ || EFI_FILE_MODE_WRITE), 0); + if(Status == RETURN_SUCCESS) { + FileInfo = ShellGetFileInfo( (SHELL_FILE_HANDLE)FileHandle); + if(FileInfo != NULL) { + if((FileInfo->Attribute & EFI_FILE_DIRECTORY) == 0) { + errno = ENOTDIR; + } + else { + // See if the directory has any entries other than ".." and ".". + FreePool(FileInfo); // Free up the buffer from ShellGetFileInfo() + Status = ShellFindFirstFile( (SHELL_FILE_HANDLE)FileHandle, &FileInfo); + if(Status == RETURN_SUCCESS) { + ++Count; + while(Count < 3) { + Status = ShellFindNextFile( (SHELL_FILE_HANDLE)FileHandle, FileInfo, &NoFile); + if(Status == RETURN_SUCCESS) { + if(NoFile) { + break; + } + ++Count; + } + else { + Count = 99; + } + } + FreePool(FileInfo); // Free buffer from ShellFindFirstFile() + if(Count < 3) { + // Directory is empty + Status = ShellDeleteFile( (SHELL_FILE_HANDLE *)&FileHandle); + if(Status == RETURN_SUCCESS) { + EFIerrno = RETURN_SUCCESS; + return 0; + /* ######## SUCCESSFUL RETURN ######## */ + } + } + else { + if(Count == 99) { + errno = EIO; + } + else { + errno = ENOTEMPTY; + } + } + } + } + } + else { + errno = EIO; + } + } + EFIerrno = Status; + if(errno == 0) { + errno = EFI2errno( Status ); + } + return -1; +} + +/* Internal File Info. worker function for stat and fstat. */ +static +EFI_STATUS +_EFI_FileInfo( EFI_FILE_INFO *FileInfo, struct stat *statbuf) +{ + UINT64 Attributes; + RETURN_STATUS Status; + mode_t newmode; + + if(FileInfo != NULL) { + // Got the info, now populate statbuf with it + statbuf->st_blksize = S_BLKSIZE; + statbuf->st_size = FileInfo->Size; + statbuf->st_physsize = FileInfo->PhysicalSize; + statbuf->st_birthtime = Efi2Time( &FileInfo->CreateTime); + statbuf->st_atime = Efi2Time( &FileInfo->LastAccessTime); + statbuf->st_mtime = Efi2Time( &FileInfo->ModificationTime); + Attributes = FileInfo->Attribute; + newmode = (mode_t)(Attributes << S_EFISHIFT) | S_ACC_READ; + if((Attributes & EFI_FILE_DIRECTORY) == 0) { + newmode |= _S_IFREG; + if((Attributes & EFI_FILE_READ_ONLY) == 0) { + statbuf->st_mode |= S_ACC_WRITE; + } + } + else { + newmode |= _S_IFDIR; + } + statbuf->st_mode = newmode; + Status = RETURN_SUCCESS; + } + else { + Status = RETURN_DEVICE_ERROR; + } + return Status; +} + +/** The fstat() function obtains information about an open file associated + with the file descriptor fildes, and shall write it to the area pointed to + by buf. + + The buf argument is a pointer to a stat structure, as defined + in , into which information is placed concerning the file. + + The structure members st_mode, st_ino, st_dev, st_uid, st_gid, st_atime, + st_ctime, and st_mtime shall have meaningful values. The value of the + member st_nlink shall be set to the number of links to the file. + + The fstat() function shall update any time-related fields before writing + into the stat structure. + + The fstat() function is implemented using the ShellGetFileInfo() + function. + + The stat structure members which don't have direct analogs to EFI file + information are filled in as follows: + - st_mode Populated with information from fildes + - st_ino Set to zero. (inode) + - st_dev Set to zero. + - st_uid Set to zero. + - st_gid Set to zero. + - st_nlink Set to one. + + @param[in] fildes File descriptor as returned from open(). + @param[out] statbuf Buffer in which the file status is put. + + @retval 0 Successful Completion. + @retval -1 An error has occurred and errno has been set to + identify the error. +**/ +int +fstat (int fildes, struct stat *statbuf) +{ + EFI_FILE_HANDLE FileHandle; + RETURN_STATUS Status = RETURN_SUCCESS; + EFI_FILE_INFO *FileInfo = NULL; + UINTN FinfoSize = sizeof(EFI_FILE_INFO); + + if(ValidateFD( fildes, VALID_OPEN)) { + FileHandle = gMD->fdarray[fildes].FileHandle; + if(isatty(fildes)) { + FileInfo = AllocateZeroPool(FinfoSize); + if(FileInfo != NULL) { + Status = FileHandle->GetInfo( FileHandle, 0, &FinfoSize, FileInfo); + } + else { + Status = RETURN_OUT_OF_RESOURCES; + } + } + else { + FileInfo = ShellGetFileInfo( FileHandle); + } + Status = _EFI_FileInfo( FileInfo, statbuf); + } + errno = EFI2errno(Status); + EFIerrno = Status; + + if(FileInfo != NULL) { + FreePool(FileInfo); // Release the buffer allocated by the GetInfo function + } + + return errno? -1 : 0; +} + +/** Obtains information about the file pointed to by path. + + Opens the file pointed to by path, calls _EFI_FileInfo with the file's handle, + then closes the file. + + @retval 0 Successful Completion. + @retval -1 An error has occurred and errno has been set to + identify the error. +**/ +int +stat (const char *path, void *statbuf) +{ + EFI_FILE_HANDLE FileHandle; + RETURN_STATUS Status; + EFI_FILE_INFO *FileInfo; + + errno = 0; // Make it easier to see if we have an error later + + // Convert name from MBCS to WCS + (void)AsciiStrToUnicodeStr( path, gMD->UString); + NormalizePath( gMD->UString); + + Status = ShellOpenFileByName( gMD->UString, (SHELL_FILE_HANDLE *)&FileHandle, EFI_FILE_MODE_READ, 0ULL); + if(Status == RETURN_SUCCESS) { + FileInfo = ShellGetFileInfo( FileHandle); + Status = _EFI_FileInfo( FileInfo, (struct stat *)statbuf); + (void)ShellCloseFile( (SHELL_FILE_HANDLE *)&FileHandle); + } + errno = EFI2errno(Status); + EFIerrno = Status; + + return errno? -1 : 0; +} + +/** Same as stat since EFI doesn't have symbolic links. **/ +int +lstat (const char *path, struct stat *statbuf) +{ + return stat(path, statbuf); +} + +/** Read from a file. + + The read() function shall attempt to read nbyte bytes from the file + associated with the open file descriptor, fildes, into the buffer pointed + to by buf. + + Before any action described below is taken, and if nbyte is zero, the + read() function may detect and return errors as described below. In the + absence of errors, or if error detection is not performed, the read() + function shall return zero and have no other results. + + On files that support seeking (for example, a regular file), the read() + shall start at a position in the file given by the file offset associated + with fildes. The file offset shall be incremented by the number of bytes + actually read. + + Files that do not support seeking - for example, terminals - always read + from the current position. The value of a file offset associated with + such a file is undefined. + + No data transfer shall occur past the current end-of-file. If the + starting position is at or after the end-of-file, 0 shall be returned. + + The read() function reads data previously written to a file. If any + portion of a regular file prior to the end-of-file has not been written, + read() shall return bytes with value 0. For example, lseek() allows the + file offset to be set beyond the end of existing data in the file. If data + is later written at this point, subsequent reads in the gap between the + previous end of data and the newly written data shall return bytes with + value 0 until data is written into the gap. + + Upon successful completion, where nbyte is greater than 0, read() shall + mark for update the st_atime field of the file, and shall return the + number of bytes read. This number shall never be greater than nbyte. The + value returned may be less than nbyte if the number of bytes left in the + file is less than nbyte, if the read() request was interrupted by a + signal, or if the file is a pipe or FIFO or special file and has fewer + than nbyte bytes immediately available for reading. For example, a read() + from a file associated with a terminal may return one typed line of data. + + If fildes does not refer to a directory, the function reads the requested + number of bytes from the file at the file’s current position and returns + them in buf. If the read goes beyond the end of the file, the read + length is truncated to the end of the file. The file’s current position is + increased by the number of bytes returned. + + If fildes refers to a directory, the function reads the directory entry at + the file’s current position and returns the entry in buf. If buf + is not large enough to hold the current directory entry, then + errno is set to EBUFSIZE, EFIerrno is set to EFI_BUFFER_TOO_SMALL, and the + current file position is not updated. The size of the buffer needed to read + the entry will be returned as a negative number. On success, the current + position is updated to the next directory entry. If there are no more + directory entries, the read returns a zero-length buffer. + EFI_FILE_INFO is the structure returned as the directory entry. + + @return Upon successful completion, read() returns a non-negative integer + indicating the number of bytes actually read. Otherwise, the + functions return a negative value and sets errno to indicate the + error. If errno is EBUFSIZE, the absolute value of the + return value indicates the size of the buffer needed to read + the directory entry. +**/ +ssize_t +read (int fildes, void *buf, size_t nbyte) +{ + ssize_t BufSize; + EFI_FILE_HANDLE FileHandle; + RETURN_STATUS Status; + + BufSize = (ssize_t)nbyte; + if(ValidateFD( fildes, VALID_OPEN)) { + FileHandle = gMD->fdarray[fildes].FileHandle; + if(isatty(fildes)) { + Status = FileHandle->Read( FileHandle, (UINTN *)&BufSize, buf); + } + else { + Status = ShellReadFile( FileHandle, (UINTN *)&BufSize, buf); + } + if(Status != RETURN_SUCCESS) { + EFIerrno = Status; + errno = EFI2errno(Status); + if(Status == RETURN_BUFFER_TOO_SMALL) { + BufSize = -BufSize; + } + else { + BufSize = -1; + } + } + } + else { + errno = EBADF; + } + return BufSize; +} + +ssize_t +WideTtyCvt( CHAR16 *dest, const char *buf, size_t n) +{ + UINTN i; + wint_t wc; + + for(i = 0; i < n; ++i) { + wc = btowc(*buf++); + if( wc == 0) { + break; + }; + if(wc < 0) { + wc = BLOCKELEMENT_LIGHT_SHADE; + } + if(wc == L'\n') { + *dest++ = L'\r'; + } + *dest++ = (CHAR16)wc; + } + *dest = 0; + return (ssize_t)i; +} + +/** Write data to a file. + + This function writes the specified number of bytes to the file at the current + file position. The current file position is advanced the actual number of bytes + written, which is returned in BufferSize. Partial writes only occur when there + has been a data error during the write attempt (such as "volume space full"). + The file is automatically grown to hold the data if required. Direct writes to + opened directories are not supported. + + If fildes refers to a terminal device, isatty() returns TRUE, a partial write + will occur if a NULL or EOF character is encountered before n characters have + been written. Characters inserted due to line-end translations will not be + counted. Unconvertable characters are translated into the UEFI character + BLOCKELEMENT_LIGHT_SHADE. + + Since the UEFI console device works on wide characters, the buffer is assumed + to contain a single-byte character stream which is then translated to wide + characters using the btowc() functions. The resulting wide character stream + is what is actually sent to the UEFI console. + + QUESTION: Should writes to stdout or stderr always succeed? +**/ +ssize_t +write (int fildes, const void *buf, size_t n) +{ + ssize_t BufSize; + EFI_FILE_HANDLE FileHandle; + RETURN_STATUS Status = RETURN_SUCCESS; + ssize_t UniBufSz; + + BufSize = (ssize_t)n; + + if(ValidateFD( fildes, VALID_OPEN)) { + FileHandle = gMD->fdarray[fildes].FileHandle; + if(isatty(fildes)) { + // Convert string from MBCS to WCS and translate \n to \r\n. + UniBufSz = WideTtyCvt(gMD->UString, (const char *)buf, n); + if(UniBufSz > 0) { + BufSize = (ssize_t)(UniBufSz * sizeof(CHAR16)); + Status = FileHandle->Write( FileHandle, (UINTN *)&BufSize, (void *)gMD->UString); + BufSize = (ssize_t)n; // Always pretend all was output + } + } + else { + Status = ShellWriteFile( FileHandle, (UINTN *)&BufSize, (void *)buf); + } + if(Status != RETURN_SUCCESS) { + EFIerrno = Status; + errno = EFI2errno(Status); + if(Status == EFI_UNSUPPORTED) { + errno = EISDIR; + } + BufSize = -1; + } + } + else { + errno = EBADF; + } + return BufSize; +} diff --git a/StdLib/LibC/Uefi/SysEfi.h b/StdLib/LibC/Uefi/SysEfi.h new file mode 100644 index 0000000000..fa9dc38cdd --- /dev/null +++ b/StdLib/LibC/Uefi/SysEfi.h @@ -0,0 +1,37 @@ +/** @file + Declarations local to the Uefi SysCalls module of the Standard C Library. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _SYSEFI_H +#define _SYSEFI_H +#include + +#define EFI_FILE_MODE_MASK ( EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE ) +#define OMODE_MASK 0xFFFF00UL +#define OMODE_SHIFT 8 + +#define S_ACC_READ ( S_IRUSR | S_IRGRP | S_IROTH | S_IXUSR | S_IXGRP | S_IXOTH ) +#define S_ACC_WRITE ( S_IWUSR | S_IWGRP | S_IWOTH ) +#define S_ACC_MASK ( S_IRWXU | S_IRWXG | S_IRWXO ) + +UINT64 +Oflags2EFI( int oflags); + +UINT64 +Omode2EFI( int mode); + +/* Converts the first several EFI status values into the appropriate errno value. +*/ +int +EFI2errno( RETURN_STATUS Status); + +#endif /* _SYSEFI_H */ diff --git a/StdLib/LibC/Uefi/Uefi.inf b/StdLib/LibC/Uefi/Uefi.inf new file mode 100644 index 0000000000..ca6437abe0 --- /dev/null +++ b/StdLib/LibC/Uefi/Uefi.inf @@ -0,0 +1,49 @@ +## @file +# Standard C library: UEFI "system calls". +# +# Copyright (c) 2010, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php. +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = LibUefi + FILE_GUID = 39356e02-26bf-4cfb-9564-378ce25e702f + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + LIBRARY_CLASS = LibUefi + +# +# VALID_ARCHITECTURES = IA32 X64 IPF +# + +[Sources] + SysCalls.c + Xform.c + Console.c + +[Packages] + StdLib/StdLib.dec + StdLibPrivateInternalFiles/DoNotUse.dec + MdePkg/MdePkg.dec + ShellPkg/ShellPkg.dec + +[LibraryClasses] + UefiLib + BaseLib + BaseMemoryLib + MemoryAllocationLib + UefiBootServicesTableLib + ShellLib + LibC + LibLocale + LibString + LibTime diff --git a/StdLib/LibC/Uefi/Xform.c b/StdLib/LibC/Uefi/Xform.c new file mode 100644 index 0000000000..21eff6fb9d --- /dev/null +++ b/StdLib/LibC/Uefi/Xform.c @@ -0,0 +1,173 @@ +/** @file + Value transformations between stdio and the UEFI environment. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#include + +#include +#include + +#include +#include +#include "SysEfi.h" + +/** Translate the Open flags into a Uefi Open Modes value. + + The Open Flags are: + O_RDONLY, O_WRONLY, O_RDWR // Pick only one + + O_NONBLOCK, O_APPEND, O_CREAT, O_TRUNC, O_EXCL // ORed with one of the previous + + The UEFI Open modes are: + // ****************************************************** + // Open Modes + // ****************************************************** + #define EFI_FILE_MODE_READ 0x0000000000000001 + #define EFI_FILE_MODE_WRITE 0x0000000000000002 + #define EFI_FILE_MODE_CREATE 0x8000000000000000 + + +*/ +UINT64 +Oflags2EFI( int oflags ) +{ + UINT64 flags; + + // Build the Open Modes + flags = (UINT64)((oflags & O_ACCMODE) + 1); // Handle the Read/Write flags + if(oflags & (O_CREAT | O_TRUNC)) { // Now add the Create flag. + // Also added if O_TRUNC set since we will need to create a new file. + // We just set the flags here since the only valid EFI mode with create + // is Read+Write+Create. + flags = EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE; + } + return flags; +} + +/* Transform the permissions flags from the open() call into the + Attributes bits needed by UEFI. + + The UEFI File attributes are: + // ****************************************************** + // File Attributes + // ****************************************************** + #define EFI_FILE_READ_ONLY 0x0000000000000001 + #define EFI_FILE_HIDDEN 0x0000000000000002 + #define EFI_FILE_SYSTEM 0x0000000000000004 + #define EFI_FILE_RESERVED 0x0000000000000008 + #define EFI_FILE_DIRECTORY 0x0000000000000010 + #define EFI_FILE_ARCHIVE 0x0000000000000020 + #define EFI_FILE_VALID_ATTR 0x0000000000000037 + + The input permission flags consist of two groups: + ( S_IRUSR | S_IRGRP | S_IROTH ) -- S_ACC_READ + ( S_IWUSR | S_IWGRP | S_IWOTH ) -- S_ACC_WRITE + + The only thing we can set, at this point, is whether or not + this is a SYSTEM file. If the group and other bits are + zero and the user bits are non-zero then set SYSTEM. Otherwise + the attributes are zero. + + The attributes can be set later using fcntl(). +*/ +UINT64 +Omode2EFI( int mode) +{ + UINT64 flags = 0; + + if((mode & (S_IRWXG | S_IRWXO)) == 0) { + if((mode & S_IRWXU) != 0) { + // Only user permissions so set system + flags = EFI_FILE_SYSTEM; + } + } + return flags; +} + +/* Converts the first several EFI status values into the appropriate errno value. +*/ +int +EFI2errno( RETURN_STATUS Status) +{ + int retval; + + switch(Status) { + case RETURN_SUCCESS: + retval = 0; + break; + case RETURN_INVALID_PARAMETER: + retval = EINVAL; + break; + case RETURN_UNSUPPORTED: + retval = ENODEV; + break; + case RETURN_BAD_BUFFER_SIZE: + case RETURN_BUFFER_TOO_SMALL: + retval = EBUFSIZE; + break; + case RETURN_NOT_READY: + retval = EBUSY; + break; + case RETURN_WRITE_PROTECTED: + retval = EROFS; + break; + case RETURN_OUT_OF_RESOURCES: // May be overridden by specific functions + retval = ENOMEM; + break; + case RETURN_VOLUME_FULL: + retval = ENOSPC; + break; + case RETURN_NOT_FOUND: + case RETURN_NO_MAPPING: + retval = ENOENT; + break; + case RETURN_TIMEOUT: + retval = ETIMEDOUT; + break; + case RETURN_NOT_STARTED: + retval = EAGAIN; + break; + case RETURN_ALREADY_STARTED: + retval = EALREADY; + break; + case RETURN_ABORTED: + retval = EINTR; + break; + case RETURN_ICMP_ERROR: + case RETURN_TFTP_ERROR: + case RETURN_PROTOCOL_ERROR: + retval = EPROTO; + break; + case RETURN_INCOMPATIBLE_VERSION: + retval = EPERM; + break; + case RETURN_ACCESS_DENIED: + case RETURN_SECURITY_VIOLATION: + retval = EACCES; + break; +/* case RETURN_LOAD_ERROR: + case RETURN_DEVICE_ERROR: + case RETURN_VOLUME_CORRUPTED: + case RETURN_NO_MEDIA: + case RETURN_MEDIA_CHANGED: + case RETURN_NO_RESPONSE: + case RETURN_CRC_ERROR: + case RETURN_END_OF_MEDIA: + case RETURN_END_OF_FILE: + case RETURN_INVALID_LANGUAGE: +*/ + default: + retval = EIO; + break; + } + return retval; +} diff --git a/StdLib/LibC/Wchar/Comparison.c b/StdLib/LibC/Wchar/Comparison.c new file mode 100644 index 0000000000..17244b4ccb --- /dev/null +++ b/StdLib/LibC/Wchar/Comparison.c @@ -0,0 +1,97 @@ +/** @file + Comparison Functions for . + + Unless explicitly stated otherwise, the functions defined in this file order + two wide characters the same way as two integers of the underlying integer + type designated by wchar_t. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include +#include +#include + +#include + +#include + +/** The wcscmp function compares the wide string pointed to by s1 to the wide + string pointed to by s2. + + @return The wcscmp function returns an integer greater than, equal to, or + less than zero, accordingly as the wide string pointed to by s1 + is greater than, equal to, or less than the wide string + pointed to by s2. +**/ +int wcscmp(const wchar_t *s1, const wchar_t *s2) +{ + return (int)StrCmp( (CONST CHAR16 *)s1, (CONST CHAR16 *)s2); +} + +/** The wcscoll function compares the wide string pointed to by s1 to the wide + string pointed to by s2, both interpreted as appropriate to the LC_COLLATE + category of the current locale. + + @return The wcscoll function returns an integer greater than, equal to, + or less than zero, accordingly as the wide string pointed to by + s1 is greater than, equal to, or less than the wide string + pointed to by s2 when both are interpreted as appropriate to + the current locale. +**/ +//int wcscoll(const wchar_t *s1, const wchar_t *s2) +//{ +// return -1; // STUBB +//} + +/** The wcsncmp function compares not more than n wide characters (those that + follow a null wide character are not compared) from the array pointed to by + s1 to the array pointed to by s2. + + @return The wcsncmp function returns an integer greater than, equal to, + or less than zero, accordingly as the possibly null-terminated + array pointed to by s1 is greater than, equal to, or less than + the possibly null-terminated array pointed to by s2. +**/ +int wcsncmp(const wchar_t *s1, const wchar_t *s2, size_t n) +{ + return (int)StrnCmp( (CONST CHAR16 *)s1, (CONST CHAR16 *)s2, (UINTN)n); +} + +/** The wcsxfrm function transforms the wide string pointed to by s2 and places + the resulting wide string into the array pointed to by s1. The + transformation is such that if the wcscmp function is applied to two + transformed wide strings, it returns a value greater than, equal to, or + less than zero, corresponding to the result of the wcscoll function applied + to the same two original wide strings. No more than n wide characters are + placed into the resulting array pointed to by s1, including the terminating + null wide character. If n is zero, s1 is permitted to be a null pointer. + + @return The wcsxfrm function returns the length of the transformed wide + string (not including the terminating null wide character). If + the value returned is n or greater, the contents of the array + pointed to by s1 are indeterminate. +**/ +//size_t wcsxfrm(wchar_t * __restrict s1, const wchar_t * __restrict s2, size_t n) +//{ +// return n; // STUBB +//} + +/** The wmemcmp function compares the first n wide characters of the object + pointed to by s1 to the first n wide characters of the object pointed to + by s2. + + @return The wmemcmp function returns an integer greater than, equal to, + or less than zero, accordingly as the object pointed to by s1 is + greater than, equal to, or less than the object pointed to by s2. +**/ +int wmemcmp(const wchar_t *s1, const wchar_t *s2, size_t n) +{ + return (int)CompareMem( s1, s2, (UINTN)(n * sizeof(wchar_t))); +} diff --git a/StdLib/LibC/Wchar/Concatenation.c b/StdLib/LibC/Wchar/Concatenation.c new file mode 100644 index 0000000000..cf595a461f --- /dev/null +++ b/StdLib/LibC/Wchar/Concatenation.c @@ -0,0 +1,48 @@ +/** @file + Concatenation Functions for . + + Unless explicitly stated otherwise, if the execution of a function declared + in this file causes copying to take place between objects that overlap, the + behavior is undefined. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include +#include +#include + +#include + +#include + +/** The wcscat function appends a copy of the wide string pointed to by s2 + (including the terminating null wide character) to the end of the wide + string pointed to by s1. The initial wide character of s2 overwrites the + null wide character at the end of s1. + + @return The wcscat function returns the value of s1. +**/ +wchar_t *wcscat(wchar_t * __restrict s1, const wchar_t * __restrict s2) +{ + return (wchar_t *)StrCat( (CHAR16 *)s1, (CONST CHAR16 *)s2); +} + +/** The wcsncat function appends not more than n wide characters (a null wide + character and those that follow it are not appended) from the array pointed + to by s2 to the end of the wide string pointed to by s1. The initial wide + character of s2 overwrites the null wide character at the end of s1. + A terminating null wide character is always appended to the result. + + @return The wcsncat function returns the value of s1. +**/ +wchar_t *wcsncat(wchar_t * __restrict s1, const wchar_t * __restrict s2, size_t n) +{ + return (wchar_t *)StrnCat( (CHAR16 *)s1, (CONST CHAR16 *)s2, (UINTN)n); +} diff --git a/StdLib/LibC/Wchar/ConsDecons.c b/StdLib/LibC/Wchar/ConsDecons.c new file mode 100644 index 0000000000..ab139405fc --- /dev/null +++ b/StdLib/LibC/Wchar/ConsDecons.c @@ -0,0 +1,64 @@ +/** @file + Constructor and Deconstructor functions for . + + Unless explicitly stated otherwise, the functions defined in this file order + two wide characters the same way as two integers of the underlying integer + type designated by wchar_t. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include +#include +#include +#include + +#include + +#include +#include + +/* Data initialized by the library constructor */ +UINT8 *__wchar_bitmap = NULL; +UINTN __wchar_bitmap_size; +UINTN __wchar_bitmap_64; + +EFI_STATUS +EFIAPI +__wchar_construct( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + if( __wchar_bitmap == NULL) { + __wchar_bitmap_size = (WCHAR_MAX + 8) / 8U; + __wchar_bitmap = AllocatePool(__wchar_bitmap_size); + if( __wchar_bitmap == NULL) { + EFIerrno = RETURN_OUT_OF_RESOURCES; + errno = ENOMEM; + return EFIerrno; + } + return RETURN_SUCCESS; + } + return RETURN_ALREADY_STARTED; +} + +EFI_STATUS +EFIAPI +__wchar_deconstruct( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + if( __wchar_bitmap != NULL) { + FreePool( __wchar_bitmap); + __wchar_bitmap = NULL; + } + return RETURN_SUCCESS; +} diff --git a/StdLib/LibC/Wchar/Copying.c b/StdLib/LibC/Wchar/Copying.c new file mode 100644 index 0000000000..7075437965 --- /dev/null +++ b/StdLib/LibC/Wchar/Copying.c @@ -0,0 +1,80 @@ +/** @file + Copying Functions for . + + Unless explicitly stated otherwise, if the execution of a function declared + in this file causes copying to take place between objects that overlap, the + behavior is undefined. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include +#include +#include + +#include + +#include + +/** The wcscpy function copies the wide string pointed to by s2 (including the + terminating null wide character) into the array pointed to by s1. + + @return The wcscpy function returns the value of s1. +**/ +wchar_t *wcscpy(wchar_t * __restrict s1, const wchar_t * __restrict s2) +{ + return (wchar_t *)StrCpy( (CHAR16 *)s1, (CONST CHAR16 *)s2); +} + +/** The wcsncpy function copies not more than n wide characters (those that + follow a null wide character are not copied) from the array pointed to by + s2 to the array pointed to by s1. + + If the array pointed to by s2 is a wide string that is shorter than n wide + characters, null wide characters are appended to the copy in the array + pointed to by s1, until n wide characters in all have been written. + + @return The wcsncpy function returns the value of s1. +**/ +wchar_t *wcsncpy(wchar_t * __restrict s1, const wchar_t * __restrict s2, size_t n) +{ + return (wchar_t *)StrnCpy( (CHAR16 *)s1, (CONST CHAR16 *)s2, (UINTN)n); +} + +/** The wmemcpy function copies n wide characters from the object pointed to by + s2 to the object pointed to by s1. + + Use this function if you know that s1 and s2 DO NOT Overlap. Otherwise, + use wmemmove. + + @return The wmemcpy function returns the value of s1. +**/ +wchar_t *wmemcpy(wchar_t * __restrict s1, const wchar_t * __restrict s2, size_t n) +{ + return (wchar_t *)CopyMem( s1, s2, (UINTN)(n * sizeof(wchar_t))); +} + +/** The wmemmove function copies n wide characters from the object pointed to by + s2 to the object pointed to by s1. The objects pointed to by s1 and s2 are + allowed to overlap. + + Because the UEFI BaseMemoryLib function CopyMem explicitly handles + overlapping source and destination objects, this function and wmemcpy are + implemented identically. + + For programming clarity, it is recommended that you use wmemcpy if you know + that s1 and s2 DO NOT Overlap. If s1 and s2 might possibly overlap, then + use wmemmove. + + @return The wmemmove function returns the value of s1. +**/ +wchar_t *wmemmove(wchar_t *s1, const wchar_t *s2, size_t n) +{ + return (wchar_t *)CopyMem( s1, s2, (UINTN)(n * sizeof(wchar_t))); +} diff --git a/StdLib/LibC/Wchar/Searching.c b/StdLib/LibC/Wchar/Searching.c new file mode 100644 index 0000000000..c345dfe838 --- /dev/null +++ b/StdLib/LibC/Wchar/Searching.c @@ -0,0 +1,268 @@ +/** @file + Search Functions for . + + Unless explicitly stated otherwise, the functions defined in this file order + two wide characters the same way as two integers of the underlying integer + type designated by wchar_t. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include +#include +#include +#include + +#include + +#include + +/* Data initialized by the library constructor */ +extern UINT8 *__wchar_bitmap; +extern UINTN __wchar_bitmap_size; +extern UINTN __wchar_bitmap_64; + +/** The wcschr function locates the first occurrence of c in the wide string + pointed to by s. The terminating null wide character is considered to be + part of the wide string. + + @return The wcschr function returns a pointer to the located wide + character, or a null pointer if the wide character does not occur + in the wide string. +**/ +wchar_t *wcschr(const wchar_t *s, wchar_t c) +{ + do { + if( *s == c) { + return (wchar_t *)s; + } + } while(*s++ != 0); + return NULL; +} + +static UINT8 BitMask[] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 + }; + +#define WHICH8(c) ((unsigned short)(c) >> 3) +#define WHICH_BIT(c) (BitMask[((c) & 0x7)]) +#define BITMAP64 ((UINT64 *)bitmap) + +static +void +BuildBitmap(unsigned char * bitmap, const wchar_t *s2, UINTN n) +{ + UINT8 bit; + UINTN index; + + //// Initialize bitmap. Bit 0 is always 1 which corresponds to '\0' + //for (BITMAP64[0] = index = 1; index < n; index++) + // BITMAP64[index] = 0; + (void)wmemset( (wchar_t *)bitmap, 0, n / sizeof(wchar_t)); + bitmap[0] = 1; + + // Set bits in bitmap corresponding to the characters in s2 + for (; *s2 != 0; ++s2) { + index = WHICH8(*s2); + bit = WHICH_BIT(*s2); + bitmap[index] |= bit; + } +} + +/** The wcscspn function computes the length of the maximum initial segment of + the wide string pointed to by s1 which consists entirely of wide characters + not from the wide string pointed to by s2. + + @return The wcscspn function returns the length of the segment. +**/ +size_t wcscspn(const wchar_t *s1, const wchar_t *s2) +{ + const wchar_t *str; + UINT8 bit; + int index; + + if(*s1 == 0) return 0; + + BuildBitmap( __wchar_bitmap, s2, __wchar_bitmap_size); + + for(str = s1; ; str++) { + index = WHICH8(*str); + bit = WHICH_BIT(*str); + if ((__wchar_bitmap[index] & bit) != 0) + break; + } + return (str - s1); +} + +/** The wcspbrk function locates the first occurrence in the wide string + pointed to by s1 of any wide character from the wide string + pointed to by s2. + + @return The wcspbrk function returns a pointer to the wide character + in s1, or a null pointer if no wide character from s2 occurs + in s1. +**/ +wchar_t *wcspbrk(const wchar_t *s1, const wchar_t *s2) +{ + UINT8 bit; + int index; + + BuildBitmap( __wchar_bitmap, s2, __wchar_bitmap_size); + + for( ; *s1 != 0; ++s1) { + index = WHICH8(*s1); + bit = WHICH_BIT(*s1); + if( (__wchar_bitmap[index] & bit) != 0) { + return (wchar_t *)s1; + } + } + return NULL; +} + +/** The wcsrchr function locates the last occurrence of c in the wide string + pointed to by s. The terminating null wide character is considered to be + part of the wide string. + + @return The wcsrchr function returns a pointer to the wide character, + or a null pointer if c does not occur in the wide string. +**/ +wchar_t *wcsrchr(const wchar_t *s, wchar_t c) +{ + wchar_t *found = NULL; + + do { + if( *s == c) found = (wchar_t *)s; + } while( *s++ != 0); + + return found; +} + +/** The wcsspn function computes the length of the maximum initial segment of + the wide string pointed to by s1 which consists entirely of wide characters + from the wide string pointed to by s2. + + @return The wcsspn function returns the length of the segment. +**/ +size_t wcsspn(const wchar_t *s1, const wchar_t *s2) +{ + size_t length = 0; + int index; + UINT8 bit; + + BuildBitmap( __wchar_bitmap, s2, __wchar_bitmap_size); + + for( ; *s1 != 0; ++s1) { + index = WHICH8(*s1); + bit = WHICH_BIT(*s1); + if( (__wchar_bitmap[index] & bit) == 0) break; + ++length; + } + return length; +} + +/** The wcsstr function locates the first occurrence in the wide string pointed + to by s1 of the sequence of wide characters (excluding the terminating null + wide character) in the wide string pointed to by s2. + + @return The wcsstr function returns a pointer to the located wide string, + or a null pointer if the wide string is not found. If s2 points + to a wide string with zero length, the function returns s1. +**/ +wchar_t *wcsstr(const wchar_t *s1, const wchar_t *s2) +{ + return (wchar_t *)StrStr( (CONST CHAR16 *)s1, (CONST CHAR16 *)s2); +} + +/** A sequence of calls to the wcstok function breaks the wide string pointed + to by s1 into a sequence of tokens, each of which is delimited by a wide + character from the wide string pointed to by s2. The third argument points + to a caller-provided wchar_t pointer into which the wcstok function stores + information necessary for it to continue scanning the same wide string. + + The first call in a sequence has a non-null first argument and stores an + initial value in the object pointed to by ptr. Subsequent calls in the + sequence have a null first argument and the object pointed to by ptr is + required to have the value stored by the previous call in the sequence, + which is then updated. The separator wide string pointed to by s2 may be + different from call to call. + + The first call in the sequence searches the wide string pointed to by s1 + for the first wide character that is not contained in the current separator + wide string pointed to by s2. If no such wide character is found, then + there are no tokens in the wide string pointed to by s1 and the wcstok + function returns a null pointer. If such a wide character is found, it is + the start of the first token. + + The wcstok function then searches from there for a wide character that is + contained in the current separator wide string. If no such wide character + is found, the current token extends to the end of the wide string pointed + to by s1, and subsequent searches in the same wide string for a token + return a null pointer. If such a wide character is found, it is overwritten + by a null wide character, which terminates the current token. + + In all cases, the wcstok function stores sufficient information in the + pointer pointed to by ptr so that subsequent calls, with a null pointer for + s1 and the unmodified pointer value for ptr, shall start searching just + past the element overwritten by a null wide character (if any). + + @return The wcstok function returns a pointer to the first wide character + of a token, or a null pointer if there is no token. +**/ +wchar_t *wcstok(wchar_t * __restrict s1, const wchar_t * __restrict s2, wchar_t ** __restrict ptr) +{ + wchar_t *Token = NULL; + int index; + UINT8 bit; + + if( (s1 == NULL) + && ((s1 = *ptr) == NULL)) + { + return NULL; + } + + // s2 can be different on each call, so build the bitmap each time. + BuildBitmap( __wchar_bitmap, s2, __wchar_bitmap_size); + + // skip leading delimiters: all chars in s2 + for( ; *s1 != 0; ++s1) { + index = WHICH8(*s1); + bit = WHICH_BIT(*s1); + if( (__wchar_bitmap[index] & bit) == 0) break; + } + if( *s1 != 0) + { + // Remember this point, it is the start of the token + Token = s1++; + + // find the next delimiter and replace it with a '\0' + for( ; *s1 != 0; ++s1) { + index = WHICH8(*s1); + bit = WHICH_BIT(*s1); + if( (__wchar_bitmap[index] & bit) != 0) { + *s1++ = 0; + *ptr = s1; + return Token; + } + } + } + *ptr = NULL; + return Token; +} + +/** The wmemchr function locates the first occurrence of c in the initial n + wide characters of the object pointed to by s. + + @return The wmemchr function returns a pointer to the located wide + character, or a null pointer if the wide character does not occur + in the object. +**/ +wchar_t *wmemchr(const wchar_t *s, wchar_t c, size_t n) +{ + return (wchar_t *)ScanMem16( s, (UINTN)(n * sizeof(wchar_t)), (UINT16)c); +} diff --git a/StdLib/LibC/Wchar/String.c b/StdLib/LibC/Wchar/String.c new file mode 100644 index 0000000000..70f6d9aedf --- /dev/null +++ b/StdLib/LibC/Wchar/String.c @@ -0,0 +1,43 @@ +/** @file + Miscelaneous Functions for . + + Unless explicitly stated otherwise, if the execution of a function declared + in this file causes copying to take place between objects that overlap, the + behavior is undefined. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include +#include +#include + +#include + +#include + +/** The wcslen function computes the length of the wide string pointed to by s. + + @return The wcslen function returns the number of wide characters that + precede the terminating null wide character. +**/ +size_t wcslen(const wchar_t *s) +{ + return (size_t)StrLen( (CONST CHAR16 *)s); +} + +/** The wmemset function copies the value of c into each of the first n wide + characters of the object pointed to by s. + + @return The wmemset function returns the value of s. +**/ +wchar_t *wmemset(wchar_t *s, wchar_t c, size_t n) +{ + return (wchar_t *)SetMem16( s, (UINTN)(n * sizeof(wchar_t)), (UINT16)c); +} diff --git a/StdLib/LibC/Wchar/Wchar.inf b/StdLib/LibC/Wchar/Wchar.inf new file mode 100644 index 0000000000..427d615742 --- /dev/null +++ b/StdLib/LibC/Wchar/Wchar.inf @@ -0,0 +1,59 @@ +## @file +# Standard C library: Miscelaneous implementations. +# +# Copyright (c) 2010, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php. +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = LibWchar + FILE_GUID = 42c078ef-14a8-4e30-9329-6f12d796e54a + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + LIBRARY_CLASS = LibWchar + CONSTRUCTOR = __wchar_construct + DESTRUCTOR = __wchar_deconstruct + +# +# VALID_ARCHITECTURES = IA32 X64 IPF +# + +[Sources] + ConsDecons.c + Copying.c + Concatenation.c + Comparison.c + Searching.c + String.c + +[Packages] + StdLib/StdLib.dec + StdLibPrivateInternalFiles/DoNotUse.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + MemoryAllocationLib + LibC + +################################################################ +# +# The Build Options, below, are only used when building the C library. +# DO NOT use them when building your application! +# Nasty things could happen if you do. +# +# /Oi is required for Microsoft VC++ to allow "intrinsic" functions to be +# defined in this library. +# +[BuildOptions] + MSFT:*_*_*_CC_FLAGS = /Oi- diff --git a/StdLib/LibC/gdtoa/Ipf/strtold.c b/StdLib/LibC/gdtoa/Ipf/strtold.c new file mode 100644 index 0000000000..0cddae36f4 --- /dev/null +++ b/StdLib/LibC/gdtoa/Ipf/strtold.c @@ -0,0 +1,18 @@ +/** @file + Wrapper for strtold so that it just calls strtod(). This is because the IPF implementation doesn't have + long double. (actually MS VC++ makes long double a distinct type that is identical to double.) VC++ + also doesn't support the {strong, weak}_alias feature so we actually have to have an object. + +**/ +#include +#include + +#include "namespace.h" +#include "../gdtoaimp.h" +#include "../gdtoa.h" + +long double +strtold(const char * __restrict nptr, char ** __restrict endptr) +{ + return (long double)strtod( nptr, endptr); +} diff --git a/StdLib/LibC/gdtoa/_strtof.c b/StdLib/LibC/gdtoa/_strtof.c new file mode 100644 index 0000000000..50073350dc --- /dev/null +++ b/StdLib/LibC/gdtoa/_strtof.c @@ -0,0 +1,46 @@ +/* $NetBSD: _strtof.c,v 1.1 2006/03/15 17:35:18 kleink Exp $ */ + +/* + * Copyright (c) 1996 Christos Zoulas. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Christos Zoulas. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include + +#if defined(__indr_reference) +__indr_reference(_strtof, strtof) +#else + +#include +float _strtof(const char * __restrict, char ** __restrict); + +float +strtof(const char *nptr, char **endptr) +{ + return _strtof(nptr, endptr); +} +#endif diff --git a/StdLib/LibC/gdtoa/_strtold.c b/StdLib/LibC/gdtoa/_strtold.c new file mode 100644 index 0000000000..f714b4e1ec --- /dev/null +++ b/StdLib/LibC/gdtoa/_strtold.c @@ -0,0 +1,47 @@ +/** @file + * + * Copyright (c) 1996 Christos Zoulas. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Christos Zoulas. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + NetBSD: _strtold.c,v 1.1 2006/03/15 17:35:18 kleink Exp +**/ +#include +#include + +#if defined(__indr_reference) + __indr_reference(_strtold, strtold) +#else + +#include +long double _strtold(const char * __restrict, char ** __restrict); + +long double +strtold(const char *nptr, char **endptr) +{ + return _strtold(nptr, endptr); +} +#endif diff --git a/StdLib/LibC/gdtoa/atof.c b/StdLib/LibC/gdtoa/atof.c new file mode 100644 index 0000000000..fe2b7f0889 --- /dev/null +++ b/StdLib/LibC/gdtoa/atof.c @@ -0,0 +1,22 @@ +/** @file + Convert a string into a floating-point double value. + + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include + +#include + +double +atof(const char *string) +{ + return (strtod(string, NULL)); +} diff --git a/StdLib/LibC/gdtoa/dmisc.c b/StdLib/LibC/gdtoa/dmisc.c new file mode 100644 index 0000000000..ff95b427fc --- /dev/null +++ b/StdLib/LibC/gdtoa/dmisc.c @@ -0,0 +1,228 @@ +/* $NetBSD: dmisc.c,v 1.2.4.1.4.1 2008/04/08 21:10:55 jdc Exp $ */ + +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ +#include + +#include "gdtoaimp.h" + +#ifndef MULTIPLE_THREADS + char *dtoa_result; +#endif + + char * +#ifdef KR_headers +rv_alloc(i) size_t i; +#else +rv_alloc(size_t i) +#endif +{ + size_t j; + int k, *r; + + j = sizeof(ULong); + for(k = 0; + sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= i; + j <<= 1) + k++; + r = (int*)(void*)Balloc(k); + if (r == NULL) + return NULL; + *r = k; + return +#ifndef MULTIPLE_THREADS + dtoa_result = +#endif + (char *)(void *)(r+1); + } + + char * +#ifdef KR_headers +nrv_alloc(s, rve, n) CONST char *s; char **rve; size_t n; +#else +nrv_alloc(CONST char *s, char **rve, size_t n) +#endif +{ + char *rv, *t; + + t = rv = rv_alloc(n); + if (t == NULL) + return NULL; + while((*t = *s++) !=0) + t++; + if (rve) + *rve = t; + return rv; + } + +/* freedtoa(s) must be used to free values s returned by dtoa + * when MULTIPLE_THREADS is #defined. It should be used in all cases, + * but for consistency with earlier versions of dtoa, it is optional + * when MULTIPLE_THREADS is not defined. + */ + + void +#ifdef KR_headers +freedtoa(s) char *s; +#else +freedtoa(char *s) +#endif +{ + Bigint *b = (Bigint *)(void *)((int *)(void *)s - 1); + b->maxwds = 1 << (b->k = *(int*)(void*)b); + Bfree(b); +#ifndef MULTIPLE_THREADS + if (s == dtoa_result) + dtoa_result = 0; +#endif + } + + int +quorem +#ifdef KR_headers + (b, S) Bigint *b, *S; +#else + (Bigint *b, Bigint *S) +#endif +{ + int n; + ULong *bx, *bxe, q, *sx, *sxe; +#ifdef ULLong + ULLong borrow, carry, y, ys; +#else + ULong borrow, carry, y, ys; +#ifdef Pack_32 + ULong si, z, zs; +#endif +#endif + + n = S->wds; +#ifdef DEBUG + /*debug*/ if (b->wds > n) + /*debug*/ Bug("oversize b in quorem"); +#endif + if (b->wds < n) + return 0; + sx = S->x; + sxe = sx + --n; + bx = b->x; + bxe = bx + n; + q = *bxe / (*sxe + 1); /* ensure q <= true quotient */ +#ifdef DEBUG + /*debug*/ if (q > 9) + /*debug*/ Bug("oversized quotient in quorem"); +#endif + if (q) { + borrow = 0; + carry = 0; + do { +#ifdef ULLong + ys = *sx++ * (ULLong)q + carry; + carry = ys >> 32; + /* LINTED conversion */ + y = *bx - (ys & 0xffffffffUL) - borrow; + borrow = y >> 32 & 1UL; + /* LINTED conversion */ + *bx++ = (UINT32)(y & 0xffffffffUL); +#else +#ifdef Pack_32 + si = *sx++; + ys = (si & 0xffff) * q + carry; + zs = (si >> 16) * q + (ys >> 16); + carry = zs >> 16; + y = (*bx & 0xffff) - (ys & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*bx >> 16) - (zs & 0xffff) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(bx, z, y); +#else + ys = *sx++ * q + carry; + carry = ys >> 16; + y = *bx - (ys & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + *bx++ = y & 0xffff; +#endif +#endif + } + while(sx <= sxe); + if (!*bxe) { + bx = b->x; + while(--bxe > bx && !*bxe) + --n; + b->wds = n; + } + } + if (cmp(b, S) >= 0) { + q++; + borrow = 0; + carry = 0; + bx = b->x; + sx = S->x; + do { +#ifdef ULLong + ys = *sx++ + carry; + carry = ys >> 32; + /* LINTED conversion */ + y = *bx - (ys & 0xffffffffUL) - borrow; + borrow = y >> 32 & 1UL; + /* LINTED conversion */ + *bx++ = (UINT32)(y & 0xffffffffUL); +#else +#ifdef Pack_32 + si = *sx++; + ys = (si & 0xffff) + carry; + zs = (si >> 16) + (ys >> 16); + carry = zs >> 16; + y = (*bx & 0xffff) - (ys & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*bx >> 16) - (zs & 0xffff) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(bx, z, y); +#else + ys = *sx++ + carry; + carry = ys >> 16; + y = *bx - (ys & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + *bx++ = y & 0xffff; +#endif +#endif + } + while(sx <= sxe); + bx = b->x; + bxe = bx + n; + if (!*bxe) { + while(--bxe > bx && !*bxe) + --n; + b->wds = n; + } + } + return (int)q; + } diff --git a/StdLib/LibC/gdtoa/dtoa.c b/StdLib/LibC/gdtoa/dtoa.c new file mode 100644 index 0000000000..42098426fd --- /dev/null +++ b/StdLib/LibC/gdtoa/dtoa.c @@ -0,0 +1,821 @@ +/* $NetBSD: dtoa.c,v 1.3.4.1.4.1 2008/04/08 21:10:55 jdc Exp $ */ + +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998, 1999 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ +#include + +#include "gdtoaimp.h" + +/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. + * + * Inspired by "How to Print Floating-Point Numbers Accurately" by + * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126]. + * + * Modifications: + * 1. Rather than iterating, we use a simple numeric overestimate + * to determine k = floor(log10(d)). We scale relevant + * quantities using O(log2(k)) rather than O(k) multiplications. + * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't + * try to generate digits strictly left to right. Instead, we + * compute with fewer bits and propagate the carry if necessary + * when rounding the final digit up. This is often faster. + * 3. Under the assumption that input will be rounded nearest, + * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. + * That is, we allow equality in stopping tests when the + * round-nearest rule will give the same floating-point value + * as would satisfaction of the stopping test with strict + * inequality. + * 4. We remove common factors of powers of 2 from relevant + * quantities. + * 5. When converting floating-point integers less than 1e16, + * we use floating-point arithmetic rather than resorting + * to multiple-precision integers. + * 6. When asked to produce fewer than 15 digits, we first try + * to get by with floating-point arithmetic; we resort to + * multiple-precision integer arithmetic only if we cannot + * guarantee that the floating-point calculation has given + * the correctly rounded result. For k requested digits and + * "uniformly" distributed input, the probability is + * something like 10^(k-15) that we must resort to the Long + * calculation. + */ + +#ifdef Honor_FLT_ROUNDS +#define Rounding rounding +#undef Check_FLT_ROUNDS +#define Check_FLT_ROUNDS +#else +#define Rounding Flt_Rounds +#endif + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ +// Disable: warning C4700: uninitialized local variable 'xx' used +#pragma warning ( disable : 4700 ) +#endif /* defined(_MSC_VER) */ + + char * +dtoa +#ifdef KR_headers + (d, mode, ndigits, decpt, sign, rve) + double d; int mode, ndigits, *decpt, *sign; char **rve; +#else + (double d, int mode, int ndigits, int *decpt, int *sign, char **rve) +#endif +{ + /* Arguments ndigits, decpt, sign are similar to those + of ecvt and fcvt; trailing zeros are suppressed from + the returned string. If not null, *rve is set to point + to the end of the return value. If d is +-Infinity or NaN, + then *decpt is set to 9999. + + mode: + 0 ==> shortest string that yields d when read in + and rounded to nearest. + 1 ==> like 0, but with Steele & White stopping rule; + e.g. with IEEE P754 arithmetic , mode 0 gives + 1e23 whereas mode 1 gives 9.999999999999999e22. + 2 ==> max(1,ndigits) significant digits. This gives a + return value similar to that of ecvt, except + that trailing zeros are suppressed. + 3 ==> through ndigits past the decimal point. This + gives a return value similar to that from fcvt, + except that trailing zeros are suppressed, and + ndigits can be negative. + 4,5 ==> similar to 2 and 3, respectively, but (in + round-nearest mode) with the tests of mode 0 to + possibly return a shorter string that rounds to d. + With IEEE arithmetic and compilation with + -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same + as modes 2 and 3 when FLT_ROUNDS != 1. + 6-9 ==> Debugging modes similar to mode - 4: don't try + fast floating-point estimate (if applicable). + + Values of mode other than 0-9 are treated as mode 0. + + Sufficient space is allocated to the return value + to hold the suppressed trailing zeros. + */ + + int bbits, b2, b5, be, dig, i, ieps, ilim0, + j, jj1, k, k0, k_check, leftright, m2, m5, s2, s5, + spec_case, try_quick; + int ilim = 0, ilim1 = 0; /* pacify gcc */ + Long L; +#ifndef Sudden_Underflow + int denorm; + ULong x; +#endif + Bigint *b, *b1, *delta, *mhi, *S; + Bigint *mlo = NULL; /* pacify gcc */ + double d2, ds, eps; + char *s, *s0; +#ifdef Honor_FLT_ROUNDS + int rounding; +#endif +#ifdef SET_INEXACT + int inexact, oldinexact; +#endif + +#ifndef MULTIPLE_THREADS + if (dtoa_result) { + freedtoa(dtoa_result); + dtoa_result = 0; + } +#endif + + if (word0(d) & Sign_bit) { + /* set sign for everything, including 0's and NaNs */ + *sign = 1; + word0(d) &= ~Sign_bit; /* clear sign bit */ + } + else + *sign = 0; + +#if defined(IEEE_Arith) + defined(VAX) +#ifdef IEEE_Arith + if ((word0(d) & Exp_mask) == Exp_mask) +#else + if (word0(d) == 0x8000) +#endif + { + /* Infinity or NaN */ + *decpt = 9999; +#ifdef IEEE_Arith + if (!word1(d) && !(word0(d) & 0xfffff)) + return nrv_alloc("Infinity", rve, 8); +#endif + return nrv_alloc("NaN", rve, 3); + } +#endif +#ifdef IBM + dval(d) += 0; /* normalize */ +#endif + if (!dval(d)) { + *decpt = 1; + return nrv_alloc("0", rve, 1); + } + +#ifdef SET_INEXACT + try_quick = oldinexact = get_inexact(); + inexact = 1; +#endif +#ifdef Honor_FLT_ROUNDS + if ((rounding = Flt_Rounds) >= 2) { + if (*sign) + rounding = rounding == 2 ? 0 : 2; + else + if (rounding != 2) + rounding = 0; + } +#endif + + b = d2b(dval(d), &be, &bbits); + if (b == NULL) + return NULL; +#ifdef Sudden_Underflow + i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)); +#else + if (( i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)) )!=0) { +#endif + dval(d2) = dval(d); + word0(d2) &= Frac_mask1; + word0(d2) |= Exp_11; +#ifdef IBM + if (( j = 11 - hi0bits(word0(d2) & Frac_mask) )!=0) + dval(d2) /= 1 << j; +#endif + + /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 + * log10(x) = log(x) / log(10) + * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) + * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2) + * + * This suggests computing an approximation k to log10(d) by + * + * k = (i - Bias)*0.301029995663981 + * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); + * + * We want k to be too large rather than too small. + * The error in the first-order Taylor series approximation + * is in our favor, so we just round up the constant enough + * to compensate for any error in the multiplication of + * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077, + * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, + * adding 1e-13 to the constant term more than suffices. + * Hence we adjust the constant term to 0.1760912590558. + * (We could get a more accurate k by invoking log10, + * but this is probably not worthwhile.) + */ + + i -= Bias; +#ifdef IBM + i <<= 2; + i += j; +#endif +#ifndef Sudden_Underflow + denorm = 0; + } + else { + /* d is denormalized */ + + i = bbits + be + (Bias + (P-1) - 1); + x = i > 32 ? word0(d) << (64 - i) | word1(d) >> (i - 32) + : word1(d) << (32 - i); + dval(d2) = (double)x; + word0(d2) -= 31*Exp_msk1; /* adjust exponent */ + i -= (Bias + (P-1) - 1) + 1; + denorm = 1; + } +#endif + ds = (dval(d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981; + k = (int)ds; + if (ds < 0. && ds != k) + k--; /* want k = floor(ds) */ + k_check = 1; + if (k >= 0 && k <= Ten_pmax) { + if (dval(d) < tens[k]) + k--; + k_check = 0; + } + j = bbits - i - 1; + if (j >= 0) { + b2 = 0; + s2 = j; + } + else { + b2 = -j; + s2 = 0; + } + if (k >= 0) { + b5 = 0; + s5 = k; + s2 += k; + } + else { + b2 -= k; + b5 = -k; + s5 = 0; + } + if (mode < 0 || mode > 9) + mode = 0; + +#ifndef SET_INEXACT +#ifdef Check_FLT_ROUNDS + try_quick = Rounding == 1; +#else + try_quick = 1; +#endif +#endif /*SET_INEXACT*/ + + if (mode > 5) { + mode -= 4; + try_quick = 0; + } + leftright = 1; + switch(mode) { + case 0: + case 1: + ilim = ilim1 = -1; + i = 18; + ndigits = 0; + break; + case 2: + leftright = 0; + /* FALLTHROUGH */ + case 4: + if (ndigits <= 0) + ndigits = 1; + ilim = ilim1 = i = ndigits; + break; + case 3: + leftright = 0; + /* FALLTHROUGH */ + case 5: + i = ndigits + k + 1; + ilim = i; + ilim1 = i - 1; + if (i <= 0) + i = 1; + } + s = s0 = rv_alloc((size_t)i); + if (s == NULL) + return NULL; + +#ifdef Honor_FLT_ROUNDS + if (mode > 1 && rounding != 1) + leftright = 0; +#endif + + if (ilim >= 0 && ilim <= Quick_max && try_quick) { + + /* Try to get by with floating-point arithmetic. */ + + i = 0; + dval(d2) = dval(d); + k0 = k; + ilim0 = ilim; + ieps = 2; /* conservative */ + if (k > 0) { + ds = tens[k&0xf]; + j = (unsigned int)k >> 4; + if (j & Bletch) { + /* prevent overflows */ + j &= Bletch - 1; + dval(d) /= bigtens[n_bigtens-1]; + ieps++; + } + for(; j; j = (unsigned int)j >> 1, i++) + if (j & 1) { + ieps++; + ds *= bigtens[i]; + } + dval(d) /= ds; + } + else if (( jj1 = -k )!=0) { + dval(d) *= tens[jj1 & 0xf]; + for(j = jj1 >> 4; j; j >>= 1, i++) + if (j & 1) { + ieps++; + dval(d) *= bigtens[i]; + } + } + if (k_check && dval(d) < 1. && ilim > 0) { + if (ilim1 <= 0) + goto fast_failed; + ilim = ilim1; + k--; + dval(d) *= 10.; + ieps++; + } + dval(eps) = ieps*dval(d) + 7.; + word0(eps) -= (P-1)*Exp_msk1; + if (ilim == 0) { + S = mhi = 0; + dval(d) -= 5.; + if (dval(d) > dval(eps)) + goto one_digit; + if (dval(d) < -dval(eps)) + goto no_digits; + goto fast_failed; + } +#ifndef No_leftright + if (leftright) { + /* Use Steele & White method of only + * generating digits needed. + */ + dval(eps) = 0.5/tens[ilim-1] - dval(eps); + for(i = 0;;) { + L = (INT32)dval(d); + dval(d) -= L; + *s++ = (char)('0' + (int)L); + if (dval(d) < dval(eps)) + goto ret1; + if (1. - dval(d) < dval(eps)) + goto bump_up; + if (++i >= ilim) + break; + dval(eps) *= 10.; + dval(d) *= 10.; + } + } + else { +#endif + /* Generate ilim digits, then fix them up. */ + dval(eps) *= tens[ilim-1]; + for(i = 1;; i++, dval(d) *= 10.) { + L = (Long)(dval(d)); + if (!(dval(d) -= L)) + ilim = i; + *s++ = (char)('0' + (int)L); + if (i == ilim) { + if (dval(d) > 0.5 + dval(eps)) + goto bump_up; + else if (dval(d) < 0.5 - dval(eps)) { + while(*--s == '0'); + s++; + goto ret1; + } + break; + } + } +#ifndef No_leftright + } +#endif + fast_failed: + s = s0; + dval(d) = dval(d2); + k = k0; + ilim = ilim0; + } + + /* Do we have a "small" integer? */ + + if (be >= 0 && k <= Int_max) { + /* Yes. */ + ds = tens[k]; + if (ndigits < 0 && ilim <= 0) { + S = mhi = 0; + if (ilim < 0 || dval(d) <= 5*ds) + goto no_digits; + goto one_digit; + } + for(i = 1;; i++, dval(d) *= 10.) { + L = (Long)(dval(d) / ds); + dval(d) -= L*ds; +#ifdef Check_FLT_ROUNDS + /* If FLT_ROUNDS == 2, L will usually be high by 1 */ + if (dval(d) < 0) { + L--; + dval(d) += ds; + } +#endif + *s++ = (char)('0' + (int)L); + if (!dval(d)) { +#ifdef SET_INEXACT + inexact = 0; +#endif + break; + } + if (i == ilim) { +#ifdef Honor_FLT_ROUNDS + if (mode > 1) + switch(rounding) { + case 0: goto ret1; + case 2: goto bump_up; + } +#endif + dval(d) += dval(d); + if (dval(d) > ds || (dval(d) == ds && L & 1)) { + bump_up: + while(*--s == '9') + if (s == s0) { + k++; + *s = '0'; + break; + } + ++*s++; + } + break; + } + } + goto ret1; + } + + m2 = b2; + m5 = b5; + mhi = mlo = 0; + if (leftright) { + i = +#ifndef Sudden_Underflow + denorm ? be + (Bias + (P-1) - 1 + 1) : +#endif +#ifdef IBM + 1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3); +#else + 1 + P - bbits; +#endif + b2 += i; + s2 += i; + mhi = i2b(1); + if (mhi == NULL) + return NULL; + } + if (m2 > 0 && s2 > 0) { + i = m2 < s2 ? m2 : s2; + b2 -= i; + m2 -= i; + s2 -= i; + } + if (b5 > 0) { + if (leftright) { + if (m5 > 0) { + mhi = pow5mult(mhi, m5); + if (mhi == NULL) + return NULL; + b1 = mult(mhi, b); + if (b1 == NULL) + return NULL; + Bfree(b); + b = b1; + } + if (( j = b5 - m5 )!=0) + b = pow5mult(b, j); + if (b == NULL) + return NULL; + } + else + b = pow5mult(b, b5); + if (b == NULL) + return NULL; + } + S = i2b(1); + if (S == NULL) + return NULL; + if (s5 > 0) { + S = pow5mult(S, s5); + if (S == NULL) + return NULL; + } + + /* Check for special case that d is a normalized power of 2. */ + + spec_case = 0; + if ((mode < 2 || leftright) +#ifdef Honor_FLT_ROUNDS + && rounding == 1 +#endif + ) { + if (!word1(d) && !(word0(d) & Bndry_mask) +#ifndef Sudden_Underflow + && word0(d) & (Exp_mask & ~Exp_msk1) +#endif + ) { + /* The special case */ + b2 += Log2P; + s2 += Log2P; + spec_case = 1; + } + } + + /* Arrange for convenient computation of quotients: + * shift left if necessary so divisor has 4 leading 0 bits. + * + * Perhaps we should just compute leading 28 bits of S once + * and for all and pass them and a shift to quorem, so it + * can do shifts and ors to compute the numerator for q. + */ +#ifdef Pack_32 + if (( i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f )!=0) + i = 32 - i; +#else + if (( i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf )!=0) + i = 16 - i; +#endif + if (i > 4) { + i -= 4; + b2 += i; + m2 += i; + s2 += i; + } + else if (i < 4) { + i += 28; + b2 += i; + m2 += i; + s2 += i; + } + if (b2 > 0) { + b = lshift(b, b2); + if (b == NULL) + return NULL; + } + if (s2 > 0) { + S = lshift(S, s2); + if (S == NULL) + return NULL; + } + if (k_check) { + if (cmp(b,S) < 0) { + k--; + b = multadd(b, 10, 0); /* we botched the k estimate */ + if (b == NULL) + return NULL; + if (leftright) { + mhi = multadd(mhi, 10, 0); + if (mhi == NULL) + return NULL; + } + ilim = ilim1; + } + } + if (ilim <= 0 && (mode == 3 || mode == 5)) { + if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) { + /* no digits, fcvt style */ + no_digits: + k = -1 - ndigits; + goto ret; + } + one_digit: + *s++ = '1'; + k++; + goto ret; + } + if (leftright) { + if (m2 > 0) { + mhi = lshift(mhi, m2); + if (mhi == NULL) + return NULL; + } + + /* Compute mlo -- check for special case + * that d is a normalized power of 2. + */ + + mlo = mhi; + if (spec_case) { + mhi = Balloc(mhi->k); + if (mhi == NULL) + return NULL; + Bcopy(mhi, mlo); + mhi = lshift(mhi, Log2P); + if (mhi == NULL) + return NULL; + } + + for(i = 1;;i++) { + dig = quorem(b,S) + '0'; + /* Do we yet have the shortest decimal string + * that will round to d? + */ + j = cmp(b, mlo); + delta = diff(S, mhi); + if (delta == NULL) + return NULL; + jj1 = delta->sign ? 1 : cmp(b, delta); + Bfree(delta); +#ifndef ROUND_BIASED + if (jj1 == 0 && mode != 1 && !(word1(d) & 1) +#ifdef Honor_FLT_ROUNDS + && rounding >= 1 +#endif + ) { + if (dig == '9') + goto round_9_up; + if (j > 0) + dig++; +#ifdef SET_INEXACT + else if (!b->x[0] && b->wds <= 1) + inexact = 0; +#endif + *s++ = (char)dig; + goto ret; + } +#endif + if (j < 0 || (j == 0 && mode != 1 +#ifndef ROUND_BIASED + && !(word1(d) & 1) +#endif + )) { + if (!b->x[0] && b->wds <= 1) { +#ifdef SET_INEXACT + inexact = 0; +#endif + goto accept_dig; + } +#ifdef Honor_FLT_ROUNDS + if (mode > 1) + switch(rounding) { + case 0: goto accept_dig; + case 2: goto keep_dig; + } +#endif /*Honor_FLT_ROUNDS*/ + if (jj1 > 0) { + b = lshift(b, 1); + if (b == NULL) + return NULL; + jj1 = cmp(b, S); + if ((jj1 > 0 || (jj1 == 0 && dig & 1)) + && dig++ == '9') + goto round_9_up; + } + accept_dig: + *s++ = (char)dig; + goto ret; + } + if (jj1 > 0) { +#ifdef Honor_FLT_ROUNDS + if (!rounding) + goto accept_dig; +#endif + if (dig == '9') { /* possible if i == 1 */ + round_9_up: + *s++ = '9'; + goto roundoff; + } + *s++ = (char)(dig + 1); + goto ret; + } +#ifdef Honor_FLT_ROUNDS + keep_dig: +#endif + *s++ = (char)dig; + if (i == ilim) + break; + b = multadd(b, 10, 0); + if (b == NULL) + return NULL; + if (mlo == mhi) { + mlo = mhi = multadd(mhi, 10, 0); + if (mlo == NULL) + return NULL; + } + else { + mlo = multadd(mlo, 10, 0); + if (mlo == NULL) + return NULL; + mhi = multadd(mhi, 10, 0); + if (mhi == NULL) + return NULL; + } + } + } + else + for(i = 1;; i++) { + *s++ = (char)(dig = (int)(quorem(b,S) + '0')); + if (!b->x[0] && b->wds <= 1) { +#ifdef SET_INEXACT + inexact = 0; +#endif + goto ret; + } + if (i >= ilim) + break; + b = multadd(b, 10, 0); + if (b == NULL) + return NULL; + } + + /* Round off last digit */ + +#ifdef Honor_FLT_ROUNDS + switch(rounding) { + case 0: goto trimzeros; + case 2: goto roundoff; + } +#endif + b = lshift(b, 1); + j = cmp(b, S); + if (j > 0 || (j == 0 && dig & 1)) { + roundoff: + while(*--s == '9') + if (s == s0) { + k++; + *s++ = '1'; + goto ret; + } + ++*s++; + } + else { +#ifdef Honor_FLT_ROUNDS + trimzeros: +#endif + while(*--s == '0'); + s++; + } + ret: + Bfree(S); + if (mhi) { + if (mlo && mlo != mhi) + Bfree(mlo); + Bfree(mhi); + } + ret1: +#ifdef SET_INEXACT + if (inexact) { + if (!oldinexact) { + word0(d) = Exp_1 + (70 << Exp_shift); + word1(d) = 0; + dval(d) += 1.; + } + } + else if (!oldinexact) + clear_inexact(); +#endif + Bfree(b); + if (s == s0) { /* don't return empty string */ + *s++ = '0'; + k = 0; + } + *s = 0; + *decpt = k + 1; + if (rve) + *rve = s; + return s0; + } diff --git a/StdLib/LibC/gdtoa/gdtoa.c b/StdLib/LibC/gdtoa/gdtoa.c new file mode 100644 index 0000000000..b1457c1470 --- /dev/null +++ b/StdLib/LibC/gdtoa/gdtoa.c @@ -0,0 +1,814 @@ +/* $NetBSD: gdtoa.c,v 1.1.1.1.4.1.4.1 2008/04/08 21:10:55 jdc Exp $ */ + +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998, 1999 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ +#include + +#include "gdtoaimp.h" + +#if defined(_MSC_VER) + /* Disable warnings about conversions to narrower data types. */ + #pragma warning ( disable : 4244 ) + // Squelch bogus warnings about uninitialized variable use. + #pragma warning ( disable : 4701 ) +#endif + +static Bigint * +bitstob(ULong *bits, int nbits, int *bbits) +{ + int i, k; + Bigint *b; + ULong *be, *x, *x0; + + i = ULbits; + k = 0; + while(i < nbits) { + i <<= 1; + k++; + } +#ifndef Pack_32 + if (!k) + k = 1; +#endif + b = Balloc(k); + if (b == NULL) + return NULL; + be = bits + (((unsigned int)nbits - 1) >> kshift); + x = x0 = b->x; + do { + *x++ = *bits & ALL_ON; +#ifdef Pack_16 + *x++ = (*bits >> 16) & ALL_ON; +#endif + } while(++bits <= be); + i = x - x0; + while(!x0[--i]) + if (!i) { + b->wds = 0; + *bbits = 0; + goto ret; + } + b->wds = i + 1; + *bbits = i*ULbits + 32 - hi0bits(b->x[i]); + ret: + return b; + } + +/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. + * + * Inspired by "How to Print Floating-Point Numbers Accurately" by + * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126]. + * + * Modifications: + * 1. Rather than iterating, we use a simple numeric overestimate + * to determine k = floor(log10(d)). We scale relevant + * quantities using O(log2(k)) rather than O(k) multiplications. + * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't + * try to generate digits strictly left to right. Instead, we + * compute with fewer bits and propagate the carry if necessary + * when rounding the final digit up. This is often faster. + * 3. Under the assumption that input will be rounded nearest, + * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. + * That is, we allow equality in stopping tests when the + * round-nearest rule will give the same floating-point value + * as would satisfaction of the stopping test with strict + * inequality. + * 4. We remove common factors of powers of 2 from relevant + * quantities. + * 5. When converting floating-point integers less than 1e16, + * we use floating-point arithmetic rather than resorting + * to multiple-precision integers. + * 6. When asked to produce fewer than 15 digits, we first try + * to get by with floating-point arithmetic; we resort to + * multiple-precision integer arithmetic only if we cannot + * guarantee that the floating-point calculation has given + * the correctly rounded result. For k requested digits and + * "uniformly" distributed input, the probability is + * something like 10^(k-15) that we must resort to the Long + * calculation. + */ + + char * +gdtoa + (FPI *fpi, int be, ULong *bits, int *kindp, int mode, int ndigits, int *decpt, char **rve) +{ + /* Arguments ndigits and decpt are similar to the second and third + arguments of ecvt and fcvt; trailing zeros are suppressed from + the returned string. If not null, *rve is set to point + to the end of the return value. If d is +-Infinity or NaN, + then *decpt is set to 9999. + + mode: + 0 ==> shortest string that yields d when read in + and rounded to nearest. + 1 ==> like 0, but with Steele & White stopping rule; + e.g. with IEEE P754 arithmetic , mode 0 gives + 1e23 whereas mode 1 gives 9.999999999999999e22. + 2 ==> max(1,ndigits) significant digits. This gives a + return value similar to that of ecvt, except + that trailing zeros are suppressed. + 3 ==> through ndigits past the decimal point. This + gives a return value similar to that from fcvt, + except that trailing zeros are suppressed, and + ndigits can be negative. + 4-9 should give the same return values as 2-3, i.e., + 4 <= mode <= 9 ==> same return as mode + 2 + (mode & 1). These modes are mainly for + debugging; often they run slower but sometimes + faster than modes 2-3. + 4,5,8,9 ==> left-to-right digit generation. + 6-9 ==> don't try fast floating-point estimate + (if applicable). + + Values of mode other than 0-9 are treated as mode 0. + + Sufficient space is allocated to the return value + to hold the suppressed trailing zeros. + */ + + int bbits, b2, b5, be0, dig, i, ieps, ilim = 0, ilim0, ilim1 = 0, inex; + int j, jj1, k, k0, k_check, kind, leftright, m2, m5, nbits; + int rdir, s2, s5, spec_case, try_quick; + Long L; + Bigint *b, *b1, *delta, *mlo, *mhi, *mhi1, *S; + double d, d2, ds, eps; + char *s, *s0; + +#ifndef MULTIPLE_THREADS + if (dtoa_result) { + freedtoa(dtoa_result); + dtoa_result = 0; + } +#endif + inex = 0; + if (*kindp & STRTOG_NoMemory) + return NULL; + kind = *kindp &= ~STRTOG_Inexact; + switch(kind & STRTOG_Retmask) { + case STRTOG_Zero: + goto ret_zero; + case STRTOG_Normal: + case STRTOG_Denormal: + break; + case STRTOG_Infinite: + *decpt = -32768; + return nrv_alloc("Infinity", rve, 8); + case STRTOG_NaN: + *decpt = -32768; + return nrv_alloc("NaN", rve, 3); + default: + return 0; + } + b = bitstob(bits, nbits = fpi->nbits, &bbits); + if (b == NULL) + return NULL; + be0 = be; + if ( (i = trailz(b)) !=0) { + rshift(b, i); + be += i; + bbits -= i; + } + if (!b->wds) { + Bfree(b); + ret_zero: + *decpt = 1; + return nrv_alloc("0", rve, 1); + } + + dval(d) = b2d(b, &i); + i = be + bbits - 1; + word0(d) &= Frac_mask1; + word0(d) |= Exp_11; +#ifdef IBM + if ( (j = 11 - hi0bits(word0(d) & Frac_mask)) !=0) + dval(d) /= 1 << j; +#endif + + /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 + * log10(x) = log(x) / log(10) + * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) + * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2) + * + * This suggests computing an approximation k to log10(d) by + * + * k = (i - Bias)*0.301029995663981 + * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); + * + * We want k to be too large rather than too small. + * The error in the first-order Taylor series approximation + * is in our favor, so we just round up the constant enough + * to compensate for any error in the multiplication of + * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077, + * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, + * adding 1e-13 to the constant term more than suffices. + * Hence we adjust the constant term to 0.1760912590558. + * (We could get a more accurate k by invoking log10, + * but this is probably not worthwhile.) + */ +#ifdef IBM + i <<= 2; + i += j; +#endif + ds = (dval(d)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981; + + /* correct assumption about exponent range */ + if ((j = i) < 0) + j = -j; + if ((j -= 1077) > 0) + ds += j * 7e-17; + + k = (int)ds; + if (ds < 0. && ds != k) + k--; /* want k = floor(ds) */ + k_check = 1; +#ifdef IBM + j = be + bbits - 1; + if ( (jj1 = j & 3) !=0) + dval(d) *= 1 << jj1; + word0(d) += j << Exp_shift - 2 & Exp_mask; +#else + word0(d) += (be + bbits - 1) << Exp_shift; +#endif + if (k >= 0 && k <= Ten_pmax) { + if (dval(d) < tens[k]) + k--; + k_check = 0; + } + j = bbits - i - 1; + if (j >= 0) { + b2 = 0; + s2 = j; + } + else { + b2 = -j; + s2 = 0; + } + if (k >= 0) { + b5 = 0; + s5 = k; + s2 += k; + } + else { + b2 -= k; + b5 = -k; + s5 = 0; + } + if (mode < 0 || mode > 9) + mode = 0; + try_quick = 1; + if (mode > 5) { + mode -= 4; + try_quick = 0; + } + leftright = 1; + switch(mode) { + case 0: + case 1: + ilim = ilim1 = -1; + i = (int)(nbits * .30103) + 3; + ndigits = 0; + break; + case 2: + leftright = 0; + /*FALLTHROUGH*/ + case 4: + if (ndigits <= 0) + ndigits = 1; + ilim = ilim1 = i = ndigits; + break; + case 3: + leftright = 0; + /*FALLTHROUGH*/ + case 5: + i = ndigits + k + 1; + ilim = i; + ilim1 = i - 1; + if (i <= 0) + i = 1; + } + s = s0 = rv_alloc((size_t)i); + if (s == NULL) + return NULL; + + if ( (rdir = fpi->rounding - 1) !=0) { + if (rdir < 0) + rdir = 2; + if (kind & STRTOG_Neg) + rdir = 3 - rdir; + } + + /* Now rdir = 0 ==> round near, 1 ==> round up, 2 ==> round down. */ + + if (ilim >= 0 && ilim <= Quick_max && try_quick && !rdir +#ifndef IMPRECISE_INEXACT + && k == 0 +#endif + ) { + + /* Try to get by with floating-point arithmetic. */ + + i = 0; + d2 = dval(d); +#ifdef IBM + if ( (j = 11 - hi0bits(word0(d) & Frac_mask)) !=0) + dval(d) /= 1 << j; +#endif + k0 = k; + ilim0 = ilim; + ieps = 2; /* conservative */ + if (k > 0) { + ds = tens[k&0xf]; + j = (unsigned int)k >> 4; + if (j & Bletch) { + /* prevent overflows */ + j &= Bletch - 1; + dval(d) /= bigtens[n_bigtens-1]; + ieps++; + } + for(; j; j /= 2, i++) + if (j & 1) { + ieps++; + ds *= bigtens[i]; + } + } + else { + ds = 1.; + if ( (jj1 = -k) !=0) { + dval(d) *= tens[jj1 & 0xf]; + for(j = jj1 >> 4; j; j >>= 1, i++) + if (j & 1) { + ieps++; + dval(d) *= bigtens[i]; + } + } + } + if (k_check && dval(d) < 1. && ilim > 0) { + if (ilim1 <= 0) + goto fast_failed; + ilim = ilim1; + k--; + dval(d) *= 10.; + ieps++; + } + dval(eps) = ieps*dval(d) + 7.; + word0(eps) -= (P-1)*Exp_msk1; + if (ilim == 0) { + S = mhi = 0; + dval(d) -= 5.; + if (dval(d) > dval(eps)) + goto one_digit; + if (dval(d) < -dval(eps)) + goto no_digits; + goto fast_failed; + } +#ifndef No_leftright + if (leftright) { + /* Use Steele & White method of only + * generating digits needed. + */ + dval(eps) = ds*0.5/tens[ilim-1] - dval(eps); + for(i = 0;;) { + L = (Long)(dval(d)/ds); + dval(d) -= L*ds; + *s++ = '0' + (int)L; + if (dval(d) < dval(eps)) { + if (dval(d)) + inex = STRTOG_Inexlo; + goto ret1; + } + if (ds - dval(d) < dval(eps)) + goto bump_up; + if (++i >= ilim) + break; + dval(eps) *= 10.; + dval(d) *= 10.; + } + } + else { +#endif + /* Generate ilim digits, then fix them up. */ + dval(eps) *= tens[ilim-1]; + for(i = 1;; i++, dval(d) *= 10.) { + if ( (L = (Long)(dval(d)/ds)) !=0) + dval(d) -= L*ds; + *s++ = '0' + (int)L; + if (i == ilim) { + ds *= 0.5; + if (dval(d) > ds + dval(eps)) + goto bump_up; + else if (dval(d) < ds - dval(eps)) { + while(*--s == '0'){} + s++; + if (dval(d)) + inex = STRTOG_Inexlo; + goto ret1; + } + break; + } + } +#ifndef No_leftright + } +#endif + fast_failed: + s = s0; + dval(d) = d2; + k = k0; + ilim = ilim0; + } + + /* Do we have a "small" integer? */ + + if (be >= 0 && k <= Int_max) { + /* Yes. */ + ds = tens[k]; + if (ndigits < 0 && ilim <= 0) { + S = mhi = 0; + if (ilim < 0 || dval(d) <= 5*ds) + goto no_digits; + goto one_digit; + } + for(i = 1;; i++, dval(d) *= 10.) { + L = dval(d) / ds; + dval(d) -= L*ds; +#ifdef Check_FLT_ROUNDS + /* If FLT_ROUNDS == 2, L will usually be high by 1 */ + if (dval(d) < 0) { + L--; + dval(d) += ds; + } +#endif + *s++ = '0' + (int)L; + if (dval(d) == 0.) + break; + if (i == ilim) { + if (rdir) { + if (rdir == 1) + goto bump_up; + inex = STRTOG_Inexlo; + goto ret1; + } + dval(d) += dval(d); + if (dval(d) > ds || (dval(d) == ds && L & 1)) { + bump_up: + inex = STRTOG_Inexhi; + while(*--s == '9') + if (s == s0) { + k++; + *s = '0'; + break; + } + ++*s++; + } + else + inex = STRTOG_Inexlo; + break; + } + } + goto ret1; + } + + m2 = b2; + m5 = b5; + mhi = mlo = 0; + if (leftright) { + if (mode < 2) { + i = nbits - bbits; + if (be - i++ < fpi->emin) + /* denormal */ + i = be - fpi->emin + 1; + } + else { + j = ilim - 1; + if (m5 >= j) + m5 -= j; + else { + s5 += j -= m5; + b5 += j; + m5 = 0; + } + if ((i = ilim) < 0) { + m2 -= i; + i = 0; + } + } + b2 += i; + s2 += i; + mhi = i2b(1); + } + if (m2 > 0 && s2 > 0) { + i = m2 < s2 ? m2 : s2; + b2 -= i; + m2 -= i; + s2 -= i; + } + if (b5 > 0) { + if (leftright) { + if (m5 > 0) { + mhi = pow5mult(mhi, m5); + if (mhi == NULL) + return NULL; + b1 = mult(mhi, b); + if (b1 == NULL) + return NULL; + Bfree(b); + b = b1; + } + if ( (j = b5 - m5) !=0) { + b = pow5mult(b, j); + if (b == NULL) + return NULL; + } + } + else { + b = pow5mult(b, b5); + if (b == NULL) + return NULL; + } + } + S = i2b(1); + if (S == NULL) + return NULL; + if (s5 > 0) { + S = pow5mult(S, s5); + if (S == NULL) + return NULL; + } + + /* Check for special case that d is a normalized power of 2. */ + + spec_case = 0; + if (mode < 2) { + if (bbits == 1 && be0 > fpi->emin + 1) { + /* The special case */ + b2++; + s2++; + spec_case = 1; + } + } + + /* Arrange for convenient computation of quotients: + * shift left if necessary so divisor has 4 leading 0 bits. + * + * Perhaps we should just compute leading 28 bits of S once + * and for all and pass them and a shift to quorem, so it + * can do shifts and ors to compute the numerator for q. + */ +#ifdef Pack_32 + if ( (i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f) !=0) + i = 32 - i; +#else + if ( (i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf) !=0) + i = 16 - i; +#endif + if (i > 4) { + i -= 4; + b2 += i; + m2 += i; + s2 += i; + } + else if (i < 4) { + i += 28; + b2 += i; + m2 += i; + s2 += i; + } + if (b2 > 0) + b = lshift(b, b2); + if (s2 > 0) + S = lshift(S, s2); + if (k_check) { + if (cmp(b,S) < 0) { + k--; + b = multadd(b, 10, 0); /* we botched the k estimate */ + if (b == NULL) + return NULL; + if (leftright) { + mhi = multadd(mhi, 10, 0); + if (mhi == NULL) + return NULL; + } + ilim = ilim1; + } + } + if (ilim <= 0 && mode > 2) { + if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) { + /* no digits, fcvt style */ + no_digits: + k = -1 - ndigits; + inex = STRTOG_Inexlo; + goto ret; + } + one_digit: + inex = STRTOG_Inexhi; + *s++ = '1'; + k++; + goto ret; + } + if (leftright) { + if (m2 > 0) { + mhi = lshift(mhi, m2); + if (mhi == NULL) + return NULL; + } + + /* Compute mlo -- check for special case + * that d is a normalized power of 2. + */ + + mlo = mhi; + if (spec_case) { + mhi = Balloc(mhi->k); + if (mhi == NULL) + return NULL; + Bcopy(mhi, mlo); + mhi = lshift(mhi, 1); + if (mhi == NULL) + return NULL; + } + + for(i = 1;;i++) { + dig = quorem(b,S) + '0'; + /* Do we yet have the shortest decimal string + * that will round to d? + */ + j = cmp(b, mlo); + delta = diff(S, mhi); + if (delta == NULL) + return NULL; + jj1 = delta->sign ? 1 : cmp(b, delta); + Bfree(delta); +#ifndef ROUND_BIASED + if (jj1 == 0 && !mode && !(bits[0] & 1) && !rdir) { + if (dig == '9') + goto round_9_up; + if (j <= 0) { + if (b->wds > 1 || b->x[0]) + inex = STRTOG_Inexlo; + } + else { + dig++; + inex = STRTOG_Inexhi; + } + *s++ = dig; + goto ret; + } +#endif + if (j < 0 || (j == 0 && !mode +#ifndef ROUND_BIASED + && !(bits[0] & 1) +#endif + )) { + if (rdir && (b->wds > 1 || b->x[0])) { + if (rdir == 2) { + inex = STRTOG_Inexlo; + goto accept; + } + while (cmp(S,mhi) > 0) { + *s++ = dig; + mhi1 = multadd(mhi, 10, 0); + if (mhi1 == NULL) + return NULL; + if (mlo == mhi) + mlo = mhi1; + mhi = mhi1; + b = multadd(b, 10, 0); + if (b == NULL) + return NULL; + dig = quorem(b,S) + '0'; + } + if (dig++ == '9') + goto round_9_up; + inex = STRTOG_Inexhi; + goto accept; + } + if (jj1 > 0) { + b = lshift(b, 1); + if (b == NULL) + return NULL; + jj1 = cmp(b, S); + if ((jj1 > 0 || (jj1 == 0 && dig & 1)) + && dig++ == '9') + goto round_9_up; + inex = STRTOG_Inexhi; + } + if (b->wds > 1 || b->x[0]) + inex = STRTOG_Inexlo; + accept: + *s++ = dig; + goto ret; + } + if (jj1 > 0 && rdir != 2) { + if (dig == '9') { /* possible if i == 1 */ + round_9_up: + *s++ = '9'; + inex = STRTOG_Inexhi; + goto roundoff; + } + inex = STRTOG_Inexhi; + *s++ = dig + 1; + goto ret; + } + *s++ = dig; + if (i == ilim) + break; + b = multadd(b, 10, 0); + if (b == NULL) + return NULL; + if (mlo == mhi) { + mlo = mhi = multadd(mhi, 10, 0); + if (mlo == NULL) + return NULL; + } + else { + mlo = multadd(mlo, 10, 0); + if (mlo == NULL) + return NULL; + mhi = multadd(mhi, 10, 0); + if (mhi == NULL) + return NULL; + } + } + } + else + for(i = 1;; i++) { + *s++ = dig = quorem(b,S) + '0'; + if (i >= ilim) + break; + b = multadd(b, 10, 0); + if (b == NULL) + return NULL; + } + + /* Round off last digit */ + + if (rdir) { + if (rdir == 2 || (b->wds <= 1 && !b->x[0])) + goto chopzeros; + goto roundoff; + } + b = lshift(b, 1); + if (b == NULL) + return NULL; + j = cmp(b, S); + if (j > 0 || (j == 0 && dig & 1)) { + roundoff: + inex = STRTOG_Inexhi; + while(*--s == '9') + if (s == s0) { + k++; + *s++ = '1'; + goto ret; + } + ++*s++; + } + else { + chopzeros: + if (b->wds > 1 || b->x[0]) + inex = STRTOG_Inexlo; + while(*--s == '0'){} + s++; + } + ret: + Bfree(S); + if (mhi) { + if (mlo && mlo != mhi) + Bfree(mlo); + Bfree(mhi); + } + ret1: + Bfree(b); + *s = 0; + *decpt = k + 1; + if (rve) + *rve = s; + *kindp |= inex; + return s0; + } diff --git a/StdLib/LibC/gdtoa/gdtoa.h b/StdLib/LibC/gdtoa/gdtoa.h new file mode 100644 index 0000000000..82f126caf2 --- /dev/null +++ b/StdLib/LibC/gdtoa/gdtoa.h @@ -0,0 +1,159 @@ +/* $NetBSD: gdtoa.h,v 1.6.4.1.4.1 2008/04/08 21:10:55 jdc Exp $ */ + +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ + +#ifndef GDTOA_H_INCLUDED +#define GDTOA_H_INCLUDED +#include + +#include "arith.h" + +#ifndef Long +#define Long EFI_LONG_T +#endif +#ifndef ULong +#define ULong EFI_ULONG_T +#endif +#ifndef UShort +#define UShort uint16_t +#endif + +#ifndef ANSI +#define ANSI(x) x +#define Void void +#endif /* ANSI */ + +#ifndef CONST +#define CONST const +#endif /* CONST */ + +enum { /* return values from strtodg */ + STRTOG_Zero = 0, + STRTOG_Normal = 1, + STRTOG_Denormal = 2, + STRTOG_Infinite = 3, + STRTOG_NaN = 4, + STRTOG_NaNbits = 5, + STRTOG_NoNumber = 6, + STRTOG_Retmask = 7, + + /* The following may be or-ed into one of the above values. */ + + STRTOG_Neg = 0x08, + STRTOG_Inexlo = 0x10, + STRTOG_Inexhi = 0x20, + STRTOG_Inexact = 0x30, + STRTOG_Underflow= 0x40, + STRTOG_Overflow = 0x80, + STRTOG_NoMemory = 0x100 +}; + + typedef struct +FPI { + int nbits; + int emin; + int emax; + int rounding; + int sudden_underflow; +} FPI; + +enum { /* FPI.rounding values: same as FLT_ROUNDS */ + FPI_Round_zero = 0, + FPI_Round_near = 1, + FPI_Round_up = 2, + FPI_Round_down = 3 +}; + +#ifdef __cplusplus +extern "C" { +#endif + +#define dtoa __dtoa +#define gdtoa __gdtoa +#define ldtoa __ldtoa +#define hldtoa __hldtoa +#define hdtoa __hdtoa +#define freedtoa __freedtoa +#define strtodg __strtodg_D2A +#define strtopQ __strtopQ_D2A +#define strtopx __strtopx_D2A +#define strtopxL __strtopxL_D2A +#define strtord __strtord_D2A + +extern char* dtoa ANSI((double d, int mode, int ndigits, int *decpt, + int *sign, char **rve)); +extern char* hdtoa ANSI((double d, const char *xdigs, int ndigits, int *decpt, + int *sign, char **rve)); +extern char* ldtoa ANSI((long double *ld, int mode, int ndigits, int *decpt, + int *sign, char **rve)); +extern char* hldtoa ANSI((long double e, const char *xdigs, int ndigits, + int *decpt, int *sign, char **rve)); + +extern char* gdtoa ANSI((FPI *fpi, int be, ULong *bits, int *kindp, + int mode, int ndigits, int *decpt, char **rve)); +extern void freedtoa ANSI((char*)); +extern float strtof ANSI((CONST char *, char **)); +extern double strtod ANSI((CONST char *, char **)); +extern int strtodg ANSI((CONST char*, char**, CONST FPI*, Long*, ULong*)); + +extern char* g_ddfmt ANSI((char*, double*, int, unsigned)); +extern char* g_dfmt ANSI((char*, double*, int, unsigned)); +extern char* g_ffmt ANSI((char*, float*, int, unsigned)); +extern char* g_Qfmt ANSI((char*, void*, int, unsigned)); +extern char* g_xfmt ANSI((char*, void*, int, unsigned)); +extern char* g_xLfmt ANSI((char*, void*, int, unsigned)); + +extern int strtoId ANSI((CONST char*, char**, double*, double*)); +extern int strtoIdd ANSI((CONST char*, char**, double*, double*)); +extern int strtoIf ANSI((CONST char*, char**, float*, float*)); +extern int strtoIQ ANSI((CONST char*, char**, void*, void*)); +extern int strtoIx ANSI((CONST char*, char**, void*, void*)); +extern int strtoIxL ANSI((CONST char*, char**, void*, void*)); +extern int strtord ANSI((CONST char*, char**, int, double*)); +extern int strtordd ANSI((CONST char*, char**, int, double*)); +extern int strtorf ANSI((CONST char*, char**, int, float*)); +extern int strtorQ ANSI((CONST char*, char**, int, void*)); +extern int strtorx ANSI((CONST char*, char**, int, void*)); +extern int strtorxL ANSI((CONST char*, char**, int, void*)); + +extern int strtodI ANSI((CONST char*, char**, double*)); +extern int strtopd ANSI((CONST char*, char**, double*)); +extern int strtopdd ANSI((CONST char*, char**, double*)); +extern int strtopf ANSI((CONST char*, char**, float*)); +extern int strtopQ ANSI((CONST char*, char**, void*)); +extern int strtopx ANSI((CONST char*, char**, void*)); +extern int strtopxL ANSI((CONST char*, char**, void*)); + +#ifdef __cplusplus +} +#endif +#endif /* GDTOA_H_INCLUDED */ diff --git a/StdLib/LibC/gdtoa/gdtoa.inf b/StdLib/LibC/gdtoa/gdtoa.inf new file mode 100644 index 0000000000..fbe3ac1b63 --- /dev/null +++ b/StdLib/LibC/gdtoa/gdtoa.inf @@ -0,0 +1,77 @@ +## @file +# This module contains source for a library of binary -> decimal +# and decimal -> binary conversion routines, for single-, double-, +# and extended-precision IEEE binary floating-point arithmetic, and +# other IEEE-like binary floating-point, including "double double". +# +# Copyright (c) 2010, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php. +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = LibGdtoa + FILE_GUID = 5c98de6e-cb69-465f-b6b9-f661e26e6f9d + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + LIBRARY_CLASS = LibGdtoa + +# +# VALID_ARCHITECTURES = IA32 X64 IPF +# + +[Sources.X64] + strtof.c + strtold_px.c + strtopx.c + +[Sources.IPF] + strtof.c + Ipf/strtold.c + +[Sources.IA32] + strtof.c + strtold_px.c + strtopx.c + +[Sources.ARM] + strtof.c + +[Sources] + strtod.c # Public interfaces + atof.c + + # Private interfaces interfacing to libc + dtoa.c + ldtoa.c + gdtoa.c + + # private interfaces + dmisc.c + gmisc.c + hd_init.c + hexnan.c + misc.c + smisc.c + strtodg.c + sum.c + ulp.c + +[Packages] + StdLib/StdLib.dec + StdLibPrivateInternalFiles/DoNotUse.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + LibC + LibLocale + LibStdLib + LibString diff --git a/StdLib/LibC/gdtoa/gdtoaimp.h b/StdLib/LibC/gdtoa/gdtoaimp.h new file mode 100644 index 0000000000..635a177544 --- /dev/null +++ b/StdLib/LibC/gdtoa/gdtoaimp.h @@ -0,0 +1,661 @@ +/** @file + This is a variation on dtoa.c that converts arbitary binary + floating-point formats to and from decimal notation. It uses + double-precision arithmetic internally, so there are still + various #ifdefs that adapt the calculations to the native + double-precision arithmetic (any of IEEE, VAX D_floating, + or IBM mainframe arithmetic). + + Please send bug reports to David M. Gay (dmg at acm dot org, + with " at " changed at "@" and " dot " changed to "."). + + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + The author of this software is David M. Gay. + + Copyright (C) 1998-2000 by Lucent Technologies + All Rights Reserved + + Permission to use, copy, modify, and distribute this software and + its documentation for any purpose and without fee is hereby + granted, provided that the above copyright notice appear in all + copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of Lucent or any of its entities + not be used in advertising or publicity pertaining to + distribution of the software without specific, written prior + permission. + + LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. + IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY + SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF + THIS SOFTWARE. + +$NetBSD: gdtoaimp.h,v 1.5.4.1 2007/05/07 19:49:06 pavel Exp +**/ + +/* On a machine with IEEE extended-precision registers, it is + * necessary to specify double-precision (53-bit) rounding precision + * before invoking strtod or dtoa. If the machine uses (the equivalent + * of) Intel 80x87 arithmetic, the call + * _control87(PC_53, MCW_PC); + * does this with many compilers. Whether this or another call is + * appropriate depends on the compiler; for this to work, it may be + * necessary to #include "float.h" or another system-dependent header + * file. + */ + +/* strtod for IEEE-, VAX-, and IBM-arithmetic machines. + * + * This strtod returns a nearest machine number to the input decimal + * string (or sets errno to ERANGE). With IEEE arithmetic, ties are + * broken by the IEEE round-even rule. Otherwise ties are broken by + * biased rounding (add half and chop). + * + * Inspired loosely by William D. Clinger's paper "How to Read Floating + * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 112-126]. + * + * Modifications: + * + * 1. We only require IEEE, IBM, or VAX double-precision + * arithmetic (not IEEE double-extended). + * 2. We get by with floating-point arithmetic in a case that + * Clinger missed -- when we're computing d * 10^n + * for a small integer d and the integer n is not too + * much larger than 22 (the maximum integer k for which + * we can represent 10^k exactly), we may be able to + * compute (d*10^k) * 10^(e-k) with just one roundoff. + * 3. Rather than a bit-at-a-time adjustment of the binary + * result in the hard case, we use floating-point + * arithmetic to determine the adjustment to within + * one bit; only in really hard cases do we need to + * compute a second residual. + * 4. Because of 3., we don't need a large table of powers of 10 + * for ten-to-e (just some small tables, e.g. of 10^k + * for 0 <= k <= 22). + */ + +/* + * #define IEEE_LITTLE_ENDIAN for IEEE-arithmetic machines where the least + * significant byte has the lowest address. + * #define IEEE_BIG_ENDIAN for IEEE-arithmetic machines where the most + * significant byte has the lowest address. + * #define Long int on machines with 32-bit ints and 64-bit longs. + * #define Sudden_Underflow for IEEE-format machines without gradual + * underflow (i.e., that flush to zero on underflow). + * #define IBM for IBM mainframe-style floating-point arithmetic. + * #define VAX for VAX-style floating-point arithmetic (D_floating). + * #define No_leftright to omit left-right logic in fast floating-point + * computation of dtoa. + * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3. + * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines + * that use extended-precision instructions to compute rounded + * products and quotients) with IBM. + * #define ROUND_BIASED for IEEE-format with biased rounding. + * #define Inaccurate_Divide for IEEE-format with correctly rounded + * products but inaccurate quotients, e.g., for Intel i860. + * #define NO_LONG_LONG on machines that do not have a "long long" + * integer type (of >= 64 bits). On such machines, you can + * #define Just_16 to store 16 bits per 32-bit Long when doing + * high-precision integer arithmetic. Whether this speeds things + * up or slows things down depends on the machine and the number + * being converted. If long long is available and the name is + * something other than "long long", #define Llong to be the name, + * and if "unsigned Llong" does not work as an unsigned version of + * Llong, #define #ULLong to be the corresponding unsigned type. + * #define KR_headers for old-style C function headers. + * #define Bad_float_h if your system lacks a float.h or if it does not + * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP, + * FLT_RADIX, FLT_ROUNDS, and DBL_MAX. + * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n) + * if memory is available and otherwise does something you deem + * appropriate. If MALLOC is undefined, malloc will be invoked + * directly -- and assumed always to succeed. + * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making + * memory allocations from a private pool of memory when possible. + * When used, the private pool is PRIVATE_MEM bytes long: 2304 bytes, + * unless #defined to be a different length. This default length + * suffices to get rid of MALLOC calls except for unusual cases, + * such as decimal-to-binary conversion of a very long string of + * digits. When converting IEEE double precision values, the + * longest string gdtoa can return is about 751 bytes long. For + * conversions by strtod of strings of 800 digits and all gdtoa + * conversions of IEEE doubles in single-threaded executions with + * 8-byte pointers, PRIVATE_MEM >= 7400 appears to suffice; with + * 4-byte pointers, PRIVATE_MEM >= 7112 appears adequate. + * #define INFNAN_CHECK on IEEE systems to cause strtod to check for + * Infinity and NaN (case insensitively). + * When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined, + * strtodg also accepts (case insensitively) strings of the form + * NaN(x), where x is a string of hexadecimal digits and spaces; + * if there is only one string of hexadecimal digits, it is taken + * for the fraction bits of the resulting NaN; if there are two or + * more strings of hexadecimal digits, each string is assigned + * to the next available sequence of 32-bit words of fractions + * bits (starting with the most significant), right-aligned in + * each sequence. + * #define MULTIPLE_THREADS if the system offers preemptively scheduled + * multiple threads. In this case, you must provide (or suitably + * #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed + * by FREE_DTOA_LOCK(n) for n = 0 or 1. (The second lock, accessed + * in pow5mult, ensures lazy evaluation of only one copy of high + * powers of 5; omitting this lock would introduce a small + * probability of wasting memory, but would otherwise be harmless.) + * You must also invoke freedtoa(s) to free the value s returned by + * dtoa. You may do so whether or not MULTIPLE_THREADS is #defined. + * #define IMPRECISE_INEXACT if you do not care about the setting of + * the STRTOG_Inexact bits in the special case of doing IEEE double + * precision conversions (which could also be done by the strtog in + * dtoa.c). + * #define NO_HEX_FP to disable recognition of C9x's hexadecimal + * floating-point constants. + * #define -DNO_ERRNO to suppress setting errno (in strtod.c and + * strtodg.c). + * #define NO_STRING_H to use private versions of memcpy. + * On some K&R systems, it may also be necessary to + * #define DECLARE_SIZE_T in this case. + * #define YES_ALIAS to permit aliasing certain double values with + * arrays of ULongs. This leads to slightly better code with + * some compilers and was always used prior to 19990916, but it + * is not strictly legal and can cause trouble with aggressively + * optimizing compilers (e.g., gcc 2.95.1 under -O2). + * #define USE_LOCALE to use the current locale's decimal_point value. + */ + +/* #define IEEE_{BIG,LITTLE}_ENDIAN in ${ARCHDIR}/gdtoa/arith.h */ +#include + +#include +#define Short int16_t +#define UShort uint16_t +#define Long EFI_LONG_T +#define ULong EFI_ULONG_T +#define LLong int64_t +#define ULLong uint64_t + +#define INFNAN_CHECK +#ifdef _REENTRANT +#define MULTIPLE_THREADS +#endif +#define USE_LOCALE + +#ifndef GDTOAIMP_H_INCLUDED +#define GDTOAIMP_H_INCLUDED +#include "gdtoa.h" +#include "gd_qnan.h" + +#ifdef DEBUG +#include "stdio.h" +#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);} +#endif + +#include "stdlib.h" +#include "string.h" + +#ifdef KR_headers +#define Char char +#else +#define Char void +#endif + +#ifdef MALLOC +extern Char *MALLOC ANSI((size_t)); +#else +#define MALLOC malloc +#endif + +#undef IEEE_Arith +#undef Avoid_Underflow +#ifdef IEEE_BIG_ENDIAN +#define IEEE_Arith +#endif +#ifdef IEEE_LITTLE_ENDIAN +#define IEEE_Arith +#endif + +#include "errno.h" +#ifdef Bad_float_h + +#ifdef IEEE_Arith +#define DBL_DIG 15 +#define DBL_MAX_10_EXP 308 +#define DBL_MAX_EXP 1024 +#define FLT_RADIX 2 +#define DBL_MAX 1.7976931348623157e+308 +#endif + +#ifdef IBM +#define DBL_DIG 16 +#define DBL_MAX_10_EXP 75 +#define DBL_MAX_EXP 63 +#define FLT_RADIX 16 +#define DBL_MAX 7.2370055773322621e+75 +#endif + +#ifdef VAX +#define DBL_DIG 16 +#define DBL_MAX_10_EXP 38 +#define DBL_MAX_EXP 127 +#define FLT_RADIX 2 +#define DBL_MAX 1.7014118346046923e+38 +#define n_bigtens 2 +#endif + +#ifndef LONG_MAX +#define LONG_MAX 2147483647 +#endif + +#else /* ifndef Bad_float_h */ +#include "float.h" +#endif /* Bad_float_h */ + +#ifdef IEEE_Arith +#define Scale_Bit 0x10 +#define n_bigtens 5 +#endif + +#ifdef IBM +#define n_bigtens 3 +#endif + +#ifdef VAX +#define n_bigtens 2 +#endif + +#include "math.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(IEEE_LITTLE_ENDIAN) + defined(IEEE_BIG_ENDIAN) + defined(VAX) + defined(IBM) != 1 +Exactly one of IEEE_LITTLE_ENDIAN, IEEE_BIG_ENDIAN, VAX, or IBM should be defined. +#endif + +typedef union { double d; ULong L[2]; } U; +//typedef union { double d; UINT32 L[2]; } U; + +#ifdef YES_ALIAS +#define dval(x) x +#ifdef IEEE_LITTLE_ENDIAN +#define word0(x) ((ULong *)&x)[1] +#define word1(x) ((ULong *)&x)[0] +#else +#define word0(x) ((ULong *)&x)[0] +#define word1(x) ((ULong *)&x)[1] +#endif +#else /* !YES_ALIAS */ +#ifdef IEEE_LITTLE_ENDIAN +#define word0(x) ( /* LINTED */ (U*)&x)->L[1] +#define word1(x) ( /* LINTED */ (U*)&x)->L[0] +#else +#define word0(x) ( /* LINTED */ (U*)&x)->L[0] +#define word1(x) ( /* LINTED */ (U*)&x)->L[1] +#endif +#define dval(x) ( /* LINTED */ (U*)&x)->d +#endif /* YES_ALIAS */ + +/* The following definition of Storeinc is appropriate for MIPS processors. + * An alternative that might be better on some machines is + * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff) + */ +#if defined(IEEE_LITTLE_ENDIAN) + defined(VAX) +#define Storeinc(a,b,c) \ + (((unsigned short *)(void *)a)[1] = (unsigned short)b, \ + ((unsigned short *)(void *)a)[0] = (unsigned short)c, \ + a++) +#else +#define Storeinc(a,b,c) \ + (((unsigned short *)(void *)a)[0] = (unsigned short)b, \ + ((unsigned short *)(void *)a)[1] = (unsigned short)c, \ + a++) +#endif + +/* #define P DBL_MANT_DIG */ +/* Ten_pmax = floor(P*log(2)/log(5)) */ +/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ +/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ +/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */ + +#ifdef IEEE_Arith +#define Exp_shift 20 +#define Exp_shift1 20 +#define Exp_msk1 0x100000 +#define Exp_msk11 0x100000 +#define Exp_mask 0x7ff00000 +#define P 53 +#define Bias 1023 +#define Emin (-1022) +#define Exp_1 0x3ff00000 +#define Exp_11 0x3ff00000 +#define Ebits 11 +#define Frac_mask 0xfffffU +#define Frac_mask1 0xfffffU +#define Ten_pmax 22 +#define Bletch 0x10 +#define Bndry_mask 0xfffffU +#define Bndry_mask1 0xfffffU +#define LSB 1 +#define Sign_bit 0x80000000 +#define Log2P 1 +#define Tiny0 0 +#define Tiny1 1 +#define Quick_max 14 +#define Int_max 14 + +#ifndef Flt_Rounds +#ifdef FLT_ROUNDS +#define Flt_Rounds FLT_ROUNDS +#else +#define Flt_Rounds 1 +#endif +#endif /*Flt_Rounds*/ + +#else /* ifndef IEEE_Arith */ +#undef Sudden_Underflow +#define Sudden_Underflow +#ifdef IBM +#undef Flt_Rounds +#define Flt_Rounds 0 +#define Exp_shift 24 +#define Exp_shift1 24 +#define Exp_msk1 0x1000000 +#define Exp_msk11 0x1000000 +#define Exp_mask 0x7f000000 +#define P 14 +#define Bias 65 +#define Exp_1 0x41000000 +#define Exp_11 0x41000000 +#define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */ +#define Frac_mask 0xffffff +#define Frac_mask1 0xffffff +#define Bletch 4 +#define Ten_pmax 22 +#define Bndry_mask 0xefffff +#define Bndry_mask1 0xffffff +#define LSB 1 +#define Sign_bit 0x80000000 +#define Log2P 4 +#define Tiny0 0x100000 +#define Tiny1 0 +#define Quick_max 14 +#define Int_max 15 +#else /* VAX */ +#undef Flt_Rounds +#define Flt_Rounds 1 +#define Exp_shift 23 +#define Exp_shift1 7 +#define Exp_msk1 0x80 +#define Exp_msk11 0x800000 +#define Exp_mask 0x7f80 +#define P 56 +#define Bias 129 +#define Exp_1 0x40800000 +#define Exp_11 0x4080 +#define Ebits 8 +#define Frac_mask 0x7fffff +#define Frac_mask1 0xffff007f +#define Ten_pmax 24 +#define Bletch 2 +#define Bndry_mask 0xffff007f +#define Bndry_mask1 0xffff007f +#define LSB 0x10000 +#define Sign_bit 0x8000 +#define Log2P 1 +#define Tiny0 0x80 +#define Tiny1 0 +#define Quick_max 15 +#define Int_max 15 +#endif /* IBM, VAX */ +#endif /* IEEE_Arith */ + +#ifndef IEEE_Arith +#define ROUND_BIASED +#endif + +#ifdef RND_PRODQUOT +#define rounded_product(a,b) a = rnd_prod(a, b) +#define rounded_quotient(a,b) a = rnd_quot(a, b) +#ifdef KR_headers +extern double rnd_prod(), rnd_quot(); +#else +extern double rnd_prod(double, double), rnd_quot(double, double); +#endif +#else +#define rounded_product(a,b) a *= b +#define rounded_quotient(a,b) a /= b +#endif + +#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) +#define Big1 0xffffffffU + +#undef Pack_16 +#ifndef Pack_32 +#define Pack_32 +#endif + +#ifdef NO_LONG_LONG +#undef ULLong +#ifdef Just_16 +#undef Pack_32 +#define Pack_16 +/* When Pack_32 is not defined, we store 16 bits per 32-bit Long. + * This makes some inner loops simpler and sometimes saves work + * during multiplications, but it often seems to make things slightly + * slower. Hence the default is now to store 32 bits per Long. + */ +#endif +#else /* long long available */ +#ifndef Llong +#define Llong long long +#endif +#ifndef ULLong +#define ULLong unsigned Llong +#endif +#endif /* NO_LONG_LONG */ + +#ifdef Pack_32 +#define ULbits 32 +#define kshift 5 +#define kmask 31 +#define ALL_ON 0xffffffff +#else +#define ULbits 16 +#define kshift 4 +#define kmask 15 +#define ALL_ON 0xffff +#endif + +#ifndef MULTIPLE_THREADS +#define ACQUIRE_DTOA_LOCK(n) /*nothing*/ +#define FREE_DTOA_LOCK(n) /*nothing*/ +#else +#include "reentrant.h" + +extern mutex_t __gdtoa_locks[2]; + +#define ACQUIRE_DTOA_LOCK(n) \ + do { \ + if (__isthreaded) \ + mutex_lock(&__gdtoa_locks[n]); \ + } while (/* CONSTCOND */ 0) +#define FREE_DTOA_LOCK(n) \ + do { \ + if (__isthreaded) \ + mutex_unlock(&__gdtoa_locks[n]); \ + } while (/* CONSTCOND */ 0) +#endif + +#define Kmax 15 + + struct +Bigint { + struct Bigint *next; + int k, maxwds, sign, wds; + ULong x[1]; + }; + + typedef struct Bigint Bigint; + +#ifdef NO_STRING_H +#ifdef DECLARE_SIZE_T +typedef unsigned int size_t; +#endif +extern void memcpy_D2A ANSI((void*, const void*, size_t)); +#define Bcopy(x,y) memcpy_D2A(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int)) +#else /* !NO_STRING_H */ +#define Bcopy(x,y) memcpy(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int)) +#endif /* NO_STRING_H */ + +#define Balloc __Balloc_D2A +#define Bfree __Bfree_D2A +#define ULtoQ __ULtoQ_D2A +#define ULtof __ULtof_D2A +#define ULtod __ULtod_D2A +#define ULtodd __ULtodd_D2A +#define ULtox __ULtox_D2A +#define ULtoxL __ULtoxL_D2A +#define any_on __any_on_D2A +#define b2d __b2d_D2A +#define bigtens __bigtens_D2A +#define cmp __cmp_D2A +#define copybits __copybits_D2A +#define d2b __d2b_D2A +#define decrement __decrement_D2A +#define diff __diff_D2A +#define dtoa_result __dtoa_result_D2A +#define g__fmt __g__fmt_D2A +#define gethex __gethex_D2A +#define hexdig __hexdig_D2A +#define hexdig_init_D2A __hexdig_init_D2A +#define hexnan __hexnan_D2A +#define hi0bits __hi0bits_D2A +#define hi0bits_D2A __hi0bits_D2A +#define i2b __i2b_D2A +#define increment __increment_D2A +#define lo0bits __lo0bits_D2A +#define lshift __lshift_D2A +#define match __match_D2A +#define mult __mult_D2A +#define multadd __multadd_D2A +#define nrv_alloc __nrv_alloc_D2A +#define pow5mult __pow5mult_D2A +#define quorem __quorem_D2A +#define ratio __ratio_D2A +#define rshift __rshift_D2A +#define rv_alloc __rv_alloc_D2A +#define s2b __s2b_D2A +#define set_ones __set_ones_D2A +#define strcp __strcp_D2A +#define strcp_D2A __strcp_D2A +#define strtoIg __strtoIg_D2A +#define sum __sum_D2A +#define tens __tens_D2A +#define tinytens __tinytens_D2A +#define tinytens __tinytens_D2A +#define trailz __trailz_D2A +#define ulp __ulp_D2A + +extern char *dtoa_result; +extern CONST double bigtens[], tens[], tinytens[]; +extern unsigned char hexdig[]; + +extern Bigint *Balloc (int); +extern void Bfree (Bigint*); +extern void ULtof (ULong*, ULong*, Long, int); +extern void ULtod (ULong*, ULong*, Long, int); +extern void ULtodd (ULong*, ULong*, Long, int); +extern void ULtoQ (ULong*, ULong*, Long, int); +extern void ULtox (UShort*, ULong*, Long, int); +extern void ULtoxL (ULong*, ULong*, Long, int); +extern ULong any_on (Bigint*, int); +extern double b2d (Bigint*, int*); +extern int cmp (Bigint*, Bigint*); +extern void copybits (ULong*, int, Bigint*); +extern Bigint *d2b (double, int*, int*); +extern int decrement (Bigint*); +extern Bigint *diff (Bigint*, Bigint*); +extern char *dtoa (double d, int mode, int ndigits, + int *decpt, int *sign, char **rve); +extern char *g__fmt (char*, char*, char*, int, ULong); +extern int gethex (CONST char**, CONST FPI*, Long*, Bigint**, int); +extern void hexdig_init_D2A(Void); +extern int hexnan (CONST char**, CONST FPI*, ULong*); +extern int hi0bits_D2A (ULong); +extern Bigint *i2b (int); +extern Bigint *increment (Bigint*); +extern int lo0bits (ULong*); +extern Bigint *lshift (Bigint*, int); +extern int match (CONST char**, CONST char*); +extern Bigint *mult (Bigint*, Bigint*); +extern Bigint *multadd (Bigint*, int, int); +extern char *nrv_alloc (CONST char*, char **, size_t); +extern Bigint *pow5mult (Bigint*, int); +extern int quorem (Bigint*, Bigint*); +extern double ratio (Bigint*, Bigint*); +extern void rshift (Bigint*, int); +extern char *rv_alloc (size_t); +extern Bigint *s2b (CONST char*, int, int, ULong); +extern Bigint *set_ones (Bigint*, int); +extern char *strcp (char*, const char*); +extern int strtoIg (CONST char*, char**, FPI*, Long*, Bigint**, int*); +extern double strtod (const char *s00, char **se); +extern Bigint *sum (Bigint*, Bigint*); +extern int trailz (CONST Bigint*); +extern double ulp (double); + +#ifdef __cplusplus +} +#endif +/* + * NAN_WORD0 and NAN_WORD1 are only referenced in strtod.c. Prior to + * 20050115, they used to be hard-wired here (to 0x7ff80000 and 0, + * respectively), but now are determined by compiling and running + * qnan.c to generate gd_qnan.h, which specifies d_QNAN0 and d_QNAN1. + * Formerly gdtoaimp.h recommended supplying suitable -DNAN_WORD0=... + * and -DNAN_WORD1=... values if necessary. This should still work. + * (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.) + */ +#ifdef IEEE_Arith +#ifdef IEEE_BIG_ENDIAN +#define _0 0 +#define _1 1 +#ifndef NAN_WORD0 +#define NAN_WORD0 d_QNAN0 +#endif +#ifndef NAN_WORD1 +#define NAN_WORD1 d_QNAN1 +#endif +#else +#define _0 1 +#define _1 0 +#ifndef NAN_WORD0 +#define NAN_WORD0 d_QNAN1 +#endif +#ifndef NAN_WORD1 +#define NAN_WORD1 d_QNAN0 +#endif +#endif +#else +#undef INFNAN_CHECK +#endif + +#undef SI +#ifdef Sudden_Underflow +#define SI 1 +#else +#define SI 0 +#endif + +#endif /* GDTOAIMP_H_INCLUDED */ diff --git a/StdLib/LibC/gdtoa/gethex.c b/StdLib/LibC/gdtoa/gethex.c new file mode 100644 index 0000000000..02920e748c --- /dev/null +++ b/StdLib/LibC/gdtoa/gethex.c @@ -0,0 +1,249 @@ +/* $NetBSD: gethex.c,v 1.3.14.1 2008/04/08 21:10:55 jdc Exp $ */ + +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ +#include + +#include "gdtoaimp.h" + +#ifdef USE_LOCALE +#include "locale.h" +#endif + + int +gethex( CONST char **sp, CONST FPI *fpi, Long *expt, Bigint **bp, int sign) +{ + Bigint *b; + CONST unsigned char *decpt, *s0, *s, *s1; + int esign, havedig, irv, k, n, nbits, up, zret; + ULong L, lostbits, *x; + Long e, e1; +#ifdef USE_LOCALE + unsigned char decimalpoint = *localeconv()->decimal_point; +#else +#define decimalpoint '.' +#endif + + if (!hexdig['0']) + hexdig_init_D2A(); + havedig = 0; + s0 = *(CONST unsigned char **)sp + 2; + while(s0[havedig] == '0') + havedig++; + s0 += havedig; + s = s0; + decpt = 0; + zret = 0; + e = 0; + if (!hexdig[*s]) { + zret = 1; + if (*s != decimalpoint) + goto pcheck; + decpt = ++s; + if (!hexdig[*s]) + goto pcheck; + while(*s == '0') + s++; + if (hexdig[*s]) + zret = 0; + havedig = 1; + s0 = s; + } + while(hexdig[*s]) + s++; + if (*s == decimalpoint && !decpt) { + decpt = ++s; + while(hexdig[*s]) + s++; + } + if (decpt) + e = -(((Long)(s-decpt)) << 2); + pcheck: + s1 = s; + switch(*s) { + case 'p': + case 'P': + esign = 0; + switch(*++s) { + case '-': + esign = 1; + /* FALLTHROUGH */ + case '+': + s++; + } + if ((n = hexdig[*s]) == 0 || n > 0x19) { + s = s1; + break; + } + e1 = n - 0x10; + while((n = hexdig[*++s]) !=0 && n <= 0x19) + e1 = 10*e1 + n - 0x10; + if (esign) + e1 = -e1; + e += e1; + } + *sp = __UNCONST(s); + if (zret) + return havedig ? STRTOG_Zero : STRTOG_NoNumber; + n = (int)(s1 - s0 - 1); + for(k = 0; n > 7; n = (unsigned int)n >> 1) + k++; + b = Balloc(k); + if (b == NULL) + return STRTOG_NoMemory; + x = b->x; + n = 0; + L = 0; + while(s1 > s0) { + if (*--s1 == decimalpoint) + continue; + if (n == 32) { + *x++ = L; + L = 0; + n = 0; + } + L |= (hexdig[*s1] & 0x0f) << n; + n += 4; + } + *x++ = L; + b->wds = n = (int)(x - b->x); + n = 32*n - hi0bits(L); + nbits = fpi->nbits; + lostbits = 0; + x = b->x; + if (n > nbits) { + n -= nbits; + if (any_on(b,n)) { + lostbits = 1; + k = n - 1; + if (x[(unsigned int)k>>kshift] & 1 << (k & kmask)) { + lostbits = 2; + if (k > 1 && any_on(b,k-1)) + lostbits = 3; + } + } + rshift(b, n); + e += n; + } + else if (n < nbits) { + n = nbits - n; + b = lshift(b, n); + if (b == NULL) + return STRTOG_NoMemory; + e -= n; + x = b->x; + } + if (e > fpi->emax) { + ovfl: + Bfree(b); + *bp = 0; + return STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi; + } + irv = STRTOG_Normal; + if (e < fpi->emin) { + irv = STRTOG_Denormal; + n = fpi->emin - e; + if (n >= nbits) { + switch (fpi->rounding) { + case FPI_Round_near: + if (n == nbits && (n < 2 || any_on(b,n-1))) + goto one_bit; + break; + case FPI_Round_up: + if (!sign) + goto one_bit; + break; + case FPI_Round_down: + if (sign) { + one_bit: + *expt = fpi->emin; + x[0] = b->wds = 1; + *bp = b; + return STRTOG_Denormal | STRTOG_Inexhi + | STRTOG_Underflow; + } + } + Bfree(b); + *bp = 0; + return STRTOG_Zero | STRTOG_Inexlo | STRTOG_Underflow; + } + k = n - 1; + if (lostbits) + lostbits = 1; + else if (k > 0) + lostbits = any_on(b,k); + if (x[(unsigned int)k>>kshift] & 1 << (k & kmask)) + lostbits |= 2; + nbits -= n; + rshift(b,n); + e = fpi->emin; + } + if (lostbits) { + up = 0; + switch(fpi->rounding) { + case FPI_Round_zero: + break; + case FPI_Round_near: + if (lostbits & 2 + && (lostbits & 1) | (x[0] & 1)) + up = 1; + break; + case FPI_Round_up: + up = 1 - sign; + break; + case FPI_Round_down: + up = sign; + } + if (up) { + k = b->wds; + b = increment(b); + x = b->x; + if (irv == STRTOG_Denormal) { + if (nbits == fpi->nbits - 1 + && x[(unsigned int)nbits >> kshift] & 1 << (nbits & kmask)) + irv = STRTOG_Normal; + } + else if (b->wds > k + || ((n = nbits & kmask) !=0 + && hi0bits(x[k-1]) < 32-n)) { + rshift(b,1); + if (++e > fpi->emax) + goto ovfl; + } + irv |= STRTOG_Inexhi; + } + else + irv |= STRTOG_Inexlo; + } + *bp = b; + *expt = e; + return irv; + } diff --git a/StdLib/LibC/gdtoa/gmisc.c b/StdLib/LibC/gdtoa/gmisc.c new file mode 100644 index 0000000000..e185940ad8 --- /dev/null +++ b/StdLib/LibC/gdtoa/gmisc.c @@ -0,0 +1,82 @@ +/* $NetBSD: gmisc.c,v 1.3 2006/03/11 18:38:14 kleink Exp $ */ + +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ +#include + +#include "gdtoaimp.h" + + void +rshift(Bigint *b, int k) +{ + ULong *x, *x1, *xe, y; + int n; + + x = x1 = b->x; + n = (unsigned int)k >> kshift; + if (n < b->wds) { + xe = x + b->wds; + x += n; + if (k &= kmask) { + n = ULbits - k; + y = *x++ >> k; + while(x < xe) { + *x1++ = (y | (*x << n)) & ALL_ON; + y = *x++ >> k; + } + if ((*x1 = y) !=0) + x1++; + } + else + while(x < xe) + *x1++ = *x++; + } + if ((b->wds = (int)(x1 - b->x)) == 0) + b->x[0] = 0; + } + + int +trailz(CONST Bigint *b) +{ + ULong L; + CONST ULong *x, *xe; + int n = 0; + + x = b->x; + xe = x + b->wds; + for(n = 0; x < xe && !*x; x++) + n += ULbits; + if (x < xe) { + L = *x; + n += lo0bits(&L); + } + return n; + } diff --git a/StdLib/LibC/gdtoa/hd_init.c b/StdLib/LibC/gdtoa/hd_init.c new file mode 100644 index 0000000000..bcf76c2468 --- /dev/null +++ b/StdLib/LibC/gdtoa/hd_init.c @@ -0,0 +1,58 @@ +/* $NetBSD: hd_init.c,v 1.2 2006/01/25 15:27:42 kleink Exp $ */ + +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 2000 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ +#include + +#include "gdtoaimp.h" + + unsigned char hexdig[256]; + + static void +#ifdef KR_headers +htinit(h, s, inc) unsigned char *h; CONST unsigned char *s; int inc; +#else +htinit(unsigned char *h, CONST unsigned char *s, int inc) +#endif +{ + int i, j; + for(i = 0; (j = s[i]) !=0; i++) + h[j] = (unsigned char)(i + inc); + } + + void +hexdig_init_D2A(Void) +{ +#define USC (CONST unsigned char *) + htinit(hexdig, USC "0123456789", 0x10); + htinit(hexdig, USC "abcdef", 0x10 + 10); + htinit(hexdig, USC "ABCDEF", 0x10 + 10); + } diff --git a/StdLib/LibC/gdtoa/hexnan.c b/StdLib/LibC/gdtoa/hexnan.c new file mode 100644 index 0000000000..971e217552 --- /dev/null +++ b/StdLib/LibC/gdtoa/hexnan.c @@ -0,0 +1,134 @@ +/* $NetBSD: hexnan.c,v 1.3 2006/03/11 18:38:14 kleink Exp $ */ + +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 2000 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ +#include + +#include "gdtoaimp.h" + + static void +#ifdef KR_headers +L_shift(x, x1, i) ULong *x; ULong *x1; int i; +#else +L_shift(ULong *x, ULong *x1, int i) +#endif +{ + int j; + + i = 8 - i; + i <<= 2; + j = ULbits - i; + do { + *x |= x[1] << j; + x[1] >>= i; + } while(++x < x1); + } + + int +#ifdef KR_headers +hexnan(sp, fpi, x0) + CONST char **sp; CONST FPI *fpi; ULong *x0; +#else +hexnan( CONST char **sp, CONST FPI *fpi, ULong *x0) +#endif +{ + ULong c, h, *x, *x1, *xe; + CONST char *s; + int havedig, hd0, i, nbits; + + if (!hexdig['0']) + hexdig_init_D2A(); + nbits = fpi->nbits; + x = x0 + ((unsigned int)nbits >> kshift); + if (nbits & kmask) + x++; + *--x = 0; + x1 = xe = x; + havedig = hd0 = i = 0; + s = *sp; + while((c = *(CONST unsigned char*)++s) != 0) { + if ((h = hexdig[c]) == 0) { + if (c <= ' ') { + if (hd0 < havedig) { + if (x < x1 && i < 8) + L_shift(x, x1, i); + if (x <= x0) { + i = 8; + continue; + } + hd0 = havedig; + *--x = 0; + x1 = x; + i = 0; + } + continue; + } + if (/*(*/ c == ')' && havedig) { + *sp = s + 1; + break; + } + return STRTOG_NaN; + } + havedig++; + if (++i > 8) { + if (x <= x0) + continue; + i = 1; + *--x = 0; + } + *x = (*x << 4) | (h & 0xf); + } + if (!havedig) + return STRTOG_NaN; + if (x < x1 && i < 8) + L_shift(x, x1, i); + if (x > x0) { + x1 = x0; + do *x1++ = *x++; + while(x <= xe); + do *x1++ = 0; + while(x1 <= xe); + } + else { + /* truncate high-order word if necessary */ + if ( (i = nbits & (ULbits-1)) !=0) + *xe &= ((ULong)0xffffffff) >> (ULbits - i); + } + for(x1 = xe;; --x1) { + if (*x1 != 0) + break; + if (x1 == x0) { + *x1 = 1; + break; + } + } + return STRTOG_NaNbits; + } diff --git a/StdLib/LibC/gdtoa/ldtoa.c b/StdLib/LibC/gdtoa/ldtoa.c new file mode 100644 index 0000000000..8e38b624e4 --- /dev/null +++ b/StdLib/LibC/gdtoa/ldtoa.c @@ -0,0 +1,113 @@ +/* $NetBSD: ldtoa.c,v 1.4.2.1 2007/05/07 19:49:06 pavel Exp $ */ + +/*- + * Copyright (c) 2003 David Schultz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include + +#include +#include +#include +#include +#include +#include +#include "gdtoaimp.h" + +#if defined(_MSC_VER) + /* Disable warnings about conversions to narrower data types, + primarily for the fpclassify() macro. + */ + #pragma warning ( disable : 4244 ) + // Squelch bogus warnings about uninitialized variable use. + #pragma warning ( disable : 4700 ) +#endif + +/* + * ldtoa() is a wrapper for gdtoa() that makes it smell like dtoa(), + * except that the floating point argument is passed by reference. + * When dtoa() is passed a NaN or infinity, it sets expt to 9999. + * However, a long double could have a valid exponent of 9999, so we + * use INT_MAX in ldtoa() instead. + */ +char * +ldtoa(long double *ld, int mode, int ndigits, int *decpt, int *sign, char **rve) +{ +#ifdef EXT_EXPBITS + static FPI fpi = { + LDBL_MANT_DIG, /* nbits */ + LDBL_MIN_EXP - LDBL_MANT_DIG, /* emin */ + LDBL_MAX_EXP - LDBL_MANT_DIG, /* emax */ + FPI_Round_near, /* rounding */ +#ifdef Sudden_Underflow /* unused, but correct anyway */ + 1 +#else + 0 +#endif + }; + int be, kind; + char *ret; + union ieee_ext_u u; + uint32_t bits[(LDBL_MANT_DIG + 31) / 32]; + + u.extu_ld = *ld; + *sign = (int)(u.extu_ext.ext_sign); + be = (int)(u.extu_ext.ext_exp - (LDBL_MAX_EXP - 1) - (LDBL_MANT_DIG - 1)); + EXT_TO_ARRAY32(u, bits); + + switch (fpclassify(u.extu_ld)) { + case FP_NORMAL: + kind = STRTOG_Normal; +#ifdef LDBL_IMPLICIT_NBIT + bits[LDBL_MANT_DIG / 32] |= 1 << ((LDBL_MANT_DIG - 1) % 32); +#endif /* LDBL_IMPLICIT_NBIT */ + break; + case FP_ZERO: + kind = STRTOG_Zero; + break; + case FP_SUBNORMAL: + kind = STRTOG_Denormal; +#ifdef LDBL_IMPLICIT_NBIT + be++; +#endif + break; + case FP_INFINITE: + kind = STRTOG_Infinite; + break; + case FP_NAN: + kind = STRTOG_NaN; + break; + default: + abort(); + } + + ret = gdtoa(&fpi, be, (ULong *)bits, &kind, mode, ndigits, decpt, rve); + if (*decpt == -32768) + *decpt = INT_MAX; + return ret; +#else + return dtoa((double)*ld, mode, ndigits, decpt, sign, rve); +#endif +} diff --git a/StdLib/LibC/gdtoa/misc.c b/StdLib/LibC/gdtoa/misc.c new file mode 100644 index 0000000000..902074530f --- /dev/null +++ b/StdLib/LibC/gdtoa/misc.c @@ -0,0 +1,909 @@ +/* $NetBSD: misc.c,v 1.3.12.1 2008/04/08 21:10:55 jdc Exp $ */ + +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998, 1999 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ +#include + +#include "gdtoaimp.h" + +#if defined(_MSC_VER) + // Disable warnings about assignment within conditional expressions. + #pragma warning ( disable : 4706 ) +#endif + +static Bigint *freelist[Kmax+1]; +#ifndef Omit_Private_Memory +#ifndef PRIVATE_MEM +#define PRIVATE_MEM 2304 +#endif +#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double)) +static double private_mem[PRIVATE_mem], *pmem_next = private_mem; +#endif + + Bigint * +Balloc +#ifdef KR_headers + (k) int k; +#else + (int k) +#endif +{ + int x; + Bigint *rv; +#ifndef Omit_Private_Memory + unsigned int len; +#endif + + ACQUIRE_DTOA_LOCK(0); + if ( (rv = freelist[k]) !=0) { + freelist[k] = rv->next; + } + else { + x = 1 << k; +#ifdef Omit_Private_Memory + rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong)); +#else + len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1) + /sizeof(double); + if (pmem_next - private_mem + len <= PRIVATE_mem) { + rv = (Bigint*)(void *)pmem_next; + pmem_next += len; + } + else + rv = (Bigint*)MALLOC(len*sizeof(double)); +#endif + if (rv == NULL) + return NULL; + rv->k = k; + rv->maxwds = x; + } + FREE_DTOA_LOCK(0); + rv->sign = rv->wds = 0; + return rv; + } + + void +Bfree +#ifdef KR_headers + (v) Bigint *v; +#else + (Bigint *v) +#endif +{ + if (v) { + ACQUIRE_DTOA_LOCK(0); + v->next = freelist[v->k]; + freelist[v->k] = v; + FREE_DTOA_LOCK(0); + } + } + + int +lo0bits +#ifdef KR_headers + (y) ULong *y; +#else + (ULong *y) +#endif +{ + int k; + ULong x = *y; + + if (x & 7) { + if (x & 1) + return 0; + if (x & 2) { + *y = x >> 1; + return 1; + } + *y = x >> 2; + return 2; + } + k = 0; + if (!(x & 0xffff)) { + k = 16; + x >>= 16; + } + if (!(x & 0xff)) { + k += 8; + x >>= 8; + } + if (!(x & 0xf)) { + k += 4; + x >>= 4; + } + if (!(x & 0x3)) { + k += 2; + x >>= 2; + } + if (!(x & 1)) { + k++; + x >>= 1; + if (!x) + return 32; + } + *y = x; + return k; + } + + Bigint * +multadd +#ifdef KR_headers + (b, m, a) Bigint *b; int m, a; +#else + (Bigint *b, int m, int a) /* multiply by m and add a */ +#endif +{ + int i, wds; +#ifdef ULLong + ULong *x; + ULLong carry, y; +#else + ULong carry, *x, y; +#ifdef Pack_32 + ULong xi, z; +#endif +#endif + Bigint *b1; + + wds = b->wds; + x = b->x; + i = 0; + carry = a; + do { +#ifdef ULLong + y = *x * (ULLong)m + carry; + carry = y >> 32; + /* LINTED conversion */ + *x++ = (uint32_t)(y & 0xffffffffUL); +#else +#ifdef Pack_32 + xi = *x; + y = (xi & 0xffff) * m + carry; + z = (xi >> 16) * m + (y >> 16); + carry = z >> 16; + *x++ = (z << 16) + (y & 0xffff); +#else + y = *x * m + carry; + carry = y >> 16; + *x++ = y & 0xffff; +#endif +#endif + } + while(++i < wds); + if (carry) { + if (wds >= b->maxwds) { + b1 = Balloc(b->k+1); + if (b1 == NULL) { + Bfree(b); + return NULL; + } + Bcopy(b1, b); + Bfree(b); + b = b1; + } + /* LINTED conversion */ + b->x[wds++] = (uint32_t)carry; + b->wds = wds; + } + return b; + } + + int +hi0bits_D2A +#ifdef KR_headers + (x) ULong x; +#else + (ULong x) +#endif +{ + int k = 0; + + if (!(x & 0xffff0000)) { + k = 16; + x <<= 16; + } + if (!(x & 0xff000000)) { + k += 8; + x <<= 8; + } + if (!(x & 0xf0000000)) { + k += 4; + x <<= 4; + } + if (!(x & 0xc0000000)) { + k += 2; + x <<= 2; + } + if (!(x & 0x80000000)) { + k++; + if (!(x & 0x40000000)) + return 32; + } + return k; + } + + Bigint * +i2b +#ifdef KR_headers + (i) int i; +#else + (int i) +#endif +{ + Bigint *b; + + b = Balloc(1); + if (b == NULL) + return NULL; + b->x[0] = i; + b->wds = 1; + return b; + } + + Bigint * +mult +#ifdef KR_headers + (a, b) Bigint *a, *b; +#else + (Bigint *a, Bigint *b) +#endif +{ + Bigint *c; + int k, wa, wb, wc; + ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0; + ULong y; +#ifdef ULLong + ULLong carry, z; +#else + ULong carry, z; +#ifdef Pack_32 + ULong z2; +#endif +#endif + + if (a->wds < b->wds) { + c = a; + a = b; + b = c; + } + k = a->k; + wa = a->wds; + wb = b->wds; + wc = wa + wb; + if (wc > a->maxwds) + k++; + c = Balloc(k); + if (c == NULL) + return NULL; + for(x = c->x, xa = x + wc; x < xa; x++) + *x = 0; + xa = a->x; + xae = xa + wa; + xb = b->x; + xbe = xb + wb; + xc0 = c->x; +#ifdef ULLong + for(; xb < xbe; xc0++) { + if ( (y = *xb++) !=0) { + x = xa; + xc = xc0; + carry = 0; + do { + z = *x++ * (ULLong)y + *xc + carry; + carry = z >> 32; + /* LINTED conversion */ + *xc++ = (uint32_t)(z & 0xffffffffUL); + } + while(x < xae); + /* LINTED conversion */ + *xc = (uint32_t)carry; + } + } +#else +#ifdef Pack_32 + for(; xb < xbe; xb++, xc0++) { + if ( (y = *xb & 0xffff) !=0) { + x = xa; + xc = xc0; + carry = 0; + do { + z = (*x & 0xffff) * y + (*xc & 0xffff) + carry; + carry = z >> 16; + z2 = (*x++ >> 16) * y + (*xc >> 16) + carry; + carry = z2 >> 16; + Storeinc(xc, z2, z); + } + while(x < xae); + *xc = carry; + } + if ( (y = *xb >> 16) !=0) { + x = xa; + xc = xc0; + carry = 0; + z2 = *xc; + do { + z = (*x & 0xffff) * y + (*xc >> 16) + carry; + carry = z >> 16; + Storeinc(xc, z, z2); + z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry; + carry = z2 >> 16; + } + while(x < xae); + *xc = z2; + } + } +#else + for(; xb < xbe; xc0++) { + if ( (y = *xb++) !=0) { + x = xa; + xc = xc0; + carry = 0; + do { + z = *x++ * y + *xc + carry; + carry = z >> 16; + *xc++ = z & 0xffff; + } + while(x < xae); + *xc = carry; + } + } +#endif +#endif + for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ; + c->wds = wc; + return c; + } + + static Bigint *p5s; + + Bigint * +pow5mult +#ifdef KR_headers + (b, k) Bigint *b; int k; +#else + (Bigint *b, int k) +#endif +{ + Bigint *b1, *p5, *p51; + int i; + static CONST int p05[3] = { 5, 25, 125 }; + + if ( (i = k & 3) !=0) { + b = multadd(b, p05[i-1], 0); + if (b == NULL) + return NULL; + } + + if ((k = (unsigned int)k >> 2) == 0) + return b; + if ((p5 = p5s) == 0) { + /* first time */ +#ifdef MULTIPLE_THREADS + ACQUIRE_DTOA_LOCK(1); + if (!(p5 = p5s)) { + p5 = p5s = i2b(625); + if (p5 == NULL) + return NULL; + p5->next = 0; + } + FREE_DTOA_LOCK(1); +#else + p5 = p5s = i2b(625); + if (p5 == NULL) + return NULL; + p5->next = 0; +#endif + } + for(;;) { + if (k & 1) { + b1 = mult(b, p5); + if (b1 == NULL) + return NULL; + b = b1; + } + if ((k = (unsigned int)k >> 1) == 0) + break; + if ((p51 = p5->next) == 0) { +#ifdef MULTIPLE_THREADS + ACQUIRE_DTOA_LOCK(1); + if (!(p51 = p5->next)) { + p51 = p5->next = mult(p5,p5); + if (p51 == NULL) + return NULL; + p51->next = 0; + } + FREE_DTOA_LOCK(1); +#else + p51 = p5->next = mult(p5,p5); + if (p51 == NULL) + return NULL; + p51->next = 0; +#endif + } + p5 = p51; + } + return b; + } + + Bigint * +lshift +#ifdef KR_headers + (b, k) Bigint *b; int k; +#else + (Bigint *b, int k) +#endif +{ + int i, k1, n, n1; + Bigint *b1; + ULong *x, *x1, *xe, z; + + n = (unsigned int)k >> kshift; + k1 = b->k; + n1 = n + b->wds + 1; + for(i = b->maxwds; n1 > i; i <<= 1) + k1++; + b1 = Balloc(k1); + if (b1 == NULL) + return NULL; + x1 = b1->x; + for(i = 0; i < n; i++) + *x1++ = 0; + x = b->x; + xe = x + b->wds; + if (k &= kmask) { +#ifdef Pack_32 + k1 = 32 - k; + z = 0; + do { + *x1++ = *x << k | z; + z = *x++ >> k1; + } + while(x < xe); + if ((*x1 = z) !=0) + ++n1; +#else + k1 = 16 - k; + z = 0; + do { + *x1++ = *x << k & 0xffff | z; + z = *x++ >> k1; + } + while(x < xe); + if (*x1 = z) + ++n1; +#endif + } + else do + *x1++ = *x++; + while(x < xe); + b1->wds = n1 - 1; + Bfree(b); + return b1; + } + + int +cmp +#ifdef KR_headers + (a, b) Bigint *a, *b; +#else + (Bigint *a, Bigint *b) +#endif +{ + ULong *xa, *xa0, *xb, *xb0; + int i, j; + + i = a->wds; + j = b->wds; +#ifdef DEBUG + if (i > 1 && !a->x[i-1]) + Bug("cmp called with a->x[a->wds-1] == 0"); + if (j > 1 && !b->x[j-1]) + Bug("cmp called with b->x[b->wds-1] == 0"); +#endif + if (i -= j) + return i; + xa0 = a->x; + xa = xa0 + j; + xb0 = b->x; + xb = xb0 + j; + for(;;) { + if (*--xa != *--xb) + return *xa < *xb ? -1 : 1; + if (xa <= xa0) + break; + } + return 0; + } + + Bigint * +diff +#ifdef KR_headers + (a, b) Bigint *a, *b; +#else + (Bigint *a, Bigint *b) +#endif +{ + Bigint *c; + int i, wa, wb; + ULong *xa, *xae, *xb, *xbe, *xc; +#ifdef ULLong + ULLong borrow, y; +#else + ULong borrow, y; +#ifdef Pack_32 + ULong z; +#endif +#endif + + i = cmp(a,b); + if (!i) { + c = Balloc(0); + if (c == NULL) + return NULL; + c->wds = 1; + c->x[0] = 0; + return c; + } + if (i < 0) { + c = a; + a = b; + b = c; + i = 1; + } + else + i = 0; + c = Balloc(a->k); + if (c == NULL) + return NULL; + c->sign = i; + wa = a->wds; + xa = a->x; + xae = xa + wa; + wb = b->wds; + xb = b->x; + xbe = xb + wb; + xc = c->x; + borrow = 0; +#ifdef ULLong + do { + y = (ULLong)*xa++ - *xb++ - borrow; + borrow = y >> 32 & 1UL; + /* LINTED conversion */ + *xc++ = (uint32_t)(y & 0xffffffffUL); + } + while(xb < xbe); + while(xa < xae) { + y = *xa++ - borrow; + borrow = y >> 32 & 1UL; + /* LINTED conversion */ + *xc++ = (uint32_t)(y & 0xffffffffUL); + } +#else +#ifdef Pack_32 + do { + y = (*xa & 0xffff) - (*xb & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*xa++ >> 16) - (*xb++ >> 16) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(xc, z, y); + } + while(xb < xbe); + while(xa < xae) { + y = (*xa & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*xa++ >> 16) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(xc, z, y); + } +#else + do { + y = *xa++ - *xb++ - borrow; + borrow = (y & 0x10000) >> 16; + *xc++ = y & 0xffff; + } + while(xb < xbe); + while(xa < xae) { + y = *xa++ - borrow; + borrow = (y & 0x10000) >> 16; + *xc++ = y & 0xffff; + } +#endif +#endif + while(!*--xc) + wa--; + c->wds = wa; + return c; + } + + double +b2d +#ifdef KR_headers + (a, e) Bigint *a; int *e; +#else + (Bigint *a, int *e) +#endif +{ + ULong *xa, *xa0, w, y, z; + int k; + double d; +#ifdef VAX + ULong d0, d1; +#else +#define d0 word0(d) +#define d1 word1(d) +#endif + + xa0 = a->x; + xa = xa0 + a->wds; + y = *--xa; +#ifdef DEBUG + if (!y) Bug("zero y in b2d"); +#endif + k = hi0bits(y); + *e = 32 - k; +#ifdef Pack_32 + if (k < Ebits) { + d0 = (UINT32)(Exp_1 | y >> (Ebits - k)); + w = xa > xa0 ? *--xa : 0; + d1 = (UINT32)(y << ((32-Ebits) + k) | w >> (Ebits - k)); + goto ret_d; + } + z = xa > xa0 ? *--xa : 0; + if (k -= Ebits) { + d0 = (UINT32)(Exp_1 | y << k | z >> (32 - k)); + y = xa > xa0 ? *--xa : 0; + d1 = (UINT32)(z << k | y >> (32 - k)); + } + else { + d0 = (UINT32)(Exp_1 | y); + d1 = (UINT32)z; + } +#else + if (k < Ebits + 16) { + z = xa > xa0 ? *--xa : 0; + d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k; + w = xa > xa0 ? *--xa : 0; + y = xa > xa0 ? *--xa : 0; + d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k; + goto ret_d; + } + z = xa > xa0 ? *--xa : 0; + w = xa > xa0 ? *--xa : 0; + k -= Ebits + 16; + d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k; + y = xa > xa0 ? *--xa : 0; + d1 = w << k + 16 | y << k; +#endif + ret_d: +#ifdef VAX + word0(d) = d0 >> 16 | d0 << 16; + word1(d) = d1 >> 16 | d1 << 16; +#endif + return dval(d); + } +#undef d0 +#undef d1 + + Bigint * +d2b +#ifdef KR_headers + (d, e, bits) double d; int *e, *bits; +#else + (double d, int *e, int *bits) +#endif +{ + Bigint *b; +#ifndef Sudden_Underflow + int i; +#endif + int de, k; + ULong *x, y, z; +#ifdef VAX + ULong d0, d1; + d0 = word0(d) >> 16 | word0(d) << 16; + d1 = word1(d) >> 16 | word1(d) << 16; +#else +#define d0 word0(d) +#define d1 word1(d) +#endif + +#ifdef Pack_32 + b = Balloc(1); +#else + b = Balloc(2); +#endif + if (b == NULL) + return NULL; + x = b->x; + + z = d0 & Frac_mask; + d0 &= 0x7fffffff; /* clear sign bit, which we ignore */ +#ifdef Sudden_Underflow + de = (int)(d0 >> Exp_shift); +#ifndef IBM + z |= Exp_msk11; +#endif +#else + if ( (de = (int)(d0 >> Exp_shift)) !=0) + z |= Exp_msk1; +#endif +#ifdef Pack_32 + if ( (y = d1) !=0) { + if ( (k = lo0bits(&y)) !=0) { + x[0] = y | z << (32 - k); + z >>= k; + } + else + x[0] = y; +#ifndef Sudden_Underflow + i = +#endif + b->wds = (x[1] = z) !=0 ? 2 : 1; + } + else { +#ifdef DEBUG + if (!z) + Bug("Zero passed to d2b"); +#endif + k = lo0bits(&z); + x[0] = z; +#ifndef Sudden_Underflow + i = +#endif + b->wds = 1; + k += 32; + } +#else + if ( (y = d1) !=0) { + if ( (k = lo0bits(&y)) !=0) + if (k >= 16) { + x[0] = y | z << 32 - k & 0xffff; + x[1] = z >> k - 16 & 0xffff; + x[2] = z >> k; + i = 2; + } + else { + x[0] = y & 0xffff; + x[1] = y >> 16 | z << 16 - k & 0xffff; + x[2] = z >> k & 0xffff; + x[3] = z >> k+16; + i = 3; + } + else { + x[0] = y & 0xffff; + x[1] = y >> 16; + x[2] = z & 0xffff; + x[3] = z >> 16; + i = 3; + } + } + else { +#ifdef DEBUG + if (!z) + Bug("Zero passed to d2b"); +#endif + k = lo0bits(&z); + if (k >= 16) { + x[0] = z; + i = 0; + } + else { + x[0] = z & 0xffff; + x[1] = z >> 16; + i = 1; + } + k += 32; + } + while(!x[i]) + --i; + b->wds = i + 1; +#endif +#ifndef Sudden_Underflow + if (de) { +#endif +#ifdef IBM + *e = (de - Bias - (P-1) << 2) + k; + *bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask); +#else + *e = de - Bias - (P-1) + k; + *bits = P - k; +#endif +#ifndef Sudden_Underflow + } + else { + *e = de - Bias - (P-1) + 1 + k; +#ifdef Pack_32 + *bits = 32*i - hi0bits(x[i-1]); +#else + *bits = (i+2)*16 - hi0bits(x[i]); +#endif + } +#endif + return b; + } +#undef d0 +#undef d1 + + CONST double +#ifdef IEEE_Arith +bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 }; +CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 1e-256 + }; +#else +#ifdef IBM +bigtens[] = { 1e16, 1e32, 1e64 }; +CONST double tinytens[] = { 1e-16, 1e-32, 1e-64 }; +#else +bigtens[] = { 1e16, 1e32 }; +CONST double tinytens[] = { 1e-16, 1e-32 }; +#endif +#endif + + CONST double +tens[] = { + 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, + 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, + 1e20, 1e21, 1e22 +#ifdef VAX + , 1e23, 1e24 +#endif + }; + + char * +#ifdef KR_headers +strcp_D2A(a, b) char *a; char *b; +#else +strcp_D2A(char *a, CONST char *b) +#endif +{ + while((*a = *b++)) + a++; + return a; + } + +#ifdef NO_STRING_H + + Char * +#ifdef KR_headers +memcpy_D2A(a, b, len) Char *a; Char *b; size_t len; +#else +memcpy_D2A(void *a1, void *b1, size_t len) +#endif +{ + char *a = (char*)a1, *ae = a + len; + char *b = (char*)b1, *a0 = a; + while(a < ae) + *a++ = *b++; + return a0; + } + +#endif /* NO_STRING_H */ diff --git a/StdLib/LibC/gdtoa/smisc.c b/StdLib/LibC/gdtoa/smisc.c new file mode 100644 index 0000000000..59e4f97dcc --- /dev/null +++ b/StdLib/LibC/gdtoa/smisc.c @@ -0,0 +1,209 @@ +/* $NetBSD: smisc.c,v 1.2.14.1 2008/04/08 21:10:55 jdc Exp $ */ + +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998, 1999 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ +#include + +#include "gdtoaimp.h" + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ +// Disable: warning C4700: uninitialized local variable 'xx' used +#pragma warning ( disable : 4700 ) +#endif /* defined(_MSC_VER) */ + +Bigint * +s2b +#ifdef KR_headers + (s, nd0, nd, y9) CONST char *s; int nd0, nd; ULong y9; +#else + (CONST char *s, int nd0, int nd, ULong y9) +#endif +{ + Bigint *b; + int i, k; + Long x, y; + + x = (nd + 8) / 9; + for(k = 0, y = 1; x > y; y <<= 1, k++) ; +#ifdef Pack_32 + b = Balloc(k); + if (b == NULL) + return NULL; + b->x[0] = y9; + b->wds = 1; +#else + b = Balloc(k+1); + if (b == NULL) + return NULL; + b->x[0] = y9 & 0xffff; + b->wds = (b->x[1] = y9 >> 16) ? 2 : 1; +#endif + + i = 9; + if (9 < nd0) { + s += 9; + do { + b = multadd(b, 10, *s++ - '0'); + if (b == NULL) + return NULL; + } while(++i < nd0); + s++; + } + else + s += 10; + for(; i < nd; i++) { + b = multadd(b, 10, *s++ - '0'); + if (b == NULL) + return NULL; + } + return b; + } + + double +ratio +#ifdef KR_headers + (a, b) Bigint *a, *b; +#else + (Bigint *a, Bigint *b) +#endif +{ + double da, db; + int k, ka, kb; + + dval(da) = b2d(a, &ka); + dval(db) = b2d(b, &kb); + k = ka - kb + ULbits*(a->wds - b->wds); +#ifdef IBM + if (k > 0) { + word0(da) += (k >> 2)*Exp_msk1; + if (k &= 3) + dval(da) *= 1 << k; + } + else { + k = -k; + word0(db) += (k >> 2)*Exp_msk1; + if (k &= 3) + dval(db) *= 1 << k; + } +#else + if (k > 0) + word0(da) += k*Exp_msk1; + else { + k = -k; + word0(db) += k*Exp_msk1; + } +#endif + return dval(da) / dval(db); + } + +#ifdef INFNAN_CHECK + + int +match +#ifdef KR_headers + (sp, t) CONST char **sp, *t; +#else + (CONST char **sp, CONST char *t) +#endif +{ + int c, d; + CONST char *s = *sp; + + while( (d = *t++) !=0) { + if ((c = *++s) >= 'A' && c <= 'Z') + c += 'a' - 'A'; + if (c != d) + return 0; + } + *sp = s + 1; + return 1; + } +#endif /* INFNAN_CHECK */ + + void +#ifdef KR_headers +copybits(c, n, b) ULong *c; int n; Bigint *b; +#else +copybits(ULong *c, int n, Bigint *b) +#endif +{ + ULong *ce, *x, *xe; +#ifdef Pack_16 + int nw, nw1; +#endif + + ce = c + ((unsigned int)(n-1) >> kshift) + 1; + x = b->x; +#ifdef Pack_32 + xe = x + b->wds; + while(x < xe) + *c++ = *x++; +#else + nw = b->wds; + nw1 = nw & 1; + for(xe = x + (nw - nw1); x < xe; x += 2) + Storeinc(c, x[1], x[0]); + if (nw1) + *c++ = *x; +#endif + while(c < ce) + *c++ = 0; + } + + ULong +#ifdef KR_headers +any_on(b, k) Bigint *b; int k; +#else +any_on(Bigint *b, int k) +#endif +{ + int n, nwds; + ULong *x, *x0, x1, x2; + + x = b->x; + nwds = b->wds; + n = (unsigned int)k >> kshift; + if (n > nwds) + n = nwds; + else if (n < nwds && (k &= kmask)) { + x1 = x2 = x[n]; + x1 >>= k; + x1 <<= k; + if (x1 != x2) + return 1; + } + x0 = x; + x += n; + while(x > x0) + if (*--x) + return 1; + return 0; + } diff --git a/StdLib/LibC/gdtoa/strtod.c b/StdLib/LibC/gdtoa/strtod.c new file mode 100644 index 0000000000..989663a01e --- /dev/null +++ b/StdLib/LibC/gdtoa/strtod.c @@ -0,0 +1,1022 @@ +/* $NetBSD: strtod.c,v 1.4.14.1 2008/04/08 21:10:55 jdc Exp $ */ + +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998-2001 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ +#include + +#include "gdtoaimp.h" +#ifndef NO_FENV_H +#include +#endif + +#ifdef USE_LOCALE +#include "locale.h" +#endif + +#ifdef IEEE_Arith +#ifndef NO_IEEE_Scale +#define Avoid_Underflow +#undef tinytens +/* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */ +/* flag unnecessarily. It leads to a song and dance at the end of strtod. */ +static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, + 9007199254740992.e-256 + }; +#endif +#endif + +#ifdef Honor_FLT_ROUNDS +#define Rounding rounding +#undef Check_FLT_ROUNDS +#define Check_FLT_ROUNDS +#else +#define Rounding Flt_Rounds +#endif + +//#ifndef __HAVE_LONG_DOUBLE +//__strong_alias(_strtold, strtod) +//__weak_alias(strtold, _strtold) +//#endif + +#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ +// Disable: warning C4700: uninitialized local variable 'xx' used +#pragma warning ( disable : 4700 ) +#endif /* defined(_MSC_VER) */ + +double +strtod(CONST char *s00, char **se) +{ +#ifdef Avoid_Underflow + int scale; + #endif + int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, dsign, + e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; + CONST char *s, *s0, *s1; + double aadj, aadj1, adj, rv, rv0; + Long L; + ULong y, z; + Bigint *bb = NULL, *bb1, *bd0; + Bigint *bd = NULL, *bs = NULL, *delta = NULL; /* pacify gcc */ +#ifdef SET_INEXACT + int inexact, oldinexact; +#endif +#ifdef Honor_FLT_ROUNDS + int rounding; +#endif + + sign = nz0 = nz = decpt = 0; + dval(rv) = 0.; + for(s = s00;;s++) { + switch(*s) { + case '-': + sign = 1; + /* FALLTHROUGH */ + case '+': + if (*++s) + goto break2; + /* FALLTHROUGH */ + case 0: + goto ret0; + case '\t': + case '\n': + case '\v': + case '\f': + case '\r': + case ' ': + continue; + default: + goto break2; + } + } + break2: + if (*s == '0') { +#ifndef NO_HEX_FP + { + static FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI }; + Long expt; + ULong bits[2]; + switch(s[1]) { + case 'x': + case 'X': + { +#if defined(FE_DOWNWARD) && defined(FE_TONEAREST) && defined(FE_TOWARDZERO) && defined(FE_UPWARD) + FPI fpi1 = fpi; + switch(fegetround()) { + case FE_TOWARDZERO: fpi1.rounding = 0; break; + case FE_UPWARD: fpi1.rounding = 2; break; + case FE_DOWNWARD: fpi1.rounding = 3; + } +#else +#endif + switch((i = gethex(&s, &fpi, &expt, &bb, sign)) & STRTOG_Retmask) { + case STRTOG_NoNumber: + s = s00; + sign = 0; + /* FALLTHROUGH */ + case STRTOG_Zero: + break; + default: + if (bb) { + copybits(bits, fpi.nbits, bb); + Bfree(bb); + } + ULtod((/* LINTED */(U*)&rv)->L, bits, expt, i); + }} + goto ret; + } + } +#endif + nz0 = 1; + while(*++s == '0') ; + if (!*s) + goto ret; + } + s0 = s; + y = z = 0; + for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++) + if (nd < 9) + y = 10*y + c - '0'; + else if (nd < 16) + z = 10*z + c - '0'; + nd0 = nd; +#ifdef USE_LOCALE + if (c == *localeconv()->decimal_point) +#else + if (c == '.') +#endif + { + decpt = 1; + c = *++s; + if (!nd) { + for(; c == '0'; c = *++s) + nz++; + if (c > '0' && c <= '9') { + s0 = s; + nf += nz; + nz = 0; + goto have_dig; + } + goto dig_done; + } + for(; c >= '0' && c <= '9'; c = *++s) { + have_dig: + nz++; + if (c -= '0') { + nf += nz; + for(i = 1; i < nz; i++) + if (nd++ < 9) + y *= 10; + else if (nd <= DBL_DIG + 1) + z *= 10; + if (nd++ < 9) + y = 10*y + c; + else if (nd <= DBL_DIG + 1) + z = 10*z + c; + nz = 0; + } + } + } + dig_done: + e = 0; + if (c == 'e' || c == 'E') { + if (!nd && !nz && !nz0) { + goto ret0; + } + s00 = s; + esign = 0; + switch(c = *++s) { + case '-': + esign = 1; + /* FALLTHROUGH */ + case '+': + c = *++s; + } + if (c >= '0' && c <= '9') { + while(c == '0') + c = *++s; + if (c > '0' && c <= '9') { + L = c - '0'; + s1 = s; + while((c = *++s) >= '0' && c <= '9') + L = 10*L + c - '0'; + if (s - s1 > 8 || L > 19999) + /* Avoid confusion from exponents + * so large that e might overflow. + */ + e = 19999; /* safe for 16 bit ints */ + else + e = (int)L; + if (esign) + e = -e; + } + else + e = 0; + } + else + s = s00; + } + if (!nd) { + if (!nz && !nz0) { +#ifdef INFNAN_CHECK + /* Check for Nan and Infinity */ +#ifndef No_Hex_NaN + ULong bits[2]; + static FPI fpinan = /* only 52 explicit bits */ + { 52, 1-1023-53+1, 2046-1023-53+1, 1, SI }; +#endif // No_Hex_NaN + if (!decpt) + switch(c) { + case 'i': + case 'I': + if (match(&s,"nf")) { + --s; + if (!match(&s,"inity")) + ++s; + word0(rv) = 0x7ff00000; + word1(rv) = 0; + goto ret; + } + break; + case 'n': + case 'N': + if (match(&s, "an")) { +#ifndef No_Hex_NaN + if (*s == '(' /*)*/ + && hexnan(&s, &fpinan, bits) + == STRTOG_NaNbits) { + word0(rv) = (UINT32)(0x7ff00000U | bits[1]); + word1(rv) = (UINT32)bits[0]; + } + else { +#endif + word0(rv) = NAN_WORD0; + word1(rv) = NAN_WORD1; +#ifndef No_Hex_NaN + } +#endif + goto ret; + } + } +#endif /* INFNAN_CHECK */ + ret0: + s = s00; + sign = 0; + } + goto ret; + } + e1 = e -= nf; + + /* Now we have nd0 digits, starting at s0, followed by a + * decimal point, followed by nd-nd0 digits. The number we're + * after is the integer represented by those digits times + * 10**e */ + + if (!nd0) + nd0 = nd; + k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; + dval(rv) = (double)y; + if (k > 9) { +#ifdef SET_INEXACT + if (k > DBL_DIG) + oldinexact = get_inexact(); +#endif + dval(rv) = tens[k - 9] * dval(rv) + z; + } + bd0 = 0; + if (nd <= DBL_DIG +#ifndef RND_PRODQUOT +#ifndef Honor_FLT_ROUNDS + && Flt_Rounds == 1 +#endif +#endif + ) { + if (!e) + goto ret; + if (e > 0) { + if (e <= Ten_pmax) { +#ifdef VAX + goto vax_ovfl_check; +#else +#ifdef Honor_FLT_ROUNDS + /* round correctly FLT_ROUNDS = 2 or 3 */ + if (sign) { + rv = -rv; + sign = 0; + } +#endif + /* rv = */ rounded_product(dval(rv), tens[e]); + goto ret; +#endif + } + i = DBL_DIG - nd; + if (e <= Ten_pmax + i) { + /* A fancier test would sometimes let us do + * this for larger i values. + */ +#ifdef Honor_FLT_ROUNDS + /* round correctly FLT_ROUNDS = 2 or 3 */ + if (sign) { + rv = -rv; + sign = 0; + } +#endif + e -= i; + dval(rv) *= tens[i]; +#ifdef VAX + /* VAX exponent range is so narrow we must + * worry about overflow here... + */ + vax_ovfl_check: + word0(rv) -= P*Exp_msk1; + /* rv = */ rounded_product(dval(rv), tens[e]); + if ((word0(rv) & Exp_mask) + > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) + goto ovfl; + word0(rv) += P*Exp_msk1; +#else + /* rv = */ rounded_product(dval(rv), tens[e]); +#endif + goto ret; + } + } +#ifndef Inaccurate_Divide + else if (e >= -Ten_pmax) { +#ifdef Honor_FLT_ROUNDS + /* round correctly FLT_ROUNDS = 2 or 3 */ + if (sign) { + rv = -rv; + sign = 0; + } +#endif + /* rv = */ rounded_quotient(dval(rv), tens[-e]); + goto ret; + } +#endif + } + e1 += nd - k; + +#ifdef IEEE_Arith +#ifdef SET_INEXACT + inexact = 1; + if (k <= DBL_DIG) + oldinexact = get_inexact(); +#endif +#ifdef Avoid_Underflow + scale = 0; +#endif +#ifdef Honor_FLT_ROUNDS + if ((rounding = Flt_Rounds) >= 2) { + if (sign) + rounding = rounding == 2 ? 0 : 2; + else + if (rounding != 2) + rounding = 0; + } +#endif +#endif /*IEEE_Arith*/ + + /* Get starting approximation = rv * 10**e1 */ + + if (e1 > 0) { + if ( (i = e1 & 15) !=0) + dval(rv) *= tens[i]; + if (e1 &= ~15) { + if (e1 > DBL_MAX_10_EXP) { + ovfl: +#ifndef NO_ERRNO + errno = ERANGE; +#endif + /* Can't trust HUGE_VAL */ +#ifdef IEEE_Arith +#ifdef Honor_FLT_ROUNDS + switch(rounding) { + case 0: /* toward 0 */ + case 3: /* toward -infinity */ + word0(rv) = Big0; + word1(rv) = Big1; + break; + default: + word0(rv) = Exp_mask; + word1(rv) = 0; + } +#else /*Honor_FLT_ROUNDS*/ + word0(rv) = Exp_mask; + word1(rv) = 0; +#endif /*Honor_FLT_ROUNDS*/ +#ifdef SET_INEXACT + /* set overflow bit */ + dval(rv0) = 1e300; + dval(rv0) *= dval(rv0); +#endif +#else /*IEEE_Arith*/ + word0(rv) = Big0; + word1(rv) = Big1; +#endif /*IEEE_Arith*/ + if (bd0) + goto retfree; + goto ret; + } + e1 = (unsigned int)e1 >> 4; + for(j = 0; e1 > 1; j++, e1 = (unsigned int)e1 >> 1) + if (e1 & 1) + dval(rv) *= bigtens[j]; + /* The last multiplication could overflow. */ + word0(rv) -= P*Exp_msk1; + dval(rv) *= bigtens[j]; + if ((z = word0(rv) & Exp_mask) + > Exp_msk1*(DBL_MAX_EXP+Bias-P)) + goto ovfl; + if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) { + /* set to largest number */ + /* (Can't trust DBL_MAX) */ + word0(rv) = Big0; + word1(rv) = Big1; + } + else + word0(rv) += P*Exp_msk1; + } + } + else if (e1 < 0) { + e1 = -e1; + if ( (i = e1 & 15) !=0) + dval(rv) /= tens[i]; + if (e1 >>= 4) { + if (e1 >= 1 << n_bigtens) + goto undfl; +#ifdef Avoid_Underflow + if (e1 & Scale_Bit) + scale = 2*P; + for(j = 0; e1 > 0; j++, e1 = (unsigned int)e1 >> 1) + if (e1 & 1) + dval(rv) *= tinytens[j]; + if (scale && (j = 2*P + 1 - ((word0(rv) & Exp_mask) + >> Exp_shift)) > 0) { + /* scaled rv is denormal; zap j low bits */ + if (j >= 32) { + word1(rv) = 0; + if (j >= 53) + word0(rv) = (P+2)*Exp_msk1; + else + word0(rv) &= 0xffffffff << (j-32); + } + else + word1(rv) &= 0xffffffff << j; + } +#else + for(j = 0; e1 > 1; j++, e1 >>= 1) + if (e1 & 1) + dval(rv) *= tinytens[j]; + /* The last multiplication could underflow. */ + dval(rv0) = dval(rv); + dval(rv) *= tinytens[j]; + if (!dval(rv)) { + dval(rv) = 2.*dval(rv0); + dval(rv) *= tinytens[j]; +#endif + if (!dval(rv)) { + undfl: + dval(rv) = 0.; +#ifndef NO_ERRNO + errno = ERANGE; +#endif + if (bd0) + goto retfree; + goto ret; + } +#ifndef Avoid_Underflow + word0(rv) = Tiny0; + word1(rv) = Tiny1; + /* The refinement below will clean + * this approximation up. + */ + } +#endif + } + } + + /* Now the hard part -- adjusting rv to the correct value.*/ + + /* Put digits into bd: true value = bd * 10^e */ + + bd0 = s2b(s0, nd0, nd, y); + if (bd0 == NULL) + goto ovfl; + + for(;;) { + bd = Balloc(bd0->k); + if (bd == NULL) + goto ovfl; + Bcopy(bd, bd0); + bb = d2b(dval(rv), &bbe, &bbbits); /* rv = bb * 2^bbe */ + if (bb == NULL) + goto ovfl; + bs = i2b(1); + if (bs == NULL) + goto ovfl; + + if (e >= 0) { + bb2 = bb5 = 0; + bd2 = bd5 = e; + } + else { + bb2 = bb5 = -e; + bd2 = bd5 = 0; + } + if (bbe >= 0) + bb2 += bbe; + else + bd2 -= bbe; + bs2 = bb2; +#ifdef Honor_FLT_ROUNDS + if (rounding != 1) + bs2++; +#endif +#ifdef Avoid_Underflow + j = bbe - scale; + i = j + bbbits - 1; /* logb(rv) */ + if (i < Emin) /* denormal */ + j += P - Emin; + else + j = P + 1 - bbbits; +#else /*Avoid_Underflow*/ +#ifdef Sudden_Underflow +#ifdef IBM + j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3); +#else + j = P + 1 - bbbits; +#endif +#else /*Sudden_Underflow*/ + j = bbe; + i = j + bbbits - 1; /* logb(rv) */ + if (i < Emin) /* denormal */ + j += P - Emin; + else + j = P + 1 - bbbits; +#endif /*Sudden_Underflow*/ +#endif /*Avoid_Underflow*/ + bb2 += j; + bd2 += j; +#ifdef Avoid_Underflow + bd2 += scale; +#endif + i = bb2 < bd2 ? bb2 : bd2; + if (i > bs2) + i = bs2; + if (i > 0) { + bb2 -= i; + bd2 -= i; + bs2 -= i; + } + if (bb5 > 0) { + bs = pow5mult(bs, bb5); + if (bs == NULL) + goto ovfl; + bb1 = mult(bs, bb); + if (bb1 == NULL) + goto ovfl; + Bfree(bb); + bb = bb1; + } + if (bb2 > 0) { + bb = lshift(bb, bb2); + if (bb == NULL) + goto ovfl; + } + if (bd5 > 0) { + bd = pow5mult(bd, bd5); + if (bd == NULL) + goto ovfl; + } + if (bd2 > 0) { + bd = lshift(bd, bd2); + if (bd == NULL) + goto ovfl; + } + if (bs2 > 0) { + bs = lshift(bs, bs2); + if (bs == NULL) + goto ovfl; + } + delta = diff(bb, bd); + if (delta == NULL) + goto ovfl; + dsign = delta->sign; + delta->sign = 0; + i = cmp(delta, bs); +#ifdef Honor_FLT_ROUNDS + if (rounding != 1) { + if (i < 0) { + /* Error is less than an ulp */ + if (!delta->x[0] && delta->wds <= 1) { + /* exact */ +#ifdef SET_INEXACT + inexact = 0; +#endif + break; + } + if (rounding) { + if (dsign) { + adj = 1.; + goto apply_adj; + } + } + else if (!dsign) { + adj = -1.; + if (!word1(rv) + && !(word0(rv) & Frac_mask)) { + y = word0(rv) & Exp_mask; +#ifdef Avoid_Underflow + if (!scale || y > 2*P*Exp_msk1) +#else + if (y) +#endif + { + delta = lshift(delta,Log2P); + if (cmp(delta, bs) <= 0) + adj = -0.5; + } + } + apply_adj: +#ifdef Avoid_Underflow + if (scale && (y = word0(rv) & Exp_mask) + <= 2*P*Exp_msk1) + word0(adj) += (2*P+1)*Exp_msk1 - y; +#else +#ifdef Sudden_Underflow + if ((word0(rv) & Exp_mask) <= + P*Exp_msk1) { + word0(rv) += P*Exp_msk1; + dval(rv) += adj*ulp(dval(rv)); + word0(rv) -= P*Exp_msk1; + } + else +#endif /*Sudden_Underflow*/ +#endif /*Avoid_Underflow*/ + dval(rv) += adj*ulp(dval(rv)); + } + break; + } + adj = ratio(delta, bs); + if (adj < 1.) + adj = 1.; + if (adj <= 0x7ffffffe) { + /* adj = rounding ? ceil(adj) : floor(adj); */ + y = adj; + if (y != adj) { + if (!((rounding>>1) ^ dsign)) + y++; + adj = y; + } + } +#ifdef Avoid_Underflow + if (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1) + word0(adj) += (2*P+1)*Exp_msk1 - y; +#else +#ifdef Sudden_Underflow + if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { + word0(rv) += P*Exp_msk1; + adj *= ulp(dval(rv)); + if (dsign) + dval(rv) += adj; + else + dval(rv) -= adj; + word0(rv) -= P*Exp_msk1; + goto cont; + } +#endif /*Sudden_Underflow*/ +#endif /*Avoid_Underflow*/ + adj *= ulp(dval(rv)); + if (dsign) + dval(rv) += adj; + else + dval(rv) -= adj; + goto cont; + } +#endif /*Honor_FLT_ROUNDS*/ + + if (i < 0) { + /* Error is less than half an ulp -- check for + * special case of mantissa a power of two. + */ + if (dsign || word1(rv) || word0(rv) & Bndry_mask +#ifdef IEEE_Arith +#ifdef Avoid_Underflow + || (word0(rv) & Exp_mask) <= (2*P+1)*Exp_msk1 +#else + || (word0(rv) & Exp_mask) <= Exp_msk1 +#endif +#endif + ) { +#ifdef SET_INEXACT + if (!delta->x[0] && delta->wds <= 1) + inexact = 0; +#endif + break; + } + if (!delta->x[0] && delta->wds <= 1) { + /* exact result */ +#ifdef SET_INEXACT + inexact = 0; +#endif + break; + } + delta = lshift(delta,Log2P); + if (cmp(delta, bs) > 0) + goto drop_down; + break; + } + if (i == 0) { + /* exactly half-way between */ + if (dsign) { + if ((word0(rv) & Bndry_mask1) == Bndry_mask1 + && word1(rv) == ( +#ifdef Avoid_Underflow + (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1) + ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) : +#endif + 0xffffffff)) { + /*boundary case -- increment exponent*/ + word0(rv) = (word0(rv) & Exp_mask) + + Exp_msk1 +#ifdef IBM + | Exp_msk1 >> 4 +#endif + ; + word1(rv) = 0; +#ifdef Avoid_Underflow + dsign = 0; +#endif + break; + } + } + else if (!(word0(rv) & Bndry_mask) && !word1(rv)) { + drop_down: + /* boundary case -- decrement exponent */ +#ifdef Sudden_Underflow /*{{*/ + L = word0(rv) & Exp_mask; +#ifdef IBM + if (L < Exp_msk1) +#else +#ifdef Avoid_Underflow + if (L <= (scale ? (2*P+1)*Exp_msk1 : Exp_msk1)) +#else + if (L <= Exp_msk1) +#endif /*Avoid_Underflow*/ +#endif /*IBM*/ + goto undfl; + L -= Exp_msk1; +#else /*Sudden_Underflow}{*/ +#ifdef Avoid_Underflow + if (scale) { + L = word0(rv) & Exp_mask; + if (L <= (2*P+1)*Exp_msk1) { + if (L > (P+2)*Exp_msk1) + /* round even ==> */ + /* accept rv */ + break; + /* rv = smallest denormal */ + goto undfl; + } + } +#endif /*Avoid_Underflow*/ + L = (word0(rv) & Exp_mask) - Exp_msk1; +#endif /*Sudden_Underflow}*/ + word0(rv) = (UINT32)(L | Bndry_mask1); + word1(rv) = 0xffffffffU; +#ifdef IBM + goto cont; +#else + break; +#endif + } +#ifndef ROUND_BIASED + if (!(word1(rv) & LSB)) + break; +#endif + if (dsign) + dval(rv) += ulp(dval(rv)); +#ifndef ROUND_BIASED + else { + dval(rv) -= ulp(dval(rv)); +#ifndef Sudden_Underflow + if (!dval(rv)) + goto undfl; +#endif + } +#ifdef Avoid_Underflow + dsign = 1 - dsign; +#endif +#endif + break; + } + if ((aadj = ratio(delta, bs)) <= 2.) { + if (dsign) + aadj = aadj1 = 1.; + else if (word1(rv) || word0(rv) & Bndry_mask) { +#ifndef Sudden_Underflow + if (word1(rv) == Tiny1 && !word0(rv)) + goto undfl; +#endif + aadj = 1.; + aadj1 = -1.; + } + else { + /* special case -- power of FLT_RADIX to be */ + /* rounded down... */ + + if (aadj < 2./FLT_RADIX) + aadj = 1./FLT_RADIX; + else + aadj *= 0.5; + aadj1 = -aadj; + } + } + else { + aadj *= 0.5; + aadj1 = dsign ? aadj : -aadj; +#ifdef Check_FLT_ROUNDS + switch(Rounding) { + case 2: /* towards +infinity */ + aadj1 -= 0.5; + break; + case 0: /* towards 0 */ + case 3: /* towards -infinity */ + aadj1 += 0.5; + } +#else + if (Flt_Rounds == 0) + aadj1 += 0.5; +#endif /*Check_FLT_ROUNDS*/ + } + y = word0(rv) & Exp_mask; + + /* Check for overflow */ + + if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { + dval(rv0) = dval(rv); + word0(rv) -= P*Exp_msk1; + adj = aadj1 * ulp(dval(rv)); + dval(rv) += adj; + if ((word0(rv) & Exp_mask) >= + Exp_msk1*(DBL_MAX_EXP+Bias-P)) { + if (word0(rv0) == Big0 && word1(rv0) == Big1) + goto ovfl; + word0(rv) = Big0; + word1(rv) = Big1; + goto cont; + } + else + word0(rv) += P*Exp_msk1; + } + else { +#ifdef Avoid_Underflow + if (scale && y <= 2*P*Exp_msk1) { + if (aadj <= 0x7fffffff) { + if ((z = (uint32_t)aadj) == 0) + z = 1; + aadj = (double)z; + aadj1 = dsign ? aadj : -aadj; + } + word0(aadj1) += (UINT32)((2*P+1)*Exp_msk1 - y); + } + adj = aadj1 * ulp(dval(rv)); + dval(rv) += adj; +#else +#ifdef Sudden_Underflow + if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { + dval(rv0) = dval(rv); + word0(rv) += P*Exp_msk1; + adj = aadj1 * ulp(dval(rv)); + dval(rv) += adj; +#ifdef IBM + if ((word0(rv) & Exp_mask) < P*Exp_msk1) +#else + if ((word0(rv) & Exp_mask) <= P*Exp_msk1) +#endif + { + if (word0(rv0) == Tiny0 + && word1(rv0) == Tiny1) + goto undfl; + word0(rv) = Tiny0; + word1(rv) = Tiny1; + goto cont; + } + else + word0(rv) -= P*Exp_msk1; + } + else { + adj = aadj1 * ulp(dval(rv)); + dval(rv) += adj; + } +#else /*Sudden_Underflow*/ + /* Compute adj so that the IEEE rounding rules will + * correctly round rv + adj in some half-way cases. + * If rv * ulp(rv) is denormalized (i.e., + * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid + * trouble from bits lost to denormalization; + * example: 1.2e-307 . + */ + if (y <= (P-1)*Exp_msk1 && aadj > 1.) { + aadj1 = (double)(int)(aadj + 0.5); + if (!dsign) + aadj1 = -aadj1; + } + adj = aadj1 * ulp(dval(rv)); + dval(rv) += adj; +#endif /*Sudden_Underflow*/ +#endif /*Avoid_Underflow*/ + } + z = word0(rv) & Exp_mask; +#ifndef SET_INEXACT +#ifdef Avoid_Underflow + if (!scale) +#endif + if (y == z) { + /* Can we stop now? */ + L = (Long)aadj; + aadj -= L; + /* The tolerances below are conservative. */ + if (dsign || word1(rv) || word0(rv) & Bndry_mask) { + if (aadj < .4999999 || aadj > .5000001) + break; + } + else if (aadj < .4999999/FLT_RADIX) + break; + } +#endif + cont: + Bfree(bb); + Bfree(bd); + Bfree(bs); + Bfree(delta); + } +#ifdef SET_INEXACT + if (inexact) { + if (!oldinexact) { + word0(rv0) = Exp_1 + (70 << Exp_shift); + word1(rv0) = 0; + dval(rv0) += 1.; + } + } + else if (!oldinexact) + clear_inexact(); +#endif +#ifdef Avoid_Underflow + if (scale) { + word0(rv0) = Exp_1 - 2*P*Exp_msk1; + word1(rv0) = 0; + dval(rv) *= dval(rv0); +#ifndef NO_ERRNO + /* try to avoid the bug of testing an 8087 register value */ + if (word0(rv) == 0 && word1(rv) == 0) + errno = ERANGE; +#endif + } +#endif /* Avoid_Underflow */ +#ifdef SET_INEXACT + if (inexact && !(word0(rv) & Exp_mask)) { + /* set underflow bit */ + dval(rv0) = 1e-300; + dval(rv0) *= dval(rv0); + } +#endif + retfree: + Bfree(bb); + Bfree(bd); + Bfree(bs); + Bfree(bd0); + Bfree(delta); + ret: + if (se) + *se = __UNCONST(s); + return sign ? -dval(rv) : dval(rv); +} + diff --git a/StdLib/LibC/gdtoa/strtodg.c b/StdLib/LibC/gdtoa/strtodg.c new file mode 100644 index 0000000000..fc0ae7cf38 --- /dev/null +++ b/StdLib/LibC/gdtoa/strtodg.c @@ -0,0 +1,1075 @@ +/* $NetBSD: strtodg.c,v 1.5.14.1 2008/04/08 21:10:55 jdc Exp $ */ + +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998-2001 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ +#include + +#include "gdtoaimp.h" + +#ifdef USE_LOCALE +#include "locale.h" +#endif + +#if defined(_MSC_VER) + // Disable warnings about assignment within conditional expressions. + #pragma warning ( disable : 4706 ) +#endif + + static CONST int +fivesbits[] = { 0, 3, 5, 7, 10, 12, 14, 17, 19, 21, + 24, 26, 28, 31, 33, 35, 38, 40, 42, 45, + 47, 49, 52 +#ifdef VAX + , 54, 56 +#endif + }; + + Bigint * +#ifdef KR_headers +increment(b) Bigint *b; +#else +increment(Bigint *b) +#endif +{ + ULong *x, *xe; + Bigint *b1; +#ifdef Pack_16 + ULong carry = 1, y; +#endif + + x = b->x; + xe = x + b->wds; +#ifdef Pack_32 + do { + if (*x < (ULong)0xffffffffL) { + ++*x; + return b; + } + *x++ = 0; + } while(x < xe); +#else + do { + y = *x + carry; + carry = y >> 16; + *x++ = y & 0xffff; + if (!carry) + return b; + } while(x < xe); + if (carry) +#endif + { + if (b->wds >= b->maxwds) { + b1 = Balloc(b->k+1); + if (b1 == NULL) + return NULL; + Bcopy(b1,b); + Bfree(b); + b = b1; + } + b->x[b->wds++] = 1; + } + return b; + } + + int +#ifdef KR_headers +decrement(b) Bigint *b; +#else +decrement(Bigint *b) +#endif +{ + ULong *x, *xe; +#ifdef Pack_16 + ULong borrow = 1, y; +#endif + + x = b->x; + xe = x + b->wds; +#ifdef Pack_32 + do { + if (*x) { + --*x; + break; + } + *x++ = 0xffffffffUL; + } + while(x < xe); +#else + do { + y = *x - borrow; + borrow = (y & 0x10000) >> 16; + *x++ = y & 0xffff; + } while(borrow && x < xe); +#endif + return STRTOG_Inexlo; + } + + static int +#ifdef KR_headers +all_on(b, n) CONST Bigint *b; int n; +#else +all_on(CONST Bigint *b, int n) +#endif +{ + CONST ULong *x, *xe; + + x = b->x; + xe = x + ((unsigned int)n >> kshift); + while(x < xe) + if ((*x++ & ALL_ON) != ALL_ON) + return 0; + if (n &= kmask) + return ((*x | (ALL_ON << n)) & ALL_ON) == ALL_ON; + return 1; + } + + Bigint * +#ifdef KR_headers +set_ones(b, n) Bigint *b; int n; +#else +set_ones(Bigint *b, int n) +#endif +{ + int k; + ULong *x, *xe; + + k = (unsigned int)(n + ((1 << kshift) - 1)) >> kshift; + if (b->k < k) { + Bfree(b); + b = Balloc(k); + if (b == NULL) + return NULL; + } + k = (unsigned int)n >> kshift; + if (n &= kmask) + k++; + b->wds = k; + x = b->x; + xe = x + k; + while(x < xe) + *x++ = ALL_ON; + if (n) + x[-1] >>= ULbits - n; + return b; + } + + static int +rvOK +#ifdef KR_headers + (d, fpi, expt, bits, exact, rd, irv) + double d; CONST FPI *fpi; Long *expt; ULong *bits; int exact, rd, *irv; +#else + (double d, CONST FPI *fpi, Long *expt, ULong *bits, int exact, int rd, int *irv) +#endif +{ + Bigint *b; + ULong carry, inex, lostbits; + int bdif, e, j, k, k1, nb, rv; + + carry = rv = 0; + b = d2b(d, &e, &bdif); + bdif -= nb = fpi->nbits; + e += bdif; + if (bdif <= 0) { + if (exact) + goto trunc; + goto ret; + } + if (P == nb) { + if ( +#ifndef IMPRECISE_INEXACT + exact && +#endif + fpi->rounding == +#ifdef RND_PRODQUOT + FPI_Round_near +#else + Flt_Rounds +#endif + ) goto trunc; + goto ret; + } + switch(rd) { + case 1: + goto trunc; + case 2: + break; + default: /* round near */ + k = bdif - 1; + if (!k) { + if (!exact) + goto ret; + if (b->x[0] & 2) + break; + goto trunc; + } + if (b->x[(unsigned int)k>>kshift] & ((ULong)1 << (k & kmask))) + break; + goto trunc; + } + /* "break" cases: round up 1 bit, then truncate; bdif > 0 */ + carry = 1; + trunc: + inex = lostbits = 0; + if (bdif > 0) { + if ( (lostbits = any_on(b, bdif)) !=0) + inex = STRTOG_Inexlo; + rshift(b, bdif); + if (carry) { + inex = STRTOG_Inexhi; + b = increment(b); + if ( (j = nb & kmask) !=0) + j = ULbits - j; + if (hi0bits(b->x[b->wds - 1]) != j) { + if (!lostbits) + lostbits = b->x[0] & 1; + rshift(b, 1); + e++; + } + } + } + else if (bdif < 0) + b = lshift(b, -bdif); + if (e < fpi->emin) { + k = fpi->emin - e; + e = fpi->emin; + if (k > nb || fpi->sudden_underflow) { + inex = b->wds = 0; + *irv = STRTOG_Underflow | STRTOG_Inexlo; + } + else { + k1 = k - 1; + if (k1 > 0 && !lostbits) + lostbits = any_on(b, k1); + if (!lostbits && !exact) + goto ret; + lostbits |= + carry = b->x[(unsigned int)k1>>kshift] & + (ULong)(1 << ((unsigned int)k1 & kmask)); + rshift(b, k); + *irv = STRTOG_Denormal; + if (carry) { + b = increment(b); + inex = STRTOG_Inexhi | STRTOG_Underflow; + } + else if (lostbits) + inex = STRTOG_Inexlo | STRTOG_Underflow; + } + } + else if (e > fpi->emax) { + e = fpi->emax + 1; + *irv = STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi; +#ifndef NO_ERRNO + errno = ERANGE; +#endif + inex = b->wds = 0; + } + *expt = e; + copybits(bits, nb, b); + *irv |= inex; + rv = 1; + ret: + Bfree(b); + return rv; + } + +#ifndef VAX + static int +#ifdef KR_headers +mantbits(d) double d; +#else +mantbits(double d) +#endif +{ + ULong L; +#ifdef VAX + L = word1(d) << 16 | word1(d) >> 16; + if (L) +#else + if ( (L = word1(d)) !=0) +#endif + return P - lo0bits(&L); +#ifdef VAX + L = word0(d) << 16 | word0(d) >> 16 | Exp_msk11; +#else + L = word0(d) | Exp_msk1; +#endif + return P - 32 - lo0bits(&L); + } +#endif /* !VAX */ + + int +strtodg +#ifdef KR_headers + (s00, se, fpi, expt, bits) + CONST char *s00; char **se; CONST FPI *fpi; Long *expt; ULong *bits; +#else + (CONST char *s00, char **se, CONST FPI *fpi, Long *expt, ULong *bits) +#endif +{ + int abe, abits, asub; + int bb0, bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, denorm; + int dsign, e, e1, e2, emin, esign, finished, i, inex, irv; + int j, k, nbits, nd, nd0, nf, nz, nz0, rd, rvbits, rve, rve1, sign; + int sudden_underflow = 0; /* pacify gcc */ + CONST char *s, *s0, *s1; + double adj, adj0, rv, tol; + Long L; + ULong y, z; + Bigint *ab, *bb, *bb1, *bd, *bd0, *bs, *delta, *rvb, *rvb0; + + e2 = 0; /* XXX gcc */ + + irv = STRTOG_Zero; + denorm = sign = nz0 = nz = 0; + dval(rv) = 0.; + rvb = 0; + nbits = fpi->nbits; + for(s = s00;;s++) switch(*s) { + case '-': + sign = 1; + /* FALLTHROUGH */ + case '+': + if (*++s) + goto break2; + /* FALLTHROUGH */ + case 0: + sign = 0; + irv = STRTOG_NoNumber; + s = s00; + goto ret; + case '\t': + case '\n': + case '\v': + case '\f': + case '\r': + case ' ': + continue; + default: + goto break2; + } + break2: + if (*s == '0') { +#ifndef NO_HEX_FP + switch(s[1]) { + case 'x': + case 'X': + irv = gethex(&s, fpi, expt, &rvb, sign); + if (irv == STRTOG_NoNumber) { + s = s00; + sign = 0; + } + goto ret; + } +#endif + nz0 = 1; + while(*++s == '0') ; + if (!*s) + goto ret; + } + sudden_underflow = fpi->sudden_underflow; + s0 = s; + y = z = 0; + for(decpt = nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++) + if (nd < 9) + y = 10*y + c - '0'; + else if (nd < 16) + z = 10*z + c - '0'; + nd0 = nd; +#ifdef USE_LOCALE + if (c == *localeconv()->decimal_point) +#else + if (c == '.') +#endif + { + decpt = 1; + c = *++s; + if (!nd) { + for(; c == '0'; c = *++s) + nz++; + if (c > '0' && c <= '9') { + s0 = s; + nf += nz; + nz = 0; + goto have_dig; + } + goto dig_done; + } + for(; c >= '0' && c <= '9'; c = *++s) { + have_dig: + nz++; + if (c -= '0') { + nf += nz; + for(i = 1; i < nz; i++) + if (nd++ < 9) + y *= 10; + else if (nd <= DBL_DIG + 1) + z *= 10; + if (nd++ < 9) + y = 10*y + c; + else if (nd <= DBL_DIG + 1) + z = 10*z + c; + nz = 0; + } + } + } + dig_done: + e = 0; + if (c == 'e' || c == 'E') { + if (!nd && !nz && !nz0) { + irv = STRTOG_NoNumber; + s = s00; + goto ret; + } + s00 = s; + esign = 0; + switch(c = *++s) { + case '-': + esign = 1; + /* FALLTHROUGH */ + case '+': + c = *++s; + } + if (c >= '0' && c <= '9') { + while(c == '0') + c = *++s; + if (c > '0' && c <= '9') { + L = c - '0'; + s1 = s; + while((c = *++s) >= '0' && c <= '9') + L = 10*L + c - '0'; + if (s - s1 > 8 || L > 19999) + /* Avoid confusion from exponents + * so large that e might overflow. + */ + e = 19999; /* safe for 16 bit ints */ + else + e = (int)L; + if (esign) + e = -e; + } + else + e = 0; + } + else + s = s00; + } + if (!nd) { + if (!nz && !nz0) { +#ifdef INFNAN_CHECK + /* Check for Nan and Infinity */ + if (!decpt) + switch(c) { + case 'i': + case 'I': + if (match(&s,"nf")) { + --s; + if (!match(&s,"inity")) + ++s; + irv = STRTOG_Infinite; + goto infnanexp; + } + break; + case 'n': + case 'N': + if (match(&s, "an")) { + irv = STRTOG_NaN; + *expt = fpi->emax + 1; +#ifndef No_Hex_NaN + if (*s == '(') /*)*/ + irv = hexnan(&s, fpi, bits); +#endif + goto infnanexp; + } + } +#endif /* INFNAN_CHECK */ + irv = STRTOG_NoNumber; + s = s00; + } + goto ret; + } + + irv = STRTOG_Normal; + e1 = e -= nf; + rd = 0; + switch(fpi->rounding & 3) { + case FPI_Round_up: + rd = 2 - sign; + break; + case FPI_Round_zero: + rd = 1; + break; + case FPI_Round_down: + rd = 1 + sign; + } + + /* Now we have nd0 digits, starting at s0, followed by a + * decimal point, followed by nd-nd0 digits. The number we're + * after is the integer represented by those digits times + * 10**e */ + + if (!nd0) + nd0 = nd; + k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; + dval(rv) = (double)y; + if (k > 9) + dval(rv) = tens[k - 9] * dval(rv) + z; + bd0 = 0; + if (nbits <= P && nd <= DBL_DIG) { + if (!e) { + if (rvOK(dval(rv), fpi, expt, bits, 1, rd, &irv)) + goto ret; + } + else if (e > 0) { + if (e <= Ten_pmax) { +#ifdef VAX + goto vax_ovfl_check; +#else + i = fivesbits[e] + mantbits(dval(rv)) <= P; + /* rv = */ rounded_product(dval(rv), tens[e]); + if (rvOK(dval(rv), fpi, expt, bits, i, rd, &irv)) + goto ret; + e1 -= e; + goto rv_notOK; +#endif + } + i = DBL_DIG - nd; + if (e <= Ten_pmax + i) { + /* A fancier test would sometimes let us do + * this for larger i values. + */ + e2 = e - i; + e1 -= i; + dval(rv) *= tens[i]; +#ifdef VAX + /* VAX exponent range is so narrow we must + * worry about overflow here... + */ + vax_ovfl_check: + dval(adj) = dval(rv); + word0(adj) -= P*Exp_msk1; + /* adj = */ rounded_product(dval(adj), tens[e2]); + if ((word0(adj) & Exp_mask) + > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) + goto rv_notOK; + word0(adj) += P*Exp_msk1; + dval(rv) = dval(adj); +#else + /* rv = */ rounded_product(dval(rv), tens[e2]); +#endif + if (rvOK(dval(rv), fpi, expt, bits, 0, rd, &irv)) + goto ret; + e1 -= e2; + } + } +#ifndef Inaccurate_Divide + else if (e >= -Ten_pmax) { + /* rv = */ rounded_quotient(dval(rv), tens[-e]); + if (rvOK(dval(rv), fpi, expt, bits, 0, rd, &irv)) + goto ret; + e1 -= e; + } +#endif + } + rv_notOK: + e1 += nd - k; + + /* Get starting approximation = rv * 10**e1 */ + + e2 = 0; + if (e1 > 0) { + if ( (i = e1 & 15) !=0) + dval(rv) *= tens[i]; + if (e1 &= ~15) { + e1 = (unsigned int)e1 >> 4; + while(e1 >= (1 << (n_bigtens-1))) { + e2 += ((word0(rv) & Exp_mask) + >> Exp_shift1) - Bias; + word0(rv) &= ~Exp_mask; + word0(rv) |= Bias << Exp_shift1; + dval(rv) *= bigtens[n_bigtens-1]; + e1 -= 1 << (n_bigtens-1); + } + e2 += ((word0(rv) & Exp_mask) >> Exp_shift1) - Bias; + word0(rv) &= ~Exp_mask; + word0(rv) |= Bias << Exp_shift1; + for(j = 0; e1 > 0; j++, e1 = (unsigned int)e1 >> 1) + if (e1 & 1) + dval(rv) *= bigtens[j]; + } + } + else if (e1 < 0) { + e1 = -e1; + if ( (i = e1 & 15) !=0) + dval(rv) /= tens[i]; + if (e1 &= ~15) { + e1 = (unsigned int)e1 >> 4; + while(e1 >= (1 << (n_bigtens-1))) { + e2 += ((word0(rv) & Exp_mask) + >> Exp_shift1) - Bias; + word0(rv) &= ~Exp_mask; + word0(rv) |= Bias << Exp_shift1; + dval(rv) *= tinytens[n_bigtens-1]; + e1 -= 1 << (n_bigtens-1); + } + e2 += ((word0(rv) & Exp_mask) >> Exp_shift1) - Bias; + word0(rv) &= ~Exp_mask; + word0(rv) |= Bias << Exp_shift1; + for(j = 0; e1 > 0; j++, e1 = (unsigned int)e1 >> 1) + if (e1 & 1) + dval(rv) *= tinytens[j]; + } + } +#ifdef IBM + /* e2 is a correction to the (base 2) exponent of the return + * value, reflecting adjustments above to avoid overflow in the + * native arithmetic. For native IBM (base 16) arithmetic, we + * must multiply e2 by 4 to change from base 16 to 2. + */ + e2 <<= 2; +#endif + rvb = d2b(dval(rv), &rve, &rvbits); /* rv = rvb * 2^rve */ + if (rvb == NULL) + return STRTOG_NoMemory; + rve += e2; + if ((j = rvbits - nbits) > 0) { + rshift(rvb, j); + rvbits = nbits; + rve += j; + } + bb0 = 0; /* trailing zero bits in rvb */ + e2 = rve + rvbits - nbits; + if (e2 > fpi->emax + 1) + goto huge; + rve1 = rve + rvbits - nbits; + if (e2 < (emin = fpi->emin)) { + denorm = 1; + j = rve - emin; + if (j > 0) { + rvb = lshift(rvb, j); + rvbits += j; + } + else if (j < 0) { + rvbits += j; + if (rvbits <= 0) { + if (rvbits < -1) { + ufl: + rvb->wds = 0; + rvb->x[0] = 0; + *expt = emin; + irv = STRTOG_Underflow | STRTOG_Inexlo; + goto ret; + } + rvb->x[0] = rvb->wds = rvbits = 1; + } + else + rshift(rvb, -j); + } + rve = rve1 = emin; + if (sudden_underflow && e2 + 1 < emin) + goto ufl; + } + + /* Now the hard part -- adjusting rv to the correct value.*/ + + /* Put digits into bd: true value = bd * 10^e */ + + bd0 = s2b(s0, nd0, nd, y); + + for(;;) { + bd = Balloc(bd0->k); + if (bd == NULL) + return STRTOG_NoMemory; + Bcopy(bd, bd0); + bb = Balloc(rvb->k); + if (bb == NULL) + return STRTOG_NoMemory; + Bcopy(bb, rvb); + bbbits = rvbits - bb0; + bbe = rve + bb0; + bs = i2b(1); + if (bs == NULL) + return STRTOG_NoMemory; + + if (e >= 0) { + bb2 = bb5 = 0; + bd2 = bd5 = e; + } + else { + bb2 = bb5 = -e; + bd2 = bd5 = 0; + } + if (bbe >= 0) + bb2 += bbe; + else + bd2 -= bbe; + bs2 = bb2; + j = nbits + 1 - bbbits; + i = bbe + bbbits - nbits; + if (i < emin) /* denormal */ + j += i - emin; + bb2 += j; + bd2 += j; + i = bb2 < bd2 ? bb2 : bd2; + if (i > bs2) + i = bs2; + if (i > 0) { + bb2 -= i; + bd2 -= i; + bs2 -= i; + } + if (bb5 > 0) { + bs = pow5mult(bs, bb5); + if (bs == NULL) + return STRTOG_NoMemory; + bb1 = mult(bs, bb); + if (bb1 == NULL) + return STRTOG_NoMemory; + Bfree(bb); + bb = bb1; + } + bb2 -= bb0; + if (bb2 > 0) { + bb = lshift(bb, bb2); + if (bb == NULL) + return STRTOG_NoMemory; + } + else if (bb2 < 0) + rshift(bb, -bb2); + if (bd5 > 0) { + bd = pow5mult(bd, bd5); + if (bd == NULL) + return STRTOG_NoMemory; + } + if (bd2 > 0) { + bd = lshift(bd, bd2); + if (bd == NULL) + return STRTOG_NoMemory; + } + if (bs2 > 0) { + bs = lshift(bs, bs2); + if (bs == NULL) + return STRTOG_NoMemory; + } + asub = 1; + inex = STRTOG_Inexhi; + delta = diff(bb, bd); + if (delta == NULL) + return STRTOG_NoMemory; + if (delta->wds <= 1 && !delta->x[0]) + break; + dsign = delta->sign; + delta->sign = finished = 0; + L = 0; + i = cmp(delta, bs); + if (rd && i <= 0) { + irv = STRTOG_Normal; + if ( (finished = dsign ^ (rd&1)) !=0) { + if (dsign != 0) { + irv |= STRTOG_Inexhi; + goto adj1; + } + irv |= STRTOG_Inexlo; + if (rve1 == emin) + goto adj1; + for(i = 0, j = nbits; j >= ULbits; + i++, j -= ULbits) { + if (rvb->x[i] & ALL_ON) + goto adj1; + } + if (j > 1 && lo0bits(rvb->x + i) < j - 1) + goto adj1; + rve = rve1 - 1; + rvb = set_ones(rvb, rvbits = nbits); + if (rvb == NULL) + return STRTOG_NoMemory; + break; + } + irv |= dsign ? STRTOG_Inexlo : STRTOG_Inexhi; + break; + } + if (i < 0) { + /* Error is less than half an ulp -- check for + * special case of mantissa a power of two. + */ + irv = dsign + ? STRTOG_Normal | STRTOG_Inexlo + : STRTOG_Normal | STRTOG_Inexhi; + if (dsign || bbbits > 1 || denorm || rve1 == emin) + break; + delta = lshift(delta,1); + if (delta == NULL) + return STRTOG_NoMemory; + if (cmp(delta, bs) > 0) { + irv = STRTOG_Normal | STRTOG_Inexlo; + goto drop_down; + } + break; + } + if (i == 0) { + /* exactly half-way between */ + if (dsign) { + if (denorm && all_on(rvb, rvbits)) { + /*boundary case -- increment exponent*/ + rvb->wds = 1; + rvb->x[0] = 1; + rve = emin + nbits - (rvbits = 1); + irv = STRTOG_Normal | STRTOG_Inexhi; + denorm = 0; + break; + } + irv = STRTOG_Normal | STRTOG_Inexlo; + } + else if (bbbits == 1) { + irv = STRTOG_Normal; + drop_down: + /* boundary case -- decrement exponent */ + if (rve1 == emin) { + irv = STRTOG_Normal | STRTOG_Inexhi; + if (rvb->wds == 1 && rvb->x[0] == 1) + sudden_underflow = 1; + break; + } + rve -= nbits; + rvb = set_ones(rvb, rvbits = nbits); + if (rvb == NULL) + return STRTOG_NoMemory; + break; + } + else + irv = STRTOG_Normal | STRTOG_Inexhi; + if ((bbbits < nbits && !denorm) || !(rvb->x[0] & 1)) + break; + if (dsign) { + rvb = increment(rvb); + if (rvb == NULL) + return STRTOG_NoMemory; + if ( (j = rvbits & kmask) !=0) + j = ULbits - j; + if (hi0bits(rvb->x[(unsigned int)(rvb->wds - 1) + >> kshift]) + != j) + rvbits++; + irv = STRTOG_Normal | STRTOG_Inexhi; + } + else { + if (bbbits == 1) + goto undfl; + decrement(rvb); + irv = STRTOG_Normal | STRTOG_Inexlo; + } + break; + } + if ((dval(adj) = ratio(delta, bs)) <= 2.) { + adj1: + inex = STRTOG_Inexlo; + if (dsign) { + asub = 0; + inex = STRTOG_Inexhi; + } + else if (denorm && bbbits <= 1) { + undfl: + rvb->wds = 0; + rve = emin; + irv = STRTOG_Underflow | STRTOG_Inexlo; + break; + } + adj0 = dval(adj) = 1.; + } + else { + adj0 = dval(adj) *= 0.5; + if (dsign) { + asub = 0; + inex = STRTOG_Inexlo; + } + if (dval(adj) < 2147483647.) { + L = (INT32)adj0; + adj0 -= L; + switch(rd) { + case 0: + if (adj0 >= .5) + goto inc_L; + break; + case 1: + if (asub && adj0 > 0.) + goto inc_L; + break; + case 2: + if (!asub && adj0 > 0.) { + inc_L: + L++; + inex = STRTOG_Inexact - inex; + } + } + dval(adj) = (double)L; + } + } + y = rve + rvbits; + + /* adj *= ulp(dval(rv)); */ + /* if (asub) rv -= adj; else rv += adj; */ + + if (!denorm && rvbits < nbits) { + rvb = lshift(rvb, j = nbits - rvbits); + if (rvb == NULL) + return STRTOG_NoMemory; + rve -= j; + rvbits = nbits; + } + ab = d2b(dval(adj), &abe, &abits); + if (ab == NULL) + return STRTOG_NoMemory; + if (abe < 0) + rshift(ab, -abe); + else if (abe > 0) + ab = lshift(ab, abe); + rvb0 = rvb; + if (asub) { + /* rv -= adj; */ + j = hi0bits(rvb->x[rvb->wds-1]); + rvb = diff(rvb, ab); + if (rvb == NULL) + return STRTOG_NoMemory; + k = rvb0->wds - 1; + if (denorm) + /* do nothing */; + else if (rvb->wds <= k + || hi0bits( rvb->x[k]) > + hi0bits(rvb0->x[k])) { + /* unlikely; can only have lost 1 high bit */ + if (rve1 == emin) { + --rvbits; + denorm = 1; + } + else { + rvb = lshift(rvb, 1); + if (rvb == NULL) + return STRTOG_NoMemory; + --rve; + --rve1; + L = finished = 0; + } + } + } + else { + rvb = sum(rvb, ab); + if (rvb == NULL) + return STRTOG_NoMemory; + k = rvb->wds - 1; + if (k >= rvb0->wds + || hi0bits(rvb->x[k]) < hi0bits(rvb0->x[k])) { + if (denorm) { + if (++rvbits == nbits) + denorm = 0; + } + else { + rshift(rvb, 1); + rve++; + rve1++; + L = 0; + } + } + } + Bfree(ab); + Bfree(rvb0); + if (finished) + break; + + z = rve + rvbits; + if (y == z && L) { + /* Can we stop now? */ + tol = dval(adj) * 5e-16; /* > max rel error */ + dval(adj) = adj0 - .5; + if (dval(adj) < -tol) { + if (adj0 > tol) { + irv |= inex; + break; + } + } + else if (dval(adj) > tol && adj0 < 1. - tol) { + irv |= inex; + break; + } + } + bb0 = denorm ? 0 : trailz(rvb); + Bfree(bb); + Bfree(bd); + Bfree(bs); + Bfree(delta); + } + if (!denorm && (j = nbits - rvbits)) { + if (j > 0) + rvb = lshift(rvb, j); + else + rshift(rvb, -j); + rve -= j; + } + *expt = rve; + Bfree(bb); + Bfree(bd); + Bfree(bs); + Bfree(bd0); + Bfree(delta); + if (rve > fpi->emax) { + huge: + rvb->wds = 0; + irv = STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi; +#ifndef NO_ERRNO + errno = ERANGE; +#endif +#ifdef INFNAN_CHECK + infnanexp: +#endif + *expt = fpi->emax + 1; + } + ret: + if (denorm) { + if (sudden_underflow) { + rvb->wds = 0; + irv = STRTOG_Underflow | STRTOG_Inexlo; + } + else { + irv = (irv & ~STRTOG_Retmask) | + (rvb->wds > 0 ? STRTOG_Denormal : STRTOG_Zero); + if (irv & STRTOG_Inexact) + irv |= STRTOG_Underflow; + } + } + if (se) + *se = __UNCONST(s); + if (sign) + irv |= STRTOG_Neg; + if (rvb) { + copybits(bits, nbits, rvb); + Bfree(rvb); + } + return irv; + } diff --git a/StdLib/LibC/gdtoa/strtof.c b/StdLib/LibC/gdtoa/strtof.c new file mode 100644 index 0000000000..44a4cb3746 --- /dev/null +++ b/StdLib/LibC/gdtoa/strtof.c @@ -0,0 +1,85 @@ +/* $NetBSD: strtof.c,v 1.2.14.1 2008/04/08 21:10:55 jdc Exp $ */ + +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998, 2000 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ +#include + +#include "namespace.h" +#include "gdtoaimp.h" + +#ifdef __weak_alias +__weak_alias(strtof, _strtof) +#endif + + float +#ifdef KR_headers +strtof(s, sp) CONST char *s; char **sp; +#else +strtof(CONST char *s, char **sp) +#endif +{ + static CONST FPI fpi = { 24, 1-127-24+1, 254-127-24+1, 1, SI }; + ULong bits[1]; + Long expt; + int k; + union { ULong L[1]; float f; } u = { 0 }; + + k = strtodg(s, sp, &fpi, &expt, bits); + if (k == STRTOG_NoMemory) { + errno = ERANGE; + return HUGE_VALF; + } + switch(k & STRTOG_Retmask) { + case STRTOG_NoNumber: + case STRTOG_Zero: + u.L[0] = 0; + break; + + case STRTOG_Normal: + case STRTOG_NaNbits: + u.L[0] = (bits[0] & 0x7fffff) | ((expt + 0x7f + 23) << 23); + break; + + case STRTOG_Denormal: + u.L[0] = bits[0]; + break; + + case STRTOG_Infinite: + u.L[0] = 0x7f800000; + break; + + case STRTOG_NaN: + u.L[0] = f_QNAN; + } + if (k & STRTOG_Neg) + u.L[0] |= 0x80000000L; + return u.f; + } diff --git a/StdLib/LibC/gdtoa/strtold_px.c b/StdLib/LibC/gdtoa/strtold_px.c new file mode 100644 index 0000000000..f5920b2c4c --- /dev/null +++ b/StdLib/LibC/gdtoa/strtold_px.c @@ -0,0 +1,4 @@ +/* $NetBSD: strtold_px.c,v 1.1 2006/03/15 17:35:18 kleink Exp $ */ + +#define GDTOA_LD_FMT x +#include "strtold_subr.c" diff --git a/StdLib/LibC/gdtoa/strtold_subr.c b/StdLib/LibC/gdtoa/strtold_subr.c new file mode 100644 index 0000000000..db85fe8f23 --- /dev/null +++ b/StdLib/LibC/gdtoa/strtold_subr.c @@ -0,0 +1,45 @@ +/* $NetBSD: strtold_subr.c,v 1.1 2006/03/15 17:35:18 kleink Exp $ */ + +/* + * Written by Klaus Klein , November 16, 2005. + * Public domain. + */ + +/* + * NOTICE: This is not a standalone file. To use it, #include it in + * the format-specific strtold_*.c, like so: + * + * #define GDTOA_LD_FMT + * #include "strtold_subr.c" + */ +#include +#include + +#include "namespace.h" +#include +#include +#include +#include "gdtoa.h" + +#ifdef __weak_alias +__weak_alias(strtold, _strtold) +#endif + +#ifndef __HAVE_LONG_DOUBLE +#error no extended-precision long double type +#endif + +#ifndef GDTOA_LD_FMT +#error GDTOA_LD_FMT must be defined by format-specific source file +#endif + +#define STRTOP(x) __CONCAT(strtop, x) + +long double +strtold(const char *nptr, char **endptr) +{ + long double ld; + + (void)STRTOP(GDTOA_LD_FMT)(nptr, endptr, &ld); + return ld; +} diff --git a/StdLib/LibC/gdtoa/strtopx.c b/StdLib/LibC/gdtoa/strtopx.c new file mode 100644 index 0000000000..5dce12e0c6 --- /dev/null +++ b/StdLib/LibC/gdtoa/strtopx.c @@ -0,0 +1,108 @@ +/* $NetBSD: strtopx.c,v 1.3.14.1 2008/04/08 21:10:55 jdc Exp $ */ + +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998, 2000 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ +#include + +#include "gdtoaimp.h" + +#undef _0 +#undef _1 + +/* one or the other of IEEE_BIG_ENDIAN or IEEE_LITTLE_ENDIAN should be #defined */ + +#ifdef IEEE_BIG_ENDIAN +#define _0 0 +#define _1 1 +#define _2 2 +#define _3 3 +#define _4 4 +#endif +#ifdef IEEE_LITTLE_ENDIAN +#define _0 4 +#define _1 3 +#define _2 2 +#define _3 1 +#define _4 0 +#endif + + int +#ifdef KR_headers +strtopx(s, sp, V) CONST char *s; char **sp; void *V; +#else +strtopx(CONST char *s, char **sp, void *V) +#endif +{ + static CONST FPI fpi = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, SI }; + ULong bits[2]; + Long expt; + int k; + UShort *L = (UShort*)V; + + k = strtodg(s, sp, &fpi, &expt, bits); + if (k == STRTOG_NoMemory) + return k; + switch(k & STRTOG_Retmask) { + case STRTOG_NoNumber: + case STRTOG_Zero: + L[0] = L[1] = L[2] = L[3] = L[4] = 0; + break; + + case STRTOG_Denormal: + L[_0] = 0; + goto normal_bits; + + case STRTOG_Normal: + case STRTOG_NaNbits: + L[_0] = (UShort)(expt + 0x3fff + 63); + normal_bits: + L[_4] = (UShort)bits[0]; + L[_3] = (UShort)(bits[0] >> 16); + L[_2] = (UShort)bits[1]; + L[_1] = (UShort)(bits[1] >> 16); + break; + + case STRTOG_Infinite: + L[_0] = 0x7fff; + L[_1] = L[_2] = L[_3] = L[_4] = 0; + break; + + case STRTOG_NaN: + L[0] = ldus_QNAN0; + L[1] = ldus_QNAN1; + L[2] = ldus_QNAN2; + L[3] = ldus_QNAN3; + L[4] = ldus_QNAN4; + } + if (k & STRTOG_Neg) + L[_0] |= 0x8000; + return k; + } diff --git a/StdLib/LibC/gdtoa/sum.c b/StdLib/LibC/gdtoa/sum.c new file mode 100644 index 0000000000..850c1f0134 --- /dev/null +++ b/StdLib/LibC/gdtoa/sum.c @@ -0,0 +1,105 @@ +/* $NetBSD: sum.c,v 1.1.1.1.14.1 2008/04/08 21:10:55 jdc Exp $ */ + +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ +#include + +#include "gdtoaimp.h" + + Bigint * +#ifdef KR_headers +sum(a, b) Bigint *a; Bigint *b; +#else +sum(Bigint *a, Bigint *b) +#endif +{ + Bigint *c; + ULong carry, *xc, *xa, *xb, *xe, y; +#ifdef Pack_32 + ULong z; +#endif + + if (a->wds < b->wds) { + c = b; b = a; a = c; + } + c = Balloc(a->k); + if (c == NULL) + return NULL; + c->wds = a->wds; + carry = 0; + xa = a->x; + xb = b->x; + xc = c->x; + xe = xc + b->wds; +#ifdef Pack_32 + do { + y = (*xa & 0xffff) + (*xb & 0xffff) + carry; + carry = (y & 0x10000) >> 16; + z = (*xa++ >> 16) + (*xb++ >> 16) + carry; + carry = (z & 0x10000) >> 16; + Storeinc(xc, z, y); + } + while(xc < xe); + xe += a->wds - b->wds; + while(xc < xe) { + y = (*xa & 0xffff) + carry; + carry = (y & 0x10000) >> 16; + z = (*xa++ >> 16) + carry; + carry = (z & 0x10000) >> 16; + Storeinc(xc, z, y); + } +#else + do { + y = *xa++ + *xb++ + carry; + carry = (y & 0x10000) >> 16; + *xc++ = y & 0xffff; + } + while(xc < xe); + xe += a->wds - b->wds; + while(xc < xe) { + y = *xa++ + carry; + carry = (y & 0x10000) >> 16; + *xc++ = y & 0xffff; + } +#endif + if (carry) { + if (c->wds == c->maxwds) { + b = Balloc(c->k + 1); + if (b == NULL) + return NULL; + Bcopy(b, c); + Bfree(c); + c = b; + } + c->x[c->wds++] = 1; + } + return c; + } diff --git a/StdLib/LibC/gdtoa/ulp.c b/StdLib/LibC/gdtoa/ulp.c new file mode 100644 index 0000000000..6f2780cf02 --- /dev/null +++ b/StdLib/LibC/gdtoa/ulp.c @@ -0,0 +1,73 @@ +/* $NetBSD: ulp.c,v 1.2 2006/01/25 15:27:42 kleink Exp $ */ + +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998, 1999 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ +#include + +#include "gdtoaimp.h" + + double +ulp +#ifdef KR_headers + (x) double x; +#else + (double x) +#endif +{ + Long L; + double a; + + L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; +#ifndef Sudden_Underflow + if (L > 0) { +#endif +#ifdef IBM + L |= Exp_msk1 >> 4; +#endif + word0(a) = (UINT32)L; + word1(a) = 0; +#ifndef Sudden_Underflow + } + else { + L = (unsigned int)-L >> Exp_shift; + if (L < Exp_shift) { + word0(a) = 0x80000 >> L; + word1(a) = 0; + } + else { + word0(a) = 0; + L -= Exp_shift; + word1(a) = L >= 31 ? 1 : 1 << (31 - L); + } + } +#endif + return a; + } diff --git a/StdLib/ReadMe.pdf b/StdLib/ReadMe.pdf new file mode 100644 index 0000000000..2baca31f68 Binary files /dev/null and b/StdLib/ReadMe.pdf differ diff --git a/StdLib/StdLib.dec b/StdLib/StdLib.dec new file mode 100644 index 0000000000..6c5b11aba4 --- /dev/null +++ b/StdLib/StdLib.dec @@ -0,0 +1,36 @@ +## @file +# Declarations for the UDK Standard Libraries. +# +# Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials are licensed and made available under +# the terms and conditions of the BSD License which accompanies this distribution. +# The full text of the license may be found at +# http://opensource.org/licenses/bsd-license. +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +## + + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = StdLib + PACKAGE_GUID = edca00d2-2aeb-4f0b-ba48-52383627d4b2 + PACKAGE_VERSION = 0.01 + + +[Includes] + Include + +[Includes.IA32] + Include/Ia32 + +[Includes.X64] + Include/X64 + +[Includes.IPF] + Include/Ipf + +[Includes.ARM] + Include/Arm diff --git a/StdLib/StdLib.dsc b/StdLib/StdLib.dsc new file mode 100644 index 0000000000..3024b02a20 --- /dev/null +++ b/StdLib/StdLib.dsc @@ -0,0 +1,170 @@ +## @file +# Intel(r) UEFI Standard Libraries for EDK II. +# Build descriptions. +# +# See the comments in the [LibraryClasses.IA32] and [BuildOptions] sections +# for important information about configuring this package for your +# environment. +# +# This package contains: +# Standard C Library. +# +# Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license. +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +## + +[Defines] + PLATFORM_NAME = StdLib + PLATFORM_GUID = 6135e67b-d813-4e4a-93c3-945d6af41858 + PLATFORM_VERSION = 0.01 + DSC_SPECIFICATION = 0x00010006 + OUTPUT_DIRECTORY = Build/StdLib + SUPPORTED_ARCHITECTURES = IA32|IPF|X64 + BUILD_TARGETS = DEBUG|RELEASE + SKUID_IDENTIFIER = DEFAULT + +[PcdsFeatureFlag] + +[PcdsFixedAtBuild] + gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x0f + gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000000 + +[PcdsFixedAtBuild.IPF] + +[LibraryClasses] + # + # Entry Point Libraries + # + UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf + ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf + # + # Common Libraries + # + BaseLib|MdePkg/Library/BaseLib/BaseLib.inf + BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf + UefiLib|MdePkg/Library/UefiLib/UefiLib.inf + PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf + PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf + MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf + UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf + UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf + DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf + DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf + PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf + IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf + PciLib|MdePkg/Library/BasePciLibCf8/BasePciLibCf8.inf + PciCf8Lib|MdePkg/Library/BasePciCf8Lib/BasePciCf8Lib.inf + SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf + UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf + HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf + UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf + PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf + HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf + ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf + FileHandleLib|ShellPkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf + SortLib|ShellPkg/Library/UefiSortLib/UefiSortLib.inf + + # + # C Standard Libraries + # + LibC|StdLib/LibC/LibC.inf + LibStdLib|StdLib/LibC/StdLib/StdLib.inf + LibString|StdLib/LibC/String/String.inf + LibWchar|StdLib/LibC/Wchar/Wchar.inf + LibCType|StdLib/LibC/Ctype/Ctype.inf + LibTime|StdLib/LibC/Time/Time.inf + LibStdio|StdLib/LibC/Stdio/Stdio.inf + LibGdtoa|StdLib/LibC/gdtoa/gdtoa.inf + LibLocale|StdLib/LibC/Locale/Locale.inf + LibUefi|StdLib/LibC/Uefi/Uefi.inf + LibMath|StdLib/LibC/Math/Math.inf + LibSignal|StdLib/LibC/Signal/Signal.inf + LibNetUtil|StdLib/LibC/NetUtil/NetUtil.inf + +[LibraryClasses.IA32] + TimerLib|PerformancePkg/Library/DxeTscTimerLib/DxeTscTimerLib.inf + ## Comment out the above line and un-comment the line below for running under Nt32 emulation. +# TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf + +[LibraryClasses.X64] + TimerLib|PerformancePkg/Library/DxeTscTimerLib/DxeTscTimerLib.inf + +[LibraryClasses.IPF] + PalLib|MdePkg/Library/UefiPalLib/UefiPalLib.inf + TimerLib|MdePkg/Library/SecPeiDxeTimerLibCpu/SecPeiDxeTimerLibCpu.inf + +################################################################################################### +# +# Components Section - list of the modules and components that will be processed by compilation +# tools and the EDK II tools to generate PE32/PE32+/Coff image files. +# +# Note: The EDK II DSC file is not used to specify how compiled binary images get placed +# into firmware volume images. This section is just a list of modules to compile from +# source into UEFI-compliant binaries. +# It is the FDF file that contains information on combining binary files into firmware +# volume images, whose concept is beyond UEFI and is described in PI specification. +# Binary modules do not need to be listed in this section, as they should be +# specified in the FDF file. For example: Shell binary (Shell_Full.efi), FAT binary (Fat.efi), +# Logo (Logo.bmp), and etc. +# There may also be modules listed in this section that are not required in the FDF file, +# When a module listed here is excluded from FDF file, then UEFI-compliant binary will be +# generated for it, but the binary will not be put into any firmware volume. +# +################################################################################################### + +[Components] +# BaseLib and BaseMemoryLib need to be built with the /GL- switch when using the Microsoft +# tool chain. This is required so that the library functions can be resolved during +# the second pass of the linker during Link-time-code-generation. +### +# MdePkg/Library/BaseLib/BaseLib.inf { +# +# MSFT:*_*_*_CC_FLAGS = /X /Zc:wchar_t /GL- +# } +# +# MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf { +# +# MSFT:*_*_*_CC_FLAGS = /X /Zc:wchar_t /GL- +# } + +# Standard C Libraries. + StdLib/LibC/LibC.inf + StdLib/LibC/StdLib/StdLib.inf + StdLib/LibC/String/String.inf + StdLib/LibC/Wchar/Wchar.inf + StdLib/LibC/Ctype/Ctype.inf + StdLib/LibC/Time/Time.inf + StdLib/LibC/Stdio/Stdio.inf + StdLib/LibC/gdtoa/gdtoa.inf + StdLib/LibC/Locale/Locale.inf + StdLib/LibC/Uefi/Uefi.inf + StdLib/LibC/Math/Math.inf + StdLib/LibC/Signal/Signal.inf + StdLib/LibC/NetUtil/NetUtil.inf + + +################################################################ +# +# See the additional comments below if you plan to run applications under the +# Nt32 emulation environment. +# + +[BuildOptions] + INTEL:*_*_*_CC_FLAGS = /Qfreestanding + MSFT:*_*_*_CC_FLAGS = /X /Zc:wchar_t + GCC:*_*_*_CC_FLAGS = -ffreestanding -nostdinc -nostdlib + +# The Build Options, below, are only used when building the C library +# to be run under the NT32 emulation. They disable the clock() system call +# which is currently incompatible with the NT32 environment. +# Just uncomment the lines below and select the correct TimerLib instance, above. + + # INTEL:*_*_IA32_CC_FLAGS = /D NT32dvm + # MSFT:*_*_IA32_CC_FLAGS = /D NT32dvm + # GCC:*_*_IA32_CC_FLAGS = -DNT32dvm diff --git a/StdLibPrivateInternalFiles/DoNotUse.dec b/StdLibPrivateInternalFiles/DoNotUse.dec new file mode 100644 index 0000000000..1b9bdbdbe4 --- /dev/null +++ b/StdLibPrivateInternalFiles/DoNotUse.dec @@ -0,0 +1,35 @@ +## @file +# +# Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials are licensed and made available under +# the terms and conditions of the BSD License which accompanies this distribution. +# The full text of the license may be found at +# http://opensource.org/licenses/bsd-license. +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +## + + +[Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = StdLibPrivateInternalFiles + PACKAGE_GUID = 25e23884-dc26-42c3-bd27-40e99f7d866b + PACKAGE_VERSION = 0.01 + + +[Includes] + Include + +[Includes.IA32] + Include/Ia32 + +[Includes.X64] + Include/X64 + +[Includes.IPF] + Include/Ipf + +[Includes.ARM] + Include/Arm diff --git a/StdLibPrivateInternalFiles/Include/Arm/arith.h b/StdLibPrivateInternalFiles/Include/Arm/arith.h new file mode 100644 index 0000000000..e759ec2ba9 --- /dev/null +++ b/StdLibPrivateInternalFiles/Include/Arm/arith.h @@ -0,0 +1,9 @@ +/* $NetBSD: arith.h,v 1.1 2006/01/25 15:33:28 kleink Exp $ */ + +#include + +#if BYTE_ORDER == BIG_ENDIAN +#define IEEE_BIG_ENDIAN +#else +#define IEEE_LITTLE_ENDIAN +#endif diff --git a/StdLibPrivateInternalFiles/Include/Arm/gd_qnan.h b/StdLibPrivateInternalFiles/Include/Arm/gd_qnan.h new file mode 100644 index 0000000000..57c5affe1b --- /dev/null +++ b/StdLibPrivateInternalFiles/Include/Arm/gd_qnan.h @@ -0,0 +1,12 @@ +/* $NetBSD: gd_qnan.h,v 1.1 2006/01/25 15:33:28 kleink Exp $ */ + +#include + +#define f_QNAN 0x7fc00000 +#if BYTE_ORDER == BIG_ENDIAN +#define d_QNAN0 0x7ff80000 +#define d_QNAN1 0x0 +#else +#define d_QNAN0 0x0 +#define d_QNAN1 0x7ff80000 +#endif diff --git a/StdLibPrivateInternalFiles/Include/Efi/Console.h b/StdLibPrivateInternalFiles/Include/Efi/Console.h new file mode 100644 index 0000000000..867865819b --- /dev/null +++ b/StdLibPrivateInternalFiles/Include/Efi/Console.h @@ -0,0 +1,81 @@ +/** @file + Declarations and macros for the console abstraction. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _LIBRARY_UEFI_CONSOLE_H +#define _LIBRARY_UEFI_CONSOLE_H +#include +#include + +/* The number of "special" character stream devices. + These include: + stdin, stdout, stderr +*/ +#define NUM_SPECIAL 3 + +typedef struct { + UINT32 Column; + UINT32 Row; +} CursorXY; + +typedef union { + UINT64 Offset; + CursorXY XYpos; +} XYoffset; + +/** + In support of the "everything is a file" paradigm of the Standard C Library, + the UEFI Console support is abstracted as an instance of EFI_FILE_PROTOCOL. + The member functions of the protocol translate as: + Open Associates a stream with one of the pseudo-devices: stdin, + stdout, or stderr; as defined by the UEFI System Table. + Close The stream is marked closed and released for use by a + subsequent Open(). + Delete Returns RETURN_UNSUPPORTED. Does Nothing. + Read Blocks reading BufferSize characters using the + EFI_SIMPLE_TEXT_INPUT_PROTOCOL::ReadKeyStroke() function. + Write Sends BufferSize characters to the console for display. The + output is examined for new line characters, '\n', which are then + translated into a Return + New Line, '\r' '\n', sequence. + GetPosition Returns the number of characters input or output to this + stream. Return, '\r', characters inserted due to line ending + translation are not counted. + SetPosition Only valid for Stdout or Stderr. Offset is interpreted as a + CursorXY structure and is used to position the console cursor + using the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL::SetCursorPosition() + call. + GetInfo Populates an EFI_FILE_INFO Buffer with no useful information. + SetInfo Returns RETURN_UNSUPPORTED. Does Nothing. + Flush Returns RETURN_SUCCESS. Does Nothing. + +**/ +typedef struct { + UINT32 Cookie; + UINT32 ConOutMode; // Only valid for stdout & stderr + UINT64 NumRead; + UINT64 NumWritten; + XYoffset MaxConXY; // Only valid for stdout & stderr + EFI_HANDLE Dev; // Could be either Input or Output + EFI_FILE_PROTOCOL Abstraction; +} ConInstance; + +EFI_STATUS +EFIAPI +ConOpen( + IN EFI_FILE_PROTOCOL *This, + OUT EFI_FILE_PROTOCOL **NewHandle, + IN CHAR16 *FileName, + IN UINT64 OpenMode, + IN UINT64 Attributes +); + +#endif /* _LIBRARY_UEFI_CONSOLE_H */ diff --git a/StdLibPrivateInternalFiles/Include/Ia32/arith.h b/StdLibPrivateInternalFiles/Include/Ia32/arith.h new file mode 100644 index 0000000000..2861c74a41 --- /dev/null +++ b/StdLibPrivateInternalFiles/Include/Ia32/arith.h @@ -0,0 +1,3 @@ +/* $NetBSD: arith.h,v 1.1 2006/01/25 15:33:28 kleink Exp $ */ + +#define IEEE_LITTLE_ENDIAN diff --git a/StdLibPrivateInternalFiles/Include/Ia32/gd_qnan.h b/StdLibPrivateInternalFiles/Include/Ia32/gd_qnan.h new file mode 100644 index 0000000000..512431d7eb --- /dev/null +++ b/StdLibPrivateInternalFiles/Include/Ia32/gd_qnan.h @@ -0,0 +1,11 @@ +/* $NetBSD: gd_qnan.h,v 1.1 2006/01/25 15:33:28 kleink Exp $ */ + +#define f_QNAN 0x7fc00000 +#define d_QNAN0 0x0 +#define d_QNAN1 0x7ff80000 +#define ldus_QNAN0 0x0 +#define ldus_QNAN1 0x0 +#define ldus_QNAN2 0x0 +#define ldus_QNAN3 0x4000 +#define ldus_QNAN4 0x7fff +/* 2 bytes of tail padding follow, per i386 ABI */ diff --git a/StdLibPrivateInternalFiles/Include/Ipf/arith.h b/StdLibPrivateInternalFiles/Include/Ipf/arith.h new file mode 100644 index 0000000000..2c07ea28e2 --- /dev/null +++ b/StdLibPrivateInternalFiles/Include/Ipf/arith.h @@ -0,0 +1,6 @@ +/* $NetBSD: arith.h,v 1.1 2006/09/10 21:22:33 cherry Exp $ */ + +#define IEEE_LITTLE_ENDIAN +#ifndef _IEEE_FP +#define Sudden_Underflow +#endif diff --git a/StdLibPrivateInternalFiles/Include/Ipf/gd_qnan.h b/StdLibPrivateInternalFiles/Include/Ipf/gd_qnan.h new file mode 100644 index 0000000000..c46820499a --- /dev/null +++ b/StdLibPrivateInternalFiles/Include/Ipf/gd_qnan.h @@ -0,0 +1,5 @@ +/* $NetBSD: gd_qnan.h,v 1.1 2006/09/10 21:22:33 cherry Exp $ */ + +#define f_QNAN 0x7fc00000 +#define d_QNAN0 0x0 +#define d_QNAN1 0x7ff80000 diff --git a/StdLibPrivateInternalFiles/Include/LibConfig.h b/StdLibPrivateInternalFiles/Include/LibConfig.h new file mode 100644 index 0000000000..67f49c244b --- /dev/null +++ b/StdLibPrivateInternalFiles/Include/LibConfig.h @@ -0,0 +1,30 @@ +/** @file + Global Configuration macros for configuring how LibC is built. + + This file must be included at the beginning of every C file in the + library, and before any of the Standard C header files are included. + + The configuration, as distributed in this file, is the only configuration + these libraries have been tested with. Changing this configuration may + produce code that will not build or may not run. Change at your own risk. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ + +#define _LIBC 1 +#define NLS 1 +#define NO_FENV_H 1 +#define NO_HEX_FP 1 +#define No_Hex_NaN 1 +#define ALL_STATE 1 +#define USG_COMPAT 1 +#define _IEEE_LIBM 1 + +#undef WITH_RUNE diff --git a/StdLibPrivateInternalFiles/Include/MainData.h b/StdLibPrivateInternalFiles/Include/MainData.h new file mode 100644 index 0000000000..7788cb8310 --- /dev/null +++ b/StdLibPrivateInternalFiles/Include/MainData.h @@ -0,0 +1,92 @@ +/** @file + Global data for the program environment. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ +#include +#include + +#include +#include +#include +#include +#include +#include "Efi/Console.h" + +/* ################## Type Declarations ################################# */ + +/** The type of an atexit handler function. **/ +typedef void __xithandler_t(void); + +/* ################## Global Declarations ############################### */ +#ifndef TYPE_BIT +#define TYPE_BIT(type) (sizeof (type) * CHAR_BIT) +#endif /* !defined TYPE_BIT */ + +#ifndef TYPE_SIGNED +#define TYPE_SIGNED(type) (((type) -1) < 0) +#endif /* !defined TYPE_SIGNED */ + +#ifndef INT_STRLEN_MAXIMUM +/* +** 302 / 1000 is log10(2.0) rounded up. +** Subtract one for the sign bit if the type is signed; +** add one for integer division truncation; +** add one more for a minus sign if the type is signed. +*/ +#define INT_STRLEN_MAXIMUM(type) \ +((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + 1 + TYPE_SIGNED(type)) +#endif /* !defined INT_STRLEN_MAXIMUM */ + +/* +** Big enough for something such as +** ??? ???-2147483648 -2147483648:-2147483648:-2147483648 -2147483648\n +** (two three-character abbreviations, five strings denoting integers, +** three explicit spaces, two explicit colons, a newline, +** and a trailing ASCII nul). +*/ +#define ASCTIME_BUFLEN (3 * 2 + 5 * INT_STRLEN_MAXIMUM(int) + 3 + 2 + 1 + 1) + +struct __filedes { + EFI_FILE_HANDLE FileHandle; + UINT32 State; // In use if non-zero + int Oflags; // From the open call + int Omode; // From the open call + int RefCount; // Reference count of opens + int SocProc; // Placeholder: socket owner process or process group. + UINT16 MyFD; // Which FD this is. +}; + +struct __MainData { + // File descriptors + struct __filedes fdarray[OPEN_MAX]; + // Low-level File abstractions for the stdin, stdout, stderr streams + ConInstance StdIo[3]; + + // Signal Handlers + __sighandler_t *sigarray[SIG_LAST]; // Pointers to signal handlers + + void (*cleanup)(void); // Cleanup Function Pointer + + __xithandler_t *atexit_handler[ATEXIT_MAX]; // Array of handlers for atexit. + clock_t AppStartTime; // Set in Main.c and used for time.h + clock_t ClocksPerSecond; // Set in Main.c and used for time.h + int num_atexit; ///< Number of registered atexit handlers. + + CHAR16 UString[UNICODE_STRING_MAX]; + struct tm BDTime; // Broken-down time structure for localtime. + EFI_TIME TimeBuffer; // Used by mk + char ASgetenv[ASCII_STRING_MAX]; // Only modified by getenv + char ASasctime[ASCTIME_BUFLEN]; // Only modified by asctime + + BOOLEAN aborting; // Ensures cleanup function only called once when aborting. +}; + +extern struct __MainData *gMD; diff --git a/StdLibPrivateInternalFiles/Include/X64/arith.h b/StdLibPrivateInternalFiles/Include/X64/arith.h new file mode 100644 index 0000000000..2861c74a41 --- /dev/null +++ b/StdLibPrivateInternalFiles/Include/X64/arith.h @@ -0,0 +1,3 @@ +/* $NetBSD: arith.h,v 1.1 2006/01/25 15:33:28 kleink Exp $ */ + +#define IEEE_LITTLE_ENDIAN diff --git a/StdLibPrivateInternalFiles/Include/X64/gd_qnan.h b/StdLibPrivateInternalFiles/Include/X64/gd_qnan.h new file mode 100644 index 0000000000..7bcfa242b0 --- /dev/null +++ b/StdLibPrivateInternalFiles/Include/X64/gd_qnan.h @@ -0,0 +1,11 @@ +/* $NetBSD: gd_qnan.h,v 1.1 2006/01/25 15:33:28 kleink Exp $ */ + +#define f_QNAN 0x7fc00000 +#define d_QNAN0 0x0 +#define d_QNAN1 0x7ff80000 +#define ldus_QNAN0 0x0 +#define ldus_QNAN1 0x0 +#define ldus_QNAN2 0x0 +#define ldus_QNAN3 0x4000 +#define ldus_QNAN4 0x7fff +/* 6 bytes of tail padding follow, per AMD64 ABI */ diff --git a/StdLibPrivateInternalFiles/Include/extern.h b/StdLibPrivateInternalFiles/Include/extern.h new file mode 100644 index 0000000000..14e6fa04da --- /dev/null +++ b/StdLibPrivateInternalFiles/Include/extern.h @@ -0,0 +1,69 @@ +/* $NetBSD: extern.h,v 1.14 2006/11/22 17:23:25 christos Exp $ */ + +/* + * Copyright (c) 1997 Christos Zoulas. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Christos Zoulas. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include + +__BEGIN_DECLS +extern char *__minbrk; +int __getcwd(char *, size_t); +int __getlogin(char *, size_t); +int __setlogin(const char *); +void _resumecontext(void); +const char *__strerror(int , char *, size_t); +const char *__strsignal(int , char *, size_t); +char *__dtoa(double, int, int, int *, int *, char **); +void __freedtoa(char *); +int __sysctl(const int *, unsigned int, void *, size_t *, const void *, size_t); + +struct sigaction; +int __sigaction_sigtramp(int, const struct sigaction *, + struct sigaction *, const void *, int); + +#ifdef WIDE_DOUBLE + char *__hdtoa(double, const char *, int, int *, int *, char **); + char *__hldtoa(long double, const char *, int, int *, int *, char **); + char *__ldtoa(long double *, int, int, int *, int *, char **); +#endif + +struct syslog_data; +void syslog_ss(int, struct syslog_data *, const char *, ...) + __attribute__((__format__(__printf__,3,4))); +void vsyslog_ss(int, struct syslog_data *, const char *, _BSD_VA_LIST_); + +int snprintf_ss(char * __restrict, size_t, const char * __restrict, ...) + __attribute__((__format__(__printf__, 3, 4))); +int vsnprintf_ss(char * __restrict, size_t, const char * __restrict, + _BSD_VA_LIST_) __attribute__((__format__(__printf__, 3, 0))); + +void Efi2Tm( EFI_TIME *ET, struct tm *BT); +time_t Efi2Time( EFI_TIME *EfiBDtime); + +__END_DECLS diff --git a/StdLibPrivateInternalFiles/Include/namespace.h b/StdLibPrivateInternalFiles/Include/namespace.h new file mode 100644 index 0000000000..038e402cc8 --- /dev/null +++ b/StdLibPrivateInternalFiles/Include/namespace.h @@ -0,0 +1,778 @@ +/* $NetBSD: namespace.h,v 1.125 2006/11/08 20:37:14 drochner Exp $ */ + +/*- + * Copyright (c) 1997-2004 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _NAMESPACE_H_ +#define _NAMESPACE_H_ + +#include + +#ifndef __lint__ +#define brk _brk +#define catclose _catclose +#define catgets _catgets +#define catopen _catopen +#define daylight _daylight +#define err _err +#define errx _errx +#ifdef _REENTRANT +#define fileno _fileno +#endif /* _REENTRANT */ +#define fork _fork +#define fseeko _fseeko +#define ftello _ftello +#define getcontext _getcontext +#define getenv_r _getenv_r +//#define inet_aton _inet_aton +//#define inet_pton _inet_pton +#define pipe _pipe +#define sbrk _sbrk +//#define strerror_r _strerror_r +#define strlcat _strlcat +#define strlcpy _strlcpy +#define strtof _strtof +#define strtoimax _strtoimax +#define strtold _strtold +#define strtoll _strtoll +#define strtoull _strtoull +#define strtoumax _strtoumax +#define sys_errlist _sys_errlist +#define sys_nerr _sys_nerr +#define sys_siglist _sys_siglist +#define sys_nsig _sys_nsig +#define sysconf __sysconf +#define verr _verr +#define verrx _verrx +#define vwarn _vwarn +#define vwarnx _vwarnx +#define warn _warn +#define warnx _warnx + +#if 0 +//#ifdef __weak_alias +#define MD2Data _MD2Data +#define MD2End _MD2End +#define MD2FileChunk _MD2FileChunk +#define MD2File _MD2File +#define MD2Final _MD2Final +#define MD2Init _MD2Init +#define MD2Transform _MD2Transform +#define MD2Update _MD2Update +#define MD4Data _MD4Data +#define MD4End _MD4End +#define MD4FileChunk _MD4FileChunk +#define MD4File _MD4File +#define MD4Final _MD4Final +#define MD4Init _MD4Init +#define MD4Transform _MD4Transform +#define MD4Update _MD4Update +#define MD5Data _MD5Data +#define MD5End _MD5End +#define MD5FileChunk _MD5FileChunk +#define MD5File _MD5File +#define MD5Final _MD5Final +#define MD5Init _MD5Init +#define MD5Transform _MD5Transform +#define MD5Update _MD5Update +#define RMD160Data _RMD160Data +#define RMD160End _RMD160End +#define RMD160FileChunk _RMD160FileChunk +#define RMD160File _RMD160File +#define RMD160Final _RMD160Final +#define RMD160Init _RMD160Init +#define RMD160Transform _RMD160Transform +#define RMD160Update _RMD160Update +#define SHA1Data _SHA1Data +#define SHA1End _SHA1End +#define SHA1FileChunk _SHA1FileChunk +#define SHA1File _SHA1File +#define SHA1Final _SHA1Final +#define SHA1Init _SHA1Init +#define SHA1Transform _SHA1Transform +#define SHA1Update _SHA1Update +#define SHA256_Data _SHA256_Data +#define SHA256_End _SHA256_End +#define SHA256_FileChunk _SHA256_FileChunk +#define SHA256_File _SHA256_File +#define SHA256_Final _SHA256_Final +#define SHA256_Init _SHA256_Init +#define SHA256_Transform _SHA256_Transform +#define SHA256_Update _SHA256_Update +#define SHA384_Data _SHA384_Data +#define SHA384_End _SHA384_End +#define SHA384_FileChunk _SHA384_FileChunk +#define SHA384_File _SHA384_File +#define SHA384_Final _SHA384_Final +#define SHA384_Init _SHA384_Init +#define SHA384_Transform _SHA384_Transform +#define SHA384_Update _SHA384_Update +#define SHA512_Data _SHA512_Data +#define SHA512_End _SHA512_End +#define SHA512_FileChunk _SHA512_FileChunk +#define SHA512_File _SHA512_File +#define SHA512_Final _SHA512_Final +#define SHA512_Init _SHA512_Init +#define SHA512_Transform _SHA512_Transform +#define SHA512_Update _SHA512_Update +#define a64l _a64l +#define adjtime _adjtime +#define alarm _alarm +#define alphasort _alphasort +#define arc4random _arc4random +#define asctime_r _asctime_r +#define asprintf _asprintf +#define atoll _atoll +#define authnone_create _authnone_create +#define authunix_create _authunix_create +#define authunix_create_default _authunix_create_default +#define basename _basename +#define bindresvport _bindresvport +#define bindresvport_sa _bindresvport_sa +#define bm_comp _bm_comp +#define bm_exec _bm_exec +#define bm_free _bm_free +#define callrpc _callrpc +#define cfgetispeed _cfgetispeed +#define cfgetospeed _cfgetospeed +#define cfmakeraw _cfmakeraw +#define cfsetispeed _cfsetispeed +#define cfsetospeed _cfsetospeed +#define cfsetspeed _cfsetspeed +#define cgetcap _cgetcap +#define cgetclose _cgetclose +#define cgetent _cgetent +#define cgetfirst _cgetfirst +#define cgetmatch _cgetmatch +#define cgetnext _cgetnext +#define cgetnum _cgetnum +#define cgetset _cgetset +#define cgetstr _cgetstr +#define cgetustr _cgetustr +#define clnt_broadcast _clnt_broadcast +#define clnt_create _clnt_create +#define clnt_create_vers _clnt_create_vers +#define clnt_dg_create _clnt_dg_create +#define clnt_pcreateerror _clnt_pcreateerror +#define clnt_perrno _clnt_perrno +#define clnt_perror _clnt_perror +#define clnt_raw_create _clnt_raw_create +#define clnt_tli_create _clnt_tli_create +#define clnt_tp_create _clnt_tp_create +#define clnt_spcreateerror _clnt_spcreateerror +#define clnt_sperrno _clnt_sperrno +#define clnt_sperror _clnt_sperror +#define clnt_vc_create _clnt_vc_create +#define clntraw_create _clntraw_create +#define clnttcp_create _clnttcp_create +#define clntudp_bufcreate _clntudp_bufcreate +#define clntudp_create _clntudp_create +#define clock_settime _clock_settime +#define closedir _closedir +#define closelog _closelog +#define closelog_r _closelog_r +#define confstr _confstr +#define ctermid _ctermid +#define ctime_r _ctime_r +#define daemon _daemon +#define dbopen _dbopen +#define devname _devname +#define dirname _dirname +#define dn_expand _dn_expand +#define drand48 _drand48 +#define endfsent _endfsent +#define endgrent _endgrent +#define endhostent _endhostent +#define endnetconfig _endnetconfig +#define endnetent _endnetent +#define endnetgrent _endnetgrent +#define endnetpath _endnetpath +#define endprotoent _endprotoent +#define endprotoent_r _endprotoent_r +#define endpwent _endpwent +#define endrpcent _endrpcent +#define endservent _endservent +#define endservent_r _endservent_r +#define endttyent _endttyent +#define endusershell _endusershell +#define erand48 _erand48 +#define ether_aton _ether_aton +#define ether_hostton _ether_hostton +#define ether_line _ether_line +#define ether_ntoa _ether_ntoa +#define ether_ntohost _ether_ntohost +#define execl _execl +#define execle _execle +#define execlp _execlp +#define execv _execv +#define execvp _execvp +#define fdopen _fdopen +#define fgetln _fgetln +#define fgetwln _fgetwln +#define fhstatvfs _fhstatvfs +#define flockfile _flockfile +#define ftrylockfile _ftrylockfile +#define funlockfile _funlockfile +#define fnmatch _fnmatch +#define fparseln _fparseln +#define fpgetmask _fpgetmask +#define fpgetround _fpgetround +#define fpgetsticky _fpgetsticky +#define fpsetmask _fpsetmask +#define fpsetround _fpsetround +#define fpsetsticky _fpsetsticky +#define freenetconfigent _freenetconfigent +#define freeaddrinfo _freeaddrinfo +#define freeifaddrs _freeifaddrs +#define fstatvfs _fstatvfs +#define ftok _ftok +#define ftruncate _ftruncate +#define fts_children _fts_children +#define fts_close _fts_close +#define fts_open _fts_open +#define fts_read _fts_read +#define fts_set _fts_set +#define gai_strerror _gai_strerror +#define get_myaddress _get_myaddress +#define getaddrinfo _getaddrinfo +#define getbsize _getbsize +#define getcwd _getcwd +#define getdevmajor _getdevmajor +#define getdiskbyname _getdiskbyname +#define getdomainname _getdomainname +#define getfsent _getfsent +#define getfsfile _getfsfile +#define getfsspec _getfsspec +#define getgrent _getgrent +#define getgrent_r _getgrent_r +#define getgrgid _getgrgid +#define getgrgid_r _getgrgid_r +#define getgrnam _getgrnam +#define getgrnam_r _getgrnam_r +#define getgrouplist _getgrouplist +#define getgroupmembership _getgroupmembership +#define gethostbyaddr _gethostbyaddr +#define gethostbyname _gethostbyname +#define gethostent _gethostent +#define gethostname _gethostname +#define getifaddrs _getifaddrs +#define getloadavg _getloadavg +#define getlogin _getlogin +#define getmntinfo _getmntinfo +#define getmode _getmode +#define getnameinfo _getnameinfo +#define getnetbyaddr _getnetbyaddr +#define getnetbyname _getnetbyname +#define getnetconfig _getnetconfig +#define getnetconfigent _getnetconfigent +#define getnetent _getnetent +#define getnetgrent _getnetgrent +#define getnetpath _getnetpath +#define getopt _getopt +#define getopt_long _getopt_long +#define getpagesize _getpagesize +#define getpass _getpass +#define getprogname _getprogname +#define getprotobyname _getprotobyname +#define getprotobyname_r _getprotobyname_r +#define getprotobynumber _getprotobynumber +#define getprotobynumber_r _getprotobynumber_r +#define getprotoent _getprotoent +#define getprotoent_r _getprotoent_r +#define getpwent _getpwent +#define getpwent_r _getpwent_r +#define getpwnam _getpwnam +#define getpwnam_r _getpwnam_r +#define getpwuid _getpwuid +#define getpwuid_r _getpwuid_r +#define getrpcbyname _getrpcbyname +#define getrpcbyname_r _getrpcbyname_r +#define getrpcbynumber _getrpcbynumber +#define getrpcbynumber_r _getrpcbynumber_r +#define getrpcent _getrpcent +#define getrpcent_r _getrpcent_r +#define getrpcport _getrpcport +#define getservbyname _getservbyname +#define getservbyname_r _getservbyname_r +#define getservbyport _getservbyport +#define getservbyport_r _getservbyport_r +#define getservent _getservent +#define getservent_r _getservent_r +#define getsubopt _getsubopt +#define getttyent _getttyent +#define getttynam _getttynam +#define getusershell _getusershell +#define glob _glob +#define globfree _globfree +#define gmtime_r _gmtime_r +#define group_from_gid _group_from_gid +#define heapsort _heapsort +#define herror _herror +#define hes_error _hes_error +#define hes_free _hes_free +#define hes_init _hes_init +#define hes_resolve _hes_resolve +#define hes_to_bind _hes_to_bind +#define hesiod_end _hesiod_end +#define hesiod_free_list _hesiod_free_list +#define hesiod_init _hesiod_init +#define hesiod_resolve _hesiod_resolve +#define hesiod_to_bind _hesiod_to_bind +#define iconv _iconv +#define iconv_open _iconv_open +#define iconv_close _iconv_close +#define if_freenameindex _if_freenameindex +#define if_indextoname _if_indextoname +#define if_nameindex _if_nameindex +#define if_nametoindex _if_nametoindex +#define in6addr_any _in6addr_any +#define in6addr_linklocal_allnodes _in6addr_linklocal_allnodes +#define in6addr_linklocal_allrouters _in6addr_linklocal_allrouters +#define in6addr_loopback _in6addr_loopback +#define in6addr_nodelocal_allnodes _in6addr_nodelocal_allnodes +#define inet6_option_alloc _inet6_option_alloc +#define inet6_option_append _inet6_option_append +#define inet6_option_find _inet6_option_find +#define inet6_option_init _inet6_option_init +#define inet6_option_next _inet6_option_next +#define inet6_option_space _inet6_option_space +#define inet6_opt_init _inet6_opt_init +#define inet6_opt_append _inet6_opt_append +#define inet6_opt_finish _inet6_opt_finish +#define inet6_opt_set_val _inet6_opt_set_val +#define inet6_opt_next _inet6_opt_next +#define inet6_opt_find _inet6_opt_find +#define inet6_opt_get_val _inet6_opt_get_val +#define inet6_rthdr_add _inet6_rthdr_add +#define inet6_rthdr_getaddr _inet6_rthdr_getaddr +#define inet6_rthdr_getflags _inet6_rthdr_getflags +#define inet6_rthdr_init _inet6_rthdr_init +#define inet6_rthdr_lasthop _inet6_rthdr_lasthop +#define inet6_rthdr_segments _inet6_rthdr_segments +#define inet6_rthdr_space _inet6_rthdr_space +#define inet6_rth_space _inet6_rth_space +#define inet6_rth_init _inet6_rth_init +#define inet6_rth_add _inet6_rth_add +#define inet6_rth_reverse _inet6_rth_reverse +#define inet6_rth_segments _inet6_rth_segments +#define inet6_rth_getaddr _inet6_rth_getaddr +#define inet_cidr_ntop _inet_cidr_ntop +#define inet_cidr_pton _inet_cidr_pton +#define inet_lnaof _inet_lnaof +#define inet_makeaddr _inet_makeaddr +#define inet_net_ntop _inet_net_ntop +#define inet_net_pton _inet_net_pton +#define inet_neta _inet_neta +#define inet_netof _inet_netof +#define inet_network _inet_network +#define inet_nsap_addr _inet_nsap_addr +#define inet_nsap_ntoa _inet_nsap_ntoa +#define inet_ntoa _inet_ntoa +#define inet_ntop _inet_ntop +#define initgroups _initgroups +#define initstate _initstate +#define innetgr _innetgr +#define isatty _isatty +#define jrand48 _jrand48 +#define kill _kill +#define l64a _l64a +#define l64a_r _l64a_r +#define lcong48 _lcong48 +#define llabs _llabs +#define lldiv _lldiv +#define localtime_r _localtime_r +#define lockf _lockf +#define lrand48 _lrand48 +#define lseek _lseek +#define mergesort _mergesort +#define mkstemp _mkstemp +#define mmap _mmap +#define mpool_close _mpool_close +#define mpool_filter _mpool_filter +#define mpool_get _mpool_get +#define mpool_new _mpool_new +#define mpool_open _mpool_open +#define mpool_put _mpool_put +#define mpool_sync _mpool_sync +#define mrand48 _mrand48 +#define nc_perror _nc_perror +#define nc_sperror _nc_sperror +#define nice _nice +#define nrand48 _nrand48 +#define ntp_adjtime _ntp_adjtime +#define nsdispatch _nsdispatch +#define offtime _offtime +#define opendir _opendir +#define openlog _openlog +#define openlog_r _openlog_r +#define pause _pause +#define pclose _pclose +#define pmap_getmaps _pmap_getmaps +#define pmap_getport _pmap_getport +#define pmap_rmtcall _pmap_rmtcall +#define pmap_set _pmap_set +#define pmap_unset _pmap_unset +#define popen _popen +#define posix2time _posix2time +#define pread _pread +#define psignal _psignal +#define pthread_atfork _pthread_atfork +#define putenv _putenv +#define pwcache_groupdb _pwcache_groupdb +#define pwcache_userdb _pwcache_userdb +#define pwrite _pwrite +#define qabs _qabs +#define qdiv _qdiv +#define radixsort _radixsort +#define random _random +#define randomid _randomid +#define randomid_new _randomid_new +#define randomid_delete _randomid_delete +#define readdir _readdir +#define readdir_r _readdir_r +#define realpath _realpath +#define regcomp _regcomp +#define regerror _regerror +#define regexec _regexec +#define regfree _regfree +#define registerrpc _registerrpc +#define res_init _res_init +#define res_mkquery _res_mkquery +#define res_query _res_query +#define res_search _res_search +#define rewinddir _rewinddir +#define rpc_broadcast _rpc_broadcast +#define rpc_broadcast_exp _rpc_broadcast_exp +#define rpc_call _rpc_call +#define rpc_control _rpc_control +#define rpc_reg _rpc_reg +#define rpcb_getmaps _rpcb_getmaps +#define rpcb_gettime _rpcb_gettime +#define rpcb_rmtcall _rpcb_rmtcall +#define rpcb_set _rpcb_set +#define rpcb_taddr2uaddr _rpcb_taddr2uaddr +#define rpcb_uaddr2taddr _rpcb_uaddr2taddr +#define rpcb_unset _rpcb_unset +#define scandir _scandir +#define seed48 _seed48 +#define seekdir _seekdir +#define send _send +#define setdomainname _setdomainname +#define setenv _setenv +#define setfsent _setfsent +#define setgrent _setgrent +#define setgroupent _setgroupent +#define sethostent _sethostent +#define sethostname _sethostname +#define setlogin _setlogin +#define setlogmask _setlogmask +#define setlogmask_r _setlogmask_r +#define setmode _setmode +#define setnetconfig _setnetconfig +#define setnetent _setnetent +#define setnetgrent _setnetgrent +#define setpassent _setpassent +#define setnetpath _setnetpath +#define setproctitle _setproctitle +#define setprotoent _setprotoent +#define setprotoent_r _setprotoent_r +#define setpwent _setpwent +#define setrpcent _setrpcent +#define setservent _setservent +#define setservent_r _setservent_r +#define setstate _setstate +#define setttyent _setttyent +#define setttyentpath _setttyentpath +#define settimeofday _settimeofday +#define setusershell _setusershell +#define shm_open _shm_open +#define shm_unlink _shm_unlink +#define shquote _shquote +#define siginterrupt _siginterrupt +#define signal _signal +#define sl_add _sl_add +#define sl_create _sl_create +#define sl_find _sl_find +#define sl_free _sl_free +#define sl_init _sl_init +#define sleep _sleep +#define snprintf _snprintf +#define snprintf_ss _snprintf_ss +#define sradixsort _sradixsort +#define srand48 _srand48 +#define srandom _srandom +#define statvfs(a, b) _statvfs(a, b) +#define strcasecmp _strcasecmp +#define strdup _strdup +#define stresep _stresep +#define strndup _strndup +#define strncasecmp _strncasecmp +#define strptime _strptime +#define strsep _strsep +#define strsignal _strsignal +#define strsuftoll _strsuftoll +#define strsuftollx _strsuftollx +#define strsvis _strsvis +#define strsvisx _strsvisx +#define strtok_r _strtok_r +#define strunvis _strunvis +#define strvis _strvis +#define strvisx _strvisx +#define svc_auth_reg _svc_auth_reg +#define svc_create _svc_create +#define svc_dg_create _svc_dg_create +#define svc_exit _svc_exit +#define svc_fd_create _svc_fd_create +#define svc_getreq _svc_getreq +#define svc_getreqset _svc_getreqset +#define svc_getreq_common _svc_getreq_common +#define svc_raw_create _svc_raw_create +#define svc_register _svc_register +#define svc_reg _svc_reg +#define svc_run _svc_run +#define svc_sendreply _svc_sendreply +#define svc_tli_create _svc_tli_create +#define svc_tp_create _svc_tp_create +#define svc_unregister _svc_unregister +#define svc_unreg _svc_unreg +#define svc_vc_create _svc_vc_create +#define svcerr_auth _svcerr_auth +#define svcerr_decode _svcerr_decode +#define svcerr_noproc _svcerr_noproc +#define svcerr_noprog _svcerr_noprog +#define svcerr_progvers _svcerr_progvers +#define svcerr_systemerr _svcerr_systemerr +#define svcerr_weakauth _svcerr_weakauth +#define svcfd_create _svcfd_create +#define svcraw_create _svcraw_create +#define svctcp_create _svctcp_create +#define svcudp_bufcreate _svcudp_bufcreate +#define svcudp_create _svcudp_create +#define svcudp_enablecache _svcudp_enablecache +#define svis _svis +#define sysarch _sys_sysarch +#define sysctl _sysctl +#define sysctlbyname _sysctlbyname +#define sysctlgetmibinfo _sysctlgetmibinfo +#define sysctlnametomib _sysctlnametomib +#define syslog _syslog +#define syslog_r _syslog_r +#define syslog_ss _syslog_ss +#define taddr2uaddr _taddr2uaddr +#define tcdrain _tcdrain +#define tcflow _tcflow +#define tcflush _tcflush +#define tcgetattr _tcgetattr +#define tcgetpgrp _tcgetpgrp +#define tcgetsid _tcgetsid +#define tcsendbreak _tcsendbreak +#define tcsetattr _tcsetattr +#define tcsetpgrp _tcsetpgrp +#define telldir _telldir +#define time _time +#define time2posix _time2posix +#define timegm _timegm +#define timelocal _timelocal +#define timeoff _timeoff +#define times _times +#define ttyname _ttyname +#define ttyname_r _ttyname_r +#define ttyslot _ttyslot +#define tzname _tzname +#define tzset _tzset +#define tzsetwall _tzsetwall +#define uaddr2taddr _uaddr2taddr +#define ualarm _ualarm +#define uname _uname +#define unsetenv _unsetenv +#define unvis _unvis +#define user_from_uid _user_from_uid +#define usleep _usleep +#define utime _utime +#define uuid_create_nil _uuid_create_nil +#define uuid_is_nil _uuid_is_nil +#define valloc _valloc +#define vis _vis +#define vsnprintf _vsnprintf +#define vsnprintf_ss _vsnprintf_ss +#define vsyslog _vsyslog +#define vsyslog_r _vsyslog_r +#define vsyslog_ss _vsyslog_ss +#define wait _wait +#define wait3 _wait3 +#define waitpid _waitpid +#define wcscasecmp _wcscasecmp +#define wcsdup _wcsdup +#define wcsncasecmp _wcsncasecmp +#define wcstof _wcstof +#define wcstod _wcstod +#define wcstold _wcstold +#define wcwidth _wcwidth +#define xdr_accepted_reply _xdr_accepted_reply +#define xdr_array _xdr_array +#define xdr_authunix_parms _xdr_authunix_parms +#define xdr_bool _xdr_bool +#define xdr_bytes _xdr_bytes +#define xdr_callhdr _xdr_callhdr +#define xdr_callmsg _xdr_callmsg +#define xdr_char _xdr_char +#define xdr_datum _xdr_datum +#define xdr_des_block _xdr_des_block +#define xdr_domainname _xdr_domainname +#define xdr_double _xdr_double +#define xdr_enum _xdr_enum +#define xdr_float _xdr_float +#define xdr_free _xdr_free +#define xdr_hyper _xdr_hyper +#define xdr_int _xdr_int +#define xdr_int16_t _xdr_int16_t +#define xdr_int32_t _xdr_int32_t +#define xdr_int64_t _xdr_int64_t +#define xdr_long _xdr_long +#define xdr_longlong_t _xdr_longlong_t +#define xdr_mapname _xdr_mapname +#define xdr_netbuf _xdr_netbuf +#define xdr_netobj _xdr_netobj +#define xdr_opaque _xdr_opaque +#define xdr_opaque_auth _xdr_opaque_auth +#define xdr_peername _xdr_peername +#define xdr_pmap _xdr_pmap +#define xdr_pmaplist _xdr_pmaplist +#define xdr_pointer _xdr_pointer +#define xdr_reference _xdr_reference +#define xdr_rejected_reply _xdr_rejected_reply +#define xdr_replymsg _xdr_replymsg +#define xdr_rmtcall_args _xdr_rmtcall_args +#define xdr_rmtcallres _xdr_rmtcallres +#define xdr_rpcb _xdr_rpcb +#define xdr_rpcb_entry _xdr_rpcb_entry +#define xdr_rpcb_entry_list_ptr _xdr_rpcb_entry_list_ptr +#define xdr_rpcb_rmtcallargs _xdr_rpcb_rmtcallargs +#define xdr_rpcb_rmtcallres _xdr_rpcb_rmtcallres +#define xdr_rpcb_stat _xdr_rpcb_stat +#define xdr_rpcb_stat_byvers _xdr_rpcb_stat_byvers +#define xdr_rpcblist _xdr_rpcblist +#define xdr_rpcblist_ptr _xdr_rpcblist_ptr +#define xdr_rpcbs_addrlist _xdr_rpcbs_addrlist +#define xdr_rpcbs_addrlist_ptr _xdr_rpcbs_addrlist_ptr +#define xdr_rpcbs_proc _xdr_rpcbs_proc +#define xdr_rpcbs_rmtcalllist _xdr_rpcbs_rmtcalllist +#define xdr_rpcbs_rmtcalllist_ptr _xdr_rpcbs_rmtcalllist_ptr +#define xdr_rpcbs _xdr_rpcbs +#define xdr_rpcbs _xdr_rpcbs +#define xdr_short _xdr_short +#define xdr_string _xdr_string +#define xdr_u_char _xdr_u_char +#define xdr_u_hyper _xdr_u_hyper +#define xdr_u_int _xdr_u_int +#define xdr_u_int16_t _xdr_u_int16_t +#define xdr_u_int32_t _xdr_u_int32_t +#define xdr_u_int64_t _xdr_u_int64_t +#define xdr_u_long _xdr_u_long +#define xdr_u_longlong_t _xdr_u_longlong_t +#define xdr_u_short _xdr_u_short +#define xdr_union _xdr_union +#define xdr_vector _xdr_vector +#define xdr_void _xdr_void +#define xdr_wrapstring _xdr_wrapstring +#define xdr_yp_inaddr _xdr_yp_inaddr +#define xdr_ypall _xdr_ypall +#define xdr_ypbind_resp _xdr_ypbind_resp +#define xdr_ypbind_setdom _xdr_ypbind_setdom +#define xdr_ypdomain_wrap_string _xdr_ypdomain_wrap_string +#define xdr_ypmap_parms _xdr_ypmap_parms +#define xdr_ypmap_wrap_string _xdr_ypmap_wrap_string +#define xdr_ypmaplist _xdr_ypmaplist +#define xdr_ypowner_wrap_string _xdr_ypowner_wrap_string +#define xdr_yppushresp_xfr _xdr_yppushresp_xfr +#define xdr_ypreq_key _xdr_ypreq_key +#define xdr_ypreq_nokey _xdr_ypreq_nokey +#define xdr_ypreq_xfr _xdr_ypreq_xfr +#define xdr_ypresp_key_val _xdr_ypresp_key_val +#define xdr_ypresp_maplist _xdr_ypresp_maplist +#define xdr_ypresp_master _xdr_ypresp_master +#define xdr_ypresp_order _xdr_ypresp_order +#define xdr_ypresp_val _xdr_ypresp_val +#define xdrmem_create _xdrmem_create +#define xdrrec_create _xdrrec_create +#define xdrrec_endofrecord _xdrrec_endofrecord +#define xdrrec_eof _xdrrec_eof +#define xdrrec_skiprecord _xdrrec_skiprecord +#define xdrstdio_create _xdrstdio_create +#define xprt_register _xprt_register +#define xprt_unregister _xprt_unregister +#define yp_all _yp_all +#define yp_bind _yp_bind +#define yp_first _yp_first +#define yp_get_default_domain _yp_get_default_domain +#define yp_maplist _yp_maplist +#define yp_master _yp_master +#define yp_match _yp_match +#define yp_next _yp_next +#define yp_order _yp_order +#define yp_unbind _yp_unbind +#define yperr_string _yperr_string +#define ypprot_err _ypprot_err +#define dlopen __dlopen +#define dlclose __dlclose +#define dlsym __dlsym +#define dlerror __dlerror +#define dladdr __dladdr +#define fmtcheck __fmtcheck + +/* rpc locks */ +#define authdes_lock __rpc_authdes_lock +#define authnone_lock __rpc_authnone_lock +#define authsvc_lock __rpc_authsvc_lock +#define clnt_fd_lock __rpc_clnt_fd_lock +#define clntraw_lock __rpc_clntraw_lock +#define dname_lock __rpc_dname_lock +#define dupreq_lock __rpc_dupreq_lock +#define keyserv_lock __rpc_keyserv_lock +#define libnsl_trace_lock __rpc_libnsl_trace_lock +#define loopnconf_lock __rpc_loopnconf_lock +#define ops_lock __rpc_ops_lock +#define portnum_lock __rpc_portnum_lock +#define proglst_lock __rpc_proglst_lock +#define rpcbaddr_cache_lock __rpc_rpcbaddr_cache_lock +#define rpcsoc_lock __rpc_rpcsoc_lock +#define svc_fd_lock __rpc_svc_fd_lock +#define svc_lock __rpc_svc_lock +#define svcraw_lock __rpc_svcraw_lock +#define xprtlist_lock __rpc_xprtlist_lock + +#define __learn_tree ___learn_tree +#endif /* __weak_alias */ +#endif /* !__lint__ */ + +#endif /* _NAMESPACE_H_ */ diff --git a/StdLibPrivateInternalFiles/Include/reentrant.h b/StdLibPrivateInternalFiles/Include/reentrant.h new file mode 100644 index 0000000000..157d4b1853 --- /dev/null +++ b/StdLibPrivateInternalFiles/Include/reentrant.h @@ -0,0 +1,268 @@ +/* $NetBSD: reentrant.h,v 1.10 2004/12/14 00:23:19 nathanw Exp $ */ + +/*- + * Copyright (c) 1997, 1998, 2003 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by J.T. Conklin, by Nathan J. Williams, and by Jason R. Thorpe. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Requirements: + * + * 1. The thread safe mechanism should be lightweight so the library can + * be used by non-threaded applications without unreasonable overhead. + * + * 2. There should be no dependency on a thread engine for non-threaded + * applications. + * + * 3. There should be no dependency on any particular thread engine. + * + * 4. The library should be able to be compiled without support for thread + * safety. + * + * + * Rationale: + * + * One approach for thread safety is to provide discrete versions of the + * library: one thread safe, the other not. The disadvantage of this is + * that libc is rather large, and two copies of a library which are 99%+ + * identical is not an efficent use of resources. + * + * Another approach is to provide a single thread safe library. However, + * it should not add significant run time or code size overhead to non- + * threaded applications. + * + * Since the NetBSD C library is used in other projects, it should be + * easy to replace the mutual exclusion primitives with ones provided by + * another system. Similarly, it should also be easy to remove all + * support for thread safety completely if the target environment does + * not support threads. + * + * + * Implementation Details: + * + * The thread primitives used by the library (mutex_t, mutex_lock, etc.) + * are macros which expand to the cooresponding primitives provided by + * the thread engine or to nothing. The latter is used so that code is + * not unreasonably cluttered with #ifdefs when all thread safe support + * is removed. + * + * The thread macros can be directly mapped to the mutex primitives from + * pthreads, however it should be reasonably easy to wrap another mutex + * implementation so it presents a similar interface. + * + * The thread functions operate by dispatching to symbols which are, by + * default, weak-aliased to no-op functions in thread-stub/thread-stub.c + * (some uses of thread operations are conditional on __isthreaded, but + * not all of them are). + * + * When the thread library is linked in, it provides strong-alias versions + * of those symbols which dispatch to its own real thread operations. + * + */ + +#ifdef _REENTRANT + +/* + * Abtract thread interface for thread-safe libraries. These routines + * will use stubs in libc if the application is not linked against the + * pthread library, and the real function in the pthread library if it + * is. + */ + +#include +#include + +#define mutex_t pthread_mutex_t +#define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER + +#define mutexattr_t pthread_mutexattr_t + +#define MUTEX_TYPE_NORMAL PTHREAD_MUTEX_NORMAL +#define MUTEX_TYPE_ERRORCHECK PTHREAD_MUTEX_ERRORCHECK +#define MUTEX_TYPE_RECURSIVE PTHREAD_MUTEX_RECURSIVE + +#define cond_t pthread_cond_t +#define COND_INITIALIZER PTHREAD_COND_INITIALIZER + +#define condattr_t pthread_condattr_t + +#define rwlock_t pthread_rwlock_t +#define RWLOCK_INITIALIZER PTHREAD_RWLOCK_INITIALIZER + +#define rwlockattr_t pthread_rwlockattr_t + +#define thread_key_t pthread_key_t + +#define thr_t pthread_t + +#define thrattr_t pthread_attr_t + +#define once_t pthread_once_t +#define ONCE_INITIALIZER PTHREAD_ONCE_INIT + +#ifndef __LIBC_THREAD_STUBS + +__BEGIN_DECLS +int __libc_mutex_init(mutex_t *, const mutexattr_t *); +int __libc_mutex_lock(mutex_t *); +int __libc_mutex_trylock(mutex_t *); +int __libc_mutex_unlock(mutex_t *); +int __libc_mutex_destroy(mutex_t *); + +int __libc_mutexattr_init(mutexattr_t *); +int __libc_mutexattr_settype(mutexattr_t *, int); +int __libc_mutexattr_destroy(mutexattr_t *); +__END_DECLS + +#define mutex_init(m, a) __libc_mutex_init((m), (a)) +#define mutex_lock(m) __libc_mutex_lock((m)) +#define mutex_trylock(m) __libc_mutex_trylock((m)) +#define mutex_unlock(m) __libc_mutex_unlock((m)) +#define mutex_destroy(m) __libc_mutex_destroy((m)) + +#define mutexattr_init(ma) __libc_mutexattr_init((ma)) +#define mutexattr_settype(ma, t) __libc_mutexattr_settype((ma), (t)) +#define mutexattr_destroy(ma) __libc_mutexattr_destroy((ma)) + +__BEGIN_DECLS +int __libc_cond_init(cond_t *, const condattr_t *); +int __libc_cond_signal(cond_t *); +int __libc_cond_broadcast(cond_t *); +int __libc_cond_wait(cond_t *, mutex_t *); +int __libc_cond_timedwait(cond_t *, mutex_t *, const struct timespec *); +int __libc_cond_destroy(cond_t *); +__END_DECLS + +#define cond_init(c, t, a) __libc_cond_init((c), (a)) +#define cond_signal(c) __libc_cond_signal((c)) +#define cond_broadcast(c) __libc_cond_broadcast((c)) +#define cond_wait(c, m) __libc_cond_wait((c), (m)) +#define cond_timedwait(c, m, t) __libc_cond_timedwait((c), (m), (t)) +#define cond_destroy(c) __libc_cond_destroy((c)) + +__BEGIN_DECLS +int __libc_rwlock_init(rwlock_t *, const rwlockattr_t *); +int __libc_rwlock_rdlock(rwlock_t *); +int __libc_rwlock_wrlock(rwlock_t *); +int __libc_rwlock_tryrdlock(rwlock_t *); +int __libc_rwlock_trywrlock(rwlock_t *); +int __libc_rwlock_unlock(rwlock_t *); +int __libc_rwlock_destroy(rwlock_t *); +__END_DECLS + +#define rwlock_init(l, a) __libc_rwlock_init((l), (a)) +#define rwlock_rdlock(l) __libc_rwlock_rdlock((l)) +#define rwlock_wrlock(l) __libc_rwlock_wrlock((l)) +#define rwlock_tryrdlock(l) __libc_rwlock_tryrdlock((l)) +#define rwlock_trywrlock(l) __libc_rwlock_trywrlock((l)) +#define rwlock_unlock(l) __libc_rwlock_unlock((l)) +#define rwlock_destroy(l) __libc_rwlock_destroy((l)) + +__BEGIN_DECLS +int __libc_thr_keycreate(thread_key_t *, void (*)(void *)); +int __libc_thr_setspecific(thread_key_t, const void *); +void *__libc_thr_getspecific(thread_key_t); +int __libc_thr_keydelete(thread_key_t); +__END_DECLS + +#define thr_keycreate(k, d) __libc_thr_keycreate((k), (d)) +#define thr_setspecific(k, p) __libc_thr_setspecific((k), (p)) +#define thr_getspecific(k) __libc_thr_getspecific((k)) +#define thr_keydelete(k) __libc_thr_keydelete((k)) + +__BEGIN_DECLS +int __libc_thr_once(once_t *, void (*)(void)); +int __libc_thr_sigsetmask(int, const sigset_t *, sigset_t *); +thr_t __libc_thr_self(void); +int __libc_thr_yield(void); +void __libc_thr_create(thr_t *, const thrattr_t *, + void *(*)(void *), void *); +void __libc_thr_exit(void *) __attribute__((__noreturn__)); +int *__libc_thr_errno(void); +int __libc_thr_setcancelstate(int, int *); + +extern int __isthreaded; +__END_DECLS + +#define thr_once(o, f) __libc_thr_once((o), (f)) +#define thr_sigsetmask(f, n, o) __libc_thr_sigsetmask((f), (n), (o)) +#define thr_self() __libc_thr_self() +#define thr_yield() __libc_thr_yield() +#define thr_create(tp, ta, f, a) __libc_thr_create((tp), (ta), (f), (a)) +#define thr_exit(v) __libc_thr_exit((v)) +#define thr_errno() __libc_thr_errno() +#define thr_enabled() (__isthreaded) +#define thr_setcancelstate(n, o) __libc_thr_setcancelstate((n),(o)) +#endif /* __LIBC_THREAD_STUBS */ + +#define FLOCKFILE(fp) __flockfile_internal(fp, 1) +#define FUNLOCKFILE(fp) __funlockfile_internal(fp, 1) + +#else /* _REENTRANT */ + +#define mutex_init(m, a) +#define mutex_lock(m) +#define mutex_trylock(m) +#define mutex_unlock(m) +#define mutex_destroy(m) + +#define cond_init(c, t, a) +#define cond_signal(c) +#define cond_broadcast(c) +#define cond_wait(c, m) +#define cond_timedwait(c, m, t) +#define cond_destroy(c) + +#define rwlock_init(l, a) +#define rwlock_rdlock(l) +#define rwlock_wrlock(l) +#define rwlock_tryrdlock(l) +#define rwlock_trywrlock(l) +#define rwlock_unlock(l) +#define rwlock_destroy(l) + +#define thr_keycreate(k, d) +#define thr_setspecific(k, p) +#define thr_getspecific(k) +#define thr_keydelete(k) + +#define thr_once(o, f) +#define thr_sigsetmask(f, n, o) +#define thr_self() +#define thr_errno() + +#define FLOCKFILE(fp) +#define FUNLOCKFILE(fp) + +#endif /* _REENTRANT */ diff --git a/StdLibPrivateInternalFiles/ReadMe.pdf b/StdLibPrivateInternalFiles/ReadMe.pdf new file mode 100644 index 0000000000..2baca31f68 Binary files /dev/null and b/StdLibPrivateInternalFiles/ReadMe.pdf differ