From 2aa62f2bc9a9654687b377d9ca8a8c2c860a3852 Mon Sep 17 00:00:00 2001 From: darylm503 Date: Wed, 27 Apr 2011 21:42:16 +0000 Subject: [PATCH] Standard Libraries for EDK II. This set of three packages: AppPkg, StdLib, StdLibPrivateInternalFiles; contains the implementation of libraries based upon non-UEFI standards such as ISO/IEC-9899, the library portion of the C Language Standard, POSIX, etc. AppPkg contains applications that make use of the standard libraries defined in the StdLib Package. StdLib contains header (include) files and the implementations of the standard libraries. StdLibPrivateInternalFiles contains files for the exclusive use of the library implementations in StdLib. These files should never be directly referenced from applications or other code. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11600 6f19259b-4bc3-4df7-8a09-765794883524 --- AppPkg/AppPkg.dsc | 157 + AppPkg/Applications/Enquire/Enquire.c | 3377 +++++++++++++++++ AppPkg/Applications/Enquire/Enquire.inf | 53 + AppPkg/Applications/Hello/Hello.c | 37 + AppPkg/Applications/Hello/Hello.inf | 36 + AppPkg/Applications/Main/Main.c | 46 + AppPkg/Applications/Main/Main.inf | 42 + AppPkg/ReadMe.pdf | Bin 0 -> 86664 bytes StdLib/Include/Arm/machine/_math.h | 18 + StdLib/Include/Arm/machine/ansi.h | 106 + StdLib/Include/Arm/machine/asm.h | 167 + StdLib/Include/Arm/machine/atomic.h | 102 + StdLib/Include/Arm/machine/cpufunc.h | 558 +++ StdLib/Include/Arm/machine/float.h | 31 + StdLib/Include/Arm/machine/frame.h | 123 + StdLib/Include/Arm/machine/ieee.h | 13 + StdLib/Include/Arm/machine/lock.h | 89 + StdLib/Include/Arm/machine/math.h | 3 + StdLib/Include/Arm/machine/mcontext.h | 114 + StdLib/Include/Arm/machine/proc.h | 55 + StdLib/Include/Arm/machine/signal.h | 22 + StdLib/Include/Ia32/machine/_math.h | 18 + StdLib/Include/Ia32/machine/ansi.h | 94 + StdLib/Include/Ia32/machine/asm.h | 208 + StdLib/Include/Ia32/machine/bswap.h | 13 + StdLib/Include/Ia32/machine/byte_swap.h | 79 + StdLib/Include/Ia32/machine/endian.h | 3 + StdLib/Include/Ia32/machine/endian_machdep.h | 3 + StdLib/Include/Ia32/machine/float.h | 3 + StdLib/Include/Ia32/machine/ieee.h | 3 + StdLib/Include/Ia32/machine/int_const.h | 63 + StdLib/Include/Ia32/machine/int_limits.h | 141 + StdLib/Include/Ia32/machine/int_mwgwtypes.h | 82 + StdLib/Include/Ia32/machine/int_types.h | 61 + StdLib/Include/Ia32/machine/limits.h | 3 + StdLib/Include/Ia32/machine/math.h | 3 + StdLib/Include/Ia32/machine/param.h | 174 + StdLib/Include/Ia32/machine/signal.h | 22 + StdLib/Include/Ia32/machine/types.h | 81 + StdLib/Include/Ipf/machine/_regset.h | 277 ++ StdLib/Include/Ipf/machine/acpi_func.h | 107 + StdLib/Include/Ipf/machine/acpi_machdep.h | 3 + StdLib/Include/Ipf/machine/acpica_machdep.h | 1 + StdLib/Include/Ipf/machine/ansi.h | 95 + StdLib/Include/Ipf/machine/aout_machdep.h | 36 + StdLib/Include/Ipf/machine/asm.h | 185 + StdLib/Include/Ipf/machine/bootinfo.h | 52 + StdLib/Include/Ipf/machine/bswap.h | 8 + StdLib/Include/Ipf/machine/cdefs.h | 11 + StdLib/Include/Ipf/machine/cpu.h | 180 + StdLib/Include/Ipf/machine/cpu_counter.h | 78 + StdLib/Include/Ipf/machine/db_machdep.h | 202 + StdLib/Include/Ipf/machine/dig64.h | 92 + StdLib/Include/Ipf/machine/disklabel.h | 73 + StdLib/Include/Ipf/machine/efi.h | 165 + StdLib/Include/Ipf/machine/elf_machdep.h | 150 + StdLib/Include/Ipf/machine/endian.h | 3 + StdLib/Include/Ipf/machine/endian_machdep.h | 3 + StdLib/Include/Ipf/machine/float.h | 30 + StdLib/Include/Ipf/machine/ia64_cpu.h | 427 +++ StdLib/Include/Ipf/machine/ieee.h | 2 + StdLib/Include/Ipf/machine/ieeefp.h | 48 + StdLib/Include/Ipf/machine/int_const.h | 64 + StdLib/Include/Ipf/machine/int_fmtio.h | 219 ++ StdLib/Include/Ipf/machine/int_limits.h | 134 + StdLib/Include/Ipf/machine/int_mwgwtypes.h | 83 + StdLib/Include/Ipf/machine/int_types.h | 74 + StdLib/Include/Ipf/machine/intr.h | 60 + StdLib/Include/Ipf/machine/intrcnt.h | 43 + StdLib/Include/Ipf/machine/limits.h | 89 + StdLib/Include/Ipf/machine/loadfile_machdep.h | 97 + StdLib/Include/Ipf/machine/math.h | 6 + StdLib/Include/Ipf/machine/mca_machdep.h | 248 ++ StdLib/Include/Ipf/machine/md_var.h | 95 + StdLib/Include/Ipf/machine/pal.h | 111 + StdLib/Include/Ipf/machine/param.h | 152 + StdLib/Include/Ipf/machine/pcb.h | 78 + StdLib/Include/Ipf/machine/pmap.h | 162 + StdLib/Include/Ipf/machine/pte.h | 110 + StdLib/Include/Ipf/machine/ptrace.h | 40 + StdLib/Include/Ipf/machine/reg.h | 53 + StdLib/Include/Ipf/machine/sal.h | 144 + StdLib/Include/Ipf/machine/setjmp.h | 101 + StdLib/Include/Ipf/machine/signal.h | 22 + StdLib/Include/Ipf/machine/smp.h | 40 + StdLib/Include/Ipf/machine/ssc.h | 18 + StdLib/Include/Ipf/machine/stdarg.h | 61 + StdLib/Include/Ipf/machine/types.h | 64 + StdLib/Include/Ipf/machine/varargs.h | 52 + StdLib/Include/Ipf/machine/vmparam.h | 132 + StdLib/Include/Ipf/machine/wchar_limits.h | 42 + StdLib/Include/X64/machine/ansi.h | 103 + StdLib/Include/X64/machine/asm.h | 146 + StdLib/Include/X64/machine/atomic.h | 95 + StdLib/Include/X64/machine/bswap.h | 13 + StdLib/Include/X64/machine/byte_swap.h | 71 + StdLib/Include/X64/machine/endian.h | 3 + StdLib/Include/X64/machine/endian_machdep.h | 3 + StdLib/Include/X64/machine/float.h | 3 + StdLib/Include/X64/machine/fpu.h | 103 + StdLib/Include/X64/machine/ieee.h | 3 + StdLib/Include/X64/machine/int_const.h | 63 + StdLib/Include/X64/machine/int_fmtio.h | 219 ++ StdLib/Include/X64/machine/int_limits.h | 135 + StdLib/Include/X64/machine/int_mwgwtypes.h | 82 + StdLib/Include/X64/machine/int_types.h | 73 + StdLib/Include/X64/machine/limits.h | 3 + StdLib/Include/X64/machine/math.h | 3 + StdLib/Include/X64/machine/param.h | 122 + StdLib/Include/X64/machine/signal.h | 22 + StdLib/Include/X64/machine/types.h | 78 + StdLib/Include/arpa/inet.h | 105 + StdLib/Include/arpa/nameser.h | 574 +++ StdLib/Include/arpa/nameser_compat.h | 236 ++ StdLib/Include/assert.h | 70 + StdLib/Include/ctype.h | 187 + StdLib/Include/dirent.h | 22 + StdLib/Include/errno.h | 160 + StdLib/Include/fcntl.h | 1 + StdLib/Include/float.h | 1 + StdLib/Include/inttypes.h | 63 + StdLib/Include/iso646.h | 32 + StdLib/Include/langinfo.h | 91 + StdLib/Include/limits.h | 120 + StdLib/Include/locale.h | 87 + StdLib/Include/math.h | 453 +++ StdLib/Include/netinet/in.h | 557 +++ StdLib/Include/netinet6/in6.h | 790 ++++ StdLib/Include/nl_types.h | 98 + StdLib/Include/paths.h | 118 + StdLib/Include/setjmp.h | 62 + StdLib/Include/signal.h | 83 + StdLib/Include/stdarg.h | 121 + StdLib/Include/stdbool.h | 34 + StdLib/Include/stddef.h | 64 + StdLib/Include/stdint.h | 1 + StdLib/Include/stdio.h | 704 ++++ StdLib/Include/stdlib.h | 536 +++ StdLib/Include/string.h | 329 ++ StdLib/Include/sys/EfiCdefs.h | 367 ++ StdLib/Include/sys/EfiSysCall.h | 84 + StdLib/Include/sys/_ctype.h | 66 + StdLib/Include/sys/ansi.h | 63 + StdLib/Include/sys/bswap.h | 77 + StdLib/Include/sys/callout.h | 131 + StdLib/Include/sys/cdefs_aout.h | 136 + StdLib/Include/sys/dirent.h | 90 + StdLib/Include/sys/endian.h | 309 ++ StdLib/Include/sys/errno.h | 151 + StdLib/Include/sys/fcntl.h | 150 + StdLib/Include/sys/fd_set.h | 107 + StdLib/Include/sys/featuretest.h | 73 + StdLib/Include/sys/filio.h | 62 + StdLib/Include/sys/float_ieee754.h | 99 + StdLib/Include/sys/ieee754.h | 152 + StdLib/Include/sys/inttypes.h | 52 + StdLib/Include/sys/ioccom.h | 67 + StdLib/Include/sys/localedef.h | 100 + StdLib/Include/sys/param.h | 321 ++ StdLib/Include/sys/pool.h | 311 ++ StdLib/Include/sys/resource.h | 143 + StdLib/Include/sys/select.h | 51 + StdLib/Include/sys/signal.h | 37 + StdLib/Include/sys/sigtypes.h | 123 + StdLib/Include/sys/socket.h | 570 +++ StdLib/Include/sys/stat.h | 213 ++ StdLib/Include/sys/stdint.h | 107 + StdLib/Include/sys/syslimits.h | 53 + StdLib/Include/sys/termios.h | 304 ++ StdLib/Include/sys/time.h | 183 + StdLib/Include/sys/types.h | 301 ++ StdLib/Include/sys/uio.h | 123 + StdLib/Include/time.h | 311 ++ StdLib/Include/wchar.h | 539 +++ StdLib/Include/wctype.h | 77 + StdLib/Include/x86/float.h | 25 + StdLib/Include/x86/ieee.h | 107 + StdLib/Include/x86/limits.h | 77 + StdLib/Include/x86/math.h | 4 + StdLib/LibC/CRT/Gcc.c | 196 + StdLib/LibC/CRT/Ia32/ashrdi3.S | 66 + StdLib/LibC/CRT/Ia32/lldiv.c | 97 + StdLib/LibC/CRT/Ia32/lldvrm.c | 100 + StdLib/LibC/CRT/Ia32/llmul.c | 79 + StdLib/LibC/CRT/Ia32/llrem.c | 93 + StdLib/LibC/CRT/Ia32/llshl.c | 54 + StdLib/LibC/CRT/Ia32/mulll.S | 77 + StdLib/LibC/CRT/Ia32/shldi3.S | 62 + StdLib/LibC/CRT/Ia32/udivdi3.S | 83 + StdLib/LibC/CRT/Ia32/ulldiv.c | 88 + StdLib/LibC/CRT/Ia32/ulldvrm.c | 100 + StdLib/LibC/CRT/Ia32/ullrem.c | 93 + StdLib/LibC/CRT/Ia32/ullshr.c | 57 + StdLib/LibC/CRT/Ia32/umoddi3.S | 89 + StdLib/LibC/Ctype/CClass.c | 140 + StdLib/LibC/Ctype/CConv.c | 48 + StdLib/LibC/Ctype/Ctype.inf | 50 + StdLib/LibC/Ctype/iCtype.c | 303 ++ StdLib/LibC/LibC.inf | 115 + StdLib/LibC/Locale/Locale.inf | 74 + StdLib/LibC/Locale/__mb_cur_max.c | 39 + StdLib/LibC/Locale/__wctoint.h | 79 + StdLib/LibC/Locale/_def_messages.c | 24 + StdLib/LibC/Locale/_def_monetary.c | 42 + StdLib/LibC/Locale/_def_numeric.c | 23 + StdLib/LibC/Locale/_def_time.c | 42 + StdLib/LibC/Locale/_wcstod.h | 126 + StdLib/LibC/Locale/_wcstol.h | 153 + StdLib/LibC/Locale/_wcstoul.h | 131 + StdLib/LibC/Locale/aliasname.c | 129 + StdLib/LibC/Locale/aliasname_local.h | 29 + StdLib/LibC/Locale/ctypeio.c | 186 + StdLib/LibC/Locale/ctypeio.h | 35 + StdLib/LibC/Locale/iswctype_sb.c | 234 ++ StdLib/LibC/Locale/localeconv.c | 85 + StdLib/LibC/Locale/multibyte_sb.c | 272 ++ StdLib/LibC/Locale/nl_langinfo.c | 125 + StdLib/LibC/Locale/rune.h | 100 + StdLib/LibC/Locale/runetype.h | 221 ++ StdLib/LibC/Locale/setlocale.c | 423 +++ StdLib/LibC/Locale/setlocale1.c | 53 + StdLib/LibC/Locale/setlocale32.c | 46 + StdLib/LibC/Locale/wcscoll.c | 47 + StdLib/LibC/Locale/wcsftime.c | 109 + StdLib/LibC/Locale/wcstod.c | 51 + StdLib/LibC/Locale/wcstof.c | 53 + StdLib/LibC/Locale/wcstoimax.c | 59 + StdLib/LibC/Locale/wcstol.c | 58 + StdLib/LibC/Locale/wcstold.c | 53 + StdLib/LibC/Locale/wcstoll.c | 58 + StdLib/LibC/Locale/wcstoul.c | 58 + StdLib/LibC/Locale/wcstoull.c | 58 + StdLib/LibC/Locale/wcstoumax.c | 59 + StdLib/LibC/Locale/wcsxfrm.c | 66 + StdLib/LibC/Main/Arm/flt_rounds.c | 81 + StdLib/LibC/Main/ByteSwap.c | 72 + StdLib/LibC/Main/HtoNtoH.c | 90 + StdLib/LibC/Main/Ia32/fpu_rmode.S | 22 + StdLib/LibC/Main/Ia32/fpu_rmode.asm | 46 + StdLib/LibC/Main/Ia32/ftol2.obj | Bin 0 -> 2320 bytes StdLib/LibC/Main/Ia32/isinfl.c | 68 + StdLib/LibC/Main/Ia32/isnanl.c | 69 + StdLib/LibC/Main/Ipf/FpuRmode.s | 12 + StdLib/LibC/Main/Ipf/flt_rounds.c | 25 + StdLib/LibC/Main/Main.c | 102 + StdLib/LibC/Main/X64/fpu_rmode.S | 20 + StdLib/LibC/Main/X64/fpu_rmode.asm | 41 + StdLib/LibC/Main/X64/isinfl.c | 63 + StdLib/LibC/Main/X64/isnanl.c | 64 + StdLib/LibC/Main/assert.c | 32 + StdLib/LibC/Main/bswap16.c | 22 + StdLib/LibC/Main/bswap32.c | 25 + StdLib/LibC/Main/bswap64.c | 44 + StdLib/LibC/Main/errno.c | 19 + StdLib/LibC/Main/infinityf_ieee754.c | 20 + StdLib/LibC/Main/isinfd_ieee754.c | 68 + StdLib/LibC/Main/isinff_ieee754.c | 63 + StdLib/LibC/Main/isnand_ieee754.c | 68 + StdLib/LibC/Main/isnanf_ieee754.c | 63 + StdLib/LibC/Main/longjmp.c | 20 + StdLib/LibC/Main/x86flt_rounds.c | 23 + StdLib/LibC/Math/Math.inf | 101 + StdLib/LibC/Math/e_acos.c | 122 + StdLib/LibC/Math/e_asin.c | 120 + StdLib/LibC/Math/e_atan2.c | 128 + StdLib/LibC/Math/e_cosh.c | 91 + StdLib/LibC/Math/e_exp.c | 167 + StdLib/LibC/Math/e_fmod.c | 138 + StdLib/LibC/Math/e_log.c | 155 + StdLib/LibC/Math/e_log10.c | 106 + StdLib/LibC/Math/e_log2.c | 85 + StdLib/LibC/Math/e_pow.c | 323 ++ StdLib/LibC/Math/e_rem_pio2.c | 169 + StdLib/LibC/Math/e_sinh.c | 79 + StdLib/LibC/Math/e_sqrt.c | 464 +++ StdLib/LibC/Math/k_cos.c | 89 + StdLib/LibC/Math/k_rem_pio2.c | 305 ++ StdLib/LibC/Math/k_sin.c | 72 + StdLib/LibC/Math/k_tan.c | 156 + StdLib/LibC/Math/math_private.h | 229 ++ StdLib/LibC/Math/s_atan.c | 120 + StdLib/LibC/Math/s_ceil.c | 74 + StdLib/LibC/Math/s_copysign.c | 35 + StdLib/LibC/Math/s_cos.c | 79 + StdLib/LibC/Math/s_expm1.c | 228 ++ StdLib/LibC/Math/s_fabs.c | 32 + StdLib/LibC/Math/s_finite.c | 32 + StdLib/LibC/Math/s_floor.c | 74 + StdLib/LibC/Math/s_frexp.c | 52 + StdLib/LibC/Math/s_infinity.c | 27 + StdLib/LibC/Math/s_ldexp.c | 29 + StdLib/LibC/Math/s_modf.c | 76 + StdLib/LibC/Math/s_scalbn.c | 60 + StdLib/LibC/Math/s_sin.c | 79 + StdLib/LibC/Math/s_tan.c | 73 + StdLib/LibC/Math/s_tanh.c | 79 + StdLib/LibC/Math/w_acos.c | 40 + StdLib/LibC/Math/w_asin.c | 41 + StdLib/LibC/Math/w_atan2.c | 40 + StdLib/LibC/Math/w_cosh.c | 39 + StdLib/LibC/Math/w_exp.c | 46 + StdLib/LibC/Math/w_fmod.c | 40 + StdLib/LibC/Math/w_log.c | 40 + StdLib/LibC/Math/w_log10.c | 43 + StdLib/LibC/Math/w_log2.c | 43 + StdLib/LibC/Math/w_pow.c | 62 + StdLib/LibC/Math/w_sinh.c | 39 + StdLib/LibC/Math/w_sqrt.c | 39 + StdLib/LibC/NetUtil/NetUtil.inf | 59 + StdLib/LibC/NetUtil/inet_addr.c | 225 ++ StdLib/LibC/NetUtil/inet_lnaof.c | 70 + StdLib/LibC/NetUtil/inet_makeaddr.c | 74 + StdLib/LibC/NetUtil/inet_netof.c | 69 + StdLib/LibC/NetUtil/inet_network.c | 120 + StdLib/LibC/NetUtil/inet_ntoa.c | 69 + StdLib/LibC/NetUtil/inet_ntop.c | 238 ++ StdLib/LibC/Signal/Signal.c | 93 + StdLib/LibC/Signal/Signal.inf | 39 + StdLib/LibC/StdLib/Bsearch.c | 105 + StdLib/LibC/StdLib/Environs.c | 208 + StdLib/LibC/StdLib/Malloc.c | 226 ++ StdLib/LibC/StdLib/NumericInt.c | 398 ++ StdLib/LibC/StdLib/Qsort.c | 205 + StdLib/LibC/StdLib/Rand.c | 67 + StdLib/LibC/StdLib/StdLib.inf | 67 + StdLib/LibC/StdLib/Xabs.c | 36 + StdLib/LibC/StdLib/Xdiv.c | 76 + StdLib/LibC/StdLib/strtoimax.c | 166 + StdLib/LibC/StdLib/strtoumax.c | 139 + StdLib/LibC/Stdio/Stdio.inf | 142 + StdLib/LibC/Stdio/clrerr.c | 63 + StdLib/LibC/Stdio/fclose.c | 83 + StdLib/LibC/Stdio/fdopen.c | 108 + StdLib/LibC/Stdio/feof.c | 67 + StdLib/LibC/Stdio/ferror.c | 67 + StdLib/LibC/Stdio/fflush.c | 115 + StdLib/LibC/Stdio/fgetc.c | 65 + StdLib/LibC/Stdio/fgetln.c | 71 + StdLib/LibC/Stdio/fgetpos.c | 60 + StdLib/LibC/Stdio/fgets.c | 119 + StdLib/LibC/Stdio/fgetstr.c | 169 + StdLib/LibC/Stdio/fgetwc.c | 100 + StdLib/LibC/Stdio/fgetws.c | 92 + StdLib/LibC/Stdio/fileext.h | 66 + StdLib/LibC/Stdio/fileno.c | 71 + StdLib/LibC/Stdio/findfp.c | 211 + StdLib/LibC/Stdio/flags.c | 115 + StdLib/LibC/Stdio/floatio.h | 55 + StdLib/LibC/Stdio/flockfile.c | 192 + StdLib/LibC/Stdio/fopen.c | 109 + StdLib/LibC/Stdio/fparseln.c | 248 ++ StdLib/LibC/Stdio/fprintf.c | 66 + StdLib/LibC/Stdio/fpurge.c | 76 + StdLib/LibC/Stdio/fputc.c | 65 + StdLib/LibC/Stdio/fputs.c | 81 + StdLib/LibC/Stdio/fputwc.c | 100 + StdLib/LibC/Stdio/fputws.c | 65 + StdLib/LibC/Stdio/fread.c | 96 + StdLib/LibC/Stdio/freopen.c | 196 + StdLib/LibC/Stdio/fscanf.c | 66 + StdLib/LibC/Stdio/fseek.c | 74 + StdLib/LibC/Stdio/fseeko.c | 290 ++ StdLib/LibC/Stdio/fsetpos.c | 63 + StdLib/LibC/Stdio/ftell.c | 103 + StdLib/LibC/Stdio/ftello.c | 100 + StdLib/LibC/Stdio/funopen.c | 82 + StdLib/LibC/Stdio/fvwrite.c | 221 ++ StdLib/LibC/Stdio/fvwrite.h | 50 + StdLib/LibC/Stdio/fwalk.c | 70 + StdLib/LibC/Stdio/fwide.c | 72 + StdLib/LibC/Stdio/fwprintf.c | 53 + StdLib/LibC/Stdio/fwrite.c | 89 + StdLib/LibC/Stdio/fwscanf.c | 53 + StdLib/LibC/Stdio/getc.c | 80 + StdLib/LibC/Stdio/getchar.c | 72 + StdLib/LibC/Stdio/gets.c | 80 + StdLib/LibC/Stdio/gettemp.c | 183 + StdLib/LibC/Stdio/getwc.c | 49 + StdLib/LibC/Stdio/getwchar.c | 49 + StdLib/LibC/Stdio/glue.h | 47 + StdLib/LibC/Stdio/local.h | 113 + StdLib/LibC/Stdio/makebuf.c | 132 + StdLib/LibC/Stdio/mkdtemp.c | 69 + StdLib/LibC/Stdio/mkstemp.c | 76 + StdLib/LibC/Stdio/mktemp.c | 71 + StdLib/LibC/Stdio/perror.c | 72 + StdLib/LibC/Stdio/printf.c | 63 + StdLib/LibC/Stdio/putc.c | 80 + StdLib/LibC/Stdio/putchar.c | 75 + StdLib/LibC/Stdio/puts.c | 85 + StdLib/LibC/Stdio/putwc.c | 49 + StdLib/LibC/Stdio/putwchar.c | 49 + StdLib/LibC/Stdio/refill.c | 162 + StdLib/LibC/Stdio/remove.c | 70 + StdLib/LibC/Stdio/rewind.c | 63 + StdLib/LibC/Stdio/rget.c | 70 + StdLib/LibC/Stdio/scanf.c | 64 + StdLib/LibC/Stdio/setbuf.c | 63 + StdLib/LibC/Stdio/setbuffer.c | 72 + StdLib/LibC/Stdio/setvbuf.c | 176 + StdLib/LibC/Stdio/snprintf.c | 93 + StdLib/LibC/Stdio/snprintf_ss.c | 69 + StdLib/LibC/Stdio/sprintf.c | 78 + StdLib/LibC/Stdio/sscanf.c | 89 + StdLib/LibC/Stdio/stdio.c | 117 + StdLib/LibC/Stdio/swprintf.c | 47 + StdLib/LibC/Stdio/swscanf.c | 47 + StdLib/LibC/Stdio/tempnam.c | 102 + StdLib/LibC/Stdio/tmpfile.c | 86 + StdLib/LibC/Stdio/tmpnam.c | 70 + StdLib/LibC/Stdio/ungetc.c | 172 + StdLib/LibC/Stdio/ungetwc.c | 75 + StdLib/LibC/Stdio/vasprintf.c | 79 + StdLib/LibC/Stdio/vfprintf.c | 2 + StdLib/LibC/Stdio/vfscanf.c | 1129 ++++++ StdLib/LibC/Stdio/vfwprintf.c | 2035 ++++++++++ StdLib/LibC/Stdio/vfwscanf.c | 909 +++++ StdLib/LibC/Stdio/vprintf.c | 58 + StdLib/LibC/Stdio/vscanf.c | 60 + StdLib/LibC/Stdio/vsnprintf.c | 89 + StdLib/LibC/Stdio/vsnprintf_ss.c | 494 +++ StdLib/LibC/Stdio/vsprintf.c | 74 + StdLib/LibC/Stdio/vsscanf.c | 83 + StdLib/LibC/Stdio/vswprintf.c | 94 + StdLib/LibC/Stdio/vswscanf.c | 100 + StdLib/LibC/Stdio/vwprintf.c | 41 + StdLib/LibC/Stdio/vwscanf.c | 47 + StdLib/LibC/Stdio/wbuf.c | 99 + StdLib/LibC/Stdio/wcio.h | 72 + StdLib/LibC/Stdio/wprintf.c | 53 + StdLib/LibC/Stdio/wscanf.c | 53 + StdLib/LibC/Stdio/wsetup.c | 99 + StdLib/LibC/String/Comparison.c | 118 + StdLib/LibC/String/Concatenation.c | 83 + StdLib/LibC/String/Copying.c | 141 + StdLib/LibC/String/ErrorList.c | 144 + StdLib/LibC/String/Misc.c | 99 + StdLib/LibC/String/Searching.c | 262 ++ StdLib/LibC/String/String.inf | 62 + StdLib/LibC/Time/Theory.txt | 553 +++ StdLib/LibC/Time/Time.c | 780 ++++ StdLib/LibC/Time/Time.inf | 53 + StdLib/LibC/Time/TimeEfi.c | 48 + StdLib/LibC/Time/TimeVals.h | 117 + StdLib/LibC/Time/ZoneProc.c | 830 ++++ StdLib/LibC/Time/strftime.c | 602 +++ StdLib/LibC/Time/tzfile.h | 168 + StdLib/LibC/Uefi/Console.c | 393 ++ StdLib/LibC/Uefi/SysCalls.c | 1198 ++++++ StdLib/LibC/Uefi/SysEfi.h | 37 + StdLib/LibC/Uefi/Uefi.inf | 49 + StdLib/LibC/Uefi/Xform.c | 173 + StdLib/LibC/Wchar/Comparison.c | 97 + StdLib/LibC/Wchar/Concatenation.c | 48 + StdLib/LibC/Wchar/ConsDecons.c | 64 + StdLib/LibC/Wchar/Copying.c | 80 + StdLib/LibC/Wchar/Searching.c | 268 ++ StdLib/LibC/Wchar/String.c | 43 + StdLib/LibC/Wchar/Wchar.inf | 59 + StdLib/LibC/gdtoa/Ipf/strtold.c | 18 + StdLib/LibC/gdtoa/_strtof.c | 46 + StdLib/LibC/gdtoa/_strtold.c | 47 + StdLib/LibC/gdtoa/atof.c | 22 + StdLib/LibC/gdtoa/dmisc.c | 228 ++ StdLib/LibC/gdtoa/dtoa.c | 821 ++++ StdLib/LibC/gdtoa/gdtoa.c | 814 ++++ StdLib/LibC/gdtoa/gdtoa.h | 159 + StdLib/LibC/gdtoa/gdtoa.inf | 77 + StdLib/LibC/gdtoa/gdtoaimp.h | 661 ++++ StdLib/LibC/gdtoa/gethex.c | 249 ++ StdLib/LibC/gdtoa/gmisc.c | 82 + StdLib/LibC/gdtoa/hd_init.c | 58 + StdLib/LibC/gdtoa/hexnan.c | 134 + StdLib/LibC/gdtoa/ldtoa.c | 113 + StdLib/LibC/gdtoa/misc.c | 909 +++++ StdLib/LibC/gdtoa/smisc.c | 209 + StdLib/LibC/gdtoa/strtod.c | 1022 +++++ StdLib/LibC/gdtoa/strtodg.c | 1075 ++++++ StdLib/LibC/gdtoa/strtof.c | 85 + StdLib/LibC/gdtoa/strtold_px.c | 4 + StdLib/LibC/gdtoa/strtold_subr.c | 45 + StdLib/LibC/gdtoa/strtopx.c | 108 + StdLib/LibC/gdtoa/sum.c | 105 + StdLib/LibC/gdtoa/ulp.c | 73 + StdLib/ReadMe.pdf | Bin 0 -> 86664 bytes StdLib/StdLib.dec | 36 + StdLib/StdLib.dsc | 170 + StdLibPrivateInternalFiles/DoNotUse.dec | 35 + .../Include/Arm/arith.h | 9 + .../Include/Arm/gd_qnan.h | 12 + .../Include/Efi/Console.h | 81 + .../Include/Ia32/arith.h | 3 + .../Include/Ia32/gd_qnan.h | 11 + .../Include/Ipf/arith.h | 6 + .../Include/Ipf/gd_qnan.h | 5 + .../Include/LibConfig.h | 30 + StdLibPrivateInternalFiles/Include/MainData.h | 92 + .../Include/X64/arith.h | 3 + .../Include/X64/gd_qnan.h | 11 + StdLibPrivateInternalFiles/Include/extern.h | 69 + .../Include/namespace.h | 778 ++++ .../Include/reentrant.h | 268 ++ StdLibPrivateInternalFiles/ReadMe.pdf | Bin 0 -> 86664 bytes 503 files changed, 67344 insertions(+) create mode 100644 AppPkg/AppPkg.dsc create mode 100644 AppPkg/Applications/Enquire/Enquire.c create mode 100644 AppPkg/Applications/Enquire/Enquire.inf create mode 100644 AppPkg/Applications/Hello/Hello.c create mode 100644 AppPkg/Applications/Hello/Hello.inf create mode 100644 AppPkg/Applications/Main/Main.c create mode 100644 AppPkg/Applications/Main/Main.inf create mode 100644 AppPkg/ReadMe.pdf create mode 100644 StdLib/Include/Arm/machine/_math.h create mode 100644 StdLib/Include/Arm/machine/ansi.h create mode 100644 StdLib/Include/Arm/machine/asm.h create mode 100644 StdLib/Include/Arm/machine/atomic.h create mode 100644 StdLib/Include/Arm/machine/cpufunc.h create mode 100644 StdLib/Include/Arm/machine/float.h create mode 100644 StdLib/Include/Arm/machine/frame.h create mode 100644 StdLib/Include/Arm/machine/ieee.h create mode 100644 StdLib/Include/Arm/machine/lock.h create mode 100644 StdLib/Include/Arm/machine/math.h create mode 100644 StdLib/Include/Arm/machine/mcontext.h create mode 100644 StdLib/Include/Arm/machine/proc.h create mode 100644 StdLib/Include/Arm/machine/signal.h create mode 100644 StdLib/Include/Ia32/machine/_math.h create mode 100644 StdLib/Include/Ia32/machine/ansi.h create mode 100644 StdLib/Include/Ia32/machine/asm.h create mode 100644 StdLib/Include/Ia32/machine/bswap.h create mode 100644 StdLib/Include/Ia32/machine/byte_swap.h create mode 100644 StdLib/Include/Ia32/machine/endian.h create mode 100644 StdLib/Include/Ia32/machine/endian_machdep.h create mode 100644 StdLib/Include/Ia32/machine/float.h create mode 100644 StdLib/Include/Ia32/machine/ieee.h create mode 100644 StdLib/Include/Ia32/machine/int_const.h create mode 100644 StdLib/Include/Ia32/machine/int_limits.h create mode 100644 StdLib/Include/Ia32/machine/int_mwgwtypes.h create mode 100644 StdLib/Include/Ia32/machine/int_types.h create mode 100644 StdLib/Include/Ia32/machine/limits.h create mode 100644 StdLib/Include/Ia32/machine/math.h create mode 100644 StdLib/Include/Ia32/machine/param.h create mode 100644 StdLib/Include/Ia32/machine/signal.h create mode 100644 StdLib/Include/Ia32/machine/types.h create mode 100644 StdLib/Include/Ipf/machine/_regset.h create mode 100644 StdLib/Include/Ipf/machine/acpi_func.h create mode 100644 StdLib/Include/Ipf/machine/acpi_machdep.h create mode 100644 StdLib/Include/Ipf/machine/acpica_machdep.h create mode 100644 StdLib/Include/Ipf/machine/ansi.h create mode 100644 StdLib/Include/Ipf/machine/aout_machdep.h create mode 100644 StdLib/Include/Ipf/machine/asm.h create mode 100644 StdLib/Include/Ipf/machine/bootinfo.h create mode 100644 StdLib/Include/Ipf/machine/bswap.h create mode 100644 StdLib/Include/Ipf/machine/cdefs.h create mode 100644 StdLib/Include/Ipf/machine/cpu.h create mode 100644 StdLib/Include/Ipf/machine/cpu_counter.h create mode 100644 StdLib/Include/Ipf/machine/db_machdep.h create mode 100644 StdLib/Include/Ipf/machine/dig64.h create mode 100644 StdLib/Include/Ipf/machine/disklabel.h create mode 100644 StdLib/Include/Ipf/machine/efi.h create mode 100644 StdLib/Include/Ipf/machine/elf_machdep.h create mode 100644 StdLib/Include/Ipf/machine/endian.h create mode 100644 StdLib/Include/Ipf/machine/endian_machdep.h create mode 100644 StdLib/Include/Ipf/machine/float.h create mode 100644 StdLib/Include/Ipf/machine/ia64_cpu.h create mode 100644 StdLib/Include/Ipf/machine/ieee.h create mode 100644 StdLib/Include/Ipf/machine/ieeefp.h create mode 100644 StdLib/Include/Ipf/machine/int_const.h create mode 100644 StdLib/Include/Ipf/machine/int_fmtio.h create mode 100644 StdLib/Include/Ipf/machine/int_limits.h create mode 100644 StdLib/Include/Ipf/machine/int_mwgwtypes.h create mode 100644 StdLib/Include/Ipf/machine/int_types.h create mode 100644 StdLib/Include/Ipf/machine/intr.h create mode 100644 StdLib/Include/Ipf/machine/intrcnt.h create mode 100644 StdLib/Include/Ipf/machine/limits.h create mode 100644 StdLib/Include/Ipf/machine/loadfile_machdep.h create mode 100644 StdLib/Include/Ipf/machine/math.h create mode 100644 StdLib/Include/Ipf/machine/mca_machdep.h create mode 100644 StdLib/Include/Ipf/machine/md_var.h create mode 100644 StdLib/Include/Ipf/machine/pal.h create mode 100644 StdLib/Include/Ipf/machine/param.h create mode 100644 StdLib/Include/Ipf/machine/pcb.h create mode 100644 StdLib/Include/Ipf/machine/pmap.h create mode 100644 StdLib/Include/Ipf/machine/pte.h create mode 100644 StdLib/Include/Ipf/machine/ptrace.h create mode 100644 StdLib/Include/Ipf/machine/reg.h create mode 100644 StdLib/Include/Ipf/machine/sal.h create mode 100644 StdLib/Include/Ipf/machine/setjmp.h create mode 100644 StdLib/Include/Ipf/machine/signal.h create mode 100644 StdLib/Include/Ipf/machine/smp.h create mode 100644 StdLib/Include/Ipf/machine/ssc.h create mode 100644 StdLib/Include/Ipf/machine/stdarg.h create mode 100644 StdLib/Include/Ipf/machine/types.h create mode 100644 StdLib/Include/Ipf/machine/varargs.h create mode 100644 StdLib/Include/Ipf/machine/vmparam.h create mode 100644 StdLib/Include/Ipf/machine/wchar_limits.h create mode 100644 StdLib/Include/X64/machine/ansi.h create mode 100644 StdLib/Include/X64/machine/asm.h create mode 100644 StdLib/Include/X64/machine/atomic.h create mode 100644 StdLib/Include/X64/machine/bswap.h create mode 100644 StdLib/Include/X64/machine/byte_swap.h create mode 100644 StdLib/Include/X64/machine/endian.h create mode 100644 StdLib/Include/X64/machine/endian_machdep.h create mode 100644 StdLib/Include/X64/machine/float.h create mode 100644 StdLib/Include/X64/machine/fpu.h create mode 100644 StdLib/Include/X64/machine/ieee.h create mode 100644 StdLib/Include/X64/machine/int_const.h create mode 100644 StdLib/Include/X64/machine/int_fmtio.h create mode 100644 StdLib/Include/X64/machine/int_limits.h create mode 100644 StdLib/Include/X64/machine/int_mwgwtypes.h create mode 100644 StdLib/Include/X64/machine/int_types.h create mode 100644 StdLib/Include/X64/machine/limits.h create mode 100644 StdLib/Include/X64/machine/math.h create mode 100644 StdLib/Include/X64/machine/param.h create mode 100644 StdLib/Include/X64/machine/signal.h create mode 100644 StdLib/Include/X64/machine/types.h create mode 100644 StdLib/Include/arpa/inet.h create mode 100644 StdLib/Include/arpa/nameser.h create mode 100644 StdLib/Include/arpa/nameser_compat.h create mode 100644 StdLib/Include/assert.h create mode 100644 StdLib/Include/ctype.h create mode 100644 StdLib/Include/dirent.h create mode 100644 StdLib/Include/errno.h create mode 100644 StdLib/Include/fcntl.h create mode 100644 StdLib/Include/float.h create mode 100644 StdLib/Include/inttypes.h create mode 100644 StdLib/Include/iso646.h create mode 100644 StdLib/Include/langinfo.h create mode 100644 StdLib/Include/limits.h create mode 100644 StdLib/Include/locale.h create mode 100644 StdLib/Include/math.h create mode 100644 StdLib/Include/netinet/in.h create mode 100644 StdLib/Include/netinet6/in6.h create mode 100644 StdLib/Include/nl_types.h create mode 100644 StdLib/Include/paths.h create mode 100644 StdLib/Include/setjmp.h create mode 100644 StdLib/Include/signal.h create mode 100644 StdLib/Include/stdarg.h create mode 100644 StdLib/Include/stdbool.h create mode 100644 StdLib/Include/stddef.h create mode 100644 StdLib/Include/stdint.h create mode 100644 StdLib/Include/stdio.h create mode 100644 StdLib/Include/stdlib.h create mode 100644 StdLib/Include/string.h create mode 100644 StdLib/Include/sys/EfiCdefs.h create mode 100644 StdLib/Include/sys/EfiSysCall.h create mode 100644 StdLib/Include/sys/_ctype.h create mode 100644 StdLib/Include/sys/ansi.h create mode 100644 StdLib/Include/sys/bswap.h create mode 100644 StdLib/Include/sys/callout.h create mode 100644 StdLib/Include/sys/cdefs_aout.h create mode 100644 StdLib/Include/sys/dirent.h create mode 100644 StdLib/Include/sys/endian.h create mode 100644 StdLib/Include/sys/errno.h create mode 100644 StdLib/Include/sys/fcntl.h create mode 100644 StdLib/Include/sys/fd_set.h create mode 100644 StdLib/Include/sys/featuretest.h create mode 100644 StdLib/Include/sys/filio.h create mode 100644 StdLib/Include/sys/float_ieee754.h create mode 100644 StdLib/Include/sys/ieee754.h create mode 100644 StdLib/Include/sys/inttypes.h create mode 100644 StdLib/Include/sys/ioccom.h create mode 100644 StdLib/Include/sys/localedef.h create mode 100644 StdLib/Include/sys/param.h create mode 100644 StdLib/Include/sys/pool.h create mode 100644 StdLib/Include/sys/resource.h create mode 100644 StdLib/Include/sys/select.h create mode 100644 StdLib/Include/sys/signal.h create mode 100644 StdLib/Include/sys/sigtypes.h create mode 100644 StdLib/Include/sys/socket.h create mode 100644 StdLib/Include/sys/stat.h create mode 100644 StdLib/Include/sys/stdint.h create mode 100644 StdLib/Include/sys/syslimits.h create mode 100644 StdLib/Include/sys/termios.h create mode 100644 StdLib/Include/sys/time.h create mode 100644 StdLib/Include/sys/types.h create mode 100644 StdLib/Include/sys/uio.h create mode 100644 StdLib/Include/time.h create mode 100644 StdLib/Include/wchar.h create mode 100644 StdLib/Include/wctype.h create mode 100644 StdLib/Include/x86/float.h create mode 100644 StdLib/Include/x86/ieee.h create mode 100644 StdLib/Include/x86/limits.h create mode 100644 StdLib/Include/x86/math.h create mode 100644 StdLib/LibC/CRT/Gcc.c create mode 100644 StdLib/LibC/CRT/Ia32/ashrdi3.S create mode 100644 StdLib/LibC/CRT/Ia32/lldiv.c create mode 100644 StdLib/LibC/CRT/Ia32/lldvrm.c create mode 100644 StdLib/LibC/CRT/Ia32/llmul.c create mode 100644 StdLib/LibC/CRT/Ia32/llrem.c create mode 100644 StdLib/LibC/CRT/Ia32/llshl.c create mode 100644 StdLib/LibC/CRT/Ia32/mulll.S create mode 100644 StdLib/LibC/CRT/Ia32/shldi3.S create mode 100644 StdLib/LibC/CRT/Ia32/udivdi3.S create mode 100644 StdLib/LibC/CRT/Ia32/ulldiv.c create mode 100644 StdLib/LibC/CRT/Ia32/ulldvrm.c create mode 100644 StdLib/LibC/CRT/Ia32/ullrem.c create mode 100644 StdLib/LibC/CRT/Ia32/ullshr.c create mode 100644 StdLib/LibC/CRT/Ia32/umoddi3.S create mode 100644 StdLib/LibC/Ctype/CClass.c create mode 100644 StdLib/LibC/Ctype/CConv.c create mode 100644 StdLib/LibC/Ctype/Ctype.inf create mode 100644 StdLib/LibC/Ctype/iCtype.c create mode 100644 StdLib/LibC/LibC.inf create mode 100644 StdLib/LibC/Locale/Locale.inf create mode 100644 StdLib/LibC/Locale/__mb_cur_max.c create mode 100644 StdLib/LibC/Locale/__wctoint.h create mode 100644 StdLib/LibC/Locale/_def_messages.c create mode 100644 StdLib/LibC/Locale/_def_monetary.c create mode 100644 StdLib/LibC/Locale/_def_numeric.c create mode 100644 StdLib/LibC/Locale/_def_time.c create mode 100644 StdLib/LibC/Locale/_wcstod.h create mode 100644 StdLib/LibC/Locale/_wcstol.h create mode 100644 StdLib/LibC/Locale/_wcstoul.h create mode 100644 StdLib/LibC/Locale/aliasname.c create mode 100644 StdLib/LibC/Locale/aliasname_local.h create mode 100644 StdLib/LibC/Locale/ctypeio.c create mode 100644 StdLib/LibC/Locale/ctypeio.h create mode 100644 StdLib/LibC/Locale/iswctype_sb.c create mode 100644 StdLib/LibC/Locale/localeconv.c create mode 100644 StdLib/LibC/Locale/multibyte_sb.c create mode 100644 StdLib/LibC/Locale/nl_langinfo.c create mode 100644 StdLib/LibC/Locale/rune.h create mode 100644 StdLib/LibC/Locale/runetype.h create mode 100644 StdLib/LibC/Locale/setlocale.c create mode 100644 StdLib/LibC/Locale/setlocale1.c create mode 100644 StdLib/LibC/Locale/setlocale32.c create mode 100644 StdLib/LibC/Locale/wcscoll.c create mode 100644 StdLib/LibC/Locale/wcsftime.c create mode 100644 StdLib/LibC/Locale/wcstod.c create mode 100644 StdLib/LibC/Locale/wcstof.c create mode 100644 StdLib/LibC/Locale/wcstoimax.c create mode 100644 StdLib/LibC/Locale/wcstol.c create mode 100644 StdLib/LibC/Locale/wcstold.c create mode 100644 StdLib/LibC/Locale/wcstoll.c create mode 100644 StdLib/LibC/Locale/wcstoul.c create mode 100644 StdLib/LibC/Locale/wcstoull.c create mode 100644 StdLib/LibC/Locale/wcstoumax.c create mode 100644 StdLib/LibC/Locale/wcsxfrm.c create mode 100644 StdLib/LibC/Main/Arm/flt_rounds.c create mode 100644 StdLib/LibC/Main/ByteSwap.c create mode 100644 StdLib/LibC/Main/HtoNtoH.c create mode 100644 StdLib/LibC/Main/Ia32/fpu_rmode.S create mode 100644 StdLib/LibC/Main/Ia32/fpu_rmode.asm create mode 100644 StdLib/LibC/Main/Ia32/ftol2.obj create mode 100644 StdLib/LibC/Main/Ia32/isinfl.c create mode 100644 StdLib/LibC/Main/Ia32/isnanl.c create mode 100644 StdLib/LibC/Main/Ipf/FpuRmode.s create mode 100644 StdLib/LibC/Main/Ipf/flt_rounds.c create mode 100644 StdLib/LibC/Main/Main.c create mode 100644 StdLib/LibC/Main/X64/fpu_rmode.S create mode 100644 StdLib/LibC/Main/X64/fpu_rmode.asm create mode 100644 StdLib/LibC/Main/X64/isinfl.c create mode 100644 StdLib/LibC/Main/X64/isnanl.c create mode 100644 StdLib/LibC/Main/assert.c create mode 100644 StdLib/LibC/Main/bswap16.c create mode 100644 StdLib/LibC/Main/bswap32.c create mode 100644 StdLib/LibC/Main/bswap64.c create mode 100644 StdLib/LibC/Main/errno.c create mode 100644 StdLib/LibC/Main/infinityf_ieee754.c create mode 100644 StdLib/LibC/Main/isinfd_ieee754.c create mode 100644 StdLib/LibC/Main/isinff_ieee754.c create mode 100644 StdLib/LibC/Main/isnand_ieee754.c create mode 100644 StdLib/LibC/Main/isnanf_ieee754.c create mode 100644 StdLib/LibC/Main/longjmp.c create mode 100644 StdLib/LibC/Main/x86flt_rounds.c create mode 100644 StdLib/LibC/Math/Math.inf create mode 100644 StdLib/LibC/Math/e_acos.c create mode 100644 StdLib/LibC/Math/e_asin.c create mode 100644 StdLib/LibC/Math/e_atan2.c create mode 100644 StdLib/LibC/Math/e_cosh.c create mode 100644 StdLib/LibC/Math/e_exp.c create mode 100644 StdLib/LibC/Math/e_fmod.c create mode 100644 StdLib/LibC/Math/e_log.c create mode 100644 StdLib/LibC/Math/e_log10.c create mode 100644 StdLib/LibC/Math/e_log2.c create mode 100644 StdLib/LibC/Math/e_pow.c create mode 100644 StdLib/LibC/Math/e_rem_pio2.c create mode 100644 StdLib/LibC/Math/e_sinh.c create mode 100644 StdLib/LibC/Math/e_sqrt.c create mode 100644 StdLib/LibC/Math/k_cos.c create mode 100644 StdLib/LibC/Math/k_rem_pio2.c create mode 100644 StdLib/LibC/Math/k_sin.c create mode 100644 StdLib/LibC/Math/k_tan.c create mode 100644 StdLib/LibC/Math/math_private.h create mode 100644 StdLib/LibC/Math/s_atan.c create mode 100644 StdLib/LibC/Math/s_ceil.c create mode 100644 StdLib/LibC/Math/s_copysign.c create mode 100644 StdLib/LibC/Math/s_cos.c create mode 100644 StdLib/LibC/Math/s_expm1.c create mode 100644 StdLib/LibC/Math/s_fabs.c create mode 100644 StdLib/LibC/Math/s_finite.c create mode 100644 StdLib/LibC/Math/s_floor.c create mode 100644 StdLib/LibC/Math/s_frexp.c create mode 100644 StdLib/LibC/Math/s_infinity.c create mode 100644 StdLib/LibC/Math/s_ldexp.c create mode 100644 StdLib/LibC/Math/s_modf.c create mode 100644 StdLib/LibC/Math/s_scalbn.c create mode 100644 StdLib/LibC/Math/s_sin.c create mode 100644 StdLib/LibC/Math/s_tan.c create mode 100644 StdLib/LibC/Math/s_tanh.c create mode 100644 StdLib/LibC/Math/w_acos.c create mode 100644 StdLib/LibC/Math/w_asin.c create mode 100644 StdLib/LibC/Math/w_atan2.c create mode 100644 StdLib/LibC/Math/w_cosh.c create mode 100644 StdLib/LibC/Math/w_exp.c create mode 100644 StdLib/LibC/Math/w_fmod.c create mode 100644 StdLib/LibC/Math/w_log.c create mode 100644 StdLib/LibC/Math/w_log10.c create mode 100644 StdLib/LibC/Math/w_log2.c create mode 100644 StdLib/LibC/Math/w_pow.c create mode 100644 StdLib/LibC/Math/w_sinh.c create mode 100644 StdLib/LibC/Math/w_sqrt.c create mode 100644 StdLib/LibC/NetUtil/NetUtil.inf create mode 100644 StdLib/LibC/NetUtil/inet_addr.c create mode 100644 StdLib/LibC/NetUtil/inet_lnaof.c create mode 100644 StdLib/LibC/NetUtil/inet_makeaddr.c create mode 100644 StdLib/LibC/NetUtil/inet_netof.c create mode 100644 StdLib/LibC/NetUtil/inet_network.c create mode 100644 StdLib/LibC/NetUtil/inet_ntoa.c create mode 100644 StdLib/LibC/NetUtil/inet_ntop.c create mode 100644 StdLib/LibC/Signal/Signal.c create mode 100644 StdLib/LibC/Signal/Signal.inf create mode 100644 StdLib/LibC/StdLib/Bsearch.c create mode 100644 StdLib/LibC/StdLib/Environs.c create mode 100644 StdLib/LibC/StdLib/Malloc.c create mode 100644 StdLib/LibC/StdLib/NumericInt.c create mode 100644 StdLib/LibC/StdLib/Qsort.c create mode 100644 StdLib/LibC/StdLib/Rand.c create mode 100644 StdLib/LibC/StdLib/StdLib.inf create mode 100644 StdLib/LibC/StdLib/Xabs.c create mode 100644 StdLib/LibC/StdLib/Xdiv.c create mode 100644 StdLib/LibC/StdLib/strtoimax.c create mode 100644 StdLib/LibC/StdLib/strtoumax.c create mode 100644 StdLib/LibC/Stdio/Stdio.inf create mode 100644 StdLib/LibC/Stdio/clrerr.c create mode 100644 StdLib/LibC/Stdio/fclose.c create mode 100644 StdLib/LibC/Stdio/fdopen.c create mode 100644 StdLib/LibC/Stdio/feof.c create mode 100644 StdLib/LibC/Stdio/ferror.c create mode 100644 StdLib/LibC/Stdio/fflush.c create mode 100644 StdLib/LibC/Stdio/fgetc.c create mode 100644 StdLib/LibC/Stdio/fgetln.c create mode 100644 StdLib/LibC/Stdio/fgetpos.c create mode 100644 StdLib/LibC/Stdio/fgets.c create mode 100644 StdLib/LibC/Stdio/fgetstr.c create mode 100644 StdLib/LibC/Stdio/fgetwc.c create mode 100644 StdLib/LibC/Stdio/fgetws.c create mode 100644 StdLib/LibC/Stdio/fileext.h create mode 100644 StdLib/LibC/Stdio/fileno.c create mode 100644 StdLib/LibC/Stdio/findfp.c create mode 100644 StdLib/LibC/Stdio/flags.c create mode 100644 StdLib/LibC/Stdio/floatio.h create mode 100644 StdLib/LibC/Stdio/flockfile.c create mode 100644 StdLib/LibC/Stdio/fopen.c create mode 100644 StdLib/LibC/Stdio/fparseln.c create mode 100644 StdLib/LibC/Stdio/fprintf.c create mode 100644 StdLib/LibC/Stdio/fpurge.c create mode 100644 StdLib/LibC/Stdio/fputc.c create mode 100644 StdLib/LibC/Stdio/fputs.c create mode 100644 StdLib/LibC/Stdio/fputwc.c create mode 100644 StdLib/LibC/Stdio/fputws.c create mode 100644 StdLib/LibC/Stdio/fread.c create mode 100644 StdLib/LibC/Stdio/freopen.c create mode 100644 StdLib/LibC/Stdio/fscanf.c create mode 100644 StdLib/LibC/Stdio/fseek.c create mode 100644 StdLib/LibC/Stdio/fseeko.c create mode 100644 StdLib/LibC/Stdio/fsetpos.c create mode 100644 StdLib/LibC/Stdio/ftell.c create mode 100644 StdLib/LibC/Stdio/ftello.c create mode 100644 StdLib/LibC/Stdio/funopen.c create mode 100644 StdLib/LibC/Stdio/fvwrite.c create mode 100644 StdLib/LibC/Stdio/fvwrite.h create mode 100644 StdLib/LibC/Stdio/fwalk.c create mode 100644 StdLib/LibC/Stdio/fwide.c create mode 100644 StdLib/LibC/Stdio/fwprintf.c create mode 100644 StdLib/LibC/Stdio/fwrite.c create mode 100644 StdLib/LibC/Stdio/fwscanf.c create mode 100644 StdLib/LibC/Stdio/getc.c create mode 100644 StdLib/LibC/Stdio/getchar.c create mode 100644 StdLib/LibC/Stdio/gets.c create mode 100644 StdLib/LibC/Stdio/gettemp.c create mode 100644 StdLib/LibC/Stdio/getwc.c create mode 100644 StdLib/LibC/Stdio/getwchar.c create mode 100644 StdLib/LibC/Stdio/glue.h create mode 100644 StdLib/LibC/Stdio/local.h create mode 100644 StdLib/LibC/Stdio/makebuf.c create mode 100644 StdLib/LibC/Stdio/mkdtemp.c create mode 100644 StdLib/LibC/Stdio/mkstemp.c create mode 100644 StdLib/LibC/Stdio/mktemp.c create mode 100644 StdLib/LibC/Stdio/perror.c create mode 100644 StdLib/LibC/Stdio/printf.c create mode 100644 StdLib/LibC/Stdio/putc.c create mode 100644 StdLib/LibC/Stdio/putchar.c create mode 100644 StdLib/LibC/Stdio/puts.c create mode 100644 StdLib/LibC/Stdio/putwc.c create mode 100644 StdLib/LibC/Stdio/putwchar.c create mode 100644 StdLib/LibC/Stdio/refill.c create mode 100644 StdLib/LibC/Stdio/remove.c create mode 100644 StdLib/LibC/Stdio/rewind.c create mode 100644 StdLib/LibC/Stdio/rget.c create mode 100644 StdLib/LibC/Stdio/scanf.c create mode 100644 StdLib/LibC/Stdio/setbuf.c create mode 100644 StdLib/LibC/Stdio/setbuffer.c create mode 100644 StdLib/LibC/Stdio/setvbuf.c create mode 100644 StdLib/LibC/Stdio/snprintf.c create mode 100644 StdLib/LibC/Stdio/snprintf_ss.c create mode 100644 StdLib/LibC/Stdio/sprintf.c create mode 100644 StdLib/LibC/Stdio/sscanf.c create mode 100644 StdLib/LibC/Stdio/stdio.c create mode 100644 StdLib/LibC/Stdio/swprintf.c create mode 100644 StdLib/LibC/Stdio/swscanf.c create mode 100644 StdLib/LibC/Stdio/tempnam.c create mode 100644 StdLib/LibC/Stdio/tmpfile.c create mode 100644 StdLib/LibC/Stdio/tmpnam.c create mode 100644 StdLib/LibC/Stdio/ungetc.c create mode 100644 StdLib/LibC/Stdio/ungetwc.c create mode 100644 StdLib/LibC/Stdio/vasprintf.c create mode 100644 StdLib/LibC/Stdio/vfprintf.c create mode 100644 StdLib/LibC/Stdio/vfscanf.c create mode 100644 StdLib/LibC/Stdio/vfwprintf.c create mode 100644 StdLib/LibC/Stdio/vfwscanf.c create mode 100644 StdLib/LibC/Stdio/vprintf.c create mode 100644 StdLib/LibC/Stdio/vscanf.c create mode 100644 StdLib/LibC/Stdio/vsnprintf.c create mode 100644 StdLib/LibC/Stdio/vsnprintf_ss.c create mode 100644 StdLib/LibC/Stdio/vsprintf.c create mode 100644 StdLib/LibC/Stdio/vsscanf.c create mode 100644 StdLib/LibC/Stdio/vswprintf.c create mode 100644 StdLib/LibC/Stdio/vswscanf.c create mode 100644 StdLib/LibC/Stdio/vwprintf.c create mode 100644 StdLib/LibC/Stdio/vwscanf.c create mode 100644 StdLib/LibC/Stdio/wbuf.c create mode 100644 StdLib/LibC/Stdio/wcio.h create mode 100644 StdLib/LibC/Stdio/wprintf.c create mode 100644 StdLib/LibC/Stdio/wscanf.c create mode 100644 StdLib/LibC/Stdio/wsetup.c create mode 100644 StdLib/LibC/String/Comparison.c create mode 100644 StdLib/LibC/String/Concatenation.c create mode 100644 StdLib/LibC/String/Copying.c create mode 100644 StdLib/LibC/String/ErrorList.c create mode 100644 StdLib/LibC/String/Misc.c create mode 100644 StdLib/LibC/String/Searching.c create mode 100644 StdLib/LibC/String/String.inf create mode 100644 StdLib/LibC/Time/Theory.txt create mode 100644 StdLib/LibC/Time/Time.c create mode 100644 StdLib/LibC/Time/Time.inf create mode 100644 StdLib/LibC/Time/TimeEfi.c create mode 100644 StdLib/LibC/Time/TimeVals.h create mode 100644 StdLib/LibC/Time/ZoneProc.c create mode 100644 StdLib/LibC/Time/strftime.c create mode 100644 StdLib/LibC/Time/tzfile.h create mode 100644 StdLib/LibC/Uefi/Console.c create mode 100644 StdLib/LibC/Uefi/SysCalls.c create mode 100644 StdLib/LibC/Uefi/SysEfi.h create mode 100644 StdLib/LibC/Uefi/Uefi.inf create mode 100644 StdLib/LibC/Uefi/Xform.c create mode 100644 StdLib/LibC/Wchar/Comparison.c create mode 100644 StdLib/LibC/Wchar/Concatenation.c create mode 100644 StdLib/LibC/Wchar/ConsDecons.c create mode 100644 StdLib/LibC/Wchar/Copying.c create mode 100644 StdLib/LibC/Wchar/Searching.c create mode 100644 StdLib/LibC/Wchar/String.c create mode 100644 StdLib/LibC/Wchar/Wchar.inf create mode 100644 StdLib/LibC/gdtoa/Ipf/strtold.c create mode 100644 StdLib/LibC/gdtoa/_strtof.c create mode 100644 StdLib/LibC/gdtoa/_strtold.c create mode 100644 StdLib/LibC/gdtoa/atof.c create mode 100644 StdLib/LibC/gdtoa/dmisc.c create mode 100644 StdLib/LibC/gdtoa/dtoa.c create mode 100644 StdLib/LibC/gdtoa/gdtoa.c create mode 100644 StdLib/LibC/gdtoa/gdtoa.h create mode 100644 StdLib/LibC/gdtoa/gdtoa.inf create mode 100644 StdLib/LibC/gdtoa/gdtoaimp.h create mode 100644 StdLib/LibC/gdtoa/gethex.c create mode 100644 StdLib/LibC/gdtoa/gmisc.c create mode 100644 StdLib/LibC/gdtoa/hd_init.c create mode 100644 StdLib/LibC/gdtoa/hexnan.c create mode 100644 StdLib/LibC/gdtoa/ldtoa.c create mode 100644 StdLib/LibC/gdtoa/misc.c create mode 100644 StdLib/LibC/gdtoa/smisc.c create mode 100644 StdLib/LibC/gdtoa/strtod.c create mode 100644 StdLib/LibC/gdtoa/strtodg.c create mode 100644 StdLib/LibC/gdtoa/strtof.c create mode 100644 StdLib/LibC/gdtoa/strtold_px.c create mode 100644 StdLib/LibC/gdtoa/strtold_subr.c create mode 100644 StdLib/LibC/gdtoa/strtopx.c create mode 100644 StdLib/LibC/gdtoa/sum.c create mode 100644 StdLib/LibC/gdtoa/ulp.c create mode 100644 StdLib/ReadMe.pdf create mode 100644 StdLib/StdLib.dec create mode 100644 StdLib/StdLib.dsc create mode 100644 StdLibPrivateInternalFiles/DoNotUse.dec create mode 100644 StdLibPrivateInternalFiles/Include/Arm/arith.h create mode 100644 StdLibPrivateInternalFiles/Include/Arm/gd_qnan.h create mode 100644 StdLibPrivateInternalFiles/Include/Efi/Console.h create mode 100644 StdLibPrivateInternalFiles/Include/Ia32/arith.h create mode 100644 StdLibPrivateInternalFiles/Include/Ia32/gd_qnan.h create mode 100644 StdLibPrivateInternalFiles/Include/Ipf/arith.h create mode 100644 StdLibPrivateInternalFiles/Include/Ipf/gd_qnan.h create mode 100644 StdLibPrivateInternalFiles/Include/LibConfig.h create mode 100644 StdLibPrivateInternalFiles/Include/MainData.h create mode 100644 StdLibPrivateInternalFiles/Include/X64/arith.h create mode 100644 StdLibPrivateInternalFiles/Include/X64/gd_qnan.h create mode 100644 StdLibPrivateInternalFiles/Include/extern.h create mode 100644 StdLibPrivateInternalFiles/Include/namespace.h create mode 100644 StdLibPrivateInternalFiles/Include/reentrant.h create mode 100644 StdLibPrivateInternalFiles/ReadMe.pdf 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 0000000000000000000000000000000000000000..2baca31f682fbb57438c50d3425d1e7b6ec0af87 GIT binary patch literal 86664 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 >^45lZe6yo%e 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 oi)3qHU}g|h5y-$2)Ws! +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 0000000000000000000000000000000000000000..b96f830bc0e61cdc7d8feb1523b5307f3743d7dc GIT binary patch literal 2320 zcmb7_Urbw79LIl`mJV9n3bJKUvQ)jgEwTp3#Hkn=N}Utt7))oZx!kt5?9SWXuDu{A zlZy@NQcaA@j6NA-OmvtS6CcbT3`(+O#)pYMh{>ELyy$oUrWtSb`@8p)HqCh0Nl!n& z^F6=w=brofo!cvU>E}<|pJ?4g)J$#(TiTcg7rw}@&`Lv&;)oKP**Q8xbT zq9e26gcchamIq2+A9{%_%+=s?l_sEzg5APzu;gdJm=!)Hjs5bEIW23?vBFY*sV={` zcBMsL-O}onFU^(u8uLrug--c+GXLjfGQT!y{o*)>@{7w0vkQar_Nx|IO8Zr)$mZaN`H| z9{F}5DsSg{Y0fz-KW6gL4*a_o9-pqGzK%+fN1{gu`=X<9%QTH#G@iATn30GM^z=rQ z;+rFK9HaFFo-qjSrBW{3xW#x5ZXf^)+80gS`-5x2NU1{Py?|xCBdh` zVGwiE39uj3!DHY_@OkiM5Nl8xd=bomFM+2(tVvlAYfuiv++=|mLn9!32(Q70Mz4Tl zAgcWuI1Zi$CqNs7ZRbJ6m3;=B1m6K|{N4knz_Z{R;5l#_{0Mv#{1|)-`~-X({0zh# z_7@=Lu+M|Y=%jWBO5`rIJa)0SpL6NaIfv6CW@VId5*HF_{*EzgTmhr07( zpB~SeIWuX6b{*Xv>Qm7Q9mwUhRLszDa0r^9vk@M_<#rbirJ!gKDNe#D84bZdlG=y7 z^igZoP@K0@n4apPbQjf@7E-grik?%_rls)13~O1XKdm07rm{=M%;}assv+&yhgJG2 zW>$Gs%bM8ddcR@DRYM!oEoXOaRlBPfyJOZ??@qyqIHNkMMseP7VQ#wFC`B8KXWSKk zf)D3kfG!KmPbs{S21h$3EI)k?YqO($DJ(x-fW^}X=sRKg=?W}9vH<-hEI+Nl;@l3< zf5P%pqt|_H0op1oKSf{#9KS=t^3w#Y+Z@dnmY-nYP4aG5S2j~!5R*Ek2AlDb#7m*K zta~@meH-X?6?#|POl87)V&}!vR4gJ!s4JSlC72M9mx2&ru zZUXV$EEHL8a|#6K>*1b!4_bWJ@gw=Dlm&cCxe5&8yN~amvcieXH;t>{J|jipklw4P hqpEJG$aN@g3Uj2F?Dcdm3Fs67y-|+dGzrU@_dnzsr7Qpd literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2baca31f682fbb57438c50d3425d1e7b6ec0af87 GIT binary patch literal 86664 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 >^45lZe6yo%e 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 oi)3qHU}g|h5y-$2)Ws! +# +# 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 0000000000000000000000000000000000000000..2baca31f682fbb57438c50d3425d1e7b6ec0af87 GIT binary patch literal 86664 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 >^45lZe6yo%e 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 oi)3qHU}g|h5y-$2)Ws!