From d3cc489bb0d12ccdec980ce096dc03e5f313e2f7 Mon Sep 17 00:00:00 2001 From: charliesome Date: Thu, 21 Apr 2011 17:31:49 +1000 Subject: [PATCH] stufF --- bochs.bxrc | 2 +- bochslinux.bxrc | 52 + build.sh | 26 +- build/init.bin | Bin 0 -> 20580 bytes build/kernel.sys | Bin 111547 -> 111664 bytes grubscript | 2 +- hdd.img | Bin 0 -> 33546240 bytes kbin/aaa_loader_asm.o | Bin 0 -> 784 bytes kbin/aaa_panic_asm.o | Bin 0 -> 66480 bytes kbin/ata.o | Bin 0 -> 2088 bytes kbin/console.o | Bin 0 -> 3200 bytes kbin/fs_fat.o | Bin 0 -> 6048 bytes kbin/fs_vfs.o | Bin 0 -> 1816 bytes kbin/gdt.o | Bin 0 -> 3116 bytes kbin/helper_asm.o | Bin 0 -> 800 bytes kbin/idt.o | Bin 0 -> 2744 bytes kbin/io.o | Bin 0 -> 638 bytes kbin/isrs_asm.o | Bin 0 -> 12432 bytes kbin/kb.o | Bin 0 -> 3432 bytes kbin/kmalloc.o | Bin 0 -> 2100 bytes kbin/main.o | Bin 0 -> 2464 bytes kbin/paging.o | Bin 0 -> 1820 bytes kbin/panic.o | Bin 0 -> 1304 bytes kbin/part.o | Bin 0 -> 1528 bytes kbin/realmode.o | Bin 0 -> 1164 bytes kbin/realmode_asm.bin | Bin 0 -> 172 bytes kbin/realmode_asm.o | Bin 0 -> 640 bytes kbin/realmode_ata.bin | Bin 0 -> 27 bytes kbin/realmode_ata.o | Bin 0 -> 480 bytes kbin/realmode_int.bin | Bin 0 -> 55 bytes kbin/realmode_int.o | Bin 0 -> 512 bytes kbin/string.o | Bin 0 -> 2772 bytes kbin/syscall.o | Bin 0 -> 2980 bytes kbin/syscall_asm.o | Bin 0 -> 736 bytes kbin/task.o | Bin 0 -> 5748 bytes kbin/task_asm.o | Bin 0 -> 1616 bytes kbin/trap.o | Bin 0 -> 1804 bytes kbin/util.o | Bin 0 -> 792 bytes kinc/syscall.h | 3 +- kinc/task.h | 6 +- kinc/util.h | 4 +- ksrc/ata.c | 38 +- ksrc/helper.asm | 10 +- ksrc/isrs.asm | 6 +- ksrc/loader.asm | 2 +- ksrc/main.c | 5 +- ksrc/panic.asm | 7 +- ksrc/panic.c | 2 +- ksrc/string.c | 2 +- ksrc/syscall.asm | 7 +- ksrc/syscall.c | 87 +- ksrc/task.asm | 20 +- ksrc/task.c | 140 +- ksrc/trap.c | 11 +- ksrc/util.c | 18 +- ubin/init.o | Bin 0 -> 928 bytes uinc/csos.h | 10 +- user/crt.a | Bin 0 -> 4596 bytes user/crt.o | Bin 0 -> 1216 bytes user/crt/crt_asm.o | Bin 0 -> 1360 bytes user/crt/crt_c.o | Bin 0 -> 2104 bytes user/crt/csos.asm | 83 +- user/crt/csos.c | 147 + user/init.c | 21 +- user/lua-5.1.4.tar.gz | Bin 0 -> 216679 bytes user/lua-5.1.4/COPYRIGHT | 34 + user/lua-5.1.4/HISTORY | 183 + user/lua-5.1.4/INSTALL | 99 + user/lua-5.1.4/Makefile | 128 + user/lua-5.1.4/README | 37 + user/lua-5.1.4/doc/amazon.gif | Bin 0 -> 797 bytes user/lua-5.1.4/doc/contents.html | 499 + user/lua-5.1.4/doc/cover.png | Bin 0 -> 3305 bytes user/lua-5.1.4/doc/logo.gif | Bin 0 -> 4232 bytes user/lua-5.1.4/doc/lua.1 | 163 + user/lua-5.1.4/doc/lua.css | 41 + user/lua-5.1.4/doc/lua.html | 172 + user/lua-5.1.4/doc/luac.1 | 136 + user/lua-5.1.4/doc/luac.html | 145 + user/lua-5.1.4/doc/manual.css | 13 + user/lua-5.1.4/doc/manual.html | 8801 +++++++++++++++++ user/lua-5.1.4/doc/readme.html | 40 + user/lua-5.1.4/etc/Makefile | 44 + user/lua-5.1.4/etc/README | 37 + user/lua-5.1.4/etc/all.c | 38 + user/lua-5.1.4/etc/lua.hpp | 9 + user/lua-5.1.4/etc/lua.ico | Bin 0 -> 1078 bytes user/lua-5.1.4/etc/lua.pc | 31 + user/lua-5.1.4/etc/luavs.bat | 28 + user/lua-5.1.4/etc/min.c | 39 + user/lua-5.1.4/etc/noparser.c | 50 + user/lua-5.1.4/etc/strict.lua | 41 + user/lua-5.1.4/src/Makefile | 182 + user/lua-5.1.4/src/lapi.c | 1087 ++ user/lua-5.1.4/src/lapi.h | 16 + user/lua-5.1.4/src/lapi.o | Bin 0 -> 11956 bytes user/lua-5.1.4/src/lauxlib.c | 652 ++ user/lua-5.1.4/src/lauxlib.h | 174 + user/lua-5.1.4/src/lauxlib.o | Bin 0 -> 11400 bytes user/lua-5.1.4/src/lbaselib.c | 653 ++ user/lua-5.1.4/src/lbaselib.o | Bin 0 -> 15840 bytes user/lua-5.1.4/src/lcode.c | 839 ++ user/lua-5.1.4/src/lcode.h | 76 + user/lua-5.1.4/src/lcode.o | Bin 0 -> 11804 bytes user/lua-5.1.4/src/ldblib.c | 397 + user/lua-5.1.4/src/ldblib.o | Bin 0 -> 10524 bytes user/lua-5.1.4/src/ldebug.c | 638 ++ user/lua-5.1.4/src/ldebug.h | 33 + user/lua-5.1.4/src/ldebug.o | Bin 0 -> 8820 bytes user/lua-5.1.4/src/ldo.c | 518 + user/lua-5.1.4/src/ldo.h | 57 + user/lua-5.1.4/src/ldo.o | Bin 0 -> 6924 bytes user/lua-5.1.4/src/ldump.c | 164 + user/lua-5.1.4/src/ldump.o | Bin 0 -> 1992 bytes user/lua-5.1.4/src/lfunc.c | 174 + user/lua-5.1.4/src/lfunc.h | 34 + user/lua-5.1.4/src/lfunc.o | Bin 0 -> 2672 bytes user/lua-5.1.4/src/lgc.c | 711 ++ user/lua-5.1.4/src/lgc.h | 110 + user/lua-5.1.4/src/lgc.o | Bin 0 -> 6620 bytes user/lua-5.1.4/src/liblua.a | Bin 0 -> 217688 bytes user/lua-5.1.4/src/linit.c | 38 + user/lua-5.1.4/src/linit.o | Bin 0 -> 1652 bytes user/lua-5.1.4/src/liolib.c | 553 ++ user/lua-5.1.4/src/liolib.o | Bin 0 -> 11624 bytes user/lua-5.1.4/src/llex.c | 461 + user/lua-5.1.4/src/llex.h | 81 + user/lua-5.1.4/src/llex.o | Bin 0 -> 8288 bytes user/lua-5.1.4/src/llimits.h | 128 + user/lua-5.1.4/src/lmathlib.c | 263 + user/lua-5.1.4/src/lmathlib.o | Bin 0 -> 7128 bytes user/lua-5.1.4/src/lmem.c | 86 + user/lua-5.1.4/src/lmem.h | 49 + user/lua-5.1.4/src/lmem.o | Bin 0 -> 1332 bytes user/lua-5.1.4/src/loadlib.c | 666 ++ user/lua-5.1.4/src/loadlib.o | Bin 0 -> 9908 bytes user/lua-5.1.4/src/lobject.c | 214 + user/lua-5.1.4/src/lobject.h | 381 + user/lua-5.1.4/src/lobject.o | Bin 0 -> 3676 bytes user/lua-5.1.4/src/lopcodes.c | 102 + user/lua-5.1.4/src/lopcodes.h | 268 + user/lua-5.1.4/src/lopcodes.o | Bin 0 -> 1652 bytes user/lua-5.1.4/src/loslib.c | 243 + user/lua-5.1.4/src/loslib.o | Bin 0 -> 6560 bytes user/lua-5.1.4/src/lparser.c | 1339 +++ user/lua-5.1.4/src/lparser.h | 82 + user/lua-5.1.4/src/lparser.o | Bin 0 -> 17440 bytes user/lua-5.1.4/src/lstate.c | 214 + user/lua-5.1.4/src/lstate.h | 169 + user/lua-5.1.4/src/lstate.o | Bin 0 -> 3200 bytes user/lua-5.1.4/src/lstring.c | 111 + user/lua-5.1.4/src/lstring.h | 31 + user/lua-5.1.4/src/lstring.o | Bin 0 -> 1796 bytes user/lua-5.1.4/src/lstrlib.c | 869 ++ user/lua-5.1.4/src/lstrlib.o | Bin 0 -> 16196 bytes user/lua-5.1.4/src/ltable.c | 588 ++ user/lua-5.1.4/src/ltable.h | 40 + user/lua-5.1.4/src/ltable.o | Bin 0 -> 6176 bytes user/lua-5.1.4/src/ltablib.c | 287 + user/lua-5.1.4/src/ltablib.o | Bin 0 -> 6592 bytes user/lua-5.1.4/src/ltm.c | 75 + user/lua-5.1.4/src/ltm.h | 54 + user/lua-5.1.4/src/ltm.o | Bin 0 -> 1988 bytes user/lua-5.1.4/src/lua | Bin 0 -> 158673 bytes user/lua-5.1.4/src/lua.c | 392 + user/lua-5.1.4/src/lua.h | 388 + user/lua-5.1.4/src/lua.o | Bin 0 -> 7840 bytes user/lua-5.1.4/src/luac | Bin 0 -> 105476 bytes user/lua-5.1.4/src/luac.c | 200 + user/lua-5.1.4/src/luac.o | Bin 0 -> 5560 bytes user/lua-5.1.4/src/luaconf.h | 763 ++ user/lua-5.1.4/src/lualib.h | 53 + user/lua-5.1.4/src/lundump.c | 227 + user/lua-5.1.4/src/lundump.h | 36 + user/lua-5.1.4/src/lundump.o | Bin 0 -> 3652 bytes user/lua-5.1.4/src/lvm.c | 763 ++ user/lua-5.1.4/src/lvm.h | 36 + user/lua-5.1.4/src/lvm.o | Bin 0 -> 12628 bytes user/lua-5.1.4/src/lzio.c | 82 + user/lua-5.1.4/src/lzio.h | 67 + user/lua-5.1.4/src/lzio.o | Bin 0 -> 1388 bytes user/lua-5.1.4/src/print.c | 227 + user/lua-5.1.4/src/print.o | Bin 0 -> 6784 bytes user/lua-5.1.4/test/README | 26 + user/lua-5.1.4/test/bisect.lua | 27 + user/lua-5.1.4/test/cf.lua | 16 + user/lua-5.1.4/test/echo.lua | 5 + user/lua-5.1.4/test/env.lua | 7 + user/lua-5.1.4/test/factorial.lua | 32 + user/lua-5.1.4/test/fib.lua | 40 + user/lua-5.1.4/test/fibfor.lua | 13 + user/lua-5.1.4/test/globals.lua | 13 + user/lua-5.1.4/test/hello.lua | 3 + user/lua-5.1.4/test/life.lua | 111 + user/lua-5.1.4/test/luac.lua | 7 + user/lua-5.1.4/test/printf.lua | 7 + user/lua-5.1.4/test/readonly.lua | 12 + user/lua-5.1.4/test/sieve.lua | 29 + user/lua-5.1.4/test/sort.lua | 66 + user/lua-5.1.4/test/table.lua | 12 + user/lua-5.1.4/test/trace-calls.lua | 32 + user/lua-5.1.4/test/trace-globals.lua | 38 + user/lua-5.1.4/test/xd.lua | 14 + user/pdclib.tar.gz | Bin 0 -> 69029 bytes user/pdclib/Makefile | 121 + user/pdclib/Notes.txt | 104 + user/pdclib/Readme.txt | 192 + user/pdclib/functions/_PDCLIB/Xdigits.c | 27 + user/pdclib/functions/_PDCLIB/Xdigits.d | 9 + user/pdclib/functions/_PDCLIB/Xdigits.o | Bin 0 -> 1816 bytes user/pdclib/functions/_PDCLIB/assert.c | 74 + user/pdclib/functions/_PDCLIB/assert.d | 16 + user/pdclib/functions/_PDCLIB/assert.o | Bin 0 -> 3348 bytes user/pdclib/functions/_PDCLIB/atomax.c | 43 + user/pdclib/functions/_PDCLIB/atomax.d | 11 + user/pdclib/functions/_PDCLIB/atomax.o | Bin 0 -> 3452 bytes user/pdclib/functions/_PDCLIB/digits.c | 27 + user/pdclib/functions/_PDCLIB/digits.d | 9 + user/pdclib/functions/_PDCLIB/digits.o | Bin 0 -> 1844 bytes user/pdclib/functions/_PDCLIB/fflush.c | 63 + user/pdclib/functions/_PDCLIB/fflush.d | 18 + user/pdclib/functions/_PDCLIB/fflush.o | Bin 0 -> 3880 bytes user/pdclib/functions/_PDCLIB/filemode.c | 85 + user/pdclib/functions/_PDCLIB/filemode.d | 12 + user/pdclib/functions/_PDCLIB/filemode.o | Bin 0 -> 2824 bytes user/pdclib/functions/_PDCLIB/print.c | 776 ++ user/pdclib/functions/_PDCLIB/print.d | 20 + user/pdclib/functions/_PDCLIB/print.o | Bin 0 -> 12232 bytes user/pdclib/functions/_PDCLIB/seed.c | 20 + user/pdclib/functions/_PDCLIB/seed.d | 2 + user/pdclib/functions/_PDCLIB/seed.o | Bin 0 -> 1496 bytes user/pdclib/functions/_PDCLIB/stdarg.c | 115 + user/pdclib/functions/_PDCLIB/stdarg.d | 18 + user/pdclib/functions/_PDCLIB/stdarg.o | Bin 0 -> 2080 bytes user/pdclib/functions/_PDCLIB/strtox_main.c | 84 + user/pdclib/functions/_PDCLIB/strtox_main.d | 14 + user/pdclib/functions/_PDCLIB/strtox_main.o | Bin 0 -> 3512 bytes user/pdclib/functions/_PDCLIB/strtox_prelim.c | 79 + user/pdclib/functions/_PDCLIB/strtox_prelim.d | 12 + user/pdclib/functions/_PDCLIB/strtox_prelim.o | Bin 0 -> 3204 bytes user/pdclib/functions/stdio/clearerr.c | 58 + user/pdclib/functions/stdio/clearerr.d | 11 + user/pdclib/functions/stdio/clearerr.o | Bin 0 -> 2952 bytes user/pdclib/functions/stdio/fclose.c | 77 + user/pdclib/functions/stdio/fclose.d | 16 + user/pdclib/functions/stdio/fclose.o | Bin 0 -> 3460 bytes user/pdclib/functions/stdio/feof.c | 29 + user/pdclib/functions/stdio/feof.d | 11 + user/pdclib/functions/stdio/feof.o | Bin 0 -> 2924 bytes user/pdclib/functions/stdio/ferror.c | 29 + user/pdclib/functions/stdio/ferror.d | 11 + user/pdclib/functions/stdio/ferror.o | Bin 0 -> 2936 bytes user/pdclib/functions/stdio/fflush.c | 51 + user/pdclib/functions/stdio/fflush.d | 14 + user/pdclib/functions/stdio/fflush.o | Bin 0 -> 3280 bytes user/pdclib/functions/stdio/fgetc.c | 30 + user/pdclib/functions/stdio/fgetc.d | 11 + user/pdclib/functions/stdio/fgetc.o | Bin 0 -> 2924 bytes user/pdclib/functions/stdio/fgetpos.c | 30 + user/pdclib/functions/stdio/fgetpos.d | 11 + user/pdclib/functions/stdio/fgetpos.o | Bin 0 -> 2980 bytes user/pdclib/functions/stdio/fgets.c | 30 + user/pdclib/functions/stdio/fgets.d | 11 + user/pdclib/functions/stdio/fgets.o | Bin 0 -> 2964 bytes user/pdclib/functions/stdio/fopen.c | 82 + user/pdclib/functions/stdio/fopen.d | 15 + user/pdclib/functions/stdio/fopen.o | Bin 0 -> 3676 bytes user/pdclib/functions/stdio/fprintf.c | 250 + user/pdclib/functions/stdio/fprintf.d | 13 + user/pdclib/functions/stdio/fprintf.o | Bin 0 -> 3248 bytes user/pdclib/functions/stdio/fputc.c | 57 + user/pdclib/functions/stdio/fputc.d | 11 + user/pdclib/functions/stdio/fputc.o | Bin 0 -> 3152 bytes user/pdclib/functions/stdio/fputs.c | 65 + user/pdclib/functions/stdio/fputs.d | 11 + user/pdclib/functions/stdio/fputs.o | Bin 0 -> 3256 bytes user/pdclib/functions/stdio/fread.c | 30 + user/pdclib/functions/stdio/fread.d | 13 + user/pdclib/functions/stdio/fread.o | Bin 0 -> 3184 bytes user/pdclib/functions/stdio/freopen.c | 56 + user/pdclib/functions/stdio/freopen.d | 16 + user/pdclib/functions/stdio/freopen.o | Bin 0 -> 3572 bytes user/pdclib/functions/stdio/fscanf.c | 35 + user/pdclib/functions/stdio/fscanf.d | 13 + user/pdclib/functions/stdio/fscanf.o | Bin 0 -> 3284 bytes user/pdclib/functions/stdio/fseek.c | 34 + user/pdclib/functions/stdio/fseek.d | 11 + user/pdclib/functions/stdio/fseek.o | Bin 0 -> 3088 bytes user/pdclib/functions/stdio/fsetpos.c | 34 + user/pdclib/functions/stdio/fsetpos.d | 11 + user/pdclib/functions/stdio/fsetpos.o | Bin 0 -> 3096 bytes user/pdclib/functions/stdio/ftell.c | 30 + user/pdclib/functions/stdio/ftell.d | 11 + user/pdclib/functions/stdio/ftell.o | Bin 0 -> 2924 bytes user/pdclib/functions/stdio/fwrite.c | 35 + user/pdclib/functions/stdio/fwrite.d | 14 + user/pdclib/functions/stdio/fwrite.o | Bin 0 -> 3196 bytes user/pdclib/functions/stdio/gets.c | 30 + user/pdclib/functions/stdio/gets.d | 13 + user/pdclib/functions/stdio/gets.o | Bin 0 -> 3104 bytes user/pdclib/functions/stdio/perror.c | 30 + user/pdclib/functions/stdio/perror.d | 11 + user/pdclib/functions/stdio/perror.o | Bin 0 -> 2328 bytes user/pdclib/functions/stdio/printf.c | 36 + user/pdclib/functions/stdio/printf.d | 13 + user/pdclib/functions/stdio/printf.o | Bin 0 -> 3304 bytes user/pdclib/functions/stdio/puts.c | 30 + user/pdclib/functions/stdio/puts.d | 11 + user/pdclib/functions/stdio/puts.o | Bin 0 -> 2324 bytes user/pdclib/functions/stdio/remove.c | 53 + user/pdclib/functions/stdio/remove.d | 14 + user/pdclib/functions/stdio/remove.o | Bin 0 -> 2444 bytes user/pdclib/functions/stdio/rename.c | 70 + user/pdclib/functions/stdio/rename.d | 14 + user/pdclib/functions/stdio/rename.o | Bin 0 -> 2452 bytes user/pdclib/functions/stdio/rewind.c | 34 + user/pdclib/functions/stdio/rewind.d | 11 + user/pdclib/functions/stdio/rewind.o | Bin 0 -> 3024 bytes user/pdclib/functions/stdio/scanf.c | 32 + user/pdclib/functions/stdio/scanf.d | 13 + user/pdclib/functions/stdio/scanf.o | Bin 0 -> 3264 bytes user/pdclib/functions/stdio/setbuf.c | 64 + user/pdclib/functions/stdio/setbuf.d | 11 + user/pdclib/functions/stdio/setbuf.o | Bin 0 -> 3120 bytes user/pdclib/functions/stdio/setvbuf.c | 126 + user/pdclib/functions/stdio/setvbuf.d | 13 + user/pdclib/functions/stdio/setvbuf.o | Bin 0 -> 3108 bytes user/pdclib/functions/stdio/snprintf.c | 292 + user/pdclib/functions/stdio/snprintf.d | 13 + user/pdclib/functions/stdio/snprintf.o | Bin 0 -> 2808 bytes user/pdclib/functions/stdio/sprintf.c | 245 + user/pdclib/functions/stdio/sprintf.d | 16 + user/pdclib/functions/stdio/sprintf.o | Bin 0 -> 2704 bytes user/pdclib/functions/stdio/sscanf.c | 32 + user/pdclib/functions/stdio/sscanf.d | 13 + user/pdclib/functions/stdio/sscanf.o | Bin 0 -> 2660 bytes user/pdclib/functions/stdio/ungetc.c | 30 + user/pdclib/functions/stdio/ungetc.d | 11 + user/pdclib/functions/stdio/ungetc.o | Bin 0 -> 2960 bytes user/pdclib/functions/stdio/vfprintf.c | 273 + user/pdclib/functions/stdio/vfprintf.d | 16 + user/pdclib/functions/stdio/vfprintf.o | Bin 0 -> 3820 bytes user/pdclib/functions/stdio/vfscanf.c | 31 + user/pdclib/functions/stdio/vfscanf.d | 13 + user/pdclib/functions/stdio/vfscanf.o | Bin 0 -> 3144 bytes user/pdclib/functions/stdio/vprintf.c | 253 + user/pdclib/functions/stdio/vprintf.d | 13 + user/pdclib/functions/stdio/vprintf.o | Bin 0 -> 3224 bytes user/pdclib/functions/stdio/vscanf.c | 30 + user/pdclib/functions/stdio/vscanf.d | 13 + user/pdclib/functions/stdio/vscanf.o | Bin 0 -> 3216 bytes user/pdclib/functions/stdio/vsnprintf.c | 315 + user/pdclib/functions/stdio/vsnprintf.d | 13 + user/pdclib/functions/stdio/vsnprintf.o | Bin 0 -> 3792 bytes user/pdclib/functions/stdio/vsprintf.c | 252 + user/pdclib/functions/stdio/vsprintf.d | 16 + user/pdclib/functions/stdio/vsprintf.o | Bin 0 -> 2728 bytes user/pdclib/functions/stdio/vsscanf.c | 31 + user/pdclib/functions/stdio/vsscanf.d | 13 + user/pdclib/functions/stdio/vsscanf.o | Bin 0 -> 2536 bytes user/pdclib/functions/stdlib/_Exit.c | 36 + user/pdclib/functions/stdlib/_Exit.d | 16 + user/pdclib/functions/stdlib/_Exit.o | Bin 0 -> 2396 bytes user/pdclib/functions/stdlib/abort.c | 41 + user/pdclib/functions/stdlib/abort.d | 11 + user/pdclib/functions/stdlib/abort.o | Bin 0 -> 2388 bytes user/pdclib/functions/stdlib/abs.c | 32 + user/pdclib/functions/stdlib/abs.d | 11 + user/pdclib/functions/stdlib/abs.o | Bin 0 -> 2284 bytes user/pdclib/functions/stdlib/atexit.c | 62 + user/pdclib/functions/stdlib/atexit.d | 11 + user/pdclib/functions/stdlib/atexit.o | Bin 0 -> 2788 bytes user/pdclib/functions/stdlib/atoi.c | 29 + user/pdclib/functions/stdlib/atoi.d | 11 + user/pdclib/functions/stdlib/atoi.o | Bin 0 -> 2416 bytes user/pdclib/functions/stdlib/atol.c | 29 + user/pdclib/functions/stdlib/atol.d | 11 + user/pdclib/functions/stdlib/atol.o | Bin 0 -> 2416 bytes user/pdclib/functions/stdlib/atoll.c | 29 + user/pdclib/functions/stdlib/atoll.d | 11 + user/pdclib/functions/stdlib/atoll.o | Bin 0 -> 2424 bytes user/pdclib/functions/stdlib/bsearch.c | 61 + user/pdclib/functions/stdlib/bsearch.d | 11 + user/pdclib/functions/stdlib/bsearch.o | Bin 0 -> 2860 bytes user/pdclib/functions/stdlib/calloc.c | 49 + user/pdclib/functions/stdlib/calloc.d | 13 + user/pdclib/functions/stdlib/calloc.o | Bin 0 -> 2684 bytes user/pdclib/functions/stdlib/div.c | 45 + user/pdclib/functions/stdlib/div.d | 11 + user/pdclib/functions/stdlib/div.o | Bin 0 -> 2608 bytes user/pdclib/functions/stdlib/exit.c | 45 + user/pdclib/functions/stdlib/exit.d | 11 + user/pdclib/functions/stdlib/exit.o | Bin 0 -> 2884 bytes user/pdclib/functions/stdlib/free.c | 49 + user/pdclib/functions/stdlib/free.d | 11 + user/pdclib/functions/stdlib/free.o | Bin 0 -> 2836 bytes user/pdclib/functions/stdlib/labs.c | 32 + user/pdclib/functions/stdlib/labs.d | 11 + user/pdclib/functions/stdlib/labs.o | Bin 0 -> 2304 bytes user/pdclib/functions/stdlib/ldiv.c | 45 + user/pdclib/functions/stdlib/ldiv.d | 11 + user/pdclib/functions/stdlib/ldiv.o | Bin 0 -> 2628 bytes user/pdclib/functions/stdlib/llabs.c | 32 + user/pdclib/functions/stdlib/llabs.d | 11 + user/pdclib/functions/stdlib/llabs.o | Bin 0 -> 2344 bytes user/pdclib/functions/stdlib/lldiv.c | 47 + user/pdclib/functions/stdlib/lldiv.d | 11 + user/pdclib/functions/stdlib/lldiv.o | Bin 0 -> 1452 bytes user/pdclib/functions/stdlib/malloc.c | 246 + user/pdclib/functions/stdlib/malloc.d | 16 + user/pdclib/functions/stdlib/malloc.o | Bin 0 -> 3952 bytes user/pdclib/functions/stdlib/qsort.c | 163 + user/pdclib/functions/stdlib/qsort.d | 11 + user/pdclib/functions/stdlib/qsort.o | Bin 0 -> 3960 bytes user/pdclib/functions/stdlib/rand.c | 35 + user/pdclib/functions/stdlib/rand.d | 11 + user/pdclib/functions/stdlib/rand.o | Bin 0 -> 2500 bytes user/pdclib/functions/stdlib/realloc.c | 58 + user/pdclib/functions/stdlib/realloc.d | 16 + user/pdclib/functions/stdlib/realloc.o | Bin 0 -> 3016 bytes user/pdclib/functions/stdlib/srand.c | 29 + user/pdclib/functions/stdlib/srand.d | 11 + user/pdclib/functions/stdlib/srand.o | Bin 0 -> 2504 bytes user/pdclib/functions/stdlib/strtol.c | 122 + user/pdclib/functions/stdlib/strtol.d | 16 + user/pdclib/functions/stdlib/strtol.o | Bin 0 -> 2988 bytes user/pdclib/functions/stdlib/strtoll.c | 122 + user/pdclib/functions/stdlib/strtoll.d | 16 + user/pdclib/functions/stdlib/strtoll.o | Bin 0 -> 3172 bytes user/pdclib/functions/stdlib/strtoul.c | 72 + user/pdclib/functions/stdlib/strtoul.d | 16 + user/pdclib/functions/stdlib/strtoul.o | Bin 0 -> 2904 bytes user/pdclib/functions/stdlib/strtoull.c | 72 + user/pdclib/functions/stdlib/strtoull.d | 16 + user/pdclib/functions/stdlib/strtoull.o | Bin 0 -> 2996 bytes user/pdclib/functions/string/memchr.c | 42 + user/pdclib/functions/string/memchr.d | 11 + user/pdclib/functions/string/memchr.o | Bin 0 -> 2592 bytes user/pdclib/functions/string/memcmp.c | 43 + user/pdclib/functions/string/memcmp.d | 11 + user/pdclib/functions/string/memcmp.o | Bin 0 -> 2636 bytes user/pdclib/functions/string/memcpy.c | 40 + user/pdclib/functions/string/memcpy.d | 11 + user/pdclib/functions/string/memcpy.o | Bin 0 -> 2644 bytes user/pdclib/functions/string/memmove.c | 52 + user/pdclib/functions/string/memmove.d | 11 + user/pdclib/functions/string/memmove.o | Bin 0 -> 2716 bytes user/pdclib/functions/string/memset.c | 40 + user/pdclib/functions/string/memset.d | 11 + user/pdclib/functions/string/memset.o | Bin 0 -> 2552 bytes user/pdclib/functions/string/strcat.c | 46 + user/pdclib/functions/string/strcat.d | 11 + user/pdclib/functions/string/strcat.o | Bin 0 -> 2456 bytes user/pdclib/functions/string/strchr.c | 40 + user/pdclib/functions/string/strchr.d | 11 + user/pdclib/functions/string/strchr.o | Bin 0 -> 2396 bytes user/pdclib/functions/string/strcmp.c | 39 + user/pdclib/functions/string/strcmp.d | 11 + user/pdclib/functions/string/strcmp.o | Bin 0 -> 2416 bytes user/pdclib/functions/string/strcoll.c | 35 + user/pdclib/functions/string/strcoll.d | 11 + user/pdclib/functions/string/strcoll.o | Bin 0 -> 2452 bytes user/pdclib/functions/string/strcpy.c | 37 + user/pdclib/functions/string/strcpy.d | 11 + user/pdclib/functions/string/strcpy.o | Bin 0 -> 2432 bytes user/pdclib/functions/string/strcspn.c | 50 + user/pdclib/functions/string/strcspn.d | 11 + user/pdclib/functions/string/strcspn.o | Bin 0 -> 2620 bytes user/pdclib/functions/string/strlen.c | 34 + user/pdclib/functions/string/strlen.d | 11 + user/pdclib/functions/string/strlen.o | Bin 0 -> 2524 bytes user/pdclib/functions/string/strncat.c | 60 + user/pdclib/functions/string/strncat.d | 11 + user/pdclib/functions/string/strncat.o | Bin 0 -> 2620 bytes user/pdclib/functions/string/strncmp.c | 52 + user/pdclib/functions/string/strncmp.d | 11 + user/pdclib/functions/string/strncmp.o | Bin 0 -> 2580 bytes user/pdclib/functions/string/strncpy.c | 63 + user/pdclib/functions/string/strncpy.d | 13 + user/pdclib/functions/string/strncpy.o | Bin 0 -> 2620 bytes user/pdclib/functions/string/strpbrk.c | 49 + user/pdclib/functions/string/strpbrk.d | 11 + user/pdclib/functions/string/strpbrk.o | Bin 0 -> 2492 bytes user/pdclib/functions/string/strrchr.c | 41 + user/pdclib/functions/string/strrchr.d | 11 + user/pdclib/functions/string/strrchr.o | Bin 0 -> 2596 bytes user/pdclib/functions/string/strspn.c | 49 + user/pdclib/functions/string/strspn.d | 11 + user/pdclib/functions/string/strspn.o | Bin 0 -> 2632 bytes user/pdclib/functions/string/strstr.c | 51 + user/pdclib/functions/string/strstr.d | 11 + user/pdclib/functions/string/strstr.o | Bin 0 -> 2504 bytes user/pdclib/functions/string/strtok.c | 96 + user/pdclib/functions/string/strtok.d | 11 + user/pdclib/functions/string/strtok.o | Bin 0 -> 2880 bytes user/pdclib/functions/string/strxfrm.c | 48 + user/pdclib/functions/string/strxfrm.d | 11 + user/pdclib/functions/string/strxfrm.o | Bin 0 -> 2684 bytes user/pdclib/includes/assert.h | 49 + user/pdclib/includes/iso646.h | 25 + user/pdclib/includes/limits.h | 41 + user/pdclib/includes/stdarg.h | 25 + user/pdclib/includes/stdbool.h | 18 + user/pdclib/includes/stddef.h | 39 + user/pdclib/includes/stdint.h | 213 + user/pdclib/includes/stdio.h | 796 ++ user/pdclib/includes/stdlib.h | 244 + user/pdclib/includes/string.h | 191 + user/pdclib/internals/_PDCLIB_aux.h | 66 + user/pdclib/internals/_PDCLIB_config.h | 283 + user/pdclib/internals/_PDCLIB_glue.h | 71 + user/pdclib/internals/_PDCLIB_int.h | 357 + user/pdclib/internals/_PDCLIB_test.h | 24 + user/pdclib/pdclib.a | Bin 0 -> 290752 bytes user/pdclib/platform/_example/Readme.txt | 24 + .../_example/functions/_PDCLIB/_Exit.c | 39 + .../_example/functions/_PDCLIB/allocpages.c | 53 + .../_example/functions/_PDCLIB/close.c | 39 + .../functions/_PDCLIB/isinteractive.c | 38 + .../_example/functions/_PDCLIB/open.c | 134 + .../_example/functions/_PDCLIB/read.c | 32 + .../_example/functions/_PDCLIB/remove.c | 65 + .../_example/functions/_PDCLIB/rename.c | 74 + .../_example/functions/_PDCLIB/stdinit.c | 48 + .../_example/functions/_PDCLIB/write.c | 75 + .../_example/functions/stdio/tmpfile.c | 29 + .../_example/functions/stdio/tmpnam.c | 31 + .../_example/functions/stdlib/getenv.c | 46 + .../_example/functions/stdlib/system.c | 51 + .../pdclib/platform/_example/includes/float.h | 80 + .../_example/internals/_PDCLIB_config.h | 283 + .../platform/csos/functions/_PDCLIB/_Exit.c | 39 + .../csos/functions/_PDCLIB/allocpages.c | 53 + .../platform/csos/functions/_PDCLIB/close.c | 39 + .../csos/functions/_PDCLIB/isinteractive.c | 38 + .../platform/csos/functions/_PDCLIB/open.c | 134 + .../platform/csos/functions/_PDCLIB/read.c | 32 + .../platform/csos/functions/_PDCLIB/remove.c | 65 + .../platform/csos/functions/_PDCLIB/rename.c | 74 + .../platform/csos/functions/_PDCLIB/stdinit.c | 48 + .../platform/csos/functions/_PDCLIB/write.c | 75 + .../platform/csos/functions/stdio/tmpfile.c | 29 + .../platform/csos/functions/stdio/tmpnam.c | 31 + .../platform/csos/functions/stdlib/getenv.c | 46 + .../platform/csos/functions/stdlib/system.c | 51 + user/pdclib/platform/csos/includes/float.h | 80 + .../platform/csos/internals/_PDCLIB_config.h | 283 + user_linker.ld | 4 +- util/bin2nasm | Bin 4765 -> 7183 bytes util/inject_symbols | Bin 6267 -> 7649 bytes util/inject_symbols.c | 4 +- 551 files changed, 42640 insertions(+), 163 deletions(-) create mode 100644 bochslinux.bxrc create mode 100755 build/init.bin create mode 100644 hdd.img create mode 100644 kbin/aaa_loader_asm.o create mode 100644 kbin/aaa_panic_asm.o create mode 100644 kbin/ata.o create mode 100644 kbin/console.o create mode 100644 kbin/fs_fat.o create mode 100644 kbin/fs_vfs.o create mode 100644 kbin/gdt.o create mode 100644 kbin/helper_asm.o create mode 100644 kbin/idt.o create mode 100644 kbin/io.o create mode 100644 kbin/isrs_asm.o create mode 100644 kbin/kb.o create mode 100644 kbin/kmalloc.o create mode 100644 kbin/main.o create mode 100644 kbin/paging.o create mode 100644 kbin/panic.o create mode 100644 kbin/part.o create mode 100644 kbin/realmode.o create mode 100644 kbin/realmode_asm.bin create mode 100644 kbin/realmode_asm.o create mode 100644 kbin/realmode_ata.bin create mode 100644 kbin/realmode_ata.o create mode 100644 kbin/realmode_int.bin create mode 100644 kbin/realmode_int.o create mode 100644 kbin/string.o create mode 100644 kbin/syscall.o create mode 100644 kbin/syscall_asm.o create mode 100644 kbin/task.o create mode 100644 kbin/task_asm.o create mode 100644 kbin/trap.o create mode 100644 kbin/util.o create mode 100644 ubin/init.o create mode 100644 user/crt.a create mode 100644 user/crt.o create mode 100644 user/crt/crt_asm.o create mode 100644 user/crt/crt_c.o create mode 100644 user/crt/csos.c create mode 100644 user/lua-5.1.4.tar.gz create mode 100644 user/lua-5.1.4/COPYRIGHT create mode 100644 user/lua-5.1.4/HISTORY create mode 100644 user/lua-5.1.4/INSTALL create mode 100644 user/lua-5.1.4/Makefile create mode 100644 user/lua-5.1.4/README create mode 100644 user/lua-5.1.4/doc/amazon.gif create mode 100644 user/lua-5.1.4/doc/contents.html create mode 100644 user/lua-5.1.4/doc/cover.png create mode 100644 user/lua-5.1.4/doc/logo.gif create mode 100644 user/lua-5.1.4/doc/lua.1 create mode 100644 user/lua-5.1.4/doc/lua.css create mode 100644 user/lua-5.1.4/doc/lua.html create mode 100644 user/lua-5.1.4/doc/luac.1 create mode 100644 user/lua-5.1.4/doc/luac.html create mode 100644 user/lua-5.1.4/doc/manual.css create mode 100644 user/lua-5.1.4/doc/manual.html create mode 100644 user/lua-5.1.4/doc/readme.html create mode 100644 user/lua-5.1.4/etc/Makefile create mode 100644 user/lua-5.1.4/etc/README create mode 100644 user/lua-5.1.4/etc/all.c create mode 100644 user/lua-5.1.4/etc/lua.hpp create mode 100644 user/lua-5.1.4/etc/lua.ico create mode 100644 user/lua-5.1.4/etc/lua.pc create mode 100644 user/lua-5.1.4/etc/luavs.bat create mode 100644 user/lua-5.1.4/etc/min.c create mode 100644 user/lua-5.1.4/etc/noparser.c create mode 100644 user/lua-5.1.4/etc/strict.lua create mode 100644 user/lua-5.1.4/src/Makefile create mode 100644 user/lua-5.1.4/src/lapi.c create mode 100644 user/lua-5.1.4/src/lapi.h create mode 100644 user/lua-5.1.4/src/lapi.o create mode 100644 user/lua-5.1.4/src/lauxlib.c create mode 100644 user/lua-5.1.4/src/lauxlib.h create mode 100644 user/lua-5.1.4/src/lauxlib.o create mode 100644 user/lua-5.1.4/src/lbaselib.c create mode 100644 user/lua-5.1.4/src/lbaselib.o create mode 100644 user/lua-5.1.4/src/lcode.c create mode 100644 user/lua-5.1.4/src/lcode.h create mode 100644 user/lua-5.1.4/src/lcode.o create mode 100644 user/lua-5.1.4/src/ldblib.c create mode 100644 user/lua-5.1.4/src/ldblib.o create mode 100644 user/lua-5.1.4/src/ldebug.c create mode 100644 user/lua-5.1.4/src/ldebug.h create mode 100644 user/lua-5.1.4/src/ldebug.o create mode 100644 user/lua-5.1.4/src/ldo.c create mode 100644 user/lua-5.1.4/src/ldo.h create mode 100644 user/lua-5.1.4/src/ldo.o create mode 100644 user/lua-5.1.4/src/ldump.c create mode 100644 user/lua-5.1.4/src/ldump.o create mode 100644 user/lua-5.1.4/src/lfunc.c create mode 100644 user/lua-5.1.4/src/lfunc.h create mode 100644 user/lua-5.1.4/src/lfunc.o create mode 100644 user/lua-5.1.4/src/lgc.c create mode 100644 user/lua-5.1.4/src/lgc.h create mode 100644 user/lua-5.1.4/src/lgc.o create mode 100644 user/lua-5.1.4/src/liblua.a create mode 100644 user/lua-5.1.4/src/linit.c create mode 100644 user/lua-5.1.4/src/linit.o create mode 100644 user/lua-5.1.4/src/liolib.c create mode 100644 user/lua-5.1.4/src/liolib.o create mode 100644 user/lua-5.1.4/src/llex.c create mode 100644 user/lua-5.1.4/src/llex.h create mode 100644 user/lua-5.1.4/src/llex.o create mode 100644 user/lua-5.1.4/src/llimits.h create mode 100644 user/lua-5.1.4/src/lmathlib.c create mode 100644 user/lua-5.1.4/src/lmathlib.o create mode 100644 user/lua-5.1.4/src/lmem.c create mode 100644 user/lua-5.1.4/src/lmem.h create mode 100644 user/lua-5.1.4/src/lmem.o create mode 100644 user/lua-5.1.4/src/loadlib.c create mode 100644 user/lua-5.1.4/src/loadlib.o create mode 100644 user/lua-5.1.4/src/lobject.c create mode 100644 user/lua-5.1.4/src/lobject.h create mode 100644 user/lua-5.1.4/src/lobject.o create mode 100644 user/lua-5.1.4/src/lopcodes.c create mode 100644 user/lua-5.1.4/src/lopcodes.h create mode 100644 user/lua-5.1.4/src/lopcodes.o create mode 100644 user/lua-5.1.4/src/loslib.c create mode 100644 user/lua-5.1.4/src/loslib.o create mode 100644 user/lua-5.1.4/src/lparser.c create mode 100644 user/lua-5.1.4/src/lparser.h create mode 100644 user/lua-5.1.4/src/lparser.o create mode 100644 user/lua-5.1.4/src/lstate.c create mode 100644 user/lua-5.1.4/src/lstate.h create mode 100644 user/lua-5.1.4/src/lstate.o create mode 100644 user/lua-5.1.4/src/lstring.c create mode 100644 user/lua-5.1.4/src/lstring.h create mode 100644 user/lua-5.1.4/src/lstring.o create mode 100644 user/lua-5.1.4/src/lstrlib.c create mode 100644 user/lua-5.1.4/src/lstrlib.o create mode 100644 user/lua-5.1.4/src/ltable.c create mode 100644 user/lua-5.1.4/src/ltable.h create mode 100644 user/lua-5.1.4/src/ltable.o create mode 100644 user/lua-5.1.4/src/ltablib.c create mode 100644 user/lua-5.1.4/src/ltablib.o create mode 100644 user/lua-5.1.4/src/ltm.c create mode 100644 user/lua-5.1.4/src/ltm.h create mode 100644 user/lua-5.1.4/src/ltm.o create mode 100755 user/lua-5.1.4/src/lua create mode 100644 user/lua-5.1.4/src/lua.c create mode 100644 user/lua-5.1.4/src/lua.h create mode 100644 user/lua-5.1.4/src/lua.o create mode 100755 user/lua-5.1.4/src/luac create mode 100644 user/lua-5.1.4/src/luac.c create mode 100644 user/lua-5.1.4/src/luac.o create mode 100644 user/lua-5.1.4/src/luaconf.h create mode 100644 user/lua-5.1.4/src/lualib.h create mode 100644 user/lua-5.1.4/src/lundump.c create mode 100644 user/lua-5.1.4/src/lundump.h create mode 100644 user/lua-5.1.4/src/lundump.o create mode 100644 user/lua-5.1.4/src/lvm.c create mode 100644 user/lua-5.1.4/src/lvm.h create mode 100644 user/lua-5.1.4/src/lvm.o create mode 100644 user/lua-5.1.4/src/lzio.c create mode 100644 user/lua-5.1.4/src/lzio.h create mode 100644 user/lua-5.1.4/src/lzio.o create mode 100644 user/lua-5.1.4/src/print.c create mode 100644 user/lua-5.1.4/src/print.o create mode 100644 user/lua-5.1.4/test/README create mode 100644 user/lua-5.1.4/test/bisect.lua create mode 100644 user/lua-5.1.4/test/cf.lua create mode 100644 user/lua-5.1.4/test/echo.lua create mode 100644 user/lua-5.1.4/test/env.lua create mode 100644 user/lua-5.1.4/test/factorial.lua create mode 100644 user/lua-5.1.4/test/fib.lua create mode 100644 user/lua-5.1.4/test/fibfor.lua create mode 100644 user/lua-5.1.4/test/globals.lua create mode 100644 user/lua-5.1.4/test/hello.lua create mode 100644 user/lua-5.1.4/test/life.lua create mode 100644 user/lua-5.1.4/test/luac.lua create mode 100644 user/lua-5.1.4/test/printf.lua create mode 100644 user/lua-5.1.4/test/readonly.lua create mode 100644 user/lua-5.1.4/test/sieve.lua create mode 100644 user/lua-5.1.4/test/sort.lua create mode 100644 user/lua-5.1.4/test/table.lua create mode 100644 user/lua-5.1.4/test/trace-calls.lua create mode 100644 user/lua-5.1.4/test/trace-globals.lua create mode 100644 user/lua-5.1.4/test/xd.lua create mode 100644 user/pdclib.tar.gz create mode 100644 user/pdclib/Makefile create mode 100644 user/pdclib/Notes.txt create mode 100644 user/pdclib/Readme.txt create mode 100644 user/pdclib/functions/_PDCLIB/Xdigits.c create mode 100644 user/pdclib/functions/_PDCLIB/Xdigits.d create mode 100644 user/pdclib/functions/_PDCLIB/Xdigits.o create mode 100644 user/pdclib/functions/_PDCLIB/assert.c create mode 100644 user/pdclib/functions/_PDCLIB/assert.d create mode 100644 user/pdclib/functions/_PDCLIB/assert.o create mode 100644 user/pdclib/functions/_PDCLIB/atomax.c create mode 100644 user/pdclib/functions/_PDCLIB/atomax.d create mode 100644 user/pdclib/functions/_PDCLIB/atomax.o create mode 100644 user/pdclib/functions/_PDCLIB/digits.c create mode 100644 user/pdclib/functions/_PDCLIB/digits.d create mode 100644 user/pdclib/functions/_PDCLIB/digits.o create mode 100644 user/pdclib/functions/_PDCLIB/fflush.c create mode 100644 user/pdclib/functions/_PDCLIB/fflush.d create mode 100644 user/pdclib/functions/_PDCLIB/fflush.o create mode 100644 user/pdclib/functions/_PDCLIB/filemode.c create mode 100644 user/pdclib/functions/_PDCLIB/filemode.d create mode 100644 user/pdclib/functions/_PDCLIB/filemode.o create mode 100644 user/pdclib/functions/_PDCLIB/print.c create mode 100644 user/pdclib/functions/_PDCLIB/print.d create mode 100644 user/pdclib/functions/_PDCLIB/print.o create mode 100644 user/pdclib/functions/_PDCLIB/seed.c create mode 100644 user/pdclib/functions/_PDCLIB/seed.d create mode 100644 user/pdclib/functions/_PDCLIB/seed.o create mode 100644 user/pdclib/functions/_PDCLIB/stdarg.c create mode 100644 user/pdclib/functions/_PDCLIB/stdarg.d create mode 100644 user/pdclib/functions/_PDCLIB/stdarg.o create mode 100644 user/pdclib/functions/_PDCLIB/strtox_main.c create mode 100644 user/pdclib/functions/_PDCLIB/strtox_main.d create mode 100644 user/pdclib/functions/_PDCLIB/strtox_main.o create mode 100644 user/pdclib/functions/_PDCLIB/strtox_prelim.c create mode 100644 user/pdclib/functions/_PDCLIB/strtox_prelim.d create mode 100644 user/pdclib/functions/_PDCLIB/strtox_prelim.o create mode 100644 user/pdclib/functions/stdio/clearerr.c create mode 100644 user/pdclib/functions/stdio/clearerr.d create mode 100644 user/pdclib/functions/stdio/clearerr.o create mode 100644 user/pdclib/functions/stdio/fclose.c create mode 100644 user/pdclib/functions/stdio/fclose.d create mode 100644 user/pdclib/functions/stdio/fclose.o create mode 100644 user/pdclib/functions/stdio/feof.c create mode 100644 user/pdclib/functions/stdio/feof.d create mode 100644 user/pdclib/functions/stdio/feof.o create mode 100644 user/pdclib/functions/stdio/ferror.c create mode 100644 user/pdclib/functions/stdio/ferror.d create mode 100644 user/pdclib/functions/stdio/ferror.o create mode 100644 user/pdclib/functions/stdio/fflush.c create mode 100644 user/pdclib/functions/stdio/fflush.d create mode 100644 user/pdclib/functions/stdio/fflush.o create mode 100644 user/pdclib/functions/stdio/fgetc.c create mode 100644 user/pdclib/functions/stdio/fgetc.d create mode 100644 user/pdclib/functions/stdio/fgetc.o create mode 100644 user/pdclib/functions/stdio/fgetpos.c create mode 100644 user/pdclib/functions/stdio/fgetpos.d create mode 100644 user/pdclib/functions/stdio/fgetpos.o create mode 100644 user/pdclib/functions/stdio/fgets.c create mode 100644 user/pdclib/functions/stdio/fgets.d create mode 100644 user/pdclib/functions/stdio/fgets.o create mode 100644 user/pdclib/functions/stdio/fopen.c create mode 100644 user/pdclib/functions/stdio/fopen.d create mode 100644 user/pdclib/functions/stdio/fopen.o create mode 100644 user/pdclib/functions/stdio/fprintf.c create mode 100644 user/pdclib/functions/stdio/fprintf.d create mode 100644 user/pdclib/functions/stdio/fprintf.o create mode 100644 user/pdclib/functions/stdio/fputc.c create mode 100644 user/pdclib/functions/stdio/fputc.d create mode 100644 user/pdclib/functions/stdio/fputc.o create mode 100644 user/pdclib/functions/stdio/fputs.c create mode 100644 user/pdclib/functions/stdio/fputs.d create mode 100644 user/pdclib/functions/stdio/fputs.o create mode 100644 user/pdclib/functions/stdio/fread.c create mode 100644 user/pdclib/functions/stdio/fread.d create mode 100644 user/pdclib/functions/stdio/fread.o create mode 100644 user/pdclib/functions/stdio/freopen.c create mode 100644 user/pdclib/functions/stdio/freopen.d create mode 100644 user/pdclib/functions/stdio/freopen.o create mode 100644 user/pdclib/functions/stdio/fscanf.c create mode 100644 user/pdclib/functions/stdio/fscanf.d create mode 100644 user/pdclib/functions/stdio/fscanf.o create mode 100644 user/pdclib/functions/stdio/fseek.c create mode 100644 user/pdclib/functions/stdio/fseek.d create mode 100644 user/pdclib/functions/stdio/fseek.o create mode 100644 user/pdclib/functions/stdio/fsetpos.c create mode 100644 user/pdclib/functions/stdio/fsetpos.d create mode 100644 user/pdclib/functions/stdio/fsetpos.o create mode 100644 user/pdclib/functions/stdio/ftell.c create mode 100644 user/pdclib/functions/stdio/ftell.d create mode 100644 user/pdclib/functions/stdio/ftell.o create mode 100644 user/pdclib/functions/stdio/fwrite.c create mode 100644 user/pdclib/functions/stdio/fwrite.d create mode 100644 user/pdclib/functions/stdio/fwrite.o create mode 100644 user/pdclib/functions/stdio/gets.c create mode 100644 user/pdclib/functions/stdio/gets.d create mode 100644 user/pdclib/functions/stdio/gets.o create mode 100644 user/pdclib/functions/stdio/perror.c create mode 100644 user/pdclib/functions/stdio/perror.d create mode 100644 user/pdclib/functions/stdio/perror.o create mode 100644 user/pdclib/functions/stdio/printf.c create mode 100644 user/pdclib/functions/stdio/printf.d create mode 100644 user/pdclib/functions/stdio/printf.o create mode 100644 user/pdclib/functions/stdio/puts.c create mode 100644 user/pdclib/functions/stdio/puts.d create mode 100644 user/pdclib/functions/stdio/puts.o create mode 100644 user/pdclib/functions/stdio/remove.c create mode 100644 user/pdclib/functions/stdio/remove.d create mode 100644 user/pdclib/functions/stdio/remove.o create mode 100644 user/pdclib/functions/stdio/rename.c create mode 100644 user/pdclib/functions/stdio/rename.d create mode 100644 user/pdclib/functions/stdio/rename.o create mode 100644 user/pdclib/functions/stdio/rewind.c create mode 100644 user/pdclib/functions/stdio/rewind.d create mode 100644 user/pdclib/functions/stdio/rewind.o create mode 100644 user/pdclib/functions/stdio/scanf.c create mode 100644 user/pdclib/functions/stdio/scanf.d create mode 100644 user/pdclib/functions/stdio/scanf.o create mode 100644 user/pdclib/functions/stdio/setbuf.c create mode 100644 user/pdclib/functions/stdio/setbuf.d create mode 100644 user/pdclib/functions/stdio/setbuf.o create mode 100644 user/pdclib/functions/stdio/setvbuf.c create mode 100644 user/pdclib/functions/stdio/setvbuf.d create mode 100644 user/pdclib/functions/stdio/setvbuf.o create mode 100644 user/pdclib/functions/stdio/snprintf.c create mode 100644 user/pdclib/functions/stdio/snprintf.d create mode 100644 user/pdclib/functions/stdio/snprintf.o create mode 100644 user/pdclib/functions/stdio/sprintf.c create mode 100644 user/pdclib/functions/stdio/sprintf.d create mode 100644 user/pdclib/functions/stdio/sprintf.o create mode 100644 user/pdclib/functions/stdio/sscanf.c create mode 100644 user/pdclib/functions/stdio/sscanf.d create mode 100644 user/pdclib/functions/stdio/sscanf.o create mode 100644 user/pdclib/functions/stdio/ungetc.c create mode 100644 user/pdclib/functions/stdio/ungetc.d create mode 100644 user/pdclib/functions/stdio/ungetc.o create mode 100644 user/pdclib/functions/stdio/vfprintf.c create mode 100644 user/pdclib/functions/stdio/vfprintf.d create mode 100644 user/pdclib/functions/stdio/vfprintf.o create mode 100644 user/pdclib/functions/stdio/vfscanf.c create mode 100644 user/pdclib/functions/stdio/vfscanf.d create mode 100644 user/pdclib/functions/stdio/vfscanf.o create mode 100644 user/pdclib/functions/stdio/vprintf.c create mode 100644 user/pdclib/functions/stdio/vprintf.d create mode 100644 user/pdclib/functions/stdio/vprintf.o create mode 100644 user/pdclib/functions/stdio/vscanf.c create mode 100644 user/pdclib/functions/stdio/vscanf.d create mode 100644 user/pdclib/functions/stdio/vscanf.o create mode 100644 user/pdclib/functions/stdio/vsnprintf.c create mode 100644 user/pdclib/functions/stdio/vsnprintf.d create mode 100644 user/pdclib/functions/stdio/vsnprintf.o create mode 100644 user/pdclib/functions/stdio/vsprintf.c create mode 100644 user/pdclib/functions/stdio/vsprintf.d create mode 100644 user/pdclib/functions/stdio/vsprintf.o create mode 100644 user/pdclib/functions/stdio/vsscanf.c create mode 100644 user/pdclib/functions/stdio/vsscanf.d create mode 100644 user/pdclib/functions/stdio/vsscanf.o create mode 100644 user/pdclib/functions/stdlib/_Exit.c create mode 100644 user/pdclib/functions/stdlib/_Exit.d create mode 100644 user/pdclib/functions/stdlib/_Exit.o create mode 100644 user/pdclib/functions/stdlib/abort.c create mode 100644 user/pdclib/functions/stdlib/abort.d create mode 100644 user/pdclib/functions/stdlib/abort.o create mode 100644 user/pdclib/functions/stdlib/abs.c create mode 100644 user/pdclib/functions/stdlib/abs.d create mode 100644 user/pdclib/functions/stdlib/abs.o create mode 100644 user/pdclib/functions/stdlib/atexit.c create mode 100644 user/pdclib/functions/stdlib/atexit.d create mode 100644 user/pdclib/functions/stdlib/atexit.o create mode 100644 user/pdclib/functions/stdlib/atoi.c create mode 100644 user/pdclib/functions/stdlib/atoi.d create mode 100644 user/pdclib/functions/stdlib/atoi.o create mode 100644 user/pdclib/functions/stdlib/atol.c create mode 100644 user/pdclib/functions/stdlib/atol.d create mode 100644 user/pdclib/functions/stdlib/atol.o create mode 100644 user/pdclib/functions/stdlib/atoll.c create mode 100644 user/pdclib/functions/stdlib/atoll.d create mode 100644 user/pdclib/functions/stdlib/atoll.o create mode 100644 user/pdclib/functions/stdlib/bsearch.c create mode 100644 user/pdclib/functions/stdlib/bsearch.d create mode 100644 user/pdclib/functions/stdlib/bsearch.o create mode 100644 user/pdclib/functions/stdlib/calloc.c create mode 100644 user/pdclib/functions/stdlib/calloc.d create mode 100644 user/pdclib/functions/stdlib/calloc.o create mode 100644 user/pdclib/functions/stdlib/div.c create mode 100644 user/pdclib/functions/stdlib/div.d create mode 100644 user/pdclib/functions/stdlib/div.o create mode 100644 user/pdclib/functions/stdlib/exit.c create mode 100644 user/pdclib/functions/stdlib/exit.d create mode 100644 user/pdclib/functions/stdlib/exit.o create mode 100644 user/pdclib/functions/stdlib/free.c create mode 100644 user/pdclib/functions/stdlib/free.d create mode 100644 user/pdclib/functions/stdlib/free.o create mode 100644 user/pdclib/functions/stdlib/labs.c create mode 100644 user/pdclib/functions/stdlib/labs.d create mode 100644 user/pdclib/functions/stdlib/labs.o create mode 100644 user/pdclib/functions/stdlib/ldiv.c create mode 100644 user/pdclib/functions/stdlib/ldiv.d create mode 100644 user/pdclib/functions/stdlib/ldiv.o create mode 100644 user/pdclib/functions/stdlib/llabs.c create mode 100644 user/pdclib/functions/stdlib/llabs.d create mode 100644 user/pdclib/functions/stdlib/llabs.o create mode 100644 user/pdclib/functions/stdlib/lldiv.c create mode 100644 user/pdclib/functions/stdlib/lldiv.d create mode 100644 user/pdclib/functions/stdlib/lldiv.o create mode 100644 user/pdclib/functions/stdlib/malloc.c create mode 100644 user/pdclib/functions/stdlib/malloc.d create mode 100644 user/pdclib/functions/stdlib/malloc.o create mode 100644 user/pdclib/functions/stdlib/qsort.c create mode 100644 user/pdclib/functions/stdlib/qsort.d create mode 100644 user/pdclib/functions/stdlib/qsort.o create mode 100644 user/pdclib/functions/stdlib/rand.c create mode 100644 user/pdclib/functions/stdlib/rand.d create mode 100644 user/pdclib/functions/stdlib/rand.o create mode 100644 user/pdclib/functions/stdlib/realloc.c create mode 100644 user/pdclib/functions/stdlib/realloc.d create mode 100644 user/pdclib/functions/stdlib/realloc.o create mode 100644 user/pdclib/functions/stdlib/srand.c create mode 100644 user/pdclib/functions/stdlib/srand.d create mode 100644 user/pdclib/functions/stdlib/srand.o create mode 100644 user/pdclib/functions/stdlib/strtol.c create mode 100644 user/pdclib/functions/stdlib/strtol.d create mode 100644 user/pdclib/functions/stdlib/strtol.o create mode 100644 user/pdclib/functions/stdlib/strtoll.c create mode 100644 user/pdclib/functions/stdlib/strtoll.d create mode 100644 user/pdclib/functions/stdlib/strtoll.o create mode 100644 user/pdclib/functions/stdlib/strtoul.c create mode 100644 user/pdclib/functions/stdlib/strtoul.d create mode 100644 user/pdclib/functions/stdlib/strtoul.o create mode 100644 user/pdclib/functions/stdlib/strtoull.c create mode 100644 user/pdclib/functions/stdlib/strtoull.d create mode 100644 user/pdclib/functions/stdlib/strtoull.o create mode 100644 user/pdclib/functions/string/memchr.c create mode 100644 user/pdclib/functions/string/memchr.d create mode 100644 user/pdclib/functions/string/memchr.o create mode 100644 user/pdclib/functions/string/memcmp.c create mode 100644 user/pdclib/functions/string/memcmp.d create mode 100644 user/pdclib/functions/string/memcmp.o create mode 100644 user/pdclib/functions/string/memcpy.c create mode 100644 user/pdclib/functions/string/memcpy.d create mode 100644 user/pdclib/functions/string/memcpy.o create mode 100644 user/pdclib/functions/string/memmove.c create mode 100644 user/pdclib/functions/string/memmove.d create mode 100644 user/pdclib/functions/string/memmove.o create mode 100644 user/pdclib/functions/string/memset.c create mode 100644 user/pdclib/functions/string/memset.d create mode 100644 user/pdclib/functions/string/memset.o create mode 100644 user/pdclib/functions/string/strcat.c create mode 100644 user/pdclib/functions/string/strcat.d create mode 100644 user/pdclib/functions/string/strcat.o create mode 100644 user/pdclib/functions/string/strchr.c create mode 100644 user/pdclib/functions/string/strchr.d create mode 100644 user/pdclib/functions/string/strchr.o create mode 100644 user/pdclib/functions/string/strcmp.c create mode 100644 user/pdclib/functions/string/strcmp.d create mode 100644 user/pdclib/functions/string/strcmp.o create mode 100644 user/pdclib/functions/string/strcoll.c create mode 100644 user/pdclib/functions/string/strcoll.d create mode 100644 user/pdclib/functions/string/strcoll.o create mode 100644 user/pdclib/functions/string/strcpy.c create mode 100644 user/pdclib/functions/string/strcpy.d create mode 100644 user/pdclib/functions/string/strcpy.o create mode 100644 user/pdclib/functions/string/strcspn.c create mode 100644 user/pdclib/functions/string/strcspn.d create mode 100644 user/pdclib/functions/string/strcspn.o create mode 100644 user/pdclib/functions/string/strlen.c create mode 100644 user/pdclib/functions/string/strlen.d create mode 100644 user/pdclib/functions/string/strlen.o create mode 100644 user/pdclib/functions/string/strncat.c create mode 100644 user/pdclib/functions/string/strncat.d create mode 100644 user/pdclib/functions/string/strncat.o create mode 100644 user/pdclib/functions/string/strncmp.c create mode 100644 user/pdclib/functions/string/strncmp.d create mode 100644 user/pdclib/functions/string/strncmp.o create mode 100644 user/pdclib/functions/string/strncpy.c create mode 100644 user/pdclib/functions/string/strncpy.d create mode 100644 user/pdclib/functions/string/strncpy.o create mode 100644 user/pdclib/functions/string/strpbrk.c create mode 100644 user/pdclib/functions/string/strpbrk.d create mode 100644 user/pdclib/functions/string/strpbrk.o create mode 100644 user/pdclib/functions/string/strrchr.c create mode 100644 user/pdclib/functions/string/strrchr.d create mode 100644 user/pdclib/functions/string/strrchr.o create mode 100644 user/pdclib/functions/string/strspn.c create mode 100644 user/pdclib/functions/string/strspn.d create mode 100644 user/pdclib/functions/string/strspn.o create mode 100644 user/pdclib/functions/string/strstr.c create mode 100644 user/pdclib/functions/string/strstr.d create mode 100644 user/pdclib/functions/string/strstr.o create mode 100644 user/pdclib/functions/string/strtok.c create mode 100644 user/pdclib/functions/string/strtok.d create mode 100644 user/pdclib/functions/string/strtok.o create mode 100644 user/pdclib/functions/string/strxfrm.c create mode 100644 user/pdclib/functions/string/strxfrm.d create mode 100644 user/pdclib/functions/string/strxfrm.o create mode 100644 user/pdclib/includes/assert.h create mode 100644 user/pdclib/includes/iso646.h create mode 100644 user/pdclib/includes/limits.h create mode 100644 user/pdclib/includes/stdarg.h create mode 100644 user/pdclib/includes/stdbool.h create mode 100644 user/pdclib/includes/stddef.h create mode 100644 user/pdclib/includes/stdint.h create mode 100644 user/pdclib/includes/stdio.h create mode 100644 user/pdclib/includes/stdlib.h create mode 100644 user/pdclib/includes/string.h create mode 100644 user/pdclib/internals/_PDCLIB_aux.h create mode 100644 user/pdclib/internals/_PDCLIB_config.h create mode 100644 user/pdclib/internals/_PDCLIB_glue.h create mode 100644 user/pdclib/internals/_PDCLIB_int.h create mode 100644 user/pdclib/internals/_PDCLIB_test.h create mode 100644 user/pdclib/pdclib.a create mode 100644 user/pdclib/platform/_example/Readme.txt create mode 100644 user/pdclib/platform/_example/functions/_PDCLIB/_Exit.c create mode 100644 user/pdclib/platform/_example/functions/_PDCLIB/allocpages.c create mode 100644 user/pdclib/platform/_example/functions/_PDCLIB/close.c create mode 100644 user/pdclib/platform/_example/functions/_PDCLIB/isinteractive.c create mode 100644 user/pdclib/platform/_example/functions/_PDCLIB/open.c create mode 100644 user/pdclib/platform/_example/functions/_PDCLIB/read.c create mode 100644 user/pdclib/platform/_example/functions/_PDCLIB/remove.c create mode 100644 user/pdclib/platform/_example/functions/_PDCLIB/rename.c create mode 100644 user/pdclib/platform/_example/functions/_PDCLIB/stdinit.c create mode 100644 user/pdclib/platform/_example/functions/_PDCLIB/write.c create mode 100644 user/pdclib/platform/_example/functions/stdio/tmpfile.c create mode 100644 user/pdclib/platform/_example/functions/stdio/tmpnam.c create mode 100644 user/pdclib/platform/_example/functions/stdlib/getenv.c create mode 100644 user/pdclib/platform/_example/functions/stdlib/system.c create mode 100644 user/pdclib/platform/_example/includes/float.h create mode 100644 user/pdclib/platform/_example/internals/_PDCLIB_config.h create mode 100644 user/pdclib/platform/csos/functions/_PDCLIB/_Exit.c create mode 100644 user/pdclib/platform/csos/functions/_PDCLIB/allocpages.c create mode 100644 user/pdclib/platform/csos/functions/_PDCLIB/close.c create mode 100644 user/pdclib/platform/csos/functions/_PDCLIB/isinteractive.c create mode 100644 user/pdclib/platform/csos/functions/_PDCLIB/open.c create mode 100644 user/pdclib/platform/csos/functions/_PDCLIB/read.c create mode 100644 user/pdclib/platform/csos/functions/_PDCLIB/remove.c create mode 100644 user/pdclib/platform/csos/functions/_PDCLIB/rename.c create mode 100644 user/pdclib/platform/csos/functions/_PDCLIB/stdinit.c create mode 100644 user/pdclib/platform/csos/functions/_PDCLIB/write.c create mode 100644 user/pdclib/platform/csos/functions/stdio/tmpfile.c create mode 100644 user/pdclib/platform/csos/functions/stdio/tmpnam.c create mode 100644 user/pdclib/platform/csos/functions/stdlib/getenv.c create mode 100644 user/pdclib/platform/csos/functions/stdlib/system.c create mode 100644 user/pdclib/platform/csos/includes/float.h create mode 100644 user/pdclib/platform/csos/internals/_PDCLIB_config.h diff --git a/bochs.bxrc b/bochs.bxrc index e4b5b69..b410749 100755 --- a/bochs.bxrc +++ b/bochs.bxrc @@ -10,7 +10,7 @@ floppy_bootsig_check: disabled=0 # no floppya # no floppyb ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 -ata0-master: type=disk, mode=flat, translation=auto, path="ramdrive/hdd.img", cylinders=65, heads=16, spt=63, biosdetect=auto, model="Generic 1234" +ata0-master: type=disk, mode=flat, translation=auto, path="hdd.img", cylinders=65, heads=16, spt=63, biosdetect=auto, model="Generic 1234" ata2: enabled=0 ata3: enabled=0 parport1: enabled=1, file="" diff --git a/bochslinux.bxrc b/bochslinux.bxrc new file mode 100644 index 0000000..0512783 --- /dev/null +++ b/bochslinux.bxrc @@ -0,0 +1,52 @@ +# configuration file generated by Bochs +plugin_ctrl: unmapped=1, biosdev=1, speaker=1, extfpuirq=1, gameport=1, pci_ide=1, acpi=1, ioapic=1 +config_interface: textconfig +display_library: wx +memory: host=32, guest=32 +romimage: file="/usr/share/bochs/BIOS-bochs-latest" +vgaromimage: file="/usr/share/bochs/VGABIOS-lgpl-latest" +boot: disk +floppy_bootsig_check: disabled=0 +# no floppya +# no floppyb +ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 +ata0-master: type=disk, mode=flat, translation=auto, path="hdd.img", cylinders=65, heads=16, spt=63, biosdetect=auto, model="Generic 1234" +ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15 +ata2: enabled=0 +ata3: enabled=0 +parport1: enabled=1, file="" +parport2: enabled=0 +com1: enabled=1, mode=null, dev="" +com2: enabled=0 +com3: enabled=0 +com4: enabled=0 +usb_uhci: enabled=0 +usb_ohci: enabled=0 +i440fxsupport: enabled=1 +vga_update_interval: 50000 +vga: extension=vbe +cpu: count=1, ips=2000000, reset_on_triple_fault=0, cpuid_limit_winnt=0 +print_timestamps: enabled=0 +# no gdb stub +port_e9_hack: enabled=0 +text_snapshot_check: enabled=0 +private_colormap: enabled=0 +clock: sync=none, time0=local +# no cmosimage +ne2k: enabled=0 +pnic: enabled=0 +sb16: enabled=0 +# no loader +log: - +logprefix: %t%e%d +panic: action=ignore +error: action=report +info: action=report +debug: action=ignore +pass: action=fatal +keyboard_type: mf +keyboard_serial_delay: 250 +keyboard_paste_delay: 100000 +keyboard_mapping: enabled=0, map= +user_shortcut: keys=none +mouse: enabled=0, type=ps2 diff --git a/build.sh b/build.sh index 3322e28..db1c656 100755 --- a/build.sh +++ b/build.sh @@ -8,22 +8,24 @@ done CFLAGS="-std=c99 -Wall -Wextra -nostdlib -fno-builtin -nostartfiles -nodefaultlibs -fno-exceptions -fno-stack-protector -c -masm=intel " KCFLAGS="-iquote kinc $CFLAGS $1" -USERCFLAGS="-Iuinc $CFLAGS" +USERCFLAGS="-Iuinc -Iuser/pdclib/includes -Iuser/pdclib/internals $CFLAGS" nasm -f elf -o kbin/aaa_loader_asm.o ksrc/loader.asm nasm -f elf -o kbin/helper_asm.o ksrc/helper.asm -nasm -f elf -o kbin/panic_asm.o ksrc/panic.asm +nasm -f elf -o kbin/aaa_panic_asm.o ksrc/panic.asm nasm -f elf -o kbin/isrs_asm.o ksrc/isrs.asm nasm -f elf -o kbin/task_asm.o ksrc/task.asm nasm -f elf -o kbin/syscall_asm.o ksrc/syscall.asm #build the CRT -nasm -f elf -o user/crt.o user/crt/csos.asm +nasm -f elf -o user/crt/crt_asm.o user/crt/csos.asm +gcc $USERCFLAGS -Iuser/pdclib/internals/ user/crt/csos.c -o user/crt/crt_c.o +#ar q user/crt.a user/crt/*.o #user mode crap rm ubin/* gcc $USERCFLAGS user/init.c -o ubin/init.o - ld -T user_linker.ld -o build/init.bin ubin/*.o + ld -T user_linker.ld -o build/init.bin ubin/*.o user/pdclib/functions/stdlib/*.o user/pdclib/functions/_PDCLIB/*.o user/pdclib/functions/stdio/*.o user/pdclib/functions/string/*.o user/crt/crt_c.o gcc -std=c99 -o util/bin2nasm util/bin2nasm.c # custom binaries to include in image!! @@ -41,7 +43,7 @@ gcc -std=c99 -o util/bin2nasm util/bin2nasm.c rm kbin/tmp.asm # int.bin - nasm -f bin -o kbin/realmode_int.bin ksrc/realmode/int.asm +nasm -f bin -o kbin/realmode_int.bin ksrc/realmode/int.asm util/bin2nasm int16 < kbin/realmode_int.bin > kbin/tmp.asm nasm -f elf -o kbin/realmode_int.o kbin/tmp.asm rm kbin/tmp.asm @@ -71,7 +73,7 @@ ld -T kernel_linker.ld -o build/kernel.sys kbin/*.o gcc -std=c99 -o util/inject_symbols util/inject_symbols.c perl util/find_symbols.pl build/kernel.sys | util/inject_symbols build/kernel.sys -HDDIMG=ramdrive/hdd.img +HDDIMG=hdd.img dd if=/dev/zero of=$HDDIMG bs=33546240 count=1 status=noxfer &>/dev/null @@ -82,11 +84,13 @@ parted --script $HDDIMG set 1 boot on rm -rf mnt mkdir mnt -mount -o loop,offset=512 $HDDIMG mnt -cp -r build/* mnt -umount mnt -rm -rf mnt +sudo chmod -R 0777 mnt +sudo mount -o loop,offset=512 $HDDIMG mnt +sudo chmod 0777 mnt +sudo cp -r build/* mnt +sudo umount mnt +sudo rm -rf mnt grub --device-map=/dev/null --batch < grubscript &> /dev/null -#gzip -c -9 $HDDIMG > hdd.img.gz \ No newline at end of file +#gzip -c -9 $HDDIMG > hdd.img.gz diff --git a/build/init.bin b/build/init.bin new file mode 100755 index 0000000000000000000000000000000000000000..b3273c5e34e8c2680255fbfda520a43e1516a403 GIT binary patch literal 20580 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�Nt)_<8aK$&d;M$LS-4a%eu%4{nzYUZ=;P$msgW?O<$ zGoNjXGHHx5+Zv3T`D}a4koK5i+k;V+4^h(|Go(Fc*!E!5%xBwUhUx&eJ!aVUK-4Nv z+GB=o4@S-MYjf+_nd!Wjf+_nd!Wg~hLz~6=XftC*tRY+Q>WDk!4jSZEl*hStdXm=Ou6 zNK+G5XqzN5#G)jK6&!fhn(LRAnn*Y(7BDi_*n$j9;<`)5nqq5JjLcE4r?8r96l<&? zmyB9*vCU|5W1}cg#i@zXSj~n|T_6~pX_z^{Df0$4go5#AEUHZ0g!xyj2IDoc^`az3 z0&p{4LOfNPvRk z(V7+&!~`(cjz()d+(_luh9j3i$D(~)-`3RCaRD9OEX#yD)deCvyb85o>BuEKR2^*D zENl=E>wc^*rRqdAu(FSGDK4BM5NXDeJr3d2T{wb;ZDXS-Fc6Q$#JZ_29K$+3*dSN^ z!vBOYSv0kQItGGRN@Gp&c}sAkDb&=|4DH4uEpUc-y%B6_4dZD7HHWR%JFU(|y<&!1 z<+BQCd$>t>Rv@$~B-}&v7V&7ohlcp(7W*+K7O%r&6D3n6=pKABV%M?aaKs2Jk5)9t zs0$bC{#4rX>)L-hvteu$Iy`vhxHsgro6Rl!fPw zmWIu-FnnGrx`hv4gUdEzjiFGBvB6RgAC}l6*11017!pE4vbL007iv`UsKWK(#zrH? zL(8H+){ETXNH}h+m+ID^qF59G(~^L0r1-9M&<2PSOAY|0U?U6MIW*1 z5NMPY9Kn}uU&Wy1~}is@^jBbcRfEQlJaI}0-ilhc_86-W_O9QeW zV+M^%#|X#6*n2Ru3dNv%s7}r!@`I$9o+103dYHFN$ezE6qte$!R2y3( zY$Zo9Xi3^LC|Xq)5}i~iPCdoblj>U|K~^(RyEzc4X%gCuVpbG8Dq3a(TQg#=6;_~) zMN@>0L$c2Z9SbsNQF^!8pta5MW>j5sR8xJSP1s$C3A3vxRc&rMScAFhfFhr@nGvW* zCu|UDRtFdTkw|ClJf6~=`7i0Ngs)f74uXEx>X+~;D6^kH*5h1(tG H)bl?9$7+Is diff --git a/grubscript b/grubscript index 8f75add..9b3b0fd 100644 --- a/grubscript +++ b/grubscript @@ -1,4 +1,4 @@ -device (hd0) ramdrive/hdd.img +device (hd0) hdd.img root (hd0,0) setup (hd0,0) diff --git a/hdd.img b/hdd.img new file mode 100644 index 0000000000000000000000000000000000000000..bd1490183e2d6cb4832f0f33392dce30d17a7214 GIT binary patch literal 33546240 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

=+0Cmg@!{8TBdt@Bfb1?JOusF&ux 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 z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009F3haEZ)000000P=rrgaii;95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=0qoF$00000 z0FeJ{BP2L*;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4q%541ONa40D$~o8zI4g0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KZ~!}WAOHXW0089w+6V~_95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fdkl~ z0|5X4001EW*G5Qi;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jjM^9S8sb0002_zcxaG0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNq!T=s*Af0002U|Fsbk95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddD$L&pLD0001k{H-Ukvk)?1z<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA jz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfPrZs@{Iy> literal 0 HcmV?d00001 diff --git a/kbin/aaa_loader_asm.o b/kbin/aaa_loader_asm.o new file mode 100644 index 0000000000000000000000000000000000000000..abee546b62d1c3395a072652734a0fd874721625 GIT binary patch literal 784 zcmbVJ%}T>S5T3+p6%^`45kU`v2trg4yf&?A8%$a;_R^DS4YahikgT95eFR@b=mYpL z9=v!Acv4}V+3e8t>cH&GH$UIZ?mjtQ%`gmLF<=2^2%xMJr^+5c5%d2M;v`+t%{K^k zb3`TW7tt=G@|0(_j5<_BLD#M3YA8f?$2v!bJ2ucabMYxA-VraN5(n|o>>X5|i7vcg zQ=c3y%(sttg@a_ViTa6$YRJ<5Eavoen|Oa(S08Uwav3Pv&tEC!_ZNUAq6Yz1H%Y)s z`iY1|*hTMgoLPS*3Yb~gGc0B;!uDeyJHk|53(DuQ literal 0 HcmV?d00001 diff --git a/kbin/aaa_panic_asm.o b/kbin/aaa_panic_asm.o new file mode 100644 index 0000000000000000000000000000000000000000..8a265e50195ca12218d7084aa33d9b28e8fda98d GIT binary patch literal 66480 zcmeIuO>0zF7y#h+PSm79%eZOXn9d?n5gaRRH$_3C$;K|CK`2N`ZzfX>`5??(!LF*y z`~bV@sz0Fn;zA1gJL0O)ML`5tB8=x`?oCHGg|43i=e{53opXlg=f!WAilT^S6)_e6 zRuNa~gRc(a*_ck}|7Ybp^FCJp_=i;dI&o3E&Zkq%bBC|ABH9!G=tw$4p49eI74cDmwlEvLCZQ*|`${8qj%zx`R-hi~TIR1upgHmkYs^VImLX{Puv&3%z# zz9-M*IFoj>KAHP?<<`yRQ8nMWx0ITHza5Q6kDkw`^!DCgd;ffYXYcevDpu-){QKW> z<8s<@fB((v9A|Iz2Rr?(&T_f4(d(S=oEgq8Uj6Qy&Y1_D&f>Kux!xoTb#iTGJaWB` zD+h5l{>XPe%b!U9X7uvu@B91l;z`aAnmz;w5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV8p7 z^&eExT`#LLy2E?JYEYGHDf?-A9P4_}-x^Q;hgdOjek5LvCd!zK$zvMU-@eWj|fPDY} literal 0 HcmV?d00001 diff --git a/kbin/ata.o b/kbin/ata.o new file mode 100644 index 0000000000000000000000000000000000000000..5bd4cb62840f39a04ece7d46ca49a5682395db9a GIT binary patch literal 2088 zcmcIl--{bn6h4#0Hf^KH%0i(E4w8iy+p(pwbXyA9?p_yUD^)vK)NM#+Cm5O^WoA;- z2NjJEJB4@Xamn0K4I2AX4K2+3DWewql|y z!ZY%ATom5^Kh!z<+&cfEm=yXkrTXzS{SVrMoO+CY9%iI}TJ*0vT`>frM;``axcb{3 ze>Hw?5@KLx{0E2D{9gjIKYjmd%)cL)!(cI`J>XaH7qZ-`r2k1a;ZKJB4O_Xl!_oeD zh%FF(4S~e)w8%I&IvVTmVC#wjKSdx0avBEVG-UkS(3Ji2F=pNTE}j$?Fk2ARKn(ul zK%h*n3c1RWz}N<2a;K5lK)W`cj>P27BeBuGllypa`&dMMoR0cVWsQ+Dd!8anm9U0l-3#Y)v)GW3PBGx`~QYU!|EYL?5k z18}r8)uOqIds+X?sd%>Dth-IivfXmCY7ouO&Ysc_nx$slYw9^8XBwG~iAMk|`bnWzAn(~y)ADYj>yeJnvtJU6N1m|?(NY3*Oe)?RklA0E zck(+5AC89~6G`lMCX$({cqbvVANwJ#+WrqVOt{_D?p^ajSN zJK?D~A-NHX6OtIAIHo{peuVyIbZq~Ko$KKDRmAvB1;80kkKz0no(JaGH?cVW#WDLO z;BQg%MJ%>AfO}~0V&qTw2n>t&f`iYp;M$hgaHv$N7oaI#LG+o literal 0 HcmV?d00001 diff --git a/kbin/console.o b/kbin/console.o new file mode 100644 index 0000000000000000000000000000000000000000..54a208edc5dc72bf8003c2fc41a9bb9d99a0524a GIT binary patch literal 3200 zcmb7FUu;uV96q-zuHdj84n&O(bi|3$5SFvmjG zi)T+kdz{8E&R^wbI?Hy2is_XFJJ4iT{KwRuQZ@jR_jXKG=jP@RZ+c74u2==TvcYai zpMxM*vWz-!UxFb2Xa^Dp0N#Rq$>^Xcgf11mp3_RrkEkos#pp+FW;uh5A7m;1!xIJD z2d}=oT|FN0LNcbXp7oE}vt?ws2}Vq@5Y<6e?K?T;^Bt-g8J;Uf_ec6SKUa18Z^AqoD!D6~#({-^H{5$DS^J>z*x;q6OxbChs+8t5Ry@JkA*Iy(2NIiV#?^|)o z@S<=C9$w@O9^_8lFomTI??3#tyC}A`THhDjcuZis&+{Laxp7My`|>AGPU3*HJH z>iy_FXrABP;WKZUhhE2-?`oCuc4gYH&2dq1q;V-cZa=g+!ds;cc4hdyTmF<=e$Ecy z>ab6HO8(LJ(C(|8tSd+=Ck8jc$LqwC-i%$8y&ZTeeHXRKt24*(nu@TpE3hquDyUrF zK)URwZnPI^%q_ zyLy!lR)@biduj`OZ)JepH!8JhN=xTY(s*+cibT&ZAYXTk~h z0G+gp{brSp#)D3DhogeMVJEDDJ(-LOMpB7HGznQU0 zF{ehhr<~M|x-O9#ih{Zkv?nFP`_xb-sblvUNu(Ai5|4({O5KG%S-4mspa+M*A>t3W zpSVn^k3^0yu(J3b&|eGveL?UQBK(s?yhlg)4&fuhUlYDh_#49CAtLS}BI14`d|db$ z!EXgG2>wZgA9K>LS@32ed~z@QPqn(8E2jej;X@V7uUI!L@?x1)l(V@N;-Z_%^|q;7-92!J^;+BJzDK j_^IF|&~uwo%b@ezf$uXBJSKcp_`5*X`Jvzm!II!VcN~+e literal 0 HcmV?d00001 diff --git a/kbin/fs_fat.o b/kbin/fs_fat.o new file mode 100644 index 0000000000000000000000000000000000000000..a5092a1eb42fe0d98d917536469bcfc33b5dd15b GIT binary patch literal 6048 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'Pa32y{&!GNK0?4ailDw zMnRT9rM0%sSk#C}U1dHRX)}8IqEhSO_9$z4u&cGRv!{)9MY`I0ACco7-5s_WD6~Y5 zbwrJlev9!)Z^W70676`j%#iow7p+ediEr=djF6*Mi&Jc!k#4DIhpfCL7rJ^$Or+(( z_P$6&a_|eXXv9Fizl)C>g*Tw+S)wTBUn@%cOZ-2GqE>0Y-0K*leW3B%72OZ&0?u2A z1{nJ>QPgaVD0<&yMw?qQ8Z}}uuSu>S9Cj3 s_&uulKPt+;WX}r{#k@RG%yR?#M2`@~_z+RVTMsbPdi#k&{*a>o0Tr|jga7~l literal 0 HcmV?d00001 diff --git a/kbin/fs_vfs.o b/kbin/fs_vfs.o new file mode 100644 index 0000000000000000000000000000000000000000..4123f19a52885a23ab9439abcfb6fb5e179b9acd GIT binary patch literal 1816 zcma)6O=uHA6n>j*ZIl&aTd-iDg+_=-7sXVq7b|63Dw#K z6r_Ddv>gzhxDPQpLYs0I7WMea6JQY6v7R5vtyb>Qz13__%d2B-}ov zr+tWQh(=*FGQ5NV2>qjNOztewtl5LeaQi%*uxjmiR=BdKx&8Q*IxBktccM1sS;o7) zzTFQ4mQh{ztetAOHda|Ss2qW3ciXplG`zlOz`4nTp|x5Rx)(-(CR4iEFv27H_Pfz& zc!`~AK#nS=dLIbj@K7@xyOWtJX;Y8(pp{>(YSlrFeTswBxdnDm-yG3D!{ciqC_>|4 zp@na2tTh`{-fF6sIPat`_P#%EaRjTb?i$(NBzlEBLTcmF)&`A_j$Z1IB~l9occDLS z#?5ns@dcj^of4eLbjo=*nF6{cff=Qh?40S^OD>r+NjFJm%5lg{7xQ_$09&Ex+UEF; z#GvCQ({p^1|CK%j;<$83Ch$9t%Qw#^UD{6o4@;dPgM`;W9w6s)9P1|~4+2>-Ewz}d zdZ(dte7m?ah~fH-EL<-tRR7C9Uc(Z7BR;Et_2n3rV_2#ubB>!}MT&}JY%P(&#_z(& zGvLMN2ur=S-un)sC$K9~^%PgwYS-yUL)jS*{sS>@?Z8~ezYr0>;s;m(OyD?>-|dj( zfTjeSw<}CR>Yx}@J_D~~^s_N2TyzxJg?i_KtPe~e;W7# z>!Rd2pc0;&gSCeJt^zrp&!L3<4;2A2=Qt(IA7e#uLA^lEr^Q*vO!IddKN&ljpLT3} zu9c^AMaQO6vFQ5NY#}QYdnxOX>Ea}FGko-g}3qAB*s_odTMB)XBmnBX~Oi5gp$n)U5R}$YyoW#)s nxTt%K7|e>qM-rbhb`ialxDM1Xw=WWFZ0{!eCH>v-1+d9Kh%;~| literal 0 HcmV?d00001 diff --git a/kbin/gdt.o b/kbin/gdt.o new file mode 100644 index 0000000000000000000000000000000000000000..7592f0953f8f5889173a82b245210189ccd2681b GIT binary patch literal 3116 zcmbtWUuauZ96mQmw_BI>-j>KZ6c(h;i7XDSu<0J6+i?@E%Vc@*sietG7uF;txtZ&r zt|JcaB^LG~J_v#gQ9*ocMM08ITBj(}Cqa-}6w2yDx5cIpf%yH-J*U0ZIn*6E_dDP3 z|M}f>PjZ33^t`5NObv|%*(PJ`_;yb-C}1Dk!E}~%f2;l;t_?+M$^IIDFzXJro#eX1 zn>DW2l3_Oyx;SYvggLt#l7+ZV0c+fJ=NdP{khtbbpQoUp!pU?^pfQtdI*Fa$YTZfn zU^O2%G-H;x-MQ*g5Zp=h3aP1GyDADn%1Dj(XWeAm;p@=dYY9k9CCtZrs5azhcg=r% z;pl)K!A5`~+R!xr)eQ|Sw>zEAH2=|s^zV{|&;XeVBltzALqK#*U|6D#7@hwZSBI~P zYs$Fy5|3(9@$ORR9rr)an`p;B_n_Yw`wq4Kub5F4Qxq)^Nq=^M-(u!_&@q=c4J~=g zuMXiwXIOF`|r46)C%X)2rMrpbfQj=s1gxQUmy^aChfweAU5+y*i!HWI){s2#zNLg(Ra78?3Rc)U*X5 zFr~$ICFm!CsLgcv8kWXP+Mho*+s;=)KrO%J>lVcU z?U9sHf*O+QQ$sE9PKx&$Gxh3Xu(8;MX3p?d_jP(@LoF|U7l}3+M=m%>HQuh)k(mis z12^9iG>}oFA!{t^-E$Cltou5(Dol4EOtyPM^1<~AK}h+S!lzmfDuEZIS`TcElfYj5 z`Qw-B##@xZNq8wlWna|kLf%7(6S{D~R=k2WQIC_rZH+h^;=pDc+>m}vXj6kr+pob{ zQMru`O??@y6!$qw>b-Uqhi8?sV@FR#t%6;eh>qp*IXjxKlGq*Aae(ZSeY?8*Iu6~Uf*)Z>iB$`g4z zH3GCt9-daKk~J2yt#dYuWm0yE#YW0y7AqA!k}l@+sF1}9McaxUdpWtkY^Ty^=wteq zV-M^!%x%)1epg>n1Z(jN0(=0o8&i$LJ4B0wjQq)t?wf}(i3c%hIEbZU5LfHRuqJzD z_ogqW-|hei#S4%SgY3As6i*fJAQ;(^J&o^SH{dPBlXNtnl_-RG{PCB(WJ9ADQ`JVC z>`u}`4rNEEY7;6nX&l1)KxltdAN^uc@BHz`Vek!PYN&XMEA-1l>}E&F3Ag?;BJR&X zTy@9u3bHQ0JM{9;l#~W>3Y3IAdtrgsEQX6`A3FFDkk(U@9|Crx$oDZx{~Wj)wC@)% ze@0n{r2Z86O*HHPbWIb#&W5?3;sncpWUCda+;+r4NrqXt?G$F+FwcSCSE97jJxAJAn z7G_p~{KXO?&q1*4SfzYgtnfJ(Q<>qiHA)}uaLF3Ym2In37Ru2LCj?E8d%07Yj4x8g z8k1~1Rmi1uM>7Nc3H}=Ncne!IERZ;ep|}-qTghH zm=JMJ5F*ZbLfBuH@+(sQA)&$8=RggIet|fe{gdP!iI3pD1o{vcNOrGEJTK)RN&cn8 V+k|*m>!iP*u?P+&@!de;e*)+?U2XsX literal 0 HcmV?d00001 diff --git a/kbin/helper_asm.o b/kbin/helper_asm.o new file mode 100644 index 0000000000000000000000000000000000000000..a8345b7a01cd08539179a59b58480fb5c1c9b921 GIT binary patch literal 800 zcmb7CJxc>Y5S=wK#v&LCMZqF=f^u5;0|ZeNEK=IYnUCczB4kzIktEXJ>D(yS2A1gdk&rGW5-eHj>2p2$v{FW2W?9 z$UWI}$*wh!gH(rN5>Eg#Dg7FC%PG!1*rws>N%~0KLCeDV3`Xub4^Q_y#HJf)#!SCO z2$M!+#HLaVqq(_X9zG?;3xFOk1Ng{Z7XW$c@qyt}*bj%{bND#;xE#7ykjl6F1s=BS zo`bnNSRQ&8soMLqm(M7Q-XW2t<*6o1xk?ARQbpA9VoZ1-TX79n|1fhOPGspVN*D0U zmLTx#u?gBmz|+SjsEdFHj7^NbvtfL_IYWR&^jiVWBpUN3V%FH0Q&R=CRads!GO#Mj zBTss@c846PZKtjcTH0$9xQ*NSmAb8@ literal 0 HcmV?d00001 diff --git a/kbin/idt.o b/kbin/idt.o new file mode 100644 index 0000000000000000000000000000000000000000..60e4070ef616904648e9991c4a75025a9f4453ab GIT binary patch literal 2744 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 literal 0 HcmV?d00001 diff --git a/kbin/kb.o b/kbin/kb.o new file mode 100644 index 0000000000000000000000000000000000000000..a357f68a4c43014e82e9e43b892baf962680dbc1 GIT binary patch literal 3432 zcmZ|R3v5$W7zgmvt%t$TZ6GK_(2kWc2CFcm?)T-%tYfz7hX}EfY$$a?{{aFc$0g7=R5b@ z^Z0J>+4gI7H8z_~Scgqyi+>^^&P(%7xj~7@6*;0Q`SWehDO}@26MD7Ltx0Vt|F|}k zJUNum()oQ_`W)XpYj6^jJ1Zsp12B(*v-9D9;SKua)Rwc_4YU@$+Lhj>8<;|){qj-7sHRzFR>#e1dPy18sZKPd zWn|VhC#Q@|In{uv&`UF?k{7#|riO=T`l(`G2YwDYCmd8GPdG4geqR&XU$C9e@59P& zWOSaq*z37-&diaL)9^^4lJrWJE9nG9N=^q(C5ypyC1-%gl`H|pO3nnON|u5WC1-(| zO3nseCCdPQ6fS^wI0tN0axQpO$$3Ciaz5CkBz*{*m8<}dDY*bNDY+1=QL+-OS8@^9 zpkx);t>j{`SIH$HSIMPdg_6raqms+PDkWEd8YNePS|zK&Y9&{JwMuGWoszYnO3Bp# zzu6j4r(_-2rerJGR&qVqqT~j!Qpt^=LCH;^UdcwVM9Ixysgg}#84`)4&qX4^ zJR}m#M_Q?z0Eq-oBay(5M1n992|AESFdK;kE+i5>;yHzM z-hI?oS64Yon*6b_9&?nt%3brz%40@UG1H9EMYOv^_xYh7G2LO6BEfc-9^9o1SBp>g z370<_6|O*MM@KM>x^Sl+bk#OAl|^-5pzZF#|G(y8+`_B{?H_c|&w3JVFnrJ_O2>mZ z#~3B^l0YzkkA5^ldY;-*nLa#Vz@jY(~(-5Tp5Xtg6VrX#lJ2ypb} z02cKI>a4@+&x$QG>+Rxt+Nvl2{g;>G%n>NIkGwB>Z&{diE~N5Qj`JWLG>#4JsopG` zG3AifXWgeAk4CX#+U#hJR!mzOrPPYuDARaWyaHthPO6~sXxnj^H;vefxCrMLIBC9_ zNA}2S%-U>>)QaLYoP{{YqkY)CWn3xmdvHFB1suUi_mhanplbbQ7qd0 zu7HT@ArT7u5qLwcySQ%nZ#Ajef%+T|{I4Xdn{u2Wc3pjYa9P4qq1qG=>*LhXb80!I26Y6MGR( z8xpUvv>u9S$0j{2edHAD>^`=K{g6Gwe#w5v4zQQmTO@Kh3aQGPAjDX5B7RSh#-aV3 zq|KM4U6c&NtoyNDa(s|I#1^8@tOxKH3{v|>b{qRVdzgKReVIMRzQw-B9%nyh&#<4f z->~1aKeB`DRrV(PCu_$?K=T~Sj%O#c4t56XVk_7sY&E-<-N3kNt=}&3?vSU@x%)>@VyU_BZwp On~lwq@|4StWB&$ki!IRr literal 0 HcmV?d00001 diff --git a/kbin/kmalloc.o b/kbin/kmalloc.o new file mode 100644 index 0000000000000000000000000000000000000000..4bcb59d971f22560f1188315483890e6d60dc6d0 GIT binary patch literal 2100 zcmah~-)kII6uy&8%-Sv{R*R)RIK>r`){d1%F|LSEu0d*i>O6?ZX0zQkG1(1dXRspD zn6c2y7|4r%Kv~}v5h*@x40Kyx%#%+FK_VpGeb~YZ3ogX(+&OnLD~Ok!`jS>4~c|-aO^Iki-Rw*MP56pFL+gA5c`+d|N^U-W3+_E>a znZ#b*Ci{U1x2cx_M#r4q3Z6={_w+C@Zlubn@lbYc$PeOCzDAww+e+?5_z5NVBmBHQ zycRU8J3_l*!>UtrP1!|C(YhFU-K4VgwEdIXCESngkq6$bCy>)jr@Oixd7Z>LF3w7* zji+x>1{9;#Eb5)k=$U5JB(^;hm

^(3D35!t-YgT(=myigEgl^jo^bHXPI@{6>9#n|4pfH) z{TU$1Mn41D!6WA4bGqsdWOM#9^y_Hw6bc#A69mC)IJpfmF)T*Jn|$^b@C58H14+IN zf6}i&jv)UABwZ|3ip$F@CATCr7Us*>7pp9nt5-#7A*e3ZM76*|rBb-Icq7(~b78T% z=!*h}f^coMTo(9eLr-YrB;#pDeV4)KSf6BkiSbp&1;)=AzheBI@i@w-_|G%u8D|*_ zi~-{}j6X8|%J>K4L&m=uPhjp8|3ya0_$lKi<9Cd|F#g3jit9lBXBcM~-)CH6{0E$M B#UKCx literal 0 HcmV?d00001 diff --git a/kbin/main.o b/kbin/main.o new file mode 100644 index 0000000000000000000000000000000000000000..a463d590a1b91763afd822047101a6ad7f467a0f GIT binary patch literal 2464 zcma)8U1%It6h6Dz=(<_0t$*?V7B&)TIu%Tz1jMv)QwvS2Cczgq%+B6yt~)!k%-l6i zsMrdE%bLgPi@xcbiZA})lc5hqP( zq7{gE1@Y`9tYy27e$LQ%eMugoGjYtWPpVfp&i%l(VwN~7k*OQm-#0VvP!^2BAe3Jj zCC1;HakqM{SG_ho*v0!)-n>*c0p03WueybD%JB2fn7Px@uodZ6qF7mAWwO(3F`GX6 z&tUKwCZuF>!c5*Tz_W#f-y6%9=P{b=xLVbGUyHh`3lG?~!%#SW5J*RhmfcW}@H(xU z4Cn;B((^lw715F{KUhP2sr0OL9ls@o_QlNn$$3j0K{ibyU7GB5OeBC9Cyr9TG_5z=X|q=7sRr1Ww;h< z*|IE4(8;D%q5}#ltEN2Sfsm&ZiXl2WGczT|7i%3)cf_PMX+64svJ+9shSohC2!f3*jp;a={hp828~}{eS5mfrj&& zG@S2eaMMhEhhShG>$x33;z~S>diL>iIKjw>Zr&7-7+Aw?H=eYMbx%j0xHCFNQyY7p z8zvGk@XN*z*N1}>?Nd76=^IgxNdkXr2)5nQ_5%Gj*!FOJX)p8i49pAB9&-%;zIo`& z$=GoAnKncyKGlW@MW)&ivhZ3s$1v8o2l?(y`Pp}0hL30X!3>|t@M9UC-gD0XLdM_7 z@OFl;XZWib{zitsnc?qb_v*8dKnHd^HZ^N8 zYCCMkqqZIBr9j#y8780h6@Wcupglb*VQZh~C;t;+*DN5ylYE~=#I)L+?zp+c-a#o;SvY zEO9d~ICKsnM{iyP{{xTH3K{j1YrM#2RakHiW0=Dp7CK+Oes3McUyy=&^{VQ7^}ec} zH@}GQzP2ojj96sT3y5BpH zpIwN=AWKNc>-nx2!i!47)eRaZN#}vp{cw#@eKAttgOM1;>lquk(jeZLv`eFSBhR=( zM~tl1l~DpRmmYS+z=}k!)3f8v%ok$t)AieYe(LbwQ%-Lmc2}kj_wL_SEKf$Fa7{b` zd?uM9TI0fdB21x*K?#d zU-KQmA;V>^xr1*v_=H+tk3Dnh)aTA@X};Z%ZKvoK-B0FH1&zx)^Z&ez{)VS zi)I)4HCOtVCAn2kdgRWxTI7b!)TuP5nvqSS+XcRoo?02Io7YVRY5FA4FMfs49kA#c#3i7R3=>vj;-OwnPQe`2s;Vo z{+M3@%Cj4cuEKKu8`uH-)7mFIuAs5t zR(Ru=t3l{jWD{>JjhBN)AgS)xTfQ_Qyf_EP$XP?pW|l79ENintF8 zALJlx1|R2J?f;=|%ogMMlk<6^huVLn{VX{1`6FzBI|j?RvW~Cl_^&#COUEDR_+L8y HSjYbZ!Aprm literal 0 HcmV?d00001 diff --git a/kbin/panic.o b/kbin/panic.o new file mode 100644 index 0000000000000000000000000000000000000000..4adc66e4c48d37e329a668aa33967157a42f937a GIT binary patch literal 1304 zcma)5&ubGw6n>j*b?pynb1Hf;N+K<#YrzPmA}Z-v5b<~L;2~_1t%kNq$WGdLs9Hh~ z%Npp>tN4#J?IGz+{{txz0^LJ|9L4p$ogKOj9(*wK&G+6nZ)V=id|;0rD2f8o6o|qp z1Ly=K^6aFX@K_JPCP){l{<8gam8ec$P1+}3fl zaiFx0Bg!}2QDeIg{JO*Xx0$weRiJgr$L?kf(PmwT4Q$psQTI-iy#{lYoo&}U5Ago8 zgRzWef1hpH9X!yu!+LZsbR(#3HGu~Qf5S(I0CyoCU#KVROYx)?pG($90anuKrT9!H zS1a*aJf)}foAarf&u+~M4xn4_Hn@>P)fn!&BBl13+on;PzowC8Rd(Kq2J5&i^yn9da~z85@P806r*-OK;Mbo zCOJbU=@k0p-Y87EXaCTVUha*;A8}G25%1kUADw9u8`UnHuY!SB=#wVbm0V)jufi`+ z`U%heOyc1ch=(gmd?Y*_IX>`^Me!BLJEoaaIG^f3mc|yt3Qqe>babw3Lwp7~Y1`OH ze`hHEWQaq>C>8U19`FO?%IlWktFUR6D%E0%uL_6gvpIa*ylUjlti{a=yfJxJe4KSN zYZMAqSPLe>4O}OJmq6=B#sD57D)``D5T5{e9q=L{mSrp8p8}*plV8OPh+G8t3&mQ} AV*mgE literal 0 HcmV?d00001 diff --git a/kbin/part.o b/kbin/part.o new file mode 100644 index 0000000000000000000000000000000000000000..4c4f90bdbc364a391a1f86224ab572027bba3e1f GIT binary patch literal 1528 zcmb_b&ubG=5T5OB?JC9A;z99Xkq9Z$RWM@hsZiGe*Yti&P7if(QQug$ROssE~sPOZ>jweeJg3FK}S?d*94A^Y+cYec(=CF$_br z8Dh#V6Pf9WGMNz4a!C3l+xWZ`q>*U4_T%NwcDFmQ8bWL3J4jbHZ-C zHM3BFUOU>DPTAPb(zX9te+>Qm|9zX^mMsNidUEY(a)j1O@QcZ9xB&;*TBe|v^J}mpN=ljFnb>};*9YQq^P-*vqDy5QFMyy;>o-=hlJL;=^ z;Wl6EZ|x+6ylV&I0^YHgiOUz>AjD3<55^k8TCd0$(1ue^9oMI0ZUSlTL@#pP?+n(| z|4DZa8nz(P*e?|=!zXj}OEHE)JnZxx3Y(@^plidjg?^O=E?>zquc^O%_F( wy^*j_xmL>{#Iu;cBle4I6Az1IaLgVYzDR`rCz78?jsO4v literal 0 HcmV?d00001 diff --git a/kbin/realmode.o b/kbin/realmode.o new file mode 100644 index 0000000000000000000000000000000000000000..919ce6ce11b538f195add88a1225e702371e204a GIT binary patch literal 1164 zcma)6O>5Lp6us$0JJwOFf(S00MT8M)s5mN$yG|_P2QHkIi;&4YaBz~TlMJ+*w$M#W zLHr9YUAYtYE{Z!B{)7rHTqtxY#B*NWt8ozY!pphm+;i{CygX(jcyQNo9I@d@O@1?x zCx*1Op(S%NE8U$hTi?#Vrn1xV>U$l}WxnTnvMKWQXHgWpL4&2;pbl_Zd1Wf^=_x*G z*T)ZfR13E4-~e;#4a_NfbyL$eHISWp*FD&tx7+GE+2|Z# z?M>2r(ro)}|Jp)(qS^J!B^U9twIq*vz!pY-3YC3qvZ%t0nrwY7)b&P_EJ19IxUdLiTeatTzUIQ}r zOE`Smc~_v&|1aMnJe*HtaGs~L^1&L{ErX?s*%T{b>1k+oPnPMs_ZJ`iGZlRw1wNW8U!Uyw4yCx(&Op?J1UBwZpGx`4QnIX57a*gA+QZ zS^405^E=rfU$g{BeshX>QAS*j8!yDMt$YSIt|sTilsM5!x-Y#8{tr; z6)K5J;*~WS^z$%@R>HyfMTYVy3kSI0Yy(!hG~<^177i}bSt33T@AJ%Dc^`-Y`Eild V=Iz@G;3q{vI^81lx{e*qZRoxK16 literal 0 HcmV?d00001 diff --git a/kbin/realmode_asm.bin b/kbin/realmode_asm.bin new file mode 100644 index 0000000000000000000000000000000000000000..69a7634bf82ca95301144ec5b44f8c1f90cbbd5c GIT binary patch literal 172 zcmYf3RGrqqz_8=Pdj^KiBdc9X0>-m)q zyfOnRN0#05;XOa2+^mM*X@&>V3~#3yo=h{mlxFxX&G7$=`TV~?nt2%+7#e_@f$Eku s{N`sAThQ>Tu7QJLhX9H_-C(yQ{yq#8W%$nwA{hi2J^JflWMqH=Mh0dE1doBi0V-hvrZpH?8JJ*7Nuoh!f-o~wmjIBn5y=D=D4QKg z4M^w$P@N)F4n%>>00BWDMsW#{695zgnFF!|L<<11B$N-Nz#ssqP6NgP(lGO2LJ6I! z(;65Uc6@lxz|eW*l_-!c!H~8?0Vv;hqwhf9gT5Di7x)zpq^bV<|G%DJ>A)*9kaA?% zJs;llGs?|s_?>2WAkFZ0n&HVb!%Jy~-_i{KznIVe3#6GBXl(;fGf>^KhTr^*Vhb8x z)irQ1>;O3#VNW;MEs4Jm14SABLxN6#;RBG(&LGCXFkuZy91ZBDB$gyH=oM!amlTyG zCIMNMxeyw{M^lc@MGg-ZhL8V|JflWMqH=Mh0dE1doBi0V-hvrZpH?8JJ*7Nuoh!f-o~wmjIBX0A+(H7ATt? zNW;{CgbaY{6rpk;3djWmK_H3jk_4bc08k8M4oE+U764*NC?80H!3Ll@H5dm-!_0#T z?PE~r5))A9QWI1-D_q33fngDY!r={!Aaa5JflWMqH=Mh0dE1doBi0V-hvrZpH?8JJ*7Nuoh!f-o~wmjIAsgJc2=l+BK$ z1|$>!RHq1)15qF|KtK?PkzLXNln4Ndfy@Ef0ip$fSQ5$yQebcas7?*W0n#w@U_uLc z6c))%SjeEzEytwL&Bvn9EykwMZN{O{ZO5f>_WxoAg-)PECs3jjDA5U&=mbg}o?s3$ zKrbb+B#}X{IHS0vs3b87$g0eR&=5XM9S$1VJuD0#|062{#S9;kfB=v$0pwdi#Xx+9 h?4-;*{gT`Qy~N^N1|T~=Gq1$Z48e-eNzFqt0{}S%E=2$U literal 0 HcmV?d00001 diff --git a/kbin/string.o b/kbin/string.o new file mode 100644 index 0000000000000000000000000000000000000000..e300fc68e7537a5b1c006bc81b74544f73c15931 GIT binary patch literal 2772 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 literal 0 HcmV?d00001 diff --git a/kbin/task_asm.o b/kbin/task_asm.o new file mode 100644 index 0000000000000000000000000000000000000000..3db20b2d45c7412d1ac99dd5b71631cc71639c64 GIT binary patch literal 1616 zcmb7E&r1|h9Dk#mnP}P%qd;Ml6{KX-@E~Ee@?14sXkdi|rE#2{b*I@KmwB^lc!+`y z!z_F076dK+1D-;tgG9%|po@oyE`>ptt|{2}JM(6pokP$U-urw$-(T;|yf^bWm7Wp= zfdnRyW^$qkN%Fv`hl8YrGzF>uh1e5E3$Gdm@hY@X7x$kAY~~!{6D)Tvq=S-k;A_|k z6fHq82L7`!5V7YK7~y_P5THR5hy}C{_!$_1ZJ&bufxueK!G5hU(Ee;qgUjii#ku1i z&fOW9cQAMhr}Cx4y_%=6-fm59p*Y+d+4YDYItDAZc||{$Anf)$!>pRuoDSB!#&oEL ztsOdC^OmEdZY=Il(VdLPat=)cwmLKp(C*MNfG+S#jxp}Aq_a6$p)-|*xr#bpF&4d5 zrGq0__Q`vE9&ayUhnK;(F|wO;sU*2{3`V>IU$*4=(x64jHO5_*bT=nm+SA#;54kf{ zteC4JpRay{d9ix1E&dR5JI_fc*>~xnJ3HiNhTVnHJ$%rxv31>6^SZer+N+|iFhd;3 zwvp6b>83caF(lHAkEyBj#B{(jJectuqy*J{gd}Wj!zKxqXSQW4%fKELedOBG3Vu#_ z{W^ztUAGwdeOwnn@XL4@c7T2g`gYwXke9$0Li#oEHzEB2I3BQX0{H?24>r)hfZ)Lg z`UnVKfIznczaP^5z>6V$1Ne)O?hHx+@q6fw=-!CF8qs$mIu+3;&+7MIgE-zTv@ZN| z3}&g<@kA2}E0U68>MAixmTuZPqLwX7Gi@2eq*yN4Ix;v%Su>U8f|ezynK#S2$!w)i zkWDyW*=F3E)6J~sBI|iw&C9HytD0Zn->EQ9lr$^1Y8B;wg_O01`UGsKB(tbjQ#Kkp zYs(R>Ms&7O`#UJIm4+@+jd$9Am%)txPXWHgc8=#cUgn7BDZtMW|CyLK#&Lq<6e3)N m2Z&Ita=*cmaopti77_B_0XAJEJf4*bK*9Yd*&D%#uNBb+a(apJi z8Mh`={`jzTzA`68#?{d;b5}k&gv#hv{aR~6fxlkbZ%t-@I=I%HuhAdZ=8GYt)}%7} zV)DxH`mcwK-`8dleI9rdI1Q`-TR;fx0p9@M13v;k1AhR21GL+~2`u;xU>SH=`xv>+ zXc&dc>+X45$u&L=}ZjzaI!AV@<6(P0!QZzDC{*`XiBl$B_PVBiPFSQwCSVH zGDl=BPJI(4J#Uk1D#{-ex%J&Mrx)aG9QBf-l+|q&?8rqw*p3qAl^!YwR^Tg!dQe&y{?&4Bjc<(KgzDOh6>l?odHoD|(*U~C(7`1Dp z!B*%SUmD#kgPWF4koH-!G!m@5vA(gjm~np|_DIO9$m9`v)Q;etxoX>_;$(wQ0LK`x zwu}L9qx}TH@yvT1Sg^jmf^q==bHJHr8?S+<^4Hg%oe|IfRtk9D(- z8Gy#TlmTllZy7$rtey4)2F#bu;>$jwWw{9A^P3a40Vn+|d{-O0n8$nU%;k}%C2Eg| zTu1ClfNN%b&j8$$X}ufByPqD??lCtHgEjg0Xu9*>*OB_uGtkE*Q&z=k;GWa?@A$qx zU3jHD@>p?RTn5+W_M0*K9{|*P2Y3#8>tJW>7o+__BPb{1jJ1XJp5(@neuAk;*;Mh)-L`Jf_n*}=Rs!o(?%5ohQZ1@Y{8EpRR zmU({Yci4{~)uaCuKClY5hyRDneIXyW%v$NsS$@&-%a%RMJY&qOTjsk@pZh{C&M)|k R^;ax6Eq`eFg5_Py{{c9>AesOG literal 0 HcmV?d00001 diff --git a/kbin/util.o b/kbin/util.o new file mode 100644 index 0000000000000000000000000000000000000000..ea4017ad7eab3ff3e0de52dea7c1b42fd1cc4567 GIT binary patch literal 792 zcma)4J4?e*6h3LAwoo)aHkXQm6>Jbp7ahyB2qJ=Hk`8Gau-F&o26b}CVhDmiq4+Bt z3oSl=h?61}I&>)LIqAI^Cq3}-J@Vz`_R?#1u%{>r$Wb5(KMo)xj1d)bkcMe6gV$sK zU3;Kt?ml=9%7efh25c0vRA>$Y4f*y+4cRbAL^2h!Q6&9t<`DohzptH?d$!gI=|`1$xDGLAP6thSS8X+2W2~IyCbxx9l@I!GC8Ni*zm1;sv^!y3jTP0&_H7|(I*2tAV(1y6AXvoEmqIXgXyy^}o8+m-NQjX=;)D#5 zIhs3UI`a&IeusugBjWp1G)tJtk^7{V9M4tw{E|8G?|&ot_({mezes*6{yKU!Iwytu chy}c%S)o^j2anh4x(#;Qt5w0RJ5C$E0c2HQ2><{9 literal 0 HcmV?d00001 diff --git a/kinc/syscall.h b/kinc/syscall.h index b54262a..d591cb0 100644 --- a/kinc/syscall.h +++ b/kinc/syscall.h @@ -14,9 +14,10 @@ void sys_read(regs_t* registers); void sys_open(regs_t* registers); void sys_close(regs_t* registers); void sys_write_ebx(regs_t* registers); +void sys_exception_handler(regs_t* registers); void syscall_handler(regs_t* registers); void syscall_isr(); -#endif \ No newline at end of file +#endif diff --git a/kinc/task.h b/kinc/task.h index 61cba75..2dcfa5a 100644 --- a/kinc/task.h +++ b/kinc/task.h @@ -5,6 +5,7 @@ #include "stdbool.h" #include "fs/vfs.h" +#define MAX_TASKS 128 #define MAX_FDS 64 typedef struct tss @@ -83,6 +84,7 @@ typedef struct task task_state_t state; char kernel_stack[8192]; vfs_stream_t* fds[MAX_FDS]; + uint exception_handler; } __attribute__((__packed__)) /* so i can access the struct straight from assembly */ task_t; @@ -103,10 +105,12 @@ typedef struct regs } __attribute__((__packed__)) regs_t; +task_t* task_get(uint pid); void task_init(uint base_physical, uint high_memory); uint alloc_page(); void free_page(uint page); task_t* task_create(uint size, void* code, uint stack_size); +task_t* task_dup(task_t* task); void task_kill_and_free(task_t* task); uint task_add_page(task_t* task); void task_del_page(task_t* task, uint virtual); @@ -117,4 +121,4 @@ task_t* task_current(); void task_peek(task_t* task, uint virtual, uint length, void* buffer); -#endif \ No newline at end of file +#endif diff --git a/kinc/util.h b/kinc/util.h index b396e73..3f5263e 100644 --- a/kinc/util.h +++ b/kinc/util.h @@ -11,9 +11,7 @@ typedef struct symbol __attribute__((__packed__)) symbol_t; char* cpuid(char* buffer); -typedef uint(*function_pointer_t)(uint,...); -function_pointer_t function_by_name(char* name); void sleep(uint ms); -#endif \ No newline at end of file +#endif diff --git a/ksrc/ata.c b/ksrc/ata.c index 270883c..d66080b 100644 --- a/ksrc/ata.c +++ b/ksrc/ata.c @@ -69,15 +69,37 @@ bool ata_write_sector(uchar disk, uint lba, void* buffer) bool ata_read_sectors(uchar disk, uint lba, uint sectors, void* buffer) { - if(buffer == NULL) - panic("Attempt to read to a null buffer in ata_read_sectors"); - // optimize later - for(uint i = 0; i < sectors; i++) + uint at_a_time = 64; + if(sectors > at_a_time) { - if(!ata_read_sector(disk, lba + i, (char*)buffer + 512*i)) - return false; + for(uint i = 0; i < sectors; i += at_a_time) + { + if(!ata_read_sectors(disk, lba + i, (sectors - i) > at_a_time ? at_a_time : sectors - i, (char*)buffer + (i * 512))) + return false; + } + return true; } - return true; + struct lba_packet* packet = (struct lba_packet*)0x2000; + packet->size = 16; + packet->reserved = 0; + packet->sectors = sectors; + packet->dest_segment = 0x1000; + packet->dest_offset = 0x0000; + packet->lba_lo = lba; + packet->lba_hi = 0; + + *(uchar*)0x2010 = disk; // disk + *(uchar*)0x2011 = 0x42; // read + + real_exec(bin_ata16, bin_ata16_len); + + memcpy(buffer, (void*)0x10000, 512 * sectors); + + bool success = !(*(bool*)0x2000); + if(!success) + panicf("Read failed. LBA = %d, buffer = 0x%x", lba, buffer); + + return success; } bool ata_write_sectors(uchar disk, uint lba, uint sectors, void* buffer) @@ -89,4 +111,4 @@ bool ata_write_sectors(uchar disk, uint lba, uint sectors, void* buffer) return false; } return true; -} \ No newline at end of file +} diff --git a/ksrc/helper.asm b/ksrc/helper.asm index da50498..325f8eb 100644 --- a/ksrc/helper.asm +++ b/ksrc/helper.asm @@ -1,5 +1,6 @@ +use32 extern memcpy -extern panic +global panic global get_gdt global gdt_reload_segment_registers global switch_to_user_mode @@ -9,8 +10,8 @@ get_gdt: mov eax, .tmp ret .tmp dd 0 - dd 0 - + dd 0 + gdt_reload_segment_registers: jmp 0x08:.boom .boom: @@ -45,4 +46,5 @@ switch_to_user_mode: int 0x80 jmp $ - hlt \ No newline at end of file + hlt + diff --git a/ksrc/isrs.asm b/ksrc/isrs.asm index 5f2afce..c4056e3 100755 --- a/ksrc/isrs.asm +++ b/ksrc/isrs.asm @@ -12,6 +12,8 @@ extern kprintf jmp isr_%1.fin isr_%1: mov [.eax], eax + mov ax, 0x10 + mov ds, ax mov eax, [esp] mov [.err], eax mov eax, [.eax] @@ -42,6 +44,8 @@ isr_main: .dont_send_other_clearance: mov al, 0x20 out 0x20, al + mov ax, 0x8b + mov ds, ax popa sti iret @@ -108,4 +112,4 @@ asm_isr_init: isr 0x80 - ret \ No newline at end of file + ret diff --git a/ksrc/loader.asm b/ksrc/loader.asm index 108ecd7..cc8ba80 100644 --- a/ksrc/loader.asm +++ b/ksrc/loader.asm @@ -32,4 +32,4 @@ loader: section .bss align 4 kstack: - resb STACKSIZE ; reserve 16k stack on a doubleword boundary \ No newline at end of file + resb STACKSIZE ; reserve 16k stack on a doubleword boundary diff --git a/ksrc/main.c b/ksrc/main.c index 5fd1769..f6a6341 100755 --- a/ksrc/main.c +++ b/ksrc/main.c @@ -60,7 +60,10 @@ void kmain(struct multiboot_info* mbd, unsigned int magic) uint init_size = vfs_size("/init.bin"); char* buff = kmalloc(((init_size + 4095) / 4096) * 4096); vfs_readfile("/init.bin", 0, init_size, buff); + task_create(init_size, buff, 4096); +// task_create(init_size, buff, 4096); + kfree(buff); cli(); @@ -69,4 +72,4 @@ void kmain(struct multiboot_info* mbd, unsigned int magic) __asm__("hlt"); panic("init exited"); -} \ No newline at end of file +} diff --git a/ksrc/panic.asm b/ksrc/panic.asm index c459eec..77b3ac4 100644 --- a/ksrc/panic.asm +++ b/ksrc/panic.asm @@ -1,10 +1,13 @@ +use32 global panic global symtable global get_symtable_addr extern kprintf extern panic_backtrace_step -panic: +section .text + +panic: push ss push ds push cs @@ -48,4 +51,4 @@ symtable: dd 0xbadf00de dd 0xffffffff - times 65536 db 0 ; reserve 64KiB for the symbol table \ No newline at end of file + times 65536 db 0 ; reserve 64KiB for the symbol table diff --git a/ksrc/panic.c b/ksrc/panic.c index 02778dc..a8a15ea 100644 --- a/ksrc/panic.c +++ b/ksrc/panic.c @@ -38,4 +38,4 @@ void panic_backtrace_step(size_t address) } kprintf(" 0x%x: %s +%x\n", best_offset, best, address - best_offset); -} \ No newline at end of file +} diff --git a/ksrc/string.c b/ksrc/string.c index 8f9e7aa..e6a1e16 100644 --- a/ksrc/string.c +++ b/ksrc/string.c @@ -218,4 +218,4 @@ char* strtoupper(char* dest, char* src) dest[i] = src[i]; } return dest; -} \ No newline at end of file +} diff --git a/ksrc/syscall.asm b/ksrc/syscall.asm index b5b3405..1c1e5af 100644 --- a/ksrc/syscall.asm +++ b/ksrc/syscall.asm @@ -6,6 +6,8 @@ extern page_directory syscall_isr: cli pusha + mov eax, 0 + mov [multitasking_enabled], eax mov eax, cr3 mov [.saved_cr3], eax @@ -35,7 +37,8 @@ syscall_isr: mov eax, [.saved_cr3] mov cr3, eax + mov eax, 1 + mov [multitasking_enabled], eax popa - sti iret - .saved_cr3 dd 0 \ No newline at end of file + .saved_cr3 dd 0 diff --git a/ksrc/syscall.c b/ksrc/syscall.c index 3457177..d9a8430 100644 --- a/ksrc/syscall.c +++ b/ksrc/syscall.c @@ -22,6 +22,8 @@ static void(*syscall_vectors[])() = { sys_open, sys_close, sys_write_ebx, + // 0x0C + sys_exception_handler, }; static uint syscall_max = sizeof(syscall_vectors) / sizeof(*syscall_vectors); @@ -32,33 +34,65 @@ void syscall_handler(regs_t* registers) kprintf("Unknown syscall %x\n", registers->eax); return; } + kprintf("[syscall] %x\n", registers->eax); syscall_vectors[registers->eax](registers); } void sys_alloc_page(__attribute__((unused)) regs_t* registers) { - + uint page = alloc_page(); + task_t* t = task_current(); + uint d_ent = 0; + uint* tbl = 0; + uint dir; + for(dir = 0x10000000 / 4096 / 1024; dir < 0xffffffff / 4096 / 1024; dir++) + { + if(t->page_directory[dir] & 1) + d_ent = t->page_directory[dir] & 0xfffff000; + else + continue; + } + tbl = (uint*)d_ent; + uint tbl_i; + for(tbl_i = 0; tbl_i < 1024; tbl_i++) + { + if((tbl[tbl_i] & 1) == 0) + break; + } + if(tbl_i == 1024) + { + dir++; + // fuck around and shit + } + tbl[tbl_i] = page | 1 | 2 | 4; + registers->eax = ((dir * 1024) + page) * 4096; } void sys_free_page(__attribute__((unused)) regs_t* registers) { } extern uint current_task; +extern uint multitasking_enabled; void sys_exit(__attribute__((unused)) regs_t* registers) -{ - // DANGER DANGER DANGER - // when we free this task, the stack we are on is no longer valid. - // we can still use it of course, but we don't have the memory region to ourselves anymore. - // we'll temporarily disable interrupts and GTFO - cli(); - //task_kill_and_free(task_current()); - current_task = 0xffffffff; // magic value that indicates to the switcher that there is no valid task running. - - __asm__("jmp task_switch"); // trigger a task switch +{ + task_kill_and_free(task_get(current_task)); + current_task = 0xffffffff; + sti(); + multitasking_enabled = true; + for(;;) ; } void sys_kill(__attribute__((unused)) regs_t* registers) { - + if(registers->ebx >= MAX_TASKS || task_get(registers->ebx) == NULL) + { + registers->eax = 0; + return; + } + if(registers->ebx == task_current()->pid) + { + sys_exit(registers); + } + task_kill_and_free(task_get(registers->ebx)); } void sys_get_pid(regs_t* registers) { @@ -66,7 +100,30 @@ void sys_get_pid(regs_t* registers) } void sys_fork(__attribute__((unused)) regs_t* registers) { + task_t* new = task_dup(task_current()); + + if(new == NULL) + { + registers->eax = 0xffffffff; + return; + } + + // the really tricky part about this is that the new task won't be returning from a syscall. + // it'll be spun up by the switcher so we need to 'fix' the return EIP so that it is switched into properly. + // that means we copy the registers from our current registers and modify EAX to be the new pid. + new->tss.ss = *(uint*)(task_current()->tss.esp0 - 1*4); + new->tss.esp = *(uint*)(task_current()->tss.esp0 - 2*4); + new->tss.eflags = *(uint*)(task_current()->tss.esp0 - 3*4); + new->tss.cs = *(uint*)(task_current()->tss.esp0 - 4*4); + new->tss.eip = *(uint*)(task_current()->tss.esp0 - 5*4); + + // now set return values: + registers->eax = new->pid; + new->tss.eax = new->pid; + + // all this magic should work in theory, but I haven't tested it yet. + } void sys_write(regs_t* registers) { @@ -102,4 +159,8 @@ void sys_close(__attribute__((unused)) regs_t* registers) void sys_write_ebx(regs_t* registers) { kprintf("EBX = 0x%x\n", registers->ebx); -} \ No newline at end of file +} +void sys_exception_handler(regs_t* registers) +{ + task_current()->exception_handler = registers->ebx; +} diff --git a/ksrc/task.asm b/ksrc/task.asm index 50bd7cf..c338fae 100644 --- a/ksrc/task.asm +++ b/ksrc/task.asm @@ -7,8 +7,9 @@ extern task_install_next_tss extern task_find_next global task_switch -%define MAX_TASKS 16 ; must be the same as in task.c +%define TIME_SLICE 3 +which_slice dd 0 task_switch: cli @@ -25,7 +26,18 @@ task_switch: sti iret + mov eax, [which_slice] + cmp eax, TIME_SLICE + je .perform_switch + + inc eax + mov [which_slice], eax + sti + iret + .perform_switch: + xor eax, eax + mov [which_slice], eax mov eax, [current_task] ; if current_task is 0xffffffff then that means that there is no current task and we shouldn't save back the registers @@ -100,6 +112,7 @@ task_switch: push eax ; EFLAGS: mov eax, [ebx + 0x24] + or eax, 0x200 push eax ; CS: xor eax, eax @@ -126,7 +139,7 @@ task_switch: mov al, 0x20 out 0x20, al - mov ax, 0x90 + mov ax, 0x93 ltr ax mov eax, [ebx + 0x28] @@ -139,5 +152,6 @@ task_switch: .ebx dd 0 .ecx dd 0 .edx dd 0 + .switchmsg db "switching to task %d", 10, 0 .msg db "EIP: %x, CS: %x, EFLAGS: %x, ESP: %x, SS: %x", 0 - .ping db "ping!", 0 \ No newline at end of file + .ping db "ping!", 0 diff --git a/ksrc/task.c b/ksrc/task.c index 83c40a2..bcca07a 100644 --- a/ksrc/task.c +++ b/ksrc/task.c @@ -9,8 +9,6 @@ #include "console.h" #include "syscall.h" -#define MAX_TASKS 16 - uint user_base; uint page_base; uint total_pages; @@ -30,11 +28,17 @@ task_t* task_current() return tasks[current_task]; } +task_t* task_get(uint pid) +{ + return tasks[pid]; +} + void task_init(uint base_physical, uint high_memory) { user_base = base_physical; page_base = base_physical / 4096; - total_pages = (base_physical - high_memory * 1024) / 4096; + total_pages = ((high_memory * 1024) - base_physical) / 4096; + kprintf("Total pages: %d\n", total_pages); pagemap = (uchar*)kmalloc(total_pages / 8); memset(pagemap, 0, total_pages / 8); @@ -80,8 +84,10 @@ void free_page(uint page) if(page < page_base || page >= total_pages + page_base) panic("Freeing non-existent page"); + page -= page_base; + if(((pagemap[page / 8] >> (page % 8)) & 1) == 0) - panic("Freeing freed page"); + panicf("Freeing freed page: %x (%x), pagemap %x", page, page << 12, pagemap[page / 8] & 0xff); pagemap[page / 8] &= ~(1 << (page % 8)); } @@ -141,8 +147,67 @@ task_t* task_create(uint size, void* code, uint stack_size) return task; } +task_t* task_dup(task_t* task) +{ + if(num_tasks == MAX_TASKS) + return NULL; + + task_t* copy = (task_t*)kmalloc(sizeof(task_t)); + memset(copy, 0, sizeof(task_t)); + + copy->page_directory = (uint*)(copy->tss.cr3 = alloc_page()); + memset(copy->page_directory, 0, 4096); + memcpy(copy->page_directory, task->page_directory, 4 /* copy only first page directory (4MB) of ram. this is what the kernel will be using */); + + for(uint dir_i = 0x10000000 / 4096 / 1024; dir_i < 1024; dir_i++) + { + if(task->page_directory[dir_i] & 1) + { + copy->page_directory[dir_i] = alloc_page() | (task->page_directory[dir_i] & 0xfff); + uint* copy_tbl = (uint*)(copy->page_directory[dir_i] & 0xfffff000); + uint* task_tbl = (uint*)(task->page_directory[dir_i] & 0xfffff000); + for(uint tbl_i = 0; tbl_i < 1024; tbl_i++) + { + if(task_tbl[tbl_i] & 1) + { + copy_tbl[tbl_i] = alloc_page() | (task_tbl[tbl_i] & 0xfff); + memcpy((uint*)(copy_tbl[tbl_i] & 0xfffff000), (uint*)(task_tbl[tbl_i] & 0xfffff000), 4096); + } + } + } + } + + copy->state = task->state; + copy->tss.ss0 = 0x10; // kernel stack segment + copy->tss.esp0 = (uint)copy->kernel_stack + 8192 - 4; + copy->tss.iopb = task->tss.iopb; // don't let it I/O anywhere + + copy->tss.cs = 0x80 | 3; + copy->tss.ds = copy->tss.ss = copy->tss.es = copy->tss.fs = copy->tss.gs = 0x88 | 3; + copy->tss.eflags = task->tss.eflags; + copy->tss.eip = task->tss.eip; + + copy->tss.esp = task->tss.esp; + + copy->exception_handler = task->exception_handler; + + // find free pid + uint pid = 0; + for(; pid < MAX_TASKS && tasks[pid] != NULL; pid++) ; + num_tasks++; + kprintf("Forked task with pid %d, parent task is %d\n", pid, task->pid); + copy->pid = pid; + tasks[pid] = copy; + + memcpy(copy->fds, task->fds, sizeof(vfs_stream_t*) * MAX_FDS); + + return copy; +} void task_kill_and_free(task_t* task) { + if(task->state == KILLED) + return; + task->state = KILLED; for(uint i = 0; i < MAX_FDS; i++) { @@ -156,22 +221,27 @@ void task_kill_and_free(task_t* task) // work through page directory starting at 0x10000000 freeing pages for(uint dir_i = 0x10000000 / 4096 / 1024; dir_i < 1024; dir_i++) { - if(!(task->page_directory[dir_i] | 1)) + if(!(task->page_directory[dir_i] & 1)) { // page directory entry not in use? skip continue; } - uint* table = (uint*)(task->page_directory[dir_i] | 0xfffff000); + uint* table = (uint*)(task->page_directory[dir_i] & 0xfffff000); for(uint tbl_i = 0; tbl_i < 1024; tbl_i++) { - if(table[tbl_i] | 1) + if(table[tbl_i] & 1) + { free_page(table[tbl_i] & 0xfffff000); + } } free_page((uint)table); } free_page((uint)task->page_directory); + tasks[task->pid] = NULL; kfree(task); + + num_tasks--; } void task_switch_isr(uint interrupt, uint error) @@ -186,45 +256,22 @@ uint task_find_next(uint t) for(uint i = 1; i <= MAX_TASKS; i++) { if(tasks[(i + t) % MAX_TASKS] != NULL && tasks[(i + t) % MAX_TASKS]->state == RUNNING) + { + //kprintf("--> %d, state: %d\n", (i + t) % MAX_TASKS, tasks[(i + t) % MAX_TASKS]->state); return (i + t) % MAX_TASKS; + } } panic("no tasks running"); return 0; } void task_install_next_tss(uint t) -{ - gdt_entry_t task_seg; - memset(&task_seg, 0, sizeof(gdt_entry_t)); - gdt_raw_entry_t task_seg_raw; - // setup TSS - task_seg.base = (uint)&tasks[t]->tss; - task_seg.limit = sizeof(tss_t); - task_seg.executable = true; - task_seg.accessed = true; - task_seg.bits32 = true; - task_seg.readwrite = false; - task_seg.privilege = 3; - gdt_encode(&task_seg, &task_seg_raw); - ((uchar*)&task_seg_raw)[5] = 0x89; // hack to set access byte. - gdt_set_entry(0x90, &task_seg_raw); -} - -/* -void task_switch() { - cli(); - for(uint i = 0; i < MAX_TASKS; i++) - { - uint next_task = (current_task + i) % MAX_TASKS; - if(tasks[next_task] != NULL) - current_task = next_task; - } gdt_entry_t task_seg; memset(&task_seg, 0, sizeof(gdt_entry_t)); gdt_raw_entry_t task_seg_raw; // setup TSS - task_seg.base = (uint)&tasks[current_task]->tss; + task_seg.base = (uint)&tasks[t]->tss; task_seg.limit = sizeof(tss_t); task_seg.executable = true; task_seg.accessed = true; @@ -234,30 +281,7 @@ void task_switch() gdt_encode(&task_seg, &task_seg_raw); ((uchar*)&task_seg_raw)[5] = 0x89; // hack to set access byte. gdt_set_entry(0x90, &task_seg_raw); - gdt_flush(); - - idt_entry_t syscall; - idt_entry_factory(&syscall, 0x30, 0, 0, GATE_TASK_32); -// idt_set_gate(0x80, ) - - kprintf("TSS ESP: %x, TSS SS: %x, TSS CS: %x, TSS EIP: %x\n", tasks[current_task]->tss.esp, tasks[current_task]->tss.ss, tasks[current_task]->tss.cs, tasks[current_task]->tss.eip); - - __asm__ volatile("push %0" :: "r"((uint)tasks[current_task]->tss.ss)); - __asm__ volatile("push %0" :: "r"(tasks[current_task]->tss.esp)); - __asm__ volatile("push %0" :: "r"(tasks[current_task]->tss.eflags | 0x200)); - __asm__ volatile("push %0" :: "r"((uint)tasks[current_task]->tss.cs)); - __asm__ volatile("push %0" :: "r"(tasks[current_task]->tss.eip)); - __asm__ volatile(" cli \n\ - mov eax, %0 \n\ - mov cr3, eax \n\ - mov ax, 0x90 \n\ - ltr ax \n\ - mov al, 0x20 \n\ - out 0x20, al \n\ - iret \n\ - " :: "r"(tasks[current_task]->page_directory)); } -*/ void task_peek(task_t* task, uint virtual, uint length, void* buffer) { @@ -266,4 +290,4 @@ void task_peek(task_t* task, uint virtual, uint length, void* buffer) { ((char*)buffer)[i] = *(char*)paging_virtual_to_physical(task->page_directory, virtual + i); } -} \ No newline at end of file +} diff --git a/ksrc/trap.c b/ksrc/trap.c index 06d8b97..740565a 100644 --- a/ksrc/trap.c +++ b/ksrc/trap.c @@ -3,6 +3,7 @@ #include "stddef.h" #include "idt.h" #include "panic.h" +#include "task.h" static char* traps[] = { "Divide by zero", @@ -38,16 +39,20 @@ static char* traps[] = { "Security Exception" }; +extern uint multitasking_enabled; static void trap_handler(uint interrupt, uint error) { - uint a = 1 / 0; uint cr2; __asm__("mov eax, cr2" : "=a"(cr2)); - kprintf("TRAP: %s, %d\n", traps[interrupt], interrupt == 14 ? cr2 : error); + if(multitasking_enabled) + { + uint retn_addr = *(uint*)(task_current()->tss.esp0 - 5*4); + *(uint*)(task_current()->tss.esp0 - 5*4) = task_current()->exception_handler; + } } void trap_init() { for(uint i = 0; i < 31; i++) subscribe_isr(i, trap_handler); -} \ No newline at end of file +} diff --git a/ksrc/util.c b/ksrc/util.c index c88b188..8831d09 100644 --- a/ksrc/util.c +++ b/ksrc/util.c @@ -13,25 +13,9 @@ char* cpuid(char* buffer) return buffer; } -char* get_symtable_addr(); - -function_pointer_t function_by_name(char* name) -{ - symbol_t* symbols = (symbol_t*)(get_symtable_addr() + 16); - - for(int i = 0; i < 2048; i++) - { - if(!symbols[i].addr) - return NULL; - if(strcmp(symbols[i].name, name) == 0) - return (function_pointer_t)symbols[i].addr; - } - return NULL; -} - void sleep(uint ms) { // @TODO // sleep for how many ms for(uint i = 0; i < ms*5000; i++) ; -} \ No newline at end of file +} diff --git a/ubin/init.o b/ubin/init.o new file mode 100644 index 0000000000000000000000000000000000000000..ace7303c1a89cfedad7a884b3f79400fc8520bb8 GIT binary patch literal 928 zcma)4O-my|5Uoj~W_J-kP*_mdUWlSd8o?}xH;JFHEO^LGkV!J?;CzIc4!e8u;KhJH z#-qsIJnjG31rHwdF2s71E*!mRLGkKUy{hT1>C?^cTaM$9m_tQ+W<(`RYMEexK2ez( zz5i$b?$7SVZy)>p{xvGSjY_FERml=pNc_Da+VO%QRzKq;Xsg2{4wWDI=BwIOZm2p* z-15>?McuIJC2MM~{gG(9USCrSjb=A8T~*UHy;7}pGxlw9z=?GFJ2Y;S(If*rmMHN8 zZM1LXePT~P+#bM}0T#I7k>FpnlYHHlp3C{Xn`@%x3W7sxeC-XK2lx#f1 z_`$}2^CHn_n?pZzW%fCCa4u)IZ&5(zEpY<+w{**_!Mp-H4D*l^lXP!7gV5hi(snHPHd(Y$*L<0xkdf?0z`kI6HQipBFHh<(!zz6E2v~ zm*}A{dEm=e4W9o3xNK+8RivSOJJ&~E@!{;uNa77l@ typedef unsigned int uint; +//extern uint stdin; +//extern uint stdout; +//extern uint stderr; + void* alloc_page(); +void* alloc_pages(uint n); void free_page(void* page); void exit(int status); @@ -20,4 +24,4 @@ uint read(uint fd, void* buff, uint len); uint open(char* path); void close(uint fd); -#endif \ No newline at end of file +#endif diff --git a/user/crt.a b/user/crt.a new file mode 100644 index 0000000000000000000000000000000000000000..98707167871e8c973dac9cc7fff05770c1924975 GIT binary patch literal 4596 zcmeHLPiP!v6n~qfX%eE18vo(J2}Ih8nQW3xVy#FqPKyvVkPZlKm`r9T*){to%ubpF zEZw?-EF*aF}AVdaFf}LkuWpyl5R;JQxQ3ZatJ!eL z!P>8Xq4A`V2~T=Be9r|MuMfD?zo|iUyMW|yx;*vsG0T=(S^_+^W_;j$^HL^ z5ECp$PcwK@3e*znCquv15a-$Ncge3S)E{9fV!^b~L^KfgL0~S>)6Cpeqpul6x$^{D zFc;=U%;%ZqcpD79Wt$)o?=&0Qg^}eK9Dui~9|!XwUK_I@JrnGSxT1+&qKZDqgu+eb zJ~ublFt)P0x3@P@d56{C{$h2qf~O4nR`ueq2`pNInG$%U$^yVf23;nq#J09H0 z_`Xg4w^C|OO%!FlPr?^#I+O@KAz|#3Y39qJt&8K$vwl^=i>z}R@(KMPuy#$tAF=+S zgg;^ZV+nuCIv9lUpRxSPM*;qv_1hBulJy@Y4Bww6Op7_&>E{g5Z{@N%mD2>J&18lQ z!!ehPf5=>h)u>fX=jM(y!{IgXeIvYUA7k0X+j0aL+d3rVKC71bIJX5==Fr?X8s!A& z)5CM$ci|i&_q9_i@e!OXRJ%Q`t*C8!T4zz)^0cm^R`Im%qE;=ebzhlU#kfmjW3MP@ z^qIwsyQsv}m^#!KTlCTJ*#PrdsNePb=OH*B!C9Hf9n2UGn2`>wtDGpy)WmQ z7Peo*^c;I)Jw+iNW>FZ zNZH;(SN*cT;g|jLy0(dZwXSUi zVh0h{wOydX^(w7&Z%#ZG6+dXxQJ@0th&bGZ7 zxmWz*`_=!(lKRY<7IpdMx{q^QkR7$p*Z_4km&{Oa!^@avW0VJ>j}J){dpi3F^_ nhrq9qd&unu?;#iX#W9BxQB>;AUggAU^Uiy literal 0 HcmV?d00001 diff --git a/user/crt.o b/user/crt.o new file mode 100644 index 0000000000000000000000000000000000000000..a85e5a638b53b6aad7d930382de3e968e4cc9c97 GIT binary patch literal 1216 zcmbVKJ%|%g5T1>vcghJ7@uxFIKpXc?kgG+_fe zu$Ql)E7j8z2N=(#V}KO9;U=!wiRvd}$9|kdiF+65K_|00k5rK5WV`;l>VILvocx%W zi3cZ{|67>;RcV$~kY(V@249_F0!vOCoO7}XUCVt%)N2E87_n|ZNu=C{ggw<2F9>5LhtI-m@P92#?J3v-#&U(6W1Y)yEatxT literal 0 HcmV?d00001 diff --git a/user/crt/crt_asm.o b/user/crt/crt_asm.o new file mode 100644 index 0000000000000000000000000000000000000000..1287560015b9deb6f0098489fa9176fdce3800aa GIT binary patch literal 1360 zcmbVLziSjh6n=Z2CQ5`8@kga8PD~-2DE(;y6#T0OZIlp*$Futy_9;r zSf;eGv05xtxY!86M*jgpJv*%x&+qN-#0deBJeYak_r5o8em`t9uUnQy+AKOie;Lty zDO}F|3{61ak8w?Idh{KT6GowGi6_duLnZGc@3)axEAdfyU5i8g3em+MFLj~)FQkH@W%2l(wLAbh?TJwNmIh*w_Z4;LSO4)`DgRsv2N zwa{&BP3`cLKp89B{b4)fRSs^~C%5}cL-=aO+s+l9Un?0O5TY4hM6U9jtPYy>slly! zjmNh$-s|2dpOCK9&W`M2ye_Q)+PxOe#NuspR)v<(UtySAh3;vXdy9@6oZk)K{d5_tVf-23y1~x@&lvmy zFgG^NzXU&*vw{zR^Q$cNC-7ZE-voYO@aMpf4gLc7sli_YZyNkH@H2zI1%74lcfcPE z{vP;~!9N0jH#n`OLe6?p&3b8)+HTsRjvL05D!=HHHN`|oNoa9Gj+1*QN<5dp0|L@r zcZB{PPVr$R;@0eVHDAdP);}WX*rRr pv@Sy>ND9}dq$^_bq9hfxcP-_P%fE;pa}1FRzQj#j>! zgAc>J_#*o3gFdbx$l`)K7N$$$@JIkOH^f zq}pTsbybgVH)h;={9GfB`MOtE+LOSf9C!EiYAL=O`mR!*|R_OkcY+u!mP-q~e5 zY}H$W70O?>AoWsGH$*)mLAdu0SBBBJdnlu?j3l>{P&IY&cJpi9o|Ot04CQQz_@zHF zw;R{_ft}ged1htJ+^-az%F3p(X`J5JtVs6cddP{4axL$q_km6+#0y#~SvkY8-gL;w zrkyky`{gnj89Sf13eXj7$1={mVs4b3bmk4d?rzsZaOBcwQ~-bT&#LdARZ~j;AaGX6 z4DmS86O7m#&weaFqPR}sXaRa&I^W}v**9=(CNo?;j^IeL1UPs`ad`vLnNOo;nt`5na{0KSSMs*3YWZ-S>3H-PIHz_Q{` z0Y!vA2c8DUSY-Y^-~sry;^%;R@tn?Me++v9$n_L}da>QX{u1^%AlqHwH{kaw{vJ>- z_J1Gy7uX*Lvj0cg2xR*w*g+)U=ioCKqt5>|`+;u&IsRv$UK~%EvRyVZluBg}FJ=!< zL&)3NP^gSl6{U0RoL#j_ zi^5au4i0ja@`X{DU9<`$5A9I0(pi$nSd+IeTBDGXRY>Q@G@U~k#q{e|nWUIv8GpZ+ e&%^@JXN-73eq>xC`kV1SqWdwQ3A`w43jYD+f+DK` literal 0 HcmV?d00001 diff --git a/user/crt/csos.asm b/user/crt/csos.asm index b429dd2..7bf5aca 100644 --- a/user/crt/csos.asm +++ b/user/crt/csos.asm @@ -1,22 +1,70 @@ extern main -global alloc_page ; vec 0x01 -global free_page ; vec 0x02 -global exit ; vec 0x03 -global kill ; vec 0x04 +;;;; syscalls -global get_pid ; vec 0x05 -global fork ; vec 0x06 -global write ; vec 0x07 -global read ; vec 0x08 +global alloc_page ; vec 0x01 +global free_page ; vec 0x02 +global _PDCLIB_Exit ; vec 0x03 +global kill ; vec 0x04 -global open ; vec 0x09 -global close ; vec 0x0a +global get_pid ; vec 0x05 +global fork ; vec 0x06 +global write ; vec 0x07 +global read ; vec 0x08 + +global open ; vec 0x09 +global close ; vec 0x0a + +global exception_handler ; vec 0x0c + +;;;; support for pdclib +global stdin +global stdout +global stderr +global __divdi3 +global errno +global __errno_location + +push __raw_exception_handler +call exception_handler +add esp, 4 call main -call exit +push eax +call _PDCLIB_Exit jmp $ +stdin dd 0 +stdout dd 1 +stderr dd 1 ; @TODO fix this to have stderr be its own fd +errno dd 0 +__errno_location dd 0 + +__raw_exception_handler: + push ebx + call __c_exception_handler + add esp, 4 + ret + +__c_exception_handler: + push ebp + mov ebp, esp + + push dword 21 + push .msg + push dword 1 + call write + add esp, 12 + + push dword 1 + call _PDCLIB_Exit + +section .data + align 16 + .msg db "Unhandled Exception.", 0 + +section .text + alloc_page: mov eax, 0x01 int 0x80 @@ -30,7 +78,8 @@ free_page: pop ebx ret -exit: +_PDCLIB_Exit: + mov ebx, [esp+4] mov eax, 0x03 int 0x80 ret @@ -88,4 +137,12 @@ close: int 0x80 pop ebx ret - \ No newline at end of file + +exception_handler: + push ebx + mov eax, 0x0c + mov ebx, [esp+8] + int 0x80 + pop ebx + ret + diff --git a/user/crt/csos.c b/user/crt/csos.c new file mode 100644 index 0000000..5b3612a --- /dev/null +++ b/user/crt/csos.c @@ -0,0 +1,147 @@ +#include +#include <_PDCLIB_glue.h> + +// @TODO IMPROVE THESE FUNCTIONS +// THEY ARE SHIT SLOW +// @TODO @TODO @TODO @TODO + +long long __divdi3(long long numerator, long long denominator) +{ + if(denominator == 0) + return 0; + + long long result = 0; + long long sign = 1; + if(numerator < 0) + { + numerator = -numerator; + sign = -sign; + } + if(denominator < 0) + { + denominator = -denominator; + sign = -sign; + } + while(numerator > denominator) + { + numerator -= denominator; + result++; + } + + return result * sign; +} + +long long __moddi3(long long numerator, long long denominator) +{ + if(denominator == 0) + return 0; + + if(numerator < 0) + numerator = -numerator; + if(denominator < 0) + denominator = -denominator; + + while(numerator > denominator) + { + numerator -= denominator; + } + + return numerator; +} + +long long __udivdi3(unsigned long long numerator, unsigned long long denominator) +{ + if(denominator == 0) + return 0; + + long long result = 0; + while(numerator > denominator) + { + numerator -= denominator; + result++; + } + + return result; +} + +long long __umoddi3(unsigned long long numerator, unsigned long long denominator) +{ + if(denominator == 0) + return 0; + + while(numerator > denominator) + { + numerator -= denominator; + } + + return numerator; +} + +int tolower(int c) +{ + if(c >= 'A' || c <= 'Z') + return c - 'A' + 'a'; + return c; +} +int toupper(int c) +{ + if(c >= 'a' || c <= 'z') + return c - 'a' + 'A'; + return c; +} + +void __ctype_b_loc() +{ + // lmao should never happen +} + +int _PDCLIB_write( struct _PDCLIB_file_t * stream, char const* buffer, int n ) +{ + int rc; + if ( ( rc = write( stream->handle, (char*)buffer, (uint)n ) ) == -1 ) + { + /* Error encountered */ + stream->status |= _PDCLIB_ERRORFLAG; + /* FIXME: Map the errno of the OS to PDCLib's errno */ + } + return rc; +} + +int _PDCLIB_close( int fd ) +{ + close( fd ); + return 0; +} + +int _PDCLIB_fflush( __attribute__((unused)) struct _PDCLIB_file_t * stream ) +{ + // @TODO + return 0; +} +int _PDCLIB_open( char const * const filename, __attribute__((unused)) unsigned int mode ) +{ + return open((char*)filename); +} +_PDCLIB_size_t _PDCLIB_read( int fd, char * buffer, _PDCLIB_size_t n ) +{ + return read( fd, buffer, n ); +} +int _PDCLIB_remove( __attribute__((unused)) const char * filename ) +{ + // @TODO + return -1; +} +int _PDCLIB_rename( __attribute__((unused)) const char * old, __attribute__((unused)) const char * new ) +{ + // @TODO + return -1; +} +void * _PDCLIB_allocpages( int const n ) +{ + // so this relies on allocpages returning some contiguous pages. + // i'll fix this later. + uint* start = alloc_page(); + for(int i = 1; i < n; i++) + alloc_page(); + return start; +} diff --git a/user/init.c b/user/init.c index f39274b..dd4a953 100644 --- a/user/init.c +++ b/user/init.c @@ -1,17 +1,12 @@ #include - -uint strlen(char* str) -{ - uint len = 0; - while(*str++) - len++; - return len; -} +#include +#include int main() { + /* char* msg = "Hello world from init! I am process number: "; - write(stdout, "Hello world from init! I am process number: ", strlen(msg)); + write(stdout, msg, strlen(msg)); uint pid = get_pid(); char buff[16]; @@ -25,4 +20,10 @@ int main() } while(pid != 0); write(stdout, bptr, len); -} \ No newline at end of file + write(stdout, "\n", 1); + +// write(stdout, &pid, 1); + */ + + printf("Hello world from init! I am process number: %d\n", get_pid()); +} diff --git a/user/lua-5.1.4.tar.gz b/user/lua-5.1.4.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..2a9f50f9464b68af628c4852456bd13f491ea47e GIT binary patch literal 216679 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

F~I19c@bIGd5$w^C`UAJW0!8F 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 b)M@9Pc;4WH3w-wJ=bwNED(Iksh5!INDePJ9 literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/doc/contents.html b/user/lua-5.1.4/doc/contents.html new file mode 100644 index 0000000..8e58e18 --- /dev/null +++ b/user/lua-5.1.4/doc/contents.html @@ -0,0 +1,499 @@ + + + +Lua 5.1 Reference Manual - contents + + + + + + + +


+

+ +Lua 5.1 Reference Manual +

+ +This is an online version of +
+ + + +Lua 5.1 Reference Manual +
by R. Ierusalimschy, L. H. de Figueiredo, W. Celes +
Lua.org, August 2006 +
ISBN 85-903798-3-3 +
+[Buy from Amazon] +
+
+

+ +Buy a copy of this book and +help to support +the Lua project. +

+ +The reference manual is the official definition of the Lua language. +For a complete introduction to Lua programming, see the book +Programming in Lua. +

+ +start +· +contents +· +index +· +português +· +español +


+ +Copyright © 2006-2008 Lua.org, PUC-Rio. +Freely available under the terms of the +Lua license. + +

+ +

Contents

+ + +

Index

+ + + + + + + +
+

Lua functions

+_G
+_VERSION
+assert
+collectgarbage
+dofile
+error
+getfenv
+getmetatable
+ipairs
+load
+loadfile
+loadstring
+module
+next
+pairs
+pcall
+print
+rawequal
+rawget
+rawset
+require
+select
+setfenv
+setmetatable
+tonumber
+tostring
+type
+unpack
+xpcall
+

+ +coroutine.create
+coroutine.resume
+coroutine.running
+coroutine.status
+coroutine.wrap
+coroutine.yield
+

+ +debug.debug
+debug.getfenv
+debug.gethook
+debug.getinfo
+debug.getlocal
+debug.getmetatable
+debug.getregistry
+debug.getupvalue
+debug.setfenv
+debug.sethook
+debug.setlocal
+debug.setmetatable
+debug.setupvalue
+debug.traceback
+ +

+

 

+file:close
+file:flush
+file:lines
+file:read
+file:seek
+file:setvbuf
+file:write
+

+ +io.close
+io.flush
+io.input
+io.lines
+io.open
+io.output
+io.popen
+io.read
+io.stderr
+io.stdin
+io.stdout
+io.tmpfile
+io.type
+io.write
+

+ +math.abs
+math.acos
+math.asin
+math.atan
+math.atan2
+math.ceil
+math.cos
+math.cosh
+math.deg
+math.exp
+math.floor
+math.fmod
+math.frexp
+math.huge
+math.ldexp
+math.log
+math.log10
+math.max
+math.min
+math.modf
+math.pi
+math.pow
+math.rad
+math.random
+math.randomseed
+math.sin
+math.sinh
+math.sqrt
+math.tan
+math.tanh
+

+ +os.clock
+os.date
+os.difftime
+os.execute
+os.exit
+os.getenv
+os.remove
+os.rename
+os.setlocale
+os.time
+os.tmpname
+

+ +package.cpath
+package.loaded
+package.loaders
+package.loadlib
+package.path
+package.preload
+package.seeall
+

+ +string.byte
+string.char
+string.dump
+string.find
+string.format
+string.gmatch
+string.gsub
+string.len
+string.lower
+string.match
+string.rep
+string.reverse
+string.sub
+string.upper
+

+ +table.concat
+table.insert
+table.maxn
+table.remove
+table.sort
+ +

+

C API

+lua_Alloc
+lua_CFunction
+lua_Debug
+lua_Hook
+lua_Integer
+lua_Number
+lua_Reader
+lua_State
+lua_Writer
+

+ +lua_atpanic
+lua_call
+lua_checkstack
+lua_close
+lua_concat
+lua_cpcall
+lua_createtable
+lua_dump
+lua_equal
+lua_error
+lua_gc
+lua_getallocf
+lua_getfenv
+lua_getfield
+lua_getglobal
+lua_gethook
+lua_gethookcount
+lua_gethookmask
+lua_getinfo
+lua_getlocal
+lua_getmetatable
+lua_getstack
+lua_gettable
+lua_gettop
+lua_getupvalue
+lua_insert
+lua_isboolean
+lua_iscfunction
+lua_isfunction
+lua_islightuserdata
+lua_isnil
+lua_isnone
+lua_isnoneornil
+lua_isnumber
+lua_isstring
+lua_istable
+lua_isthread
+lua_isuserdata
+lua_lessthan
+lua_load
+lua_newstate
+lua_newtable
+lua_newthread
+lua_newuserdata
+lua_next
+lua_objlen
+lua_pcall
+lua_pop
+lua_pushboolean
+lua_pushcclosure
+lua_pushcfunction
+lua_pushfstring
+lua_pushinteger
+lua_pushlightuserdata
+lua_pushliteral
+lua_pushlstring
+lua_pushnil
+lua_pushnumber
+lua_pushstring
+lua_pushthread
+lua_pushvalue
+lua_pushvfstring
+lua_rawequal
+lua_rawget
+lua_rawgeti
+lua_rawset
+lua_rawseti
+lua_register
+lua_remove
+lua_replace
+lua_resume
+lua_setallocf
+lua_setfenv
+lua_setfield
+lua_setglobal
+lua_sethook
+lua_setlocal
+lua_setmetatable
+lua_settable
+lua_settop
+lua_setupvalue
+lua_status
+lua_toboolean
+lua_tocfunction
+lua_tointeger
+lua_tolstring
+lua_tonumber
+lua_topointer
+lua_tostring
+lua_tothread
+lua_touserdata
+lua_type
+lua_typename
+lua_upvalueindex
+lua_xmove
+lua_yield
+ +

+

auxiliary library

+luaL_Buffer
+luaL_Reg
+

+ +luaL_addchar
+luaL_addlstring
+luaL_addsize
+luaL_addstring
+luaL_addvalue
+luaL_argcheck
+luaL_argerror
+luaL_buffinit
+luaL_callmeta
+luaL_checkany
+luaL_checkint
+luaL_checkinteger
+luaL_checklong
+luaL_checklstring
+luaL_checknumber
+luaL_checkoption
+luaL_checkstack
+luaL_checkstring
+luaL_checktype
+luaL_checkudata
+luaL_dofile
+luaL_dostring
+luaL_error
+luaL_getmetafield
+luaL_getmetatable
+luaL_gsub
+luaL_loadbuffer
+luaL_loadfile
+luaL_loadstring
+luaL_newmetatable
+luaL_newstate
+luaL_openlibs
+luaL_optint
+luaL_optinteger
+luaL_optlong
+luaL_optlstring
+luaL_optnumber
+luaL_optstring
+luaL_prepbuffer
+luaL_pushresult
+luaL_ref
+luaL_register
+luaL_typename
+luaL_typerror
+luaL_unref
+luaL_where
+ +

+

+ +


+ +Last update: +Sat Jan 19 13:24:29 BRST 2008 + + + + + diff --git a/user/lua-5.1.4/doc/cover.png b/user/lua-5.1.4/doc/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..2dbb198123f03a7250bfa57c8253739962d69afb GIT binary patch literal 3305 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 literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/doc/logo.gif b/user/lua-5.1.4/doc/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..2f5e4ac2e742fbb7675e739879211553758aea9c GIT binary patch literal 4232 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 PWz_J}_#7St0k8iB@FZjZ literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/doc/lua.1 b/user/lua-5.1.4/doc/lua.1 new file mode 100644 index 0000000..24809cc --- /dev/null +++ b/user/lua-5.1.4/doc/lua.1 @@ -0,0 +1,163 @@ +.\" $Id: lua.man,v 1.11 2006/01/06 16:03:34 lhf Exp $ +.TH LUA 1 "$Date: 2006/01/06 16:03:34 $" +.SH NAME +lua \- Lua interpreter +.SH SYNOPSIS +.B lua +[ +.I options +] +[ +.I script +[ +.I args +] +] +.SH DESCRIPTION +.B lua +is the stand-alone Lua interpreter. +It loads and executes Lua programs, +either in textual source form or +in precompiled binary form. +(Precompiled binaries are output by +.BR luac , +the Lua compiler.) +.B lua +can be used as a batch interpreter and also interactively. +.LP +The given +.I options +(see below) +are executed and then +the Lua program in file +.I script +is loaded and executed. +The given +.I args +are available to +.I script +as strings in a global table named +.BR arg . +If these arguments contain spaces or other characters special to the shell, +then they should be quoted +(but note that the quotes will be removed by the shell). +The arguments in +.B arg +start at 0, +which contains the string +.RI ' script '. +The index of the last argument is stored in +.BR arg.n . +The arguments given in the command line before +.IR script , +including the name of the interpreter, +are available in negative indices in +.BR arg . +.LP +At the very start, +before even handling the command line, +.B lua +executes the contents of the environment variable +.BR LUA_INIT , +if it is defined. +If the value of +.B LUA_INIT +is of the form +.RI '@ filename ', +then +.I filename +is executed. +Otherwise, the string is assumed to be a Lua statement and is executed. +.LP +Options start with +.B '\-' +and are described below. +You can use +.B "'\--'" +to signal the end of options. +.LP +If no arguments are given, +then +.B "\-v \-i" +is assumed when the standard input is a terminal; +otherwise, +.B "\-" +is assumed. +.LP +In interactive mode, +.B lua +prompts the user, +reads lines from the standard input, +and executes them as they are read. +If a line does not contain a complete statement, +then a secondary prompt is displayed and +lines are read until a complete statement is formed or +a syntax error is found. +So, one way to interrupt the reading of an incomplete statement is +to force a syntax error: +adding a +.B ';' +in the middle of a statement is a sure way of forcing a syntax error +(except inside multiline strings and comments; these must be closed explicitly). +If a line starts with +.BR '=' , +then +.B lua +displays the values of all the expressions in the remainder of the +line. The expressions must be separated by commas. +The primary prompt is the value of the global variable +.BR _PROMPT , +if this value is a string; +otherwise, the default prompt is used. +Similarly, the secondary prompt is the value of the global variable +.BR _PROMPT2 . +So, +to change the prompts, +set the corresponding variable to a string of your choice. +You can do that after calling the interpreter +or on the command line +(but in this case you have to be careful with quotes +if the prompt string contains a space; otherwise you may confuse the shell.) +The default prompts are "> " and ">> ". +.SH OPTIONS +.TP +.B \- +load and execute the standard input as a file, +that is, +not interactively, +even when the standard input is a terminal. +.TP +.BI \-e " stat" +execute statement +.IR stat . +You need to quote +.I stat +if it contains spaces, quotes, +or other characters special to the shell. +.TP +.B \-i +enter interactive mode after +.I script +is executed. +.TP +.BI \-l " name" +call +.BI require(' name ') +before executing +.IR script . +Typically used to load libraries. +.TP +.B \-v +show version information. +.SH "SEE ALSO" +.BR luac (1) +.br +http://www.lua.org/ +.SH DIAGNOSTICS +Error messages should be self explanatory. +.SH AUTHORS +R. Ierusalimschy, +L. H. de Figueiredo, +and +W. Celes +.\" EOF diff --git a/user/lua-5.1.4/doc/lua.css b/user/lua-5.1.4/doc/lua.css new file mode 100644 index 0000000..039cf11 --- /dev/null +++ b/user/lua-5.1.4/doc/lua.css @@ -0,0 +1,41 @@ +body { + color: #000000 ; + background-color: #FFFFFF ; + font-family: sans-serif ; + text-align: justify ; + margin-right: 20px ; + margin-left: 20px ; +} + +h1, h2, h3, h4 { + font-weight: normal ; + font-style: italic ; +} + +a:link { + color: #000080 ; + background-color: inherit ; + text-decoration: none ; +} + +a:visited { + background-color: inherit ; + text-decoration: none ; +} + +a:link:hover, a:visited:hover { + color: #000080 ; + background-color: #E0E0FF ; +} + +a:link:active, a:visited:active { + color: #FF0000 ; +} + +hr { + border: 0 ; + height: 1px ; + color: #a0a0a0 ; + background-color: #a0a0a0 ; +} + diff --git a/user/lua-5.1.4/doc/lua.html b/user/lua-5.1.4/doc/lua.html new file mode 100644 index 0000000..1d435ab --- /dev/null +++ b/user/lua-5.1.4/doc/lua.html @@ -0,0 +1,172 @@ + + + +LUA man page + + + + + +

NAME

+lua - Lua interpreter +

SYNOPSIS

+lua +[ +options +] +[ +script +[ +args +] +] +

DESCRIPTION

+lua +is the stand-alone Lua interpreter. +It loads and executes Lua programs, +either in textual source form or +in precompiled binary form. +(Precompiled binaries are output by +luac, +the Lua compiler.) +lua +can be used as a batch interpreter and also interactively. +

+The given +options +(see below) +are executed and then +the Lua program in file +script +is loaded and executed. +The given +args +are available to +script +as strings in a global table named +arg. +If these arguments contain spaces or other characters special to the shell, +then they should be quoted +(but note that the quotes will be removed by the shell). +The arguments in +arg +start at 0, +which contains the string +'script'. +The index of the last argument is stored in +arg.n. +The arguments given in the command line before +script, +including the name of the interpreter, +are available in negative indices in +arg. +

+At the very start, +before even handling the command line, +lua +executes the contents of the environment variable +LUA_INIT, +if it is defined. +If the value of +LUA_INIT +is of the form +'@filename', +then +filename +is executed. +Otherwise, the string is assumed to be a Lua statement and is executed. +

+Options start with +'-' +and are described below. +You can use +'--' +to signal the end of options. +

+If no arguments are given, +then +"-v -i" +is assumed when the standard input is a terminal; +otherwise, +"-" +is assumed. +

+In interactive mode, +lua +prompts the user, +reads lines from the standard input, +and executes them as they are read. +If a line does not contain a complete statement, +then a secondary prompt is displayed and +lines are read until a complete statement is formed or +a syntax error is found. +So, one way to interrupt the reading of an incomplete statement is +to force a syntax error: +adding a +';' +in the middle of a statement is a sure way of forcing a syntax error +(except inside multiline strings and comments; these must be closed explicitly). +If a line starts with +'=', +then +lua +displays the values of all the expressions in the remainder of the +line. The expressions must be separated by commas. +The primary prompt is the value of the global variable +_PROMPT, +if this value is a string; +otherwise, the default prompt is used. +Similarly, the secondary prompt is the value of the global variable +_PROMPT2. +So, +to change the prompts, +set the corresponding variable to a string of your choice. +You can do that after calling the interpreter +or on the command line +(but in this case you have to be careful with quotes +if the prompt string contains a space; otherwise you may confuse the shell.) +The default prompts are "> " and ">> ". +

OPTIONS

+

+- +load and execute the standard input as a file, +that is, +not interactively, +even when the standard input is a terminal. +

+-e stat +execute statement +stat. +You need to quote +stat +if it contains spaces, quotes, +or other characters special to the shell. +

+-i +enter interactive mode after +script +is executed. +

+-l name +call +require('name') +before executing +script. +Typically used to load libraries. +

+-v +show version information. +

SEE ALSO

+luac(1) +
+http://www.lua.org/ +

DIAGNOSTICS

+Error messages should be self explanatory. +

AUTHORS

+R. Ierusalimschy, +L. H. de Figueiredo, +and +W. Celes + + + diff --git a/user/lua-5.1.4/doc/luac.1 b/user/lua-5.1.4/doc/luac.1 new file mode 100644 index 0000000..d814678 --- /dev/null +++ b/user/lua-5.1.4/doc/luac.1 @@ -0,0 +1,136 @@ +.\" $Id: luac.man,v 1.28 2006/01/06 16:03:34 lhf Exp $ +.TH LUAC 1 "$Date: 2006/01/06 16:03:34 $" +.SH NAME +luac \- Lua compiler +.SH SYNOPSIS +.B luac +[ +.I options +] [ +.I filenames +] +.SH DESCRIPTION +.B luac +is the Lua compiler. +It translates programs written in the Lua programming language +into binary files that can be later loaded and executed. +.LP +The main advantages of precompiling chunks are: +faster loading, +protecting source code from accidental user changes, +and +off-line syntax checking. +.LP +Pre-compiling does not imply faster execution +because in Lua chunks are always compiled into bytecodes before being executed. +.B luac +simply allows those bytecodes to be saved in a file for later execution. +.LP +Pre-compiled chunks are not necessarily smaller than the corresponding source. +The main goal in pre-compiling is faster loading. +.LP +The binary files created by +.B luac +are portable only among architectures with the same word size and byte order. +.LP +.B luac +produces a single output file containing the bytecodes +for all source files given. +By default, +the output file is named +.BR luac.out , +but you can change this with the +.B \-o +option. +.LP +In the command line, +you can mix +text files containing Lua source and +binary files containing precompiled chunks. +This is useful to combine several precompiled chunks, +even from different (but compatible) platforms, +into a single precompiled chunk. +.LP +You can use +.B "'\-'" +to indicate the standard input as a source file +and +.B "'\--'" +to signal the end of options +(that is, +all remaining arguments will be treated as files even if they start with +.BR "'\-'" ). +.LP +The internal format of the binary files produced by +.B luac +is likely to change when a new version of Lua is released. +So, +save the source files of all Lua programs that you precompile. +.LP +.SH OPTIONS +Options must be separate. +.TP +.B \-l +produce a listing of the compiled bytecode for Lua's virtual machine. +Listing bytecodes is useful to learn about Lua's virtual machine. +If no files are given, then +.B luac +loads +.B luac.out +and lists its contents. +.TP +.BI \-o " file" +output to +.IR file , +instead of the default +.BR luac.out . +(You can use +.B "'\-'" +for standard output, +but not on platforms that open standard output in text mode.) +The output file may be a source file because +all files are loaded before the output file is written. +Be careful not to overwrite precious files. +.TP +.B \-p +load files but do not generate any output file. +Used mainly for syntax checking and for testing precompiled chunks: +corrupted files will probably generate errors when loaded. +Lua always performs a thorough integrity test on precompiled chunks. +Bytecode that passes this test is completely safe, +in the sense that it will not break the interpreter. +However, +there is no guarantee that such code does anything sensible. +(None can be given, because the halting problem is unsolvable.) +If no files are given, then +.B luac +loads +.B luac.out +and tests its contents. +No messages are displayed if the file passes the integrity test. +.TP +.B \-s +strip debug information before writing the output file. +This saves some space in very large chunks, +but if errors occur when running a stripped chunk, +then the error messages may not contain the full information they usually do. +For instance, +line numbers and names of local variables are lost. +.TP +.B \-v +show version information. +.SH FILES +.TP 15 +.B luac.out +default output file +.SH "SEE ALSO" +.BR lua (1) +.br +http://www.lua.org/ +.SH DIAGNOSTICS +Error messages should be self explanatory. +.SH AUTHORS +L. H. de Figueiredo, +R. Ierusalimschy and +W. Celes +.\" EOF diff --git a/user/lua-5.1.4/doc/luac.html b/user/lua-5.1.4/doc/luac.html new file mode 100644 index 0000000..179ffe8 --- /dev/null +++ b/user/lua-5.1.4/doc/luac.html @@ -0,0 +1,145 @@ + + + +LUAC man page + + + + + +

NAME

+luac - Lua compiler +

SYNOPSIS

+luac +[ +options +] [ +filenames +] +

DESCRIPTION

+luac +is the Lua compiler. +It translates programs written in the Lua programming language +into binary files that can be later loaded and executed. +

+The main advantages of precompiling chunks are: +faster loading, +protecting source code from accidental user changes, +and +off-line syntax checking. +

+Precompiling does not imply faster execution +because in Lua chunks are always compiled into bytecodes before being executed. +luac +simply allows those bytecodes to be saved in a file for later execution. +

+Precompiled chunks are not necessarily smaller than the corresponding source. +The main goal in precompiling is faster loading. +

+The binary files created by +luac +are portable only among architectures with the same word size and byte order. +

+luac +produces a single output file containing the bytecodes +for all source files given. +By default, +the output file is named +luac.out, +but you can change this with the +-o +option. +

+In the command line, +you can mix +text files containing Lua source and +binary files containing precompiled chunks. +This is useful because several precompiled chunks, +even from different (but compatible) platforms, +can be combined into a single precompiled chunk. +

+You can use +'-' +to indicate the standard input as a source file +and +'--' +to signal the end of options +(that is, +all remaining arguments will be treated as files even if they start with +'-'). +

+The internal format of the binary files produced by +luac +is likely to change when a new version of Lua is released. +So, +save the source files of all Lua programs that you precompile. +

+

OPTIONS

+Options must be separate. +

+-l +produce a listing of the compiled bytecode for Lua's virtual machine. +Listing bytecodes is useful to learn about Lua's virtual machine. +If no files are given, then +luac +loads +luac.out +and lists its contents. +

+-o file +output to +file, +instead of the default +luac.out. +(You can use +'-' +for standard output, +but not on platforms that open standard output in text mode.) +The output file may be a source file because +all files are loaded before the output file is written. +Be careful not to overwrite precious files. +

+-p +load files but do not generate any output file. +Used mainly for syntax checking and for testing precompiled chunks: +corrupted files will probably generate errors when loaded. +Lua always performs a thorough integrity test on precompiled chunks. +Bytecode that passes this test is completely safe, +in the sense that it will not break the interpreter. +However, +there is no guarantee that such code does anything sensible. +(None can be given, because the halting problem is unsolvable.) +If no files are given, then +luac +loads +luac.out +and tests its contents. +No messages are displayed if the file passes the integrity test. +

+-s +strip debug information before writing the output file. +This saves some space in very large chunks, +but if errors occur when running a stripped chunk, +then the error messages may not contain the full information they usually do. +For instance, +line numbers and names of local variables are lost. +

+-v +show version information. +

FILES

+

+luac.out +default output file +

SEE ALSO

+lua(1) +
+http://www.lua.org/ +

DIAGNOSTICS

+Error messages should be self explanatory. +

AUTHORS

+L. H. de Figueiredo, +R. Ierusalimschy and +W. Celes + + + diff --git a/user/lua-5.1.4/doc/manual.css b/user/lua-5.1.4/doc/manual.css new file mode 100644 index 0000000..eed5afd --- /dev/null +++ b/user/lua-5.1.4/doc/manual.css @@ -0,0 +1,13 @@ +h3 code { + font-family: inherit ; +} + +pre { + font-size: 105% ; +} + +span.apii { + float: right ; + font-family: inherit ; +} + diff --git a/user/lua-5.1.4/doc/manual.html b/user/lua-5.1.4/doc/manual.html new file mode 100644 index 0000000..f46f17c --- /dev/null +++ b/user/lua-5.1.4/doc/manual.html @@ -0,0 +1,8801 @@ + + + + +Lua 5.1 Reference Manual + + + + + + + +
+

+ +Lua 5.1 Reference Manual +

+ +by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes +

+ +Copyright © 2006-2008 Lua.org, PUC-Rio. +Freely available under the terms of the +Lua license. + +


+

+ +contents +· +index + + +

+ + + + + + +

1 - Introduction

+ +

+Lua is an extension programming language designed to support +general procedural programming with data description +facilities. +It also offers good support for object-oriented programming, +functional programming, and data-driven programming. +Lua is intended to be used as a powerful, light-weight +scripting language for any program that needs one. +Lua is implemented as a library, written in clean C +(that is, in the common subset of ANSI C and C++). + + +

+Being an extension language, Lua has no notion of a "main" program: +it only works embedded in a host client, +called the embedding program or simply the host. +This host program can invoke functions to execute a piece of Lua code, +can write and read Lua variables, +and can register C functions to be called by Lua code. +Through the use of C functions, Lua can be augmented to cope with +a wide range of different domains, +thus creating customized programming languages sharing a syntactical framework. +The Lua distribution includes a sample host program called lua, +which uses the Lua library to offer a complete, stand-alone Lua interpreter. + + +

+Lua is free software, +and is provided as usual with no guarantees, +as stated in its license. +The implementation described in this manual is available +at Lua's official web site, www.lua.org. + + +

+Like any other reference manual, +this document is dry in places. +For a discussion of the decisions behind the design of Lua, +see the technical papers available at Lua's web site. +For a detailed introduction to programming in Lua, +see Roberto's book, Programming in Lua (Second Edition). + + + +

2 - The Language

+ +

+This section describes the lexis, the syntax, and the semantics of Lua. +In other words, +this section describes +which tokens are valid, +how they can be combined, +and what their combinations mean. + + +

+The language constructs will be explained using the usual extended BNF notation, +in which +{a} means 0 or more a's, and +[a] means an optional a. +Non-terminals are shown like non-terminal, +keywords are shown like kword, +and other terminal symbols are shown like `=´. +The complete syntax of Lua can be found in §8 +at the end of this manual. + + + +

2.1 - Lexical Conventions

+ +

+Names +(also called identifiers) +in Lua can be any string of letters, +digits, and underscores, +not beginning with a digit. +This coincides with the definition of names in most languages. +(The definition of letter depends on the current locale: +any character considered alphabetic by the current locale +can be used in an identifier.) +Identifiers are used to name variables and table fields. + + +

+The following keywords are reserved +and cannot be used as names: + + +

+     and       break     do        else      elseif
+     end       false     for       function  if
+     in        local     nil       not       or
+     repeat    return    then      true      until     while
+
+ +

+Lua is a case-sensitive language: +and is a reserved word, but And and AND +are two different, valid names. +As a convention, names starting with an underscore followed by +uppercase letters (such as _VERSION) +are reserved for internal global variables used by Lua. + + +

+The following strings denote other tokens: + +

+     +     -     *     /     %     ^     #
+     ==    ~=    <=    >=    <     >     =
+     (     )     {     }     [     ]
+     ;     :     ,     .     ..    ...
+
+ +

+Literal strings +can be delimited by matching single or double quotes, +and can contain the following C-like escape sequences: +'\a' (bell), +'\b' (backspace), +'\f' (form feed), +'\n' (newline), +'\r' (carriage return), +'\t' (horizontal tab), +'\v' (vertical tab), +'\\' (backslash), +'\"' (quotation mark [double quote]), +and '\'' (apostrophe [single quote]). +Moreover, a backslash followed by a real newline +results in a newline in the string. +A character in a string can also be specified by its numerical value +using the escape sequence \ddd, +where ddd is a sequence of up to three decimal digits. +(Note that if a numerical escape is to be followed by a digit, +it must be expressed using exactly three digits.) +Strings in Lua can contain any 8-bit value, including embedded zeros, +which can be specified as '\0'. + + +

+Literal strings can also be defined using a long format +enclosed by long brackets. +We define an opening long bracket of level n as an opening +square bracket followed by n equal signs followed by another +opening square bracket. +So, an opening long bracket of level 0 is written as [[, +an opening long bracket of level 1 is written as [=[, +and so on. +A closing long bracket is defined similarly; +for instance, a closing long bracket of level 4 is written as ]====]. +A long string starts with an opening long bracket of any level and +ends at the first closing long bracket of the same level. +Literals in this bracketed form can run for several lines, +do not interpret any escape sequences, +and ignore long brackets of any other level. +They can contain anything except a closing bracket of the proper level. + + +

+For convenience, +when the opening long bracket is immediately followed by a newline, +the newline is not included in the string. +As an example, in a system using ASCII +(in which 'a' is coded as 97, +newline is coded as 10, and '1' is coded as 49), +the five literal strings below denote the same string: + +

+     a = 'alo\n123"'
+     a = "alo\n123\""
+     a = '\97lo\10\04923"'
+     a = [[alo
+     123"]]
+     a = [==[
+     alo
+     123"]==]
+
+ +

+A numerical constant can be written with an optional decimal part +and an optional decimal exponent. +Lua also accepts integer hexadecimal constants, +by prefixing them with 0x. +Examples of valid numerical constants are + +

+     3   3.0   3.1416   314.16e-2   0.31416E1   0xff   0x56
+
+ +

+A comment starts with a double hyphen (--) +anywhere outside a string. +If the text immediately after -- is not an opening long bracket, +the comment is a short comment, +which runs until the end of the line. +Otherwise, it is a long comment, +which runs until the corresponding closing long bracket. +Long comments are frequently used to disable code temporarily. + + + + + +

2.2 - Values and Types

+ +

+Lua is a dynamically typed language. +This means that +variables do not have types; only values do. +There are no type definitions in the language. +All values carry their own type. + + +

+All values in Lua are first-class values. +This means that all values can be stored in variables, +passed as arguments to other functions, and returned as results. + + +

+There are eight basic types in Lua: +nil, boolean, number, +string, function, userdata, +thread, and table. +Nil is the type of the value nil, +whose main property is to be different from any other value; +it usually represents the absence of a useful value. +Boolean is the type of the values false and true. +Both nil and false make a condition false; +any other value makes it true. +Number represents real (double-precision floating-point) numbers. +(It is easy to build Lua interpreters that use other +internal representations for numbers, +such as single-precision float or long integers; +see file luaconf.h.) +String represents arrays of characters. + +Lua is 8-bit clean: +strings can contain any 8-bit character, +including embedded zeros ('\0') (see §2.1). + + +

+Lua can call (and manipulate) functions written in Lua and +functions written in C +(see §2.5.8). + + +

+The type userdata is provided to allow arbitrary C data to +be stored in Lua variables. +This type corresponds to a block of raw memory +and has no pre-defined operations in Lua, +except assignment and identity test. +However, by using metatables, +the programmer can define operations for userdata values +(see §2.8). +Userdata values cannot be created or modified in Lua, +only through the C API. +This guarantees the integrity of data owned by the host program. + + +

+The type thread represents independent threads of execution +and it is used to implement coroutines (see §2.11). +Do not confuse Lua threads with operating-system threads. +Lua supports coroutines on all systems, +even those that do not support threads. + + +

+The type table implements associative arrays, +that is, arrays that can be indexed not only with numbers, +but with any value (except nil). +Tables can be heterogeneous; +that is, they can contain values of all types (except nil). +Tables are the sole data structuring mechanism in Lua; +they can be used to represent ordinary arrays, +symbol tables, sets, records, graphs, trees, etc. +To represent records, Lua uses the field name as an index. +The language supports this representation by +providing a.name as syntactic sugar for a["name"]. +There are several convenient ways to create tables in Lua +(see §2.5.7). + + +

+Like indices, +the value of a table field can be of any type (except nil). +In particular, +because functions are first-class values, +table fields can contain functions. +Thus tables can also carry methods (see §2.5.9). + + +

+Tables, functions, threads, and (full) userdata values are objects: +variables do not actually contain these values, +only references to them. +Assignment, parameter passing, and function returns +always manipulate references to such values; +these operations do not imply any kind of copy. + + +

+The library function type returns a string describing the type +of a given value. + + + +

2.2.1 - Coercion

+ +

+Lua provides automatic conversion between +string and number values at run time. +Any arithmetic operation applied to a string tries to convert +this string to a number, following the usual conversion rules. +Conversely, whenever a number is used where a string is expected, +the number is converted to a string, in a reasonable format. +For complete control over how numbers are converted to strings, +use the format function from the string library +(see string.format). + + + + + + + +

2.3 - Variables

+ +

+Variables are places that store values. + +There are three kinds of variables in Lua: +global variables, local variables, and table fields. + + +

+A single name can denote a global variable or a local variable +(or a function's formal parameter, +which is a particular kind of local variable): + +

+	var ::= Name
+

+Name denotes identifiers, as defined in §2.1. + + +

+Any variable is assumed to be global unless explicitly declared +as a local (see §2.4.7). +Local variables are lexically scoped: +local variables can be freely accessed by functions +defined inside their scope (see §2.6). + + +

+Before the first assignment to a variable, its value is nil. + + +

+Square brackets are used to index a table: + +

+	var ::= prefixexp `[´ exp `]´
+

+The meaning of accesses to global variables +and table fields can be changed via metatables. +An access to an indexed variable t[i] is equivalent to +a call gettable_event(t,i). +(See §2.8 for a complete description of the +gettable_event function. +This function is not defined or callable in Lua. +We use it here only for explanatory purposes.) + + +

+The syntax var.Name is just syntactic sugar for +var["Name"]: + +

+	var ::= prefixexp `.´ Name
+
+ +

+All global variables live as fields in ordinary Lua tables, +called environment tables or simply +environments (see §2.9). +Each function has its own reference to an environment, +so that all global variables in this function +will refer to this environment table. +When a function is created, +it inherits the environment from the function that created it. +To get the environment table of a Lua function, +you call getfenv. +To replace it, +you call setfenv. +(You can only manipulate the environment of C functions +through the debug library; (see §5.9).) + + +

+An access to a global variable x +is equivalent to _env.x, +which in turn is equivalent to + +

+     gettable_event(_env, "x")
+

+where _env is the environment of the running function. +(See §2.8 for a complete description of the +gettable_event function. +This function is not defined or callable in Lua. +Similarly, the _env variable is not defined in Lua. +We use them here only for explanatory purposes.) + + + + + +

2.4 - Statements

+ +

+Lua supports an almost conventional set of statements, +similar to those in Pascal or C. +This set includes +assignments, control structures, function calls, +and variable declarations. + + + +

2.4.1 - Chunks

+ +

+The unit of execution of Lua is called a chunk. +A chunk is simply a sequence of statements, +which are executed sequentially. +Each statement can be optionally followed by a semicolon: + +

+	chunk ::= {stat [`;´]}
+

+There are no empty statements and thus ';;' is not legal. + + +

+Lua handles a chunk as the body of an anonymous function +with a variable number of arguments +(see §2.5.9). +As such, chunks can define local variables, +receive arguments, and return values. + + +

+A chunk can be stored in a file or in a string inside the host program. +To execute a chunk, +Lua first pre-compiles the chunk into instructions for a virtual machine, +and then it executes the compiled code +with an interpreter for the virtual machine. + + +

+Chunks can also be pre-compiled into binary form; +see program luac for details. +Programs in source and compiled forms are interchangeable; +Lua automatically detects the file type and acts accordingly. + + + + + + +

2.4.2 - Blocks

+A block is a list of statements; +syntactically, a block is the same as a chunk: + +

+	block ::= chunk
+
+ +

+A block can be explicitly delimited to produce a single statement: + +

+	stat ::= do block end
+

+Explicit blocks are useful +to control the scope of variable declarations. +Explicit blocks are also sometimes used to +add a return or break statement in the middle +of another block (see §2.4.4). + + + + + +

2.4.3 - Assignment

+ +

+Lua allows multiple assignments. +Therefore, the syntax for assignment +defines a list of variables on the left side +and a list of expressions on the right side. +The elements in both lists are separated by commas: + +

+	stat ::= varlist `=´ explist
+	varlist ::= var {`,´ var}
+	explist ::= exp {`,´ exp}
+

+Expressions are discussed in §2.5. + + +

+Before the assignment, +the list of values is adjusted to the length of +the list of variables. +If there are more values than needed, +the excess values are thrown away. +If there are fewer values than needed, +the list is extended with as many nil's as needed. +If the list of expressions ends with a function call, +then all values returned by that call enter the list of values, +before the adjustment +(except when the call is enclosed in parentheses; see §2.5). + + +

+The assignment statement first evaluates all its expressions +and only then are the assignments performed. +Thus the code + +

+     i = 3
+     i, a[i] = i+1, 20
+

+sets a[3] to 20, without affecting a[4] +because the i in a[i] is evaluated (to 3) +before it is assigned 4. +Similarly, the line + +

+     x, y = y, x
+

+exchanges the values of x and y, +and + +

+     x, y, z = y, z, x
+

+cyclically permutes the values of x, y, and z. + + +

+The meaning of assignments to global variables +and table fields can be changed via metatables. +An assignment to an indexed variable t[i] = val is equivalent to +settable_event(t,i,val). +(See §2.8 for a complete description of the +settable_event function. +This function is not defined or callable in Lua. +We use it here only for explanatory purposes.) + + +

+An assignment to a global variable x = val +is equivalent to the assignment +_env.x = val, +which in turn is equivalent to + +

+     settable_event(_env, "x", val)
+

+where _env is the environment of the running function. +(The _env variable is not defined in Lua. +We use it here only for explanatory purposes.) + + + + + +

2.4.4 - Control Structures

+The control structures +if, while, and repeat have the usual meaning and +familiar syntax: + + + + +

+	stat ::= while exp do block end
+	stat ::= repeat block until exp
+	stat ::= if exp then block {elseif exp then block} [else block] end
+

+Lua also has a for statement, in two flavors (see §2.4.5). + + +

+The condition expression of a +control structure can return any value. +Both false and nil are considered false. +All values different from nil and false are considered true +(in particular, the number 0 and the empty string are also true). + + +

+In the repeatuntil loop, +the inner block does not end at the until keyword, +but only after the condition. +So, the condition can refer to local variables +declared inside the loop block. + + +

+The return statement is used to return values +from a function or a chunk (which is just a function). + +Functions and chunks can return more than one value, +and so the syntax for the return statement is + +

+	stat ::= return [explist]
+
+ +

+The break statement is used to terminate the execution of a +while, repeat, or for loop, +skipping to the next statement after the loop: + + +

+	stat ::= break
+

+A break ends the innermost enclosing loop. + + +

+The return and break +statements can only be written as the last statement of a block. +If it is really necessary to return or break in the +middle of a block, +then an explicit inner block can be used, +as in the idioms +do return end and do break end, +because now return and break are the last statements in +their (inner) blocks. + + + + + +

2.4.5 - For Statement

+ +

+ +The for statement has two forms: +one numeric and one generic. + + +

+The numeric for loop repeats a block of code while a +control variable runs through an arithmetic progression. +It has the following syntax: + +

+	stat ::= for Name `=´ exp `,´ exp [`,´ exp] do block end
+

+The block is repeated for name starting at the value of +the first exp, until it passes the second exp by steps of the +third exp. +More precisely, a for statement like + +

+     for v = e1, e2, e3 do block end
+

+is equivalent to the code: + +

+     do
+       local var, limit, step = tonumber(e1), tonumber(e2), tonumber(e3)
+       if not (var and limit and step) then error() end
+       while (step > 0 and var <= limit) or (step <= 0 and var >= limit) do
+         local v = var
+         block
+         var = var + step
+       end
+     end
+

+Note the following: + +

    + +
  • +All three control expressions are evaluated only once, +before the loop starts. +They must all result in numbers. +
  • + +
  • +var, limit, and step are invisible variables. +The names shown here are for explanatory purposes only. +
  • + +
  • +If the third expression (the step) is absent, +then a step of 1 is used. +
  • + +
  • +You can use break to exit a for loop. +
  • + +
  • +The loop variable v is local to the loop; +you cannot use its value after the for ends or is broken. +If you need this value, +assign it to another variable before breaking or exiting the loop. +
  • + +
+ +

+The generic for statement works over functions, +called iterators. +On each iteration, the iterator function is called to produce a new value, +stopping when this new value is nil. +The generic for loop has the following syntax: + +

+	stat ::= for namelist in explist do block end
+	namelist ::= Name {`,´ Name}
+

+A for statement like + +

+     for var_1, ···, var_n in explist do block end
+

+is equivalent to the code: + +

+     do
+       local f, s, var = explist
+       while true do
+         local var_1, ···, var_n = f(s, var)
+         var = var_1
+         if var == nil then break end
+         block
+       end
+     end
+

+Note the following: + +

    + +
  • +explist is evaluated only once. +Its results are an iterator function, +a state, +and an initial value for the first iterator variable. +
  • + +
  • +f, s, and var are invisible variables. +The names are here for explanatory purposes only. +
  • + +
  • +You can use break to exit a for loop. +
  • + +
  • +The loop variables var_i are local to the loop; +you cannot use their values after the for ends. +If you need these values, +then assign them to other variables before breaking or exiting the loop. +
  • + +
+ + + + +

2.4.6 - Function Calls as Statements

+To allow possible side-effects, +function calls can be executed as statements: + +

+	stat ::= functioncall
+

+In this case, all returned values are thrown away. +Function calls are explained in §2.5.8. + + + + + +

2.4.7 - Local Declarations

+Local variables can be declared anywhere inside a block. +The declaration can include an initial assignment: + +

+	stat ::= local namelist [`=´ explist]
+

+If present, an initial assignment has the same semantics +of a multiple assignment (see §2.4.3). +Otherwise, all variables are initialized with nil. + + +

+A chunk is also a block (see §2.4.1), +and so local variables can be declared in a chunk outside any explicit block. +The scope of such local variables extends until the end of the chunk. + + +

+The visibility rules for local variables are explained in §2.6. + + + + + + + +

2.5 - Expressions

+ +

+The basic expressions in Lua are the following: + +

+	exp ::= prefixexp
+	exp ::= nil | false | true
+	exp ::= Number
+	exp ::= String
+	exp ::= function
+	exp ::= tableconstructor
+	exp ::= `...´
+	exp ::= exp binop exp
+	exp ::= unop exp
+	prefixexp ::= var | functioncall | `(´ exp `)´
+
+ +

+Numbers and literal strings are explained in §2.1; +variables are explained in §2.3; +function definitions are explained in §2.5.9; +function calls are explained in §2.5.8; +table constructors are explained in §2.5.7. +Vararg expressions, +denoted by three dots ('...'), can only be used when +directly inside a vararg function; +they are explained in §2.5.9. + + +

+Binary operators comprise arithmetic operators (see §2.5.1), +relational operators (see §2.5.2), logical operators (see §2.5.3), +and the concatenation operator (see §2.5.4). +Unary operators comprise the unary minus (see §2.5.1), +the unary not (see §2.5.3), +and the unary length operator (see §2.5.5). + + +

+Both function calls and vararg expressions can result in multiple values. +If an expression is used as a statement +(only possible for function calls (see §2.4.6)), +then its return list is adjusted to zero elements, +thus discarding all returned values. +If an expression is used as the last (or the only) element +of a list of expressions, +then no adjustment is made +(unless the call is enclosed in parentheses). +In all other contexts, +Lua adjusts the result list to one element, +discarding all values except the first one. + + +

+Here are some examples: + +

+     f()                -- adjusted to 0 results
+     g(f(), x)          -- f() is adjusted to 1 result
+     g(x, f())          -- g gets x plus all results from f()
+     a,b,c = f(), x     -- f() is adjusted to 1 result (c gets nil)
+     a,b = ...          -- a gets the first vararg parameter, b gets
+                        -- the second (both a and b can get nil if there
+                        -- is no corresponding vararg parameter)
+     
+     a,b,c = x, f()     -- f() is adjusted to 2 results
+     a,b,c = f()        -- f() is adjusted to 3 results
+     return f()         -- returns all results from f()
+     return ...         -- returns all received vararg parameters
+     return x,y,f()     -- returns x, y, and all results from f()
+     {f()}              -- creates a list with all results from f()
+     {...}              -- creates a list with all vararg parameters
+     {f(), nil}         -- f() is adjusted to 1 result
+
+ +

+Any expression enclosed in parentheses always results in only one value. +Thus, +(f(x,y,z)) is always a single value, +even if f returns several values. +(The value of (f(x,y,z)) is the first value returned by f +or nil if f does not return any values.) + + + +

2.5.1 - Arithmetic Operators

+Lua supports the usual arithmetic operators: +the binary + (addition), +- (subtraction), * (multiplication), +/ (division), % (modulo), and ^ (exponentiation); +and unary - (negation). +If the operands are numbers, or strings that can be converted to +numbers (see §2.2.1), +then all operations have the usual meaning. +Exponentiation works for any exponent. +For instance, x^(-0.5) computes the inverse of the square root of x. +Modulo is defined as + +

+     a % b == a - math.floor(a/b)*b
+

+That is, it is the remainder of a division that rounds +the quotient towards minus infinity. + + + + + +

2.5.2 - Relational Operators

+The relational operators in Lua are + +

+     ==    ~=    <     >     <=    >=
+

+These operators always result in false or true. + + +

+Equality (==) first compares the type of its operands. +If the types are different, then the result is false. +Otherwise, the values of the operands are compared. +Numbers and strings are compared in the usual way. +Objects (tables, userdata, threads, and functions) +are compared by reference: +two objects are considered equal only if they are the same object. +Every time you create a new object +(a table, userdata, thread, or function), +this new object is different from any previously existing object. + + +

+You can change the way that Lua compares tables and userdata +by using the "eq" metamethod (see §2.8). + + +

+The conversion rules of §2.2.1 +do not apply to equality comparisons. +Thus, "0"==0 evaluates to false, +and t[0] and t["0"] denote different +entries in a table. + + +

+The operator ~= is exactly the negation of equality (==). + + +

+The order operators work as follows. +If both arguments are numbers, then they are compared as such. +Otherwise, if both arguments are strings, +then their values are compared according to the current locale. +Otherwise, Lua tries to call the "lt" or the "le" +metamethod (see §2.8). +A comparison a > b is translated to b < a +and a >= b is translated to b <= a. + + + + + +

2.5.3 - Logical Operators

+The logical operators in Lua are +and, or, and not. +Like the control structures (see §2.4.4), +all logical operators consider both false and nil as false +and anything else as true. + + +

+The negation operator not always returns false or true. +The conjunction operator and returns its first argument +if this value is false or nil; +otherwise, and returns its second argument. +The disjunction operator or returns its first argument +if this value is different from nil and false; +otherwise, or returns its second argument. +Both and and or use short-cut evaluation; +that is, +the second operand is evaluated only if necessary. +Here are some examples: + +

+     10 or 20            --> 10
+     10 or error()       --> 10
+     nil or "a"          --> "a"
+     nil and 10          --> nil
+     false and error()   --> false
+     false and nil       --> false
+     false or nil        --> nil
+     10 and 20           --> 20
+

+(In this manual, +--> indicates the result of the preceding expression.) + + + + + +

2.5.4 - Concatenation

+The string concatenation operator in Lua is +denoted by two dots ('..'). +If both operands are strings or numbers, then they are converted to +strings according to the rules mentioned in §2.2.1. +Otherwise, the "concat" metamethod is called (see §2.8). + + + + + +

2.5.5 - The Length Operator

+ +

+The length operator is denoted by the unary operator #. +The length of a string is its number of bytes +(that is, the usual meaning of string length when each +character is one byte). + + +

+The length of a table t is defined to be any +integer index n +such that t[n] is not nil and t[n+1] is nil; +moreover, if t[1] is nil, n can be zero. +For a regular array, with non-nil values from 1 to a given n, +its length is exactly that n, +the index of its last value. +If the array has "holes" +(that is, nil values between other non-nil values), +then #t can be any of the indices that +directly precedes a nil value +(that is, it may consider any such nil value as the end of +the array). + + + + + +

2.5.6 - Precedence

+Operator precedence in Lua follows the table below, +from lower to higher priority: + +

+     or
+     and
+     <     >     <=    >=    ~=    ==
+     ..
+     +     -
+     *     /     %
+     not   #     - (unary)
+     ^
+

+As usual, +you can use parentheses to change the precedences of an expression. +The concatenation ('..') and exponentiation ('^') +operators are right associative. +All other binary operators are left associative. + + + + + +

2.5.7 - Table Constructors

+Table constructors are expressions that create tables. +Every time a constructor is evaluated, a new table is created. +A constructor can be used to create an empty table +or to create a table and initialize some of its fields. +The general syntax for constructors is + +

+	tableconstructor ::= `{´ [fieldlist] `}´
+	fieldlist ::= field {fieldsep field} [fieldsep]
+	field ::= `[´ exp `]´ `=´ exp | Name `=´ exp | exp
+	fieldsep ::= `,´ | `;´
+
+ +

+Each field of the form [exp1] = exp2 adds to the new table an entry +with key exp1 and value exp2. +A field of the form name = exp is equivalent to +["name"] = exp. +Finally, fields of the form exp are equivalent to +[i] = exp, where i are consecutive numerical integers, +starting with 1. +Fields in the other formats do not affect this counting. +For example, + +

+     a = { [f(1)] = g; "x", "y"; x = 1, f(x), [30] = 23; 45 }
+

+is equivalent to + +

+     do
+       local t = {}
+       t[f(1)] = g
+       t[1] = "x"         -- 1st exp
+       t[2] = "y"         -- 2nd exp
+       t.x = 1            -- t["x"] = 1
+       t[3] = f(x)        -- 3rd exp
+       t[30] = 23
+       t[4] = 45          -- 4th exp
+       a = t
+     end
+
+ +

+If the last field in the list has the form exp +and the expression is a function call or a vararg expression, +then all values returned by this expression enter the list consecutively +(see §2.5.8). +To avoid this, +enclose the function call or the vararg expression +in parentheses (see §2.5). + + +

+The field list can have an optional trailing separator, +as a convenience for machine-generated code. + + + + + +

2.5.8 - Function Calls

+A function call in Lua has the following syntax: + +

+	functioncall ::= prefixexp args
+

+In a function call, +first prefixexp and args are evaluated. +If the value of prefixexp has type function, +then this function is called +with the given arguments. +Otherwise, the prefixexp "call" metamethod is called, +having as first parameter the value of prefixexp, +followed by the original call arguments +(see §2.8). + + +

+The form + +

+	functioncall ::= prefixexp `:´ Name args
+

+can be used to call "methods". +A call v:name(args) +is syntactic sugar for v.name(v,args), +except that v is evaluated only once. + + +

+Arguments have the following syntax: + +

+	args ::= `(´ [explist] `)´
+	args ::= tableconstructor
+	args ::= String
+

+All argument expressions are evaluated before the call. +A call of the form f{fields} is +syntactic sugar for f({fields}); +that is, the argument list is a single new table. +A call of the form f'string' +(or f"string" or f[[string]]) +is syntactic sugar for f('string'); +that is, the argument list is a single literal string. + + +

+As an exception to the free-format syntax of Lua, +you cannot put a line break before the '(' in a function call. +This restriction avoids some ambiguities in the language. +If you write + +

+     a = f
+     (g).x(a)
+

+Lua would see that as a single statement, a = f(g).x(a). +So, if you want two statements, you must add a semi-colon between them. +If you actually want to call f, +you must remove the line break before (g). + + +

+A call of the form return functioncall is called +a tail call. +Lua implements proper tail calls +(or proper tail recursion): +in a tail call, +the called function reuses the stack entry of the calling function. +Therefore, there is no limit on the number of nested tail calls that +a program can execute. +However, a tail call erases any debug information about the +calling function. +Note that a tail call only happens with a particular syntax, +where the return has one single function call as argument; +this syntax makes the calling function return exactly +the returns of the called function. +So, none of the following examples are tail calls: + +

+     return (f(x))        -- results adjusted to 1
+     return 2 * f(x)
+     return x, f(x)       -- additional results
+     f(x); return         -- results discarded
+     return x or f(x)     -- results adjusted to 1
+
+ + + + +

2.5.9 - Function Definitions

+ +

+The syntax for function definition is + +

+	function ::= function funcbody
+	funcbody ::= `(´ [parlist] `)´ block end
+
+ +

+The following syntactic sugar simplifies function definitions: + +

+	stat ::= function funcname funcbody
+	stat ::= local function Name funcbody
+	funcname ::= Name {`.´ Name} [`:´ Name]
+

+The statement + +

+     function f () body end
+

+translates to + +

+     f = function () body end
+

+The statement + +

+     function t.a.b.c.f () body end
+

+translates to + +

+     t.a.b.c.f = function () body end
+

+The statement + +

+     local function f () body end
+

+translates to + +

+     local f; f = function () body end
+

+not to + +

+     local f = function () body end
+

+(This only makes a difference when the body of the function +contains references to f.) + + +

+A function definition is an executable expression, +whose value has type function. +When Lua pre-compiles a chunk, +all its function bodies are pre-compiled too. +Then, whenever Lua executes the function definition, +the function is instantiated (or closed). +This function instance (or closure) +is the final value of the expression. +Different instances of the same function +can refer to different external local variables +and can have different environment tables. + + +

+Parameters act as local variables that are +initialized with the argument values: + +

+	parlist ::= namelist [`,´ `...´] | `...´
+

+When a function is called, +the list of arguments is adjusted to +the length of the list of parameters, +unless the function is a variadic or vararg function, +which is +indicated by three dots ('...') at the end of its parameter list. +A vararg function does not adjust its argument list; +instead, it collects all extra arguments and supplies them +to the function through a vararg expression, +which is also written as three dots. +The value of this expression is a list of all actual extra arguments, +similar to a function with multiple results. +If a vararg expression is used inside another expression +or in the middle of a list of expressions, +then its return list is adjusted to one element. +If the expression is used as the last element of a list of expressions, +then no adjustment is made +(unless that last expression is enclosed in parentheses). + + +

+As an example, consider the following definitions: + +

+     function f(a, b) end
+     function g(a, b, ...) end
+     function r() return 1,2,3 end
+

+Then, we have the following mapping from arguments to parameters and +to the vararg expression: + +

+     CALL            PARAMETERS
+     
+     f(3)             a=3, b=nil
+     f(3, 4)          a=3, b=4
+     f(3, 4, 5)       a=3, b=4
+     f(r(), 10)       a=1, b=10
+     f(r())           a=1, b=2
+     
+     g(3)             a=3, b=nil, ... -->  (nothing)
+     g(3, 4)          a=3, b=4,   ... -->  (nothing)
+     g(3, 4, 5, 8)    a=3, b=4,   ... -->  5  8
+     g(5, r())        a=5, b=1,   ... -->  2  3
+
+ +

+Results are returned using the return statement (see §2.4.4). +If control reaches the end of a function +without encountering a return statement, +then the function returns with no results. + + +

+The colon syntax +is used for defining methods, +that is, functions that have an implicit extra parameter self. +Thus, the statement + +

+     function t.a.b.c:f (params) body end
+

+is syntactic sugar for + +

+     t.a.b.c.f = function (self, params) body end
+
+ + + + + + +

2.6 - Visibility Rules

+ +

+ +Lua is a lexically scoped language. +The scope of variables begins at the first statement after +their declaration and lasts until the end of the innermost block that +includes the declaration. +Consider the following example: + +

+     x = 10                -- global variable
+     do                    -- new block
+       local x = x         -- new 'x', with value 10
+       print(x)            --> 10
+       x = x+1
+       do                  -- another block
+         local x = x+1     -- another 'x'
+         print(x)          --> 12
+       end
+       print(x)            --> 11
+     end
+     print(x)              --> 10  (the global one)
+
+ +

+Notice that, in a declaration like local x = x, +the new x being declared is not in scope yet, +and so the second x refers to the outside variable. + + +

+Because of the lexical scoping rules, +local variables can be freely accessed by functions +defined inside their scope. +A local variable used by an inner function is called +an upvalue, or external local variable, +inside the inner function. + + +

+Notice that each execution of a local statement +defines new local variables. +Consider the following example: + +

+     a = {}
+     local x = 20
+     for i=1,10 do
+       local y = 0
+       a[i] = function () y=y+1; return x+y end
+     end
+

+The loop creates ten closures +(that is, ten instances of the anonymous function). +Each of these closures uses a different y variable, +while all of them share the same x. + + + + + +

2.7 - Error Handling

+ +

+Because Lua is an embedded extension language, +all Lua actions start from C code in the host program +calling a function from the Lua library (see lua_pcall). +Whenever an error occurs during Lua compilation or execution, +control returns to C, +which can take appropriate measures +(such as printing an error message). + + +

+Lua code can explicitly generate an error by calling the +error function. +If you need to catch errors in Lua, +you can use the pcall function. + + + + + +

2.8 - Metatables

+ +

+Every value in Lua can have a metatable. +This metatable is an ordinary Lua table +that defines the behavior of the original value +under certain special operations. +You can change several aspects of the behavior +of operations over a value by setting specific fields in its metatable. +For instance, when a non-numeric value is the operand of an addition, +Lua checks for a function in the field "__add" in its metatable. +If it finds one, +Lua calls this function to perform the addition. + + +

+We call the keys in a metatable events +and the values metamethods. +In the previous example, the event is "add" +and the metamethod is the function that performs the addition. + + +

+You can query the metatable of any value +through the getmetatable function. + + +

+You can replace the metatable of tables +through the setmetatable +function. +You cannot change the metatable of other types from Lua +(except by using the debug library); +you must use the C API for that. + + +

+Tables and full userdata have individual metatables +(although multiple tables and userdata can share their metatables). +Values of all other types share one single metatable per type; +that is, there is one single metatable for all numbers, +one for all strings, etc. + + +

+A metatable controls how an object behaves in arithmetic operations, +order comparisons, concatenation, length operation, and indexing. +A metatable also can define a function to be called when a userdata +is garbage collected. +For each of these operations Lua associates a specific key +called an event. +When Lua performs one of these operations over a value, +it checks whether this value has a metatable with the corresponding event. +If so, the value associated with that key (the metamethod) +controls how Lua will perform the operation. + + +

+Metatables control the operations listed next. +Each operation is identified by its corresponding name. +The key for each operation is a string with its name prefixed by +two underscores, '__'; +for instance, the key for operation "add" is the +string "__add". +The semantics of these operations is better explained by a Lua function +describing how the interpreter executes the operation. + + +

+The code shown here in Lua is only illustrative; +the real behavior is hard coded in the interpreter +and it is much more efficient than this simulation. +All functions used in these descriptions +(rawget, tonumber, etc.) +are described in §5.1. +In particular, to retrieve the metamethod of a given object, +we use the expression + +

+     metatable(obj)[event]
+

+This should be read as + +

+     rawget(getmetatable(obj) or {}, event)
+

+ +That is, the access to a metamethod does not invoke other metamethods, +and the access to objects with no metatables does not fail +(it simply results in nil). + + + +

    + +
  • "add": +the + operation. + + + +

    +The function getbinhandler below defines how Lua chooses a handler +for a binary operation. +First, Lua tries the first operand. +If its type does not define a handler for the operation, +then Lua tries the second operand. + +

    +     function getbinhandler (op1, op2, event)
    +       return metatable(op1)[event] or metatable(op2)[event]
    +     end
    +

    +By using this function, +the behavior of the op1 + op2 is + +

    +     function add_event (op1, op2)
    +       local o1, o2 = tonumber(op1), tonumber(op2)
    +       if o1 and o2 then  -- both operands are numeric?
    +         return o1 + o2   -- '+' here is the primitive 'add'
    +       else  -- at least one of the operands is not numeric
    +         local h = getbinhandler(op1, op2, "__add")
    +         if h then
    +           -- call the handler with both operands
    +           return (h(op1, op2))
    +         else  -- no handler available: default behavior
    +           error(···)
    +         end
    +       end
    +     end
    +

    +

  • + +
  • "sub": +the - operation. + +Behavior similar to the "add" operation. +
  • + +
  • "mul": +the * operation. + +Behavior similar to the "add" operation. +
  • + +
  • "div": +the / operation. + +Behavior similar to the "add" operation. +
  • + +
  • "mod": +the % operation. + +Behavior similar to the "add" operation, +with the operation +o1 - floor(o1/o2)*o2 as the primitive operation. +
  • + +
  • "pow": +the ^ (exponentiation) operation. + +Behavior similar to the "add" operation, +with the function pow (from the C math library) +as the primitive operation. +
  • + +
  • "unm": +the unary - operation. + + +
    +     function unm_event (op)
    +       local o = tonumber(op)
    +       if o then  -- operand is numeric?
    +         return -o  -- '-' here is the primitive 'unm'
    +       else  -- the operand is not numeric.
    +         -- Try to get a handler from the operand
    +         local h = metatable(op).__unm
    +         if h then
    +           -- call the handler with the operand
    +           return (h(op))
    +         else  -- no handler available: default behavior
    +           error(···)
    +         end
    +       end
    +     end
    +

    +

  • + +
  • "concat": +the .. (concatenation) operation. + + +
    +     function concat_event (op1, op2)
    +       if (type(op1) == "string" or type(op1) == "number") and
    +          (type(op2) == "string" or type(op2) == "number") then
    +         return op1 .. op2  -- primitive string concatenation
    +       else
    +         local h = getbinhandler(op1, op2, "__concat")
    +         if h then
    +           return (h(op1, op2))
    +         else
    +           error(···)
    +         end
    +       end
    +     end
    +

    +

  • + +
  • "len": +the # operation. + + +
    +     function len_event (op)
    +       if type(op) == "string" then
    +         return strlen(op)         -- primitive string length
    +       elseif type(op) == "table" then
    +         return #op                -- primitive table length
    +       else
    +         local h = metatable(op).__len
    +         if h then
    +           -- call the handler with the operand
    +           return (h(op))
    +         else  -- no handler available: default behavior
    +           error(···)
    +         end
    +       end
    +     end
    +

    +See §2.5.5 for a description of the length of a table. +

  • + +
  • "eq": +the == operation. + +The function getcomphandler defines how Lua chooses a metamethod +for comparison operators. +A metamethod only is selected when both objects +being compared have the same type +and the same metamethod for the selected operation. + +
    +     function getcomphandler (op1, op2, event)
    +       if type(op1) ~= type(op2) then return nil end
    +       local mm1 = metatable(op1)[event]
    +       local mm2 = metatable(op2)[event]
    +       if mm1 == mm2 then return mm1 else return nil end
    +     end
    +

    +The "eq" event is defined as follows: + +

    +     function eq_event (op1, op2)
    +       if type(op1) ~= type(op2) then  -- different types?
    +         return false   -- different objects
    +       end
    +       if op1 == op2 then   -- primitive equal?
    +         return true   -- objects are equal
    +       end
    +       -- try metamethod
    +       local h = getcomphandler(op1, op2, "__eq")
    +       if h then
    +         return (h(op1, op2))
    +       else
    +         return false
    +       end
    +     end
    +

    +a ~= b is equivalent to not (a == b). +

  • + +
  • "lt": +the < operation. + + +
    +     function lt_event (op1, op2)
    +       if type(op1) == "number" and type(op2) == "number" then
    +         return op1 < op2   -- numeric comparison
    +       elseif type(op1) == "string" and type(op2) == "string" then
    +         return op1 < op2   -- lexicographic comparison
    +       else
    +         local h = getcomphandler(op1, op2, "__lt")
    +         if h then
    +           return (h(op1, op2))
    +         else
    +           error(···)
    +         end
    +       end
    +     end
    +

    +a > b is equivalent to b < a. +

  • + +
  • "le": +the <= operation. + + +
    +     function le_event (op1, op2)
    +       if type(op1) == "number" and type(op2) == "number" then
    +         return op1 <= op2   -- numeric comparison
    +       elseif type(op1) == "string" and type(op2) == "string" then
    +         return op1 <= op2   -- lexicographic comparison
    +       else
    +         local h = getcomphandler(op1, op2, "__le")
    +         if h then
    +           return (h(op1, op2))
    +         else
    +           h = getcomphandler(op1, op2, "__lt")
    +           if h then
    +             return not h(op2, op1)
    +           else
    +             error(···)
    +           end
    +         end
    +       end
    +     end
    +

    +a >= b is equivalent to b <= a. +Note that, in the absence of a "le" metamethod, +Lua tries the "lt", assuming that a <= b is +equivalent to not (b < a). +

  • + +
  • "index": +The indexing access table[key]. + + +
    +     function gettable_event (table, key)
    +       local h
    +       if type(table) == "table" then
    +         local v = rawget(table, key)
    +         if v ~= nil then return v end
    +         h = metatable(table).__index
    +         if h == nil then return nil end
    +       else
    +         h = metatable(table).__index
    +         if h == nil then
    +           error(···)
    +         end
    +       end
    +       if type(h) == "function" then
    +         return (h(table, key))     -- call the handler
    +       else return h[key]           -- or repeat operation on it
    +       end
    +     end
    +

    +

  • + +
  • "newindex": +The indexing assignment table[key] = value. + + +
    +     function settable_event (table, key, value)
    +       local h
    +       if type(table) == "table" then
    +         local v = rawget(table, key)
    +         if v ~= nil then rawset(table, key, value); return end
    +         h = metatable(table).__newindex
    +         if h == nil then rawset(table, key, value); return end
    +       else
    +         h = metatable(table).__newindex
    +         if h == nil then
    +           error(···)
    +         end
    +       end
    +       if type(h) == "function" then
    +         h(table, key,value)           -- call the handler
    +       else h[key] = value             -- or repeat operation on it
    +       end
    +     end
    +

    +

  • + +
  • "call": +called when Lua calls a value. + + +
    +     function function_event (func, ...)
    +       if type(func) == "function" then
    +         return func(...)   -- primitive call
    +       else
    +         local h = metatable(func).__call
    +         if h then
    +           return h(func, ...)
    +         else
    +           error(···)
    +         end
    +       end
    +     end
    +

    +

  • + +
+ + + + +

2.9 - Environments

+ +

+Besides metatables, +objects of types thread, function, and userdata +have another table associated with them, +called their environment. +Like metatables, environments are regular tables and +multiple objects can share the same environment. + + +

+Threads are created sharing the environment of the creating thread. +Userdata and C functions are created sharing the environment +of the creating C function. +Non-nested Lua functions +(created by loadfile, loadstring or load) +are created sharing the environment of the creating thread. +Nested Lua functions are created sharing the environment of +the creating Lua function. + + +

+Environments associated with userdata have no meaning for Lua. +It is only a convenience feature for programmers to associate a table to +a userdata. + + +

+Environments associated with threads are called +global environments. +They are used as the default environment for threads and +non-nested Lua functions created by the thread +and can be directly accessed by C code (see §3.3). + + +

+The environment associated with a C function can be directly +accessed by C code (see §3.3). +It is used as the default environment for other C functions +and userdata created by the function. + + +

+Environments associated with Lua functions are used to resolve +all accesses to global variables within the function (see §2.3). +They are used as the default environment for nested Lua functions +created by the function. + + +

+You can change the environment of a Lua function or the +running thread by calling setfenv. +You can get the environment of a Lua function or the running thread +by calling getfenv. +To manipulate the environment of other objects +(userdata, C functions, other threads) you must +use the C API. + + + + + +

2.10 - Garbage Collection

+ +

+Lua performs automatic memory management. +This means that +you have to worry neither about allocating memory for new objects +nor about freeing it when the objects are no longer needed. +Lua manages memory automatically by running +a garbage collector from time to time +to collect all dead objects +(that is, objects that are no longer accessible from Lua). +All memory used by Lua is subject to automatic management: +tables, userdata, functions, threads, strings, etc. + + +

+Lua implements an incremental mark-and-sweep collector. +It uses two numbers to control its garbage-collection cycles: +the garbage-collector pause and +the garbage-collector step multiplier. +Both use percentage points as units +(so that a value of 100 means an internal value of 1). + + +

+The garbage-collector pause +controls how long the collector waits before starting a new cycle. +Larger values make the collector less aggressive. +Values smaller than 100 mean the collector will not wait to +start a new cycle. +A value of 200 means that the collector waits for the total memory in use +to double before starting a new cycle. + + +

+The step multiplier +controls the relative speed of the collector relative to +memory allocation. +Larger values make the collector more aggressive but also increase +the size of each incremental step. +Values smaller than 100 make the collector too slow and +can result in the collector never finishing a cycle. +The default, 200, means that the collector runs at "twice" +the speed of memory allocation. + + +

+You can change these numbers by calling lua_gc in C +or collectgarbage in Lua. +With these functions you can also control +the collector directly (e.g., stop and restart it). + + + +

2.10.1 - Garbage-Collection Metamethods

+ +

+Using the C API, +you can set garbage-collector metamethods for userdata (see §2.8). +These metamethods are also called finalizers. +Finalizers allow you to coordinate Lua's garbage collection +with external resource management +(such as closing files, network or database connections, +or freeing your own memory). + + +

+Garbage userdata with a field __gc in their metatables are not +collected immediately by the garbage collector. +Instead, Lua puts them in a list. +After the collection, +Lua does the equivalent of the following function +for each userdata in that list: + +

+     function gc_event (udata)
+       local h = metatable(udata).__gc
+       if h then
+         h(udata)
+       end
+     end
+
+ +

+At the end of each garbage-collection cycle, +the finalizers for userdata are called in reverse +order of their creation, +among those collected in that cycle. +That is, the first finalizer to be called is the one associated +with the userdata created last in the program. +The userdata itself is freed only in the next garbage-collection cycle. + + + + + +

2.10.2 - Weak Tables

+ +

+A weak table is a table whose elements are +weak references. +A weak reference is ignored by the garbage collector. +In other words, +if the only references to an object are weak references, +then the garbage collector will collect this object. + + +

+A weak table can have weak keys, weak values, or both. +A table with weak keys allows the collection of its keys, +but prevents the collection of its values. +A table with both weak keys and weak values allows the collection of +both keys and values. +In any case, if either the key or the value is collected, +the whole pair is removed from the table. +The weakness of a table is controlled by the +__mode field of its metatable. +If the __mode field is a string containing the character 'k', +the keys in the table are weak. +If __mode contains 'v', +the values in the table are weak. + + +

+After you use a table as a metatable, +you should not change the value of its __mode field. +Otherwise, the weak behavior of the tables controlled by this +metatable is undefined. + + + + + + + +

2.11 - Coroutines

+ +

+Lua supports coroutines, +also called collaborative multithreading. +A coroutine in Lua represents an independent thread of execution. +Unlike threads in multithread systems, however, +a coroutine only suspends its execution by explicitly calling +a yield function. + + +

+You create a coroutine with a call to coroutine.create. +Its sole argument is a function +that is the main function of the coroutine. +The create function only creates a new coroutine and +returns a handle to it (an object of type thread); +it does not start the coroutine execution. + + +

+When you first call coroutine.resume, +passing as its first argument +a thread returned by coroutine.create, +the coroutine starts its execution, +at the first line of its main function. +Extra arguments passed to coroutine.resume are passed on +to the coroutine main function. +After the coroutine starts running, +it runs until it terminates or yields. + + +

+A coroutine can terminate its execution in two ways: +normally, when its main function returns +(explicitly or implicitly, after the last instruction); +and abnormally, if there is an unprotected error. +In the first case, coroutine.resume returns true, +plus any values returned by the coroutine main function. +In case of errors, coroutine.resume returns false +plus an error message. + + +

+A coroutine yields by calling coroutine.yield. +When a coroutine yields, +the corresponding coroutine.resume returns immediately, +even if the yield happens inside nested function calls +(that is, not in the main function, +but in a function directly or indirectly called by the main function). +In the case of a yield, coroutine.resume also returns true, +plus any values passed to coroutine.yield. +The next time you resume the same coroutine, +it continues its execution from the point where it yielded, +with the call to coroutine.yield returning any extra +arguments passed to coroutine.resume. + + +

+Like coroutine.create, +the coroutine.wrap function also creates a coroutine, +but instead of returning the coroutine itself, +it returns a function that, when called, resumes the coroutine. +Any arguments passed to this function +go as extra arguments to coroutine.resume. +coroutine.wrap returns all the values returned by coroutine.resume, +except the first one (the boolean error code). +Unlike coroutine.resume, +coroutine.wrap does not catch errors; +any error is propagated to the caller. + + +

+As an example, +consider the following code: + +

+     function foo (a)
+       print("foo", a)
+       return coroutine.yield(2*a)
+     end
+     
+     co = coroutine.create(function (a,b)
+           print("co-body", a, b)
+           local r = foo(a+1)
+           print("co-body", r)
+           local r, s = coroutine.yield(a+b, a-b)
+           print("co-body", r, s)
+           return b, "end"
+     end)
+            
+     print("main", coroutine.resume(co, 1, 10))
+     print("main", coroutine.resume(co, "r"))
+     print("main", coroutine.resume(co, "x", "y"))
+     print("main", coroutine.resume(co, "x", "y"))
+

+When you run it, it produces the following output: + +

+     co-body 1       10
+     foo     2
+     
+     main    true    4
+     co-body r
+     main    true    11      -9
+     co-body x       y
+     main    true    10      end
+     main    false   cannot resume dead coroutine
+
+ + + + +

3 - The Application Program Interface

+ +

+ +This section describes the C API for Lua, that is, +the set of C functions available to the host program to communicate +with Lua. +All API functions and related types and constants +are declared in the header file lua.h. + + +

+Even when we use the term "function", +any facility in the API may be provided as a macro instead. +All such macros use each of their arguments exactly once +(except for the first argument, which is always a Lua state), +and so do not generate any hidden side-effects. + + +

+As in most C libraries, +the Lua API functions do not check their arguments for validity or consistency. +However, you can change this behavior by compiling Lua +with a proper definition for the macro luai_apicheck, +in file luaconf.h. + + + +

3.1 - The Stack

+ +

+Lua uses a virtual stack to pass values to and from C. +Each element in this stack represents a Lua value +(nil, number, string, etc.). + + +

+Whenever Lua calls C, the called function gets a new stack, +which is independent of previous stacks and of stacks of +C functions that are still active. +This stack initially contains any arguments to the C function +and it is where the C function pushes its results +to be returned to the caller (see lua_CFunction). + + +

+For convenience, +most query operations in the API do not follow a strict stack discipline. +Instead, they can refer to any element in the stack +by using an index: +A positive index represents an absolute stack position +(starting at 1); +a negative index represents an offset relative to the top of the stack. +More specifically, if the stack has n elements, +then index 1 represents the first element +(that is, the element that was pushed onto the stack first) +and +index n represents the last element; +index -1 also represents the last element +(that is, the element at the top) +and index -n represents the first element. +We say that an index is valid +if it lies between 1 and the stack top +(that is, if 1 ≤ abs(index) ≤ top). + + + + + + +

3.2 - Stack Size

+ +

+When you interact with Lua API, +you are responsible for ensuring consistency. +In particular, +you are responsible for controlling stack overflow. +You can use the function lua_checkstack +to grow the stack size. + + +

+Whenever Lua calls C, +it ensures that at least LUA_MINSTACK stack positions are available. +LUA_MINSTACK is defined as 20, +so that usually you do not have to worry about stack space +unless your code has loops pushing elements onto the stack. + + +

+Most query functions accept as indices any value inside the +available stack space, that is, indices up to the maximum stack size +you have set through lua_checkstack. +Such indices are called acceptable indices. +More formally, we define an acceptable index +as follows: + +

+     (index < 0 && abs(index) <= top) ||
+     (index > 0 && index <= stackspace)
+

+Note that 0 is never an acceptable index. + + + + + +

3.3 - Pseudo-Indices

+ +

+Unless otherwise noted, +any function that accepts valid indices can also be called with +pseudo-indices, +which represent some Lua values that are accessible to C code +but which are not in the stack. +Pseudo-indices are used to access the thread environment, +the function environment, +the registry, +and the upvalues of a C function (see §3.4). + + +

+The thread environment (where global variables live) is +always at pseudo-index LUA_GLOBALSINDEX. +The environment of the running C function is always +at pseudo-index LUA_ENVIRONINDEX. + + +

+To access and change the value of global variables, +you can use regular table operations over an environment table. +For instance, to access the value of a global variable, do + +

+     lua_getfield(L, LUA_GLOBALSINDEX, varname);
+
+ + + + +

3.4 - C Closures

+ +

+When a C function is created, +it is possible to associate some values with it, +thus creating a C closure; +these values are called upvalues and are +accessible to the function whenever it is called +(see lua_pushcclosure). + + +

+Whenever a C function is called, +its upvalues are located at specific pseudo-indices. +These pseudo-indices are produced by the macro +lua_upvalueindex. +The first value associated with a function is at position +lua_upvalueindex(1), and so on. +Any access to lua_upvalueindex(n), +where n is greater than the number of upvalues of the +current function (but not greater than 256), +produces an acceptable (but invalid) index. + + + + + +

3.5 - Registry

+ +

+Lua provides a registry, +a pre-defined table that can be used by any C code to +store whatever Lua value it needs to store. +This table is always located at pseudo-index +LUA_REGISTRYINDEX. +Any C library can store data into this table, +but it should take care to choose keys different from those used +by other libraries, to avoid collisions. +Typically, you should use as key a string containing your library name +or a light userdata with the address of a C object in your code. + + +

+The integer keys in the registry are used by the reference mechanism, +implemented by the auxiliary library, +and therefore should not be used for other purposes. + + + + + +

3.6 - Error Handling in C

+ +

+Internally, Lua uses the C longjmp facility to handle errors. +(You can also choose to use exceptions if you use C++; +see file luaconf.h.) +When Lua faces any error +(such as memory allocation errors, type errors, syntax errors, +and runtime errors) +it raises an error; +that is, it does a long jump. +A protected environment uses setjmp +to set a recover point; +any error jumps to the most recent active recover point. + + +

+Most functions in the API can throw an error, +for instance due to a memory allocation error. +The documentation for each function indicates whether +it can throw errors. + + +

+Inside a C function you can throw an error by calling lua_error. + + + + + +

3.7 - Functions and Types

+ +

+Here we list all functions and types from the C API in +alphabetical order. +Each function has an indicator like this: +[-o, +p, x] + + +

+The first field, o, +is how many elements the function pops from the stack. +The second field, p, +is how many elements the function pushes onto the stack. +(Any function always pushes its results after popping its arguments.) +A field in the form x|y means the function can push (or pop) +x or y elements, +depending on the situation; +an interrogation mark '?' means that +we cannot know how many elements the function pops/pushes +by looking only at its arguments +(e.g., they may depend on what is on the stack). +The third field, x, +tells whether the function may throw errors: +'-' means the function never throws any error; +'m' means the function may throw an error +only due to not enough memory; +'e' means the function may throw other kinds of errors; +'v' means the function may throw an error on purpose. + + + +


lua_Alloc

+
typedef void * (*lua_Alloc) (void *ud,
+                             void *ptr,
+                             size_t osize,
+                             size_t nsize);
+ +

+The type of the memory-allocation function used by Lua states. +The allocator function must provide a +functionality similar to realloc, +but not exactly the same. +Its arguments are +ud, an opaque pointer passed to lua_newstate; +ptr, a pointer to the block being allocated/reallocated/freed; +osize, the original size of the block; +nsize, the new size of the block. +ptr is NULL if and only if osize is zero. +When nsize is zero, the allocator must return NULL; +if osize is not zero, +it should free the block pointed to by ptr. +When nsize is not zero, the allocator returns NULL +if and only if it cannot fill the request. +When nsize is not zero and osize is zero, +the allocator should behave like malloc. +When nsize and osize are not zero, +the allocator behaves like realloc. +Lua assumes that the allocator never fails when +osize >= nsize. + + +

+Here is a simple implementation for the allocator function. +It is used in the auxiliary library by luaL_newstate. + +

+     static void *l_alloc (void *ud, void *ptr, size_t osize,
+                                                size_t nsize) {
+       (void)ud;  (void)osize;  /* not used */
+       if (nsize == 0) {
+         free(ptr);
+         return NULL;
+       }
+       else
+         return realloc(ptr, nsize);
+     }
+

+This code assumes +that free(NULL) has no effect and that +realloc(NULL, size) is equivalent to malloc(size). +ANSI C ensures both behaviors. + + + + + +


lua_atpanic

+[-0, +0, -] +

lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf);
+ +

+Sets a new panic function and returns the old one. + + +

+If an error happens outside any protected environment, +Lua calls a panic function +and then calls exit(EXIT_FAILURE), +thus exiting the host application. +Your panic function can avoid this exit by +never returning (e.g., doing a long jump). + + +

+The panic function can access the error message at the top of the stack. + + + + + +


lua_call

+[-(nargs + 1), +nresults, e] +

void lua_call (lua_State *L, int nargs, int nresults);
+ +

+Calls a function. + + +

+To call a function you must use the following protocol: +first, the function to be called is pushed onto the stack; +then, the arguments to the function are pushed +in direct order; +that is, the first argument is pushed first. +Finally you call lua_call; +nargs is the number of arguments that you pushed onto the stack. +All arguments and the function value are popped from the stack +when the function is called. +The function results are pushed onto the stack when the function returns. +The number of results is adjusted to nresults, +unless nresults is LUA_MULTRET. +In this case, all results from the function are pushed. +Lua takes care that the returned values fit into the stack space. +The function results are pushed onto the stack in direct order +(the first result is pushed first), +so that after the call the last result is on the top of the stack. + + +

+Any error inside the called function is propagated upwards +(with a longjmp). + + +

+The following example shows how the host program can do the +equivalent to this Lua code: + +

+     a = f("how", t.x, 14)
+

+Here it is in C: + +

+     lua_getfield(L, LUA_GLOBALSINDEX, "f"); /* function to be called */
+     lua_pushstring(L, "how");                        /* 1st argument */
+     lua_getfield(L, LUA_GLOBALSINDEX, "t");   /* table to be indexed */
+     lua_getfield(L, -1, "x");        /* push result of t.x (2nd arg) */
+     lua_remove(L, -2);                  /* remove 't' from the stack */
+     lua_pushinteger(L, 14);                          /* 3rd argument */
+     lua_call(L, 3, 1);     /* call 'f' with 3 arguments and 1 result */
+     lua_setfield(L, LUA_GLOBALSINDEX, "a");        /* set global 'a' */
+

+Note that the code above is "balanced": +at its end, the stack is back to its original configuration. +This is considered good programming practice. + + + + + +


lua_CFunction

+
typedef int (*lua_CFunction) (lua_State *L);
+ +

+Type for C functions. + + +

+In order to communicate properly with Lua, +a C function must use the following protocol, +which defines the way parameters and results are passed: +a C function receives its arguments from Lua in its stack +in direct order (the first argument is pushed first). +So, when the function starts, +lua_gettop(L) returns the number of arguments received by the function. +The first argument (if any) is at index 1 +and its last argument is at index lua_gettop(L). +To return values to Lua, a C function just pushes them onto the stack, +in direct order (the first result is pushed first), +and returns the number of results. +Any other value in the stack below the results will be properly +discarded by Lua. +Like a Lua function, a C function called by Lua can also return +many results. + + +

+As an example, the following function receives a variable number +of numerical arguments and returns their average and sum: + +

+     static int foo (lua_State *L) {
+       int n = lua_gettop(L);    /* number of arguments */
+       lua_Number sum = 0;
+       int i;
+       for (i = 1; i <= n; i++) {
+         if (!lua_isnumber(L, i)) {
+           lua_pushstring(L, "incorrect argument");
+           lua_error(L);
+         }
+         sum += lua_tonumber(L, i);
+       }
+       lua_pushnumber(L, sum/n);        /* first result */
+       lua_pushnumber(L, sum);         /* second result */
+       return 2;                   /* number of results */
+     }
+
+ + + + +

lua_checkstack

+[-0, +0, m] +

int lua_checkstack (lua_State *L, int extra);
+ +

+Ensures that there are at least extra free stack slots in the stack. +It returns false if it cannot grow the stack to that size. +This function never shrinks the stack; +if the stack is already larger than the new size, +it is left unchanged. + + + + + +


lua_close

+[-0, +0, -] +

void lua_close (lua_State *L);
+ +

+Destroys all objects in the given Lua state +(calling the corresponding garbage-collection metamethods, if any) +and frees all dynamic memory used by this state. +On several platforms, you may not need to call this function, +because all resources are naturally released when the host program ends. +On the other hand, long-running programs, +such as a daemon or a web server, +might need to release states as soon as they are not needed, +to avoid growing too large. + + + + + +


lua_concat

+[-n, +1, e] +

void lua_concat (lua_State *L, int n);
+ +

+Concatenates the n values at the top of the stack, +pops them, and leaves the result at the top. +If n is 1, the result is the single value on the stack +(that is, the function does nothing); +if n is 0, the result is the empty string. +Concatenation is performed following the usual semantics of Lua +(see §2.5.4). + + + + + +


lua_cpcall

+[-0, +(0|1), -] +

int lua_cpcall (lua_State *L, lua_CFunction func, void *ud);
+ +

+Calls the C function func in protected mode. +func starts with only one element in its stack, +a light userdata containing ud. +In case of errors, +lua_cpcall returns the same error codes as lua_pcall, +plus the error object on the top of the stack; +otherwise, it returns zero, and does not change the stack. +All values returned by func are discarded. + + + + + +


lua_createtable

+[-0, +1, m] +

void lua_createtable (lua_State *L, int narr, int nrec);
+ +

+Creates a new empty table and pushes it onto the stack. +The new table has space pre-allocated +for narr array elements and nrec non-array elements. +This pre-allocation is useful when you know exactly how many elements +the table will have. +Otherwise you can use the function lua_newtable. + + + + + +


lua_dump

+[-0, +0, m] +

int lua_dump (lua_State *L, lua_Writer writer, void *data);
+ +

+Dumps a function as a binary chunk. +Receives a Lua function on the top of the stack +and produces a binary chunk that, +if loaded again, +results in a function equivalent to the one dumped. +As it produces parts of the chunk, +lua_dump calls function writer (see lua_Writer) +with the given data +to write them. + + +

+The value returned is the error code returned by the last +call to the writer; +0 means no errors. + + +

+This function does not pop the Lua function from the stack. + + + + + +


lua_equal

+[-0, +0, e] +

int lua_equal (lua_State *L, int index1, int index2);
+ +

+Returns 1 if the two values in acceptable indices index1 and +index2 are equal, +following the semantics of the Lua == operator +(that is, may call metamethods). +Otherwise returns 0. +Also returns 0 if any of the indices is non valid. + + + + + +


lua_error

+[-1, +0, v] +

int lua_error (lua_State *L);
+ +

+Generates a Lua error. +The error message (which can actually be a Lua value of any type) +must be on the stack top. +This function does a long jump, +and therefore never returns. +(see luaL_error). + + + + + +


lua_gc

+[-0, +0, e] +

int lua_gc (lua_State *L, int what, int data);
+ +

+Controls the garbage collector. + + +

+This function performs several tasks, +according to the value of the parameter what: + +

    + +
  • LUA_GCSTOP: +stops the garbage collector. +
  • + +
  • LUA_GCRESTART: +restarts the garbage collector. +
  • + +
  • LUA_GCCOLLECT: +performs a full garbage-collection cycle. +
  • + +
  • LUA_GCCOUNT: +returns the current amount of memory (in Kbytes) in use by Lua. +
  • + +
  • LUA_GCCOUNTB: +returns the remainder of dividing the current amount of bytes of +memory in use by Lua by 1024. +
  • + +
  • LUA_GCSTEP: +performs an incremental step of garbage collection. +The step "size" is controlled by data +(larger values mean more steps) in a non-specified way. +If you want to control the step size +you must experimentally tune the value of data. +The function returns 1 if the step finished a +garbage-collection cycle. +
  • + +
  • LUA_GCSETPAUSE: +sets data as the new value +for the pause of the collector (see §2.10). +The function returns the previous value of the pause. +
  • + +
  • LUA_GCSETSTEPMUL: +sets data as the new value for the step multiplier of +the collector (see §2.10). +The function returns the previous value of the step multiplier. +
  • + +
+ + + + +

lua_getallocf

+[-0, +0, -] +

lua_Alloc lua_getallocf (lua_State *L, void **ud);
+ +

+Returns the memory-allocation function of a given state. +If ud is not NULL, Lua stores in *ud the +opaque pointer passed to lua_newstate. + + + + + +


lua_getfenv

+[-0, +1, -] +

void lua_getfenv (lua_State *L, int index);
+ +

+Pushes onto the stack the environment table of +the value at the given index. + + + + + +


lua_getfield

+[-0, +1, e] +

void lua_getfield (lua_State *L, int index, const char *k);
+ +

+Pushes onto the stack the value t[k], +where t is the value at the given valid index. +As in Lua, this function may trigger a metamethod +for the "index" event (see §2.8). + + + + + +


lua_getglobal

+[-0, +1, e] +

void lua_getglobal (lua_State *L, const char *name);
+ +

+Pushes onto the stack the value of the global name. +It is defined as a macro: + +

+     #define lua_getglobal(L,s)  lua_getfield(L, LUA_GLOBALSINDEX, s)
+
+ + + + +

lua_getmetatable

+[-0, +(0|1), -] +

int lua_getmetatable (lua_State *L, int index);
+ +

+Pushes onto the stack the metatable of the value at the given +acceptable index. +If the index is not valid, +or if the value does not have a metatable, +the function returns 0 and pushes nothing on the stack. + + + + + +


lua_gettable

+[-1, +1, e] +

void lua_gettable (lua_State *L, int index);
+ +

+Pushes onto the stack the value t[k], +where t is the value at the given valid index +and k is the value at the top of the stack. + + +

+This function pops the key from the stack +(putting the resulting value in its place). +As in Lua, this function may trigger a metamethod +for the "index" event (see §2.8). + + + + + +


lua_gettop

+[-0, +0, -] +

int lua_gettop (lua_State *L);
+ +

+Returns the index of the top element in the stack. +Because indices start at 1, +this result is equal to the number of elements in the stack +(and so 0 means an empty stack). + + + + + +


lua_insert

+[-1, +1, -] +

void lua_insert (lua_State *L, int index);
+ +

+Moves the top element into the given valid index, +shifting up the elements above this index to open space. +Cannot be called with a pseudo-index, +because a pseudo-index is not an actual stack position. + + + + + +


lua_Integer

+
typedef ptrdiff_t lua_Integer;
+ +

+The type used by the Lua API to represent integral values. + + +

+By default it is a ptrdiff_t, +which is usually the largest signed integral type the machine handles +"comfortably". + + + + + +


lua_isboolean

+[-0, +0, -] +

int lua_isboolean (lua_State *L, int index);
+ +

+Returns 1 if the value at the given acceptable index has type boolean, +and 0 otherwise. + + + + + +


lua_iscfunction

+[-0, +0, -] +

int lua_iscfunction (lua_State *L, int index);
+ +

+Returns 1 if the value at the given acceptable index is a C function, +and 0 otherwise. + + + + + +


lua_isfunction

+[-0, +0, -] +

int lua_isfunction (lua_State *L, int index);
+ +

+Returns 1 if the value at the given acceptable index is a function +(either C or Lua), and 0 otherwise. + + + + + +


lua_islightuserdata

+[-0, +0, -] +

int lua_islightuserdata (lua_State *L, int index);
+ +

+Returns 1 if the value at the given acceptable index is a light userdata, +and 0 otherwise. + + + + + +


lua_isnil

+[-0, +0, -] +

int lua_isnil (lua_State *L, int index);
+ +

+Returns 1 if the value at the given acceptable index is nil, +and 0 otherwise. + + + + + +


lua_isnone

+[-0, +0, -] +

int lua_isnone (lua_State *L, int index);
+ +

+Returns 1 if the given acceptable index is not valid +(that is, it refers to an element outside the current stack), +and 0 otherwise. + + + + + +


lua_isnoneornil

+[-0, +0, -] +

int lua_isnoneornil (lua_State *L, int index);
+ +

+Returns 1 if the given acceptable index is not valid +(that is, it refers to an element outside the current stack) +or if the value at this index is nil, +and 0 otherwise. + + + + + +


lua_isnumber

+[-0, +0, -] +

int lua_isnumber (lua_State *L, int index);
+ +

+Returns 1 if the value at the given acceptable index is a number +or a string convertible to a number, +and 0 otherwise. + + + + + +


lua_isstring

+[-0, +0, -] +

int lua_isstring (lua_State *L, int index);
+ +

+Returns 1 if the value at the given acceptable index is a string +or a number (which is always convertible to a string), +and 0 otherwise. + + + + + +


lua_istable

+[-0, +0, -] +

int lua_istable (lua_State *L, int index);
+ +

+Returns 1 if the value at the given acceptable index is a table, +and 0 otherwise. + + + + + +


lua_isthread

+[-0, +0, -] +

int lua_isthread (lua_State *L, int index);
+ +

+Returns 1 if the value at the given acceptable index is a thread, +and 0 otherwise. + + + + + +


lua_isuserdata

+[-0, +0, -] +

int lua_isuserdata (lua_State *L, int index);
+ +

+Returns 1 if the value at the given acceptable index is a userdata +(either full or light), and 0 otherwise. + + + + + +


lua_lessthan

+[-0, +0, e] +

int lua_lessthan (lua_State *L, int index1, int index2);
+ +

+Returns 1 if the value at acceptable index index1 is smaller +than the value at acceptable index index2, +following the semantics of the Lua < operator +(that is, may call metamethods). +Otherwise returns 0. +Also returns 0 if any of the indices is non valid. + + + + + +


lua_load

+[-0, +1, -] +

int lua_load (lua_State *L,
+              lua_Reader reader,
+              void *data,
+              const char *chunkname);
+ +

+Loads a Lua chunk. +If there are no errors, +lua_load pushes the compiled chunk as a Lua +function on top of the stack. +Otherwise, it pushes an error message. +The return values of lua_load are: + +

    + +
  • 0: no errors;
  • + +
  • LUA_ERRSYNTAX: +syntax error during pre-compilation;
  • + +
  • LUA_ERRMEM: +memory allocation error.
  • + +
+ +

+This function only loads a chunk; +it does not run it. + + +

+lua_load automatically detects whether the chunk is text or binary, +and loads it accordingly (see program luac). + + +

+The lua_load function uses a user-supplied reader function +to read the chunk (see lua_Reader). +The data argument is an opaque value passed to the reader function. + + +

+The chunkname argument gives a name to the chunk, +which is used for error messages and in debug information (see §3.8). + + + + + +


lua_newstate

+[-0, +0, -] +

lua_State *lua_newstate (lua_Alloc f, void *ud);
+ +

+Creates a new, independent state. +Returns NULL if cannot create the state +(due to lack of memory). +The argument f is the allocator function; +Lua does all memory allocation for this state through this function. +The second argument, ud, is an opaque pointer that Lua +simply passes to the allocator in every call. + + + + + +


lua_newtable

+[-0, +1, m] +

void lua_newtable (lua_State *L);
+ +

+Creates a new empty table and pushes it onto the stack. +It is equivalent to lua_createtable(L, 0, 0). + + + + + +


lua_newthread

+[-0, +1, m] +

lua_State *lua_newthread (lua_State *L);
+ +

+Creates a new thread, pushes it on the stack, +and returns a pointer to a lua_State that represents this new thread. +The new state returned by this function shares with the original state +all global objects (such as tables), +but has an independent execution stack. + + +

+There is no explicit function to close or to destroy a thread. +Threads are subject to garbage collection, +like any Lua object. + + + + + +


lua_newuserdata

+[-0, +1, m] +

void *lua_newuserdata (lua_State *L, size_t size);
+ +

+This function allocates a new block of memory with the given size, +pushes onto the stack a new full userdata with the block address, +and returns this address. + + +

+Userdata represent C values in Lua. +A full userdata represents a block of memory. +It is an object (like a table): +you must create it, it can have its own metatable, +and you can detect when it is being collected. +A full userdata is only equal to itself (under raw equality). + + +

+When Lua collects a full userdata with a gc metamethod, +Lua calls the metamethod and marks the userdata as finalized. +When this userdata is collected again then +Lua frees its corresponding memory. + + + + + +


lua_next

+[-1, +(2|0), e] +

int lua_next (lua_State *L, int index);
+ +

+Pops a key from the stack, +and pushes a key-value pair from the table at the given index +(the "next" pair after the given key). +If there are no more elements in the table, +then lua_next returns 0 (and pushes nothing). + + +

+A typical traversal looks like this: + +

+     /* table is in the stack at index 't' */
+     lua_pushnil(L);  /* first key */
+     while (lua_next(L, t) != 0) {
+       /* uses 'key' (at index -2) and 'value' (at index -1) */
+       printf("%s - %s\n",
+              lua_typename(L, lua_type(L, -2)),
+              lua_typename(L, lua_type(L, -1)));
+       /* removes 'value'; keeps 'key' for next iteration */
+       lua_pop(L, 1);
+     }
+
+ +

+While traversing a table, +do not call lua_tolstring directly on a key, +unless you know that the key is actually a string. +Recall that lua_tolstring changes +the value at the given index; +this confuses the next call to lua_next. + + + + + +


lua_Number

+
typedef double lua_Number;
+ +

+The type of numbers in Lua. +By default, it is double, but that can be changed in luaconf.h. + + +

+Through the configuration file you can change +Lua to operate with another type for numbers (e.g., float or long). + + + + + +


lua_objlen

+[-0, +0, -] +

size_t lua_objlen (lua_State *L, int index);
+ +

+Returns the "length" of the value at the given acceptable index: +for strings, this is the string length; +for tables, this is the result of the length operator ('#'); +for userdata, this is the size of the block of memory allocated +for the userdata; +for other values, it is 0. + + + + + +


lua_pcall

+[-(nargs + 1), +(nresults|1), -] +

int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);
+ +

+Calls a function in protected mode. + + +

+Both nargs and nresults have the same meaning as +in lua_call. +If there are no errors during the call, +lua_pcall behaves exactly like lua_call. +However, if there is any error, +lua_pcall catches it, +pushes a single value on the stack (the error message), +and returns an error code. +Like lua_call, +lua_pcall always removes the function +and its arguments from the stack. + + +

+If errfunc is 0, +then the error message returned on the stack +is exactly the original error message. +Otherwise, errfunc is the stack index of an +error handler function. +(In the current implementation, this index cannot be a pseudo-index.) +In case of runtime errors, +this function will be called with the error message +and its return value will be the message returned on the stack by lua_pcall. + + +

+Typically, the error handler function is used to add more debug +information to the error message, such as a stack traceback. +Such information cannot be gathered after the return of lua_pcall, +since by then the stack has unwound. + + +

+The lua_pcall function returns 0 in case of success +or one of the following error codes +(defined in lua.h): + +

    + +
  • LUA_ERRRUN: +a runtime error. +
  • + +
  • LUA_ERRMEM: +memory allocation error. +For such errors, Lua does not call the error handler function. +
  • + +
  • LUA_ERRERR: +error while running the error handler function. +
  • + +
+ + + + +

lua_pop

+[-n, +0, -] +

void lua_pop (lua_State *L, int n);
+ +

+Pops n elements from the stack. + + + + + +


lua_pushboolean

+[-0, +1, -] +

void lua_pushboolean (lua_State *L, int b);
+ +

+Pushes a boolean value with value b onto the stack. + + + + + +


lua_pushcclosure

+[-n, +1, m] +

void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);
+ +

+Pushes a new C closure onto the stack. + + +

+When a C function is created, +it is possible to associate some values with it, +thus creating a C closure (see §3.4); +these values are then accessible to the function whenever it is called. +To associate values with a C function, +first these values should be pushed onto the stack +(when there are multiple values, the first value is pushed first). +Then lua_pushcclosure +is called to create and push the C function onto the stack, +with the argument n telling how many values should be +associated with the function. +lua_pushcclosure also pops these values from the stack. + + +

+The maximum value for n is 255. + + + + + +


lua_pushcfunction

+[-0, +1, m] +

void lua_pushcfunction (lua_State *L, lua_CFunction f);
+ +

+Pushes a C function onto the stack. +This function receives a pointer to a C function +and pushes onto the stack a Lua value of type function that, +when called, invokes the corresponding C function. + + +

+Any function to be registered in Lua must +follow the correct protocol to receive its parameters +and return its results (see lua_CFunction). + + +

+lua_pushcfunction is defined as a macro: + +

+     #define lua_pushcfunction(L,f)  lua_pushcclosure(L,f,0)
+
+ + + + +

lua_pushfstring

+[-0, +1, m] +

const char *lua_pushfstring (lua_State *L, const char *fmt, ...);
+ +

+Pushes onto the stack a formatted string +and returns a pointer to this string. +It is similar to the C function sprintf, +but has some important differences: + +

    + +
  • +You do not have to allocate space for the result: +the result is a Lua string and Lua takes care of memory allocation +(and deallocation, through garbage collection). +
  • + +
  • +The conversion specifiers are quite restricted. +There are no flags, widths, or precisions. +The conversion specifiers can only be +'%%' (inserts a '%' in the string), +'%s' (inserts a zero-terminated string, with no size restrictions), +'%f' (inserts a lua_Number), +'%p' (inserts a pointer as a hexadecimal numeral), +'%d' (inserts an int), and +'%c' (inserts an int as a character). +
  • + +
+ + + + +

lua_pushinteger

+[-0, +1, -] +

void lua_pushinteger (lua_State *L, lua_Integer n);
+ +

+Pushes a number with value n onto the stack. + + + + + +


lua_pushlightuserdata

+[-0, +1, -] +

void lua_pushlightuserdata (lua_State *L, void *p);
+ +

+Pushes a light userdata onto the stack. + + +

+Userdata represent C values in Lua. +A light userdata represents a pointer. +It is a value (like a number): +you do not create it, it has no individual metatable, +and it is not collected (as it was never created). +A light userdata is equal to "any" +light userdata with the same C address. + + + + + +


lua_pushliteral

+[-0, +1, m] +

void lua_pushliteral (lua_State *L, const char *s);
+ +

+This macro is equivalent to lua_pushlstring, +but can be used only when s is a literal string. +In these cases, it automatically provides the string length. + + + + + +


lua_pushlstring

+[-0, +1, m] +

void lua_pushlstring (lua_State *L, const char *s, size_t len);
+ +

+Pushes the string pointed to by s with size len +onto the stack. +Lua makes (or reuses) an internal copy of the given string, +so the memory at s can be freed or reused immediately after +the function returns. +The string can contain embedded zeros. + + + + + +


lua_pushnil

+[-0, +1, -] +

void lua_pushnil (lua_State *L);
+ +

+Pushes a nil value onto the stack. + + + + + +


lua_pushnumber

+[-0, +1, -] +

void lua_pushnumber (lua_State *L, lua_Number n);
+ +

+Pushes a number with value n onto the stack. + + + + + +


lua_pushstring

+[-0, +1, m] +

void lua_pushstring (lua_State *L, const char *s);
+ +

+Pushes the zero-terminated string pointed to by s +onto the stack. +Lua makes (or reuses) an internal copy of the given string, +so the memory at s can be freed or reused immediately after +the function returns. +The string cannot contain embedded zeros; +it is assumed to end at the first zero. + + + + + +


lua_pushthread

+[-0, +1, -] +

int lua_pushthread (lua_State *L);
+ +

+Pushes the thread represented by L onto the stack. +Returns 1 if this thread is the main thread of its state. + + + + + +


lua_pushvalue

+[-0, +1, -] +

void lua_pushvalue (lua_State *L, int index);
+ +

+Pushes a copy of the element at the given valid index +onto the stack. + + + + + +


lua_pushvfstring

+[-0, +1, m] +

const char *lua_pushvfstring (lua_State *L,
+                              const char *fmt,
+                              va_list argp);
+ +

+Equivalent to lua_pushfstring, except that it receives a va_list +instead of a variable number of arguments. + + + + + +


lua_rawequal

+[-0, +0, -] +

int lua_rawequal (lua_State *L, int index1, int index2);
+ +

+Returns 1 if the two values in acceptable indices index1 and +index2 are primitively equal +(that is, without calling metamethods). +Otherwise returns 0. +Also returns 0 if any of the indices are non valid. + + + + + +


lua_rawget

+[-1, +1, -] +

void lua_rawget (lua_State *L, int index);
+ +

+Similar to lua_gettable, but does a raw access +(i.e., without metamethods). + + + + + +


lua_rawgeti

+[-0, +1, -] +

void lua_rawgeti (lua_State *L, int index, int n);
+ +

+Pushes onto the stack the value t[n], +where t is the value at the given valid index. +The access is raw; +that is, it does not invoke metamethods. + + + + + +


lua_rawset

+[-2, +0, m] +

void lua_rawset (lua_State *L, int index);
+ +

+Similar to lua_settable, but does a raw assignment +(i.e., without metamethods). + + + + + +


lua_rawseti

+[-1, +0, m] +

void lua_rawseti (lua_State *L, int index, int n);
+ +

+Does the equivalent of t[n] = v, +where t is the value at the given valid index +and v is the value at the top of the stack. + + +

+This function pops the value from the stack. +The assignment is raw; +that is, it does not invoke metamethods. + + + + + +


lua_Reader

+
typedef const char * (*lua_Reader) (lua_State *L,
+                                    void *data,
+                                    size_t *size);
+ +

+The reader function used by lua_load. +Every time it needs another piece of the chunk, +lua_load calls the reader, +passing along its data parameter. +The reader must return a pointer to a block of memory +with a new piece of the chunk +and set size to the block size. +The block must exist until the reader function is called again. +To signal the end of the chunk, +the reader must return NULL or set size to zero. +The reader function may return pieces of any size greater than zero. + + + + + +


lua_register

+[-0, +0, e] +

void lua_register (lua_State *L,
+                   const char *name,
+                   lua_CFunction f);
+ +

+Sets the C function f as the new value of global name. +It is defined as a macro: + +

+     #define lua_register(L,n,f) \
+            (lua_pushcfunction(L, f), lua_setglobal(L, n))
+
+ + + + +

lua_remove

+[-1, +0, -] +

void lua_remove (lua_State *L, int index);
+ +

+Removes the element at the given valid index, +shifting down the elements above this index to fill the gap. +Cannot be called with a pseudo-index, +because a pseudo-index is not an actual stack position. + + + + + +


lua_replace

+[-1, +0, -] +

void lua_replace (lua_State *L, int index);
+ +

+Moves the top element into the given position (and pops it), +without shifting any element +(therefore replacing the value at the given position). + + + + + +


lua_resume

+[-?, +?, -] +

int lua_resume (lua_State *L, int narg);
+ +

+Starts and resumes a coroutine in a given thread. + + +

+To start a coroutine, you first create a new thread +(see lua_newthread); +then you push onto its stack the main function plus any arguments; +then you call lua_resume, +with narg being the number of arguments. +This call returns when the coroutine suspends or finishes its execution. +When it returns, the stack contains all values passed to lua_yield, +or all values returned by the body function. +lua_resume returns +LUA_YIELD if the coroutine yields, +0 if the coroutine finishes its execution +without errors, +or an error code in case of errors (see lua_pcall). +In case of errors, +the stack is not unwound, +so you can use the debug API over it. +The error message is on the top of the stack. +To restart a coroutine, you put on its stack only the values to +be passed as results from yield, +and then call lua_resume. + + + + + +


lua_setallocf

+[-0, +0, -] +

void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);
+ +

+Changes the allocator function of a given state to f +with user data ud. + + + + + +


lua_setfenv

+[-1, +0, -] +

int lua_setfenv (lua_State *L, int index);
+ +

+Pops a table from the stack and sets it as +the new environment for the value at the given index. +If the value at the given index is +neither a function nor a thread nor a userdata, +lua_setfenv returns 0. +Otherwise it returns 1. + + + + + +


lua_setfield

+[-1, +0, e] +

void lua_setfield (lua_State *L, int index, const char *k);
+ +

+Does the equivalent to t[k] = v, +where t is the value at the given valid index +and v is the value at the top of the stack. + + +

+This function pops the value from the stack. +As in Lua, this function may trigger a metamethod +for the "newindex" event (see §2.8). + + + + + +


lua_setglobal

+[-1, +0, e] +

void lua_setglobal (lua_State *L, const char *name);
+ +

+Pops a value from the stack and +sets it as the new value of global name. +It is defined as a macro: + +

+     #define lua_setglobal(L,s)   lua_setfield(L, LUA_GLOBALSINDEX, s)
+
+ + + + +

lua_setmetatable

+[-1, +0, -] +

int lua_setmetatable (lua_State *L, int index);
+ +

+Pops a table from the stack and +sets it as the new metatable for the value at the given +acceptable index. + + + + + +


lua_settable

+[-2, +0, e] +

void lua_settable (lua_State *L, int index);
+ +

+Does the equivalent to t[k] = v, +where t is the value at the given valid index, +v is the value at the top of the stack, +and k is the value just below the top. + + +

+This function pops both the key and the value from the stack. +As in Lua, this function may trigger a metamethod +for the "newindex" event (see §2.8). + + + + + +


lua_settop

+[-?, +?, -] +

void lua_settop (lua_State *L, int index);
+ +

+Accepts any acceptable index, or 0, +and sets the stack top to this index. +If the new top is larger than the old one, +then the new elements are filled with nil. +If index is 0, then all stack elements are removed. + + + + + +


lua_State

+
typedef struct lua_State lua_State;
+ +

+Opaque structure that keeps the whole state of a Lua interpreter. +The Lua library is fully reentrant: +it has no global variables. +All information about a state is kept in this structure. + + +

+A pointer to this state must be passed as the first argument to +every function in the library, except to lua_newstate, +which creates a Lua state from scratch. + + + + + +


lua_status

+[-0, +0, -] +

int lua_status (lua_State *L);
+ +

+Returns the status of the thread L. + + +

+The status can be 0 for a normal thread, +an error code if the thread finished its execution with an error, +or LUA_YIELD if the thread is suspended. + + + + + +


lua_toboolean

+[-0, +0, -] +

int lua_toboolean (lua_State *L, int index);
+ +

+Converts the Lua value at the given acceptable index to a C boolean +value (0 or 1). +Like all tests in Lua, +lua_toboolean returns 1 for any Lua value +different from false and nil; +otherwise it returns 0. +It also returns 0 when called with a non-valid index. +(If you want to accept only actual boolean values, +use lua_isboolean to test the value's type.) + + + + + +


lua_tocfunction

+[-0, +0, -] +

lua_CFunction lua_tocfunction (lua_State *L, int index);
+ +

+Converts a value at the given acceptable index to a C function. +That value must be a C function; +otherwise, returns NULL. + + + + + +


lua_tointeger

+[-0, +0, -] +

lua_Integer lua_tointeger (lua_State *L, int index);
+ +

+Converts the Lua value at the given acceptable index +to the signed integral type lua_Integer. +The Lua value must be a number or a string convertible to a number +(see §2.2.1); +otherwise, lua_tointeger returns 0. + + +

+If the number is not an integer, +it is truncated in some non-specified way. + + + + + +


lua_tolstring

+[-0, +0, m] +

const char *lua_tolstring (lua_State *L, int index, size_t *len);
+ +

+Converts the Lua value at the given acceptable index to a C string. +If len is not NULL, +it also sets *len with the string length. +The Lua value must be a string or a number; +otherwise, the function returns NULL. +If the value is a number, +then lua_tolstring also +changes the actual value in the stack to a string. +(This change confuses lua_next +when lua_tolstring is applied to keys during a table traversal.) + + +

+lua_tolstring returns a fully aligned pointer +to a string inside the Lua state. +This string always has a zero ('\0') +after its last character (as in C), +but can contain other zeros in its body. +Because Lua has garbage collection, +there is no guarantee that the pointer returned by lua_tolstring +will be valid after the corresponding value is removed from the stack. + + + + + +


lua_tonumber

+[-0, +0, -] +

lua_Number lua_tonumber (lua_State *L, int index);
+ +

+Converts the Lua value at the given acceptable index +to the C type lua_Number (see lua_Number). +The Lua value must be a number or a string convertible to a number +(see §2.2.1); +otherwise, lua_tonumber returns 0. + + + + + +


lua_topointer

+[-0, +0, -] +

const void *lua_topointer (lua_State *L, int index);
+ +

+Converts the value at the given acceptable index to a generic +C pointer (void*). +The value can be a userdata, a table, a thread, or a function; +otherwise, lua_topointer returns NULL. +Different objects will give different pointers. +There is no way to convert the pointer back to its original value. + + +

+Typically this function is used only for debug information. + + + + + +


lua_tostring

+[-0, +0, m] +

const char *lua_tostring (lua_State *L, int index);
+ +

+Equivalent to lua_tolstring with len equal to NULL. + + + + + +


lua_tothread

+[-0, +0, -] +

lua_State *lua_tothread (lua_State *L, int index);
+ +

+Converts the value at the given acceptable index to a Lua thread +(represented as lua_State*). +This value must be a thread; +otherwise, the function returns NULL. + + + + + +


lua_touserdata

+[-0, +0, -] +

void *lua_touserdata (lua_State *L, int index);
+ +

+If the value at the given acceptable index is a full userdata, +returns its block address. +If the value is a light userdata, +returns its pointer. +Otherwise, returns NULL. + + + + + +


lua_type

+[-0, +0, -] +

int lua_type (lua_State *L, int index);
+ +

+Returns the type of the value in the given acceptable index, +or LUA_TNONE for a non-valid index +(that is, an index to an "empty" stack position). +The types returned by lua_type are coded by the following constants +defined in lua.h: +LUA_TNIL, +LUA_TNUMBER, +LUA_TBOOLEAN, +LUA_TSTRING, +LUA_TTABLE, +LUA_TFUNCTION, +LUA_TUSERDATA, +LUA_TTHREAD, +and +LUA_TLIGHTUSERDATA. + + + + + +


lua_typename

+[-0, +0, -] +

const char *lua_typename  (lua_State *L, int tp);
+ +

+Returns the name of the type encoded by the value tp, +which must be one the values returned by lua_type. + + + + + +


lua_Writer

+
typedef int (*lua_Writer) (lua_State *L,
+                           const void* p,
+                           size_t sz,
+                           void* ud);
+ +

+The type of the writer function used by lua_dump. +Every time it produces another piece of chunk, +lua_dump calls the writer, +passing along the buffer to be written (p), +its size (sz), +and the data parameter supplied to lua_dump. + + +

+The writer returns an error code: +0 means no errors; +any other value means an error and stops lua_dump from +calling the writer again. + + + + + +


lua_xmove

+[-?, +?, -] +

void lua_xmove (lua_State *from, lua_State *to, int n);
+ +

+Exchange values between different threads of the same global state. + + +

+This function pops n values from the stack from, +and pushes them onto the stack to. + + + + + +


lua_yield

+[-?, +?, -] +

int lua_yield  (lua_State *L, int nresults);
+ +

+Yields a coroutine. + + +

+This function should only be called as the +return expression of a C function, as follows: + +

+     return lua_yield (L, nresults);
+

+When a C function calls lua_yield in that way, +the running coroutine suspends its execution, +and the call to lua_resume that started this coroutine returns. +The parameter nresults is the number of values from the stack +that are passed as results to lua_resume. + + + + + + + +

3.8 - The Debug Interface

+ +

+Lua has no built-in debugging facilities. +Instead, it offers a special interface +by means of functions and hooks. +This interface allows the construction of different +kinds of debuggers, profilers, and other tools +that need "inside information" from the interpreter. + + + +


lua_Debug

+
typedef struct lua_Debug {
+  int event;
+  const char *name;           /* (n) */
+  const char *namewhat;       /* (n) */
+  const char *what;           /* (S) */
+  const char *source;         /* (S) */
+  int currentline;            /* (l) */
+  int nups;                   /* (u) number of upvalues */
+  int linedefined;            /* (S) */
+  int lastlinedefined;        /* (S) */
+  char short_src[LUA_IDSIZE]; /* (S) */
+  /* private part */
+  other fields
+} lua_Debug;
+ +

+A structure used to carry different pieces of +information about an active function. +lua_getstack fills only the private part +of this structure, for later use. +To fill the other fields of lua_Debug with useful information, +call lua_getinfo. + + +

+The fields of lua_Debug have the following meaning: + +

    + +
  • source: +If the function was defined in a string, +then source is that string. +If the function was defined in a file, +then source starts with a '@' followed by the file name. +
  • + +
  • short_src: +a "printable" version of source, to be used in error messages. +
  • + +
  • linedefined: +the line number where the definition of the function starts. +
  • + +
  • lastlinedefined: +the line number where the definition of the function ends. +
  • + +
  • what: +the string "Lua" if the function is a Lua function, +"C" if it is a C function, +"main" if it is the main part of a chunk, +and "tail" if it was a function that did a tail call. +In the latter case, +Lua has no other information about the function. +
  • + +
  • currentline: +the current line where the given function is executing. +When no line information is available, +currentline is set to -1. +
  • + +
  • name: +a reasonable name for the given function. +Because functions in Lua are first-class values, +they do not have a fixed name: +some functions can be the value of multiple global variables, +while others can be stored only in a table field. +The lua_getinfo function checks how the function was +called to find a suitable name. +If it cannot find a name, +then name is set to NULL. +
  • + +
  • namewhat: +explains the name field. +The value of namewhat can be +"global", "local", "method", +"field", "upvalue", or "" (the empty string), +according to how the function was called. +(Lua uses the empty string when no other option seems to apply.) +
  • + +
  • nups: +the number of upvalues of the function. +
  • + +
+ + + + +

lua_gethook

+[-0, +0, -] +

lua_Hook lua_gethook (lua_State *L);
+ +

+Returns the current hook function. + + + + + +


lua_gethookcount

+[-0, +0, -] +

int lua_gethookcount (lua_State *L);
+ +

+Returns the current hook count. + + + + + +


lua_gethookmask

+[-0, +0, -] +

int lua_gethookmask (lua_State *L);
+ +

+Returns the current hook mask. + + + + + +


lua_getinfo

+[-(0|1), +(0|1|2), m] +

int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);
+ +

+Returns information about a specific function or function invocation. + + +

+To get information about a function invocation, +the parameter ar must be a valid activation record that was +filled by a previous call to lua_getstack or +given as argument to a hook (see lua_Hook). + + +

+To get information about a function you push it onto the stack +and start the what string with the character '>'. +(In that case, +lua_getinfo pops the function in the top of the stack.) +For instance, to know in which line a function f was defined, +you can write the following code: + +

+     lua_Debug ar;
+     lua_getfield(L, LUA_GLOBALSINDEX, "f");  /* get global 'f' */
+     lua_getinfo(L, ">S", &ar);
+     printf("%d\n", ar.linedefined);
+
+ +

+Each character in the string what +selects some fields of the structure ar to be filled or +a value to be pushed on the stack: + +

    + +
  • 'n': fills in the field name and namewhat; +
  • + +
  • 'S': +fills in the fields source, short_src, +linedefined, lastlinedefined, and what; +
  • + +
  • 'l': fills in the field currentline; +
  • + +
  • 'u': fills in the field nups; +
  • + +
  • 'f': +pushes onto the stack the function that is +running at the given level; +
  • + +
  • 'L': +pushes onto the stack a table whose indices are the +numbers of the lines that are valid on the function. +(A valid line is a line with some associated code, +that is, a line where you can put a break point. +Non-valid lines include empty lines and comments.) +
  • + +
+ +

+This function returns 0 on error +(for instance, an invalid option in what). + + + + + +


lua_getlocal

+[-0, +(0|1), -] +

const char *lua_getlocal (lua_State *L, lua_Debug *ar, int n);
+ +

+Gets information about a local variable of a given activation record. +The parameter ar must be a valid activation record that was +filled by a previous call to lua_getstack or +given as argument to a hook (see lua_Hook). +The index n selects which local variable to inspect +(1 is the first parameter or active local variable, and so on, +until the last active local variable). +lua_getlocal pushes the variable's value onto the stack +and returns its name. + + +

+Variable names starting with '(' (open parentheses) +represent internal variables +(loop control variables, temporaries, and C function locals). + + +

+Returns NULL (and pushes nothing) +when the index is greater than +the number of active local variables. + + + + + +


lua_getstack

+[-0, +0, -] +

int lua_getstack (lua_State *L, int level, lua_Debug *ar);
+ +

+Get information about the interpreter runtime stack. + + +

+This function fills parts of a lua_Debug structure with +an identification of the activation record +of the function executing at a given level. +Level 0 is the current running function, +whereas level n+1 is the function that has called level n. +When there are no errors, lua_getstack returns 1; +when called with a level greater than the stack depth, +it returns 0. + + + + + +


lua_getupvalue

+[-0, +(0|1), -] +

const char *lua_getupvalue (lua_State *L, int funcindex, int n);
+ +

+Gets information about a closure's upvalue. +(For Lua functions, +upvalues are the external local variables that the function uses, +and that are consequently included in its closure.) +lua_getupvalue gets the index n of an upvalue, +pushes the upvalue's value onto the stack, +and returns its name. +funcindex points to the closure in the stack. +(Upvalues have no particular order, +as they are active through the whole function. +So, they are numbered in an arbitrary order.) + + +

+Returns NULL (and pushes nothing) +when the index is greater than the number of upvalues. +For C functions, this function uses the empty string "" +as a name for all upvalues. + + + + + +


lua_Hook

+
typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
+ +

+Type for debugging hook functions. + + +

+Whenever a hook is called, its ar argument has its field +event set to the specific event that triggered the hook. +Lua identifies these events with the following constants: +LUA_HOOKCALL, LUA_HOOKRET, +LUA_HOOKTAILRET, LUA_HOOKLINE, +and LUA_HOOKCOUNT. +Moreover, for line events, the field currentline is also set. +To get the value of any other field in ar, +the hook must call lua_getinfo. +For return events, event can be LUA_HOOKRET, +the normal value, or LUA_HOOKTAILRET. +In the latter case, Lua is simulating a return from +a function that did a tail call; +in this case, it is useless to call lua_getinfo. + + +

+While Lua is running a hook, it disables other calls to hooks. +Therefore, if a hook calls back Lua to execute a function or a chunk, +this execution occurs without any calls to hooks. + + + + + +


lua_sethook

+[-0, +0, -] +

int lua_sethook (lua_State *L, lua_Hook f, int mask, int count);
+ +

+Sets the debugging hook function. + + +

+Argument f is the hook function. +mask specifies on which events the hook will be called: +it is formed by a bitwise or of the constants +LUA_MASKCALL, +LUA_MASKRET, +LUA_MASKLINE, +and LUA_MASKCOUNT. +The count argument is only meaningful when the mask +includes LUA_MASKCOUNT. +For each event, the hook is called as explained below: + +

    + +
  • The call hook: is called when the interpreter calls a function. +The hook is called just after Lua enters the new function, +before the function gets its arguments. +
  • + +
  • The return hook: is called when the interpreter returns from a function. +The hook is called just before Lua leaves the function. +You have no access to the values to be returned by the function. +
  • + +
  • The line hook: is called when the interpreter is about to +start the execution of a new line of code, +or when it jumps back in the code (even to the same line). +(This event only happens while Lua is executing a Lua function.) +
  • + +
  • The count hook: is called after the interpreter executes every +count instructions. +(This event only happens while Lua is executing a Lua function.) +
  • + +
+ +

+A hook is disabled by setting mask to zero. + + + + + +


lua_setlocal

+[-(0|1), +0, -] +

const char *lua_setlocal (lua_State *L, lua_Debug *ar, int n);
+ +

+Sets the value of a local variable of a given activation record. +Parameters ar and n are as in lua_getlocal +(see lua_getlocal). +lua_setlocal assigns the value at the top of the stack +to the variable and returns its name. +It also pops the value from the stack. + + +

+Returns NULL (and pops nothing) +when the index is greater than +the number of active local variables. + + + + + +


lua_setupvalue

+[-(0|1), +0, -] +

const char *lua_setupvalue (lua_State *L, int funcindex, int n);
+ +

+Sets the value of a closure's upvalue. +It assigns the value at the top of the stack +to the upvalue and returns its name. +It also pops the value from the stack. +Parameters funcindex and n are as in the lua_getupvalue +(see lua_getupvalue). + + +

+Returns NULL (and pops nothing) +when the index is greater than the number of upvalues. + + + + + + + +

4 - The Auxiliary Library

+ +

+ +The auxiliary library provides several convenient functions +to interface C with Lua. +While the basic API provides the primitive functions for all +interactions between C and Lua, +the auxiliary library provides higher-level functions for some +common tasks. + + +

+All functions from the auxiliary library +are defined in header file lauxlib.h and +have a prefix luaL_. + + +

+All functions in the auxiliary library are built on +top of the basic API, +and so they provide nothing that cannot be done with this API. + + +

+Several functions in the auxiliary library are used to +check C function arguments. +Their names are always luaL_check* or luaL_opt*. +All of these functions throw an error if the check is not satisfied. +Because the error message is formatted for arguments +(e.g., "bad argument #1"), +you should not use these functions for other stack values. + + + +

4.1 - Functions and Types

+ +

+Here we list all functions and types from the auxiliary library +in alphabetical order. + + + +


luaL_addchar

+[-0, +0, m] +

void luaL_addchar (luaL_Buffer *B, char c);
+ +

+Adds the character c to the buffer B +(see luaL_Buffer). + + + + + +


luaL_addlstring

+[-0, +0, m] +

void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l);
+ +

+Adds the string pointed to by s with length l to +the buffer B +(see luaL_Buffer). +The string may contain embedded zeros. + + + + + +


luaL_addsize

+[-0, +0, m] +

void luaL_addsize (luaL_Buffer *B, size_t n);
+ +

+Adds to the buffer B (see luaL_Buffer) +a string of length n previously copied to the +buffer area (see luaL_prepbuffer). + + + + + +


luaL_addstring

+[-0, +0, m] +

void luaL_addstring (luaL_Buffer *B, const char *s);
+ +

+Adds the zero-terminated string pointed to by s +to the buffer B +(see luaL_Buffer). +The string may not contain embedded zeros. + + + + + +


luaL_addvalue

+[-1, +0, m] +

void luaL_addvalue (luaL_Buffer *B);
+ +

+Adds the value at the top of the stack +to the buffer B +(see luaL_Buffer). +Pops the value. + + +

+This is the only function on string buffers that can (and must) +be called with an extra element on the stack, +which is the value to be added to the buffer. + + + + + +


luaL_argcheck

+[-0, +0, v] +

void luaL_argcheck (lua_State *L,
+                    int cond,
+                    int narg,
+                    const char *extramsg);
+ +

+Checks whether cond is true. +If not, raises an error with the following message, +where func is retrieved from the call stack: + +

+     bad argument #<narg> to <func> (<extramsg>)
+
+ + + + +

luaL_argerror

+[-0, +0, v] +

int luaL_argerror (lua_State *L, int narg, const char *extramsg);
+ +

+Raises an error with the following message, +where func is retrieved from the call stack: + +

+     bad argument #<narg> to <func> (<extramsg>)
+
+ +

+This function never returns, +but it is an idiom to use it in C functions +as return luaL_argerror(args). + + + + + +


luaL_Buffer

+
typedef struct luaL_Buffer luaL_Buffer;
+ +

+Type for a string buffer. + + +

+A string buffer allows C code to build Lua strings piecemeal. +Its pattern of use is as follows: + +

    + +
  • First you declare a variable b of type luaL_Buffer.
  • + +
  • Then you initialize it with a call luaL_buffinit(L, &b).
  • + +
  • +Then you add string pieces to the buffer calling any of +the luaL_add* functions. +
  • + +
  • +You finish by calling luaL_pushresult(&b). +This call leaves the final string on the top of the stack. +
  • + +
+ +

+During its normal operation, +a string buffer uses a variable number of stack slots. +So, while using a buffer, you cannot assume that you know where +the top of the stack is. +You can use the stack between successive calls to buffer operations +as long as that use is balanced; +that is, +when you call a buffer operation, +the stack is at the same level +it was immediately after the previous buffer operation. +(The only exception to this rule is luaL_addvalue.) +After calling luaL_pushresult the stack is back to its +level when the buffer was initialized, +plus the final string on its top. + + + + + +


luaL_buffinit

+[-0, +0, -] +

void luaL_buffinit (lua_State *L, luaL_Buffer *B);
+ +

+Initializes a buffer B. +This function does not allocate any space; +the buffer must be declared as a variable +(see luaL_Buffer). + + + + + +


luaL_callmeta

+[-0, +(0|1), e] +

int luaL_callmeta (lua_State *L, int obj, const char *e);
+ +

+Calls a metamethod. + + +

+If the object at index obj has a metatable and this +metatable has a field e, +this function calls this field and passes the object as its only argument. +In this case this function returns 1 and pushes onto the +stack the value returned by the call. +If there is no metatable or no metamethod, +this function returns 0 (without pushing any value on the stack). + + + + + +


luaL_checkany

+[-0, +0, v] +

void luaL_checkany (lua_State *L, int narg);
+ +

+Checks whether the function has an argument +of any type (including nil) at position narg. + + + + + +


luaL_checkint

+[-0, +0, v] +

int luaL_checkint (lua_State *L, int narg);
+ +

+Checks whether the function argument narg is a number +and returns this number cast to an int. + + + + + +


luaL_checkinteger

+[-0, +0, v] +

lua_Integer luaL_checkinteger (lua_State *L, int narg);
+ +

+Checks whether the function argument narg is a number +and returns this number cast to a lua_Integer. + + + + + +


luaL_checklong

+[-0, +0, v] +

long luaL_checklong (lua_State *L, int narg);
+ +

+Checks whether the function argument narg is a number +and returns this number cast to a long. + + + + + +


luaL_checklstring

+[-0, +0, v] +

const char *luaL_checklstring (lua_State *L, int narg, size_t *l);
+ +

+Checks whether the function argument narg is a string +and returns this string; +if l is not NULL fills *l +with the string's length. + + +

+This function uses lua_tolstring to get its result, +so all conversions and caveats of that function apply here. + + + + + +


luaL_checknumber

+[-0, +0, v] +

lua_Number luaL_checknumber (lua_State *L, int narg);
+ +

+Checks whether the function argument narg is a number +and returns this number. + + + + + +


luaL_checkoption

+[-0, +0, v] +

int luaL_checkoption (lua_State *L,
+                      int narg,
+                      const char *def,
+                      const char *const lst[]);
+ +

+Checks whether the function argument narg is a string and +searches for this string in the array lst +(which must be NULL-terminated). +Returns the index in the array where the string was found. +Raises an error if the argument is not a string or +if the string cannot be found. + + +

+If def is not NULL, +the function uses def as a default value when +there is no argument narg or if this argument is nil. + + +

+This is a useful function for mapping strings to C enums. +(The usual convention in Lua libraries is +to use strings instead of numbers to select options.) + + + + + +


luaL_checkstack

+[-0, +0, v] +

void luaL_checkstack (lua_State *L, int sz, const char *msg);
+ +

+Grows the stack size to top + sz elements, +raising an error if the stack cannot grow to that size. +msg is an additional text to go into the error message. + + + + + +


luaL_checkstring

+[-0, +0, v] +

const char *luaL_checkstring (lua_State *L, int narg);
+ +

+Checks whether the function argument narg is a string +and returns this string. + + +

+This function uses lua_tolstring to get its result, +so all conversions and caveats of that function apply here. + + + + + +


luaL_checktype

+[-0, +0, v] +

void luaL_checktype (lua_State *L, int narg, int t);
+ +

+Checks whether the function argument narg has type t. +See lua_type for the encoding of types for t. + + + + + +


luaL_checkudata

+[-0, +0, v] +

void *luaL_checkudata (lua_State *L, int narg, const char *tname);
+ +

+Checks whether the function argument narg is a userdata +of the type tname (see luaL_newmetatable). + + + + + +


luaL_dofile

+[-0, +?, m] +

int luaL_dofile (lua_State *L, const char *filename);
+ +

+Loads and runs the given file. +It is defined as the following macro: + +

+     (luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))
+

+It returns 0 if there are no errors +or 1 in case of errors. + + + + + +


luaL_dostring

+[-0, +?, m] +

int luaL_dostring (lua_State *L, const char *str);
+ +

+Loads and runs the given string. +It is defined as the following macro: + +

+     (luaL_loadstring(L, str) || lua_pcall(L, 0, LUA_MULTRET, 0))
+

+It returns 0 if there are no errors +or 1 in case of errors. + + + + + +


luaL_error

+[-0, +0, v] +

int luaL_error (lua_State *L, const char *fmt, ...);
+ +

+Raises an error. +The error message format is given by fmt +plus any extra arguments, +following the same rules of lua_pushfstring. +It also adds at the beginning of the message the file name and +the line number where the error occurred, +if this information is available. + + +

+This function never returns, +but it is an idiom to use it in C functions +as return luaL_error(args). + + + + + +


luaL_getmetafield

+[-0, +(0|1), m] +

int luaL_getmetafield (lua_State *L, int obj, const char *e);
+ +

+Pushes onto the stack the field e from the metatable +of the object at index obj. +If the object does not have a metatable, +or if the metatable does not have this field, +returns 0 and pushes nothing. + + + + + +


luaL_getmetatable

+[-0, +1, -] +

void luaL_getmetatable (lua_State *L, const char *tname);
+ +

+Pushes onto the stack the metatable associated with name tname +in the registry (see luaL_newmetatable). + + + + + +


luaL_gsub

+[-0, +1, m] +

const char *luaL_gsub (lua_State *L,
+                       const char *s,
+                       const char *p,
+                       const char *r);
+ +

+Creates a copy of string s by replacing +any occurrence of the string p +with the string r. +Pushes the resulting string on the stack and returns it. + + + + + +


luaL_loadbuffer

+[-0, +1, m] +

int luaL_loadbuffer (lua_State *L,
+                     const char *buff,
+                     size_t sz,
+                     const char *name);
+ +

+Loads a buffer as a Lua chunk. +This function uses lua_load to load the chunk in the +buffer pointed to by buff with size sz. + + +

+This function returns the same results as lua_load. +name is the chunk name, +used for debug information and error messages. + + + + + +


luaL_loadfile

+[-0, +1, m] +

int luaL_loadfile (lua_State *L, const char *filename);
+ +

+Loads a file as a Lua chunk. +This function uses lua_load to load the chunk in the file +named filename. +If filename is NULL, +then it loads from the standard input. +The first line in the file is ignored if it starts with a #. + + +

+This function returns the same results as lua_load, +but it has an extra error code LUA_ERRFILE +if it cannot open/read the file. + + +

+As lua_load, this function only loads the chunk; +it does not run it. + + + + + +


luaL_loadstring

+[-0, +1, m] +

int luaL_loadstring (lua_State *L, const char *s);
+ +

+Loads a string as a Lua chunk. +This function uses lua_load to load the chunk in +the zero-terminated string s. + + +

+This function returns the same results as lua_load. + + +

+Also as lua_load, this function only loads the chunk; +it does not run it. + + + + + +


luaL_newmetatable

+[-0, +1, m] +

int luaL_newmetatable (lua_State *L, const char *tname);
+ +

+If the registry already has the key tname, +returns 0. +Otherwise, +creates a new table to be used as a metatable for userdata, +adds it to the registry with key tname, +and returns 1. + + +

+In both cases pushes onto the stack the final value associated +with tname in the registry. + + + + + +


luaL_newstate

+[-0, +0, -] +

lua_State *luaL_newstate (void);
+ +

+Creates a new Lua state. +It calls lua_newstate with an +allocator based on the standard C realloc function +and then sets a panic function (see lua_atpanic) that prints +an error message to the standard error output in case of fatal +errors. + + +

+Returns the new state, +or NULL if there is a memory allocation error. + + + + + +


luaL_openlibs

+[-0, +0, m] +

void luaL_openlibs (lua_State *L);
+ +

+Opens all standard Lua libraries into the given state. + + + + + +


luaL_optint

+[-0, +0, v] +

int luaL_optint (lua_State *L, int narg, int d);
+ +

+If the function argument narg is a number, +returns this number cast to an int. +If this argument is absent or is nil, +returns d. +Otherwise, raises an error. + + + + + +


luaL_optinteger

+[-0, +0, v] +

lua_Integer luaL_optinteger (lua_State *L,
+                             int narg,
+                             lua_Integer d);
+ +

+If the function argument narg is a number, +returns this number cast to a lua_Integer. +If this argument is absent or is nil, +returns d. +Otherwise, raises an error. + + + + + +


luaL_optlong

+[-0, +0, v] +

long luaL_optlong (lua_State *L, int narg, long d);
+ +

+If the function argument narg is a number, +returns this number cast to a long. +If this argument is absent or is nil, +returns d. +Otherwise, raises an error. + + + + + +


luaL_optlstring

+[-0, +0, v] +

const char *luaL_optlstring (lua_State *L,
+                             int narg,
+                             const char *d,
+                             size_t *l);
+ +

+If the function argument narg is a string, +returns this string. +If this argument is absent or is nil, +returns d. +Otherwise, raises an error. + + +

+If l is not NULL, +fills the position *l with the results's length. + + + + + +


luaL_optnumber

+[-0, +0, v] +

lua_Number luaL_optnumber (lua_State *L, int narg, lua_Number d);
+ +

+If the function argument narg is a number, +returns this number. +If this argument is absent or is nil, +returns d. +Otherwise, raises an error. + + + + + +


luaL_optstring

+[-0, +0, v] +

const char *luaL_optstring (lua_State *L,
+                            int narg,
+                            const char *d);
+ +

+If the function argument narg is a string, +returns this string. +If this argument is absent or is nil, +returns d. +Otherwise, raises an error. + + + + + +


luaL_prepbuffer

+[-0, +0, -] +

char *luaL_prepbuffer (luaL_Buffer *B);
+ +

+Returns an address to a space of size LUAL_BUFFERSIZE +where you can copy a string to be added to buffer B +(see luaL_Buffer). +After copying the string into this space you must call +luaL_addsize with the size of the string to actually add +it to the buffer. + + + + + +


luaL_pushresult

+[-?, +1, m] +

void luaL_pushresult (luaL_Buffer *B);
+ +

+Finishes the use of buffer B leaving the final string on +the top of the stack. + + + + + +


luaL_ref

+[-1, +0, m] +

int luaL_ref (lua_State *L, int t);
+ +

+Creates and returns a reference, +in the table at index t, +for the object at the top of the stack (and pops the object). + + +

+A reference is a unique integer key. +As long as you do not manually add integer keys into table t, +luaL_ref ensures the uniqueness of the key it returns. +You can retrieve an object referred by reference r +by calling lua_rawgeti(L, t, r). +Function luaL_unref frees a reference and its associated object. + + +

+If the object at the top of the stack is nil, +luaL_ref returns the constant LUA_REFNIL. +The constant LUA_NOREF is guaranteed to be different +from any reference returned by luaL_ref. + + + + + +


luaL_Reg

+
typedef struct luaL_Reg {
+  const char *name;
+  lua_CFunction func;
+} luaL_Reg;
+ +

+Type for arrays of functions to be registered by +luaL_register. +name is the function name and func is a pointer to +the function. +Any array of luaL_Reg must end with an sentinel entry +in which both name and func are NULL. + + + + + +


luaL_register

+[-(0|1), +1, m] +

void luaL_register (lua_State *L,
+                    const char *libname,
+                    const luaL_Reg *l);
+ +

+Opens a library. + + +

+When called with libname equal to NULL, +it simply registers all functions in the list l +(see luaL_Reg) into the table on the top of the stack. + + +

+When called with a non-null libname, +luaL_register creates a new table t, +sets it as the value of the global variable libname, +sets it as the value of package.loaded[libname], +and registers on it all functions in the list l. +If there is a table in package.loaded[libname] or in +variable libname, +reuses this table instead of creating a new one. + + +

+In any case the function leaves the table +on the top of the stack. + + + + + +


luaL_typename

+[-0, +0, -] +

const char *luaL_typename (lua_State *L, int index);
+ +

+Returns the name of the type of the value at the given index. + + + + + +


luaL_typerror

+[-0, +0, v] +

int luaL_typerror (lua_State *L, int narg, const char *tname);
+ +

+Generates an error with a message like the following: + +

+     location: bad argument narg to 'func' (tname expected, got rt)
+

+where location is produced by luaL_where, +func is the name of the current function, +and rt is the type name of the actual argument. + + + + + +


luaL_unref

+[-0, +0, -] +

void luaL_unref (lua_State *L, int t, int ref);
+ +

+Releases reference ref from the table at index t +(see luaL_ref). +The entry is removed from the table, +so that the referred object can be collected. +The reference ref is also freed to be used again. + + +

+If ref is LUA_NOREF or LUA_REFNIL, +luaL_unref does nothing. + + + + + +


luaL_where

+[-0, +1, m] +

void luaL_where (lua_State *L, int lvl);
+ +

+Pushes onto the stack a string identifying the current position +of the control at level lvl in the call stack. +Typically this string has the following format: + +

+     chunkname:currentline:
+

+Level 0 is the running function, +level 1 is the function that called the running function, +etc. + + +

+This function is used to build a prefix for error messages. + + + + + + + +

5 - Standard Libraries

+ +

+The standard Lua libraries provide useful functions +that are implemented directly through the C API. +Some of these functions provide essential services to the language +(e.g., type and getmetatable); +others provide access to "outside" services (e.g., I/O); +and others could be implemented in Lua itself, +but are quite useful or have critical performance requirements that +deserve an implementation in C (e.g., table.sort). + + +

+All libraries are implemented through the official C API +and are provided as separate C modules. +Currently, Lua has the following standard libraries: + +

    + +
  • basic library,
  • which includes the coroutine sub-library; + +
  • package library;
  • + +
  • string manipulation;
  • + +
  • table manipulation;
  • + +
  • mathematical functions (sin, log, etc.);
  • + +
  • input and output;
  • + +
  • operating system facilities;
  • + +
  • debug facilities.
  • + +

+Except for the basic and package libraries, +each library provides all its functions as fields of a global table +or as methods of its objects. + + +

+To have access to these libraries, +the C host program should call the luaL_openlibs function, +which opens all standard libraries. +Alternatively, +it can open them individually by calling +luaopen_base (for the basic library), +luaopen_package (for the package library), +luaopen_string (for the string library), +luaopen_table (for the table library), +luaopen_math (for the mathematical library), +luaopen_io (for the I/O library), +luaopen_os (for the Operating System library), +and luaopen_debug (for the debug library). +These functions are declared in lualib.h +and should not be called directly: +you must call them like any other Lua C function, +e.g., by using lua_call. + + + +

5.1 - Basic Functions

+ +

+The basic library provides some core functions to Lua. +If you do not include this library in your application, +you should check carefully whether you need to provide +implementations for some of its facilities. + + +

+


assert (v [, message])

+Issues an error when +the value of its argument v is false (i.e., nil or false); +otherwise, returns all its arguments. +message is an error message; +when absent, it defaults to "assertion failed!" + + + + +

+


collectgarbage (opt [, arg])

+ + +

+This function is a generic interface to the garbage collector. +It performs different functions according to its first argument, opt: + +

    + +
  • "stop": +stops the garbage collector. +
  • + +
  • "restart": +restarts the garbage collector. +
  • + +
  • "collect": +performs a full garbage-collection cycle. +
  • + +
  • "count": +returns the total memory in use by Lua (in Kbytes). +
  • + +
  • "step": +performs a garbage-collection step. +The step "size" is controlled by arg +(larger values mean more steps) in a non-specified way. +If you want to control the step size +you must experimentally tune the value of arg. +Returns true if the step finished a collection cycle. +
  • + +
  • "setpause": +sets arg as the new value for the pause of +the collector (see §2.10). +Returns the previous value for pause. +
  • + +
  • "setstepmul": +sets arg as the new value for the step multiplier of +the collector (see §2.10). +Returns the previous value for step. +
  • + +
+ + + +

+


dofile (filename)

+Opens the named file and executes its contents as a Lua chunk. +When called without arguments, +dofile executes the contents of the standard input (stdin). +Returns all values returned by the chunk. +In case of errors, dofile propagates the error +to its caller (that is, dofile does not run in protected mode). + + + + +

+


error (message [, level])

+Terminates the last protected function called +and returns message as the error message. +Function error never returns. + + +

+Usually, error adds some information about the error position +at the beginning of the message. +The level argument specifies how to get the error position. +With level 1 (the default), the error position is where the +error function was called. +Level 2 points the error to where the function +that called error was called; and so on. +Passing a level 0 avoids the addition of error position information +to the message. + + + + +

+


_G

+A global variable (not a function) that +holds the global environment (that is, _G._G = _G). +Lua itself does not use this variable; +changing its value does not affect any environment, +nor vice-versa. +(Use setfenv to change environments.) + + + + +

+


getfenv ([f])

+Returns the current environment in use by the function. +f can be a Lua function or a number +that specifies the function at that stack level: +Level 1 is the function calling getfenv. +If the given function is not a Lua function, +or if f is 0, +getfenv returns the global environment. +The default for f is 1. + + + + +

+


getmetatable (object)

+ + +

+If object does not have a metatable, returns nil. +Otherwise, +if the object's metatable has a "__metatable" field, +returns the associated value. +Otherwise, returns the metatable of the given object. + + + + +

+


ipairs (t)

+ + +

+Returns three values: an iterator function, the table t, and 0, +so that the construction + +

+     for i,v in ipairs(t) do body end
+

+will iterate over the pairs (1,t[1]), (2,t[2]), ···, +up to the first integer key absent from the table. + + + + +

+


load (func [, chunkname])

+ + +

+Loads a chunk using function func to get its pieces. +Each call to func must return a string that concatenates +with previous results. +A return of an empty string, nil, or no value signals the end of the chunk. + + +

+If there are no errors, +returns the compiled chunk as a function; +otherwise, returns nil plus the error message. +The environment of the returned function is the global environment. + + +

+chunkname is used as the chunk name for error messages +and debug information. +When absent, +it defaults to "=(load)". + + + + +

+


loadfile ([filename])

+ + +

+Similar to load, +but gets the chunk from file filename +or from the standard input, +if no file name is given. + + + + +

+


loadstring (string [, chunkname])

+ + +

+Similar to load, +but gets the chunk from the given string. + + +

+To load and run a given string, use the idiom + +

+     assert(loadstring(s))()
+
+ +

+When absent, +chunkname defaults to the given string. + + + + +

+


next (table [, index])

+ + +

+Allows a program to traverse all fields of a table. +Its first argument is a table and its second argument +is an index in this table. +next returns the next index of the table +and its associated value. +When called with nil as its second argument, +next returns an initial index +and its associated value. +When called with the last index, +or with nil in an empty table, +next returns nil. +If the second argument is absent, then it is interpreted as nil. +In particular, +you can use next(t) to check whether a table is empty. + + +

+The order in which the indices are enumerated is not specified, +even for numeric indices. +(To traverse a table in numeric order, +use a numerical for or the ipairs function.) + + +

+The behavior of next is undefined if, +during the traversal, +you assign any value to a non-existent field in the table. +You may however modify existing fields. +In particular, you may clear existing fields. + + + + +

+


pairs (t)

+ + +

+Returns three values: the next function, the table t, and nil, +so that the construction + +

+     for k,v in pairs(t) do body end
+

+will iterate over all key–value pairs of table t. + + +

+See function next for the caveats of modifying +the table during its traversal. + + + + +

+


pcall (f, arg1, ···)

+ + +

+Calls function f with +the given arguments in protected mode. +This means that any error inside f is not propagated; +instead, pcall catches the error +and returns a status code. +Its first result is the status code (a boolean), +which is true if the call succeeds without errors. +In such case, pcall also returns all results from the call, +after this first result. +In case of any error, pcall returns false plus the error message. + + + + +

+


print (···)

+Receives any number of arguments, +and prints their values to stdout, +using the tostring function to convert them to strings. +print is not intended for formatted output, +but only as a quick way to show a value, +typically for debugging. +For formatted output, use string.format. + + + + +

+


rawequal (v1, v2)

+Checks whether v1 is equal to v2, +without invoking any metamethod. +Returns a boolean. + + + + +

+


rawget (table, index)

+Gets the real value of table[index], +without invoking any metamethod. +table must be a table; +index may be any value. + + + + +

+


rawset (table, index, value)

+Sets the real value of table[index] to value, +without invoking any metamethod. +table must be a table, +index any value different from nil, +and value any Lua value. + + +

+This function returns table. + + + + +

+


select (index, ···)

+ + +

+If index is a number, +returns all arguments after argument number index. +Otherwise, index must be the string "#", +and select returns the total number of extra arguments it received. + + + + +

+


setfenv (f, table)

+ + +

+Sets the environment to be used by the given function. +f can be a Lua function or a number +that specifies the function at that stack level: +Level 1 is the function calling setfenv. +setfenv returns the given function. + + +

+As a special case, when f is 0 setfenv changes +the environment of the running thread. +In this case, setfenv returns no values. + + + + +

+


setmetatable (table, metatable)

+ + +

+Sets the metatable for the given table. +(You cannot change the metatable of other types from Lua, only from C.) +If metatable is nil, +removes the metatable of the given table. +If the original metatable has a "__metatable" field, +raises an error. + + +

+This function returns table. + + + + +

+


tonumber (e [, base])

+Tries to convert its argument to a number. +If the argument is already a number or a string convertible +to a number, then tonumber returns this number; +otherwise, it returns nil. + + +

+An optional argument specifies the base to interpret the numeral. +The base may be any integer between 2 and 36, inclusive. +In bases above 10, the letter 'A' (in either upper or lower case) +represents 10, 'B' represents 11, and so forth, +with 'Z' representing 35. +In base 10 (the default), the number can have a decimal part, +as well as an optional exponent part (see §2.1). +In other bases, only unsigned integers are accepted. + + + + +

+


tostring (e)

+Receives an argument of any type and +converts it to a string in a reasonable format. +For complete control of how numbers are converted, +use string.format. + + +

+If the metatable of e has a "__tostring" field, +then tostring calls the corresponding value +with e as argument, +and uses the result of the call as its result. + + + + +

+


type (v)

+Returns the type of its only argument, coded as a string. +The possible results of this function are +"nil" (a string, not the value nil), +"number", +"string", +"boolean", +"table", +"function", +"thread", +and "userdata". + + + + +

+


unpack (list [, i [, j]])

+Returns the elements from the given table. +This function is equivalent to + +
+     return list[i], list[i+1], ···, list[j]
+

+except that the above code can be written only for a fixed number +of elements. +By default, i is 1 and j is the length of the list, +as defined by the length operator (see §2.5.5). + + + + +

+


_VERSION

+A global variable (not a function) that +holds a string containing the current interpreter version. +The current contents of this variable is "Lua 5.1". + + + + +

+


xpcall (f, err)

+ + +

+This function is similar to pcall, +except that you can set a new error handler. + + +

+xpcall calls function f in protected mode, +using err as the error handler. +Any error inside f is not propagated; +instead, xpcall catches the error, +calls the err function with the original error object, +and returns a status code. +Its first result is the status code (a boolean), +which is true if the call succeeds without errors. +In this case, xpcall also returns all results from the call, +after this first result. +In case of any error, +xpcall returns false plus the result from err. + + + + + + + +

5.2 - Coroutine Manipulation

+ +

+The operations related to coroutines comprise a sub-library of +the basic library and come inside the table coroutine. +See §2.11 for a general description of coroutines. + + +

+


coroutine.create (f)

+ + +

+Creates a new coroutine, with body f. +f must be a Lua function. +Returns this new coroutine, +an object with type "thread". + + + + +

+


coroutine.resume (co [, val1, ···])

+ + +

+Starts or continues the execution of coroutine co. +The first time you resume a coroutine, +it starts running its body. +The values val1, ··· are passed +as the arguments to the body function. +If the coroutine has yielded, +resume restarts it; +the values val1, ··· are passed +as the results from the yield. + + +

+If the coroutine runs without any errors, +resume returns true plus any values passed to yield +(if the coroutine yields) or any values returned by the body function +(if the coroutine terminates). +If there is any error, +resume returns false plus the error message. + + + + +

+


coroutine.running ()

+ + +

+Returns the running coroutine, +or nil when called by the main thread. + + + + +

+


coroutine.status (co)

+ + +

+Returns the status of coroutine co, as a string: +"running", +if the coroutine is running (that is, it called status); +"suspended", if the coroutine is suspended in a call to yield, +or if it has not started running yet; +"normal" if the coroutine is active but not running +(that is, it has resumed another coroutine); +and "dead" if the coroutine has finished its body function, +or if it has stopped with an error. + + + + +

+


coroutine.wrap (f)

+ + +

+Creates a new coroutine, with body f. +f must be a Lua function. +Returns a function that resumes the coroutine each time it is called. +Any arguments passed to the function behave as the +extra arguments to resume. +Returns the same values returned by resume, +except the first boolean. +In case of error, propagates the error. + + + + +

+


coroutine.yield (···)

+ + +

+Suspends the execution of the calling coroutine. +The coroutine cannot be running a C function, +a metamethod, or an iterator. +Any arguments to yield are passed as extra results to resume. + + + + + + + +

5.3 - Modules

+ +

+The package library provides basic +facilities for loading and building modules in Lua. +It exports two of its functions directly in the global environment: +require and module. +Everything else is exported in a table package. + + +

+


module (name [, ···])

+ + +

+Creates a module. +If there is a table in package.loaded[name], +this table is the module. +Otherwise, if there is a global table t with the given name, +this table is the module. +Otherwise creates a new table t and +sets it as the value of the global name and +the value of package.loaded[name]. +This function also initializes t._NAME with the given name, +t._M with the module (t itself), +and t._PACKAGE with the package name +(the full module name minus last component; see below). +Finally, module sets t as the new environment +of the current function and the new value of package.loaded[name], +so that require returns t. + + +

+If name is a compound name +(that is, one with components separated by dots), +module creates (or reuses, if they already exist) +tables for each component. +For instance, if name is a.b.c, +then module stores the module table in field c of +field b of global a. + + +

+This function can receive optional options after +the module name, +where each option is a function to be applied over the module. + + + + +

+


require (modname)

+ + +

+Loads the given module. +The function starts by looking into the package.loaded table +to determine whether modname is already loaded. +If it is, then require returns the value stored +at package.loaded[modname]. +Otherwise, it tries to find a loader for the module. + + +

+To find a loader, +require is guided by the package.loaders array. +By changing this array, +we can change how require looks for a module. +The following explanation is based on the default configuration +for package.loaders. + + +

+First require queries package.preload[modname]. +If it has a value, +this value (which should be a function) is the loader. +Otherwise require searches for a Lua loader using the +path stored in package.path. +If that also fails, it searches for a C loader using the +path stored in package.cpath. +If that also fails, +it tries an all-in-one loader (see package.loaders). + + +

+Once a loader is found, +require calls the loader with a single argument, modname. +If the loader returns any value, +require assigns the returned value to package.loaded[modname]. +If the loader returns no value and +has not assigned any value to package.loaded[modname], +then require assigns true to this entry. +In any case, require returns the +final value of package.loaded[modname]. + + +

+If there is any error loading or running the module, +or if it cannot find any loader for the module, +then require signals an error. + + + + +

+


package.cpath

+ + +

+The path used by require to search for a C loader. + + +

+Lua initializes the C path package.cpath in the same way +it initializes the Lua path package.path, +using the environment variable LUA_CPATH +or a default path defined in luaconf.h. + + + + +

+ +


package.loaded

+ + +

+A table used by require to control which +modules are already loaded. +When you require a module modname and +package.loaded[modname] is not false, +require simply returns the value stored there. + + + + +

+


package.loaders

+ + +

+A table used by require to control how to load modules. + + +

+Each entry in this table is a searcher function. +When looking for a module, +require calls each of these searchers in ascending order, +with the module name (the argument given to require) as its +sole parameter. +The function can return another function (the module loader) +or a string explaining why it did not find that module +(or nil if it has nothing to say). +Lua initializes this table with four functions. + + +

+The first searcher simply looks for a loader in the +package.preload table. + + +

+The second searcher looks for a loader as a Lua library, +using the path stored at package.path. +A path is a sequence of templates separated by semicolons. +For each template, +the searcher will change each interrogation +mark in the template by filename, +which is the module name with each dot replaced by a +"directory separator" (such as "/" in Unix); +then it will try to open the resulting file name. +So, for instance, if the Lua path is the string + +

+     "./?.lua;./?.lc;/usr/local/?/init.lua"
+

+the search for a Lua file for module foo +will try to open the files +./foo.lua, ./foo.lc, and +/usr/local/foo/init.lua, in that order. + + +

+The third searcher looks for a loader as a C library, +using the path given by the variable package.cpath. +For instance, +if the C path is the string + +

+     "./?.so;./?.dll;/usr/local/?/init.so"
+

+the searcher for module foo +will try to open the files ./foo.so, ./foo.dll, +and /usr/local/foo/init.so, in that order. +Once it finds a C library, +this searcher first uses a dynamic link facility to link the +application with the library. +Then it tries to find a C function inside the library to +be used as the loader. +The name of this C function is the string "luaopen_" +concatenated with a copy of the module name where each dot +is replaced by an underscore. +Moreover, if the module name has a hyphen, +its prefix up to (and including) the first hyphen is removed. +For instance, if the module name is a.v1-b.c, +the function name will be luaopen_b_c. + + +

+The fourth searcher tries an all-in-one loader. +It searches the C path for a library for +the root name of the given module. +For instance, when requiring a.b.c, +it will search for a C library for a. +If found, it looks into it for an open function for +the submodule; +in our example, that would be luaopen_a_b_c. +With this facility, a package can pack several C submodules +into one single library, +with each submodule keeping its original open function. + + + + +

+


package.loadlib (libname, funcname)

+ + +

+Dynamically links the host program with the C library libname. +Inside this library, looks for a function funcname +and returns this function as a C function. +(So, funcname must follow the protocol (see lua_CFunction)). + + +

+This is a low-level function. +It completely bypasses the package and module system. +Unlike require, +it does not perform any path searching and +does not automatically adds extensions. +libname must be the complete file name of the C library, +including if necessary a path and extension. +funcname must be the exact name exported by the C library +(which may depend on the C compiler and linker used). + + +

+This function is not supported by ANSI C. +As such, it is only available on some platforms +(Windows, Linux, Mac OS X, Solaris, BSD, +plus other Unix systems that support the dlfcn standard). + + + + +

+


package.path

+ + +

+The path used by require to search for a Lua loader. + + +

+At start-up, Lua initializes this variable with +the value of the environment variable LUA_PATH or +with a default path defined in luaconf.h, +if the environment variable is not defined. +Any ";;" in the value of the environment variable +is replaced by the default path. + + + + +

+


package.preload

+ + +

+A table to store loaders for specific modules +(see require). + + + + +

+


package.seeall (module)

+ + +

+Sets a metatable for module with +its __index field referring to the global environment, +so that this module inherits values +from the global environment. +To be used as an option to function module. + + + + + + + +

5.4 - String Manipulation

+ +

+This library provides generic functions for string manipulation, +such as finding and extracting substrings, and pattern matching. +When indexing a string in Lua, the first character is at position 1 +(not at 0, as in C). +Indices are allowed to be negative and are interpreted as indexing backwards, +from the end of the string. +Thus, the last character is at position -1, and so on. + + +

+The string library provides all its functions inside the table +string. +It also sets a metatable for strings +where the __index field points to the string table. +Therefore, you can use the string functions in object-oriented style. +For instance, string.byte(s, i) +can be written as s:byte(i). + + +

+The string library assumes one-byte character encodings. + + +

+


string.byte (s [, i [, j]])

+Returns the internal numerical codes of the characters s[i], +s[i+1], ···, s[j]. +The default value for i is 1; +the default value for j is i. + + +

+Note that numerical codes are not necessarily portable across platforms. + + + + +

+


string.char (···)

+Receives zero or more integers. +Returns a string with length equal to the number of arguments, +in which each character has the internal numerical code equal +to its corresponding argument. + + +

+Note that numerical codes are not necessarily portable across platforms. + + + + +

+


string.dump (function)

+ + +

+Returns a string containing a binary representation of the given function, +so that a later loadstring on this string returns +a copy of the function. +function must be a Lua function without upvalues. + + + + +

+


string.find (s, pattern [, init [, plain]])

+Looks for the first match of +pattern in the string s. +If it finds a match, then find returns the indices of s +where this occurrence starts and ends; +otherwise, it returns nil. +A third, optional numerical argument init specifies +where to start the search; +its default value is 1 and can be negative. +A value of true as a fourth, optional argument plain +turns off the pattern matching facilities, +so the function does a plain "find substring" operation, +with no characters in pattern being considered "magic". +Note that if plain is given, then init must be given as well. + + +

+If the pattern has captures, +then in a successful match +the captured values are also returned, +after the two indices. + + + + +

+


string.format (formatstring, ···)

+Returns a formatted version of its variable number of arguments +following the description given in its first argument (which must be a string). +The format string follows the same rules as the printf family of +standard C functions. +The only differences are that the options/modifiers +*, l, L, n, p, +and h are not supported +and that there is an extra option, q. +The q option formats a string in a form suitable to be safely read +back by the Lua interpreter: +the string is written between double quotes, +and all double quotes, newlines, embedded zeros, +and backslashes in the string +are correctly escaped when written. +For instance, the call + +
+     string.format('%q', 'a string with "quotes" and \n new line')
+

+will produce the string: + +

+     "a string with \"quotes\" and \
+      new line"
+
+ +

+The options c, d, E, e, f, +g, G, i, o, u, X, and x all +expect a number as argument, +whereas q and s expect a string. + + +

+This function does not accept string values +containing embedded zeros, +except as arguments to the q option. + + + + +

+


string.gmatch (s, pattern)

+Returns an iterator function that, +each time it is called, +returns the next captures from pattern over string s. +If pattern specifies no captures, +then the whole match is produced in each call. + + +

+As an example, the following loop + +

+     s = "hello world from Lua"
+     for w in string.gmatch(s, "%a+") do
+       print(w)
+     end
+

+will iterate over all the words from string s, +printing one per line. +The next example collects all pairs key=value from the +given string into a table: + +

+     t = {}
+     s = "from=world, to=Lua"
+     for k, v in string.gmatch(s, "(%w+)=(%w+)") do
+       t[k] = v
+     end
+
+ +

+For this function, a '^' at the start of a pattern does not +work as an anchor, as this would prevent the iteration. + + + + +

+


string.gsub (s, pattern, repl [, n])

+Returns a copy of s +in which all (or the first n, if given) +occurrences of the pattern have been +replaced by a replacement string specified by repl, +which can be a string, a table, or a function. +gsub also returns, as its second value, +the total number of matches that occurred. + + +

+If repl is a string, then its value is used for replacement. +The character % works as an escape character: +any sequence in repl of the form %n, +with n between 1 and 9, +stands for the value of the n-th captured substring (see below). +The sequence %0 stands for the whole match. +The sequence %% stands for a single %. + + +

+If repl is a table, then the table is queried for every match, +using the first capture as the key; +if the pattern specifies no captures, +then the whole match is used as the key. + + +

+If repl is a function, then this function is called every time a +match occurs, with all captured substrings passed as arguments, +in order; +if the pattern specifies no captures, +then the whole match is passed as a sole argument. + + +

+If the value returned by the table query or by the function call +is a string or a number, +then it is used as the replacement string; +otherwise, if it is false or nil, +then there is no replacement +(that is, the original match is kept in the string). + + +

+Here are some examples: + +

+     x = string.gsub("hello world", "(%w+)", "%1 %1")
+     --> x="hello hello world world"
+     
+     x = string.gsub("hello world", "%w+", "%0 %0", 1)
+     --> x="hello hello world"
+     
+     x = string.gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1")
+     --> x="world hello Lua from"
+     
+     x = string.gsub("home = $HOME, user = $USER", "%$(%w+)", os.getenv)
+     --> x="home = /home/roberto, user = roberto"
+     
+     x = string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s)
+           return loadstring(s)()
+         end)
+     --> x="4+5 = 9"
+     
+     local t = {name="lua", version="5.1"}
+     x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t)
+     --> x="lua-5.1.tar.gz"
+
+ + + +

+


string.len (s)

+Receives a string and returns its length. +The empty string "" has length 0. +Embedded zeros are counted, +so "a\000bc\000" has length 5. + + + + +

+


string.lower (s)

+Receives a string and returns a copy of this string with all +uppercase letters changed to lowercase. +All other characters are left unchanged. +The definition of what an uppercase letter is depends on the current locale. + + + + +

+


string.match (s, pattern [, init])

+Looks for the first match of +pattern in the string s. +If it finds one, then match returns +the captures from the pattern; +otherwise it returns nil. +If pattern specifies no captures, +then the whole match is returned. +A third, optional numerical argument init specifies +where to start the search; +its default value is 1 and can be negative. + + + + +

+


string.rep (s, n)

+Returns a string that is the concatenation of n copies of +the string s. + + + + +

+


string.reverse (s)

+Returns a string that is the string s reversed. + + + + +

+


string.sub (s, i [, j])

+Returns the substring of s that +starts at i and continues until j; +i and j can be negative. +If j is absent, then it is assumed to be equal to -1 +(which is the same as the string length). +In particular, +the call string.sub(s,1,j) returns a prefix of s +with length j, +and string.sub(s, -i) returns a suffix of s +with length i. + + + + +

+


string.upper (s)

+Receives a string and returns a copy of this string with all +lowercase letters changed to uppercase. +All other characters are left unchanged. +The definition of what a lowercase letter is depends on the current locale. + + + +

5.4.1 - Patterns

+ + +

Character Class:

+A character class is used to represent a set of characters. +The following combinations are allowed in describing a character class: + +

    + +
  • x: +(where x is not one of the magic characters +^$()%.[]*+-?) +represents the character x itself. +
  • + +
  • .: (a dot) represents all characters.
  • + +
  • %a: represents all letters.
  • + +
  • %c: represents all control characters.
  • + +
  • %d: represents all digits.
  • + +
  • %l: represents all lowercase letters.
  • + +
  • %p: represents all punctuation characters.
  • + +
  • %s: represents all space characters.
  • + +
  • %u: represents all uppercase letters.
  • + +
  • %w: represents all alphanumeric characters.
  • + +
  • %x: represents all hexadecimal digits.
  • + +
  • %z: represents the character with representation 0.
  • + +
  • %x: (where x is any non-alphanumeric character) +represents the character x. +This is the standard way to escape the magic characters. +Any punctuation character (even the non magic) +can be preceded by a '%' +when used to represent itself in a pattern. +
  • + +
  • [set]: +represents the class which is the union of all +characters in set. +A range of characters can be specified by +separating the end characters of the range with a '-'. +All classes %x described above can also be used as +components in set. +All other characters in set represent themselves. +For example, [%w_] (or [_%w]) +represents all alphanumeric characters plus the underscore, +[0-7] represents the octal digits, +and [0-7%l%-] represents the octal digits plus +the lowercase letters plus the '-' character. + + +

    +The interaction between ranges and classes is not defined. +Therefore, patterns like [%a-z] or [a-%%] +have no meaning. +

  • + +
  • [^set]: +represents the complement of set, +where set is interpreted as above. +
  • + +

+For all classes represented by single letters (%a, %c, etc.), +the corresponding uppercase letter represents the complement of the class. +For instance, %S represents all non-space characters. + + +

+The definitions of letter, space, and other character groups +depend on the current locale. +In particular, the class [a-z] may not be equivalent to %l. + + + + + +

Pattern Item:

+A pattern item can be + +

    + +
  • +a single character class, +which matches any single character in the class; +
  • + +
  • +a single character class followed by '*', +which matches 0 or more repetitions of characters in the class. +These repetition items will always match the longest possible sequence; +
  • + +
  • +a single character class followed by '+', +which matches 1 or more repetitions of characters in the class. +These repetition items will always match the longest possible sequence; +
  • + +
  • +a single character class followed by '-', +which also matches 0 or more repetitions of characters in the class. +Unlike '*', +these repetition items will always match the shortest possible sequence; +
  • + +
  • +a single character class followed by '?', +which matches 0 or 1 occurrence of a character in the class; +
  • + +
  • +%n, for n between 1 and 9; +such item matches a substring equal to the n-th captured string +(see below); +
  • + +
  • +%bxy, where x and y are two distinct characters; +such item matches strings that start with x, end with y, +and where the x and y are balanced. +This means that, if one reads the string from left to right, +counting +1 for an x and -1 for a y, +the ending y is the first y where the count reaches 0. +For instance, the item %b() matches expressions with +balanced parentheses. +
  • + +
+ + + + +

Pattern:

+A pattern is a sequence of pattern items. +A '^' at the beginning of a pattern anchors the match at the +beginning of the subject string. +A '$' at the end of a pattern anchors the match at the +end of the subject string. +At other positions, +'^' and '$' have no special meaning and represent themselves. + + + + + +

Captures:

+A pattern can contain sub-patterns enclosed in parentheses; +they describe captures. +When a match succeeds, the substrings of the subject string +that match captures are stored (captured) for future use. +Captures are numbered according to their left parentheses. +For instance, in the pattern "(a*(.)%w(%s*))", +the part of the string matching "a*(.)%w(%s*)" is +stored as the first capture (and therefore has number 1); +the character matching "." is captured with number 2, +and the part matching "%s*" has number 3. + + +

+As a special case, the empty capture () captures +the current string position (a number). +For instance, if we apply the pattern "()aa()" on the +string "flaaap", there will be two captures: 3 and 5. + + +

+A pattern cannot contain embedded zeros. Use %z instead. + + + + + + + + + + + +

5.5 - Table Manipulation

+This library provides generic functions for table manipulation. +It provides all its functions inside the table table. + + +

+Most functions in the table library assume that the table +represents an array or a list. +For these functions, when we talk about the "length" of a table +we mean the result of the length operator. + + +

+


table.concat (table [, sep [, i [, j]]])

+Given an array where all elements are strings or numbers, +returns table[i]..sep..table[i+1] ··· sep..table[j]. +The default value for sep is the empty string, +the default for i is 1, +and the default for j is the length of the table. +If i is greater than j, returns the empty string. + + + + +

+


table.insert (table, [pos,] value)

+ + +

+Inserts element value at position pos in table, +shifting up other elements to open space, if necessary. +The default value for pos is n+1, +where n is the length of the table (see §2.5.5), +so that a call table.insert(t,x) inserts x at the end +of table t. + + + + +

+


table.maxn (table)

+ + +

+Returns the largest positive numerical index of the given table, +or zero if the table has no positive numerical indices. +(To do its job this function does a linear traversal of +the whole table.) + + + + +

+


table.remove (table [, pos])

+ + +

+Removes from table the element at position pos, +shifting down other elements to close the space, if necessary. +Returns the value of the removed element. +The default value for pos is n, +where n is the length of the table, +so that a call table.remove(t) removes the last element +of table t. + + + + +

+


table.sort (table [, comp])

+Sorts table elements in a given order, in-place, +from table[1] to table[n], +where n is the length of the table. +If comp is given, +then it must be a function that receives two table elements, +and returns true +when the first is less than the second +(so that not comp(a[i+1],a[i]) will be true after the sort). +If comp is not given, +then the standard Lua operator < is used instead. + + +

+The sort algorithm is not stable; +that is, elements considered equal by the given order +may have their relative positions changed by the sort. + + + + + + + +

5.6 - Mathematical Functions

+ +

+This library is an interface to the standard C math library. +It provides all its functions inside the table math. + + +

+


math.abs (x)

+ + +

+Returns the absolute value of x. + + + + +

+


math.acos (x)

+ + +

+Returns the arc cosine of x (in radians). + + + + +

+


math.asin (x)

+ + +

+Returns the arc sine of x (in radians). + + + + +

+


math.atan (x)

+ + +

+Returns the arc tangent of x (in radians). + + + + +

+


math.atan2 (y, x)

+ + +

+Returns the arc tangent of y/x (in radians), +but uses the signs of both parameters to find the +quadrant of the result. +(It also handles correctly the case of x being zero.) + + + + +

+


math.ceil (x)

+ + +

+Returns the smallest integer larger than or equal to x. + + + + +

+


math.cos (x)

+ + +

+Returns the cosine of x (assumed to be in radians). + + + + +

+


math.cosh (x)

+ + +

+Returns the hyperbolic cosine of x. + + + + +

+


math.deg (x)

+ + +

+Returns the angle x (given in radians) in degrees. + + + + +

+


math.exp (x)

+ + +

+Returns the value ex. + + + + +

+


math.floor (x)

+ + +

+Returns the largest integer smaller than or equal to x. + + + + +

+


math.fmod (x, y)

+ + +

+Returns the remainder of the division of x by y +that rounds the quotient towards zero. + + + + +

+


math.frexp (x)

+ + +

+Returns m and e such that x = m2e, +e is an integer and the absolute value of m is +in the range [0.5, 1) +(or zero when x is zero). + + + + +

+


math.huge

+ + +

+The value HUGE_VAL, +a value larger than or equal to any other numerical value. + + + + +

+


math.ldexp (m, e)

+ + +

+Returns m2e (e should be an integer). + + + + +

+


math.log (x)

+ + +

+Returns the natural logarithm of x. + + + + +

+


math.log10 (x)

+ + +

+Returns the base-10 logarithm of x. + + + + +

+


math.max (x, ···)

+ + +

+Returns the maximum value among its arguments. + + + + +

+


math.min (x, ···)

+ + +

+Returns the minimum value among its arguments. + + + + +

+


math.modf (x)

+ + +

+Returns two numbers, +the integral part of x and the fractional part of x. + + + + +

+


math.pi

+ + +

+The value of pi. + + + + +

+


math.pow (x, y)

+ + +

+Returns xy. +(You can also use the expression x^y to compute this value.) + + + + +

+


math.rad (x)

+ + +

+Returns the angle x (given in degrees) in radians. + + + + +

+


math.random ([m [, n]])

+ + +

+This function is an interface to the simple +pseudo-random generator function rand provided by ANSI C. +(No guarantees can be given for its statistical properties.) + + +

+When called without arguments, +returns a uniform pseudo-random real number +in the range [0,1). +When called with an integer number m, +math.random returns +a uniform pseudo-random integer in the range [1, m]. +When called with two integer numbers m and n, +math.random returns a uniform pseudo-random +integer in the range [m, n]. + + + + +

+


math.randomseed (x)

+ + +

+Sets x as the "seed" +for the pseudo-random generator: +equal seeds produce equal sequences of numbers. + + + + +

+


math.sin (x)

+ + +

+Returns the sine of x (assumed to be in radians). + + + + +

+


math.sinh (x)

+ + +

+Returns the hyperbolic sine of x. + + + + +

+


math.sqrt (x)

+ + +

+Returns the square root of x. +(You can also use the expression x^0.5 to compute this value.) + + + + +

+


math.tan (x)

+ + +

+Returns the tangent of x (assumed to be in radians). + + + + +

+


math.tanh (x)

+ + +

+Returns the hyperbolic tangent of x. + + + + + + + +

5.7 - Input and Output Facilities

+ +

+The I/O library provides two different styles for file manipulation. +The first one uses implicit file descriptors; +that is, there are operations to set a default input file and a +default output file, +and all input/output operations are over these default files. +The second style uses explicit file descriptors. + + +

+When using implicit file descriptors, +all operations are supplied by table io. +When using explicit file descriptors, +the operation io.open returns a file descriptor +and then all operations are supplied as methods of the file descriptor. + + +

+The table io also provides +three predefined file descriptors with their usual meanings from C: +io.stdin, io.stdout, and io.stderr. +The I/O library never closes these files. + + +

+Unless otherwise stated, +all I/O functions return nil on failure +(plus an error message as a second result and +a system-dependent error code as a third result) +and some value different from nil on success. + + +

+


io.close ([file])

+ + +

+Equivalent to file:close(). +Without a file, closes the default output file. + + + + +

+


io.flush ()

+ + +

+Equivalent to file:flush over the default output file. + + + + +

+


io.input ([file])

+ + +

+When called with a file name, it opens the named file (in text mode), +and sets its handle as the default input file. +When called with a file handle, +it simply sets this file handle as the default input file. +When called without parameters, +it returns the current default input file. + + +

+In case of errors this function raises the error, +instead of returning an error code. + + + + +

+


io.lines ([filename])

+ + +

+Opens the given file name in read mode +and returns an iterator function that, +each time it is called, +returns a new line from the file. +Therefore, the construction + +

+     for line in io.lines(filename) do body end
+

+will iterate over all lines of the file. +When the iterator function detects the end of file, +it returns nil (to finish the loop) and automatically closes the file. + + +

+The call io.lines() (with no file name) is equivalent +to io.input():lines(); +that is, it iterates over the lines of the default input file. +In this case it does not close the file when the loop ends. + + + + +

+


io.open (filename [, mode])

+ + +

+This function opens a file, +in the mode specified in the string mode. +It returns a new file handle, +or, in case of errors, nil plus an error message. + + +

+The mode string can be any of the following: + +

    +
  • "r": read mode (the default);
  • +
  • "w": write mode;
  • +
  • "a": append mode;
  • +
  • "r+": update mode, all previous data is preserved;
  • +
  • "w+": update mode, all previous data is erased;
  • +
  • "a+": append update mode, previous data is preserved, + writing is only allowed at the end of file.
  • +

+The mode string can also have a 'b' at the end, +which is needed in some systems to open the file in binary mode. +This string is exactly what is used in the +standard C function fopen. + + + + +

+


io.output ([file])

+ + +

+Similar to io.input, but operates over the default output file. + + + + +

+


io.popen (prog [, mode])

+ + +

+Starts program prog in a separated process and returns +a file handle that you can use to read data from this program +(if mode is "r", the default) +or to write data to this program +(if mode is "w"). + + +

+This function is system dependent and is not available +on all platforms. + + + + +

+


io.read (···)

+ + +

+Equivalent to io.input():read. + + + + +

+


io.tmpfile ()

+ + +

+Returns a handle for a temporary file. +This file is opened in update mode +and it is automatically removed when the program ends. + + + + +

+


io.type (obj)

+ + +

+Checks whether obj is a valid file handle. +Returns the string "file" if obj is an open file handle, +"closed file" if obj is a closed file handle, +or nil if obj is not a file handle. + + + + +

+


io.write (···)

+ + +

+Equivalent to io.output():write. + + + + +

+


file:close ()

+ + +

+Closes file. +Note that files are automatically closed when +their handles are garbage collected, +but that takes an unpredictable amount of time to happen. + + + + +

+


file:flush ()

+ + +

+Saves any written data to file. + + + + +

+


file:lines ()

+ + +

+Returns an iterator function that, +each time it is called, +returns a new line from the file. +Therefore, the construction + +

+     for line in file:lines() do body end
+

+will iterate over all lines of the file. +(Unlike io.lines, this function does not close the file +when the loop ends.) + + + + +

+


file:read (···)

+ + +

+Reads the file file, +according to the given formats, which specify what to read. +For each format, +the function returns a string (or a number) with the characters read, +or nil if it cannot read data with the specified format. +When called without formats, +it uses a default format that reads the entire next line +(see below). + + +

+The available formats are + +

    + +
  • "*n": +reads a number; +this is the only format that returns a number instead of a string. +
  • + +
  • "*a": +reads the whole file, starting at the current position. +On end of file, it returns the empty string. +
  • + +
  • "*l": +reads the next line (skipping the end of line), +returning nil on end of file. +This is the default format. +
  • + +
  • number: +reads a string with up to this number of characters, +returning nil on end of file. +If number is zero, +it reads nothing and returns an empty string, +or nil on end of file. +
  • + +
+ + + +

+


file:seek ([whence] [, offset])

+ + +

+Sets and gets the file position, +measured from the beginning of the file, +to the position given by offset plus a base +specified by the string whence, as follows: + +

    +
  • "set": base is position 0 (beginning of the file);
  • +
  • "cur": base is current position;
  • +
  • "end": base is end of file;
  • +

+In case of success, function seek returns the final file position, +measured in bytes from the beginning of the file. +If this function fails, it returns nil, +plus a string describing the error. + + +

+The default value for whence is "cur", +and for offset is 0. +Therefore, the call file:seek() returns the current +file position, without changing it; +the call file:seek("set") sets the position to the +beginning of the file (and returns 0); +and the call file:seek("end") sets the position to the +end of the file, and returns its size. + + + + +

+


file:setvbuf (mode [, size])

+ + +

+Sets the buffering mode for an output file. +There are three available modes: + +

    + +
  • "no": +no buffering; the result of any output operation appears immediately. +
  • + +
  • "full": +full buffering; output operation is performed only +when the buffer is full (or when you explicitly flush the file +(see io.flush)). +
  • + +
  • "line": +line buffering; output is buffered until a newline is output +or there is any input from some special files +(such as a terminal device). +
  • + +

+For the last two cases, size +specifies the size of the buffer, in bytes. +The default is an appropriate size. + + + + +

+


file:write (···)

+ + +

+Writes the value of each of its arguments to +the file. +The arguments must be strings or numbers. +To write other values, +use tostring or string.format before write. + + + + + + + +

5.8 - Operating System Facilities

+ +

+This library is implemented through table os. + + +

+


os.clock ()

+ + +

+Returns an approximation of the amount in seconds of CPU time +used by the program. + + + + +

+


os.date ([format [, time]])

+ + +

+Returns a string or a table containing date and time, +formatted according to the given string format. + + +

+If the time argument is present, +this is the time to be formatted +(see the os.time function for a description of this value). +Otherwise, date formats the current time. + + +

+If format starts with '!', +then the date is formatted in Coordinated Universal Time. +After this optional character, +if format is the string "*t", +then date returns a table with the following fields: +year (four digits), month (1--12), day (1--31), +hour (0--23), min (0--59), sec (0--61), +wday (weekday, Sunday is 1), +yday (day of the year), +and isdst (daylight saving flag, a boolean). + + +

+If format is not "*t", +then date returns the date as a string, +formatted according to the same rules as the C function strftime. + + +

+When called without arguments, +date returns a reasonable date and time representation that depends on +the host system and on the current locale +(that is, os.date() is equivalent to os.date("%c")). + + + + +

+


os.difftime (t2, t1)

+ + +

+Returns the number of seconds from time t1 to time t2. +In POSIX, Windows, and some other systems, +this value is exactly t2-t1. + + + + +

+


os.execute ([command])

+ + +

+This function is equivalent to the C function system. +It passes command to be executed by an operating system shell. +It returns a status code, which is system-dependent. +If command is absent, then it returns nonzero if a shell is available +and zero otherwise. + + + + +

+


os.exit ([code])

+ + +

+Calls the C function exit, +with an optional code, +to terminate the host program. +The default value for code is the success code. + + + + +

+


os.getenv (varname)

+ + +

+Returns the value of the process environment variable varname, +or nil if the variable is not defined. + + + + +

+


os.remove (filename)

+ + +

+Deletes the file or directory with the given name. +Directories must be empty to be removed. +If this function fails, it returns nil, +plus a string describing the error. + + + + +

+


os.rename (oldname, newname)

+ + +

+Renames file or directory named oldname to newname. +If this function fails, it returns nil, +plus a string describing the error. + + + + +

+


os.setlocale (locale [, category])

+ + +

+Sets the current locale of the program. +locale is a string specifying a locale; +category is an optional string describing which category to change: +"all", "collate", "ctype", +"monetary", "numeric", or "time"; +the default category is "all". +The function returns the name of the new locale, +or nil if the request cannot be honored. + + +

+If locale is the empty string, +the current locale is set to an implementation-defined native locale. +If locale is the string "C", +the current locale is set to the standard C locale. + + +

+When called with nil as the first argument, +this function only returns the name of the current locale +for the given category. + + + + +

+


os.time ([table])

+ + +

+Returns the current time when called without arguments, +or a time representing the date and time specified by the given table. +This table must have fields year, month, and day, +and may have fields hour, min, sec, and isdst +(for a description of these fields, see the os.date function). + + +

+The returned value is a number, whose meaning depends on your system. +In POSIX, Windows, and some other systems, this number counts the number +of seconds since some given start time (the "epoch"). +In other systems, the meaning is not specified, +and the number returned by time can be used only as an argument to +date and difftime. + + + + +

+


os.tmpname ()

+ + +

+Returns a string with a file name that can +be used for a temporary file. +The file must be explicitly opened before its use +and explicitly removed when no longer needed. + + +

+On some systems (POSIX), +this function also creates a file with that name, +to avoid security risks. +(Someone else might create the file with wrong permissions +in the time between getting the name and creating the file.) +You still have to open the file to use it +and to remove it (even if you do not use it). + + +

+When possible, +you may prefer to use io.tmpfile, +which automatically removes the file when the program ends. + + + + + + + +

5.9 - The Debug Library

+ +

+This library provides +the functionality of the debug interface to Lua programs. +You should exert care when using this library. +The functions provided here should be used exclusively for debugging +and similar tasks, such as profiling. +Please resist the temptation to use them as a +usual programming tool: +they can be very slow. +Moreover, several of these functions +violate some assumptions about Lua code +(e.g., that variables local to a function +cannot be accessed from outside or +that userdata metatables cannot be changed by Lua code) +and therefore can compromise otherwise secure code. + + +

+All functions in this library are provided +inside the debug table. +All functions that operate over a thread +have an optional first argument which is the +thread to operate over. +The default is always the current thread. + + +

+


debug.debug ()

+ + +

+Enters an interactive mode with the user, +running each string that the user enters. +Using simple commands and other debug facilities, +the user can inspect global and local variables, +change their values, evaluate expressions, and so on. +A line containing only the word cont finishes this function, +so that the caller continues its execution. + + +

+Note that commands for debug.debug are not lexically nested +within any function, and so have no direct access to local variables. + + + + +

+


debug.getfenv (o)

+Returns the environment of object o. + + + + +

+


debug.gethook ([thread])

+ + +

+Returns the current hook settings of the thread, as three values: +the current hook function, the current hook mask, +and the current hook count +(as set by the debug.sethook function). + + + + +

+


debug.getinfo ([thread,] function [, what])

+ + +

+Returns a table with information about a function. +You can give the function directly, +or you can give a number as the value of function, +which means the function running at level function of the call stack +of the given thread: +level 0 is the current function (getinfo itself); +level 1 is the function that called getinfo; +and so on. +If function is a number larger than the number of active functions, +then getinfo returns nil. + + +

+The returned table can contain all the fields returned by lua_getinfo, +with the string what describing which fields to fill in. +The default for what is to get all information available, +except the table of valid lines. +If present, +the option 'f' +adds a field named func with the function itself. +If present, +the option 'L' +adds a field named activelines with the table of +valid lines. + + +

+For instance, the expression debug.getinfo(1,"n").name returns +a table with a name for the current function, +if a reasonable name can be found, +and the expression debug.getinfo(print) +returns a table with all available information +about the print function. + + + + +

+


debug.getlocal ([thread,] level, local)

+ + +

+This function returns the name and the value of the local variable +with index local of the function at level level of the stack. +(The first parameter or local variable has index 1, and so on, +until the last active local variable.) +The function returns nil if there is no local +variable with the given index, +and raises an error when called with a level out of range. +(You can call debug.getinfo to check whether the level is valid.) + + +

+Variable names starting with '(' (open parentheses) +represent internal variables +(loop control variables, temporaries, and C function locals). + + + + +

+


debug.getmetatable (object)

+ + +

+Returns the metatable of the given object +or nil if it does not have a metatable. + + + + +

+


debug.getregistry ()

+ + +

+Returns the registry table (see §3.5). + + + + +

+


debug.getupvalue (func, up)

+ + +

+This function returns the name and the value of the upvalue +with index up of the function func. +The function returns nil if there is no upvalue with the given index. + + + + +

+


debug.setfenv (object, table)

+ + +

+Sets the environment of the given object to the given table. +Returns object. + + + + +

+


debug.sethook ([thread,] hook, mask [, count])

+ + +

+Sets the given function as a hook. +The string mask and the number count describe +when the hook will be called. +The string mask may have the following characters, +with the given meaning: + +

    +
  • "c": the hook is called every time Lua calls a function;
  • +
  • "r": the hook is called every time Lua returns from a function;
  • +
  • "l": the hook is called every time Lua enters a new line of code.
  • +

+With a count different from zero, +the hook is called after every count instructions. + + +

+When called without arguments, +debug.sethook turns off the hook. + + +

+When the hook is called, its first parameter is a string +describing the event that has triggered its call: +"call", "return" (or "tail return", +when simulating a return from a tail call), +"line", and "count". +For line events, +the hook also gets the new line number as its second parameter. +Inside a hook, +you can call getinfo with level 2 to get more information about +the running function +(level 0 is the getinfo function, +and level 1 is the hook function), +unless the event is "tail return". +In this case, Lua is only simulating the return, +and a call to getinfo will return invalid data. + + + + +

+


debug.setlocal ([thread,] level, local, value)

+ + +

+This function assigns the value value to the local variable +with index local of the function at level level of the stack. +The function returns nil if there is no local +variable with the given index, +and raises an error when called with a level out of range. +(You can call getinfo to check whether the level is valid.) +Otherwise, it returns the name of the local variable. + + + + +

+


debug.setmetatable (object, table)

+ + +

+Sets the metatable for the given object to the given table +(which can be nil). + + + + +

+


debug.setupvalue (func, up, value)

+ + +

+This function assigns the value value to the upvalue +with index up of the function func. +The function returns nil if there is no upvalue +with the given index. +Otherwise, it returns the name of the upvalue. + + + + +

+


debug.traceback ([thread,] [message] [, level])

+ + +

+Returns a string with a traceback of the call stack. +An optional message string is appended +at the beginning of the traceback. +An optional level number tells at which level +to start the traceback +(default is 1, the function calling traceback). + + + + + + + +

6 - Lua Stand-alone

+ +

+Although Lua has been designed as an extension language, +to be embedded in a host C program, +it is also frequently used as a stand-alone language. +An interpreter for Lua as a stand-alone language, +called simply lua, +is provided with the standard distribution. +The stand-alone interpreter includes +all standard libraries, including the debug library. +Its usage is: + +

+     lua [options] [script [args]]
+

+The options are: + +

    +
  • -e stat: executes string stat;
  • +
  • -l mod: "requires" mod;
  • +
  • -i: enters interactive mode after running script;
  • +
  • -v: prints version information;
  • +
  • --: stops handling options;
  • +
  • -: executes stdin as a file and stops handling options.
  • +

+After handling its options, lua runs the given script, +passing to it the given args as string arguments. +When called without arguments, +lua behaves as lua -v -i +when the standard input (stdin) is a terminal, +and as lua - otherwise. + + +

+Before running any argument, +the interpreter checks for an environment variable LUA_INIT. +If its format is @filename, +then lua executes the file. +Otherwise, lua executes the string itself. + + +

+All options are handled in order, except -i. +For instance, an invocation like + +

+     $ lua -e'a=1' -e 'print(a)' script.lua
+

+will first set a to 1, then print the value of a (which is '1'), +and finally run the file script.lua with no arguments. +(Here $ is the shell prompt. Your prompt may be different.) + + +

+Before starting to run the script, +lua collects all arguments in the command line +in a global table called arg. +The script name is stored at index 0, +the first argument after the script name goes to index 1, +and so on. +Any arguments before the script name +(that is, the interpreter name plus the options) +go to negative indices. +For instance, in the call + +

+     $ lua -la b.lua t1 t2
+

+the interpreter first runs the file a.lua, +then creates a table + +

+     arg = { [-2] = "lua", [-1] = "-la",
+             [0] = "b.lua",
+             [1] = "t1", [2] = "t2" }
+

+and finally runs the file b.lua. +The script is called with arg[1], arg[2], ··· +as arguments; +it can also access these arguments with the vararg expression '...'. + + +

+In interactive mode, +if you write an incomplete statement, +the interpreter waits for its completion +by issuing a different prompt. + + +

+If the global variable _PROMPT contains a string, +then its value is used as the prompt. +Similarly, if the global variable _PROMPT2 contains a string, +its value is used as the secondary prompt +(issued during incomplete statements). +Therefore, both prompts can be changed directly on the command line +or in any Lua programs by assigning to _PROMPT. +See the next example: + +

+     $ lua -e"_PROMPT='myprompt> '" -i
+

+(The outer pair of quotes is for the shell, +the inner pair is for Lua.) +Note the use of -i to enter interactive mode; +otherwise, +the program would just end silently +right after the assignment to _PROMPT. + + +

+To allow the use of Lua as a +script interpreter in Unix systems, +the stand-alone interpreter skips +the first line of a chunk if it starts with #. +Therefore, Lua scripts can be made into executable programs +by using chmod +x and the #! form, +as in + +

+     #!/usr/local/bin/lua
+

+(Of course, +the location of the Lua interpreter may be different in your machine. +If lua is in your PATH, +then + +

+     #!/usr/bin/env lua
+

+is a more portable solution.) + + + +

7 - Incompatibilities with the Previous Version

+ +

+Here we list the incompatibilities that you may find when moving a program +from Lua 5.0 to Lua 5.1. +You can avoid most of the incompatibilities compiling Lua with +appropriate options (see file luaconf.h). +However, +all these compatibility options will be removed in the next version of Lua. + + + +

7.1 - Changes in the Language

+
    + +
  • +The vararg system changed from the pseudo-argument arg with a +table with the extra arguments to the vararg expression. +(See compile-time option LUA_COMPAT_VARARG in luaconf.h.) +
  • + +
  • +There was a subtle change in the scope of the implicit +variables of the for statement and for the repeat statement. +
  • + +
  • +The long string/long comment syntax ([[string]]) +does not allow nesting. +You can use the new syntax ([=[string]=]) in these cases. +(See compile-time option LUA_COMPAT_LSTR in luaconf.h.) +
  • + +
+ + + + +

7.2 - Changes in the Libraries

+
    + +
  • +Function string.gfind was renamed string.gmatch. +(See compile-time option LUA_COMPAT_GFIND in luaconf.h.) +
  • + +
  • +When string.gsub is called with a function as its +third argument, +whenever this function returns nil or false the +replacement string is the whole match, +instead of the empty string. +
  • + +
  • +Function table.setn was deprecated. +Function table.getn corresponds +to the new length operator (#); +use the operator instead of the function. +(See compile-time option LUA_COMPAT_GETN in luaconf.h.) +
  • + +
  • +Function loadlib was renamed package.loadlib. +(See compile-time option LUA_COMPAT_LOADLIB in luaconf.h.) +
  • + +
  • +Function math.mod was renamed math.fmod. +(See compile-time option LUA_COMPAT_MOD in luaconf.h.) +
  • + +
  • +Functions table.foreach and table.foreachi are deprecated. +You can use a for loop with pairs or ipairs instead. +
  • + +
  • +There were substantial changes in function require due to +the new module system. +However, the new behavior is mostly compatible with the old, +but require gets the path from package.path instead +of from LUA_PATH. +
  • + +
  • +Function collectgarbage has different arguments. +Function gcinfo is deprecated; +use collectgarbage("count") instead. +
  • + +
+ + + + +

7.3 - Changes in the API

+
    + +
  • +The luaopen_* functions (to open libraries) +cannot be called directly, +like a regular C function. +They must be called through Lua, +like a Lua function. +
  • + +
  • +Function lua_open was replaced by lua_newstate to +allow the user to set a memory-allocation function. +You can use luaL_newstate from the standard library to +create a state with a standard allocation function +(based on realloc). +
  • + +
  • +Functions luaL_getn and luaL_setn +(from the auxiliary library) are deprecated. +Use lua_objlen instead of luaL_getn +and nothing instead of luaL_setn. +
  • + +
  • +Function luaL_openlib was replaced by luaL_register. +
  • + +
  • +Function luaL_checkudata now throws an error when the given value +is not a userdata of the expected type. +(In Lua 5.0 it returned NULL.) +
  • + +
+ + + + +

8 - The Complete Syntax of Lua

+ +

+Here is the complete syntax of Lua in extended BNF. +(It does not describe operator precedences.) + + + + +

+
+	chunk ::= {stat [`;´]} [laststat [`;´]]
+
+	block ::= chunk
+
+	stat ::=  varlist `=´ explist | 
+		 functioncall | 
+		 do block end | 
+		 while exp do block end | 
+		 repeat block until exp | 
+		 if exp then block {elseif exp then block} [else block] end | 
+		 for Name `=´ exp `,´ exp [`,´ exp] do block end | 
+		 for namelist in explist do block end | 
+		 function funcname funcbody | 
+		 local function Name funcbody | 
+		 local namelist [`=´ explist] 
+
+	laststat ::= return [explist] | break
+
+	funcname ::= Name {`.´ Name} [`:´ Name]
+
+	varlist ::= var {`,´ var}
+
+	var ::=  Name | prefixexp `[´ exp `]´ | prefixexp `.´ Name 
+
+	namelist ::= Name {`,´ Name}
+
+	explist ::= {exp `,´} exp
+
+	exp ::=  nil | false | true | Number | String | `...´ | function | 
+		 prefixexp | tableconstructor | exp binop exp | unop exp 
+
+	prefixexp ::= var | functioncall | `(´ exp `)´
+
+	functioncall ::=  prefixexp args | prefixexp `:´ Name args 
+
+	args ::=  `(´ [explist] `)´ | tableconstructor | String 
+
+	function ::= function funcbody
+
+	funcbody ::= `(´ [parlist] `)´ block end
+
+	parlist ::= namelist [`,´ `...´] | `...´
+
+	tableconstructor ::= `{´ [fieldlist] `}´
+
+	fieldlist ::= field {fieldsep field} [fieldsep]
+
+	field ::= `[´ exp `]´ `=´ exp | Name `=´ exp | exp
+
+	fieldsep ::= `,´ | `;´
+
+	binop ::= `+´ | `-´ | `*´ | `/´ | `^´ | `%´ | `..´ | 
+		 `<´ | `<=´ | `>´ | `>=´ | `==´ | `~=´ | 
+		 and | or
+
+	unop ::= `-´ | not | `#´
+
+
+ +

+ + + + + + + +


+ +Last update: +Mon Aug 18 13:25:46 BRT 2008 + + + + + diff --git a/user/lua-5.1.4/doc/readme.html b/user/lua-5.1.4/doc/readme.html new file mode 100644 index 0000000..38be6db --- /dev/null +++ b/user/lua-5.1.4/doc/readme.html @@ -0,0 +1,40 @@ + + +Lua documentation + + + + + +
+

+Lua +Documentation +

+ +This is the documentation included in the source distribution of Lua 5.1.4. + + + +Lua's +official web site +contains updated documentation, +especially the +reference manual. +

+ +


+ +Last update: +Tue Aug 12 14:46:07 BRT 2008 + + + + diff --git a/user/lua-5.1.4/etc/Makefile b/user/lua-5.1.4/etc/Makefile new file mode 100644 index 0000000..6d00008 --- /dev/null +++ b/user/lua-5.1.4/etc/Makefile @@ -0,0 +1,44 @@ +# makefile for Lua etc + +TOP= .. +LIB= $(TOP)/src +INC= $(TOP)/src +BIN= $(TOP)/src +SRC= $(TOP)/src +TST= $(TOP)/test + +CC= gcc +CFLAGS= -O2 -Wall -I$(INC) $(MYCFLAGS) +MYCFLAGS= +MYLDFLAGS= -Wl,-E +MYLIBS= -lm +#MYLIBS= -lm -Wl,-E -ldl -lreadline -lhistory -lncurses +RM= rm -f + +default: + @echo 'Please choose a target: min noparser one strict clean' + +min: min.c + $(CC) $(CFLAGS) $@.c -L$(LIB) -llua $(MYLIBS) + echo 'print"Hello there!"' | ./a.out + +noparser: noparser.o + $(CC) noparser.o $(SRC)/lua.o -L$(LIB) -llua $(MYLIBS) + $(BIN)/luac $(TST)/hello.lua + -./a.out luac.out + -./a.out -e'a=1' + +one: + $(CC) $(CFLAGS) all.c $(MYLIBS) + ./a.out $(TST)/hello.lua + +strict: + -$(BIN)/lua -e 'print(a);b=2' + -$(BIN)/lua -lstrict -e 'print(a)' + -$(BIN)/lua -e 'function f() b=2 end f()' + -$(BIN)/lua -lstrict -e 'function f() b=2 end f()' + +clean: + $(RM) a.out core core.* *.o luac.out + +.PHONY: default min noparser one strict clean diff --git a/user/lua-5.1.4/etc/README b/user/lua-5.1.4/etc/README new file mode 100644 index 0000000..5149fc9 --- /dev/null +++ b/user/lua-5.1.4/etc/README @@ -0,0 +1,37 @@ +This directory contains some useful files and code. +Unlike the code in ../src, everything here is in the public domain. + +If any of the makes fail, you're probably not using the same libraries +used to build Lua. Set MYLIBS in Makefile accordingly. + +all.c + Full Lua interpreter in a single file. + Do "make one" for a demo. + +lua.hpp + Lua header files for C++ using 'extern "C"'. + +lua.ico + A Lua icon for Windows (and web sites: save as favicon.ico). + Drawn by hand by Markus Gritsch . + +lua.pc + pkg-config data for Lua + +luavs.bat + Script to build Lua under "Visual Studio .NET Command Prompt". + Run it from the toplevel as etc\luavs.bat. + +min.c + A minimal Lua interpreter. + Good for learning and for starting your own. + Do "make min" for a demo. + +noparser.c + Linking with noparser.o avoids loading the parsing modules in lualib.a. + Do "make noparser" for a demo. + +strict.lua + Traps uses of undeclared global variables. + Do "make strict" for a demo. + diff --git a/user/lua-5.1.4/etc/all.c b/user/lua-5.1.4/etc/all.c new file mode 100644 index 0000000..dab68fa --- /dev/null +++ b/user/lua-5.1.4/etc/all.c @@ -0,0 +1,38 @@ +/* +* all.c -- Lua core, libraries and interpreter in a single file +*/ + +#define luaall_c + +#include "lapi.c" +#include "lcode.c" +#include "ldebug.c" +#include "ldo.c" +#include "ldump.c" +#include "lfunc.c" +#include "lgc.c" +#include "llex.c" +#include "lmem.c" +#include "lobject.c" +#include "lopcodes.c" +#include "lparser.c" +#include "lstate.c" +#include "lstring.c" +#include "ltable.c" +#include "ltm.c" +#include "lundump.c" +#include "lvm.c" +#include "lzio.c" + +#include "lauxlib.c" +#include "lbaselib.c" +#include "ldblib.c" +#include "liolib.c" +#include "linit.c" +#include "lmathlib.c" +#include "loadlib.c" +#include "loslib.c" +#include "lstrlib.c" +#include "ltablib.c" + +#include "lua.c" diff --git a/user/lua-5.1.4/etc/lua.hpp b/user/lua-5.1.4/etc/lua.hpp new file mode 100644 index 0000000..ec417f5 --- /dev/null +++ b/user/lua-5.1.4/etc/lua.hpp @@ -0,0 +1,9 @@ +// lua.hpp +// Lua header files for C++ +// <> not supplied automatically because Lua also compiles as C++ + +extern "C" { +#include "lua.h" +#include "lualib.h" +#include "lauxlib.h" +} diff --git a/user/lua-5.1.4/etc/lua.ico b/user/lua-5.1.4/etc/lua.ico new file mode 100644 index 0000000000000000000000000000000000000000..ccbabc4e2004683f29598a991006d7caff6d837d GIT binary patch literal 1078 zcma)5y>7xl4E|D3VJbX9VX7GW1~6FSw!BIQq_T0tNo32b^bxZ4H5fZGR7xh?&v!Y3 zDh3=J`#b+#Yy%W{!g4u>(a#g`Mme7+yefc~5wPOflDr`o81qe{?|t$BfABsDzNw;V z8cH*0{6W<;G9Np#7ik(qoR4aR5-A@{5)}DJ9&}FRBA#X_5+im4-kQSzMF^)-t2(Vi ztw-^|Sn8@O_lM9`oos+0wMZGt&`Bq(aK&XCv1Gfr&Jtd6%lKPdD{s=unqGWyb3%y{X9SS{jB~HMh0oKMISQrDC zJ;K?)>ElnpmN^UNE-rXxtyk{c#rCe~`P=qnFT7 bCxwx*w%~s~=?o*z_6Fk4@7l(poWF`cPpA(! literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/etc/lua.pc b/user/lua-5.1.4/etc/lua.pc new file mode 100644 index 0000000..f52f55b --- /dev/null +++ b/user/lua-5.1.4/etc/lua.pc @@ -0,0 +1,31 @@ +# lua.pc -- pkg-config data for Lua + +# vars from install Makefile + +# grep '^V=' ../Makefile +V= 5.1 +# grep '^R=' ../Makefile +R= 5.1.4 + +# grep '^INSTALL_.*=' ../Makefile | sed 's/INSTALL_TOP/prefix/' +prefix= /usr/local +INSTALL_BIN= ${prefix}/bin +INSTALL_INC= ${prefix}/include +INSTALL_LIB= ${prefix}/lib +INSTALL_MAN= ${prefix}/man/man1 +INSTALL_LMOD= ${prefix}/share/lua/${V} +INSTALL_CMOD= ${prefix}/lib/lua/${V} + +# canonical vars +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +Name: Lua +Description: An Extensible Extension Language +Version: ${R} +Requires: +Libs: -L${libdir} -llua -lm +Cflags: -I${includedir} + +# (end of lua.pc) diff --git a/user/lua-5.1.4/etc/luavs.bat b/user/lua-5.1.4/etc/luavs.bat new file mode 100644 index 0000000..08c2bed --- /dev/null +++ b/user/lua-5.1.4/etc/luavs.bat @@ -0,0 +1,28 @@ +@rem Script to build Lua under "Visual Studio .NET Command Prompt". +@rem Do not run from this directory; run it from the toplevel: etc\luavs.bat . +@rem It creates lua51.dll, lua51.lib, lua.exe, and luac.exe in src. +@rem (contributed by David Manura and Mike Pall) + +@setlocal +@set MYCOMPILE=cl /nologo /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE +@set MYLINK=link /nologo +@set MYMT=mt /nologo + +cd src +%MYCOMPILE% /DLUA_BUILD_AS_DLL l*.c +del lua.obj luac.obj +%MYLINK% /DLL /out:lua51.dll l*.obj +if exist lua51.dll.manifest^ + %MYMT% -manifest lua51.dll.manifest -outputresource:lua51.dll;2 +%MYCOMPILE% /DLUA_BUILD_AS_DLL lua.c +%MYLINK% /out:lua.exe lua.obj lua51.lib +if exist lua.exe.manifest^ + %MYMT% -manifest lua.exe.manifest -outputresource:lua.exe +%MYCOMPILE% l*.c print.c +del lua.obj linit.obj lbaselib.obj ldblib.obj liolib.obj lmathlib.obj^ + loslib.obj ltablib.obj lstrlib.obj loadlib.obj +%MYLINK% /out:luac.exe *.obj +if exist luac.exe.manifest^ + %MYMT% -manifest luac.exe.manifest -outputresource:luac.exe +del *.obj *.manifest +cd .. diff --git a/user/lua-5.1.4/etc/min.c b/user/lua-5.1.4/etc/min.c new file mode 100644 index 0000000..6a85a4d --- /dev/null +++ b/user/lua-5.1.4/etc/min.c @@ -0,0 +1,39 @@ +/* +* min.c -- a minimal Lua interpreter +* loads stdin only with minimal error handling. +* no interaction, and no standard library, only a "print" function. +*/ + +#include + +#include "lua.h" +#include "lauxlib.h" + +static int print(lua_State *L) +{ + int n=lua_gettop(L); + int i; + for (i=1; i<=n; i++) + { + if (i>1) printf("\t"); + if (lua_isstring(L,i)) + printf("%s",lua_tostring(L,i)); + else if (lua_isnil(L,i)) + printf("%s","nil"); + else if (lua_isboolean(L,i)) + printf("%s",lua_toboolean(L,i) ? "true" : "false"); + else + printf("%s:%p",luaL_typename(L,i),lua_topointer(L,i)); + } + printf("\n"); + return 0; +} + +int main(void) +{ + lua_State *L=lua_open(); + lua_register(L,"print",print); + if (luaL_dofile(L,NULL)!=0) fprintf(stderr,"%s\n",lua_tostring(L,-1)); + lua_close(L); + return 0; +} diff --git a/user/lua-5.1.4/etc/noparser.c b/user/lua-5.1.4/etc/noparser.c new file mode 100644 index 0000000..13ba546 --- /dev/null +++ b/user/lua-5.1.4/etc/noparser.c @@ -0,0 +1,50 @@ +/* +* The code below can be used to make a Lua core that does not contain the +* parsing modules (lcode, llex, lparser), which represent 35% of the total core. +* You'll only be able to load binary files and strings, precompiled with luac. +* (Of course, you'll have to build luac with the original parsing modules!) +* +* To use this module, simply compile it ("make noparser" does that) and list +* its object file before the Lua libraries. The linker should then not load +* the parsing modules. To try it, do "make luab". +* +* If you also want to avoid the dump module (ldump.o), define NODUMP. +* #define NODUMP +*/ + +#define LUA_CORE + +#include "llex.h" +#include "lparser.h" +#include "lzio.h" + +LUAI_FUNC void luaX_init (lua_State *L) { + UNUSED(L); +} + +LUAI_FUNC Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) { + UNUSED(z); + UNUSED(buff); + UNUSED(name); + lua_pushliteral(L,"parser not loaded"); + lua_error(L); + return NULL; +} + +#ifdef NODUMP +#include "lundump.h" + +LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip) { + UNUSED(f); + UNUSED(w); + UNUSED(data); + UNUSED(strip); +#if 1 + UNUSED(L); + return 0; +#else + lua_pushliteral(L,"dumper not loaded"); + lua_error(L); +#endif +} +#endif diff --git a/user/lua-5.1.4/etc/strict.lua b/user/lua-5.1.4/etc/strict.lua new file mode 100644 index 0000000..604619d --- /dev/null +++ b/user/lua-5.1.4/etc/strict.lua @@ -0,0 +1,41 @@ +-- +-- strict.lua +-- checks uses of undeclared global variables +-- All global variables must be 'declared' through a regular assignment +-- (even assigning nil will do) in a main chunk before being used +-- anywhere or assigned to inside a function. +-- + +local getinfo, error, rawset, rawget = debug.getinfo, error, rawset, rawget + +local mt = getmetatable(_G) +if mt == nil then + mt = {} + setmetatable(_G, mt) +end + +mt.__declared = {} + +local function what () + local d = getinfo(3, "S") + return d and d.what or "C" +end + +mt.__newindex = function (t, n, v) + if not mt.__declared[n] then + local w = what() + if w ~= "main" and w ~= "C" then + error("assign to undeclared variable '"..n.."'", 2) + end + mt.__declared[n] = true + end + rawset(t, n, v) +end + +mt.__index = function (t, n) + if not mt.__declared[n] and what() ~= "C" then + error("variable '"..n.."' is not declared", 2) + end + return rawget(t, n) +end + diff --git a/user/lua-5.1.4/src/Makefile b/user/lua-5.1.4/src/Makefile new file mode 100644 index 0000000..e4a3cd6 --- /dev/null +++ b/user/lua-5.1.4/src/Makefile @@ -0,0 +1,182 @@ +# makefile for building Lua +# see ../INSTALL for installation instructions +# see ../Makefile and luaconf.h for further customization + +# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT ======================= + +# Your platform. See PLATS for possible values. +PLAT= none + +CC= gcc +CFLAGS= -O2 -Wall $(MYCFLAGS) +AR= ar rcu +RANLIB= ranlib +RM= rm -f +LIBS= -lm $(MYLIBS) + +MYCFLAGS= +MYLDFLAGS= +MYLIBS= + +# == END OF USER SETTINGS. NO NEED TO CHANGE ANYTHING BELOW THIS LINE ========= + +PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris + +LUA_A= liblua.a +CORE_O= lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o \ + lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o \ + lundump.o lvm.o lzio.o +LIB_O= lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o \ + lstrlib.o loadlib.o linit.o + +LUA_T= lua +LUA_O= lua.o + +LUAC_T= luac +LUAC_O= luac.o print.o + +ALL_O= $(CORE_O) $(LIB_O) $(LUA_O) $(LUAC_O) +ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) +ALL_A= $(LUA_A) + +default: $(PLAT) + +all: $(ALL_T) + +o: $(ALL_O) + +a: $(ALL_A) + +$(LUA_A): $(CORE_O) $(LIB_O) + $(AR) $@ $? + $(RANLIB) $@ + +$(LUA_T): $(LUA_O) $(LUA_A) + $(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(LUA_A) $(LIBS) + +$(LUAC_T): $(LUAC_O) $(LUA_A) + $(CC) -o $@ $(MYLDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS) + +clean: + $(RM) $(ALL_T) $(ALL_O) + +depend: + @$(CC) $(CFLAGS) -MM l*.c print.c + +echo: + @echo "PLAT = $(PLAT)" + @echo "CC = $(CC)" + @echo "CFLAGS = $(CFLAGS)" + @echo "AR = $(AR)" + @echo "RANLIB = $(RANLIB)" + @echo "RM = $(RM)" + @echo "MYCFLAGS = $(MYCFLAGS)" + @echo "MYLDFLAGS = $(MYLDFLAGS)" + @echo "MYLIBS = $(MYLIBS)" + +# convenience targets for popular platforms + +none: + @echo "Please choose a platform:" + @echo " $(PLATS)" + +aix: + $(MAKE) all CC="xlc" CFLAGS="-O2 -DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-ldl" MYLDFLAGS="-brtl -bexpall" + +ansi: + $(MAKE) all MYCFLAGS=-DLUA_ANSI + +bsd: + $(MAKE) all MYCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-Wl,-E" + +freebsd: + $(MAKE) all MYCFLAGS="-DLUA_USE_LINUX" MYLIBS="-Wl,-E -lreadline" + +generic: + $(MAKE) all MYCFLAGS= + +linux: + $(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses" + +macosx: + $(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-lreadline" +# use this on Mac OS X 10.3- +# $(MAKE) all MYCFLAGS=-DLUA_USE_MACOSX + +mingw: + $(MAKE) "LUA_A=lua51.dll" "LUA_T=lua.exe" \ + "AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \ + "MYCFLAGS=-DLUA_BUILD_AS_DLL" "MYLIBS=" "MYLDFLAGS=-s" lua.exe + $(MAKE) "LUAC_T=luac.exe" luac.exe + +posix: + $(MAKE) all MYCFLAGS=-DLUA_USE_POSIX + +solaris: + $(MAKE) all MYCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-ldl" + +# list targets that do not create files (but not all makes understand .PHONY) +.PHONY: all $(PLATS) default o a clean depend echo none + +# DO NOT DELETE + +lapi.o: lapi.c lua.h luaconf.h lapi.h lobject.h llimits.h ldebug.h \ + lstate.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h \ + lundump.h lvm.h +lauxlib.o: lauxlib.c lua.h luaconf.h lauxlib.h +lbaselib.o: lbaselib.c lua.h luaconf.h lauxlib.h lualib.h +lcode.o: lcode.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h \ + lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h lgc.h \ + ltable.h +ldblib.o: ldblib.c lua.h luaconf.h lauxlib.h lualib.h +ldebug.o: ldebug.c lua.h luaconf.h lapi.h lobject.h llimits.h lcode.h \ + llex.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h \ + lfunc.h lstring.h lgc.h ltable.h lvm.h +ldo.o: ldo.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \ + lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lparser.h lstring.h \ + ltable.h lundump.h lvm.h +ldump.o: ldump.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h \ + lzio.h lmem.h lundump.h +lfunc.o: lfunc.c lua.h luaconf.h lfunc.h lobject.h llimits.h lgc.h lmem.h \ + lstate.h ltm.h lzio.h +lgc.o: lgc.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \ + lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h +linit.o: linit.c lua.h luaconf.h lualib.h lauxlib.h +liolib.o: liolib.c lua.h luaconf.h lauxlib.h lualib.h +llex.o: llex.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h ltm.h \ + lzio.h lmem.h llex.h lparser.h lstring.h lgc.h ltable.h +lmathlib.o: lmathlib.c lua.h luaconf.h lauxlib.h lualib.h +lmem.o: lmem.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \ + ltm.h lzio.h lmem.h ldo.h +loadlib.o: loadlib.c lua.h luaconf.h lauxlib.h lualib.h +lobject.o: lobject.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h \ + ltm.h lzio.h lmem.h lstring.h lgc.h lvm.h +lopcodes.o: lopcodes.c lopcodes.h llimits.h lua.h luaconf.h +loslib.o: loslib.c lua.h luaconf.h lauxlib.h lualib.h +lparser.o: lparser.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h \ + lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h \ + lfunc.h lstring.h lgc.h ltable.h +lstate.o: lstate.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \ + ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h llex.h lstring.h ltable.h +lstring.o: lstring.c lua.h luaconf.h lmem.h llimits.h lobject.h lstate.h \ + ltm.h lzio.h lstring.h lgc.h +lstrlib.o: lstrlib.c lua.h luaconf.h lauxlib.h lualib.h +ltable.o: ltable.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \ + ltm.h lzio.h lmem.h ldo.h lgc.h ltable.h +ltablib.o: ltablib.c lua.h luaconf.h lauxlib.h lualib.h +ltm.o: ltm.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h lzio.h \ + lmem.h lstring.h lgc.h ltable.h +lua.o: lua.c lua.h luaconf.h lauxlib.h lualib.h +luac.o: luac.c lua.h luaconf.h lauxlib.h ldo.h lobject.h llimits.h \ + lstate.h ltm.h lzio.h lmem.h lfunc.h lopcodes.h lstring.h lgc.h \ + lundump.h +lundump.o: lundump.c lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h lundump.h +lvm.o: lvm.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \ + lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h ltable.h lvm.h +lzio.o: lzio.c lua.h luaconf.h llimits.h lmem.h lstate.h lobject.h ltm.h \ + lzio.h +print.o: print.c ldebug.h lstate.h lua.h luaconf.h lobject.h llimits.h \ + ltm.h lzio.h lmem.h lopcodes.h lundump.h + +# (end of Makefile) diff --git a/user/lua-5.1.4/src/lapi.c b/user/lua-5.1.4/src/lapi.c new file mode 100644 index 0000000..5d5145d --- /dev/null +++ b/user/lua-5.1.4/src/lapi.c @@ -0,0 +1,1087 @@ +/* +** $Id: lapi.c,v 2.55.1.5 2008/07/04 18:41:18 roberto Exp $ +** Lua API +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include +#include + +#define lapi_c +#define LUA_CORE + +#include "lua.h" + +#include "lapi.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lundump.h" +#include "lvm.h" + + + +const char lua_ident[] = + "$Lua: " LUA_RELEASE " " LUA_COPYRIGHT " $\n" + "$Authors: " LUA_AUTHORS " $\n" + "$URL: www.lua.org $\n"; + + + +#define api_checknelems(L, n) api_check(L, (n) <= (L->top - L->base)) + +#define api_checkvalidindex(L, i) api_check(L, (i) != luaO_nilobject) + +#define api_incr_top(L) {api_check(L, L->top < L->ci->top); L->top++;} + + + +static TValue *index2adr (lua_State *L, int idx) { + if (idx > 0) { + TValue *o = L->base + (idx - 1); + api_check(L, idx <= L->ci->top - L->base); + if (o >= L->top) return cast(TValue *, luaO_nilobject); + else return o; + } + else if (idx > LUA_REGISTRYINDEX) { + api_check(L, idx != 0 && -idx <= L->top - L->base); + return L->top + idx; + } + else switch (idx) { /* pseudo-indices */ + case LUA_REGISTRYINDEX: return registry(L); + case LUA_ENVIRONINDEX: { + Closure *func = curr_func(L); + sethvalue(L, &L->env, func->c.env); + return &L->env; + } + case LUA_GLOBALSINDEX: return gt(L); + default: { + Closure *func = curr_func(L); + idx = LUA_GLOBALSINDEX - idx; + return (idx <= func->c.nupvalues) + ? &func->c.upvalue[idx-1] + : cast(TValue *, luaO_nilobject); + } + } +} + + +static Table *getcurrenv (lua_State *L) { + if (L->ci == L->base_ci) /* no enclosing function? */ + return hvalue(gt(L)); /* use global table as environment */ + else { + Closure *func = curr_func(L); + return func->c.env; + } +} + + +void luaA_pushobject (lua_State *L, const TValue *o) { + setobj2s(L, L->top, o); + api_incr_top(L); +} + + +LUA_API int lua_checkstack (lua_State *L, int size) { + int res = 1; + lua_lock(L); + if (size > LUAI_MAXCSTACK || (L->top - L->base + size) > LUAI_MAXCSTACK) + res = 0; /* stack overflow */ + else if (size > 0) { + luaD_checkstack(L, size); + if (L->ci->top < L->top + size) + L->ci->top = L->top + size; + } + lua_unlock(L); + return res; +} + + +LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) { + int i; + if (from == to) return; + lua_lock(to); + api_checknelems(from, n); + api_check(from, G(from) == G(to)); + api_check(from, to->ci->top - to->top >= n); + from->top -= n; + for (i = 0; i < n; i++) { + setobj2s(to, to->top++, from->top + i); + } + lua_unlock(to); +} + + +LUA_API void lua_setlevel (lua_State *from, lua_State *to) { + to->nCcalls = from->nCcalls; +} + + +LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) { + lua_CFunction old; + lua_lock(L); + old = G(L)->panic; + G(L)->panic = panicf; + lua_unlock(L); + return old; +} + + +LUA_API lua_State *lua_newthread (lua_State *L) { + lua_State *L1; + lua_lock(L); + luaC_checkGC(L); + L1 = luaE_newthread(L); + setthvalue(L, L->top, L1); + api_incr_top(L); + lua_unlock(L); + luai_userstatethread(L, L1); + return L1; +} + + + +/* +** basic stack manipulation +*/ + + +LUA_API int lua_gettop (lua_State *L) { + return cast_int(L->top - L->base); +} + + +LUA_API void lua_settop (lua_State *L, int idx) { + lua_lock(L); + if (idx >= 0) { + api_check(L, idx <= L->stack_last - L->base); + while (L->top < L->base + idx) + setnilvalue(L->top++); + L->top = L->base + idx; + } + else { + api_check(L, -(idx+1) <= (L->top - L->base)); + L->top += idx+1; /* `subtract' index (index is negative) */ + } + lua_unlock(L); +} + + +LUA_API void lua_remove (lua_State *L, int idx) { + StkId p; + lua_lock(L); + p = index2adr(L, idx); + api_checkvalidindex(L, p); + while (++p < L->top) setobjs2s(L, p-1, p); + L->top--; + lua_unlock(L); +} + + +LUA_API void lua_insert (lua_State *L, int idx) { + StkId p; + StkId q; + lua_lock(L); + p = index2adr(L, idx); + api_checkvalidindex(L, p); + for (q = L->top; q>p; q--) setobjs2s(L, q, q-1); + setobjs2s(L, p, L->top); + lua_unlock(L); +} + + +LUA_API void lua_replace (lua_State *L, int idx) { + StkId o; + lua_lock(L); + /* explicit test for incompatible code */ + if (idx == LUA_ENVIRONINDEX && L->ci == L->base_ci) + luaG_runerror(L, "no calling environment"); + api_checknelems(L, 1); + o = index2adr(L, idx); + api_checkvalidindex(L, o); + if (idx == LUA_ENVIRONINDEX) { + Closure *func = curr_func(L); + api_check(L, ttistable(L->top - 1)); + func->c.env = hvalue(L->top - 1); + luaC_barrier(L, func, L->top - 1); + } + else { + setobj(L, o, L->top - 1); + if (idx < LUA_GLOBALSINDEX) /* function upvalue? */ + luaC_barrier(L, curr_func(L), L->top - 1); + } + L->top--; + lua_unlock(L); +} + + +LUA_API void lua_pushvalue (lua_State *L, int idx) { + lua_lock(L); + setobj2s(L, L->top, index2adr(L, idx)); + api_incr_top(L); + lua_unlock(L); +} + + + +/* +** access functions (stack -> C) +*/ + + +LUA_API int lua_type (lua_State *L, int idx) { + StkId o = index2adr(L, idx); + return (o == luaO_nilobject) ? LUA_TNONE : ttype(o); +} + + +LUA_API const char *lua_typename (lua_State *L, int t) { + UNUSED(L); + return (t == LUA_TNONE) ? "no value" : luaT_typenames[t]; +} + + +LUA_API int lua_iscfunction (lua_State *L, int idx) { + StkId o = index2adr(L, idx); + return iscfunction(o); +} + + +LUA_API int lua_isnumber (lua_State *L, int idx) { + TValue n; + const TValue *o = index2adr(L, idx); + return tonumber(o, &n); +} + + +LUA_API int lua_isstring (lua_State *L, int idx) { + int t = lua_type(L, idx); + return (t == LUA_TSTRING || t == LUA_TNUMBER); +} + + +LUA_API int lua_isuserdata (lua_State *L, int idx) { + const TValue *o = index2adr(L, idx); + return (ttisuserdata(o) || ttislightuserdata(o)); +} + + +LUA_API int lua_rawequal (lua_State *L, int index1, int index2) { + StkId o1 = index2adr(L, index1); + StkId o2 = index2adr(L, index2); + return (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0 + : luaO_rawequalObj(o1, o2); +} + + +LUA_API int lua_equal (lua_State *L, int index1, int index2) { + StkId o1, o2; + int i; + lua_lock(L); /* may call tag method */ + o1 = index2adr(L, index1); + o2 = index2adr(L, index2); + i = (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0 : equalobj(L, o1, o2); + lua_unlock(L); + return i; +} + + +LUA_API int lua_lessthan (lua_State *L, int index1, int index2) { + StkId o1, o2; + int i; + lua_lock(L); /* may call tag method */ + o1 = index2adr(L, index1); + o2 = index2adr(L, index2); + i = (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0 + : luaV_lessthan(L, o1, o2); + lua_unlock(L); + return i; +} + + + +LUA_API lua_Number lua_tonumber (lua_State *L, int idx) { + TValue n; + const TValue *o = index2adr(L, idx); + if (tonumber(o, &n)) + return nvalue(o); + else + return 0; +} + + +LUA_API lua_Integer lua_tointeger (lua_State *L, int idx) { + TValue n; + const TValue *o = index2adr(L, idx); + if (tonumber(o, &n)) { + lua_Integer res; + lua_Number num = nvalue(o); + lua_number2integer(res, num); + return res; + } + else + return 0; +} + + +LUA_API int lua_toboolean (lua_State *L, int idx) { + const TValue *o = index2adr(L, idx); + return !l_isfalse(o); +} + + +LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) { + StkId o = index2adr(L, idx); + if (!ttisstring(o)) { + lua_lock(L); /* `luaV_tostring' may create a new string */ + if (!luaV_tostring(L, o)) { /* conversion failed? */ + if (len != NULL) *len = 0; + lua_unlock(L); + return NULL; + } + luaC_checkGC(L); + o = index2adr(L, idx); /* previous call may reallocate the stack */ + lua_unlock(L); + } + if (len != NULL) *len = tsvalue(o)->len; + return svalue(o); +} + + +LUA_API size_t lua_objlen (lua_State *L, int idx) { + StkId o = index2adr(L, idx); + switch (ttype(o)) { + case LUA_TSTRING: return tsvalue(o)->len; + case LUA_TUSERDATA: return uvalue(o)->len; + case LUA_TTABLE: return luaH_getn(hvalue(o)); + case LUA_TNUMBER: { + size_t l; + lua_lock(L); /* `luaV_tostring' may create a new string */ + l = (luaV_tostring(L, o) ? tsvalue(o)->len : 0); + lua_unlock(L); + return l; + } + default: return 0; + } +} + + +LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) { + StkId o = index2adr(L, idx); + return (!iscfunction(o)) ? NULL : clvalue(o)->c.f; +} + + +LUA_API void *lua_touserdata (lua_State *L, int idx) { + StkId o = index2adr(L, idx); + switch (ttype(o)) { + case LUA_TUSERDATA: return (rawuvalue(o) + 1); + case LUA_TLIGHTUSERDATA: return pvalue(o); + default: return NULL; + } +} + + +LUA_API lua_State *lua_tothread (lua_State *L, int idx) { + StkId o = index2adr(L, idx); + return (!ttisthread(o)) ? NULL : thvalue(o); +} + + +LUA_API const void *lua_topointer (lua_State *L, int idx) { + StkId o = index2adr(L, idx); + switch (ttype(o)) { + case LUA_TTABLE: return hvalue(o); + case LUA_TFUNCTION: return clvalue(o); + case LUA_TTHREAD: return thvalue(o); + case LUA_TUSERDATA: + case LUA_TLIGHTUSERDATA: + return lua_touserdata(L, idx); + default: return NULL; + } +} + + + +/* +** push functions (C -> stack) +*/ + + +LUA_API void lua_pushnil (lua_State *L) { + lua_lock(L); + setnilvalue(L->top); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushnumber (lua_State *L, lua_Number n) { + lua_lock(L); + setnvalue(L->top, n); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) { + lua_lock(L); + setnvalue(L->top, cast_num(n)); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) { + lua_lock(L); + luaC_checkGC(L); + setsvalue2s(L, L->top, luaS_newlstr(L, s, len)); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushstring (lua_State *L, const char *s) { + if (s == NULL) + lua_pushnil(L); + else + lua_pushlstring(L, s, strlen(s)); +} + + +LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt, + va_list argp) { + const char *ret; + lua_lock(L); + luaC_checkGC(L); + ret = luaO_pushvfstring(L, fmt, argp); + lua_unlock(L); + return ret; +} + + +LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) { + const char *ret; + va_list argp; + lua_lock(L); + luaC_checkGC(L); + va_start(argp, fmt); + ret = luaO_pushvfstring(L, fmt, argp); + va_end(argp); + lua_unlock(L); + return ret; +} + + +LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { + Closure *cl; + lua_lock(L); + luaC_checkGC(L); + api_checknelems(L, n); + cl = luaF_newCclosure(L, n, getcurrenv(L)); + cl->c.f = fn; + L->top -= n; + while (n--) + setobj2n(L, &cl->c.upvalue[n], L->top+n); + setclvalue(L, L->top, cl); + lua_assert(iswhite(obj2gco(cl))); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushboolean (lua_State *L, int b) { + lua_lock(L); + setbvalue(L->top, (b != 0)); /* ensure that true is 1 */ + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushlightuserdata (lua_State *L, void *p) { + lua_lock(L); + setpvalue(L->top, p); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API int lua_pushthread (lua_State *L) { + lua_lock(L); + setthvalue(L, L->top, L); + api_incr_top(L); + lua_unlock(L); + return (G(L)->mainthread == L); +} + + + +/* +** get functions (Lua -> stack) +*/ + + +LUA_API void lua_gettable (lua_State *L, int idx) { + StkId t; + lua_lock(L); + t = index2adr(L, idx); + api_checkvalidindex(L, t); + luaV_gettable(L, t, L->top - 1, L->top - 1); + lua_unlock(L); +} + + +LUA_API void lua_getfield (lua_State *L, int idx, const char *k) { + StkId t; + TValue key; + lua_lock(L); + t = index2adr(L, idx); + api_checkvalidindex(L, t); + setsvalue(L, &key, luaS_new(L, k)); + luaV_gettable(L, t, &key, L->top); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_rawget (lua_State *L, int idx) { + StkId t; + lua_lock(L); + t = index2adr(L, idx); + api_check(L, ttistable(t)); + setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1)); + lua_unlock(L); +} + + +LUA_API void lua_rawgeti (lua_State *L, int idx, int n) { + StkId o; + lua_lock(L); + o = index2adr(L, idx); + api_check(L, ttistable(o)); + setobj2s(L, L->top, luaH_getnum(hvalue(o), n)); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_createtable (lua_State *L, int narray, int nrec) { + lua_lock(L); + luaC_checkGC(L); + sethvalue(L, L->top, luaH_new(L, narray, nrec)); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API int lua_getmetatable (lua_State *L, int objindex) { + const TValue *obj; + Table *mt = NULL; + int res; + lua_lock(L); + obj = index2adr(L, objindex); + switch (ttype(obj)) { + case LUA_TTABLE: + mt = hvalue(obj)->metatable; + break; + case LUA_TUSERDATA: + mt = uvalue(obj)->metatable; + break; + default: + mt = G(L)->mt[ttype(obj)]; + break; + } + if (mt == NULL) + res = 0; + else { + sethvalue(L, L->top, mt); + api_incr_top(L); + res = 1; + } + lua_unlock(L); + return res; +} + + +LUA_API void lua_getfenv (lua_State *L, int idx) { + StkId o; + lua_lock(L); + o = index2adr(L, idx); + api_checkvalidindex(L, o); + switch (ttype(o)) { + case LUA_TFUNCTION: + sethvalue(L, L->top, clvalue(o)->c.env); + break; + case LUA_TUSERDATA: + sethvalue(L, L->top, uvalue(o)->env); + break; + case LUA_TTHREAD: + setobj2s(L, L->top, gt(thvalue(o))); + break; + default: + setnilvalue(L->top); + break; + } + api_incr_top(L); + lua_unlock(L); +} + + +/* +** set functions (stack -> Lua) +*/ + + +LUA_API void lua_settable (lua_State *L, int idx) { + StkId t; + lua_lock(L); + api_checknelems(L, 2); + t = index2adr(L, idx); + api_checkvalidindex(L, t); + luaV_settable(L, t, L->top - 2, L->top - 1); + L->top -= 2; /* pop index and value */ + lua_unlock(L); +} + + +LUA_API void lua_setfield (lua_State *L, int idx, const char *k) { + StkId t; + TValue key; + lua_lock(L); + api_checknelems(L, 1); + t = index2adr(L, idx); + api_checkvalidindex(L, t); + setsvalue(L, &key, luaS_new(L, k)); + luaV_settable(L, t, &key, L->top - 1); + L->top--; /* pop value */ + lua_unlock(L); +} + + +LUA_API void lua_rawset (lua_State *L, int idx) { + StkId t; + lua_lock(L); + api_checknelems(L, 2); + t = index2adr(L, idx); + api_check(L, ttistable(t)); + setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1); + luaC_barriert(L, hvalue(t), L->top-1); + L->top -= 2; + lua_unlock(L); +} + + +LUA_API void lua_rawseti (lua_State *L, int idx, int n) { + StkId o; + lua_lock(L); + api_checknelems(L, 1); + o = index2adr(L, idx); + api_check(L, ttistable(o)); + setobj2t(L, luaH_setnum(L, hvalue(o), n), L->top-1); + luaC_barriert(L, hvalue(o), L->top-1); + L->top--; + lua_unlock(L); +} + + +LUA_API int lua_setmetatable (lua_State *L, int objindex) { + TValue *obj; + Table *mt; + lua_lock(L); + api_checknelems(L, 1); + obj = index2adr(L, objindex); + api_checkvalidindex(L, obj); + if (ttisnil(L->top - 1)) + mt = NULL; + else { + api_check(L, ttistable(L->top - 1)); + mt = hvalue(L->top - 1); + } + switch (ttype(obj)) { + case LUA_TTABLE: { + hvalue(obj)->metatable = mt; + if (mt) + luaC_objbarriert(L, hvalue(obj), mt); + break; + } + case LUA_TUSERDATA: { + uvalue(obj)->metatable = mt; + if (mt) + luaC_objbarrier(L, rawuvalue(obj), mt); + break; + } + default: { + G(L)->mt[ttype(obj)] = mt; + break; + } + } + L->top--; + lua_unlock(L); + return 1; +} + + +LUA_API int lua_setfenv (lua_State *L, int idx) { + StkId o; + int res = 1; + lua_lock(L); + api_checknelems(L, 1); + o = index2adr(L, idx); + api_checkvalidindex(L, o); + api_check(L, ttistable(L->top - 1)); + switch (ttype(o)) { + case LUA_TFUNCTION: + clvalue(o)->c.env = hvalue(L->top - 1); + break; + case LUA_TUSERDATA: + uvalue(o)->env = hvalue(L->top - 1); + break; + case LUA_TTHREAD: + sethvalue(L, gt(thvalue(o)), hvalue(L->top - 1)); + break; + default: + res = 0; + break; + } + if (res) luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1)); + L->top--; + lua_unlock(L); + return res; +} + + +/* +** `load' and `call' functions (run Lua code) +*/ + + +#define adjustresults(L,nres) \ + { if (nres == LUA_MULTRET && L->top >= L->ci->top) L->ci->top = L->top; } + + +#define checkresults(L,na,nr) \ + api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na))) + + +LUA_API void lua_call (lua_State *L, int nargs, int nresults) { + StkId func; + lua_lock(L); + api_checknelems(L, nargs+1); + checkresults(L, nargs, nresults); + func = L->top - (nargs+1); + luaD_call(L, func, nresults); + adjustresults(L, nresults); + lua_unlock(L); +} + + + +/* +** Execute a protected call. +*/ +struct CallS { /* data to `f_call' */ + StkId func; + int nresults; +}; + + +static void f_call (lua_State *L, void *ud) { + struct CallS *c = cast(struct CallS *, ud); + luaD_call(L, c->func, c->nresults); +} + + + +LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc) { + struct CallS c; + int status; + ptrdiff_t func; + lua_lock(L); + api_checknelems(L, nargs+1); + checkresults(L, nargs, nresults); + if (errfunc == 0) + func = 0; + else { + StkId o = index2adr(L, errfunc); + api_checkvalidindex(L, o); + func = savestack(L, o); + } + c.func = L->top - (nargs+1); /* function to be called */ + c.nresults = nresults; + status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func); + adjustresults(L, nresults); + lua_unlock(L); + return status; +} + + +/* +** Execute a protected C call. +*/ +struct CCallS { /* data to `f_Ccall' */ + lua_CFunction func; + void *ud; +}; + + +static void f_Ccall (lua_State *L, void *ud) { + struct CCallS *c = cast(struct CCallS *, ud); + Closure *cl; + cl = luaF_newCclosure(L, 0, getcurrenv(L)); + cl->c.f = c->func; + setclvalue(L, L->top, cl); /* push function */ + api_incr_top(L); + setpvalue(L->top, c->ud); /* push only argument */ + api_incr_top(L); + luaD_call(L, L->top - 2, 0); +} + + +LUA_API int lua_cpcall (lua_State *L, lua_CFunction func, void *ud) { + struct CCallS c; + int status; + lua_lock(L); + c.func = func; + c.ud = ud; + status = luaD_pcall(L, f_Ccall, &c, savestack(L, L->top), 0); + lua_unlock(L); + return status; +} + + +LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data, + const char *chunkname) { + ZIO z; + int status; + lua_lock(L); + if (!chunkname) chunkname = "?"; + luaZ_init(L, &z, reader, data); + status = luaD_protectedparser(L, &z, chunkname); + lua_unlock(L); + return status; +} + + +LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data) { + int status; + TValue *o; + lua_lock(L); + api_checknelems(L, 1); + o = L->top - 1; + if (isLfunction(o)) + status = luaU_dump(L, clvalue(o)->l.p, writer, data, 0); + else + status = 1; + lua_unlock(L); + return status; +} + + +LUA_API int lua_status (lua_State *L) { + return L->status; +} + + +/* +** Garbage-collection function +*/ + +LUA_API int lua_gc (lua_State *L, int what, int data) { + int res = 0; + global_State *g; + lua_lock(L); + g = G(L); + switch (what) { + case LUA_GCSTOP: { + g->GCthreshold = MAX_LUMEM; + break; + } + case LUA_GCRESTART: { + g->GCthreshold = g->totalbytes; + break; + } + case LUA_GCCOLLECT: { + luaC_fullgc(L); + break; + } + case LUA_GCCOUNT: { + /* GC values are expressed in Kbytes: #bytes/2^10 */ + res = cast_int(g->totalbytes >> 10); + break; + } + case LUA_GCCOUNTB: { + res = cast_int(g->totalbytes & 0x3ff); + break; + } + case LUA_GCSTEP: { + lu_mem a = (cast(lu_mem, data) << 10); + if (a <= g->totalbytes) + g->GCthreshold = g->totalbytes - a; + else + g->GCthreshold = 0; + while (g->GCthreshold <= g->totalbytes) { + luaC_step(L); + if (g->gcstate == GCSpause) { /* end of cycle? */ + res = 1; /* signal it */ + break; + } + } + break; + } + case LUA_GCSETPAUSE: { + res = g->gcpause; + g->gcpause = data; + break; + } + case LUA_GCSETSTEPMUL: { + res = g->gcstepmul; + g->gcstepmul = data; + break; + } + default: res = -1; /* invalid option */ + } + lua_unlock(L); + return res; +} + + + +/* +** miscellaneous functions +*/ + + +LUA_API int lua_error (lua_State *L) { + lua_lock(L); + api_checknelems(L, 1); + luaG_errormsg(L); + lua_unlock(L); + return 0; /* to avoid warnings */ +} + + +LUA_API int lua_next (lua_State *L, int idx) { + StkId t; + int more; + lua_lock(L); + t = index2adr(L, idx); + api_check(L, ttistable(t)); + more = luaH_next(L, hvalue(t), L->top - 1); + if (more) { + api_incr_top(L); + } + else /* no more elements */ + L->top -= 1; /* remove key */ + lua_unlock(L); + return more; +} + + +LUA_API void lua_concat (lua_State *L, int n) { + lua_lock(L); + api_checknelems(L, n); + if (n >= 2) { + luaC_checkGC(L); + luaV_concat(L, n, cast_int(L->top - L->base) - 1); + L->top -= (n-1); + } + else if (n == 0) { /* push empty string */ + setsvalue2s(L, L->top, luaS_newlstr(L, "", 0)); + api_incr_top(L); + } + /* else n == 1; nothing to do */ + lua_unlock(L); +} + + +LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) { + lua_Alloc f; + lua_lock(L); + if (ud) *ud = G(L)->ud; + f = G(L)->frealloc; + lua_unlock(L); + return f; +} + + +LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) { + lua_lock(L); + G(L)->ud = ud; + G(L)->frealloc = f; + lua_unlock(L); +} + + +LUA_API void *lua_newuserdata (lua_State *L, size_t size) { + Udata *u; + lua_lock(L); + luaC_checkGC(L); + u = luaS_newudata(L, size, getcurrenv(L)); + setuvalue(L, L->top, u); + api_incr_top(L); + lua_unlock(L); + return u + 1; +} + + + + +static const char *aux_upvalue (StkId fi, int n, TValue **val) { + Closure *f; + if (!ttisfunction(fi)) return NULL; + f = clvalue(fi); + if (f->c.isC) { + if (!(1 <= n && n <= f->c.nupvalues)) return NULL; + *val = &f->c.upvalue[n-1]; + return ""; + } + else { + Proto *p = f->l.p; + if (!(1 <= n && n <= p->sizeupvalues)) return NULL; + *val = f->l.upvals[n-1]->v; + return getstr(p->upvalues[n-1]); + } +} + + +LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) { + const char *name; + TValue *val; + lua_lock(L); + name = aux_upvalue(index2adr(L, funcindex), n, &val); + if (name) { + setobj2s(L, L->top, val); + api_incr_top(L); + } + lua_unlock(L); + return name; +} + + +LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) { + const char *name; + TValue *val; + StkId fi; + lua_lock(L); + fi = index2adr(L, funcindex); + api_checknelems(L, 1); + name = aux_upvalue(fi, n, &val); + if (name) { + L->top--; + setobj(L, val, L->top); + luaC_barrier(L, clvalue(fi), L->top); + } + lua_unlock(L); + return name; +} + diff --git a/user/lua-5.1.4/src/lapi.h b/user/lua-5.1.4/src/lapi.h new file mode 100644 index 0000000..2c3fab2 --- /dev/null +++ b/user/lua-5.1.4/src/lapi.h @@ -0,0 +1,16 @@ +/* +** $Id: lapi.h,v 2.2.1.1 2007/12/27 13:02:25 roberto Exp $ +** Auxiliary functions from Lua API +** See Copyright Notice in lua.h +*/ + +#ifndef lapi_h +#define lapi_h + + +#include "lobject.h" + + +LUAI_FUNC void luaA_pushobject (lua_State *L, const TValue *o); + +#endif diff --git a/user/lua-5.1.4/src/lapi.o b/user/lua-5.1.4/src/lapi.o new file mode 100644 index 0000000000000000000000000000000000000000..c6f09a5d48613864a7135787b49c42aa884696af GIT binary patch literal 11956 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 +#include +#include +#include +#include +#include + + +/* This file uses only the official API of Lua. +** Any function declared here could be written as an application function. +*/ + +#define lauxlib_c +#define LUA_LIB + +#include "lua.h" + +#include "lauxlib.h" + + +#define FREELIST_REF 0 /* free list of references */ + + +/* convert a stack index to positive */ +#define abs_index(L, i) ((i) > 0 || (i) <= LUA_REGISTRYINDEX ? (i) : \ + lua_gettop(L) + (i) + 1) + + +/* +** {====================================================== +** Error-report functions +** ======================================================= +*/ + + +LUALIB_API int luaL_argerror (lua_State *L, int narg, const char *extramsg) { + lua_Debug ar; + if (!lua_getstack(L, 0, &ar)) /* no stack frame? */ + return luaL_error(L, "bad argument #%d (%s)", narg, extramsg); + lua_getinfo(L, "n", &ar); + if (strcmp(ar.namewhat, "method") == 0) { + narg--; /* do not count `self' */ + if (narg == 0) /* error is in the self argument itself? */ + return luaL_error(L, "calling " LUA_QS " on bad self (%s)", + ar.name, extramsg); + } + if (ar.name == NULL) + ar.name = "?"; + return luaL_error(L, "bad argument #%d to " LUA_QS " (%s)", + narg, ar.name, extramsg); +} + + +LUALIB_API int luaL_typerror (lua_State *L, int narg, const char *tname) { + const char *msg = lua_pushfstring(L, "%s expected, got %s", + tname, luaL_typename(L, narg)); + return luaL_argerror(L, narg, msg); +} + + +static void tag_error (lua_State *L, int narg, int tag) { + luaL_typerror(L, narg, lua_typename(L, tag)); +} + + +LUALIB_API void luaL_where (lua_State *L, int level) { + lua_Debug ar; + if (lua_getstack(L, level, &ar)) { /* check function at level */ + lua_getinfo(L, "Sl", &ar); /* get info about it */ + if (ar.currentline > 0) { /* is there info? */ + lua_pushfstring(L, "%s:%d: ", ar.short_src, ar.currentline); + return; + } + } + lua_pushliteral(L, ""); /* else, no information available... */ +} + + +LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) { + va_list argp; + va_start(argp, fmt); + luaL_where(L, 1); + lua_pushvfstring(L, fmt, argp); + va_end(argp); + lua_concat(L, 2); + return lua_error(L); +} + +/* }====================================================== */ + + +LUALIB_API int luaL_checkoption (lua_State *L, int narg, const char *def, + const char *const lst[]) { + const char *name = (def) ? luaL_optstring(L, narg, def) : + luaL_checkstring(L, narg); + int i; + for (i=0; lst[i]; i++) + if (strcmp(lst[i], name) == 0) + return i; + return luaL_argerror(L, narg, + lua_pushfstring(L, "invalid option " LUA_QS, name)); +} + + +LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) { + lua_getfield(L, LUA_REGISTRYINDEX, tname); /* get registry.name */ + if (!lua_isnil(L, -1)) /* name already in use? */ + return 0; /* leave previous value on top, but return 0 */ + lua_pop(L, 1); + lua_newtable(L); /* create metatable */ + lua_pushvalue(L, -1); + lua_setfield(L, LUA_REGISTRYINDEX, tname); /* registry.name = metatable */ + return 1; +} + + +LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) { + void *p = lua_touserdata(L, ud); + if (p != NULL) { /* value is a userdata? */ + if (lua_getmetatable(L, ud)) { /* does it have a metatable? */ + lua_getfield(L, LUA_REGISTRYINDEX, tname); /* get correct metatable */ + if (lua_rawequal(L, -1, -2)) { /* does it have the correct mt? */ + lua_pop(L, 2); /* remove both metatables */ + return p; + } + } + } + luaL_typerror(L, ud, tname); /* else error */ + return NULL; /* to avoid warnings */ +} + + +LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *mes) { + if (!lua_checkstack(L, space)) + luaL_error(L, "stack overflow (%s)", mes); +} + + +LUALIB_API void luaL_checktype (lua_State *L, int narg, int t) { + if (lua_type(L, narg) != t) + tag_error(L, narg, t); +} + + +LUALIB_API void luaL_checkany (lua_State *L, int narg) { + if (lua_type(L, narg) == LUA_TNONE) + luaL_argerror(L, narg, "value expected"); +} + + +LUALIB_API const char *luaL_checklstring (lua_State *L, int narg, size_t *len) { + const char *s = lua_tolstring(L, narg, len); + if (!s) tag_error(L, narg, LUA_TSTRING); + return s; +} + + +LUALIB_API const char *luaL_optlstring (lua_State *L, int narg, + const char *def, size_t *len) { + if (lua_isnoneornil(L, narg)) { + if (len) + *len = (def ? strlen(def) : 0); + return def; + } + else return luaL_checklstring(L, narg, len); +} + + +LUALIB_API lua_Number luaL_checknumber (lua_State *L, int narg) { + lua_Number d = lua_tonumber(L, narg); + if (d == 0 && !lua_isnumber(L, narg)) /* avoid extra test when d is not 0 */ + tag_error(L, narg, LUA_TNUMBER); + return d; +} + + +LUALIB_API lua_Number luaL_optnumber (lua_State *L, int narg, lua_Number def) { + return luaL_opt(L, luaL_checknumber, narg, def); +} + + +LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int narg) { + lua_Integer d = lua_tointeger(L, narg); + if (d == 0 && !lua_isnumber(L, narg)) /* avoid extra test when d is not 0 */ + tag_error(L, narg, LUA_TNUMBER); + return d; +} + + +LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int narg, + lua_Integer def) { + return luaL_opt(L, luaL_checkinteger, narg, def); +} + + +LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) { + if (!lua_getmetatable(L, obj)) /* no metatable? */ + return 0; + lua_pushstring(L, event); + lua_rawget(L, -2); + if (lua_isnil(L, -1)) { + lua_pop(L, 2); /* remove metatable and metafield */ + return 0; + } + else { + lua_remove(L, -2); /* remove only metatable */ + return 1; + } +} + + +LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) { + obj = abs_index(L, obj); + if (!luaL_getmetafield(L, obj, event)) /* no metafield? */ + return 0; + lua_pushvalue(L, obj); + lua_call(L, 1, 1); + return 1; +} + + +LUALIB_API void (luaL_register) (lua_State *L, const char *libname, + const luaL_Reg *l) { + luaI_openlib(L, libname, l, 0); +} + + +static int libsize (const luaL_Reg *l) { + int size = 0; + for (; l->name; l++) size++; + return size; +} + + +LUALIB_API void luaI_openlib (lua_State *L, const char *libname, + const luaL_Reg *l, int nup) { + if (libname) { + int size = libsize(l); + /* check whether lib already exists */ + luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1); + lua_getfield(L, -1, libname); /* get _LOADED[libname] */ + if (!lua_istable(L, -1)) { /* not found? */ + lua_pop(L, 1); /* remove previous result */ + /* try global variable (and create one if it does not exist) */ + if (luaL_findtable(L, LUA_GLOBALSINDEX, libname, size) != NULL) + luaL_error(L, "name conflict for module " LUA_QS, libname); + lua_pushvalue(L, -1); + lua_setfield(L, -3, libname); /* _LOADED[libname] = new table */ + } + lua_remove(L, -2); /* remove _LOADED table */ + lua_insert(L, -(nup+1)); /* move library table to below upvalues */ + } + for (; l->name; l++) { + int i; + for (i=0; ifunc, nup); + lua_setfield(L, -(nup+2), l->name); + } + lua_pop(L, nup); /* remove upvalues */ +} + + + +/* +** {====================================================== +** getn-setn: size for arrays +** ======================================================= +*/ + +#if defined(LUA_COMPAT_GETN) + +static int checkint (lua_State *L, int topop) { + int n = (lua_type(L, -1) == LUA_TNUMBER) ? lua_tointeger(L, -1) : -1; + lua_pop(L, topop); + return n; +} + + +static void getsizes (lua_State *L) { + lua_getfield(L, LUA_REGISTRYINDEX, "LUA_SIZES"); + if (lua_isnil(L, -1)) { /* no `size' table? */ + lua_pop(L, 1); /* remove nil */ + lua_newtable(L); /* create it */ + lua_pushvalue(L, -1); /* `size' will be its own metatable */ + lua_setmetatable(L, -2); + lua_pushliteral(L, "kv"); + lua_setfield(L, -2, "__mode"); /* metatable(N).__mode = "kv" */ + lua_pushvalue(L, -1); + lua_setfield(L, LUA_REGISTRYINDEX, "LUA_SIZES"); /* store in register */ + } +} + + +LUALIB_API void luaL_setn (lua_State *L, int t, int n) { + t = abs_index(L, t); + lua_pushliteral(L, "n"); + lua_rawget(L, t); + if (checkint(L, 1) >= 0) { /* is there a numeric field `n'? */ + lua_pushliteral(L, "n"); /* use it */ + lua_pushinteger(L, n); + lua_rawset(L, t); + } + else { /* use `sizes' */ + getsizes(L); + lua_pushvalue(L, t); + lua_pushinteger(L, n); + lua_rawset(L, -3); /* sizes[t] = n */ + lua_pop(L, 1); /* remove `sizes' */ + } +} + + +LUALIB_API int luaL_getn (lua_State *L, int t) { + int n; + t = abs_index(L, t); + lua_pushliteral(L, "n"); /* try t.n */ + lua_rawget(L, t); + if ((n = checkint(L, 1)) >= 0) return n; + getsizes(L); /* else try sizes[t] */ + lua_pushvalue(L, t); + lua_rawget(L, -2); + if ((n = checkint(L, 2)) >= 0) return n; + return (int)lua_objlen(L, t); +} + +#endif + +/* }====================================================== */ + + + +LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const char *p, + const char *r) { + const char *wild; + size_t l = strlen(p); + luaL_Buffer b; + luaL_buffinit(L, &b); + while ((wild = strstr(s, p)) != NULL) { + luaL_addlstring(&b, s, wild - s); /* push prefix */ + luaL_addstring(&b, r); /* push replacement in place of pattern */ + s = wild + l; /* continue after `p' */ + } + luaL_addstring(&b, s); /* push last suffix */ + luaL_pushresult(&b); + return lua_tostring(L, -1); +} + + +LUALIB_API const char *luaL_findtable (lua_State *L, int idx, + const char *fname, int szhint) { + const char *e; + lua_pushvalue(L, idx); + do { + e = strchr(fname, '.'); + if (e == NULL) e = fname + strlen(fname); + lua_pushlstring(L, fname, e - fname); + lua_rawget(L, -2); + if (lua_isnil(L, -1)) { /* no such field? */ + lua_pop(L, 1); /* remove this nil */ + lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */ + lua_pushlstring(L, fname, e - fname); + lua_pushvalue(L, -2); + lua_settable(L, -4); /* set new table into field */ + } + else if (!lua_istable(L, -1)) { /* field has a non-table value? */ + lua_pop(L, 2); /* remove table and value */ + return fname; /* return problematic part of the name */ + } + lua_remove(L, -2); /* remove previous table */ + fname = e + 1; + } while (*e == '.'); + return NULL; +} + + + +/* +** {====================================================== +** Generic Buffer manipulation +** ======================================================= +*/ + + +#define bufflen(B) ((B)->p - (B)->buffer) +#define bufffree(B) ((size_t)(LUAL_BUFFERSIZE - bufflen(B))) + +#define LIMIT (LUA_MINSTACK/2) + + +static int emptybuffer (luaL_Buffer *B) { + size_t l = bufflen(B); + if (l == 0) return 0; /* put nothing on stack */ + else { + lua_pushlstring(B->L, B->buffer, l); + B->p = B->buffer; + B->lvl++; + return 1; + } +} + + +static void adjuststack (luaL_Buffer *B) { + if (B->lvl > 1) { + lua_State *L = B->L; + int toget = 1; /* number of levels to concat */ + size_t toplen = lua_strlen(L, -1); + do { + size_t l = lua_strlen(L, -(toget+1)); + if (B->lvl - toget + 1 >= LIMIT || toplen > l) { + toplen += l; + toget++; + } + else break; + } while (toget < B->lvl); + lua_concat(L, toget); + B->lvl = B->lvl - toget + 1; + } +} + + +LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B) { + if (emptybuffer(B)) + adjuststack(B); + return B->buffer; +} + + +LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) { + while (l--) + luaL_addchar(B, *s++); +} + + +LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) { + luaL_addlstring(B, s, strlen(s)); +} + + +LUALIB_API void luaL_pushresult (luaL_Buffer *B) { + emptybuffer(B); + lua_concat(B->L, B->lvl); + B->lvl = 1; +} + + +LUALIB_API void luaL_addvalue (luaL_Buffer *B) { + lua_State *L = B->L; + size_t vl; + const char *s = lua_tolstring(L, -1, &vl); + if (vl <= bufffree(B)) { /* fit into buffer? */ + memcpy(B->p, s, vl); /* put it there */ + B->p += vl; + lua_pop(L, 1); /* remove from stack */ + } + else { + if (emptybuffer(B)) + lua_insert(L, -2); /* put buffer before new value */ + B->lvl++; /* add new value into B stack */ + adjuststack(B); + } +} + + +LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) { + B->L = L; + B->p = B->buffer; + B->lvl = 0; +} + +/* }====================================================== */ + + +LUALIB_API int luaL_ref (lua_State *L, int t) { + int ref; + t = abs_index(L, t); + if (lua_isnil(L, -1)) { + lua_pop(L, 1); /* remove from stack */ + return LUA_REFNIL; /* `nil' has a unique fixed reference */ + } + lua_rawgeti(L, t, FREELIST_REF); /* get first free element */ + ref = (int)lua_tointeger(L, -1); /* ref = t[FREELIST_REF] */ + lua_pop(L, 1); /* remove it from stack */ + if (ref != 0) { /* any free element? */ + lua_rawgeti(L, t, ref); /* remove it from list */ + lua_rawseti(L, t, FREELIST_REF); /* (t[FREELIST_REF] = t[ref]) */ + } + else { /* no free elements */ + ref = (int)lua_objlen(L, t); + ref++; /* create new reference */ + } + lua_rawseti(L, t, ref); + return ref; +} + + +LUALIB_API void luaL_unref (lua_State *L, int t, int ref) { + if (ref >= 0) { + t = abs_index(L, t); + lua_rawgeti(L, t, FREELIST_REF); + lua_rawseti(L, t, ref); /* t[ref] = t[FREELIST_REF] */ + lua_pushinteger(L, ref); + lua_rawseti(L, t, FREELIST_REF); /* t[FREELIST_REF] = ref */ + } +} + + + +/* +** {====================================================== +** Load functions +** ======================================================= +*/ + +typedef struct LoadF { + int extraline; + FILE *f; + char buff[LUAL_BUFFERSIZE]; +} LoadF; + + +static const char *getF (lua_State *L, void *ud, size_t *size) { + LoadF *lf = (LoadF *)ud; + (void)L; + if (lf->extraline) { + lf->extraline = 0; + *size = 1; + return "\n"; + } + if (feof(lf->f)) return NULL; + *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f); + return (*size > 0) ? lf->buff : NULL; +} + + +static int errfile (lua_State *L, const char *what, int fnameindex) { + const char *serr = strerror(errno); + const char *filename = lua_tostring(L, fnameindex) + 1; + lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr); + lua_remove(L, fnameindex); + return LUA_ERRFILE; +} + + +LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) { + LoadF lf; + int status, readstatus; + int c; + int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */ + lf.extraline = 0; + if (filename == NULL) { + lua_pushliteral(L, "=stdin"); + lf.f = stdin; + } + else { + lua_pushfstring(L, "@%s", filename); + lf.f = fopen(filename, "r"); + if (lf.f == NULL) return errfile(L, "open", fnameindex); + } + c = getc(lf.f); + if (c == '#') { /* Unix exec. file? */ + lf.extraline = 1; + while ((c = getc(lf.f)) != EOF && c != '\n') ; /* skip first line */ + if (c == '\n') c = getc(lf.f); + } + if (c == LUA_SIGNATURE[0] && filename) { /* binary file? */ + lf.f = freopen(filename, "rb", lf.f); /* reopen in binary mode */ + if (lf.f == NULL) return errfile(L, "reopen", fnameindex); + /* skip eventual `#!...' */ + while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ; + lf.extraline = 0; + } + ungetc(c, lf.f); + status = lua_load(L, getF, &lf, lua_tostring(L, -1)); + readstatus = ferror(lf.f); + if (filename) fclose(lf.f); /* close file (even in case of errors) */ + if (readstatus) { + lua_settop(L, fnameindex); /* ignore results from `lua_load' */ + return errfile(L, "read", fnameindex); + } + lua_remove(L, fnameindex); + return status; +} + + +typedef struct LoadS { + const char *s; + size_t size; +} LoadS; + + +static const char *getS (lua_State *L, void *ud, size_t *size) { + LoadS *ls = (LoadS *)ud; + (void)L; + if (ls->size == 0) return NULL; + *size = ls->size; + ls->size = 0; + return ls->s; +} + + +LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t size, + const char *name) { + LoadS ls; + ls.s = buff; + ls.size = size; + return lua_load(L, getS, &ls, name); +} + + +LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s) { + return luaL_loadbuffer(L, s, strlen(s), s); +} + + + +/* }====================================================== */ + + +static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) { + (void)ud; + (void)osize; + if (nsize == 0) { + free(ptr); + return NULL; + } + else + return realloc(ptr, nsize); +} + + +static int panic (lua_State *L) { + (void)L; /* to avoid warnings */ + fprintf(stderr, "PANIC: unprotected error in call to Lua API (%s)\n", + lua_tostring(L, -1)); + return 0; +} + + +LUALIB_API lua_State *luaL_newstate (void) { + lua_State *L = lua_newstate(l_alloc, NULL); + if (L) lua_atpanic(L, &panic); + return L; +} + diff --git a/user/lua-5.1.4/src/lauxlib.h b/user/lua-5.1.4/src/lauxlib.h new file mode 100644 index 0000000..3425823 --- /dev/null +++ b/user/lua-5.1.4/src/lauxlib.h @@ -0,0 +1,174 @@ +/* +** $Id: lauxlib.h,v 1.88.1.1 2007/12/27 13:02:25 roberto Exp $ +** Auxiliary functions for building Lua libraries +** See Copyright Notice in lua.h +*/ + + +#ifndef lauxlib_h +#define lauxlib_h + + +#include +#include + +#include "lua.h" + + +#if defined(LUA_COMPAT_GETN) +LUALIB_API int (luaL_getn) (lua_State *L, int t); +LUALIB_API void (luaL_setn) (lua_State *L, int t, int n); +#else +#define luaL_getn(L,i) ((int)lua_objlen(L, i)) +#define luaL_setn(L,i,j) ((void)0) /* no op! */ +#endif + +#if defined(LUA_COMPAT_OPENLIB) +#define luaI_openlib luaL_openlib +#endif + + +/* extra error code for `luaL_load' */ +#define LUA_ERRFILE (LUA_ERRERR+1) + + +typedef struct luaL_Reg { + const char *name; + lua_CFunction func; +} luaL_Reg; + + + +LUALIB_API void (luaI_openlib) (lua_State *L, const char *libname, + const luaL_Reg *l, int nup); +LUALIB_API void (luaL_register) (lua_State *L, const char *libname, + const luaL_Reg *l); +LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e); +LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e); +LUALIB_API int (luaL_typerror) (lua_State *L, int narg, const char *tname); +LUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg); +LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg, + size_t *l); +LUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg, + const char *def, size_t *l); +LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg); +LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def); + +LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg); +LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg, + lua_Integer def); + +LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg); +LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t); +LUALIB_API void (luaL_checkany) (lua_State *L, int narg); + +LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname); +LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname); + +LUALIB_API void (luaL_where) (lua_State *L, int lvl); +LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...); + +LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def, + const char *const lst[]); + +LUALIB_API int (luaL_ref) (lua_State *L, int t); +LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref); + +LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename); +LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz, + const char *name); +LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s); + +LUALIB_API lua_State *(luaL_newstate) (void); + + +LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p, + const char *r); + +LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx, + const char *fname, int szhint); + + + + +/* +** =============================================================== +** some useful macros +** =============================================================== +*/ + +#define luaL_argcheck(L, cond,numarg,extramsg) \ + ((void)((cond) || luaL_argerror(L, (numarg), (extramsg)))) +#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL)) +#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL)) +#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n))) +#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d))) +#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n))) +#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d))) + +#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i))) + +#define luaL_dofile(L, fn) \ + (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0)) + +#define luaL_dostring(L, s) \ + (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0)) + +#define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n))) + +#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n))) + +/* +** {====================================================== +** Generic Buffer manipulation +** ======================================================= +*/ + + + +typedef struct luaL_Buffer { + char *p; /* current position in buffer */ + int lvl; /* number of strings in the stack (level) */ + lua_State *L; + char buffer[LUAL_BUFFERSIZE]; +} luaL_Buffer; + +#define luaL_addchar(B,c) \ + ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \ + (*(B)->p++ = (char)(c))) + +/* compatibility only */ +#define luaL_putchar(B,c) luaL_addchar(B,c) + +#define luaL_addsize(B,n) ((B)->p += (n)) + +LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B); +LUALIB_API char *(luaL_prepbuffer) (luaL_Buffer *B); +LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l); +LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s); +LUALIB_API void (luaL_addvalue) (luaL_Buffer *B); +LUALIB_API void (luaL_pushresult) (luaL_Buffer *B); + + +/* }====================================================== */ + + +/* compatibility with ref system */ + +/* pre-defined references */ +#define LUA_NOREF (-2) +#define LUA_REFNIL (-1) + +#define lua_ref(L,lock) ((lock) ? luaL_ref(L, LUA_REGISTRYINDEX) : \ + (lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0)) + +#define lua_unref(L,ref) luaL_unref(L, LUA_REGISTRYINDEX, (ref)) + +#define lua_getref(L,ref) lua_rawgeti(L, LUA_REGISTRYINDEX, (ref)) + + +#define luaL_reg luaL_Reg + +#endif + + diff --git a/user/lua-5.1.4/src/lauxlib.o b/user/lua-5.1.4/src/lauxlib.o new file mode 100644 index 0000000000000000000000000000000000000000..df12805b405ab11e699d2291ab08b8d651ec37ce GIT binary patch literal 11400 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 literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/lbaselib.c b/user/lua-5.1.4/src/lbaselib.c new file mode 100644 index 0000000..2a4c079 --- /dev/null +++ b/user/lua-5.1.4/src/lbaselib.c @@ -0,0 +1,653 @@ +/* +** $Id: lbaselib.c,v 1.191.1.6 2008/02/14 16:46:22 roberto Exp $ +** Basic library +** See Copyright Notice in lua.h +*/ + + + +#include +#include +#include +#include + +#define lbaselib_c +#define LUA_LIB + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + + + +/* +** If your system does not support `stdout', you can just remove this function. +** If you need, you can define your own `print' function, following this +** model but changing `fputs' to put the strings at a proper place +** (a console window or a log file, for instance). +*/ +static int luaB_print (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + int i; + lua_getglobal(L, "tostring"); + for (i=1; i<=n; i++) { + const char *s; + lua_pushvalue(L, -1); /* function to be called */ + lua_pushvalue(L, i); /* value to print */ + lua_call(L, 1, 1); + s = lua_tostring(L, -1); /* get result */ + if (s == NULL) + return luaL_error(L, LUA_QL("tostring") " must return a string to " + LUA_QL("print")); + if (i>1) fputs("\t", stdout); + fputs(s, stdout); + lua_pop(L, 1); /* pop result */ + } + fputs("\n", stdout); + return 0; +} + + +static int luaB_tonumber (lua_State *L) { + int base = luaL_optint(L, 2, 10); + if (base == 10) { /* standard conversion */ + luaL_checkany(L, 1); + if (lua_isnumber(L, 1)) { + lua_pushnumber(L, lua_tonumber(L, 1)); + return 1; + } + } + else { + const char *s1 = luaL_checkstring(L, 1); + char *s2; + unsigned long n; + luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range"); + n = strtoul(s1, &s2, base); + if (s1 != s2) { /* at least one valid digit? */ + while (isspace((unsigned char)(*s2))) s2++; /* skip trailing spaces */ + if (*s2 == '\0') { /* no invalid trailing characters? */ + lua_pushnumber(L, (lua_Number)n); + return 1; + } + } + } + lua_pushnil(L); /* else not a number */ + return 1; +} + + +static int luaB_error (lua_State *L) { + int level = luaL_optint(L, 2, 1); + lua_settop(L, 1); + if (lua_isstring(L, 1) && level > 0) { /* add extra information? */ + luaL_where(L, level); + lua_pushvalue(L, 1); + lua_concat(L, 2); + } + return lua_error(L); +} + + +static int luaB_getmetatable (lua_State *L) { + luaL_checkany(L, 1); + if (!lua_getmetatable(L, 1)) { + lua_pushnil(L); + return 1; /* no metatable */ + } + luaL_getmetafield(L, 1, "__metatable"); + return 1; /* returns either __metatable field (if present) or metatable */ +} + + +static int luaB_setmetatable (lua_State *L) { + int t = lua_type(L, 2); + luaL_checktype(L, 1, LUA_TTABLE); + luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2, + "nil or table expected"); + if (luaL_getmetafield(L, 1, "__metatable")) + luaL_error(L, "cannot change a protected metatable"); + lua_settop(L, 2); + lua_setmetatable(L, 1); + return 1; +} + + +static void getfunc (lua_State *L, int opt) { + if (lua_isfunction(L, 1)) lua_pushvalue(L, 1); + else { + lua_Debug ar; + int level = opt ? luaL_optint(L, 1, 1) : luaL_checkint(L, 1); + luaL_argcheck(L, level >= 0, 1, "level must be non-negative"); + if (lua_getstack(L, level, &ar) == 0) + luaL_argerror(L, 1, "invalid level"); + lua_getinfo(L, "f", &ar); + if (lua_isnil(L, -1)) + luaL_error(L, "no function environment for tail call at level %d", + level); + } +} + + +static int luaB_getfenv (lua_State *L) { + getfunc(L, 1); + if (lua_iscfunction(L, -1)) /* is a C function? */ + lua_pushvalue(L, LUA_GLOBALSINDEX); /* return the thread's global env. */ + else + lua_getfenv(L, -1); + return 1; +} + + +static int luaB_setfenv (lua_State *L) { + luaL_checktype(L, 2, LUA_TTABLE); + getfunc(L, 0); + lua_pushvalue(L, 2); + if (lua_isnumber(L, 1) && lua_tonumber(L, 1) == 0) { + /* change environment of current thread */ + lua_pushthread(L); + lua_insert(L, -2); + lua_setfenv(L, -2); + return 0; + } + else if (lua_iscfunction(L, -2) || lua_setfenv(L, -2) == 0) + luaL_error(L, + LUA_QL("setfenv") " cannot change environment of given object"); + return 1; +} + + +static int luaB_rawequal (lua_State *L) { + luaL_checkany(L, 1); + luaL_checkany(L, 2); + lua_pushboolean(L, lua_rawequal(L, 1, 2)); + return 1; +} + + +static int luaB_rawget (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + luaL_checkany(L, 2); + lua_settop(L, 2); + lua_rawget(L, 1); + return 1; +} + +static int luaB_rawset (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + luaL_checkany(L, 2); + luaL_checkany(L, 3); + lua_settop(L, 3); + lua_rawset(L, 1); + return 1; +} + + +static int luaB_gcinfo (lua_State *L) { + lua_pushinteger(L, lua_getgccount(L)); + return 1; +} + + +static int luaB_collectgarbage (lua_State *L) { + static const char *const opts[] = {"stop", "restart", "collect", + "count", "step", "setpause", "setstepmul", NULL}; + static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT, + LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL}; + int o = luaL_checkoption(L, 1, "collect", opts); + int ex = luaL_optint(L, 2, 0); + int res = lua_gc(L, optsnum[o], ex); + switch (optsnum[o]) { + case LUA_GCCOUNT: { + int b = lua_gc(L, LUA_GCCOUNTB, 0); + lua_pushnumber(L, res + ((lua_Number)b/1024)); + return 1; + } + case LUA_GCSTEP: { + lua_pushboolean(L, res); + return 1; + } + default: { + lua_pushnumber(L, res); + return 1; + } + } +} + + +static int luaB_type (lua_State *L) { + luaL_checkany(L, 1); + lua_pushstring(L, luaL_typename(L, 1)); + return 1; +} + + +static int luaB_next (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + lua_settop(L, 2); /* create a 2nd argument if there isn't one */ + if (lua_next(L, 1)) + return 2; + else { + lua_pushnil(L); + return 1; + } +} + + +static int luaB_pairs (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + lua_pushvalue(L, lua_upvalueindex(1)); /* return generator, */ + lua_pushvalue(L, 1); /* state, */ + lua_pushnil(L); /* and initial value */ + return 3; +} + + +static int ipairsaux (lua_State *L) { + int i = luaL_checkint(L, 2); + luaL_checktype(L, 1, LUA_TTABLE); + i++; /* next value */ + lua_pushinteger(L, i); + lua_rawgeti(L, 1, i); + return (lua_isnil(L, -1)) ? 0 : 2; +} + + +static int luaB_ipairs (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + lua_pushvalue(L, lua_upvalueindex(1)); /* return generator, */ + lua_pushvalue(L, 1); /* state, */ + lua_pushinteger(L, 0); /* and initial value */ + return 3; +} + + +static int load_aux (lua_State *L, int status) { + if (status == 0) /* OK? */ + return 1; + else { + lua_pushnil(L); + lua_insert(L, -2); /* put before error message */ + return 2; /* return nil plus error message */ + } +} + + +static int luaB_loadstring (lua_State *L) { + size_t l; + const char *s = luaL_checklstring(L, 1, &l); + const char *chunkname = luaL_optstring(L, 2, s); + return load_aux(L, luaL_loadbuffer(L, s, l, chunkname)); +} + + +static int luaB_loadfile (lua_State *L) { + const char *fname = luaL_optstring(L, 1, NULL); + return load_aux(L, luaL_loadfile(L, fname)); +} + + +/* +** Reader for generic `load' function: `lua_load' uses the +** stack for internal stuff, so the reader cannot change the +** stack top. Instead, it keeps its resulting string in a +** reserved slot inside the stack. +*/ +static const char *generic_reader (lua_State *L, void *ud, size_t *size) { + (void)ud; /* to avoid warnings */ + luaL_checkstack(L, 2, "too many nested functions"); + lua_pushvalue(L, 1); /* get function */ + lua_call(L, 0, 1); /* call it */ + if (lua_isnil(L, -1)) { + *size = 0; + return NULL; + } + else if (lua_isstring(L, -1)) { + lua_replace(L, 3); /* save string in a reserved stack slot */ + return lua_tolstring(L, 3, size); + } + else luaL_error(L, "reader function must return a string"); + return NULL; /* to avoid warnings */ +} + + +static int luaB_load (lua_State *L) { + int status; + const char *cname = luaL_optstring(L, 2, "=(load)"); + luaL_checktype(L, 1, LUA_TFUNCTION); + lua_settop(L, 3); /* function, eventual name, plus one reserved slot */ + status = lua_load(L, generic_reader, NULL, cname); + return load_aux(L, status); +} + + +static int luaB_dofile (lua_State *L) { + const char *fname = luaL_optstring(L, 1, NULL); + int n = lua_gettop(L); + if (luaL_loadfile(L, fname) != 0) lua_error(L); + lua_call(L, 0, LUA_MULTRET); + return lua_gettop(L) - n; +} + + +static int luaB_assert (lua_State *L) { + luaL_checkany(L, 1); + if (!lua_toboolean(L, 1)) + return luaL_error(L, "%s", luaL_optstring(L, 2, "assertion failed!")); + return lua_gettop(L); +} + + +static int luaB_unpack (lua_State *L) { + int i, e, n; + luaL_checktype(L, 1, LUA_TTABLE); + i = luaL_optint(L, 2, 1); + e = luaL_opt(L, luaL_checkint, 3, luaL_getn(L, 1)); + if (i > e) return 0; /* empty range */ + n = e - i + 1; /* number of elements */ + if (n <= 0 || !lua_checkstack(L, n)) /* n <= 0 means arith. overflow */ + return luaL_error(L, "too many results to unpack"); + lua_rawgeti(L, 1, i); /* push arg[i] (avoiding overflow problems) */ + while (i++ < e) /* push arg[i + 1...e] */ + lua_rawgeti(L, 1, i); + return n; +} + + +static int luaB_select (lua_State *L) { + int n = lua_gettop(L); + if (lua_type(L, 1) == LUA_TSTRING && *lua_tostring(L, 1) == '#') { + lua_pushinteger(L, n-1); + return 1; + } + else { + int i = luaL_checkint(L, 1); + if (i < 0) i = n + i; + else if (i > n) i = n; + luaL_argcheck(L, 1 <= i, 1, "index out of range"); + return n - i; + } +} + + +static int luaB_pcall (lua_State *L) { + int status; + luaL_checkany(L, 1); + status = lua_pcall(L, lua_gettop(L) - 1, LUA_MULTRET, 0); + lua_pushboolean(L, (status == 0)); + lua_insert(L, 1); + return lua_gettop(L); /* return status + all results */ +} + + +static int luaB_xpcall (lua_State *L) { + int status; + luaL_checkany(L, 2); + lua_settop(L, 2); + lua_insert(L, 1); /* put error function under function to be called */ + status = lua_pcall(L, 0, LUA_MULTRET, 1); + lua_pushboolean(L, (status == 0)); + lua_replace(L, 1); + return lua_gettop(L); /* return status + all results */ +} + + +static int luaB_tostring (lua_State *L) { + luaL_checkany(L, 1); + if (luaL_callmeta(L, 1, "__tostring")) /* is there a metafield? */ + return 1; /* use its value */ + switch (lua_type(L, 1)) { + case LUA_TNUMBER: + lua_pushstring(L, lua_tostring(L, 1)); + break; + case LUA_TSTRING: + lua_pushvalue(L, 1); + break; + case LUA_TBOOLEAN: + lua_pushstring(L, (lua_toboolean(L, 1) ? "true" : "false")); + break; + case LUA_TNIL: + lua_pushliteral(L, "nil"); + break; + default: + lua_pushfstring(L, "%s: %p", luaL_typename(L, 1), lua_topointer(L, 1)); + break; + } + return 1; +} + + +static int luaB_newproxy (lua_State *L) { + lua_settop(L, 1); + lua_newuserdata(L, 0); /* create proxy */ + if (lua_toboolean(L, 1) == 0) + return 1; /* no metatable */ + else if (lua_isboolean(L, 1)) { + lua_newtable(L); /* create a new metatable `m' ... */ + lua_pushvalue(L, -1); /* ... and mark `m' as a valid metatable */ + lua_pushboolean(L, 1); + lua_rawset(L, lua_upvalueindex(1)); /* weaktable[m] = true */ + } + else { + int validproxy = 0; /* to check if weaktable[metatable(u)] == true */ + if (lua_getmetatable(L, 1)) { + lua_rawget(L, lua_upvalueindex(1)); + validproxy = lua_toboolean(L, -1); + lua_pop(L, 1); /* remove value */ + } + luaL_argcheck(L, validproxy, 1, "boolean or proxy expected"); + lua_getmetatable(L, 1); /* metatable is valid; get it */ + } + lua_setmetatable(L, 2); + return 1; +} + + +static const luaL_Reg base_funcs[] = { + {"assert", luaB_assert}, + {"collectgarbage", luaB_collectgarbage}, + {"dofile", luaB_dofile}, + {"error", luaB_error}, + {"gcinfo", luaB_gcinfo}, + {"getfenv", luaB_getfenv}, + {"getmetatable", luaB_getmetatable}, + {"loadfile", luaB_loadfile}, + {"load", luaB_load}, + {"loadstring", luaB_loadstring}, + {"next", luaB_next}, + {"pcall", luaB_pcall}, + {"print", luaB_print}, + {"rawequal", luaB_rawequal}, + {"rawget", luaB_rawget}, + {"rawset", luaB_rawset}, + {"select", luaB_select}, + {"setfenv", luaB_setfenv}, + {"setmetatable", luaB_setmetatable}, + {"tonumber", luaB_tonumber}, + {"tostring", luaB_tostring}, + {"type", luaB_type}, + {"unpack", luaB_unpack}, + {"xpcall", luaB_xpcall}, + {NULL, NULL} +}; + + +/* +** {====================================================== +** Coroutine library +** ======================================================= +*/ + +#define CO_RUN 0 /* running */ +#define CO_SUS 1 /* suspended */ +#define CO_NOR 2 /* 'normal' (it resumed another coroutine) */ +#define CO_DEAD 3 + +static const char *const statnames[] = + {"running", "suspended", "normal", "dead"}; + +static int costatus (lua_State *L, lua_State *co) { + if (L == co) return CO_RUN; + switch (lua_status(co)) { + case LUA_YIELD: + return CO_SUS; + case 0: { + lua_Debug ar; + if (lua_getstack(co, 0, &ar) > 0) /* does it have frames? */ + return CO_NOR; /* it is running */ + else if (lua_gettop(co) == 0) + return CO_DEAD; + else + return CO_SUS; /* initial state */ + } + default: /* some error occured */ + return CO_DEAD; + } +} + + +static int luaB_costatus (lua_State *L) { + lua_State *co = lua_tothread(L, 1); + luaL_argcheck(L, co, 1, "coroutine expected"); + lua_pushstring(L, statnames[costatus(L, co)]); + return 1; +} + + +static int auxresume (lua_State *L, lua_State *co, int narg) { + int status = costatus(L, co); + if (!lua_checkstack(co, narg)) + luaL_error(L, "too many arguments to resume"); + if (status != CO_SUS) { + lua_pushfstring(L, "cannot resume %s coroutine", statnames[status]); + return -1; /* error flag */ + } + lua_xmove(L, co, narg); + lua_setlevel(L, co); + status = lua_resume(co, narg); + if (status == 0 || status == LUA_YIELD) { + int nres = lua_gettop(co); + if (!lua_checkstack(L, nres + 1)) + luaL_error(L, "too many results to resume"); + lua_xmove(co, L, nres); /* move yielded values */ + return nres; + } + else { + lua_xmove(co, L, 1); /* move error message */ + return -1; /* error flag */ + } +} + + +static int luaB_coresume (lua_State *L) { + lua_State *co = lua_tothread(L, 1); + int r; + luaL_argcheck(L, co, 1, "coroutine expected"); + r = auxresume(L, co, lua_gettop(L) - 1); + if (r < 0) { + lua_pushboolean(L, 0); + lua_insert(L, -2); + return 2; /* return false + error message */ + } + else { + lua_pushboolean(L, 1); + lua_insert(L, -(r + 1)); + return r + 1; /* return true + `resume' returns */ + } +} + + +static int luaB_auxwrap (lua_State *L) { + lua_State *co = lua_tothread(L, lua_upvalueindex(1)); + int r = auxresume(L, co, lua_gettop(L)); + if (r < 0) { + if (lua_isstring(L, -1)) { /* error object is a string? */ + luaL_where(L, 1); /* add extra info */ + lua_insert(L, -2); + lua_concat(L, 2); + } + lua_error(L); /* propagate error */ + } + return r; +} + + +static int luaB_cocreate (lua_State *L) { + lua_State *NL = lua_newthread(L); + luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1, + "Lua function expected"); + lua_pushvalue(L, 1); /* move function to top */ + lua_xmove(L, NL, 1); /* move function from L to NL */ + return 1; +} + + +static int luaB_cowrap (lua_State *L) { + luaB_cocreate(L); + lua_pushcclosure(L, luaB_auxwrap, 1); + return 1; +} + + +static int luaB_yield (lua_State *L) { + return lua_yield(L, lua_gettop(L)); +} + + +static int luaB_corunning (lua_State *L) { + if (lua_pushthread(L)) + lua_pushnil(L); /* main thread is not a coroutine */ + return 1; +} + + +static const luaL_Reg co_funcs[] = { + {"create", luaB_cocreate}, + {"resume", luaB_coresume}, + {"running", luaB_corunning}, + {"status", luaB_costatus}, + {"wrap", luaB_cowrap}, + {"yield", luaB_yield}, + {NULL, NULL} +}; + +/* }====================================================== */ + + +static void auxopen (lua_State *L, const char *name, + lua_CFunction f, lua_CFunction u) { + lua_pushcfunction(L, u); + lua_pushcclosure(L, f, 1); + lua_setfield(L, -2, name); +} + + +static void base_open (lua_State *L) { + /* set global _G */ + lua_pushvalue(L, LUA_GLOBALSINDEX); + lua_setglobal(L, "_G"); + /* open lib into global table */ + luaL_register(L, "_G", base_funcs); + lua_pushliteral(L, LUA_VERSION); + lua_setglobal(L, "_VERSION"); /* set global _VERSION */ + /* `ipairs' and `pairs' need auxliliary functions as upvalues */ + auxopen(L, "ipairs", luaB_ipairs, ipairsaux); + auxopen(L, "pairs", luaB_pairs, luaB_next); + /* `newproxy' needs a weaktable as upvalue */ + lua_createtable(L, 0, 1); /* new table `w' */ + lua_pushvalue(L, -1); /* `w' will be its own metatable */ + lua_setmetatable(L, -2); + lua_pushliteral(L, "kv"); + lua_setfield(L, -2, "__mode"); /* metatable(w).__mode = "kv" */ + lua_pushcclosure(L, luaB_newproxy, 1); + lua_setglobal(L, "newproxy"); /* set global `newproxy' */ +} + + +LUALIB_API int luaopen_base (lua_State *L) { + base_open(L); + luaL_register(L, LUA_COLIBNAME, co_funcs); + return 2; +} + diff --git a/user/lua-5.1.4/src/lbaselib.o b/user/lua-5.1.4/src/lbaselib.o new file mode 100644 index 0000000000000000000000000000000000000000..178f9baecd5f8fea1bb88c551ece7019cde1d2d3 GIT binary patch literal 15840 zcmbVT3wV^(nLfF|W-XFv6>q3h8!jqlL8Bs4#Y;djB3=M*FqusLgvexOnE3~SXFv=|x3F%6p1biOMsj#(&S`RBITo%GC(3sKzWSD`4AR!M zYLk}$na^&dVf{~ccDQ4eRwPRY5?;xmkqL$|BCdFwJ zasxLl2*buDiiS<51Zk@OE#pn!U`g*=0L4+heNOMM@ixf(6HUGL(g(BzxJk?JUuWc& z(H**QF3@`aYU!>Q$03{k$?iTjH-CUVoY_yYpX|_`tYy(n-RA9!+{?KgyPiBSIM~*e z>uw#H+tZF(nfiq>q+gGmee31-Z}bAe*B9|v z32kjj&}x%A9x5*TT8nEhZ4)f1=@Zo3>C~!5zemAl~GtLsEb2ANVff@%k{-j zg9Gkh{k?WQrNAYYvIE22S(MmV*aJpw+YA%DEY9xpwbOk`WAyA3XhfGl{H^PMzOl2g z|2T+@rCJs%^+1lu%=cx1J=xvkbMyD+Hn-Pcgbd`~&8^s<`z?(@ZEBVGp_v*AG{w+k zw6G=Lx9#)ywr2*~AqGRI|M1S>lh>D3J}n%Il)PMA#;kz9%IYMY`N8zRk@Qto`W=#< zm$T!A*+(d~v6C64mD?&H=KyqmVGl%Xd=RO*9Z2sy9_c%gZut@U!FKgz5YQuUz0_m$ z)5L!&tXKAkr2F2o+L?G zAXM8qf+~A@Q3R-8{{N*go}cMmUX|N(dQERfYf;o{+~09+l>yMzo4nkMtdt?LSDA3$jpz3&ESfetLf3@+G~1PWcJ{B@2>hF(BhK7 ze17QhL8aNU(a6k*2fZ^6Sjeoqh_68Z7nlTTW&e$Wo>b2j=YCjNR_s>_92jdv~Q>Bfz~aPS66kas*3!24PTy?$eg_r8tDm{sCDB zDQn7_9Y^2v{BRGnX5^ga%PDZe#+?v~#cSBc9=znP%P-%31DFy!F{InhL{-QuW8hJ4 zKTApg_H9S0!ud_d_f(1R!=z4dXk-Tt%XPaeC=$5`o3yoK`ho1gDdl(k6uBKWy?RYU zySb@mrfkpjp7&+0=5=?BHm$v)zqB)#=`CMBJlkDVzW&vHm(DB-Wj(~M(CaS++68jm$hq@J$mv+I+CJOxEcK6U4JRm8ycVK8waC#4{#IWf5wJaCdL`>f2xHoE z&KgD?%iC_l--7KD3j1?$P;ISM?iLvtr-@gBCHk&JCeJBlHACgjM6Mav1@7pJBVG4_ z@%zy0V=ycbUORTRVHDD?U{zoTz%^!kOg~#;bv{Q@>@34oYdvd-)29I`Ggx`Y>1`X z0;c4)8tn#3-Fbmzo!HjZQ9ZeJ_;~}l?p4QQ5g(l!I29+!z>ZkY@3{kQ`&MyzEt@k$ zZ}q>%9C+cN=v+Pd`_ zhPeq-+}+)1C_N}YFa!gh_h#r#Q-O32}5DV!ijImfarE+jD?vxNNvF&G<&{ z%FJ?}A41qnN@;OKY4T{lKPqxih6j_bPX-4A`{VWu_X%Zp57D&k1C~QE?OL|rsmOAL zVc}jdMA{UioIc4I_n_&T5!Ao%*o1pNnu}|z3I+(`gVHtxTI}!rhV!lOPRd|S>g?$X zL@$}$93ntFWq#k2yRj_mNbv8M^Xm^5AH9M3t8&eHBx{0f(h#ryJ)W^&pY5p@)iZwZ zwj@}eR_w<*g%)vVQ@Fp*&wmB>*!H2l)1;l?wonG8y^ecc3Cvh#{nD4*`Ahj7yN=&y zwi<=~oH@y~rMv&2HkQ!qRM5XQ3A7{b_U|L}_W4tdjtpY=!*|p{B=I^x_pVjHDfhGZsF4Ie*T0+PH_I>ecCgxM05>++SFR z>B#b`9ULH;Z+Xt;Ic$j9SJ0?uhIVN|XhH*4_b1_kv^3e}O;X{xHP>8w`Bk%2b28GLN-Ohs(GnF7wYFvl#FLTeB2;n{X*bmzZ&HnsSQ^@2dq(W|_KIQ~847WILL?^14v&4yoS~6)jRPTi1iTD|Drzzq#FL6|Jd`TqM+z`@5 zR3mtU(^@FsS16KBJ1Oml#z=F_Y4{#=Qa>0UOGFw@&3iTOq~SN;XKC0Si@}$wK9Pty zkvMhL4$12pO*s+QQPOp(Ogv8e(@;N?R!dWnq*~VO#2QpOlTJENutCKWsg_7gH8_z5 zWz_PTX^N!kBk)Q?q7gbOCzVR1R8zD$-k4BLj@#(Omk{A?NIz9{*ODYu1ZED zv6xDtLtK@LEOi!V&@5gcf{+HJ9c><7wQyiwxSNP)TI!vYa+f6?C4Jm#gr?m@k~X`M zlnd=MXaSx}LY|w9WYG0^VM0qL=7n=~A$vR&p#xnVpP_tP@r3X65UgxYCE^?vp++4X z&9M+o2}NAf*P$^D7+T{*>v71`14dd1)<>W!oARs=zsi&ubX^6EW?+1x#Yu+QF#+$j?5Vm_Yx-rUxFD z`vSlH_?2+JIK-pR8@Q_|N118IDs>XDbCgnJfU~iVozA*QKa=UlC^ZEb0?q(VL%G?& zJ*YnixEfdo+BI1!sEoMIOR$vIY2KWp<*W3xLz^9sfh~-K>2vk_K9s_oL zN2!I-e>OJv|IT#ae*k-+*9*WpeAo#-D5_Wt?oqt?=T^@uf|SCi3l(0$k1P2bz_;<+ zf#1jYnP>GBHRF;?ri8}NsYf(sLe*8(RcD=1ozd*+DD!r@)6AREy8C>YSrJPum z%W+fHfVoFi)u+>{DwQB%=}DL`3urYcs+bafRy6G*BbsPo{HiKUOQt>%k7UOA#~E8bUs-;Cptcs~z6>c&2%tzKW?Rc%8Do$Lh#xF?T! z!6%qrsy-hK=9O5rN(x$Fd!_!r&Y>@gQ65u?_ECrMLV3ef2nk*IeHRV0{AqZfj2~?% zLeEqKdyx0fK;~ZrE$oaBP_!~feBId0j>%R}q zhc;7wFR%ywlmarJ-*@UDuU+_8K+fBD2p*zod!xX)ZtfI*8h9OLfa~}K=b>-3aDe}mD0E!lDJhtN z7`Et$z*B;byNK<}!!b~6@wpa{SUhg=RTjV7;tyH;af?4=@n2f}zbwwR)qAM_A1(fw z#s6aQVI^K|GY3>y{A7!tVezRJzs%y-TfEWY35&0=c!$N;S^VF?lbAm^-i}0s=zn4$ zCea_=R{3`=zSH7gT6`GhD(|7Za*H2t@v#;^+u}7ApJ(xUi^nbgLyPAu{-DJlxA=1w zf5qZ&Sp0p9@3Q!xEnbSg@E-bWl*Lc6c$LL3u=wQ`zs}+ji^naVvG@-yzQ*EzZ}A^n z{9i5poW(a={4ICUAPz7YJeAXh>^v zZDGI{Xl^ldeSHp=H~%UlD8U?ObqP7z>UVSW)~|B#)$jTwY~H+^4q4lUohWjksn6XlGI_llr`9h-6SR$Pf9T`gcVhN==Ho_dRELsbnG&SS$ zCFNI)<<$^J5pZoSA_zg_<-=+> zfeWZ`I7;c^`fx0v2O_+iAFsHy3=rLM=Gsd;Lk5QLY6i8wj}w=8V?=jf(9HaZ7BfAI z{qd}an7JEt8*nSC8j~3}s{iWgE$q2oJJmBvYsG5Oi5f8Ex6Q++4t+>xi=_?V|(KD*zIkgy@YhFndPr=!Qh_m=V5U1i^Nb+AG z{y?dZh!pyX-;B4Y`O5ILG z{dK1#-$@R6pOB;7FC_hcgqL7{!E}DcW;;g+ zuL2fduha!Z=rN0U1J3QtN4Z9Fw6j?FN^-PwFFEA>h#Yo3D)~=I{tM*L|7A(xn4;8WH7xN5r9cB+l-|xU@Kl z2s^3-&mkf%62vg>Q;CpwFR@0c$B8p=uR%n;SBQu|9x*BJSR(43PDKA-NUX!zm56Z? z1JX|}`Nc}zPmCz_9I;-h_XS7c?tu1;B|^@b#3=kuoQZQe5%~!q<*g!bz&IwN{JTU4 zpR0xMC89o$zAQfi$Z^rT&h1i&FE5@T*IN-fM}AlzNC5gFGTGFP;aoy)EQdU_40rF^7Z0u1Q4r z`2rxz%_5I0bt8F5sd{qwHAO_f-9|)wKEiyIe})`#KOsWi$dSN0^cNBH;Dtbzn?as{ z-b9pZVmjm}$RYnRBJ5qybd>KVhun9B_X^)ngg=Ml?uPSf6%qQ+AR>Jp5q?-ij3IuB zm=7KRvb`UZqrDf2Nz4<(TBSZGUWPIiCVeas<6|;$HtwN_b+8{u{q7@&eoqq7-(AGT z_|8E@xzZzm(5r%o^hzS)v6?trsW=h&D~VU*9#3!`aj{Zw5|RHQ5&iqA-~l4~VI=OF zic{z}BFfDoqTB)^^5eub#;v6POzX@C^J4ELsBjg!PCVe*c&paz7`B+)+mXq4!u~6V^Q- z^|+b*R>X<$BsuD@BVs(fDEV&_e~7#9qfNbIfUGx(2)|rJgr3(kzZmy-HlK{q!Lb^VAna%yX5aP!IM@08*buBHBw4SK?o*34fIczrHK!e;`g* z>MumdFFwZPpF@QG(}}Bap9-X2_2hA^$HXh~J&AY?#szV;QoTgzdlK&Siq~NOKwPZU zTp;KD1w_b+GyOJvzanCM-6Q!wB}ctq5nJ%>LU_?}sCN$LGa%DLM8wGqBK$aym_@%3 zo0PhX2tPeeg#OP0+3w5a7$0v*`p3i@FfNVE7B$E4 z)g09{hg&osEj%Q=Quuh`6NFC|K2>m<;H83ff(=B(BSKlr$5f?xQn)L;Rrqq@tA(!> zey8xegm((RU-(19e + +#define lcode_c +#define LUA_CORE + +#include "lua.h" + +#include "lcode.h" +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "llex.h" +#include "lmem.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" +#include "ltable.h" + + +#define hasjumps(e) ((e)->t != (e)->f) + + +static int isnumeral(expdesc *e) { + return (e->k == VKNUM && e->t == NO_JUMP && e->f == NO_JUMP); +} + + +void luaK_nil (FuncState *fs, int from, int n) { + Instruction *previous; + if (fs->pc > fs->lasttarget) { /* no jumps to current position? */ + if (fs->pc == 0) { /* function start? */ + if (from >= fs->nactvar) + return; /* positions are already clean */ + } + else { + previous = &fs->f->code[fs->pc-1]; + if (GET_OPCODE(*previous) == OP_LOADNIL) { + int pfrom = GETARG_A(*previous); + int pto = GETARG_B(*previous); + if (pfrom <= from && from <= pto+1) { /* can connect both? */ + if (from+n-1 > pto) + SETARG_B(*previous, from+n-1); + return; + } + } + } + } + luaK_codeABC(fs, OP_LOADNIL, from, from+n-1, 0); /* else no optimization */ +} + + +int luaK_jump (FuncState *fs) { + int jpc = fs->jpc; /* save list of jumps to here */ + int j; + fs->jpc = NO_JUMP; + j = luaK_codeAsBx(fs, OP_JMP, 0, NO_JUMP); + luaK_concat(fs, &j, jpc); /* keep them on hold */ + return j; +} + + +void luaK_ret (FuncState *fs, int first, int nret) { + luaK_codeABC(fs, OP_RETURN, first, nret+1, 0); +} + + +static int condjump (FuncState *fs, OpCode op, int A, int B, int C) { + luaK_codeABC(fs, op, A, B, C); + return luaK_jump(fs); +} + + +static void fixjump (FuncState *fs, int pc, int dest) { + Instruction *jmp = &fs->f->code[pc]; + int offset = dest-(pc+1); + lua_assert(dest != NO_JUMP); + if (abs(offset) > MAXARG_sBx) + luaX_syntaxerror(fs->ls, "control structure too long"); + SETARG_sBx(*jmp, offset); +} + + +/* +** returns current `pc' and marks it as a jump target (to avoid wrong +** optimizations with consecutive instructions not in the same basic block). +*/ +int luaK_getlabel (FuncState *fs) { + fs->lasttarget = fs->pc; + return fs->pc; +} + + +static int getjump (FuncState *fs, int pc) { + int offset = GETARG_sBx(fs->f->code[pc]); + if (offset == NO_JUMP) /* point to itself represents end of list */ + return NO_JUMP; /* end of list */ + else + return (pc+1)+offset; /* turn offset into absolute position */ +} + + +static Instruction *getjumpcontrol (FuncState *fs, int pc) { + Instruction *pi = &fs->f->code[pc]; + if (pc >= 1 && testTMode(GET_OPCODE(*(pi-1)))) + return pi-1; + else + return pi; +} + + +/* +** check whether list has any jump that do not produce a value +** (or produce an inverted value) +*/ +static int need_value (FuncState *fs, int list) { + for (; list != NO_JUMP; list = getjump(fs, list)) { + Instruction i = *getjumpcontrol(fs, list); + if (GET_OPCODE(i) != OP_TESTSET) return 1; + } + return 0; /* not found */ +} + + +static int patchtestreg (FuncState *fs, int node, int reg) { + Instruction *i = getjumpcontrol(fs, node); + if (GET_OPCODE(*i) != OP_TESTSET) + return 0; /* cannot patch other instructions */ + if (reg != NO_REG && reg != GETARG_B(*i)) + SETARG_A(*i, reg); + else /* no register to put value or register already has the value */ + *i = CREATE_ABC(OP_TEST, GETARG_B(*i), 0, GETARG_C(*i)); + + return 1; +} + + +static void removevalues (FuncState *fs, int list) { + for (; list != NO_JUMP; list = getjump(fs, list)) + patchtestreg(fs, list, NO_REG); +} + + +static void patchlistaux (FuncState *fs, int list, int vtarget, int reg, + int dtarget) { + while (list != NO_JUMP) { + int next = getjump(fs, list); + if (patchtestreg(fs, list, reg)) + fixjump(fs, list, vtarget); + else + fixjump(fs, list, dtarget); /* jump to default target */ + list = next; + } +} + + +static void dischargejpc (FuncState *fs) { + patchlistaux(fs, fs->jpc, fs->pc, NO_REG, fs->pc); + fs->jpc = NO_JUMP; +} + + +void luaK_patchlist (FuncState *fs, int list, int target) { + if (target == fs->pc) + luaK_patchtohere(fs, list); + else { + lua_assert(target < fs->pc); + patchlistaux(fs, list, target, NO_REG, target); + } +} + + +void luaK_patchtohere (FuncState *fs, int list) { + luaK_getlabel(fs); + luaK_concat(fs, &fs->jpc, list); +} + + +void luaK_concat (FuncState *fs, int *l1, int l2) { + if (l2 == NO_JUMP) return; + else if (*l1 == NO_JUMP) + *l1 = l2; + else { + int list = *l1; + int next; + while ((next = getjump(fs, list)) != NO_JUMP) /* find last element */ + list = next; + fixjump(fs, list, l2); + } +} + + +void luaK_checkstack (FuncState *fs, int n) { + int newstack = fs->freereg + n; + if (newstack > fs->f->maxstacksize) { + if (newstack >= MAXSTACK) + luaX_syntaxerror(fs->ls, "function or expression too complex"); + fs->f->maxstacksize = cast_byte(newstack); + } +} + + +void luaK_reserveregs (FuncState *fs, int n) { + luaK_checkstack(fs, n); + fs->freereg += n; +} + + +static void freereg (FuncState *fs, int reg) { + if (!ISK(reg) && reg >= fs->nactvar) { + fs->freereg--; + lua_assert(reg == fs->freereg); + } +} + + +static void freeexp (FuncState *fs, expdesc *e) { + if (e->k == VNONRELOC) + freereg(fs, e->u.s.info); +} + + +static int addk (FuncState *fs, TValue *k, TValue *v) { + lua_State *L = fs->L; + TValue *idx = luaH_set(L, fs->h, k); + Proto *f = fs->f; + int oldsize = f->sizek; + if (ttisnumber(idx)) { + lua_assert(luaO_rawequalObj(&fs->f->k[cast_int(nvalue(idx))], v)); + return cast_int(nvalue(idx)); + } + else { /* constant not found; create a new entry */ + setnvalue(idx, cast_num(fs->nk)); + luaM_growvector(L, f->k, fs->nk, f->sizek, TValue, + MAXARG_Bx, "constant table overflow"); + while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]); + setobj(L, &f->k[fs->nk], v); + luaC_barrier(L, f, v); + return fs->nk++; + } +} + + +int luaK_stringK (FuncState *fs, TString *s) { + TValue o; + setsvalue(fs->L, &o, s); + return addk(fs, &o, &o); +} + + +int luaK_numberK (FuncState *fs, lua_Number r) { + TValue o; + setnvalue(&o, r); + return addk(fs, &o, &o); +} + + +static int boolK (FuncState *fs, int b) { + TValue o; + setbvalue(&o, b); + return addk(fs, &o, &o); +} + + +static int nilK (FuncState *fs) { + TValue k, v; + setnilvalue(&v); + /* cannot use nil as key; instead use table itself to represent nil */ + sethvalue(fs->L, &k, fs->h); + return addk(fs, &k, &v); +} + + +void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) { + if (e->k == VCALL) { /* expression is an open function call? */ + SETARG_C(getcode(fs, e), nresults+1); + } + else if (e->k == VVARARG) { + SETARG_B(getcode(fs, e), nresults+1); + SETARG_A(getcode(fs, e), fs->freereg); + luaK_reserveregs(fs, 1); + } +} + + +void luaK_setoneret (FuncState *fs, expdesc *e) { + if (e->k == VCALL) { /* expression is an open function call? */ + e->k = VNONRELOC; + e->u.s.info = GETARG_A(getcode(fs, e)); + } + else if (e->k == VVARARG) { + SETARG_B(getcode(fs, e), 2); + e->k = VRELOCABLE; /* can relocate its simple result */ + } +} + + +void luaK_dischargevars (FuncState *fs, expdesc *e) { + switch (e->k) { + case VLOCAL: { + e->k = VNONRELOC; + break; + } + case VUPVAL: { + e->u.s.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.s.info, 0); + e->k = VRELOCABLE; + break; + } + case VGLOBAL: { + e->u.s.info = luaK_codeABx(fs, OP_GETGLOBAL, 0, e->u.s.info); + e->k = VRELOCABLE; + break; + } + case VINDEXED: { + freereg(fs, e->u.s.aux); + freereg(fs, e->u.s.info); + e->u.s.info = luaK_codeABC(fs, OP_GETTABLE, 0, e->u.s.info, e->u.s.aux); + e->k = VRELOCABLE; + break; + } + case VVARARG: + case VCALL: { + luaK_setoneret(fs, e); + break; + } + default: break; /* there is one value available (somewhere) */ + } +} + + +static int code_label (FuncState *fs, int A, int b, int jump) { + luaK_getlabel(fs); /* those instructions may be jump targets */ + return luaK_codeABC(fs, OP_LOADBOOL, A, b, jump); +} + + +static void discharge2reg (FuncState *fs, expdesc *e, int reg) { + luaK_dischargevars(fs, e); + switch (e->k) { + case VNIL: { + luaK_nil(fs, reg, 1); + break; + } + case VFALSE: case VTRUE: { + luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0); + break; + } + case VK: { + luaK_codeABx(fs, OP_LOADK, reg, e->u.s.info); + break; + } + case VKNUM: { + luaK_codeABx(fs, OP_LOADK, reg, luaK_numberK(fs, e->u.nval)); + break; + } + case VRELOCABLE: { + Instruction *pc = &getcode(fs, e); + SETARG_A(*pc, reg); + break; + } + case VNONRELOC: { + if (reg != e->u.s.info) + luaK_codeABC(fs, OP_MOVE, reg, e->u.s.info, 0); + break; + } + default: { + lua_assert(e->k == VVOID || e->k == VJMP); + return; /* nothing to do... */ + } + } + e->u.s.info = reg; + e->k = VNONRELOC; +} + + +static void discharge2anyreg (FuncState *fs, expdesc *e) { + if (e->k != VNONRELOC) { + luaK_reserveregs(fs, 1); + discharge2reg(fs, e, fs->freereg-1); + } +} + + +static void exp2reg (FuncState *fs, expdesc *e, int reg) { + discharge2reg(fs, e, reg); + if (e->k == VJMP) + luaK_concat(fs, &e->t, e->u.s.info); /* put this jump in `t' list */ + if (hasjumps(e)) { + int final; /* position after whole expression */ + int p_f = NO_JUMP; /* position of an eventual LOAD false */ + int p_t = NO_JUMP; /* position of an eventual LOAD true */ + if (need_value(fs, e->t) || need_value(fs, e->f)) { + int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs); + p_f = code_label(fs, reg, 0, 1); + p_t = code_label(fs, reg, 1, 0); + luaK_patchtohere(fs, fj); + } + final = luaK_getlabel(fs); + patchlistaux(fs, e->f, final, reg, p_f); + patchlistaux(fs, e->t, final, reg, p_t); + } + e->f = e->t = NO_JUMP; + e->u.s.info = reg; + e->k = VNONRELOC; +} + + +void luaK_exp2nextreg (FuncState *fs, expdesc *e) { + luaK_dischargevars(fs, e); + freeexp(fs, e); + luaK_reserveregs(fs, 1); + exp2reg(fs, e, fs->freereg - 1); +} + + +int luaK_exp2anyreg (FuncState *fs, expdesc *e) { + luaK_dischargevars(fs, e); + if (e->k == VNONRELOC) { + if (!hasjumps(e)) return e->u.s.info; /* exp is already in a register */ + if (e->u.s.info >= fs->nactvar) { /* reg. is not a local? */ + exp2reg(fs, e, e->u.s.info); /* put value on it */ + return e->u.s.info; + } + } + luaK_exp2nextreg(fs, e); /* default */ + return e->u.s.info; +} + + +void luaK_exp2val (FuncState *fs, expdesc *e) { + if (hasjumps(e)) + luaK_exp2anyreg(fs, e); + else + luaK_dischargevars(fs, e); +} + + +int luaK_exp2RK (FuncState *fs, expdesc *e) { + luaK_exp2val(fs, e); + switch (e->k) { + case VKNUM: + case VTRUE: + case VFALSE: + case VNIL: { + if (fs->nk <= MAXINDEXRK) { /* constant fit in RK operand? */ + e->u.s.info = (e->k == VNIL) ? nilK(fs) : + (e->k == VKNUM) ? luaK_numberK(fs, e->u.nval) : + boolK(fs, (e->k == VTRUE)); + e->k = VK; + return RKASK(e->u.s.info); + } + else break; + } + case VK: { + if (e->u.s.info <= MAXINDEXRK) /* constant fit in argC? */ + return RKASK(e->u.s.info); + else break; + } + default: break; + } + /* not a constant in the right range: put it in a register */ + return luaK_exp2anyreg(fs, e); +} + + +void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) { + switch (var->k) { + case VLOCAL: { + freeexp(fs, ex); + exp2reg(fs, ex, var->u.s.info); + return; + } + case VUPVAL: { + int e = luaK_exp2anyreg(fs, ex); + luaK_codeABC(fs, OP_SETUPVAL, e, var->u.s.info, 0); + break; + } + case VGLOBAL: { + int e = luaK_exp2anyreg(fs, ex); + luaK_codeABx(fs, OP_SETGLOBAL, e, var->u.s.info); + break; + } + case VINDEXED: { + int e = luaK_exp2RK(fs, ex); + luaK_codeABC(fs, OP_SETTABLE, var->u.s.info, var->u.s.aux, e); + break; + } + default: { + lua_assert(0); /* invalid var kind to store */ + break; + } + } + freeexp(fs, ex); +} + + +void luaK_self (FuncState *fs, expdesc *e, expdesc *key) { + int func; + luaK_exp2anyreg(fs, e); + freeexp(fs, e); + func = fs->freereg; + luaK_reserveregs(fs, 2); + luaK_codeABC(fs, OP_SELF, func, e->u.s.info, luaK_exp2RK(fs, key)); + freeexp(fs, key); + e->u.s.info = func; + e->k = VNONRELOC; +} + + +static void invertjump (FuncState *fs, expdesc *e) { + Instruction *pc = getjumpcontrol(fs, e->u.s.info); + lua_assert(testTMode(GET_OPCODE(*pc)) && GET_OPCODE(*pc) != OP_TESTSET && + GET_OPCODE(*pc) != OP_TEST); + SETARG_A(*pc, !(GETARG_A(*pc))); +} + + +static int jumponcond (FuncState *fs, expdesc *e, int cond) { + if (e->k == VRELOCABLE) { + Instruction ie = getcode(fs, e); + if (GET_OPCODE(ie) == OP_NOT) { + fs->pc--; /* remove previous OP_NOT */ + return condjump(fs, OP_TEST, GETARG_B(ie), 0, !cond); + } + /* else go through */ + } + discharge2anyreg(fs, e); + freeexp(fs, e); + return condjump(fs, OP_TESTSET, NO_REG, e->u.s.info, cond); +} + + +void luaK_goiftrue (FuncState *fs, expdesc *e) { + int pc; /* pc of last jump */ + luaK_dischargevars(fs, e); + switch (e->k) { + case VK: case VKNUM: case VTRUE: { + pc = NO_JUMP; /* always true; do nothing */ + break; + } + case VFALSE: { + pc = luaK_jump(fs); /* always jump */ + break; + } + case VJMP: { + invertjump(fs, e); + pc = e->u.s.info; + break; + } + default: { + pc = jumponcond(fs, e, 0); + break; + } + } + luaK_concat(fs, &e->f, pc); /* insert last jump in `f' list */ + luaK_patchtohere(fs, e->t); + e->t = NO_JUMP; +} + + +static void luaK_goiffalse (FuncState *fs, expdesc *e) { + int pc; /* pc of last jump */ + luaK_dischargevars(fs, e); + switch (e->k) { + case VNIL: case VFALSE: { + pc = NO_JUMP; /* always false; do nothing */ + break; + } + case VTRUE: { + pc = luaK_jump(fs); /* always jump */ + break; + } + case VJMP: { + pc = e->u.s.info; + break; + } + default: { + pc = jumponcond(fs, e, 1); + break; + } + } + luaK_concat(fs, &e->t, pc); /* insert last jump in `t' list */ + luaK_patchtohere(fs, e->f); + e->f = NO_JUMP; +} + + +static void codenot (FuncState *fs, expdesc *e) { + luaK_dischargevars(fs, e); + switch (e->k) { + case VNIL: case VFALSE: { + e->k = VTRUE; + break; + } + case VK: case VKNUM: case VTRUE: { + e->k = VFALSE; + break; + } + case VJMP: { + invertjump(fs, e); + break; + } + case VRELOCABLE: + case VNONRELOC: { + discharge2anyreg(fs, e); + freeexp(fs, e); + e->u.s.info = luaK_codeABC(fs, OP_NOT, 0, e->u.s.info, 0); + e->k = VRELOCABLE; + break; + } + default: { + lua_assert(0); /* cannot happen */ + break; + } + } + /* interchange true and false lists */ + { int temp = e->f; e->f = e->t; e->t = temp; } + removevalues(fs, e->f); + removevalues(fs, e->t); +} + + +void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) { + t->u.s.aux = luaK_exp2RK(fs, k); + t->k = VINDEXED; +} + + +static int constfolding (OpCode op, expdesc *e1, expdesc *e2) { + lua_Number v1, v2, r; + if (!isnumeral(e1) || !isnumeral(e2)) return 0; + v1 = e1->u.nval; + v2 = e2->u.nval; + switch (op) { + case OP_ADD: r = luai_numadd(v1, v2); break; + case OP_SUB: r = luai_numsub(v1, v2); break; + case OP_MUL: r = luai_nummul(v1, v2); break; + case OP_DIV: + if (v2 == 0) return 0; /* do not attempt to divide by 0 */ + r = luai_numdiv(v1, v2); break; + case OP_MOD: + if (v2 == 0) return 0; /* do not attempt to divide by 0 */ + r = luai_nummod(v1, v2); break; + case OP_POW: r = luai_numpow(v1, v2); break; + case OP_UNM: r = luai_numunm(v1); break; + case OP_LEN: return 0; /* no constant folding for 'len' */ + default: lua_assert(0); r = 0; break; + } + if (luai_numisnan(r)) return 0; /* do not attempt to produce NaN */ + e1->u.nval = r; + return 1; +} + + +static void codearith (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) { + if (constfolding(op, e1, e2)) + return; + else { + int o2 = (op != OP_UNM && op != OP_LEN) ? luaK_exp2RK(fs, e2) : 0; + int o1 = luaK_exp2RK(fs, e1); + if (o1 > o2) { + freeexp(fs, e1); + freeexp(fs, e2); + } + else { + freeexp(fs, e2); + freeexp(fs, e1); + } + e1->u.s.info = luaK_codeABC(fs, op, 0, o1, o2); + e1->k = VRELOCABLE; + } +} + + +static void codecomp (FuncState *fs, OpCode op, int cond, expdesc *e1, + expdesc *e2) { + int o1 = luaK_exp2RK(fs, e1); + int o2 = luaK_exp2RK(fs, e2); + freeexp(fs, e2); + freeexp(fs, e1); + if (cond == 0 && op != OP_EQ) { + int temp; /* exchange args to replace by `<' or `<=' */ + temp = o1; o1 = o2; o2 = temp; /* o1 <==> o2 */ + cond = 1; + } + e1->u.s.info = condjump(fs, op, cond, o1, o2); + e1->k = VJMP; +} + + +void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e) { + expdesc e2; + e2.t = e2.f = NO_JUMP; e2.k = VKNUM; e2.u.nval = 0; + switch (op) { + case OPR_MINUS: { + if (!isnumeral(e)) + luaK_exp2anyreg(fs, e); /* cannot operate on non-numeric constants */ + codearith(fs, OP_UNM, e, &e2); + break; + } + case OPR_NOT: codenot(fs, e); break; + case OPR_LEN: { + luaK_exp2anyreg(fs, e); /* cannot operate on constants */ + codearith(fs, OP_LEN, e, &e2); + break; + } + default: lua_assert(0); + } +} + + +void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) { + switch (op) { + case OPR_AND: { + luaK_goiftrue(fs, v); + break; + } + case OPR_OR: { + luaK_goiffalse(fs, v); + break; + } + case OPR_CONCAT: { + luaK_exp2nextreg(fs, v); /* operand must be on the `stack' */ + break; + } + case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV: + case OPR_MOD: case OPR_POW: { + if (!isnumeral(v)) luaK_exp2RK(fs, v); + break; + } + default: { + luaK_exp2RK(fs, v); + break; + } + } +} + + +void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) { + switch (op) { + case OPR_AND: { + lua_assert(e1->t == NO_JUMP); /* list must be closed */ + luaK_dischargevars(fs, e2); + luaK_concat(fs, &e2->f, e1->f); + *e1 = *e2; + break; + } + case OPR_OR: { + lua_assert(e1->f == NO_JUMP); /* list must be closed */ + luaK_dischargevars(fs, e2); + luaK_concat(fs, &e2->t, e1->t); + *e1 = *e2; + break; + } + case OPR_CONCAT: { + luaK_exp2val(fs, e2); + if (e2->k == VRELOCABLE && GET_OPCODE(getcode(fs, e2)) == OP_CONCAT) { + lua_assert(e1->u.s.info == GETARG_B(getcode(fs, e2))-1); + freeexp(fs, e1); + SETARG_B(getcode(fs, e2), e1->u.s.info); + e1->k = VRELOCABLE; e1->u.s.info = e2->u.s.info; + } + else { + luaK_exp2nextreg(fs, e2); /* operand must be on the 'stack' */ + codearith(fs, OP_CONCAT, e1, e2); + } + break; + } + case OPR_ADD: codearith(fs, OP_ADD, e1, e2); break; + case OPR_SUB: codearith(fs, OP_SUB, e1, e2); break; + case OPR_MUL: codearith(fs, OP_MUL, e1, e2); break; + case OPR_DIV: codearith(fs, OP_DIV, e1, e2); break; + case OPR_MOD: codearith(fs, OP_MOD, e1, e2); break; + case OPR_POW: codearith(fs, OP_POW, e1, e2); break; + case OPR_EQ: codecomp(fs, OP_EQ, 1, e1, e2); break; + case OPR_NE: codecomp(fs, OP_EQ, 0, e1, e2); break; + case OPR_LT: codecomp(fs, OP_LT, 1, e1, e2); break; + case OPR_LE: codecomp(fs, OP_LE, 1, e1, e2); break; + case OPR_GT: codecomp(fs, OP_LT, 0, e1, e2); break; + case OPR_GE: codecomp(fs, OP_LE, 0, e1, e2); break; + default: lua_assert(0); + } +} + + +void luaK_fixline (FuncState *fs, int line) { + fs->f->lineinfo[fs->pc - 1] = line; +} + + +static int luaK_code (FuncState *fs, Instruction i, int line) { + Proto *f = fs->f; + dischargejpc(fs); /* `pc' will change */ + /* put new instruction in code array */ + luaM_growvector(fs->L, f->code, fs->pc, f->sizecode, Instruction, + MAX_INT, "code size overflow"); + f->code[fs->pc] = i; + /* save corresponding line information */ + luaM_growvector(fs->L, f->lineinfo, fs->pc, f->sizelineinfo, int, + MAX_INT, "code size overflow"); + f->lineinfo[fs->pc] = line; + return fs->pc++; +} + + +int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) { + lua_assert(getOpMode(o) == iABC); + lua_assert(getBMode(o) != OpArgN || b == 0); + lua_assert(getCMode(o) != OpArgN || c == 0); + return luaK_code(fs, CREATE_ABC(o, a, b, c), fs->ls->lastline); +} + + +int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) { + lua_assert(getOpMode(o) == iABx || getOpMode(o) == iAsBx); + lua_assert(getCMode(o) == OpArgN); + return luaK_code(fs, CREATE_ABx(o, a, bc), fs->ls->lastline); +} + + +void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) { + int c = (nelems - 1)/LFIELDS_PER_FLUSH + 1; + int b = (tostore == LUA_MULTRET) ? 0 : tostore; + lua_assert(tostore != 0); + if (c <= MAXARG_C) + luaK_codeABC(fs, OP_SETLIST, base, b, c); + else { + luaK_codeABC(fs, OP_SETLIST, base, b, 0); + luaK_code(fs, cast(Instruction, c), fs->ls->lastline); + } + fs->freereg = base + 1; /* free registers with list values */ +} + diff --git a/user/lua-5.1.4/src/lcode.h b/user/lua-5.1.4/src/lcode.h new file mode 100644 index 0000000..b941c60 --- /dev/null +++ b/user/lua-5.1.4/src/lcode.h @@ -0,0 +1,76 @@ +/* +** $Id: lcode.h,v 1.48.1.1 2007/12/27 13:02:25 roberto Exp $ +** Code generator for Lua +** See Copyright Notice in lua.h +*/ + +#ifndef lcode_h +#define lcode_h + +#include "llex.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" + + +/* +** Marks the end of a patch list. It is an invalid value both as an absolute +** address, and as a list link (would link an element to itself). +*/ +#define NO_JUMP (-1) + + +/* +** grep "ORDER OPR" if you change these enums +*/ +typedef enum BinOpr { + OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW, + OPR_CONCAT, + OPR_NE, OPR_EQ, + OPR_LT, OPR_LE, OPR_GT, OPR_GE, + OPR_AND, OPR_OR, + OPR_NOBINOPR +} BinOpr; + + +typedef enum UnOpr { OPR_MINUS, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr; + + +#define getcode(fs,e) ((fs)->f->code[(e)->u.s.info]) + +#define luaK_codeAsBx(fs,o,A,sBx) luaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx) + +#define luaK_setmultret(fs,e) luaK_setreturns(fs, e, LUA_MULTRET) + +LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx); +LUAI_FUNC int luaK_codeABC (FuncState *fs, OpCode o, int A, int B, int C); +LUAI_FUNC void luaK_fixline (FuncState *fs, int line); +LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n); +LUAI_FUNC void luaK_reserveregs (FuncState *fs, int n); +LUAI_FUNC void luaK_checkstack (FuncState *fs, int n); +LUAI_FUNC int luaK_stringK (FuncState *fs, TString *s); +LUAI_FUNC int luaK_numberK (FuncState *fs, lua_Number r); +LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e); +LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_exp2nextreg (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e); +LUAI_FUNC int luaK_exp2RK (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key); +LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k); +LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e); +LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults); +LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e); +LUAI_FUNC int luaK_jump (FuncState *fs); +LUAI_FUNC void luaK_ret (FuncState *fs, int first, int nret); +LUAI_FUNC void luaK_patchlist (FuncState *fs, int list, int target); +LUAI_FUNC void luaK_patchtohere (FuncState *fs, int list); +LUAI_FUNC void luaK_concat (FuncState *fs, int *l1, int l2); +LUAI_FUNC int luaK_getlabel (FuncState *fs); +LUAI_FUNC void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v); +LUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v); +LUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1, expdesc *v2); +LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore); + + +#endif diff --git a/user/lua-5.1.4/src/lcode.o b/user/lua-5.1.4/src/lcode.o new file mode 100644 index 0000000000000000000000000000000000000000..5406c5db634395b61f854e134eae895296f5e2b6 GIT binary patch literal 11804 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 literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/ldblib.c b/user/lua-5.1.4/src/ldblib.c new file mode 100644 index 0000000..67de122 --- /dev/null +++ b/user/lua-5.1.4/src/ldblib.c @@ -0,0 +1,397 @@ +/* +** $Id: ldblib.c,v 1.104.1.3 2008/01/21 13:11:21 roberto Exp $ +** Interface from Lua to its debug API +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include + +#define ldblib_c +#define LUA_LIB + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + + +static int db_getregistry (lua_State *L) { + lua_pushvalue(L, LUA_REGISTRYINDEX); + return 1; +} + + +static int db_getmetatable (lua_State *L) { + luaL_checkany(L, 1); + if (!lua_getmetatable(L, 1)) { + lua_pushnil(L); /* no metatable */ + } + return 1; +} + + +static int db_setmetatable (lua_State *L) { + int t = lua_type(L, 2); + luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2, + "nil or table expected"); + lua_settop(L, 2); + lua_pushboolean(L, lua_setmetatable(L, 1)); + return 1; +} + + +static int db_getfenv (lua_State *L) { + lua_getfenv(L, 1); + return 1; +} + + +static int db_setfenv (lua_State *L) { + luaL_checktype(L, 2, LUA_TTABLE); + lua_settop(L, 2); + if (lua_setfenv(L, 1) == 0) + luaL_error(L, LUA_QL("setfenv") + " cannot change environment of given object"); + return 1; +} + + +static void settabss (lua_State *L, const char *i, const char *v) { + lua_pushstring(L, v); + lua_setfield(L, -2, i); +} + + +static void settabsi (lua_State *L, const char *i, int v) { + lua_pushinteger(L, v); + lua_setfield(L, -2, i); +} + + +static lua_State *getthread (lua_State *L, int *arg) { + if (lua_isthread(L, 1)) { + *arg = 1; + return lua_tothread(L, 1); + } + else { + *arg = 0; + return L; + } +} + + +static void treatstackoption (lua_State *L, lua_State *L1, const char *fname) { + if (L == L1) { + lua_pushvalue(L, -2); + lua_remove(L, -3); + } + else + lua_xmove(L1, L, 1); + lua_setfield(L, -2, fname); +} + + +static int db_getinfo (lua_State *L) { + lua_Debug ar; + int arg; + lua_State *L1 = getthread(L, &arg); + const char *options = luaL_optstring(L, arg+2, "flnSu"); + if (lua_isnumber(L, arg+1)) { + if (!lua_getstack(L1, (int)lua_tointeger(L, arg+1), &ar)) { + lua_pushnil(L); /* level out of range */ + return 1; + } + } + else if (lua_isfunction(L, arg+1)) { + lua_pushfstring(L, ">%s", options); + options = lua_tostring(L, -1); + lua_pushvalue(L, arg+1); + lua_xmove(L, L1, 1); + } + else + return luaL_argerror(L, arg+1, "function or level expected"); + if (!lua_getinfo(L1, options, &ar)) + return luaL_argerror(L, arg+2, "invalid option"); + lua_createtable(L, 0, 2); + if (strchr(options, 'S')) { + settabss(L, "source", ar.source); + settabss(L, "short_src", ar.short_src); + settabsi(L, "linedefined", ar.linedefined); + settabsi(L, "lastlinedefined", ar.lastlinedefined); + settabss(L, "what", ar.what); + } + if (strchr(options, 'l')) + settabsi(L, "currentline", ar.currentline); + if (strchr(options, 'u')) + settabsi(L, "nups", ar.nups); + if (strchr(options, 'n')) { + settabss(L, "name", ar.name); + settabss(L, "namewhat", ar.namewhat); + } + if (strchr(options, 'L')) + treatstackoption(L, L1, "activelines"); + if (strchr(options, 'f')) + treatstackoption(L, L1, "func"); + return 1; /* return table */ +} + + +static int db_getlocal (lua_State *L) { + int arg; + lua_State *L1 = getthread(L, &arg); + lua_Debug ar; + const char *name; + if (!lua_getstack(L1, luaL_checkint(L, arg+1), &ar)) /* out of range? */ + return luaL_argerror(L, arg+1, "level out of range"); + name = lua_getlocal(L1, &ar, luaL_checkint(L, arg+2)); + if (name) { + lua_xmove(L1, L, 1); + lua_pushstring(L, name); + lua_pushvalue(L, -2); + return 2; + } + else { + lua_pushnil(L); + return 1; + } +} + + +static int db_setlocal (lua_State *L) { + int arg; + lua_State *L1 = getthread(L, &arg); + lua_Debug ar; + if (!lua_getstack(L1, luaL_checkint(L, arg+1), &ar)) /* out of range? */ + return luaL_argerror(L, arg+1, "level out of range"); + luaL_checkany(L, arg+3); + lua_settop(L, arg+3); + lua_xmove(L, L1, 1); + lua_pushstring(L, lua_setlocal(L1, &ar, luaL_checkint(L, arg+2))); + return 1; +} + + +static int auxupvalue (lua_State *L, int get) { + const char *name; + int n = luaL_checkint(L, 2); + luaL_checktype(L, 1, LUA_TFUNCTION); + if (lua_iscfunction(L, 1)) return 0; /* cannot touch C upvalues from Lua */ + name = get ? lua_getupvalue(L, 1, n) : lua_setupvalue(L, 1, n); + if (name == NULL) return 0; + lua_pushstring(L, name); + lua_insert(L, -(get+1)); + return get + 1; +} + + +static int db_getupvalue (lua_State *L) { + return auxupvalue(L, 1); +} + + +static int db_setupvalue (lua_State *L) { + luaL_checkany(L, 3); + return auxupvalue(L, 0); +} + + + +static const char KEY_HOOK = 'h'; + + +static void hookf (lua_State *L, lua_Debug *ar) { + static const char *const hooknames[] = + {"call", "return", "line", "count", "tail return"}; + lua_pushlightuserdata(L, (void *)&KEY_HOOK); + lua_rawget(L, LUA_REGISTRYINDEX); + lua_pushlightuserdata(L, L); + lua_rawget(L, -2); + if (lua_isfunction(L, -1)) { + lua_pushstring(L, hooknames[(int)ar->event]); + if (ar->currentline >= 0) + lua_pushinteger(L, ar->currentline); + else lua_pushnil(L); + lua_assert(lua_getinfo(L, "lS", ar)); + lua_call(L, 2, 0); + } +} + + +static int makemask (const char *smask, int count) { + int mask = 0; + if (strchr(smask, 'c')) mask |= LUA_MASKCALL; + if (strchr(smask, 'r')) mask |= LUA_MASKRET; + if (strchr(smask, 'l')) mask |= LUA_MASKLINE; + if (count > 0) mask |= LUA_MASKCOUNT; + return mask; +} + + +static char *unmakemask (int mask, char *smask) { + int i = 0; + if (mask & LUA_MASKCALL) smask[i++] = 'c'; + if (mask & LUA_MASKRET) smask[i++] = 'r'; + if (mask & LUA_MASKLINE) smask[i++] = 'l'; + smask[i] = '\0'; + return smask; +} + + +static void gethooktable (lua_State *L) { + lua_pushlightuserdata(L, (void *)&KEY_HOOK); + lua_rawget(L, LUA_REGISTRYINDEX); + if (!lua_istable(L, -1)) { + lua_pop(L, 1); + lua_createtable(L, 0, 1); + lua_pushlightuserdata(L, (void *)&KEY_HOOK); + lua_pushvalue(L, -2); + lua_rawset(L, LUA_REGISTRYINDEX); + } +} + + +static int db_sethook (lua_State *L) { + int arg, mask, count; + lua_Hook func; + lua_State *L1 = getthread(L, &arg); + if (lua_isnoneornil(L, arg+1)) { + lua_settop(L, arg+1); + func = NULL; mask = 0; count = 0; /* turn off hooks */ + } + else { + const char *smask = luaL_checkstring(L, arg+2); + luaL_checktype(L, arg+1, LUA_TFUNCTION); + count = luaL_optint(L, arg+3, 0); + func = hookf; mask = makemask(smask, count); + } + gethooktable(L); + lua_pushlightuserdata(L, L1); + lua_pushvalue(L, arg+1); + lua_rawset(L, -3); /* set new hook */ + lua_pop(L, 1); /* remove hook table */ + lua_sethook(L1, func, mask, count); /* set hooks */ + return 0; +} + + +static int db_gethook (lua_State *L) { + int arg; + lua_State *L1 = getthread(L, &arg); + char buff[5]; + int mask = lua_gethookmask(L1); + lua_Hook hook = lua_gethook(L1); + if (hook != NULL && hook != hookf) /* external hook? */ + lua_pushliteral(L, "external hook"); + else { + gethooktable(L); + lua_pushlightuserdata(L, L1); + lua_rawget(L, -2); /* get hook */ + lua_remove(L, -2); /* remove hook table */ + } + lua_pushstring(L, unmakemask(mask, buff)); + lua_pushinteger(L, lua_gethookcount(L1)); + return 3; +} + + +static int db_debug (lua_State *L) { + for (;;) { + char buffer[250]; + fputs("lua_debug> ", stderr); + if (fgets(buffer, sizeof(buffer), stdin) == 0 || + strcmp(buffer, "cont\n") == 0) + return 0; + if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") || + lua_pcall(L, 0, 0, 0)) { + fputs(lua_tostring(L, -1), stderr); + fputs("\n", stderr); + } + lua_settop(L, 0); /* remove eventual returns */ + } +} + + +#define LEVELS1 12 /* size of the first part of the stack */ +#define LEVELS2 10 /* size of the second part of the stack */ + +static int db_errorfb (lua_State *L) { + int level; + int firstpart = 1; /* still before eventual `...' */ + int arg; + lua_State *L1 = getthread(L, &arg); + lua_Debug ar; + if (lua_isnumber(L, arg+2)) { + level = (int)lua_tointeger(L, arg+2); + lua_pop(L, 1); + } + else + level = (L == L1) ? 1 : 0; /* level 0 may be this own function */ + if (lua_gettop(L) == arg) + lua_pushliteral(L, ""); + else if (!lua_isstring(L, arg+1)) return 1; /* message is not a string */ + else lua_pushliteral(L, "\n"); + lua_pushliteral(L, "stack traceback:"); + while (lua_getstack(L1, level++, &ar)) { + if (level > LEVELS1 && firstpart) { + /* no more than `LEVELS2' more levels? */ + if (!lua_getstack(L1, level+LEVELS2, &ar)) + level--; /* keep going */ + else { + lua_pushliteral(L, "\n\t..."); /* too many levels */ + while (lua_getstack(L1, level+LEVELS2, &ar)) /* find last levels */ + level++; + } + firstpart = 0; + continue; + } + lua_pushliteral(L, "\n\t"); + lua_getinfo(L1, "Snl", &ar); + lua_pushfstring(L, "%s:", ar.short_src); + if (ar.currentline > 0) + lua_pushfstring(L, "%d:", ar.currentline); + if (*ar.namewhat != '\0') /* is there a name? */ + lua_pushfstring(L, " in function " LUA_QS, ar.name); + else { + if (*ar.what == 'm') /* main? */ + lua_pushfstring(L, " in main chunk"); + else if (*ar.what == 'C' || *ar.what == 't') + lua_pushliteral(L, " ?"); /* C function or tail call */ + else + lua_pushfstring(L, " in function <%s:%d>", + ar.short_src, ar.linedefined); + } + lua_concat(L, lua_gettop(L) - arg); + } + lua_concat(L, lua_gettop(L) - arg); + return 1; +} + + +static const luaL_Reg dblib[] = { + {"debug", db_debug}, + {"getfenv", db_getfenv}, + {"gethook", db_gethook}, + {"getinfo", db_getinfo}, + {"getlocal", db_getlocal}, + {"getregistry", db_getregistry}, + {"getmetatable", db_getmetatable}, + {"getupvalue", db_getupvalue}, + {"setfenv", db_setfenv}, + {"sethook", db_sethook}, + {"setlocal", db_setlocal}, + {"setmetatable", db_setmetatable}, + {"setupvalue", db_setupvalue}, + {"traceback", db_errorfb}, + {NULL, NULL} +}; + + +LUALIB_API int luaopen_debug (lua_State *L) { + luaL_register(L, LUA_DBLIBNAME, dblib); + return 1; +} + diff --git a/user/lua-5.1.4/src/ldblib.o b/user/lua-5.1.4/src/ldblib.o new file mode 100644 index 0000000000000000000000000000000000000000..51e1ef468b4fa0222f7a88ca1dbfef9541129989 GIT binary patch literal 10524 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 literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/ldebug.c b/user/lua-5.1.4/src/ldebug.c new file mode 100644 index 0000000..50ad3d3 --- /dev/null +++ b/user/lua-5.1.4/src/ldebug.c @@ -0,0 +1,638 @@ +/* +** $Id: ldebug.c,v 2.29.1.6 2008/05/08 16:56:26 roberto Exp $ +** Debug Interface +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include + + +#define ldebug_c +#define LUA_CORE + +#include "lua.h" + +#include "lapi.h" +#include "lcode.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lvm.h" + + + +static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name); + + +static int currentpc (lua_State *L, CallInfo *ci) { + if (!isLua(ci)) return -1; /* function is not a Lua function? */ + if (ci == L->ci) + ci->savedpc = L->savedpc; + return pcRel(ci->savedpc, ci_func(ci)->l.p); +} + + +static int currentline (lua_State *L, CallInfo *ci) { + int pc = currentpc(L, ci); + if (pc < 0) + return -1; /* only active lua functions have current-line information */ + else + return getline(ci_func(ci)->l.p, pc); +} + + +/* +** this function can be called asynchronous (e.g. during a signal) +*/ +LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count) { + if (func == NULL || mask == 0) { /* turn off hooks? */ + mask = 0; + func = NULL; + } + L->hook = func; + L->basehookcount = count; + resethookcount(L); + L->hookmask = cast_byte(mask); + return 1; +} + + +LUA_API lua_Hook lua_gethook (lua_State *L) { + return L->hook; +} + + +LUA_API int lua_gethookmask (lua_State *L) { + return L->hookmask; +} + + +LUA_API int lua_gethookcount (lua_State *L) { + return L->basehookcount; +} + + +LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) { + int status; + CallInfo *ci; + lua_lock(L); + for (ci = L->ci; level > 0 && ci > L->base_ci; ci--) { + level--; + if (f_isLua(ci)) /* Lua function? */ + level -= ci->tailcalls; /* skip lost tail calls */ + } + if (level == 0 && ci > L->base_ci) { /* level found? */ + status = 1; + ar->i_ci = cast_int(ci - L->base_ci); + } + else if (level < 0) { /* level is of a lost tail call? */ + status = 1; + ar->i_ci = 0; + } + else status = 0; /* no such level */ + lua_unlock(L); + return status; +} + + +static Proto *getluaproto (CallInfo *ci) { + return (isLua(ci) ? ci_func(ci)->l.p : NULL); +} + + +static const char *findlocal (lua_State *L, CallInfo *ci, int n) { + const char *name; + Proto *fp = getluaproto(ci); + if (fp && (name = luaF_getlocalname(fp, n, currentpc(L, ci))) != NULL) + return name; /* is a local variable in a Lua function */ + else { + StkId limit = (ci == L->ci) ? L->top : (ci+1)->func; + if (limit - ci->base >= n && n > 0) /* is 'n' inside 'ci' stack? */ + return "(*temporary)"; + else + return NULL; + } +} + + +LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { + CallInfo *ci = L->base_ci + ar->i_ci; + const char *name = findlocal(L, ci, n); + lua_lock(L); + if (name) + luaA_pushobject(L, ci->base + (n - 1)); + lua_unlock(L); + return name; +} + + +LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { + CallInfo *ci = L->base_ci + ar->i_ci; + const char *name = findlocal(L, ci, n); + lua_lock(L); + if (name) + setobjs2s(L, ci->base + (n - 1), L->top - 1); + L->top--; /* pop value */ + lua_unlock(L); + return name; +} + + +static void funcinfo (lua_Debug *ar, Closure *cl) { + if (cl->c.isC) { + ar->source = "=[C]"; + ar->linedefined = -1; + ar->lastlinedefined = -1; + ar->what = "C"; + } + else { + ar->source = getstr(cl->l.p->source); + ar->linedefined = cl->l.p->linedefined; + ar->lastlinedefined = cl->l.p->lastlinedefined; + ar->what = (ar->linedefined == 0) ? "main" : "Lua"; + } + luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE); +} + + +static void info_tailcall (lua_Debug *ar) { + ar->name = ar->namewhat = ""; + ar->what = "tail"; + ar->lastlinedefined = ar->linedefined = ar->currentline = -1; + ar->source = "=(tail call)"; + luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE); + ar->nups = 0; +} + + +static void collectvalidlines (lua_State *L, Closure *f) { + if (f == NULL || f->c.isC) { + setnilvalue(L->top); + } + else { + Table *t = luaH_new(L, 0, 0); + int *lineinfo = f->l.p->lineinfo; + int i; + for (i=0; il.p->sizelineinfo; i++) + setbvalue(luaH_setnum(L, t, lineinfo[i]), 1); + sethvalue(L, L->top, t); + } + incr_top(L); +} + + +static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, + Closure *f, CallInfo *ci) { + int status = 1; + if (f == NULL) { + info_tailcall(ar); + return status; + } + for (; *what; what++) { + switch (*what) { + case 'S': { + funcinfo(ar, f); + break; + } + case 'l': { + ar->currentline = (ci) ? currentline(L, ci) : -1; + break; + } + case 'u': { + ar->nups = f->c.nupvalues; + break; + } + case 'n': { + ar->namewhat = (ci) ? getfuncname(L, ci, &ar->name) : NULL; + if (ar->namewhat == NULL) { + ar->namewhat = ""; /* not found */ + ar->name = NULL; + } + break; + } + case 'L': + case 'f': /* handled by lua_getinfo */ + break; + default: status = 0; /* invalid option */ + } + } + return status; +} + + +LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { + int status; + Closure *f = NULL; + CallInfo *ci = NULL; + lua_lock(L); + if (*what == '>') { + StkId func = L->top - 1; + luai_apicheck(L, ttisfunction(func)); + what++; /* skip the '>' */ + f = clvalue(func); + L->top--; /* pop function */ + } + else if (ar->i_ci != 0) { /* no tail call? */ + ci = L->base_ci + ar->i_ci; + lua_assert(ttisfunction(ci->func)); + f = clvalue(ci->func); + } + status = auxgetinfo(L, what, ar, f, ci); + if (strchr(what, 'f')) { + if (f == NULL) setnilvalue(L->top); + else setclvalue(L, L->top, f); + incr_top(L); + } + if (strchr(what, 'L')) + collectvalidlines(L, f); + lua_unlock(L); + return status; +} + + +/* +** {====================================================== +** Symbolic Execution and code checker +** ======================================================= +*/ + +#define check(x) if (!(x)) return 0; + +#define checkjump(pt,pc) check(0 <= pc && pc < pt->sizecode) + +#define checkreg(pt,reg) check((reg) < (pt)->maxstacksize) + + + +static int precheck (const Proto *pt) { + check(pt->maxstacksize <= MAXSTACK); + check(pt->numparams+(pt->is_vararg & VARARG_HASARG) <= pt->maxstacksize); + check(!(pt->is_vararg & VARARG_NEEDSARG) || + (pt->is_vararg & VARARG_HASARG)); + check(pt->sizeupvalues <= pt->nups); + check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0); + check(pt->sizecode > 0 && GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN); + return 1; +} + + +#define checkopenop(pt,pc) luaG_checkopenop((pt)->code[(pc)+1]) + +int luaG_checkopenop (Instruction i) { + switch (GET_OPCODE(i)) { + case OP_CALL: + case OP_TAILCALL: + case OP_RETURN: + case OP_SETLIST: { + check(GETARG_B(i) == 0); + return 1; + } + default: return 0; /* invalid instruction after an open call */ + } +} + + +static int checkArgMode (const Proto *pt, int r, enum OpArgMask mode) { + switch (mode) { + case OpArgN: check(r == 0); break; + case OpArgU: break; + case OpArgR: checkreg(pt, r); break; + case OpArgK: + check(ISK(r) ? INDEXK(r) < pt->sizek : r < pt->maxstacksize); + break; + } + return 1; +} + + +static Instruction symbexec (const Proto *pt, int lastpc, int reg) { + int pc; + int last; /* stores position of last instruction that changed `reg' */ + last = pt->sizecode-1; /* points to final return (a `neutral' instruction) */ + check(precheck(pt)); + for (pc = 0; pc < lastpc; pc++) { + Instruction i = pt->code[pc]; + OpCode op = GET_OPCODE(i); + int a = GETARG_A(i); + int b = 0; + int c = 0; + check(op < NUM_OPCODES); + checkreg(pt, a); + switch (getOpMode(op)) { + case iABC: { + b = GETARG_B(i); + c = GETARG_C(i); + check(checkArgMode(pt, b, getBMode(op))); + check(checkArgMode(pt, c, getCMode(op))); + break; + } + case iABx: { + b = GETARG_Bx(i); + if (getBMode(op) == OpArgK) check(b < pt->sizek); + break; + } + case iAsBx: { + b = GETARG_sBx(i); + if (getBMode(op) == OpArgR) { + int dest = pc+1+b; + check(0 <= dest && dest < pt->sizecode); + if (dest > 0) { + int j; + /* check that it does not jump to a setlist count; this + is tricky, because the count from a previous setlist may + have the same value of an invalid setlist; so, we must + go all the way back to the first of them (if any) */ + for (j = 0; j < dest; j++) { + Instruction d = pt->code[dest-1-j]; + if (!(GET_OPCODE(d) == OP_SETLIST && GETARG_C(d) == 0)) break; + } + /* if 'j' is even, previous value is not a setlist (even if + it looks like one) */ + check((j&1) == 0); + } + } + break; + } + } + if (testAMode(op)) { + if (a == reg) last = pc; /* change register `a' */ + } + if (testTMode(op)) { + check(pc+2 < pt->sizecode); /* check skip */ + check(GET_OPCODE(pt->code[pc+1]) == OP_JMP); + } + switch (op) { + case OP_LOADBOOL: { + if (c == 1) { /* does it jump? */ + check(pc+2 < pt->sizecode); /* check its jump */ + check(GET_OPCODE(pt->code[pc+1]) != OP_SETLIST || + GETARG_C(pt->code[pc+1]) != 0); + } + break; + } + case OP_LOADNIL: { + if (a <= reg && reg <= b) + last = pc; /* set registers from `a' to `b' */ + break; + } + case OP_GETUPVAL: + case OP_SETUPVAL: { + check(b < pt->nups); + break; + } + case OP_GETGLOBAL: + case OP_SETGLOBAL: { + check(ttisstring(&pt->k[b])); + break; + } + case OP_SELF: { + checkreg(pt, a+1); + if (reg == a+1) last = pc; + break; + } + case OP_CONCAT: { + check(b < c); /* at least two operands */ + break; + } + case OP_TFORLOOP: { + check(c >= 1); /* at least one result (control variable) */ + checkreg(pt, a+2+c); /* space for results */ + if (reg >= a+2) last = pc; /* affect all regs above its base */ + break; + } + case OP_FORLOOP: + case OP_FORPREP: + checkreg(pt, a+3); + /* go through */ + case OP_JMP: { + int dest = pc+1+b; + /* not full check and jump is forward and do not skip `lastpc'? */ + if (reg != NO_REG && pc < dest && dest <= lastpc) + pc += b; /* do the jump */ + break; + } + case OP_CALL: + case OP_TAILCALL: { + if (b != 0) { + checkreg(pt, a+b-1); + } + c--; /* c = num. returns */ + if (c == LUA_MULTRET) { + check(checkopenop(pt, pc)); + } + else if (c != 0) + checkreg(pt, a+c-1); + if (reg >= a) last = pc; /* affect all registers above base */ + break; + } + case OP_RETURN: { + b--; /* b = num. returns */ + if (b > 0) checkreg(pt, a+b-1); + break; + } + case OP_SETLIST: { + if (b > 0) checkreg(pt, a + b); + if (c == 0) { + pc++; + check(pc < pt->sizecode - 1); + } + break; + } + case OP_CLOSURE: { + int nup, j; + check(b < pt->sizep); + nup = pt->p[b]->nups; + check(pc + nup < pt->sizecode); + for (j = 1; j <= nup; j++) { + OpCode op1 = GET_OPCODE(pt->code[pc + j]); + check(op1 == OP_GETUPVAL || op1 == OP_MOVE); + } + if (reg != NO_REG) /* tracing? */ + pc += nup; /* do not 'execute' these pseudo-instructions */ + break; + } + case OP_VARARG: { + check((pt->is_vararg & VARARG_ISVARARG) && + !(pt->is_vararg & VARARG_NEEDSARG)); + b--; + if (b == LUA_MULTRET) check(checkopenop(pt, pc)); + checkreg(pt, a+b-1); + break; + } + default: break; + } + } + return pt->code[last]; +} + +#undef check +#undef checkjump +#undef checkreg + +/* }====================================================== */ + + +int luaG_checkcode (const Proto *pt) { + return (symbexec(pt, pt->sizecode, NO_REG) != 0); +} + + +static const char *kname (Proto *p, int c) { + if (ISK(c) && ttisstring(&p->k[INDEXK(c)])) + return svalue(&p->k[INDEXK(c)]); + else + return "?"; +} + + +static const char *getobjname (lua_State *L, CallInfo *ci, int stackpos, + const char **name) { + if (isLua(ci)) { /* a Lua function? */ + Proto *p = ci_func(ci)->l.p; + int pc = currentpc(L, ci); + Instruction i; + *name = luaF_getlocalname(p, stackpos+1, pc); + if (*name) /* is a local? */ + return "local"; + i = symbexec(p, pc, stackpos); /* try symbolic execution */ + lua_assert(pc != -1); + switch (GET_OPCODE(i)) { + case OP_GETGLOBAL: { + int g = GETARG_Bx(i); /* global index */ + lua_assert(ttisstring(&p->k[g])); + *name = svalue(&p->k[g]); + return "global"; + } + case OP_MOVE: { + int a = GETARG_A(i); + int b = GETARG_B(i); /* move from `b' to `a' */ + if (b < a) + return getobjname(L, ci, b, name); /* get name for `b' */ + break; + } + case OP_GETTABLE: { + int k = GETARG_C(i); /* key index */ + *name = kname(p, k); + return "field"; + } + case OP_GETUPVAL: { + int u = GETARG_B(i); /* upvalue index */ + *name = p->upvalues ? getstr(p->upvalues[u]) : "?"; + return "upvalue"; + } + case OP_SELF: { + int k = GETARG_C(i); /* key index */ + *name = kname(p, k); + return "method"; + } + default: break; + } + } + return NULL; /* no useful name found */ +} + + +static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) { + Instruction i; + if ((isLua(ci) && ci->tailcalls > 0) || !isLua(ci - 1)) + return NULL; /* calling function is not Lua (or is unknown) */ + ci--; /* calling function */ + i = ci_func(ci)->l.p->code[currentpc(L, ci)]; + if (GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL || + GET_OPCODE(i) == OP_TFORLOOP) + return getobjname(L, ci, GETARG_A(i), name); + else + return NULL; /* no useful name can be found */ +} + + +/* only ANSI way to check whether a pointer points to an array */ +static int isinstack (CallInfo *ci, const TValue *o) { + StkId p; + for (p = ci->base; p < ci->top; p++) + if (o == p) return 1; + return 0; +} + + +void luaG_typeerror (lua_State *L, const TValue *o, const char *op) { + const char *name = NULL; + const char *t = luaT_typenames[ttype(o)]; + const char *kind = (isinstack(L->ci, o)) ? + getobjname(L, L->ci, cast_int(o - L->base), &name) : + NULL; + if (kind) + luaG_runerror(L, "attempt to %s %s " LUA_QS " (a %s value)", + op, kind, name, t); + else + luaG_runerror(L, "attempt to %s a %s value", op, t); +} + + +void luaG_concaterror (lua_State *L, StkId p1, StkId p2) { + if (ttisstring(p1) || ttisnumber(p1)) p1 = p2; + lua_assert(!ttisstring(p1) && !ttisnumber(p1)); + luaG_typeerror(L, p1, "concatenate"); +} + + +void luaG_aritherror (lua_State *L, const TValue *p1, const TValue *p2) { + TValue temp; + if (luaV_tonumber(p1, &temp) == NULL) + p2 = p1; /* first operand is wrong */ + luaG_typeerror(L, p2, "perform arithmetic on"); +} + + +int luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) { + const char *t1 = luaT_typenames[ttype(p1)]; + const char *t2 = luaT_typenames[ttype(p2)]; + if (t1[2] == t2[2]) + luaG_runerror(L, "attempt to compare two %s values", t1); + else + luaG_runerror(L, "attempt to compare %s with %s", t1, t2); + return 0; +} + + +static void addinfo (lua_State *L, const char *msg) { + CallInfo *ci = L->ci; + if (isLua(ci)) { /* is Lua code? */ + char buff[LUA_IDSIZE]; /* add file:line information */ + int line = currentline(L, ci); + luaO_chunkid(buff, getstr(getluaproto(ci)->source), LUA_IDSIZE); + luaO_pushfstring(L, "%s:%d: %s", buff, line, msg); + } +} + + +void luaG_errormsg (lua_State *L) { + if (L->errfunc != 0) { /* is there an error handling function? */ + StkId errfunc = restorestack(L, L->errfunc); + if (!ttisfunction(errfunc)) luaD_throw(L, LUA_ERRERR); + setobjs2s(L, L->top, L->top - 1); /* move argument */ + setobjs2s(L, L->top - 1, errfunc); /* push function */ + incr_top(L); + luaD_call(L, L->top - 2, 1); /* call it */ + } + luaD_throw(L, LUA_ERRRUN); +} + + +void luaG_runerror (lua_State *L, const char *fmt, ...) { + va_list argp; + va_start(argp, fmt); + addinfo(L, luaO_pushvfstring(L, fmt, argp)); + va_end(argp); + luaG_errormsg(L); +} + diff --git a/user/lua-5.1.4/src/ldebug.h b/user/lua-5.1.4/src/ldebug.h new file mode 100644 index 0000000..ba28a97 --- /dev/null +++ b/user/lua-5.1.4/src/ldebug.h @@ -0,0 +1,33 @@ +/* +** $Id: ldebug.h,v 2.3.1.1 2007/12/27 13:02:25 roberto Exp $ +** Auxiliary functions from Debug Interface module +** See Copyright Notice in lua.h +*/ + +#ifndef ldebug_h +#define ldebug_h + + +#include "lstate.h" + + +#define pcRel(pc, p) (cast(int, (pc) - (p)->code) - 1) + +#define getline(f,pc) (((f)->lineinfo) ? (f)->lineinfo[pc] : 0) + +#define resethookcount(L) (L->hookcount = L->basehookcount) + + +LUAI_FUNC void luaG_typeerror (lua_State *L, const TValue *o, + const char *opname); +LUAI_FUNC void luaG_concaterror (lua_State *L, StkId p1, StkId p2); +LUAI_FUNC void luaG_aritherror (lua_State *L, const TValue *p1, + const TValue *p2); +LUAI_FUNC int luaG_ordererror (lua_State *L, const TValue *p1, + const TValue *p2); +LUAI_FUNC void luaG_runerror (lua_State *L, const char *fmt, ...); +LUAI_FUNC void luaG_errormsg (lua_State *L); +LUAI_FUNC int luaG_checkcode (const Proto *pt); +LUAI_FUNC int luaG_checkopenop (Instruction i); + +#endif diff --git a/user/lua-5.1.4/src/ldebug.o b/user/lua-5.1.4/src/ldebug.o new file mode 100644 index 0000000000000000000000000000000000000000..f9b19bd3e38dc7e30e0393218290c19b14309abb GIT binary patch literal 8820 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 literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/ldo.c b/user/lua-5.1.4/src/ldo.c new file mode 100644 index 0000000..8de05f7 --- /dev/null +++ b/user/lua-5.1.4/src/ldo.c @@ -0,0 +1,518 @@ +/* +** $Id: ldo.c,v 2.38.1.3 2008/01/18 22:31:22 roberto Exp $ +** Stack and Call structure of Lua +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include + +#define ldo_c +#define LUA_CORE + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lundump.h" +#include "lvm.h" +#include "lzio.h" + + + + +/* +** {====================================================== +** Error-recovery functions +** ======================================================= +*/ + + +/* chain list of long jump buffers */ +struct lua_longjmp { + struct lua_longjmp *previous; + luai_jmpbuf b; + volatile int status; /* error code */ +}; + + +void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) { + switch (errcode) { + case LUA_ERRMEM: { + setsvalue2s(L, oldtop, luaS_newliteral(L, MEMERRMSG)); + break; + } + case LUA_ERRERR: { + setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling")); + break; + } + case LUA_ERRSYNTAX: + case LUA_ERRRUN: { + setobjs2s(L, oldtop, L->top - 1); /* error message on current top */ + break; + } + } + L->top = oldtop + 1; +} + + +static void restore_stack_limit (lua_State *L) { + lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1); + if (L->size_ci > LUAI_MAXCALLS) { /* there was an overflow? */ + int inuse = cast_int(L->ci - L->base_ci); + if (inuse + 1 < LUAI_MAXCALLS) /* can `undo' overflow? */ + luaD_reallocCI(L, LUAI_MAXCALLS); + } +} + + +static void resetstack (lua_State *L, int status) { + L->ci = L->base_ci; + L->base = L->ci->base; + luaF_close(L, L->base); /* close eventual pending closures */ + luaD_seterrorobj(L, status, L->base); + L->nCcalls = L->baseCcalls; + L->allowhook = 1; + restore_stack_limit(L); + L->errfunc = 0; + L->errorJmp = NULL; +} + + +void luaD_throw (lua_State *L, int errcode) { + if (L->errorJmp) { + L->errorJmp->status = errcode; + LUAI_THROW(L, L->errorJmp); + } + else { + L->status = cast_byte(errcode); + if (G(L)->panic) { + resetstack(L, errcode); + lua_unlock(L); + G(L)->panic(L); + } + exit(EXIT_FAILURE); + } +} + + +int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { + struct lua_longjmp lj; + lj.status = 0; + lj.previous = L->errorJmp; /* chain new error handler */ + L->errorJmp = &lj; + LUAI_TRY(L, &lj, + (*f)(L, ud); + ); + L->errorJmp = lj.previous; /* restore old error handler */ + return lj.status; +} + +/* }====================================================== */ + + +static void correctstack (lua_State *L, TValue *oldstack) { + CallInfo *ci; + GCObject *up; + L->top = (L->top - oldstack) + L->stack; + for (up = L->openupval; up != NULL; up = up->gch.next) + gco2uv(up)->v = (gco2uv(up)->v - oldstack) + L->stack; + for (ci = L->base_ci; ci <= L->ci; ci++) { + ci->top = (ci->top - oldstack) + L->stack; + ci->base = (ci->base - oldstack) + L->stack; + ci->func = (ci->func - oldstack) + L->stack; + } + L->base = (L->base - oldstack) + L->stack; +} + + +void luaD_reallocstack (lua_State *L, int newsize) { + TValue *oldstack = L->stack; + int realsize = newsize + 1 + EXTRA_STACK; + lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1); + luaM_reallocvector(L, L->stack, L->stacksize, realsize, TValue); + L->stacksize = realsize; + L->stack_last = L->stack+newsize; + correctstack(L, oldstack); +} + + +void luaD_reallocCI (lua_State *L, int newsize) { + CallInfo *oldci = L->base_ci; + luaM_reallocvector(L, L->base_ci, L->size_ci, newsize, CallInfo); + L->size_ci = newsize; + L->ci = (L->ci - oldci) + L->base_ci; + L->end_ci = L->base_ci + L->size_ci - 1; +} + + +void luaD_growstack (lua_State *L, int n) { + if (n <= L->stacksize) /* double size is enough? */ + luaD_reallocstack(L, 2*L->stacksize); + else + luaD_reallocstack(L, L->stacksize + n); +} + + +static CallInfo *growCI (lua_State *L) { + if (L->size_ci > LUAI_MAXCALLS) /* overflow while handling overflow? */ + luaD_throw(L, LUA_ERRERR); + else { + luaD_reallocCI(L, 2*L->size_ci); + if (L->size_ci > LUAI_MAXCALLS) + luaG_runerror(L, "stack overflow"); + } + return ++L->ci; +} + + +void luaD_callhook (lua_State *L, int event, int line) { + lua_Hook hook = L->hook; + if (hook && L->allowhook) { + ptrdiff_t top = savestack(L, L->top); + ptrdiff_t ci_top = savestack(L, L->ci->top); + lua_Debug ar; + ar.event = event; + ar.currentline = line; + if (event == LUA_HOOKTAILRET) + ar.i_ci = 0; /* tail call; no debug information about it */ + else + ar.i_ci = cast_int(L->ci - L->base_ci); + luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ + L->ci->top = L->top + LUA_MINSTACK; + lua_assert(L->ci->top <= L->stack_last); + L->allowhook = 0; /* cannot call hooks inside a hook */ + lua_unlock(L); + (*hook)(L, &ar); + lua_lock(L); + lua_assert(!L->allowhook); + L->allowhook = 1; + L->ci->top = restorestack(L, ci_top); + L->top = restorestack(L, top); + } +} + + +static StkId adjust_varargs (lua_State *L, Proto *p, int actual) { + int i; + int nfixargs = p->numparams; + Table *htab = NULL; + StkId base, fixed; + for (; actual < nfixargs; ++actual) + setnilvalue(L->top++); +#if defined(LUA_COMPAT_VARARG) + if (p->is_vararg & VARARG_NEEDSARG) { /* compat. with old-style vararg? */ + int nvar = actual - nfixargs; /* number of extra arguments */ + lua_assert(p->is_vararg & VARARG_HASARG); + luaC_checkGC(L); + htab = luaH_new(L, nvar, 1); /* create `arg' table */ + for (i=0; itop - nvar + i); + /* store counter in field `n' */ + setnvalue(luaH_setstr(L, htab, luaS_newliteral(L, "n")), cast_num(nvar)); + } +#endif + /* move fixed parameters to final position */ + fixed = L->top - actual; /* first fixed argument */ + base = L->top; /* final position of first argument */ + for (i=0; itop++, fixed+i); + setnilvalue(fixed+i); + } + /* add `arg' parameter */ + if (htab) { + sethvalue(L, L->top++, htab); + lua_assert(iswhite(obj2gco(htab))); + } + return base; +} + + +static StkId tryfuncTM (lua_State *L, StkId func) { + const TValue *tm = luaT_gettmbyobj(L, func, TM_CALL); + StkId p; + ptrdiff_t funcr = savestack(L, func); + if (!ttisfunction(tm)) + luaG_typeerror(L, func, "call"); + /* Open a hole inside the stack at `func' */ + for (p = L->top; p > func; p--) setobjs2s(L, p, p-1); + incr_top(L); + func = restorestack(L, funcr); /* previous call may change stack */ + setobj2s(L, func, tm); /* tag method is the new function to be called */ + return func; +} + + + +#define inc_ci(L) \ + ((L->ci == L->end_ci) ? growCI(L) : \ + (condhardstacktests(luaD_reallocCI(L, L->size_ci)), ++L->ci)) + + +int luaD_precall (lua_State *L, StkId func, int nresults) { + LClosure *cl; + ptrdiff_t funcr; + if (!ttisfunction(func)) /* `func' is not a function? */ + func = tryfuncTM(L, func); /* check the `function' tag method */ + funcr = savestack(L, func); + cl = &clvalue(func)->l; + L->ci->savedpc = L->savedpc; + if (!cl->isC) { /* Lua function? prepare its call */ + CallInfo *ci; + StkId st, base; + Proto *p = cl->p; + luaD_checkstack(L, p->maxstacksize); + func = restorestack(L, funcr); + if (!p->is_vararg) { /* no varargs? */ + base = func + 1; + if (L->top > base + p->numparams) + L->top = base + p->numparams; + } + else { /* vararg function */ + int nargs = cast_int(L->top - func) - 1; + base = adjust_varargs(L, p, nargs); + func = restorestack(L, funcr); /* previous call may change the stack */ + } + ci = inc_ci(L); /* now `enter' new function */ + ci->func = func; + L->base = ci->base = base; + ci->top = L->base + p->maxstacksize; + lua_assert(ci->top <= L->stack_last); + L->savedpc = p->code; /* starting point */ + ci->tailcalls = 0; + ci->nresults = nresults; + for (st = L->top; st < ci->top; st++) + setnilvalue(st); + L->top = ci->top; + if (L->hookmask & LUA_MASKCALL) { + L->savedpc++; /* hooks assume 'pc' is already incremented */ + luaD_callhook(L, LUA_HOOKCALL, -1); + L->savedpc--; /* correct 'pc' */ + } + return PCRLUA; + } + else { /* if is a C function, call it */ + CallInfo *ci; + int n; + luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ + ci = inc_ci(L); /* now `enter' new function */ + ci->func = restorestack(L, funcr); + L->base = ci->base = ci->func + 1; + ci->top = L->top + LUA_MINSTACK; + lua_assert(ci->top <= L->stack_last); + ci->nresults = nresults; + if (L->hookmask & LUA_MASKCALL) + luaD_callhook(L, LUA_HOOKCALL, -1); + lua_unlock(L); + n = (*curr_func(L)->c.f)(L); /* do the actual call */ + lua_lock(L); + if (n < 0) /* yielding? */ + return PCRYIELD; + else { + luaD_poscall(L, L->top - n); + return PCRC; + } + } +} + + +static StkId callrethooks (lua_State *L, StkId firstResult) { + ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */ + luaD_callhook(L, LUA_HOOKRET, -1); + if (f_isLua(L->ci)) { /* Lua function? */ + while ((L->hookmask & LUA_MASKRET) && L->ci->tailcalls--) /* tail calls */ + luaD_callhook(L, LUA_HOOKTAILRET, -1); + } + return restorestack(L, fr); +} + + +int luaD_poscall (lua_State *L, StkId firstResult) { + StkId res; + int wanted, i; + CallInfo *ci; + if (L->hookmask & LUA_MASKRET) + firstResult = callrethooks(L, firstResult); + ci = L->ci--; + res = ci->func; /* res == final position of 1st result */ + wanted = ci->nresults; + L->base = (ci - 1)->base; /* restore base */ + L->savedpc = (ci - 1)->savedpc; /* restore savedpc */ + /* move results to correct place */ + for (i = wanted; i != 0 && firstResult < L->top; i--) + setobjs2s(L, res++, firstResult++); + while (i-- > 0) + setnilvalue(res++); + L->top = res; + return (wanted - LUA_MULTRET); /* 0 iff wanted == LUA_MULTRET */ +} + + +/* +** Call a function (C or Lua). The function to be called is at *func. +** The arguments are on the stack, right after the function. +** When returns, all the results are on the stack, starting at the original +** function position. +*/ +void luaD_call (lua_State *L, StkId func, int nResults) { + if (++L->nCcalls >= LUAI_MAXCCALLS) { + if (L->nCcalls == LUAI_MAXCCALLS) + luaG_runerror(L, "C stack overflow"); + else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3))) + luaD_throw(L, LUA_ERRERR); /* error while handing stack error */ + } + if (luaD_precall(L, func, nResults) == PCRLUA) /* is a Lua function? */ + luaV_execute(L, 1); /* call it */ + L->nCcalls--; + luaC_checkGC(L); +} + + +static void resume (lua_State *L, void *ud) { + StkId firstArg = cast(StkId, ud); + CallInfo *ci = L->ci; + if (L->status == 0) { /* start coroutine? */ + lua_assert(ci == L->base_ci && firstArg > L->base); + if (luaD_precall(L, firstArg - 1, LUA_MULTRET) != PCRLUA) + return; + } + else { /* resuming from previous yield */ + lua_assert(L->status == LUA_YIELD); + L->status = 0; + if (!f_isLua(ci)) { /* `common' yield? */ + /* finish interrupted execution of `OP_CALL' */ + lua_assert(GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_CALL || + GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_TAILCALL); + if (luaD_poscall(L, firstArg)) /* complete it... */ + L->top = L->ci->top; /* and correct top if not multiple results */ + } + else /* yielded inside a hook: just continue its execution */ + L->base = L->ci->base; + } + luaV_execute(L, cast_int(L->ci - L->base_ci)); +} + + +static int resume_error (lua_State *L, const char *msg) { + L->top = L->ci->base; + setsvalue2s(L, L->top, luaS_new(L, msg)); + incr_top(L); + lua_unlock(L); + return LUA_ERRRUN; +} + + +LUA_API int lua_resume (lua_State *L, int nargs) { + int status; + lua_lock(L); + if (L->status != LUA_YIELD && (L->status != 0 || L->ci != L->base_ci)) + return resume_error(L, "cannot resume non-suspended coroutine"); + if (L->nCcalls >= LUAI_MAXCCALLS) + return resume_error(L, "C stack overflow"); + luai_userstateresume(L, nargs); + lua_assert(L->errfunc == 0); + L->baseCcalls = ++L->nCcalls; + status = luaD_rawrunprotected(L, resume, L->top - nargs); + if (status != 0) { /* error? */ + L->status = cast_byte(status); /* mark thread as `dead' */ + luaD_seterrorobj(L, status, L->top); + L->ci->top = L->top; + } + else { + lua_assert(L->nCcalls == L->baseCcalls); + status = L->status; + } + --L->nCcalls; + lua_unlock(L); + return status; +} + + +LUA_API int lua_yield (lua_State *L, int nresults) { + luai_userstateyield(L, nresults); + lua_lock(L); + if (L->nCcalls > L->baseCcalls) + luaG_runerror(L, "attempt to yield across metamethod/C-call boundary"); + L->base = L->top - nresults; /* protect stack slots below */ + L->status = LUA_YIELD; + lua_unlock(L); + return -1; +} + + +int luaD_pcall (lua_State *L, Pfunc func, void *u, + ptrdiff_t old_top, ptrdiff_t ef) { + int status; + unsigned short oldnCcalls = L->nCcalls; + ptrdiff_t old_ci = saveci(L, L->ci); + lu_byte old_allowhooks = L->allowhook; + ptrdiff_t old_errfunc = L->errfunc; + L->errfunc = ef; + status = luaD_rawrunprotected(L, func, u); + if (status != 0) { /* an error occurred? */ + StkId oldtop = restorestack(L, old_top); + luaF_close(L, oldtop); /* close eventual pending closures */ + luaD_seterrorobj(L, status, oldtop); + L->nCcalls = oldnCcalls; + L->ci = restoreci(L, old_ci); + L->base = L->ci->base; + L->savedpc = L->ci->savedpc; + L->allowhook = old_allowhooks; + restore_stack_limit(L); + } + L->errfunc = old_errfunc; + return status; +} + + + +/* +** Execute a protected parser. +*/ +struct SParser { /* data to `f_parser' */ + ZIO *z; + Mbuffer buff; /* buffer to be used by the scanner */ + const char *name; +}; + +static void f_parser (lua_State *L, void *ud) { + int i; + Proto *tf; + Closure *cl; + struct SParser *p = cast(struct SParser *, ud); + int c = luaZ_lookahead(p->z); + luaC_checkGC(L); + tf = ((c == LUA_SIGNATURE[0]) ? luaU_undump : luaY_parser)(L, p->z, + &p->buff, p->name); + cl = luaF_newLclosure(L, tf->nups, hvalue(gt(L))); + cl->l.p = tf; + for (i = 0; i < tf->nups; i++) /* initialize eventual upvalues */ + cl->l.upvals[i] = luaF_newupval(L); + setclvalue(L, L->top, cl); + incr_top(L); +} + + +int luaD_protectedparser (lua_State *L, ZIO *z, const char *name) { + struct SParser p; + int status; + p.z = z; p.name = name; + luaZ_initbuffer(L, &p.buff); + status = luaD_pcall(L, f_parser, &p, savestack(L, L->top), L->errfunc); + luaZ_freebuffer(L, &p.buff); + return status; +} + + diff --git a/user/lua-5.1.4/src/ldo.h b/user/lua-5.1.4/src/ldo.h new file mode 100644 index 0000000..98fddac --- /dev/null +++ b/user/lua-5.1.4/src/ldo.h @@ -0,0 +1,57 @@ +/* +** $Id: ldo.h,v 2.7.1.1 2007/12/27 13:02:25 roberto Exp $ +** Stack and Call structure of Lua +** See Copyright Notice in lua.h +*/ + +#ifndef ldo_h +#define ldo_h + + +#include "lobject.h" +#include "lstate.h" +#include "lzio.h" + + +#define luaD_checkstack(L,n) \ + if ((char *)L->stack_last - (char *)L->top <= (n)*(int)sizeof(TValue)) \ + luaD_growstack(L, n); \ + else condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1)); + + +#define incr_top(L) {luaD_checkstack(L,1); L->top++;} + +#define savestack(L,p) ((char *)(p) - (char *)L->stack) +#define restorestack(L,n) ((TValue *)((char *)L->stack + (n))) + +#define saveci(L,p) ((char *)(p) - (char *)L->base_ci) +#define restoreci(L,n) ((CallInfo *)((char *)L->base_ci + (n))) + + +/* results from luaD_precall */ +#define PCRLUA 0 /* initiated a call to a Lua function */ +#define PCRC 1 /* did a call to a C function */ +#define PCRYIELD 2 /* C funtion yielded */ + + +/* type of protected functions, to be ran by `runprotected' */ +typedef void (*Pfunc) (lua_State *L, void *ud); + +LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name); +LUAI_FUNC void luaD_callhook (lua_State *L, int event, int line); +LUAI_FUNC int luaD_precall (lua_State *L, StkId func, int nresults); +LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults); +LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u, + ptrdiff_t oldtop, ptrdiff_t ef); +LUAI_FUNC int luaD_poscall (lua_State *L, StkId firstResult); +LUAI_FUNC void luaD_reallocCI (lua_State *L, int newsize); +LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize); +LUAI_FUNC void luaD_growstack (lua_State *L, int n); + +LUAI_FUNC void luaD_throw (lua_State *L, int errcode); +LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud); + +LUAI_FUNC void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop); + +#endif + diff --git a/user/lua-5.1.4/src/ldo.o b/user/lua-5.1.4/src/ldo.o new file mode 100644 index 0000000000000000000000000000000000000000..70dbce11f4222fa936eaa6dfcf1ce49bedc08e5d GIT binary patch literal 6924 zcma)BeQ;CPmA{gOd7&?nD1tg$x=~s;u>-h}IN7*_*5O&k*eEd=nIy!h!j`dvEP16T z^Whl7J~YYg-ACP-wlmw^nP&gk=}y{CJJVe!+hr!UA;@NF>r!vyZoE?`B`J!TDP$;d zfY$pv_q`_zcXoE)j5zPybME=N=i@#z7~E0sa=DoExL65W#2A}iX;G>rs9-9)%VCu; z%-=Jvl<~HC(WdasZIMyEuW8kto3+RKe7U-E4>9qz<(F?SEG(FwzR_9tN7E&ma!xCC zaZP<4s|x~~Gq?GbwliiQv*d}ODn+SSZ2n&`^EP}y&{^gi-vhodz-J~O&+c(b3Y$4^#@3tLar8UUMhC( zyOK}ZSHUwd875vQuLo|M^{y?izWVA4(O=Q`nB%Qz@pG+$r#DvKG~S&z{XX8}H+T2_ z(ezAmtz2L)gbX--%h;6gx^h)$8~Kan9*8kLwWG7NrpWNk{lJRPp4JxQ%6c)Nii~1z zTfQY64zCvb0_L7l?@MpO1=F(&VV0um*Yoft{yd~rTheIRk|scCU2pma#ZzA~{X@KU zt!PzveW3EcjCXHmC&=DbCG&~7`%D=>Q6CUH6-jhW@+TE>S9T)v0j;)Hh-3bmw^G$I zKB7^n{I&7UZBtcvqas!mkQJiQQ$QL$##mX+Tj^hjR@ISNuNr69@7)(c8sI$0Zu%Q$LZsUxrW_s{_O3Lu1T&+?Hb=-$j5cO*-CyjY^ za1~`ERbydyt743)I2b2XLp(TJAO>giK`JvDfJJ|eD;3C8eg=uk-=fT|^^1+%U(VB3 zCfM0VPDsmh^;RX7iWWs^e`bnZ%pk%PwikYJQ>ShbQhDgO z2>E#E8~PFci*-#EqaT-aPkavr$V0QDX>H}`iI1;B%CY1!0(`4t29KZ9Y8agu%4*?P zkPqA?vLvu_zC;UvNk}D?^HAx^@qQ%OrPw2PlcAX>@2FNQ&zsifg0mnpN8RAp>9nL{ zg%FV&`93JI`XBOoG5?T!ZR(Bs$KBrScOgc!`o&g{dGxYq^od=U`7wWXg14$-501M` z|I+4tiq}|yT;S(<=n}s+caL?<=yo;FDt#NpBgTkoeBcuO9^QLhq!oU6p7-9){D%Jw zj_`WQ81qTjVtvta_TsVkcy80%=qpIZ+%|>$F>-3nFEhV4{d-N%(2|XPOdJbPtAtAn zf1aG=fl!VgDP@@!@=OnjMnB9o@-E)!CxsK4HFJ+seM@)!X2U{u1SGwxSg7pdcJY&# z%tb3WmA6Xv1@gcC6Ov%7XYLw5pWh5K%zt@+%wEj*6IaH8i?EUlUMGs!+QqZGiBtZ| zw|1G?XMj4DpB>5gM9_x~GC}<13t?4AR$AKHC4$!{&J5XVWdCm{PG*{Sl(0<|A|3DK z!S_Y5jE85Ci{9b>8m`458(Bx?MPm&)B9j4HSMhZGj?BV2h_Jt;CBTEzv}HH)H9RHR zMR-a$i_%WH>U}NzekX6K7U7w7;n|XwiWB`C15d%_6&NU03tlFG0w&*r*M$~` zUp^%JI+W7da+3Wcv;{1xCifU|wBCvR#P>*qm zCaHRdwbCbC`sYrLpm;R@X01a1lySD4Pw)LnHH5b1@44l)KY0t;l4FNDjS*KT$CZR@ zk6DvZUO>o1=9TUj%%emg6`jVxY8T}0Z96lBHuthtN)}oNqQG4%UUcNJ{yN6o+)syW zGaiy=ymYgWmNH-NxE~3vD?6g!$A9z+c#RPcSt5J9J&3Hj=2xK>Q%BT31MXIVn}p^U z40k5m7Rv~rx@DRZV>tepodwk6$o0X8ASkEBp^xRXE&_07q4}Adr<^oPQFeYKtn0Lj zEiy+Y$h6`dnR{&r{!8MR%jFiD@7)O+&F@B+3fKJv_phx7@CJgjQ6U?kCtN0eFKK9Yf`L9 zcPPAqegO4}+ZfK9YyxIH74Di=_ zkRNoeK0YRga`xikwM8ip8Xc63%f(L7c}O+=yG;MLYR0^O^E(KKMbe?u z*kwBun&yW+V!+2Y@-%9BXH%}0#w8QmRa}*Sl>$YL)?pq1;edo?9hjs zM#yDE8D|b-4XupIr!b9(6JAOWH;otv%RKoqusQd8yvm_f%$6U+I3YcV3>o8Whxz$~ zAkjL-s<7Uq@DOD|-VJK!5Nye>gj{~E@=yGu(FJ$+0^LN+rx$o=9MSR)|Mhl$%{x3% z6B_5CsevXwD#GKGNWm$x%NTRzp0r#XRcj^(f6qS@nQ`y%c@dmJqTMw0H7;|ftMVq& zk0OMToEgVwi+6ZWqw%gM7ra2;c(X(JR}73}@Qcut=^3OifDbFjaEF-GpWq*En&6qq zxn-S0l&^<9W=b_iT|6^`J0R|YM?K=O!XM^Gm7;KmrUoyH%%lik$X?V}<50xF1+$q_ z986T7{BbK4@+%PuIjfvef=kaY|A<@)j;{+&@!%x&vF5tX&A40t8`&A2q*JrQN;~C= zL0R?&4_-J{cW_|x`lcJaZ3gy+X80}RoJ#~R;9^qptisiDl=$KZ6iptnswOkZ8$9U8 zD3k_e@Vsc7aWv2YK26p-#)U56mG3~;gbh;h+ri2IE`w7jJ(hosoSDAt$0W%g!S@8- z6?*>?9CBpjzergnZ@JVDsT<1qbiBWm@?L)!pSMiFpu6NF&&qLze*qw{|92P~hg2S-CORXl`N&VTn@53VdD;4+h z0UymnnuHjMG!puJomTJfj$ysO}UV7D?mlf$hT%zw- ze9g*FS?dc7c}-z2uA8|ZTk)cGnLPG!%)PX@PQ$YhV!Dd}kLr4?r&kZ?$-t5BSiB<; zZBHfB=|E3RkK)&r?D&GVp*OM2xINhL?WpNQn7TVCl*K~6C2W*bZ;!t z5$g!FCsWCc-kpdsVu>Y^nFC!A)|14>SSpoF1-cUf>!mB2=!kbG4lpf{)}!qQ1IfNv zsxzKE#Fn6>o+TLDrfFXcRD}0u5_%?3T~%H6$cE~S#2&4*aK@_AM|$+=en35C!7k@5 z6^mEtvBNs6>WJ!5R<%E!W>u*qA;i6@s`^fJ6RT=Z_VmOO*a2r^Rok8lZ;+-TZvWrs zJ}}Zb(Z?q}wfMEs9JL?k_0zzM|MGL847_OVE3i)c>CR4V?DIBGwM5S=jsOdleDt~w zKjQzt_%?!vs9_sdWrsJ8#;V9!M9U#SpN_Y{cvNEkmSOH7cFLbLU_5$lhWNgp>Bgr-V_3E%jW+F!lCC88~+}l^N@b|S0HHS&91H9Lh_8slx~i-3li6>0A}80n05Oa8h@Z!#^1mE=uD55f1| z6h=q89_wJ_`wNy4;B@%vBcxwy$Ew3@M;UV9IE`6Lz1{^cp*x;T9Dpd&&SHnVb&J}Y ziaAnuM-Ievy=VUsJI>o8`jOsP;T#&saoW^CMkO*mg?IZXS|hQ;vG$B^>y=_z0J-2o zjZ^@-@3DG;3pJ1>97Qxmbl@{Kz6Lqu#{VH4Ac%hauQrSzUupeKg6O|9fG+%>!*2;< z?yW}ObKlF@dV+t!*b4+#Gxice49YhMu0`z-gx){c^fK5+d=&)$lCkBm#f`@Kyba$V zct2y0qAuM5#ySXojs{|b=yJwZ6)`aHo082dYd4>9&bK%)OU z;TY^c#!z$PV)0G + +#define ldump_c +#define LUA_CORE + +#include "lua.h" + +#include "lobject.h" +#include "lstate.h" +#include "lundump.h" + +typedef struct { + lua_State* L; + lua_Writer writer; + void* data; + int strip; + int status; +} DumpState; + +#define DumpMem(b,n,size,D) DumpBlock(b,(n)*(size),D) +#define DumpVar(x,D) DumpMem(&x,1,sizeof(x),D) + +static void DumpBlock(const void* b, size_t size, DumpState* D) +{ + if (D->status==0) + { + lua_unlock(D->L); + D->status=(*D->writer)(D->L,b,size,D->data); + lua_lock(D->L); + } +} + +static void DumpChar(int y, DumpState* D) +{ + char x=(char)y; + DumpVar(x,D); +} + +static void DumpInt(int x, DumpState* D) +{ + DumpVar(x,D); +} + +static void DumpNumber(lua_Number x, DumpState* D) +{ + DumpVar(x,D); +} + +static void DumpVector(const void* b, int n, size_t size, DumpState* D) +{ + DumpInt(n,D); + DumpMem(b,n,size,D); +} + +static void DumpString(const TString* s, DumpState* D) +{ + if (s==NULL || getstr(s)==NULL) + { + size_t size=0; + DumpVar(size,D); + } + else + { + size_t size=s->tsv.len+1; /* include trailing '\0' */ + DumpVar(size,D); + DumpBlock(getstr(s),size,D); + } +} + +#define DumpCode(f,D) DumpVector(f->code,f->sizecode,sizeof(Instruction),D) + +static void DumpFunction(const Proto* f, const TString* p, DumpState* D); + +static void DumpConstants(const Proto* f, DumpState* D) +{ + int i,n=f->sizek; + DumpInt(n,D); + for (i=0; ik[i]; + DumpChar(ttype(o),D); + switch (ttype(o)) + { + case LUA_TNIL: + break; + case LUA_TBOOLEAN: + DumpChar(bvalue(o),D); + break; + case LUA_TNUMBER: + DumpNumber(nvalue(o),D); + break; + case LUA_TSTRING: + DumpString(rawtsvalue(o),D); + break; + default: + lua_assert(0); /* cannot happen */ + break; + } + } + n=f->sizep; + DumpInt(n,D); + for (i=0; ip[i],f->source,D); +} + +static void DumpDebug(const Proto* f, DumpState* D) +{ + int i,n; + n= (D->strip) ? 0 : f->sizelineinfo; + DumpVector(f->lineinfo,n,sizeof(int),D); + n= (D->strip) ? 0 : f->sizelocvars; + DumpInt(n,D); + for (i=0; ilocvars[i].varname,D); + DumpInt(f->locvars[i].startpc,D); + DumpInt(f->locvars[i].endpc,D); + } + n= (D->strip) ? 0 : f->sizeupvalues; + DumpInt(n,D); + for (i=0; iupvalues[i],D); +} + +static void DumpFunction(const Proto* f, const TString* p, DumpState* D) +{ + DumpString((f->source==p || D->strip) ? NULL : f->source,D); + DumpInt(f->linedefined,D); + DumpInt(f->lastlinedefined,D); + DumpChar(f->nups,D); + DumpChar(f->numparams,D); + DumpChar(f->is_vararg,D); + DumpChar(f->maxstacksize,D); + DumpCode(f,D); + DumpConstants(f,D); + DumpDebug(f,D); +} + +static void DumpHeader(DumpState* D) +{ + char h[LUAC_HEADERSIZE]; + luaU_header(h); + DumpBlock(h,LUAC_HEADERSIZE,D); +} + +/* +** dump Lua function as precompiled chunk +*/ +int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip) +{ + DumpState D; + D.L=L; + D.writer=w; + D.data=data; + D.strip=strip; + D.status=0; + DumpHeader(&D); + DumpFunction(f,NULL,&D); + return D.status; +} diff --git a/user/lua-5.1.4/src/ldump.o b/user/lua-5.1.4/src/ldump.o new file mode 100644 index 0000000000000000000000000000000000000000..653db6cbc98675a0d88960de675cee17e520a3d7 GIT binary patch literal 1992 zcma)7U1%d!6uxO@HP(?t%}V{jtq^xBwsFIz(n^Kubh>uCE^0dKLWv=5Q(N1nOFJWq zq@=0mij}WrL|fl);zQi3kp$Y**gbxOw zFCuV13`GKPHX?!$u@VAEA$>hOoLob`zTaXLAX$T-Ks!*Mg$;cpq&~xYMfh=5KvBKm z1G$=)tLDd+WpSkndvMeIko;tgYX`8OTwC6ht295dV9%~H=Nbw5E60g|^Syo^en`NY zzTeJ!Tf2+FrGTF?{;Fu~1dTgQjKM8)oNA>WsMt~Rz{nuL;4WFL3F4&8HpZe)}!>%O&?k zI#5F2^ywR7cdoe5&*g3S-J|#~1h^D%i2}_f1@xL<`wYuh12`cTUi0VWU97&A+% zV_B%OxXP2;Tr2TJ++A_$aK+ys1*?s%g<~;mIjE}1xm?j!W2o$CB*+QQ{wXF>8F8OOMgK_RAMBMK6CtUvD3NBb8js zzs*pQ`^~GExjuxw!Fy1qCA+e8T;8I&-GcFd$)BOxDLlq@zhi~#2MECJ{8uMP$iAN! zGM|P?R4&H~Tn<3)fagR=R`bbq&}w;Y7vyy=hun5SJOc8!Tn>Z0&E*#Ct%-^j-b;~0 zZkoG)T2^caYOrU{UR1GaXek@2D&~mR8d&Ix;`cqNB4jGnp)6*;zFc zJ$+8;m{-%IQ@DixJ&qxhF8y6@MK9VRIu-5+x%N@C_jn-M75rpUj_wH6QwjM`x-ou^ z>~XnHivTZt8hzsb7w;r;NS`bX(u+8*{YyD|x?O97__N|ospfE;&t zJhJ#5Jsg*@K}C$H2hI49JiR}~^?GC2m)8*UhNtJno~_3PRtex|gw6$l^Ww8=umCE&u=k literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/lfunc.c b/user/lua-5.1.4/src/lfunc.c new file mode 100644 index 0000000..813e88f --- /dev/null +++ b/user/lua-5.1.4/src/lfunc.c @@ -0,0 +1,174 @@ +/* +** $Id: lfunc.c,v 2.12.1.2 2007/12/28 14:58:43 roberto Exp $ +** Auxiliary functions to manipulate prototypes and closures +** See Copyright Notice in lua.h +*/ + + +#include + +#define lfunc_c +#define LUA_CORE + +#include "lua.h" + +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" + + + +Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e) { + Closure *c = cast(Closure *, luaM_malloc(L, sizeCclosure(nelems))); + luaC_link(L, obj2gco(c), LUA_TFUNCTION); + c->c.isC = 1; + c->c.env = e; + c->c.nupvalues = cast_byte(nelems); + return c; +} + + +Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e) { + Closure *c = cast(Closure *, luaM_malloc(L, sizeLclosure(nelems))); + luaC_link(L, obj2gco(c), LUA_TFUNCTION); + c->l.isC = 0; + c->l.env = e; + c->l.nupvalues = cast_byte(nelems); + while (nelems--) c->l.upvals[nelems] = NULL; + return c; +} + + +UpVal *luaF_newupval (lua_State *L) { + UpVal *uv = luaM_new(L, UpVal); + luaC_link(L, obj2gco(uv), LUA_TUPVAL); + uv->v = &uv->u.value; + setnilvalue(uv->v); + return uv; +} + + +UpVal *luaF_findupval (lua_State *L, StkId level) { + global_State *g = G(L); + GCObject **pp = &L->openupval; + UpVal *p; + UpVal *uv; + while (*pp != NULL && (p = ngcotouv(*pp))->v >= level) { + lua_assert(p->v != &p->u.value); + if (p->v == level) { /* found a corresponding upvalue? */ + if (isdead(g, obj2gco(p))) /* is it dead? */ + changewhite(obj2gco(p)); /* ressurect it */ + return p; + } + pp = &p->next; + } + uv = luaM_new(L, UpVal); /* not found: create a new one */ + uv->tt = LUA_TUPVAL; + uv->marked = luaC_white(g); + uv->v = level; /* current value lives in the stack */ + uv->next = *pp; /* chain it in the proper position */ + *pp = obj2gco(uv); + uv->u.l.prev = &g->uvhead; /* double link it in `uvhead' list */ + uv->u.l.next = g->uvhead.u.l.next; + uv->u.l.next->u.l.prev = uv; + g->uvhead.u.l.next = uv; + lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv); + return uv; +} + + +static void unlinkupval (UpVal *uv) { + lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv); + uv->u.l.next->u.l.prev = uv->u.l.prev; /* remove from `uvhead' list */ + uv->u.l.prev->u.l.next = uv->u.l.next; +} + + +void luaF_freeupval (lua_State *L, UpVal *uv) { + if (uv->v != &uv->u.value) /* is it open? */ + unlinkupval(uv); /* remove from open list */ + luaM_free(L, uv); /* free upvalue */ +} + + +void luaF_close (lua_State *L, StkId level) { + UpVal *uv; + global_State *g = G(L); + while (L->openupval != NULL && (uv = ngcotouv(L->openupval))->v >= level) { + GCObject *o = obj2gco(uv); + lua_assert(!isblack(o) && uv->v != &uv->u.value); + L->openupval = uv->next; /* remove from `open' list */ + if (isdead(g, o)) + luaF_freeupval(L, uv); /* free upvalue */ + else { + unlinkupval(uv); + setobj(L, &uv->u.value, uv->v); + uv->v = &uv->u.value; /* now current value lives here */ + luaC_linkupval(L, uv); /* link upvalue into `gcroot' list */ + } + } +} + + +Proto *luaF_newproto (lua_State *L) { + Proto *f = luaM_new(L, Proto); + luaC_link(L, obj2gco(f), LUA_TPROTO); + f->k = NULL; + f->sizek = 0; + f->p = NULL; + f->sizep = 0; + f->code = NULL; + f->sizecode = 0; + f->sizelineinfo = 0; + f->sizeupvalues = 0; + f->nups = 0; + f->upvalues = NULL; + f->numparams = 0; + f->is_vararg = 0; + f->maxstacksize = 0; + f->lineinfo = NULL; + f->sizelocvars = 0; + f->locvars = NULL; + f->linedefined = 0; + f->lastlinedefined = 0; + f->source = NULL; + return f; +} + + +void luaF_freeproto (lua_State *L, Proto *f) { + luaM_freearray(L, f->code, f->sizecode, Instruction); + luaM_freearray(L, f->p, f->sizep, Proto *); + luaM_freearray(L, f->k, f->sizek, TValue); + luaM_freearray(L, f->lineinfo, f->sizelineinfo, int); + luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar); + luaM_freearray(L, f->upvalues, f->sizeupvalues, TString *); + luaM_free(L, f); +} + + +void luaF_freeclosure (lua_State *L, Closure *c) { + int size = (c->c.isC) ? sizeCclosure(c->c.nupvalues) : + sizeLclosure(c->l.nupvalues); + luaM_freemem(L, c, size); +} + + +/* +** Look for n-th local variable at line `line' in function `func'. +** Returns NULL if not found. +*/ +const char *luaF_getlocalname (const Proto *f, int local_number, int pc) { + int i; + for (i = 0; isizelocvars && f->locvars[i].startpc <= pc; i++) { + if (pc < f->locvars[i].endpc) { /* is variable active? */ + local_number--; + if (local_number == 0) + return getstr(f->locvars[i].varname); + } + } + return NULL; /* not found */ +} + diff --git a/user/lua-5.1.4/src/lfunc.h b/user/lua-5.1.4/src/lfunc.h new file mode 100644 index 0000000..a68cf51 --- /dev/null +++ b/user/lua-5.1.4/src/lfunc.h @@ -0,0 +1,34 @@ +/* +** $Id: lfunc.h,v 2.4.1.1 2007/12/27 13:02:25 roberto Exp $ +** Auxiliary functions to manipulate prototypes and closures +** See Copyright Notice in lua.h +*/ + +#ifndef lfunc_h +#define lfunc_h + + +#include "lobject.h" + + +#define sizeCclosure(n) (cast(int, sizeof(CClosure)) + \ + cast(int, sizeof(TValue)*((n)-1))) + +#define sizeLclosure(n) (cast(int, sizeof(LClosure)) + \ + cast(int, sizeof(TValue *)*((n)-1))) + + +LUAI_FUNC Proto *luaF_newproto (lua_State *L); +LUAI_FUNC Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e); +LUAI_FUNC Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e); +LUAI_FUNC UpVal *luaF_newupval (lua_State *L); +LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level); +LUAI_FUNC void luaF_close (lua_State *L, StkId level); +LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f); +LUAI_FUNC void luaF_freeclosure (lua_State *L, Closure *c); +LUAI_FUNC void luaF_freeupval (lua_State *L, UpVal *uv); +LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number, + int pc); + + +#endif diff --git a/user/lua-5.1.4/src/lfunc.o b/user/lua-5.1.4/src/lfunc.o new file mode 100644 index 0000000000000000000000000000000000000000..3c0a3ba20d9f2a66dfdb9967a9cf87fe8eee4f56 GIT binary patch literal 2672 zcma)7|4&<06u)gB@MI5pAW;&Vh^8{8tO2bF-TVPpC@?{b8$yPq6jml#X|a88V+ykP zg5l=oC5?&xrp~{>#2B&|e?Z&NEG7ntF;Rb!WhPr7hUtH{%A-+m$#>b(BRFf)O%5jMPKK%L_V_Ra~G8<5suCh?a z(gq#cdG|Rs(s(j0%|BxXl=h9Sx{Rqc6E-K&tg)*2?=RM$Ov?)u#vO-NZ+z?U5A7`8 zG;&h=>gZS`oMkQ;!^l`w!&zKteti@-g#C=|M%JxdovS4JvD%eTmD%uN1I*Aa4+fF% z@+c^zXFW2NJhylE_xEpPGhBG~wLK6w!R*!#=9kSV1AiF4%EF4hlIb!Fw0`rO6FkC5 zp*|1#=AH_gfUh7>4;QqUQfEOUAFgRD2pSF-bd)-2JY3@`IB}N>=o=mhxE(Q|+z$ul z$1rm0=osYnQZb)qNb!ect(JvU)~nFd3jPkN2eOJ@8o^63vs*Qp(q`8~D;tm@r)+TC zd~2LtQI|HfW_C*UXKDAX%Wi-87G2kCwx%=wb242|9m!~8^e0xow4wij0pk|96#$}y zNEPcc*E*%@+Lhr3IwBi4UCW^g_9#`&;W(|NA%zXk(~wF}DYR$a$hGoP;&oTM@@hlv z%DD>TuItI4jZK%fY5e6{23`;ytOs66n6ZBa;AQ40oSn+p_wB~Z)-h*g zmu5;I;}XaYJ|p`H$@o#hTFn>Iw)E>-PbFd9>T;xt_9)t8X8)&Z`$h)740--NGVVzJ zU-TU#=cW(%wVM2x{Cm(s!}nl+szY2dUBFZFD9oTBzLI9yL4aH6SYXhKhD zdXvxV^FDvvr*rngF^d!8O<$SOq7#5x%ECA8Q7RVqYOy(uc+W?*DDh6D)5JTOoSBIw zz?MjAF>lW+L&wuvbn+tX_P^T`pv1cqe<7q3#_v_Yk7)d1!1!_K_=@bd4&)jTyhB`% zH-_V<1$O~r%a!;-&Tkg*S?H+$FC9KU^v@q5Ao}wF+70Kh`vuze+XwbV4YoSy_MXU5 z*M|eqY#pN0HUj40FSQelm;?NG#dBb8keB+Cz;FX>cC-E2+{RM7MDFg}cEs|3cjToz zAh)wYbfoBER0qusmMIhH8>@h&}XW}G;{kGtr0A2;25d3q%9pE1b{uQ9z&>x9U>4{12 zB#GFc3+_qH)kfiqo^Hq?RmFefCl`F6eaP zde@M0`h|E?hCAed^;Z|<#Q Cpqlys literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/lgc.c b/user/lua-5.1.4/src/lgc.c new file mode 100644 index 0000000..d9e0b78 --- /dev/null +++ b/user/lua-5.1.4/src/lgc.c @@ -0,0 +1,711 @@ +/* +** $Id: lgc.c,v 2.38.1.1 2007/12/27 13:02:25 roberto Exp $ +** Garbage Collector +** See Copyright Notice in lua.h +*/ + +#include + +#define lgc_c +#define LUA_CORE + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" + + +#define GCSTEPSIZE 1024u +#define GCSWEEPMAX 40 +#define GCSWEEPCOST 10 +#define GCFINALIZECOST 100 + + +#define maskmarks cast_byte(~(bitmask(BLACKBIT)|WHITEBITS)) + +#define makewhite(g,x) \ + ((x)->gch.marked = cast_byte(((x)->gch.marked & maskmarks) | luaC_white(g))) + +#define white2gray(x) reset2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT) +#define black2gray(x) resetbit((x)->gch.marked, BLACKBIT) + +#define stringmark(s) reset2bits((s)->tsv.marked, WHITE0BIT, WHITE1BIT) + + +#define isfinalized(u) testbit((u)->marked, FINALIZEDBIT) +#define markfinalized(u) l_setbit((u)->marked, FINALIZEDBIT) + + +#define KEYWEAK bitmask(KEYWEAKBIT) +#define VALUEWEAK bitmask(VALUEWEAKBIT) + + + +#define markvalue(g,o) { checkconsistency(o); \ + if (iscollectable(o) && iswhite(gcvalue(o))) reallymarkobject(g,gcvalue(o)); } + +#define markobject(g,t) { if (iswhite(obj2gco(t))) \ + reallymarkobject(g, obj2gco(t)); } + + +#define setthreshold(g) (g->GCthreshold = (g->estimate/100) * g->gcpause) + + +static void removeentry (Node *n) { + lua_assert(ttisnil(gval(n))); + if (iscollectable(gkey(n))) + setttype(gkey(n), LUA_TDEADKEY); /* dead key; remove it */ +} + + +static void reallymarkobject (global_State *g, GCObject *o) { + lua_assert(iswhite(o) && !isdead(g, o)); + white2gray(o); + switch (o->gch.tt) { + case LUA_TSTRING: { + return; + } + case LUA_TUSERDATA: { + Table *mt = gco2u(o)->metatable; + gray2black(o); /* udata are never gray */ + if (mt) markobject(g, mt); + markobject(g, gco2u(o)->env); + return; + } + case LUA_TUPVAL: { + UpVal *uv = gco2uv(o); + markvalue(g, uv->v); + if (uv->v == &uv->u.value) /* closed? */ + gray2black(o); /* open upvalues are never black */ + return; + } + case LUA_TFUNCTION: { + gco2cl(o)->c.gclist = g->gray; + g->gray = o; + break; + } + case LUA_TTABLE: { + gco2h(o)->gclist = g->gray; + g->gray = o; + break; + } + case LUA_TTHREAD: { + gco2th(o)->gclist = g->gray; + g->gray = o; + break; + } + case LUA_TPROTO: { + gco2p(o)->gclist = g->gray; + g->gray = o; + break; + } + default: lua_assert(0); + } +} + + +static void marktmu (global_State *g) { + GCObject *u = g->tmudata; + if (u) { + do { + u = u->gch.next; + makewhite(g, u); /* may be marked, if left from previous GC */ + reallymarkobject(g, u); + } while (u != g->tmudata); + } +} + + +/* move `dead' udata that need finalization to list `tmudata' */ +size_t luaC_separateudata (lua_State *L, int all) { + global_State *g = G(L); + size_t deadmem = 0; + GCObject **p = &g->mainthread->next; + GCObject *curr; + while ((curr = *p) != NULL) { + if (!(iswhite(curr) || all) || isfinalized(gco2u(curr))) + p = &curr->gch.next; /* don't bother with them */ + else if (fasttm(L, gco2u(curr)->metatable, TM_GC) == NULL) { + markfinalized(gco2u(curr)); /* don't need finalization */ + p = &curr->gch.next; + } + else { /* must call its gc method */ + deadmem += sizeudata(gco2u(curr)); + markfinalized(gco2u(curr)); + *p = curr->gch.next; + /* link `curr' at the end of `tmudata' list */ + if (g->tmudata == NULL) /* list is empty? */ + g->tmudata = curr->gch.next = curr; /* creates a circular list */ + else { + curr->gch.next = g->tmudata->gch.next; + g->tmudata->gch.next = curr; + g->tmudata = curr; + } + } + } + return deadmem; +} + + +static int traversetable (global_State *g, Table *h) { + int i; + int weakkey = 0; + int weakvalue = 0; + const TValue *mode; + if (h->metatable) + markobject(g, h->metatable); + mode = gfasttm(g, h->metatable, TM_MODE); + if (mode && ttisstring(mode)) { /* is there a weak mode? */ + weakkey = (strchr(svalue(mode), 'k') != NULL); + weakvalue = (strchr(svalue(mode), 'v') != NULL); + if (weakkey || weakvalue) { /* is really weak? */ + h->marked &= ~(KEYWEAK | VALUEWEAK); /* clear bits */ + h->marked |= cast_byte((weakkey << KEYWEAKBIT) | + (weakvalue << VALUEWEAKBIT)); + h->gclist = g->weak; /* must be cleared after GC, ... */ + g->weak = obj2gco(h); /* ... so put in the appropriate list */ + } + } + if (weakkey && weakvalue) return 1; + if (!weakvalue) { + i = h->sizearray; + while (i--) + markvalue(g, &h->array[i]); + } + i = sizenode(h); + while (i--) { + Node *n = gnode(h, i); + lua_assert(ttype(gkey(n)) != LUA_TDEADKEY || ttisnil(gval(n))); + if (ttisnil(gval(n))) + removeentry(n); /* remove empty entries */ + else { + lua_assert(!ttisnil(gkey(n))); + if (!weakkey) markvalue(g, gkey(n)); + if (!weakvalue) markvalue(g, gval(n)); + } + } + return weakkey || weakvalue; +} + + +/* +** All marks are conditional because a GC may happen while the +** prototype is still being created +*/ +static void traverseproto (global_State *g, Proto *f) { + int i; + if (f->source) stringmark(f->source); + for (i=0; isizek; i++) /* mark literals */ + markvalue(g, &f->k[i]); + for (i=0; isizeupvalues; i++) { /* mark upvalue names */ + if (f->upvalues[i]) + stringmark(f->upvalues[i]); + } + for (i=0; isizep; i++) { /* mark nested protos */ + if (f->p[i]) + markobject(g, f->p[i]); + } + for (i=0; isizelocvars; i++) { /* mark local-variable names */ + if (f->locvars[i].varname) + stringmark(f->locvars[i].varname); + } +} + + + +static void traverseclosure (global_State *g, Closure *cl) { + markobject(g, cl->c.env); + if (cl->c.isC) { + int i; + for (i=0; ic.nupvalues; i++) /* mark its upvalues */ + markvalue(g, &cl->c.upvalue[i]); + } + else { + int i; + lua_assert(cl->l.nupvalues == cl->l.p->nups); + markobject(g, cl->l.p); + for (i=0; il.nupvalues; i++) /* mark its upvalues */ + markobject(g, cl->l.upvals[i]); + } +} + + +static void checkstacksizes (lua_State *L, StkId max) { + int ci_used = cast_int(L->ci - L->base_ci); /* number of `ci' in use */ + int s_used = cast_int(max - L->stack); /* part of stack in use */ + if (L->size_ci > LUAI_MAXCALLS) /* handling overflow? */ + return; /* do not touch the stacks */ + if (4*ci_used < L->size_ci && 2*BASIC_CI_SIZE < L->size_ci) + luaD_reallocCI(L, L->size_ci/2); /* still big enough... */ + condhardstacktests(luaD_reallocCI(L, ci_used + 1)); + if (4*s_used < L->stacksize && + 2*(BASIC_STACK_SIZE+EXTRA_STACK) < L->stacksize) + luaD_reallocstack(L, L->stacksize/2); /* still big enough... */ + condhardstacktests(luaD_reallocstack(L, s_used)); +} + + +static void traversestack (global_State *g, lua_State *l) { + StkId o, lim; + CallInfo *ci; + markvalue(g, gt(l)); + lim = l->top; + for (ci = l->base_ci; ci <= l->ci; ci++) { + lua_assert(ci->top <= l->stack_last); + if (lim < ci->top) lim = ci->top; + } + for (o = l->stack; o < l->top; o++) + markvalue(g, o); + for (; o <= lim; o++) + setnilvalue(o); + checkstacksizes(l, lim); +} + + +/* +** traverse one gray object, turning it to black. +** Returns `quantity' traversed. +*/ +static l_mem propagatemark (global_State *g) { + GCObject *o = g->gray; + lua_assert(isgray(o)); + gray2black(o); + switch (o->gch.tt) { + case LUA_TTABLE: { + Table *h = gco2h(o); + g->gray = h->gclist; + if (traversetable(g, h)) /* table is weak? */ + black2gray(o); /* keep it gray */ + return sizeof(Table) + sizeof(TValue) * h->sizearray + + sizeof(Node) * sizenode(h); + } + case LUA_TFUNCTION: { + Closure *cl = gco2cl(o); + g->gray = cl->c.gclist; + traverseclosure(g, cl); + return (cl->c.isC) ? sizeCclosure(cl->c.nupvalues) : + sizeLclosure(cl->l.nupvalues); + } + case LUA_TTHREAD: { + lua_State *th = gco2th(o); + g->gray = th->gclist; + th->gclist = g->grayagain; + g->grayagain = o; + black2gray(o); + traversestack(g, th); + return sizeof(lua_State) + sizeof(TValue) * th->stacksize + + sizeof(CallInfo) * th->size_ci; + } + case LUA_TPROTO: { + Proto *p = gco2p(o); + g->gray = p->gclist; + traverseproto(g, p); + return sizeof(Proto) + sizeof(Instruction) * p->sizecode + + sizeof(Proto *) * p->sizep + + sizeof(TValue) * p->sizek + + sizeof(int) * p->sizelineinfo + + sizeof(LocVar) * p->sizelocvars + + sizeof(TString *) * p->sizeupvalues; + } + default: lua_assert(0); return 0; + } +} + + +static size_t propagateall (global_State *g) { + size_t m = 0; + while (g->gray) m += propagatemark(g); + return m; +} + + +/* +** The next function tells whether a key or value can be cleared from +** a weak table. Non-collectable objects are never removed from weak +** tables. Strings behave as `values', so are never removed too. for +** other objects: if really collected, cannot keep them; for userdata +** being finalized, keep them in keys, but not in values +*/ +static int iscleared (const TValue *o, int iskey) { + if (!iscollectable(o)) return 0; + if (ttisstring(o)) { + stringmark(rawtsvalue(o)); /* strings are `values', so are never weak */ + return 0; + } + return iswhite(gcvalue(o)) || + (ttisuserdata(o) && (!iskey && isfinalized(uvalue(o)))); +} + + +/* +** clear collected entries from weaktables +*/ +static void cleartable (GCObject *l) { + while (l) { + Table *h = gco2h(l); + int i = h->sizearray; + lua_assert(testbit(h->marked, VALUEWEAKBIT) || + testbit(h->marked, KEYWEAKBIT)); + if (testbit(h->marked, VALUEWEAKBIT)) { + while (i--) { + TValue *o = &h->array[i]; + if (iscleared(o, 0)) /* value was collected? */ + setnilvalue(o); /* remove value */ + } + } + i = sizenode(h); + while (i--) { + Node *n = gnode(h, i); + if (!ttisnil(gval(n)) && /* non-empty entry? */ + (iscleared(key2tval(n), 1) || iscleared(gval(n), 0))) { + setnilvalue(gval(n)); /* remove value ... */ + removeentry(n); /* remove entry from table */ + } + } + l = h->gclist; + } +} + + +static void freeobj (lua_State *L, GCObject *o) { + switch (o->gch.tt) { + case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break; + case LUA_TFUNCTION: luaF_freeclosure(L, gco2cl(o)); break; + case LUA_TUPVAL: luaF_freeupval(L, gco2uv(o)); break; + case LUA_TTABLE: luaH_free(L, gco2h(o)); break; + case LUA_TTHREAD: { + lua_assert(gco2th(o) != L && gco2th(o) != G(L)->mainthread); + luaE_freethread(L, gco2th(o)); + break; + } + case LUA_TSTRING: { + G(L)->strt.nuse--; + luaM_freemem(L, o, sizestring(gco2ts(o))); + break; + } + case LUA_TUSERDATA: { + luaM_freemem(L, o, sizeudata(gco2u(o))); + break; + } + default: lua_assert(0); + } +} + + + +#define sweepwholelist(L,p) sweeplist(L,p,MAX_LUMEM) + + +static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count) { + GCObject *curr; + global_State *g = G(L); + int deadmask = otherwhite(g); + while ((curr = *p) != NULL && count-- > 0) { + if (curr->gch.tt == LUA_TTHREAD) /* sweep open upvalues of each thread */ + sweepwholelist(L, &gco2th(curr)->openupval); + if ((curr->gch.marked ^ WHITEBITS) & deadmask) { /* not dead? */ + lua_assert(!isdead(g, curr) || testbit(curr->gch.marked, FIXEDBIT)); + makewhite(g, curr); /* make it white (for next cycle) */ + p = &curr->gch.next; + } + else { /* must erase `curr' */ + lua_assert(isdead(g, curr) || deadmask == bitmask(SFIXEDBIT)); + *p = curr->gch.next; + if (curr == g->rootgc) /* is the first element of the list? */ + g->rootgc = curr->gch.next; /* adjust first */ + freeobj(L, curr); + } + } + return p; +} + + +static void checkSizes (lua_State *L) { + global_State *g = G(L); + /* check size of string hash */ + if (g->strt.nuse < cast(lu_int32, g->strt.size/4) && + g->strt.size > MINSTRTABSIZE*2) + luaS_resize(L, g->strt.size/2); /* table is too big */ + /* check size of buffer */ + if (luaZ_sizebuffer(&g->buff) > LUA_MINBUFFER*2) { /* buffer too big? */ + size_t newsize = luaZ_sizebuffer(&g->buff) / 2; + luaZ_resizebuffer(L, &g->buff, newsize); + } +} + + +static void GCTM (lua_State *L) { + global_State *g = G(L); + GCObject *o = g->tmudata->gch.next; /* get first element */ + Udata *udata = rawgco2u(o); + const TValue *tm; + /* remove udata from `tmudata' */ + if (o == g->tmudata) /* last element? */ + g->tmudata = NULL; + else + g->tmudata->gch.next = udata->uv.next; + udata->uv.next = g->mainthread->next; /* return it to `root' list */ + g->mainthread->next = o; + makewhite(g, o); + tm = fasttm(L, udata->uv.metatable, TM_GC); + if (tm != NULL) { + lu_byte oldah = L->allowhook; + lu_mem oldt = g->GCthreshold; + L->allowhook = 0; /* stop debug hooks during GC tag method */ + g->GCthreshold = 2*g->totalbytes; /* avoid GC steps */ + setobj2s(L, L->top, tm); + setuvalue(L, L->top+1, udata); + L->top += 2; + luaD_call(L, L->top - 2, 0); + L->allowhook = oldah; /* restore hooks */ + g->GCthreshold = oldt; /* restore threshold */ + } +} + + +/* +** Call all GC tag methods +*/ +void luaC_callGCTM (lua_State *L) { + while (G(L)->tmudata) + GCTM(L); +} + + +void luaC_freeall (lua_State *L) { + global_State *g = G(L); + int i; + g->currentwhite = WHITEBITS | bitmask(SFIXEDBIT); /* mask to collect all elements */ + sweepwholelist(L, &g->rootgc); + for (i = 0; i < g->strt.size; i++) /* free all string lists */ + sweepwholelist(L, &g->strt.hash[i]); +} + + +static void markmt (global_State *g) { + int i; + for (i=0; imt[i]) markobject(g, g->mt[i]); +} + + +/* mark root set */ +static void markroot (lua_State *L) { + global_State *g = G(L); + g->gray = NULL; + g->grayagain = NULL; + g->weak = NULL; + markobject(g, g->mainthread); + /* make global table be traversed before main stack */ + markvalue(g, gt(g->mainthread)); + markvalue(g, registry(L)); + markmt(g); + g->gcstate = GCSpropagate; +} + + +static void remarkupvals (global_State *g) { + UpVal *uv; + for (uv = g->uvhead.u.l.next; uv != &g->uvhead; uv = uv->u.l.next) { + lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv); + if (isgray(obj2gco(uv))) + markvalue(g, uv->v); + } +} + + +static void atomic (lua_State *L) { + global_State *g = G(L); + size_t udsize; /* total size of userdata to be finalized */ + /* remark occasional upvalues of (maybe) dead threads */ + remarkupvals(g); + /* traverse objects cautch by write barrier and by 'remarkupvals' */ + propagateall(g); + /* remark weak tables */ + g->gray = g->weak; + g->weak = NULL; + lua_assert(!iswhite(obj2gco(g->mainthread))); + markobject(g, L); /* mark running thread */ + markmt(g); /* mark basic metatables (again) */ + propagateall(g); + /* remark gray again */ + g->gray = g->grayagain; + g->grayagain = NULL; + propagateall(g); + udsize = luaC_separateudata(L, 0); /* separate userdata to be finalized */ + marktmu(g); /* mark `preserved' userdata */ + udsize += propagateall(g); /* remark, to propagate `preserveness' */ + cleartable(g->weak); /* remove collected objects from weak tables */ + /* flip current white */ + g->currentwhite = cast_byte(otherwhite(g)); + g->sweepstrgc = 0; + g->sweepgc = &g->rootgc; + g->gcstate = GCSsweepstring; + g->estimate = g->totalbytes - udsize; /* first estimate */ +} + + +static l_mem singlestep (lua_State *L) { + global_State *g = G(L); + /*lua_checkmemory(L);*/ + switch (g->gcstate) { + case GCSpause: { + markroot(L); /* start a new collection */ + return 0; + } + case GCSpropagate: { + if (g->gray) + return propagatemark(g); + else { /* no more `gray' objects */ + atomic(L); /* finish mark phase */ + return 0; + } + } + case GCSsweepstring: { + lu_mem old = g->totalbytes; + sweepwholelist(L, &g->strt.hash[g->sweepstrgc++]); + if (g->sweepstrgc >= g->strt.size) /* nothing more to sweep? */ + g->gcstate = GCSsweep; /* end sweep-string phase */ + lua_assert(old >= g->totalbytes); + g->estimate -= old - g->totalbytes; + return GCSWEEPCOST; + } + case GCSsweep: { + lu_mem old = g->totalbytes; + g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX); + if (*g->sweepgc == NULL) { /* nothing more to sweep? */ + checkSizes(L); + g->gcstate = GCSfinalize; /* end sweep phase */ + } + lua_assert(old >= g->totalbytes); + g->estimate -= old - g->totalbytes; + return GCSWEEPMAX*GCSWEEPCOST; + } + case GCSfinalize: { + if (g->tmudata) { + GCTM(L); + if (g->estimate > GCFINALIZECOST) + g->estimate -= GCFINALIZECOST; + return GCFINALIZECOST; + } + else { + g->gcstate = GCSpause; /* end collection */ + g->gcdept = 0; + return 0; + } + } + default: lua_assert(0); return 0; + } +} + + +void luaC_step (lua_State *L) { + global_State *g = G(L); + l_mem lim = (GCSTEPSIZE/100) * g->gcstepmul; + if (lim == 0) + lim = (MAX_LUMEM-1)/2; /* no limit */ + g->gcdept += g->totalbytes - g->GCthreshold; + do { + lim -= singlestep(L); + if (g->gcstate == GCSpause) + break; + } while (lim > 0); + if (g->gcstate != GCSpause) { + if (g->gcdept < GCSTEPSIZE) + g->GCthreshold = g->totalbytes + GCSTEPSIZE; /* - lim/g->gcstepmul;*/ + else { + g->gcdept -= GCSTEPSIZE; + g->GCthreshold = g->totalbytes; + } + } + else { + lua_assert(g->totalbytes >= g->estimate); + setthreshold(g); + } +} + + +void luaC_fullgc (lua_State *L) { + global_State *g = G(L); + if (g->gcstate <= GCSpropagate) { + /* reset sweep marks to sweep all elements (returning them to white) */ + g->sweepstrgc = 0; + g->sweepgc = &g->rootgc; + /* reset other collector lists */ + g->gray = NULL; + g->grayagain = NULL; + g->weak = NULL; + g->gcstate = GCSsweepstring; + } + lua_assert(g->gcstate != GCSpause && g->gcstate != GCSpropagate); + /* finish any pending sweep phase */ + while (g->gcstate != GCSfinalize) { + lua_assert(g->gcstate == GCSsweepstring || g->gcstate == GCSsweep); + singlestep(L); + } + markroot(L); + while (g->gcstate != GCSpause) { + singlestep(L); + } + setthreshold(g); +} + + +void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v) { + global_State *g = G(L); + lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o)); + lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause); + lua_assert(ttype(&o->gch) != LUA_TTABLE); + /* must keep invariant? */ + if (g->gcstate == GCSpropagate) + reallymarkobject(g, v); /* restore invariant */ + else /* don't mind */ + makewhite(g, o); /* mark as white just to avoid other barriers */ +} + + +void luaC_barrierback (lua_State *L, Table *t) { + global_State *g = G(L); + GCObject *o = obj2gco(t); + lua_assert(isblack(o) && !isdead(g, o)); + lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause); + black2gray(o); /* make table gray (again) */ + t->gclist = g->grayagain; + g->grayagain = o; +} + + +void luaC_link (lua_State *L, GCObject *o, lu_byte tt) { + global_State *g = G(L); + o->gch.next = g->rootgc; + g->rootgc = o; + o->gch.marked = luaC_white(g); + o->gch.tt = tt; +} + + +void luaC_linkupval (lua_State *L, UpVal *uv) { + global_State *g = G(L); + GCObject *o = obj2gco(uv); + o->gch.next = g->rootgc; /* link upvalue into `rootgc' list */ + g->rootgc = o; + if (isgray(o)) { + if (g->gcstate == GCSpropagate) { + gray2black(o); /* closed upvalues need barrier */ + luaC_barrier(L, uv, uv->v); + } + else { /* sweep phase: sweep it (turning it into white) */ + makewhite(g, o); + lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause); + } + } +} + diff --git a/user/lua-5.1.4/src/lgc.h b/user/lua-5.1.4/src/lgc.h new file mode 100644 index 0000000..5a8dc60 --- /dev/null +++ b/user/lua-5.1.4/src/lgc.h @@ -0,0 +1,110 @@ +/* +** $Id: lgc.h,v 2.15.1.1 2007/12/27 13:02:25 roberto Exp $ +** Garbage Collector +** See Copyright Notice in lua.h +*/ + +#ifndef lgc_h +#define lgc_h + + +#include "lobject.h" + + +/* +** Possible states of the Garbage Collector +*/ +#define GCSpause 0 +#define GCSpropagate 1 +#define GCSsweepstring 2 +#define GCSsweep 3 +#define GCSfinalize 4 + + +/* +** some userful bit tricks +*/ +#define resetbits(x,m) ((x) &= cast(lu_byte, ~(m))) +#define setbits(x,m) ((x) |= (m)) +#define testbits(x,m) ((x) & (m)) +#define bitmask(b) (1<<(b)) +#define bit2mask(b1,b2) (bitmask(b1) | bitmask(b2)) +#define l_setbit(x,b) setbits(x, bitmask(b)) +#define resetbit(x,b) resetbits(x, bitmask(b)) +#define testbit(x,b) testbits(x, bitmask(b)) +#define set2bits(x,b1,b2) setbits(x, (bit2mask(b1, b2))) +#define reset2bits(x,b1,b2) resetbits(x, (bit2mask(b1, b2))) +#define test2bits(x,b1,b2) testbits(x, (bit2mask(b1, b2))) + + + +/* +** Layout for bit use in `marked' field: +** bit 0 - object is white (type 0) +** bit 1 - object is white (type 1) +** bit 2 - object is black +** bit 3 - for userdata: has been finalized +** bit 3 - for tables: has weak keys +** bit 4 - for tables: has weak values +** bit 5 - object is fixed (should not be collected) +** bit 6 - object is "super" fixed (only the main thread) +*/ + + +#define WHITE0BIT 0 +#define WHITE1BIT 1 +#define BLACKBIT 2 +#define FINALIZEDBIT 3 +#define KEYWEAKBIT 3 +#define VALUEWEAKBIT 4 +#define FIXEDBIT 5 +#define SFIXEDBIT 6 +#define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT) + + +#define iswhite(x) test2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT) +#define isblack(x) testbit((x)->gch.marked, BLACKBIT) +#define isgray(x) (!isblack(x) && !iswhite(x)) + +#define otherwhite(g) (g->currentwhite ^ WHITEBITS) +#define isdead(g,v) ((v)->gch.marked & otherwhite(g) & WHITEBITS) + +#define changewhite(x) ((x)->gch.marked ^= WHITEBITS) +#define gray2black(x) l_setbit((x)->gch.marked, BLACKBIT) + +#define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) + +#define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS) + + +#define luaC_checkGC(L) { \ + condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1)); \ + if (G(L)->totalbytes >= G(L)->GCthreshold) \ + luaC_step(L); } + + +#define luaC_barrier(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p))) \ + luaC_barrierf(L,obj2gco(p),gcvalue(v)); } + +#define luaC_barriert(L,t,v) { if (valiswhite(v) && isblack(obj2gco(t))) \ + luaC_barrierback(L,t); } + +#define luaC_objbarrier(L,p,o) \ + { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \ + luaC_barrierf(L,obj2gco(p),obj2gco(o)); } + +#define luaC_objbarriert(L,t,o) \ + { if (iswhite(obj2gco(o)) && isblack(obj2gco(t))) luaC_barrierback(L,t); } + +LUAI_FUNC size_t luaC_separateudata (lua_State *L, int all); +LUAI_FUNC void luaC_callGCTM (lua_State *L); +LUAI_FUNC void luaC_freeall (lua_State *L); +LUAI_FUNC void luaC_step (lua_State *L); +LUAI_FUNC void luaC_fullgc (lua_State *L); +LUAI_FUNC void luaC_link (lua_State *L, GCObject *o, lu_byte tt); +LUAI_FUNC void luaC_linkupval (lua_State *L, UpVal *uv); +LUAI_FUNC void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v); +LUAI_FUNC void luaC_barrierback (lua_State *L, Table *t); + + +#endif diff --git a/user/lua-5.1.4/src/lgc.o b/user/lua-5.1.4/src/lgc.o new file mode 100644 index 0000000000000000000000000000000000000000..251a905347e0f0b0fc4f0fbfe152d5b1e659487b GIT binary patch literal 6620 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 literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/liblua.a b/user/lua-5.1.4/src/liblua.a new file mode 100644 index 0000000000000000000000000000000000000000..49594bf01d687cd1f7728c42c310f7206fc68278 GIT binary patch literal 217688 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 J<*WGbRqwX| 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%0DLNFJIKG$iE_W49Jvyg% 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

HRty>HTo*cgz36=jY);R`^?3QV{QwWfN@^ zPYzYYi!(6O{sXh;icX?s8JGyf2HtUXJ@(7);jKS+llF;-lV2_hQ^M_}*|b|7`%(o? zl~1PxpX9gMzE>$64rP$lWOTUy`ax?q`nRlVxM5%ZMScGvgN6M8{%mJD%Y5_B{F1$1 z-7Fu+V4VcEBE^1&F73^_0af;8sfkO7VJaH(E*;YQ9*`qzIN^UL8%|X2a~E&~#pa&p z5C!ILiU)bsek79O6deV>pS!Q(33fdwX;mKO;yO7J5=L<=+96)I+%-FWzxDT0k7Qi^ zw($$$+JOJ-2?`-wpF6~PezrpPk_*{lMjEtshv1#_qHsgJ)fdHN1cB|_7WPxTUHg3B zFGGTSFnFuefa2~3@7|egNPWHH5{#Z7u?H`yM7;@~=|P+r(foVjqc1A#2e(5QLd8w` z-!br>L$FQ>e8i_l{OK2$oc!kd-bu(-tB$b6W;E|Tm!Nx}1lm@+rerhfDhxdnQ8#y3 zS#hx)CUu&bpgsm3QX!$PnF*=KsiB@Dp+2g#gmuxp`sSwWULA;{5e=-=&ze&^M$RJ_JR-ZGxha>uN>@XN^~e$4 z%Msay^*KbI=g*h;tbCr8o!UIBAh#U5#TvMr>(8zI_gh#`h->Fdn%etprY}>Bu27_B zU&m>!^J=opL(v)6Ikw)39jb901gmd>GP?)>=E$FSZy z{`lsm#^c=`f5$f=A6rCksCw!L&zM{_*-dVdKdgEt@?RNJSKqvF_9gi`pI`53LtD?HdQa-AV#>C6nICOlWRH%>@3WP0npB^WfdAdHx4KL`aZf-+@!jJ8E%yXm zrcWSy!Yj*xMY5i)Z-6K|S7PzMyAi{4L} zfGEC1JC3g=PUNn_sb>On#l!ro`yc$Rf$2RwTGviKK~HmnAx)$&b86Sa6U+%i9Hgg% z4RvodVgc^1Y{f%KuQ(*#dzp;9GNBOM!&uRiRR3#aZOs7c{)gc@=fBE$ z4P5p6Sy1}&TXp^u#;*g_4lFR<2CAL-s`1Z&YCpba{7azjh`7c0*Fg>6RLuKQ;-#ZOA{(^LH16xaG!c;w!PQ#>u3dv!|x6DfXEihn7^|2f51 zrTB&v|3!-bD#c$&@jt@L4~inKKS~yMpF|s__`Ns9N2d76DSl>(pP%Akd@u&lO*i^& ztVeQhK2m&sfS^IhyoI&%tEFgz2X9dKJnJo5aJ6=)xyuD4pQ=HP3`sz#PYN##o@LlZCuYr$S8{GpG^ZxFAZkEZ6sNdf+*t?b2L;J38v%dclJ|jNV z@1fIu3$Ma;r}Plo37OaAfXs~*9*uue$Deb=@kgf}$XuQHF!t*S8Kiz*_7`_vPbpDHlxO=k@cW)Qs z-w%a^`%&Rh$gP2j*Kfob2)rs}Vda1UAnvHW6IOzX-x=cgd%ci!TqYbtx=Nq;{*yTF zf8TJe@Mx3EB_2D)kq^@xkjxJT<=zA#{!SI*-$kZBTO9XtLfpAYh&x{sV*dNWa^&Yg zx%Xr73er)W@cv31_x~Wo`~cJ>Klg4S?wlw@eUjm2Leguo>EC4PH-mEjc5%XYmv97o zUrk;6V5RQvUOy54#D^hYZ2AWE0Je5^(BVwQpfzQ zLc$a75qZq?pOiZB8(0S7UseboC#0NC0_FdO;ZNk%#QwQbF z{o=&)C&JUCXp5;oXV@!s+q%38K}dT20aQ4~9pG^yDE~es#9oJ~?>0V=ZvdG;5-dG~?+@Xb)Jx$cjF_-+!3UTKQQ0|{2eh&Kr#A%CWiJ!~9d(*#89D6s2A4)wjbtiXz z9&*XjKQ4;?T{x9J&qC7SF`2`?UyI}3Yr<&}5%=z7g!q3rDEE&xKGN`bA^BWs{4~R} zO}*OqY*6K(-uPm1-21HYTg8u$qJK7iw>bKb3JK>gOntklzbqs^yQNNi2QeruC7y>1 zDaWUR3imYe^NA0S_&_1?rMfsyHamWZAw|ydtRX>me6$ez<;L~BD^6BA{rPUHvi|t2 zJryUGpLoK_<>g~5_jcdRNhf%tZ!hn57k!={`AN^ioC1|1@yxhaL_!Pyp%<-VaB&Ie zd?%L->|mA-&Z;WY9UV_erO9pbf7ln=SM~J>Z5wM6---& z*w-~Tnq7NU^Bg&}_s60U&*PAF?qO=kJ?}A89_ShBq458|dv5RVJefx^CORWM5@gc{JSk08r2E9^(Hpr-y1&G?%wGbFM67mTuoY zGB?8B1@c=znoWmP8~1ece~N!~|FiZ^Gg=gnmx)IUYKn)_K;ct7sHV<6`LAaro(%J^ z?tk#tjZqWoQ>Br30!`1+$=vLI%*lL+gS53mITJ;-0jg07pYnvREDCANYjgxYRf$!b2bukLKu-kLH|`&j37u8GpT6N$9>b$}s!a=z zIKzSX5uX|}pDr^}yf(#?^P;kUeM&!{;$KYhZ>D(U8&$WNlTUHJw)K6aFQ&lU*V9$A z_|VhWPx?d2DfIIJoc`u=JpS5qjP?x|-7D=}crCc)bX>a^^sN0;`6{8ntIVr^7zvhA z!06heQu_E03F%|?l#qogb26`bA+EAmLc^%^6CWakxc&+5`X@3rYx=4;B{ZP&N9L8M WCGWO=3hw$T9C7^=e1i08X#XGf4r&nq literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/linit.c b/user/lua-5.1.4/src/linit.c new file mode 100644 index 0000000..c1f90df --- /dev/null +++ b/user/lua-5.1.4/src/linit.c @@ -0,0 +1,38 @@ +/* +** $Id: linit.c,v 1.14.1.1 2007/12/27 13:02:25 roberto Exp $ +** Initialization of libraries for lua.c +** See Copyright Notice in lua.h +*/ + + +#define linit_c +#define LUA_LIB + +#include "lua.h" + +#include "lualib.h" +#include "lauxlib.h" + + +static const luaL_Reg lualibs[] = { + {"", luaopen_base}, + {LUA_LOADLIBNAME, luaopen_package}, + {LUA_TABLIBNAME, luaopen_table}, + {LUA_IOLIBNAME, luaopen_io}, + {LUA_OSLIBNAME, luaopen_os}, + {LUA_STRLIBNAME, luaopen_string}, + {LUA_MATHLIBNAME, luaopen_math}, + {LUA_DBLIBNAME, luaopen_debug}, + {NULL, NULL} +}; + + +LUALIB_API void luaL_openlibs (lua_State *L) { + const luaL_Reg *lib = lualibs; + for (; lib->func; lib++) { + lua_pushcfunction(L, lib->func); + lua_pushstring(L, lib->name); + lua_call(L, 1, 0); + } +} + diff --git a/user/lua-5.1.4/src/linit.o b/user/lua-5.1.4/src/linit.o new file mode 100644 index 0000000000000000000000000000000000000000..2a39eee55364c648a1868d3878b20347e1768dd9 GIT binary patch literal 1652 zcmah~O^ee|6uqylT0chXs4$>lg^CrO;AjOEMWLf3SOn3!5v^$&W{PQ3nnZM?!r-C| z?)?F}7u*c!LKwk~Kf;aR!j0fksOKc_bz)TJ!h7eQdvEUhzIl4NaYZR5MwH}bor%2B zq!tHMWlFZ0&={MmgwfaAH{VfN{$5&%iZ33@XueYTG+!yk-dg3`ukm=il3!jcj%pS9 zVuJ|)7B~)kNnpM3{6qA9`D5wMy}N571KW9EFS-)iZO@giFMc3FIPCTprDumr(sA3- zB1iham^E$HA-gnAYuu;tfW|`_C$LbjpDS0J?Wi9{<(gHqPR-V$n4LbFa1kqb+`}A! z;V{7^qYYip3f)JcSRFgG#cBtESVNzL(R0=uC}I+mSdQQ8xqXE9{m``*t~Y0c5W6s$ z&PK{X1aQrpb>JnSqjf?_>-&LbPiXqQNu&zgj>hi`XgtKjn&*L(R|!md#!-%;F@B@C z6Nq8{lV}v?I}&S2M;}{VV=ghv7vNQ`6Uth@2u!czC)V){Hm-wv!1-}r*U*@k<5Q|2 zl|+qu`q*x1jE(3TG^WJR-LRRp(#^QeKjIi~)&PWnp7H7W$NQyl z;d$rPmgF7haKX-k=cYt%5O<=3C_D<@ImYu{kn=7o6h@v0`CcN(jOMJ33I|)(obN`V bfL1l+v4~9XDB2&qy6WJD73!;j@P{V literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/liolib.c b/user/lua-5.1.4/src/liolib.c new file mode 100644 index 0000000..e79ed1c --- /dev/null +++ b/user/lua-5.1.4/src/liolib.c @@ -0,0 +1,553 @@ +/* +** $Id: liolib.c,v 2.73.1.3 2008/01/18 17:47:43 roberto Exp $ +** Standard I/O (and system) library +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include +#include + +#define liolib_c +#define LUA_LIB + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + + +#define IO_INPUT 1 +#define IO_OUTPUT 2 + + +static const char *const fnames[] = {"input", "output"}; + + +static int pushresult (lua_State *L, int i, const char *filename) { + int en = errno; /* calls to Lua API may change this value */ + if (i) { + lua_pushboolean(L, 1); + return 1; + } + else { + lua_pushnil(L); + if (filename) + lua_pushfstring(L, "%s: %s", filename, strerror(en)); + else + lua_pushfstring(L, "%s", strerror(en)); + lua_pushinteger(L, en); + return 3; + } +} + + +static void fileerror (lua_State *L, int arg, const char *filename) { + lua_pushfstring(L, "%s: %s", filename, strerror(errno)); + luaL_argerror(L, arg, lua_tostring(L, -1)); +} + + +#define tofilep(L) ((FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE)) + + +static int io_type (lua_State *L) { + void *ud; + luaL_checkany(L, 1); + ud = lua_touserdata(L, 1); + lua_getfield(L, LUA_REGISTRYINDEX, LUA_FILEHANDLE); + if (ud == NULL || !lua_getmetatable(L, 1) || !lua_rawequal(L, -2, -1)) + lua_pushnil(L); /* not a file */ + else if (*((FILE **)ud) == NULL) + lua_pushliteral(L, "closed file"); + else + lua_pushliteral(L, "file"); + return 1; +} + + +static FILE *tofile (lua_State *L) { + FILE **f = tofilep(L); + if (*f == NULL) + luaL_error(L, "attempt to use a closed file"); + return *f; +} + + + +/* +** When creating file handles, always creates a `closed' file handle +** before opening the actual file; so, if there is a memory error, the +** file is not left opened. +*/ +static FILE **newfile (lua_State *L) { + FILE **pf = (FILE **)lua_newuserdata(L, sizeof(FILE *)); + *pf = NULL; /* file handle is currently `closed' */ + luaL_getmetatable(L, LUA_FILEHANDLE); + lua_setmetatable(L, -2); + return pf; +} + + +/* +** function to (not) close the standard files stdin, stdout, and stderr +*/ +static int io_noclose (lua_State *L) { + lua_pushnil(L); + lua_pushliteral(L, "cannot close standard file"); + return 2; +} + + +/* +** function to close 'popen' files +*/ +static int io_pclose (lua_State *L) { + FILE **p = tofilep(L); + int ok = lua_pclose(L, *p); + *p = NULL; + return pushresult(L, ok, NULL); +} + + +/* +** function to close regular files +*/ +static int io_fclose (lua_State *L) { + FILE **p = tofilep(L); + int ok = (fclose(*p) == 0); + *p = NULL; + return pushresult(L, ok, NULL); +} + + +static int aux_close (lua_State *L) { + lua_getfenv(L, 1); + lua_getfield(L, -1, "__close"); + return (lua_tocfunction(L, -1))(L); +} + + +static int io_close (lua_State *L) { + if (lua_isnone(L, 1)) + lua_rawgeti(L, LUA_ENVIRONINDEX, IO_OUTPUT); + tofile(L); /* make sure argument is a file */ + return aux_close(L); +} + + +static int io_gc (lua_State *L) { + FILE *f = *tofilep(L); + /* ignore closed files */ + if (f != NULL) + aux_close(L); + return 0; +} + + +static int io_tostring (lua_State *L) { + FILE *f = *tofilep(L); + if (f == NULL) + lua_pushliteral(L, "file (closed)"); + else + lua_pushfstring(L, "file (%p)", f); + return 1; +} + + +static int io_open (lua_State *L) { + const char *filename = luaL_checkstring(L, 1); + const char *mode = luaL_optstring(L, 2, "r"); + FILE **pf = newfile(L); + *pf = fopen(filename, mode); + return (*pf == NULL) ? pushresult(L, 0, filename) : 1; +} + + +/* +** this function has a separated environment, which defines the +** correct __close for 'popen' files +*/ +static int io_popen (lua_State *L) { + const char *filename = luaL_checkstring(L, 1); + const char *mode = luaL_optstring(L, 2, "r"); + FILE **pf = newfile(L); + *pf = lua_popen(L, filename, mode); + return (*pf == NULL) ? pushresult(L, 0, filename) : 1; +} + + +static int io_tmpfile (lua_State *L) { + FILE **pf = newfile(L); + *pf = tmpfile(); + return (*pf == NULL) ? pushresult(L, 0, NULL) : 1; +} + + +static FILE *getiofile (lua_State *L, int findex) { + FILE *f; + lua_rawgeti(L, LUA_ENVIRONINDEX, findex); + f = *(FILE **)lua_touserdata(L, -1); + if (f == NULL) + luaL_error(L, "standard %s file is closed", fnames[findex - 1]); + return f; +} + + +static int g_iofile (lua_State *L, int f, const char *mode) { + if (!lua_isnoneornil(L, 1)) { + const char *filename = lua_tostring(L, 1); + if (filename) { + FILE **pf = newfile(L); + *pf = fopen(filename, mode); + if (*pf == NULL) + fileerror(L, 1, filename); + } + else { + tofile(L); /* check that it's a valid file handle */ + lua_pushvalue(L, 1); + } + lua_rawseti(L, LUA_ENVIRONINDEX, f); + } + /* return current value */ + lua_rawgeti(L, LUA_ENVIRONINDEX, f); + return 1; +} + + +static int io_input (lua_State *L) { + return g_iofile(L, IO_INPUT, "r"); +} + + +static int io_output (lua_State *L) { + return g_iofile(L, IO_OUTPUT, "w"); +} + + +static int io_readline (lua_State *L); + + +static void aux_lines (lua_State *L, int idx, int toclose) { + lua_pushvalue(L, idx); + lua_pushboolean(L, toclose); /* close/not close file when finished */ + lua_pushcclosure(L, io_readline, 2); +} + + +static int f_lines (lua_State *L) { + tofile(L); /* check that it's a valid file handle */ + aux_lines(L, 1, 0); + return 1; +} + + +static int io_lines (lua_State *L) { + if (lua_isnoneornil(L, 1)) { /* no arguments? */ + /* will iterate over default input */ + lua_rawgeti(L, LUA_ENVIRONINDEX, IO_INPUT); + return f_lines(L); + } + else { + const char *filename = luaL_checkstring(L, 1); + FILE **pf = newfile(L); + *pf = fopen(filename, "r"); + if (*pf == NULL) + fileerror(L, 1, filename); + aux_lines(L, lua_gettop(L), 1); + return 1; + } +} + + +/* +** {====================================================== +** READ +** ======================================================= +*/ + + +static int read_number (lua_State *L, FILE *f) { + lua_Number d; + if (fscanf(f, LUA_NUMBER_SCAN, &d) == 1) { + lua_pushnumber(L, d); + return 1; + } + else return 0; /* read fails */ +} + + +static int test_eof (lua_State *L, FILE *f) { + int c = getc(f); + ungetc(c, f); + lua_pushlstring(L, NULL, 0); + return (c != EOF); +} + + +static int read_line (lua_State *L, FILE *f) { + luaL_Buffer b; + luaL_buffinit(L, &b); + for (;;) { + size_t l; + char *p = luaL_prepbuffer(&b); + if (fgets(p, LUAL_BUFFERSIZE, f) == NULL) { /* eof? */ + luaL_pushresult(&b); /* close buffer */ + return (lua_objlen(L, -1) > 0); /* check whether read something */ + } + l = strlen(p); + if (l == 0 || p[l-1] != '\n') + luaL_addsize(&b, l); + else { + luaL_addsize(&b, l - 1); /* do not include `eol' */ + luaL_pushresult(&b); /* close buffer */ + return 1; /* read at least an `eol' */ + } + } +} + + +static int read_chars (lua_State *L, FILE *f, size_t n) { + size_t rlen; /* how much to read */ + size_t nr; /* number of chars actually read */ + luaL_Buffer b; + luaL_buffinit(L, &b); + rlen = LUAL_BUFFERSIZE; /* try to read that much each time */ + do { + char *p = luaL_prepbuffer(&b); + if (rlen > n) rlen = n; /* cannot read more than asked */ + nr = fread(p, sizeof(char), rlen, f); + luaL_addsize(&b, nr); + n -= nr; /* still have to read `n' chars */ + } while (n > 0 && nr == rlen); /* until end of count or eof */ + luaL_pushresult(&b); /* close buffer */ + return (n == 0 || lua_objlen(L, -1) > 0); +} + + +static int g_read (lua_State *L, FILE *f, int first) { + int nargs = lua_gettop(L) - 1; + int success; + int n; + clearerr(f); + if (nargs == 0) { /* no arguments? */ + success = read_line(L, f); + n = first+1; /* to return 1 result */ + } + else { /* ensure stack space for all results and for auxlib's buffer */ + luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments"); + success = 1; + for (n = first; nargs-- && success; n++) { + if (lua_type(L, n) == LUA_TNUMBER) { + size_t l = (size_t)lua_tointeger(L, n); + success = (l == 0) ? test_eof(L, f) : read_chars(L, f, l); + } + else { + const char *p = lua_tostring(L, n); + luaL_argcheck(L, p && p[0] == '*', n, "invalid option"); + switch (p[1]) { + case 'n': /* number */ + success = read_number(L, f); + break; + case 'l': /* line */ + success = read_line(L, f); + break; + case 'a': /* file */ + read_chars(L, f, ~((size_t)0)); /* read MAX_SIZE_T chars */ + success = 1; /* always success */ + break; + default: + return luaL_argerror(L, n, "invalid format"); + } + } + } + } + if (ferror(f)) + return pushresult(L, 0, NULL); + if (!success) { + lua_pop(L, 1); /* remove last result */ + lua_pushnil(L); /* push nil instead */ + } + return n - first; +} + + +static int io_read (lua_State *L) { + return g_read(L, getiofile(L, IO_INPUT), 1); +} + + +static int f_read (lua_State *L) { + return g_read(L, tofile(L), 2); +} + + +static int io_readline (lua_State *L) { + FILE *f = *(FILE **)lua_touserdata(L, lua_upvalueindex(1)); + int sucess; + if (f == NULL) /* file is already closed? */ + luaL_error(L, "file is already closed"); + sucess = read_line(L, f); + if (ferror(f)) + return luaL_error(L, "%s", strerror(errno)); + if (sucess) return 1; + else { /* EOF */ + if (lua_toboolean(L, lua_upvalueindex(2))) { /* generator created file? */ + lua_settop(L, 0); + lua_pushvalue(L, lua_upvalueindex(1)); + aux_close(L); /* close it */ + } + return 0; + } +} + +/* }====================================================== */ + + +static int g_write (lua_State *L, FILE *f, int arg) { + int nargs = lua_gettop(L) - 1; + int status = 1; + for (; nargs--; arg++) { + if (lua_type(L, arg) == LUA_TNUMBER) { + /* optimization: could be done exactly as for strings */ + status = status && + fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg)) > 0; + } + else { + size_t l; + const char *s = luaL_checklstring(L, arg, &l); + status = status && (fwrite(s, sizeof(char), l, f) == l); + } + } + return pushresult(L, status, NULL); +} + + +static int io_write (lua_State *L) { + return g_write(L, getiofile(L, IO_OUTPUT), 1); +} + + +static int f_write (lua_State *L) { + return g_write(L, tofile(L), 2); +} + + +static int f_seek (lua_State *L) { + static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END}; + static const char *const modenames[] = {"set", "cur", "end", NULL}; + FILE *f = tofile(L); + int op = luaL_checkoption(L, 2, "cur", modenames); + long offset = luaL_optlong(L, 3, 0); + op = fseek(f, offset, mode[op]); + if (op) + return pushresult(L, 0, NULL); /* error */ + else { + lua_pushinteger(L, ftell(f)); + return 1; + } +} + + +static int f_setvbuf (lua_State *L) { + static const int mode[] = {_IONBF, _IOFBF, _IOLBF}; + static const char *const modenames[] = {"no", "full", "line", NULL}; + FILE *f = tofile(L); + int op = luaL_checkoption(L, 2, NULL, modenames); + lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE); + int res = setvbuf(f, NULL, mode[op], sz); + return pushresult(L, res == 0, NULL); +} + + + +static int io_flush (lua_State *L) { + return pushresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL); +} + + +static int f_flush (lua_State *L) { + return pushresult(L, fflush(tofile(L)) == 0, NULL); +} + + +static const luaL_Reg iolib[] = { + {"close", io_close}, + {"flush", io_flush}, + {"input", io_input}, + {"lines", io_lines}, + {"open", io_open}, + {"output", io_output}, + {"popen", io_popen}, + {"read", io_read}, + {"tmpfile", io_tmpfile}, + {"type", io_type}, + {"write", io_write}, + {NULL, NULL} +}; + + +static const luaL_Reg flib[] = { + {"close", io_close}, + {"flush", f_flush}, + {"lines", f_lines}, + {"read", f_read}, + {"seek", f_seek}, + {"setvbuf", f_setvbuf}, + {"write", f_write}, + {"__gc", io_gc}, + {"__tostring", io_tostring}, + {NULL, NULL} +}; + + +static void createmeta (lua_State *L) { + luaL_newmetatable(L, LUA_FILEHANDLE); /* create metatable for file handles */ + lua_pushvalue(L, -1); /* push metatable */ + lua_setfield(L, -2, "__index"); /* metatable.__index = metatable */ + luaL_register(L, NULL, flib); /* file methods */ +} + + +static void createstdfile (lua_State *L, FILE *f, int k, const char *fname) { + *newfile(L) = f; + if (k > 0) { + lua_pushvalue(L, -1); + lua_rawseti(L, LUA_ENVIRONINDEX, k); + } + lua_pushvalue(L, -2); /* copy environment */ + lua_setfenv(L, -2); /* set it */ + lua_setfield(L, -3, fname); +} + + +static void newfenv (lua_State *L, lua_CFunction cls) { + lua_createtable(L, 0, 1); + lua_pushcfunction(L, cls); + lua_setfield(L, -2, "__close"); +} + + +LUALIB_API int luaopen_io (lua_State *L) { + createmeta(L); + /* create (private) environment (with fields IO_INPUT, IO_OUTPUT, __close) */ + newfenv(L, io_fclose); + lua_replace(L, LUA_ENVIRONINDEX); + /* open library */ + luaL_register(L, LUA_IOLIBNAME, iolib); + /* create (and set) default files */ + newfenv(L, io_noclose); /* close function for default files */ + createstdfile(L, stdin, IO_INPUT, "stdin"); + createstdfile(L, stdout, IO_OUTPUT, "stdout"); + createstdfile(L, stderr, 0, "stderr"); + lua_pop(L, 1); /* pop environment for default files */ + lua_getfield(L, -1, "popen"); + newfenv(L, io_pclose); /* create environment for 'popen' */ + lua_setfenv(L, -2); /* set fenv for 'popen' */ + lua_pop(L, 1); /* pop 'popen' */ + return 1; +} + diff --git a/user/lua-5.1.4/src/liolib.o b/user/lua-5.1.4/src/liolib.o new file mode 100644 index 0000000000000000000000000000000000000000..959b6761706ea294e2c8366090153ed18321b43a GIT binary patch literal 11624 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 ScWK_Ou}9;e#-kdKYy4kegQe^M literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/llex.c b/user/lua-5.1.4/src/llex.c new file mode 100644 index 0000000..6dc3193 --- /dev/null +++ b/user/lua-5.1.4/src/llex.c @@ -0,0 +1,461 @@ +/* +** $Id: llex.c,v 2.20.1.1 2007/12/27 13:02:25 roberto Exp $ +** Lexical Analyzer +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include + +#define llex_c +#define LUA_CORE + +#include "lua.h" + +#include "ldo.h" +#include "llex.h" +#include "lobject.h" +#include "lparser.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "lzio.h" + + + +#define next(ls) (ls->current = zgetc(ls->z)) + + + + +#define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r') + + +/* ORDER RESERVED */ +const char *const luaX_tokens [] = { + "and", "break", "do", "else", "elseif", + "end", "false", "for", "function", "if", + "in", "local", "nil", "not", "or", "repeat", + "return", "then", "true", "until", "while", + "..", "...", "==", ">=", "<=", "~=", + "", "", "", "", + NULL +}; + + +#define save_and_next(ls) (save(ls, ls->current), next(ls)) + + +static void save (LexState *ls, int c) { + Mbuffer *b = ls->buff; + if (b->n + 1 > b->buffsize) { + size_t newsize; + if (b->buffsize >= MAX_SIZET/2) + luaX_lexerror(ls, "lexical element too long", 0); + newsize = b->buffsize * 2; + luaZ_resizebuffer(ls->L, b, newsize); + } + b->buffer[b->n++] = cast(char, c); +} + + +void luaX_init (lua_State *L) { + int i; + for (i=0; itsv.reserved = cast_byte(i+1); /* reserved word */ + } +} + + +#define MAXSRC 80 + + +const char *luaX_token2str (LexState *ls, int token) { + if (token < FIRST_RESERVED) { + lua_assert(token == cast(unsigned char, token)); + return (iscntrl(token)) ? luaO_pushfstring(ls->L, "char(%d)", token) : + luaO_pushfstring(ls->L, "%c", token); + } + else + return luaX_tokens[token-FIRST_RESERVED]; +} + + +static const char *txtToken (LexState *ls, int token) { + switch (token) { + case TK_NAME: + case TK_STRING: + case TK_NUMBER: + save(ls, '\0'); + return luaZ_buffer(ls->buff); + default: + return luaX_token2str(ls, token); + } +} + + +void luaX_lexerror (LexState *ls, const char *msg, int token) { + char buff[MAXSRC]; + luaO_chunkid(buff, getstr(ls->source), MAXSRC); + msg = luaO_pushfstring(ls->L, "%s:%d: %s", buff, ls->linenumber, msg); + if (token) + luaO_pushfstring(ls->L, "%s near " LUA_QS, msg, txtToken(ls, token)); + luaD_throw(ls->L, LUA_ERRSYNTAX); +} + + +void luaX_syntaxerror (LexState *ls, const char *msg) { + luaX_lexerror(ls, msg, ls->t.token); +} + + +TString *luaX_newstring (LexState *ls, const char *str, size_t l) { + lua_State *L = ls->L; + TString *ts = luaS_newlstr(L, str, l); + TValue *o = luaH_setstr(L, ls->fs->h, ts); /* entry for `str' */ + if (ttisnil(o)) + setbvalue(o, 1); /* make sure `str' will not be collected */ + return ts; +} + + +static void inclinenumber (LexState *ls) { + int old = ls->current; + lua_assert(currIsNewline(ls)); + next(ls); /* skip `\n' or `\r' */ + if (currIsNewline(ls) && ls->current != old) + next(ls); /* skip `\n\r' or `\r\n' */ + if (++ls->linenumber >= MAX_INT) + luaX_syntaxerror(ls, "chunk has too many lines"); +} + + +void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source) { + ls->decpoint = '.'; + ls->L = L; + ls->lookahead.token = TK_EOS; /* no look-ahead token */ + ls->z = z; + ls->fs = NULL; + ls->linenumber = 1; + ls->lastline = 1; + ls->source = source; + luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */ + next(ls); /* read first char */ +} + + + +/* +** ======================================================= +** LEXICAL ANALYZER +** ======================================================= +*/ + + + +static int check_next (LexState *ls, const char *set) { + if (!strchr(set, ls->current)) + return 0; + save_and_next(ls); + return 1; +} + + +static void buffreplace (LexState *ls, char from, char to) { + size_t n = luaZ_bufflen(ls->buff); + char *p = luaZ_buffer(ls->buff); + while (n--) + if (p[n] == from) p[n] = to; +} + + +static void trydecpoint (LexState *ls, SemInfo *seminfo) { + /* format error: try to update decimal point separator */ + struct lconv *cv = localeconv(); + char old = ls->decpoint; + ls->decpoint = (cv ? cv->decimal_point[0] : '.'); + buffreplace(ls, old, ls->decpoint); /* try updated decimal separator */ + if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) { + /* format error with correct decimal point: no more options */ + buffreplace(ls, ls->decpoint, '.'); /* undo change (for error message) */ + luaX_lexerror(ls, "malformed number", TK_NUMBER); + } +} + + +/* LUA_NUMBER */ +static void read_numeral (LexState *ls, SemInfo *seminfo) { + lua_assert(isdigit(ls->current)); + do { + save_and_next(ls); + } while (isdigit(ls->current) || ls->current == '.'); + if (check_next(ls, "Ee")) /* `E'? */ + check_next(ls, "+-"); /* optional exponent sign */ + while (isalnum(ls->current) || ls->current == '_') + save_and_next(ls); + save(ls, '\0'); + buffreplace(ls, '.', ls->decpoint); /* follow locale for decimal point */ + if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) /* format error? */ + trydecpoint(ls, seminfo); /* try to update decimal point separator */ +} + + +static int skip_sep (LexState *ls) { + int count = 0; + int s = ls->current; + lua_assert(s == '[' || s == ']'); + save_and_next(ls); + while (ls->current == '=') { + save_and_next(ls); + count++; + } + return (ls->current == s) ? count : (-count) - 1; +} + + +static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) { + int cont = 0; + (void)(cont); /* avoid warnings when `cont' is not used */ + save_and_next(ls); /* skip 2nd `[' */ + if (currIsNewline(ls)) /* string starts with a newline? */ + inclinenumber(ls); /* skip it */ + for (;;) { + switch (ls->current) { + case EOZ: + luaX_lexerror(ls, (seminfo) ? "unfinished long string" : + "unfinished long comment", TK_EOS); + break; /* to avoid warnings */ +#if defined(LUA_COMPAT_LSTR) + case '[': { + if (skip_sep(ls) == sep) { + save_and_next(ls); /* skip 2nd `[' */ + cont++; +#if LUA_COMPAT_LSTR == 1 + if (sep == 0) + luaX_lexerror(ls, "nesting of [[...]] is deprecated", '['); +#endif + } + break; + } +#endif + case ']': { + if (skip_sep(ls) == sep) { + save_and_next(ls); /* skip 2nd `]' */ +#if defined(LUA_COMPAT_LSTR) && LUA_COMPAT_LSTR == 2 + cont--; + if (sep == 0 && cont >= 0) break; +#endif + goto endloop; + } + break; + } + case '\n': + case '\r': { + save(ls, '\n'); + inclinenumber(ls); + if (!seminfo) luaZ_resetbuffer(ls->buff); /* avoid wasting space */ + break; + } + default: { + if (seminfo) save_and_next(ls); + else next(ls); + } + } + } endloop: + if (seminfo) + seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + (2 + sep), + luaZ_bufflen(ls->buff) - 2*(2 + sep)); +} + + +static void read_string (LexState *ls, int del, SemInfo *seminfo) { + save_and_next(ls); + while (ls->current != del) { + switch (ls->current) { + case EOZ: + luaX_lexerror(ls, "unfinished string", TK_EOS); + continue; /* to avoid warnings */ + case '\n': + case '\r': + luaX_lexerror(ls, "unfinished string", TK_STRING); + continue; /* to avoid warnings */ + case '\\': { + int c; + next(ls); /* do not save the `\' */ + switch (ls->current) { + case 'a': c = '\a'; break; + case 'b': c = '\b'; break; + case 'f': c = '\f'; break; + case 'n': c = '\n'; break; + case 'r': c = '\r'; break; + case 't': c = '\t'; break; + case 'v': c = '\v'; break; + case '\n': /* go through */ + case '\r': save(ls, '\n'); inclinenumber(ls); continue; + case EOZ: continue; /* will raise an error next loop */ + default: { + if (!isdigit(ls->current)) + save_and_next(ls); /* handles \\, \", \', and \? */ + else { /* \xxx */ + int i = 0; + c = 0; + do { + c = 10*c + (ls->current-'0'); + next(ls); + } while (++i<3 && isdigit(ls->current)); + if (c > UCHAR_MAX) + luaX_lexerror(ls, "escape sequence too large", TK_STRING); + save(ls, c); + } + continue; + } + } + save(ls, c); + next(ls); + continue; + } + default: + save_and_next(ls); + } + } + save_and_next(ls); /* skip delimiter */ + seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1, + luaZ_bufflen(ls->buff) - 2); +} + + +static int llex (LexState *ls, SemInfo *seminfo) { + luaZ_resetbuffer(ls->buff); + for (;;) { + switch (ls->current) { + case '\n': + case '\r': { + inclinenumber(ls); + continue; + } + case '-': { + next(ls); + if (ls->current != '-') return '-'; + /* else is a comment */ + next(ls); + if (ls->current == '[') { + int sep = skip_sep(ls); + luaZ_resetbuffer(ls->buff); /* `skip_sep' may dirty the buffer */ + if (sep >= 0) { + read_long_string(ls, NULL, sep); /* long comment */ + luaZ_resetbuffer(ls->buff); + continue; + } + } + /* else short comment */ + while (!currIsNewline(ls) && ls->current != EOZ) + next(ls); + continue; + } + case '[': { + int sep = skip_sep(ls); + if (sep >= 0) { + read_long_string(ls, seminfo, sep); + return TK_STRING; + } + else if (sep == -1) return '['; + else luaX_lexerror(ls, "invalid long string delimiter", TK_STRING); + } + case '=': { + next(ls); + if (ls->current != '=') return '='; + else { next(ls); return TK_EQ; } + } + case '<': { + next(ls); + if (ls->current != '=') return '<'; + else { next(ls); return TK_LE; } + } + case '>': { + next(ls); + if (ls->current != '=') return '>'; + else { next(ls); return TK_GE; } + } + case '~': { + next(ls); + if (ls->current != '=') return '~'; + else { next(ls); return TK_NE; } + } + case '"': + case '\'': { + read_string(ls, ls->current, seminfo); + return TK_STRING; + } + case '.': { + save_and_next(ls); + if (check_next(ls, ".")) { + if (check_next(ls, ".")) + return TK_DOTS; /* ... */ + else return TK_CONCAT; /* .. */ + } + else if (!isdigit(ls->current)) return '.'; + else { + read_numeral(ls, seminfo); + return TK_NUMBER; + } + } + case EOZ: { + return TK_EOS; + } + default: { + if (isspace(ls->current)) { + lua_assert(!currIsNewline(ls)); + next(ls); + continue; + } + else if (isdigit(ls->current)) { + read_numeral(ls, seminfo); + return TK_NUMBER; + } + else if (isalpha(ls->current) || ls->current == '_') { + /* identifier or reserved word */ + TString *ts; + do { + save_and_next(ls); + } while (isalnum(ls->current) || ls->current == '_'); + ts = luaX_newstring(ls, luaZ_buffer(ls->buff), + luaZ_bufflen(ls->buff)); + if (ts->tsv.reserved > 0) /* reserved word? */ + return ts->tsv.reserved - 1 + FIRST_RESERVED; + else { + seminfo->ts = ts; + return TK_NAME; + } + } + else { + int c = ls->current; + next(ls); + return c; /* single-char tokens (+ - / ...) */ + } + } + } + } +} + + +void luaX_next (LexState *ls) { + ls->lastline = ls->linenumber; + if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */ + ls->t = ls->lookahead; /* use this one */ + ls->lookahead.token = TK_EOS; /* and discharge it */ + } + else + ls->t.token = llex(ls, &ls->t.seminfo); /* read next token */ +} + + +void luaX_lookahead (LexState *ls) { + lua_assert(ls->lookahead.token == TK_EOS); + ls->lookahead.token = llex(ls, &ls->lookahead.seminfo); +} + diff --git a/user/lua-5.1.4/src/llex.h b/user/lua-5.1.4/src/llex.h new file mode 100644 index 0000000..a9201ce --- /dev/null +++ b/user/lua-5.1.4/src/llex.h @@ -0,0 +1,81 @@ +/* +** $Id: llex.h,v 1.58.1.1 2007/12/27 13:02:25 roberto Exp $ +** Lexical Analyzer +** See Copyright Notice in lua.h +*/ + +#ifndef llex_h +#define llex_h + +#include "lobject.h" +#include "lzio.h" + + +#define FIRST_RESERVED 257 + +/* maximum length of a reserved word */ +#define TOKEN_LEN (sizeof("function")/sizeof(char)) + + +/* +* WARNING: if you change the order of this enumeration, +* grep "ORDER RESERVED" +*/ +enum RESERVED { + /* terminal symbols denoted by reserved words */ + TK_AND = FIRST_RESERVED, TK_BREAK, + TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION, + TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT, + TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE, + /* other terminal symbols */ + TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, TK_NUMBER, + TK_NAME, TK_STRING, TK_EOS +}; + +/* number of reserved words */ +#define NUM_RESERVED (cast(int, TK_WHILE-FIRST_RESERVED+1)) + + +/* array with token `names' */ +LUAI_DATA const char *const luaX_tokens []; + + +typedef union { + lua_Number r; + TString *ts; +} SemInfo; /* semantics information */ + + +typedef struct Token { + int token; + SemInfo seminfo; +} Token; + + +typedef struct LexState { + int current; /* current character (charint) */ + int linenumber; /* input line counter */ + int lastline; /* line of last token `consumed' */ + Token t; /* current token */ + Token lookahead; /* look ahead token */ + struct FuncState *fs; /* `FuncState' is private to the parser */ + struct lua_State *L; + ZIO *z; /* input stream */ + Mbuffer *buff; /* buffer for tokens */ + TString *source; /* current source name */ + char decpoint; /* locale decimal point */ +} LexState; + + +LUAI_FUNC void luaX_init (lua_State *L); +LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, + TString *source); +LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l); +LUAI_FUNC void luaX_next (LexState *ls); +LUAI_FUNC void luaX_lookahead (LexState *ls); +LUAI_FUNC void luaX_lexerror (LexState *ls, const char *msg, int token); +LUAI_FUNC void luaX_syntaxerror (LexState *ls, const char *s); +LUAI_FUNC const char *luaX_token2str (LexState *ls, int token); + + +#endif diff --git a/user/lua-5.1.4/src/llex.o b/user/lua-5.1.4/src/llex.o new file mode 100644 index 0000000000000000000000000000000000000000..cc030d0bf48bee4fa3050a9bce259a76a3ed108f GIT binary patch literal 8288 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 literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/llimits.h b/user/lua-5.1.4/src/llimits.h new file mode 100644 index 0000000..ca8dcb7 --- /dev/null +++ b/user/lua-5.1.4/src/llimits.h @@ -0,0 +1,128 @@ +/* +** $Id: llimits.h,v 1.69.1.1 2007/12/27 13:02:25 roberto Exp $ +** Limits, basic types, and some other `installation-dependent' definitions +** See Copyright Notice in lua.h +*/ + +#ifndef llimits_h +#define llimits_h + + +#include +#include + + +#include "lua.h" + + +typedef LUAI_UINT32 lu_int32; + +typedef LUAI_UMEM lu_mem; + +typedef LUAI_MEM l_mem; + + + +/* chars used as small naturals (so that `char' is reserved for characters) */ +typedef unsigned char lu_byte; + + +#define MAX_SIZET ((size_t)(~(size_t)0)-2) + +#define MAX_LUMEM ((lu_mem)(~(lu_mem)0)-2) + + +#define MAX_INT (INT_MAX-2) /* maximum value of an int (-2 for safety) */ + +/* +** conversion of pointer to integer +** this is for hashing only; there is no problem if the integer +** cannot hold the whole pointer value +*/ +#define IntPoint(p) ((unsigned int)(lu_mem)(p)) + + + +/* type to ensure maximum alignment */ +typedef LUAI_USER_ALIGNMENT_T L_Umaxalign; + + +/* result of a `usual argument conversion' over lua_Number */ +typedef LUAI_UACNUMBER l_uacNumber; + + +/* internal assertions for in-house debugging */ +#ifdef lua_assert + +#define check_exp(c,e) (lua_assert(c), (e)) +#define api_check(l,e) lua_assert(e) + +#else + +#define lua_assert(c) ((void)0) +#define check_exp(c,e) (e) +#define api_check luai_apicheck + +#endif + + +#ifndef UNUSED +#define UNUSED(x) ((void)(x)) /* to avoid warnings */ +#endif + + +#ifndef cast +#define cast(t, exp) ((t)(exp)) +#endif + +#define cast_byte(i) cast(lu_byte, (i)) +#define cast_num(i) cast(lua_Number, (i)) +#define cast_int(i) cast(int, (i)) + + + +/* +** type for virtual-machine instructions +** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) +*/ +typedef lu_int32 Instruction; + + + +/* maximum stack for a Lua function */ +#define MAXSTACK 250 + + + +/* minimum size for the string table (must be power of 2) */ +#ifndef MINSTRTABSIZE +#define MINSTRTABSIZE 32 +#endif + + +/* minimum size for string buffer */ +#ifndef LUA_MINBUFFER +#define LUA_MINBUFFER 32 +#endif + + +#ifndef lua_lock +#define lua_lock(L) ((void) 0) +#define lua_unlock(L) ((void) 0) +#endif + +#ifndef luai_threadyield +#define luai_threadyield(L) {lua_unlock(L); lua_lock(L);} +#endif + + +/* +** macro to control inclusion of some hard tests on stack reallocation +*/ +#ifndef HARDSTACKTESTS +#define condhardstacktests(x) ((void)0) +#else +#define condhardstacktests(x) x +#endif + +#endif diff --git a/user/lua-5.1.4/src/lmathlib.c b/user/lua-5.1.4/src/lmathlib.c new file mode 100644 index 0000000..441fbf7 --- /dev/null +++ b/user/lua-5.1.4/src/lmathlib.c @@ -0,0 +1,263 @@ +/* +** $Id: lmathlib.c,v 1.67.1.1 2007/12/27 13:02:25 roberto Exp $ +** Standard mathematical library +** See Copyright Notice in lua.h +*/ + + +#include +#include + +#define lmathlib_c +#define LUA_LIB + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +#undef PI +#define PI (3.14159265358979323846) +#define RADIANS_PER_DEGREE (PI/180.0) + + + +static int math_abs (lua_State *L) { + lua_pushnumber(L, fabs(luaL_checknumber(L, 1))); + return 1; +} + +static int math_sin (lua_State *L) { + lua_pushnumber(L, sin(luaL_checknumber(L, 1))); + return 1; +} + +static int math_sinh (lua_State *L) { + lua_pushnumber(L, sinh(luaL_checknumber(L, 1))); + return 1; +} + +static int math_cos (lua_State *L) { + lua_pushnumber(L, cos(luaL_checknumber(L, 1))); + return 1; +} + +static int math_cosh (lua_State *L) { + lua_pushnumber(L, cosh(luaL_checknumber(L, 1))); + return 1; +} + +static int math_tan (lua_State *L) { + lua_pushnumber(L, tan(luaL_checknumber(L, 1))); + return 1; +} + +static int math_tanh (lua_State *L) { + lua_pushnumber(L, tanh(luaL_checknumber(L, 1))); + return 1; +} + +static int math_asin (lua_State *L) { + lua_pushnumber(L, asin(luaL_checknumber(L, 1))); + return 1; +} + +static int math_acos (lua_State *L) { + lua_pushnumber(L, acos(luaL_checknumber(L, 1))); + return 1; +} + +static int math_atan (lua_State *L) { + lua_pushnumber(L, atan(luaL_checknumber(L, 1))); + return 1; +} + +static int math_atan2 (lua_State *L) { + lua_pushnumber(L, atan2(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); + return 1; +} + +static int math_ceil (lua_State *L) { + lua_pushnumber(L, ceil(luaL_checknumber(L, 1))); + return 1; +} + +static int math_floor (lua_State *L) { + lua_pushnumber(L, floor(luaL_checknumber(L, 1))); + return 1; +} + +static int math_fmod (lua_State *L) { + lua_pushnumber(L, fmod(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); + return 1; +} + +static int math_modf (lua_State *L) { + double ip; + double fp = modf(luaL_checknumber(L, 1), &ip); + lua_pushnumber(L, ip); + lua_pushnumber(L, fp); + return 2; +} + +static int math_sqrt (lua_State *L) { + lua_pushnumber(L, sqrt(luaL_checknumber(L, 1))); + return 1; +} + +static int math_pow (lua_State *L) { + lua_pushnumber(L, pow(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); + return 1; +} + +static int math_log (lua_State *L) { + lua_pushnumber(L, log(luaL_checknumber(L, 1))); + return 1; +} + +static int math_log10 (lua_State *L) { + lua_pushnumber(L, log10(luaL_checknumber(L, 1))); + return 1; +} + +static int math_exp (lua_State *L) { + lua_pushnumber(L, exp(luaL_checknumber(L, 1))); + return 1; +} + +static int math_deg (lua_State *L) { + lua_pushnumber(L, luaL_checknumber(L, 1)/RADIANS_PER_DEGREE); + return 1; +} + +static int math_rad (lua_State *L) { + lua_pushnumber(L, luaL_checknumber(L, 1)*RADIANS_PER_DEGREE); + return 1; +} + +static int math_frexp (lua_State *L) { + int e; + lua_pushnumber(L, frexp(luaL_checknumber(L, 1), &e)); + lua_pushinteger(L, e); + return 2; +} + +static int math_ldexp (lua_State *L) { + lua_pushnumber(L, ldexp(luaL_checknumber(L, 1), luaL_checkint(L, 2))); + return 1; +} + + + +static int math_min (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + lua_Number dmin = luaL_checknumber(L, 1); + int i; + for (i=2; i<=n; i++) { + lua_Number d = luaL_checknumber(L, i); + if (d < dmin) + dmin = d; + } + lua_pushnumber(L, dmin); + return 1; +} + + +static int math_max (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + lua_Number dmax = luaL_checknumber(L, 1); + int i; + for (i=2; i<=n; i++) { + lua_Number d = luaL_checknumber(L, i); + if (d > dmax) + dmax = d; + } + lua_pushnumber(L, dmax); + return 1; +} + + +static int math_random (lua_State *L) { + /* the `%' avoids the (rare) case of r==1, and is needed also because on + some systems (SunOS!) `rand()' may return a value larger than RAND_MAX */ + lua_Number r = (lua_Number)(rand()%RAND_MAX) / (lua_Number)RAND_MAX; + switch (lua_gettop(L)) { /* check number of arguments */ + case 0: { /* no arguments */ + lua_pushnumber(L, r); /* Number between 0 and 1 */ + break; + } + case 1: { /* only upper limit */ + int u = luaL_checkint(L, 1); + luaL_argcheck(L, 1<=u, 1, "interval is empty"); + lua_pushnumber(L, floor(r*u)+1); /* int between 1 and `u' */ + break; + } + case 2: { /* lower and upper limits */ + int l = luaL_checkint(L, 1); + int u = luaL_checkint(L, 2); + luaL_argcheck(L, l<=u, 2, "interval is empty"); + lua_pushnumber(L, floor(r*(u-l+1))+l); /* int between `l' and `u' */ + break; + } + default: return luaL_error(L, "wrong number of arguments"); + } + return 1; +} + + +static int math_randomseed (lua_State *L) { + srand(luaL_checkint(L, 1)); + return 0; +} + + +static const luaL_Reg mathlib[] = { + {"abs", math_abs}, + {"acos", math_acos}, + {"asin", math_asin}, + {"atan2", math_atan2}, + {"atan", math_atan}, + {"ceil", math_ceil}, + {"cosh", math_cosh}, + {"cos", math_cos}, + {"deg", math_deg}, + {"exp", math_exp}, + {"floor", math_floor}, + {"fmod", math_fmod}, + {"frexp", math_frexp}, + {"ldexp", math_ldexp}, + {"log10", math_log10}, + {"log", math_log}, + {"max", math_max}, + {"min", math_min}, + {"modf", math_modf}, + {"pow", math_pow}, + {"rad", math_rad}, + {"random", math_random}, + {"randomseed", math_randomseed}, + {"sinh", math_sinh}, + {"sin", math_sin}, + {"sqrt", math_sqrt}, + {"tanh", math_tanh}, + {"tan", math_tan}, + {NULL, NULL} +}; + + +/* +** Open math library +*/ +LUALIB_API int luaopen_math (lua_State *L) { + luaL_register(L, LUA_MATHLIBNAME, mathlib); + lua_pushnumber(L, PI); + lua_setfield(L, -2, "pi"); + lua_pushnumber(L, HUGE_VAL); + lua_setfield(L, -2, "huge"); +#if defined(LUA_COMPAT_MOD) + lua_getfield(L, -1, "fmod"); + lua_setfield(L, -2, "mod"); +#endif + return 1; +} + diff --git a/user/lua-5.1.4/src/lmathlib.o b/user/lua-5.1.4/src/lmathlib.o new file mode 100644 index 0000000000000000000000000000000000000000..896af6880edfe673ac0574bd1c5a6a579822af2e GIT binary patch literal 7128 zcmds5eQcH08GmjITG$wjFoI5?b9c}R-0^WyK13=|klAf)3d3nB{kZMzyzQ;`qf{f% z<)ZVh)RbfpW3)lCEYp$28A6!Tt)+wyw?CSFur}k;lAr-gj3!JfGTHBU-sfE2`-Z_B zCMG+{dw=KmJkNQ~InVie+O4H!D}6qn*y59Xxxz$dj&U?W14S}czGzJiu1&xFKZ%p?90RzhP6Y5WO{ti1oKmh|hjqz8_TayZC( zpnSa7K6Plq0nX~-@}8kF9qy7d{t>isjr+tH_M9EJ%S-yh_BWc5y792o3;;-%X_QW*Tdi-D=PQ=W%WI;OUm}Z*>{pllS zr>8FaGUbC?=KU@YYtX^wX@tPqXG#Y%XA!vO(J&gi+2}KUsUF|Lfz5x15_YbL&2)D5 zhKlkY#25SVv*^G7SmxBgV5Yyb`6iAbzvEN%f8{>NIZvM=-V4&@=W(N?lf&uFmrTH3 z$H^?gN~OCmyqiASJv_Dh;^g9k>E7=`$qYeQ$r;kM0}(&x&1GJRaFBDAqKLjznNc+D=O9xQUM zABT0=bh+?w`Uv{m8cQAV6<WcDL%{zDSo3oBeyqyBMw@>Yhm_a_4NX!nX2ZXLlyezU;`kukHHe#_zm0 zepz3o=g~2=&ik7>QH?|pa}CvYC?4qYH5<%NHiLg+8FDR8uJ^in=@M?(K-yKMH=7)L#UOe=q8C( z*5GTbi8d(2L!lZ$KVkkz{IOU<&|#QAn9P4D%OEeoFvc;F~}J9t3n@JV$`7yq>g7nziD= zkH0pmWZ{e7-?MUH$5L3~O&YitR$K8cl~v1^FDfirTa|1~BnyLqU|`;?VA8Pp#SRw< z#2;@+R8|2KF$cr877IlJiBL;I0yS7>2~@@75{N}fXgwz|2NX7rD66WDCly9OrZzzY#lowpSD4-q741Bb|p51KN(EnU~EcEwBr)qwwXDng-DLKihnqQ8c-+Fv*yH?myZVUbK;~AhG z=fm<0?EFsE{8Gn{$B$^s-rPT7v$`+Cz{ZZYwA*4E0j&?BjS1D;#^NksKwm<=2p`AB zHRjs7{rM+|-0f;;{lP4!xaA|{gUfDZ?qBEh@9u$|yek8_S;^Je$Tfy!4 zZv`K8>HXk*8*F>Jvn5|J5m(92IVs!^aO5iafo`7&Ap@XzuaeB&{{#mXt;K3?tN z>peW=;V}7C8_`4qdo`;|J z@QWUfO_eQ-_c#y#iih9g;gdc5b`PKK;WIsau7}^{;Symc7OAfaRGXX(HG>sQfvBor z0%a;pxJ-pfkFA8An#qWajQNqRsM5)#ObTT*Ce@;AlXtP=BxgpcX_u)p6?0lJF*7wM zT|*O8ki9uFlg^o{lixX2lT^|>lRYD1K4>dCHj^wG88b*n>*SJ-FgqQSYDSWk(WX!% z29E3%q^u$qs;iG9X(g*@O2)%Zs%mIFl&Gx_MQRMGbCI%&>Tsy~Q8i`1_>fvMtu*;1 z6HVjZ*fA@vLl<$z#yU$xZBA>YWfh@V3^}f8h&&ew$Ukg*XS}Rr!9E|DK3M>@Ai5lZc1+U&J8p zeY}Ht^O36&;eU?_0#Z9vR#09r^q5A+Eo+r;6Dpw9CneTpVx`d zAEzAgJW0Mln9Piz=Uicbwy2LWJMd#CzbM zi2j~d`A*_ek(X5dDzOA{QT?0!lZXhlb`H|{(sl1c89Q#S-$5nok zxB~l0$F6UtkZKdHP``8MUxDBrHU zL;25?Kd1Z!<-3*tT=_4R?^XV)@_ot=D1SqFm-0i(k1GF@@?PbCRo + +#define lmem_c +#define LUA_CORE + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" + + + +/* +** About the realloc function: +** void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize); +** (`osize' is the old size, `nsize' is the new size) +** +** Lua ensures that (ptr == NULL) iff (osize == 0). +** +** * frealloc(ud, NULL, 0, x) creates a new block of size `x' +** +** * frealloc(ud, p, x, 0) frees the block `p' +** (in this specific case, frealloc must return NULL). +** particularly, frealloc(ud, NULL, 0, 0) does nothing +** (which is equivalent to free(NULL) in ANSI C) +** +** frealloc returns NULL if it cannot create or reallocate the area +** (any reallocation to an equal or smaller size cannot fail!) +*/ + + + +#define MINSIZEARRAY 4 + + +void *luaM_growaux_ (lua_State *L, void *block, int *size, size_t size_elems, + int limit, const char *errormsg) { + void *newblock; + int newsize; + if (*size >= limit/2) { /* cannot double it? */ + if (*size >= limit) /* cannot grow even a little? */ + luaG_runerror(L, errormsg); + newsize = limit; /* still have at least one free place */ + } + else { + newsize = (*size)*2; + if (newsize < MINSIZEARRAY) + newsize = MINSIZEARRAY; /* minimum size */ + } + newblock = luaM_reallocv(L, block, *size, newsize, size_elems); + *size = newsize; /* update only when everything else is OK */ + return newblock; +} + + +void *luaM_toobig (lua_State *L) { + luaG_runerror(L, "memory allocation error: block too big"); + return NULL; /* to avoid warnings */ +} + + + +/* +** generic allocation routine. +*/ +void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) { + global_State *g = G(L); + lua_assert((osize == 0) == (block == NULL)); + block = (*g->frealloc)(g->ud, block, osize, nsize); + if (block == NULL && nsize > 0) + luaD_throw(L, LUA_ERRMEM); + lua_assert((nsize == 0) == (block == NULL)); + g->totalbytes = (g->totalbytes - osize) + nsize; + return block; +} + diff --git a/user/lua-5.1.4/src/lmem.h b/user/lua-5.1.4/src/lmem.h new file mode 100644 index 0000000..7c2dcb3 --- /dev/null +++ b/user/lua-5.1.4/src/lmem.h @@ -0,0 +1,49 @@ +/* +** $Id: lmem.h,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $ +** Interface to Memory Manager +** See Copyright Notice in lua.h +*/ + +#ifndef lmem_h +#define lmem_h + + +#include + +#include "llimits.h" +#include "lua.h" + +#define MEMERRMSG "not enough memory" + + +#define luaM_reallocv(L,b,on,n,e) \ + ((cast(size_t, (n)+1) <= MAX_SIZET/(e)) ? /* +1 to avoid warnings */ \ + luaM_realloc_(L, (b), (on)*(e), (n)*(e)) : \ + luaM_toobig(L)) + +#define luaM_freemem(L, b, s) luaM_realloc_(L, (b), (s), 0) +#define luaM_free(L, b) luaM_realloc_(L, (b), sizeof(*(b)), 0) +#define luaM_freearray(L, b, n, t) luaM_reallocv(L, (b), n, 0, sizeof(t)) + +#define luaM_malloc(L,t) luaM_realloc_(L, NULL, 0, (t)) +#define luaM_new(L,t) cast(t *, luaM_malloc(L, sizeof(t))) +#define luaM_newvector(L,n,t) \ + cast(t *, luaM_reallocv(L, NULL, 0, n, sizeof(t))) + +#define luaM_growvector(L,v,nelems,size,t,limit,e) \ + if ((nelems)+1 > (size)) \ + ((v)=cast(t *, luaM_growaux_(L,v,&(size),sizeof(t),limit,e))) + +#define luaM_reallocvector(L, v,oldn,n,t) \ + ((v)=cast(t *, luaM_reallocv(L, v, oldn, n, sizeof(t)))) + + +LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize, + size_t size); +LUAI_FUNC void *luaM_toobig (lua_State *L); +LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int *size, + size_t size_elem, int limit, + const char *errormsg); + +#endif + diff --git a/user/lua-5.1.4/src/lmem.o b/user/lua-5.1.4/src/lmem.o new file mode 100644 index 0000000000000000000000000000000000000000..fc37ec2b42ecd661da05b6e50c53655698e8565c GIT binary patch literal 1332 zcma)6-Afcv6u+~()s_oRCSg>#!D>o4xVb^AQGsq&lrOR1i!8I-q~h*Q%-%5t7azoj z%e3JC(Sr~5U_FFopwUbD(jSn4kq;J;KA79@+?i=t2mIilQ)| z6c%JPi?Qy2izKAzU=1wnhf0|ipXatNJE^d+cOAP~l=qynDn@=d!>W^t2p)@wnOIm1 z#6nKLDnha9y~zABKh?Rflm;Ax;Z%7~Y>li`p0!iL`JeoglMaj2#wyN);1SKS&An>1 z>ZCTlt}V!VEvQE@9Y9VA$Cux(R3@3kJE(yXRkqY3TWWSri0xOKt;+U?-Q??;c=CJM zt_&&h^`&1(y|a^CD_x->ykw&1U~iMGl4zRS56-^(bK?0S6n{xAB-gArV!Ls16;nnq zbmL;5oEPb6bT8%CCkqwc&YaX4AM^mU@r9!a#tKHkw5FqaK5yo9K5iDHhGm&nZ!`4NFSwSmbFf{7m2Cn=ujDV#A^m0yY>zUfKn#OEV9>&Q2c!{_%#FvSi3C63~~)syHZ4!wtV3{3M; ze=3;nu0G!qfLrkS>FNRjSl_+D1UtgvZ;EFf{b>dMnQI@WN_ +#include + + +#define loadlib_c +#define LUA_LIB + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* prefix for open functions in C libraries */ +#define LUA_POF "luaopen_" + +/* separator for open functions in C libraries */ +#define LUA_OFSEP "_" + + +#define LIBPREFIX "LOADLIB: " + +#define POF LUA_POF +#define LIB_FAIL "open" + + +/* error codes for ll_loadfunc */ +#define ERRLIB 1 +#define ERRFUNC 2 + +#define setprogdir(L) ((void)0) + + +static void ll_unloadlib (void *lib); +static void *ll_load (lua_State *L, const char *path); +static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym); + + + +#if defined(LUA_DL_DLOPEN) +/* +** {======================================================================== +** This is an implementation of loadlib based on the dlfcn interface. +** The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD, +** NetBSD, AIX 4.2, HPUX 11, and probably most other Unix flavors, at least +** as an emulation layer on top of native functions. +** ========================================================================= +*/ + +#include + +static void ll_unloadlib (void *lib) { + dlclose(lib); +} + + +static void *ll_load (lua_State *L, const char *path) { + void *lib = dlopen(path, RTLD_NOW); + if (lib == NULL) lua_pushstring(L, dlerror()); + return lib; +} + + +static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { + lua_CFunction f = (lua_CFunction)dlsym(lib, sym); + if (f == NULL) lua_pushstring(L, dlerror()); + return f; +} + +/* }====================================================== */ + + + +#elif defined(LUA_DL_DLL) +/* +** {====================================================================== +** This is an implementation of loadlib for Windows using native functions. +** ======================================================================= +*/ + +#include + + +#undef setprogdir + +static void setprogdir (lua_State *L) { + char buff[MAX_PATH + 1]; + char *lb; + DWORD nsize = sizeof(buff)/sizeof(char); + DWORD n = GetModuleFileNameA(NULL, buff, nsize); + if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL) + luaL_error(L, "unable to get ModuleFileName"); + else { + *lb = '\0'; + luaL_gsub(L, lua_tostring(L, -1), LUA_EXECDIR, buff); + lua_remove(L, -2); /* remove original string */ + } +} + + +static void pusherror (lua_State *L) { + int error = GetLastError(); + char buffer[128]; + if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, error, 0, buffer, sizeof(buffer), NULL)) + lua_pushstring(L, buffer); + else + lua_pushfstring(L, "system error %d\n", error); +} + +static void ll_unloadlib (void *lib) { + FreeLibrary((HINSTANCE)lib); +} + + +static void *ll_load (lua_State *L, const char *path) { + HINSTANCE lib = LoadLibraryA(path); + if (lib == NULL) pusherror(L); + return lib; +} + + +static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { + lua_CFunction f = (lua_CFunction)GetProcAddress((HINSTANCE)lib, sym); + if (f == NULL) pusherror(L); + return f; +} + +/* }====================================================== */ + + + +#elif defined(LUA_DL_DYLD) +/* +** {====================================================================== +** Native Mac OS X / Darwin Implementation +** ======================================================================= +*/ + +#include + + +/* Mac appends a `_' before C function names */ +#undef POF +#define POF "_" LUA_POF + + +static void pusherror (lua_State *L) { + const char *err_str; + const char *err_file; + NSLinkEditErrors err; + int err_num; + NSLinkEditError(&err, &err_num, &err_file, &err_str); + lua_pushstring(L, err_str); +} + + +static const char *errorfromcode (NSObjectFileImageReturnCode ret) { + switch (ret) { + case NSObjectFileImageInappropriateFile: + return "file is not a bundle"; + case NSObjectFileImageArch: + return "library is for wrong CPU type"; + case NSObjectFileImageFormat: + return "bad format"; + case NSObjectFileImageAccess: + return "cannot access file"; + case NSObjectFileImageFailure: + default: + return "unable to load library"; + } +} + + +static void ll_unloadlib (void *lib) { + NSUnLinkModule((NSModule)lib, NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES); +} + + +static void *ll_load (lua_State *L, const char *path) { + NSObjectFileImage img; + NSObjectFileImageReturnCode ret; + /* this would be a rare case, but prevents crashing if it happens */ + if(!_dyld_present()) { + lua_pushliteral(L, "dyld not present"); + return NULL; + } + ret = NSCreateObjectFileImageFromFile(path, &img); + if (ret == NSObjectFileImageSuccess) { + NSModule mod = NSLinkModule(img, path, NSLINKMODULE_OPTION_PRIVATE | + NSLINKMODULE_OPTION_RETURN_ON_ERROR); + NSDestroyObjectFileImage(img); + if (mod == NULL) pusherror(L); + return mod; + } + lua_pushstring(L, errorfromcode(ret)); + return NULL; +} + + +static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { + NSSymbol nss = NSLookupSymbolInModule((NSModule)lib, sym); + if (nss == NULL) { + lua_pushfstring(L, "symbol " LUA_QS " not found", sym); + return NULL; + } + return (lua_CFunction)NSAddressOfSymbol(nss); +} + +/* }====================================================== */ + + + +#else +/* +** {====================================================== +** Fallback for other systems +** ======================================================= +*/ + +#undef LIB_FAIL +#define LIB_FAIL "absent" + + +#define DLMSG "dynamic libraries not enabled; check your Lua installation" + + +static void ll_unloadlib (void *lib) { + (void)lib; /* to avoid warnings */ +} + + +static void *ll_load (lua_State *L, const char *path) { + (void)path; /* to avoid warnings */ + lua_pushliteral(L, DLMSG); + return NULL; +} + + +static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { + (void)lib; (void)sym; /* to avoid warnings */ + lua_pushliteral(L, DLMSG); + return NULL; +} + +/* }====================================================== */ +#endif + + + +static void **ll_register (lua_State *L, const char *path) { + void **plib; + lua_pushfstring(L, "%s%s", LIBPREFIX, path); + lua_gettable(L, LUA_REGISTRYINDEX); /* check library in registry? */ + if (!lua_isnil(L, -1)) /* is there an entry? */ + plib = (void **)lua_touserdata(L, -1); + else { /* no entry yet; create one */ + lua_pop(L, 1); + plib = (void **)lua_newuserdata(L, sizeof(const void *)); + *plib = NULL; + luaL_getmetatable(L, "_LOADLIB"); + lua_setmetatable(L, -2); + lua_pushfstring(L, "%s%s", LIBPREFIX, path); + lua_pushvalue(L, -2); + lua_settable(L, LUA_REGISTRYINDEX); + } + return plib; +} + + +/* +** __gc tag method: calls library's `ll_unloadlib' function with the lib +** handle +*/ +static int gctm (lua_State *L) { + void **lib = (void **)luaL_checkudata(L, 1, "_LOADLIB"); + if (*lib) ll_unloadlib(*lib); + *lib = NULL; /* mark library as closed */ + return 0; +} + + +static int ll_loadfunc (lua_State *L, const char *path, const char *sym) { + void **reg = ll_register(L, path); + if (*reg == NULL) *reg = ll_load(L, path); + if (*reg == NULL) + return ERRLIB; /* unable to load library */ + else { + lua_CFunction f = ll_sym(L, *reg, sym); + if (f == NULL) + return ERRFUNC; /* unable to find function */ + lua_pushcfunction(L, f); + return 0; /* return function */ + } +} + + +static int ll_loadlib (lua_State *L) { + const char *path = luaL_checkstring(L, 1); + const char *init = luaL_checkstring(L, 2); + int stat = ll_loadfunc(L, path, init); + if (stat == 0) /* no errors? */ + return 1; /* return the loaded function */ + else { /* error; error message is on stack top */ + lua_pushnil(L); + lua_insert(L, -2); + lua_pushstring(L, (stat == ERRLIB) ? LIB_FAIL : "init"); + return 3; /* return nil, error message, and where */ + } +} + + + +/* +** {====================================================== +** 'require' function +** ======================================================= +*/ + + +static int readable (const char *filename) { + FILE *f = fopen(filename, "r"); /* try to open file */ + if (f == NULL) return 0; /* open failed */ + fclose(f); + return 1; +} + + +static const char *pushnexttemplate (lua_State *L, const char *path) { + const char *l; + while (*path == *LUA_PATHSEP) path++; /* skip separators */ + if (*path == '\0') return NULL; /* no more templates */ + l = strchr(path, *LUA_PATHSEP); /* find next separator */ + if (l == NULL) l = path + strlen(path); + lua_pushlstring(L, path, l - path); /* template */ + return l; +} + + +static const char *findfile (lua_State *L, const char *name, + const char *pname) { + const char *path; + name = luaL_gsub(L, name, ".", LUA_DIRSEP); + lua_getfield(L, LUA_ENVIRONINDEX, pname); + path = lua_tostring(L, -1); + if (path == NULL) + luaL_error(L, LUA_QL("package.%s") " must be a string", pname); + lua_pushliteral(L, ""); /* error accumulator */ + while ((path = pushnexttemplate(L, path)) != NULL) { + const char *filename; + filename = luaL_gsub(L, lua_tostring(L, -1), LUA_PATH_MARK, name); + lua_remove(L, -2); /* remove path template */ + if (readable(filename)) /* does file exist and is readable? */ + return filename; /* return that file name */ + lua_pushfstring(L, "\n\tno file " LUA_QS, filename); + lua_remove(L, -2); /* remove file name */ + lua_concat(L, 2); /* add entry to possible error message */ + } + return NULL; /* not found */ +} + + +static void loaderror (lua_State *L, const char *filename) { + luaL_error(L, "error loading module " LUA_QS " from file " LUA_QS ":\n\t%s", + lua_tostring(L, 1), filename, lua_tostring(L, -1)); +} + + +static int loader_Lua (lua_State *L) { + const char *filename; + const char *name = luaL_checkstring(L, 1); + filename = findfile(L, name, "path"); + if (filename == NULL) return 1; /* library not found in this path */ + if (luaL_loadfile(L, filename) != 0) + loaderror(L, filename); + return 1; /* library loaded successfully */ +} + + +static const char *mkfuncname (lua_State *L, const char *modname) { + const char *funcname; + const char *mark = strchr(modname, *LUA_IGMARK); + if (mark) modname = mark + 1; + funcname = luaL_gsub(L, modname, ".", LUA_OFSEP); + funcname = lua_pushfstring(L, POF"%s", funcname); + lua_remove(L, -2); /* remove 'gsub' result */ + return funcname; +} + + +static int loader_C (lua_State *L) { + const char *funcname; + const char *name = luaL_checkstring(L, 1); + const char *filename = findfile(L, name, "cpath"); + if (filename == NULL) return 1; /* library not found in this path */ + funcname = mkfuncname(L, name); + if (ll_loadfunc(L, filename, funcname) != 0) + loaderror(L, filename); + return 1; /* library loaded successfully */ +} + + +static int loader_Croot (lua_State *L) { + const char *funcname; + const char *filename; + const char *name = luaL_checkstring(L, 1); + const char *p = strchr(name, '.'); + int stat; + if (p == NULL) return 0; /* is root */ + lua_pushlstring(L, name, p - name); + filename = findfile(L, lua_tostring(L, -1), "cpath"); + if (filename == NULL) return 1; /* root not found */ + funcname = mkfuncname(L, name); + if ((stat = ll_loadfunc(L, filename, funcname)) != 0) { + if (stat != ERRFUNC) loaderror(L, filename); /* real error */ + lua_pushfstring(L, "\n\tno module " LUA_QS " in file " LUA_QS, + name, filename); + return 1; /* function not found */ + } + return 1; +} + + +static int loader_preload (lua_State *L) { + const char *name = luaL_checkstring(L, 1); + lua_getfield(L, LUA_ENVIRONINDEX, "preload"); + if (!lua_istable(L, -1)) + luaL_error(L, LUA_QL("package.preload") " must be a table"); + lua_getfield(L, -1, name); + if (lua_isnil(L, -1)) /* not found? */ + lua_pushfstring(L, "\n\tno field package.preload['%s']", name); + return 1; +} + + +static const int sentinel_ = 0; +#define sentinel ((void *)&sentinel_) + + +static int ll_require (lua_State *L) { + const char *name = luaL_checkstring(L, 1); + int i; + lua_settop(L, 1); /* _LOADED table will be at index 2 */ + lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); + lua_getfield(L, 2, name); + if (lua_toboolean(L, -1)) { /* is it there? */ + if (lua_touserdata(L, -1) == sentinel) /* check loops */ + luaL_error(L, "loop or previous error loading module " LUA_QS, name); + return 1; /* package is already loaded */ + } + /* else must load it; iterate over available loaders */ + lua_getfield(L, LUA_ENVIRONINDEX, "loaders"); + if (!lua_istable(L, -1)) + luaL_error(L, LUA_QL("package.loaders") " must be a table"); + lua_pushliteral(L, ""); /* error message accumulator */ + for (i=1; ; i++) { + lua_rawgeti(L, -2, i); /* get a loader */ + if (lua_isnil(L, -1)) + luaL_error(L, "module " LUA_QS " not found:%s", + name, lua_tostring(L, -2)); + lua_pushstring(L, name); + lua_call(L, 1, 1); /* call it */ + if (lua_isfunction(L, -1)) /* did it find module? */ + break; /* module loaded successfully */ + else if (lua_isstring(L, -1)) /* loader returned error message? */ + lua_concat(L, 2); /* accumulate it */ + else + lua_pop(L, 1); + } + lua_pushlightuserdata(L, sentinel); + lua_setfield(L, 2, name); /* _LOADED[name] = sentinel */ + lua_pushstring(L, name); /* pass name as argument to module */ + lua_call(L, 1, 1); /* run loaded module */ + if (!lua_isnil(L, -1)) /* non-nil return? */ + lua_setfield(L, 2, name); /* _LOADED[name] = returned value */ + lua_getfield(L, 2, name); + if (lua_touserdata(L, -1) == sentinel) { /* module did not set a value? */ + lua_pushboolean(L, 1); /* use true as result */ + lua_pushvalue(L, -1); /* extra copy to be returned */ + lua_setfield(L, 2, name); /* _LOADED[name] = true */ + } + return 1; +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** 'module' function +** ======================================================= +*/ + + +static void setfenv (lua_State *L) { + lua_Debug ar; + if (lua_getstack(L, 1, &ar) == 0 || + lua_getinfo(L, "f", &ar) == 0 || /* get calling function */ + lua_iscfunction(L, -1)) + luaL_error(L, LUA_QL("module") " not called from a Lua function"); + lua_pushvalue(L, -2); + lua_setfenv(L, -2); + lua_pop(L, 1); +} + + +static void dooptions (lua_State *L, int n) { + int i; + for (i = 2; i <= n; i++) { + lua_pushvalue(L, i); /* get option (a function) */ + lua_pushvalue(L, -2); /* module */ + lua_call(L, 1, 0); + } +} + + +static void modinit (lua_State *L, const char *modname) { + const char *dot; + lua_pushvalue(L, -1); + lua_setfield(L, -2, "_M"); /* module._M = module */ + lua_pushstring(L, modname); + lua_setfield(L, -2, "_NAME"); + dot = strrchr(modname, '.'); /* look for last dot in module name */ + if (dot == NULL) dot = modname; + else dot++; + /* set _PACKAGE as package name (full module name minus last part) */ + lua_pushlstring(L, modname, dot - modname); + lua_setfield(L, -2, "_PACKAGE"); +} + + +static int ll_module (lua_State *L) { + const char *modname = luaL_checkstring(L, 1); + int loaded = lua_gettop(L) + 1; /* index of _LOADED table */ + lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); + lua_getfield(L, loaded, modname); /* get _LOADED[modname] */ + if (!lua_istable(L, -1)) { /* not found? */ + lua_pop(L, 1); /* remove previous result */ + /* try global variable (and create one if it does not exist) */ + if (luaL_findtable(L, LUA_GLOBALSINDEX, modname, 1) != NULL) + return luaL_error(L, "name conflict for module " LUA_QS, modname); + lua_pushvalue(L, -1); + lua_setfield(L, loaded, modname); /* _LOADED[modname] = new table */ + } + /* check whether table already has a _NAME field */ + lua_getfield(L, -1, "_NAME"); + if (!lua_isnil(L, -1)) /* is table an initialized module? */ + lua_pop(L, 1); + else { /* no; initialize it */ + lua_pop(L, 1); + modinit(L, modname); + } + lua_pushvalue(L, -1); + setfenv(L); + dooptions(L, loaded - 1); + return 0; +} + + +static int ll_seeall (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + if (!lua_getmetatable(L, 1)) { + lua_createtable(L, 0, 1); /* create new metatable */ + lua_pushvalue(L, -1); + lua_setmetatable(L, 1); + } + lua_pushvalue(L, LUA_GLOBALSINDEX); + lua_setfield(L, -2, "__index"); /* mt.__index = _G */ + return 0; +} + + +/* }====================================================== */ + + + +/* auxiliary mark (for internal use) */ +#define AUXMARK "\1" + +static void setpath (lua_State *L, const char *fieldname, const char *envname, + const char *def) { + const char *path = getenv(envname); + if (path == NULL) /* no environment variable? */ + lua_pushstring(L, def); /* use default */ + else { + /* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */ + path = luaL_gsub(L, path, LUA_PATHSEP LUA_PATHSEP, + LUA_PATHSEP AUXMARK LUA_PATHSEP); + luaL_gsub(L, path, AUXMARK, def); + lua_remove(L, -2); + } + setprogdir(L); + lua_setfield(L, -2, fieldname); +} + + +static const luaL_Reg pk_funcs[] = { + {"loadlib", ll_loadlib}, + {"seeall", ll_seeall}, + {NULL, NULL} +}; + + +static const luaL_Reg ll_funcs[] = { + {"module", ll_module}, + {"require", ll_require}, + {NULL, NULL} +}; + + +static const lua_CFunction loaders[] = + {loader_preload, loader_Lua, loader_C, loader_Croot, NULL}; + + +LUALIB_API int luaopen_package (lua_State *L) { + int i; + /* create new type _LOADLIB */ + luaL_newmetatable(L, "_LOADLIB"); + lua_pushcfunction(L, gctm); + lua_setfield(L, -2, "__gc"); + /* create `package' table */ + luaL_register(L, LUA_LOADLIBNAME, pk_funcs); +#if defined(LUA_COMPAT_LOADLIB) + lua_getfield(L, -1, "loadlib"); + lua_setfield(L, LUA_GLOBALSINDEX, "loadlib"); +#endif + lua_pushvalue(L, -1); + lua_replace(L, LUA_ENVIRONINDEX); + /* create `loaders' table */ + lua_createtable(L, 0, sizeof(loaders)/sizeof(loaders[0]) - 1); + /* fill it with pre-defined loaders */ + for (i=0; loaders[i] != NULL; i++) { + lua_pushcfunction(L, loaders[i]); + lua_rawseti(L, -2, i+1); + } + lua_setfield(L, -2, "loaders"); /* put it in field `loaders' */ + setpath(L, "path", LUA_PATH, LUA_PATH_DEFAULT); /* set field `path' */ + setpath(L, "cpath", LUA_CPATH, LUA_CPATH_DEFAULT); /* set field `cpath' */ + /* store config information */ + lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATHSEP "\n" LUA_PATH_MARK "\n" + LUA_EXECDIR "\n" LUA_IGMARK); + lua_setfield(L, -2, "config"); + /* set field `loaded' */ + luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 2); + lua_setfield(L, -2, "loaded"); + /* set field `preload' */ + lua_newtable(L); + lua_setfield(L, -2, "preload"); + lua_pushvalue(L, LUA_GLOBALSINDEX); + luaL_register(L, NULL, ll_funcs); /* open lib into global table */ + lua_pop(L, 1); + return 1; /* return 'package' table */ +} + diff --git a/user/lua-5.1.4/src/loadlib.o b/user/lua-5.1.4/src/loadlib.o new file mode 100644 index 0000000000000000000000000000000000000000..2cb8f34a59451be202c7e5ea60182e6b9383240a GIT binary patch literal 9908 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 +#include +#include +#include +#include + +#define lobject_c +#define LUA_CORE + +#include "lua.h" + +#include "ldo.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "lvm.h" + + + +const TValue luaO_nilobject_ = {{NULL}, LUA_TNIL}; + + +/* +** converts an integer to a "floating point byte", represented as +** (eeeeexxx), where the real value is (1xxx) * 2^(eeeee - 1) if +** eeeee != 0 and (xxx) otherwise. +*/ +int luaO_int2fb (unsigned int x) { + int e = 0; /* expoent */ + while (x >= 16) { + x = (x+1) >> 1; + e++; + } + if (x < 8) return x; + else return ((e+1) << 3) | (cast_int(x) - 8); +} + + +/* converts back */ +int luaO_fb2int (int x) { + int e = (x >> 3) & 31; + if (e == 0) return x; + else return ((x & 7)+8) << (e - 1); +} + + +int luaO_log2 (unsigned int x) { + static const lu_byte log_2[256] = { + 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 + }; + int l = -1; + while (x >= 256) { l += 8; x >>= 8; } + return l + log_2[x]; + +} + + +int luaO_rawequalObj (const TValue *t1, const TValue *t2) { + if (ttype(t1) != ttype(t2)) return 0; + else switch (ttype(t1)) { + case LUA_TNIL: + return 1; + case LUA_TNUMBER: + return luai_numeq(nvalue(t1), nvalue(t2)); + case LUA_TBOOLEAN: + return bvalue(t1) == bvalue(t2); /* boolean true must be 1 !! */ + case LUA_TLIGHTUSERDATA: + return pvalue(t1) == pvalue(t2); + default: + lua_assert(iscollectable(t1)); + return gcvalue(t1) == gcvalue(t2); + } +} + + +int luaO_str2d (const char *s, lua_Number *result) { + char *endptr; + *result = lua_str2number(s, &endptr); + if (endptr == s) return 0; /* conversion failed */ + if (*endptr == 'x' || *endptr == 'X') /* maybe an hexadecimal constant? */ + *result = cast_num(strtoul(s, &endptr, 16)); + if (*endptr == '\0') return 1; /* most common case */ + while (isspace(cast(unsigned char, *endptr))) endptr++; + if (*endptr != '\0') return 0; /* invalid trailing characters? */ + return 1; +} + + + +static void pushstr (lua_State *L, const char *str) { + setsvalue2s(L, L->top, luaS_new(L, str)); + incr_top(L); +} + + +/* this function handles only `%d', `%c', %f, %p, and `%s' formats */ +const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { + int n = 1; + pushstr(L, ""); + for (;;) { + const char *e = strchr(fmt, '%'); + if (e == NULL) break; + setsvalue2s(L, L->top, luaS_newlstr(L, fmt, e-fmt)); + incr_top(L); + switch (*(e+1)) { + case 's': { + const char *s = va_arg(argp, char *); + if (s == NULL) s = "(null)"; + pushstr(L, s); + break; + } + case 'c': { + char buff[2]; + buff[0] = cast(char, va_arg(argp, int)); + buff[1] = '\0'; + pushstr(L, buff); + break; + } + case 'd': { + setnvalue(L->top, cast_num(va_arg(argp, int))); + incr_top(L); + break; + } + case 'f': { + setnvalue(L->top, cast_num(va_arg(argp, l_uacNumber))); + incr_top(L); + break; + } + case 'p': { + char buff[4*sizeof(void *) + 8]; /* should be enough space for a `%p' */ + sprintf(buff, "%p", va_arg(argp, void *)); + pushstr(L, buff); + break; + } + case '%': { + pushstr(L, "%"); + break; + } + default: { + char buff[3]; + buff[0] = '%'; + buff[1] = *(e+1); + buff[2] = '\0'; + pushstr(L, buff); + break; + } + } + n += 2; + fmt = e+2; + } + pushstr(L, fmt); + luaV_concat(L, n+1, cast_int(L->top - L->base) - 1); + L->top -= n; + return svalue(L->top - 1); +} + + +const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) { + const char *msg; + va_list argp; + va_start(argp, fmt); + msg = luaO_pushvfstring(L, fmt, argp); + va_end(argp); + return msg; +} + + +void luaO_chunkid (char *out, const char *source, size_t bufflen) { + if (*source == '=') { + strncpy(out, source+1, bufflen); /* remove first char */ + out[bufflen-1] = '\0'; /* ensures null termination */ + } + else { /* out = "source", or "...source" */ + if (*source == '@') { + size_t l; + source++; /* skip the `@' */ + bufflen -= sizeof(" '...' "); + l = strlen(source); + strcpy(out, ""); + if (l > bufflen) { + source += (l-bufflen); /* get last part of file name */ + strcat(out, "..."); + } + strcat(out, source); + } + else { /* out = [string "string"] */ + size_t len = strcspn(source, "\n\r"); /* stop at first newline */ + bufflen -= sizeof(" [string \"...\"] "); + if (len > bufflen) len = bufflen; + strcpy(out, "[string \""); + if (source[len] != '\0') { /* must truncate? */ + strncat(out, source, len); + strcat(out, "..."); + } + else + strcat(out, source); + strcat(out, "\"]"); + } + } +} diff --git a/user/lua-5.1.4/src/lobject.h b/user/lua-5.1.4/src/lobject.h new file mode 100644 index 0000000..f1e447e --- /dev/null +++ b/user/lua-5.1.4/src/lobject.h @@ -0,0 +1,381 @@ +/* +** $Id: lobject.h,v 2.20.1.2 2008/08/06 13:29:48 roberto Exp $ +** Type definitions for Lua objects +** See Copyright Notice in lua.h +*/ + + +#ifndef lobject_h +#define lobject_h + + +#include + + +#include "llimits.h" +#include "lua.h" + + +/* tags for values visible from Lua */ +#define LAST_TAG LUA_TTHREAD + +#define NUM_TAGS (LAST_TAG+1) + + +/* +** Extra tags for non-values +*/ +#define LUA_TPROTO (LAST_TAG+1) +#define LUA_TUPVAL (LAST_TAG+2) +#define LUA_TDEADKEY (LAST_TAG+3) + + +/* +** Union of all collectable objects +*/ +typedef union GCObject GCObject; + + +/* +** Common Header for all collectable objects (in macro form, to be +** included in other objects) +*/ +#define CommonHeader GCObject *next; lu_byte tt; lu_byte marked + + +/* +** Common header in struct form +*/ +typedef struct GCheader { + CommonHeader; +} GCheader; + + + + +/* +** Union of all Lua values +*/ +typedef union { + GCObject *gc; + void *p; + lua_Number n; + int b; +} Value; + + +/* +** Tagged Values +*/ + +#define TValuefields Value value; int tt + +typedef struct lua_TValue { + TValuefields; +} TValue; + + +/* Macros to test type */ +#define ttisnil(o) (ttype(o) == LUA_TNIL) +#define ttisnumber(o) (ttype(o) == LUA_TNUMBER) +#define ttisstring(o) (ttype(o) == LUA_TSTRING) +#define ttistable(o) (ttype(o) == LUA_TTABLE) +#define ttisfunction(o) (ttype(o) == LUA_TFUNCTION) +#define ttisboolean(o) (ttype(o) == LUA_TBOOLEAN) +#define ttisuserdata(o) (ttype(o) == LUA_TUSERDATA) +#define ttisthread(o) (ttype(o) == LUA_TTHREAD) +#define ttislightuserdata(o) (ttype(o) == LUA_TLIGHTUSERDATA) + +/* Macros to access values */ +#define ttype(o) ((o)->tt) +#define gcvalue(o) check_exp(iscollectable(o), (o)->value.gc) +#define pvalue(o) check_exp(ttislightuserdata(o), (o)->value.p) +#define nvalue(o) check_exp(ttisnumber(o), (o)->value.n) +#define rawtsvalue(o) check_exp(ttisstring(o), &(o)->value.gc->ts) +#define tsvalue(o) (&rawtsvalue(o)->tsv) +#define rawuvalue(o) check_exp(ttisuserdata(o), &(o)->value.gc->u) +#define uvalue(o) (&rawuvalue(o)->uv) +#define clvalue(o) check_exp(ttisfunction(o), &(o)->value.gc->cl) +#define hvalue(o) check_exp(ttistable(o), &(o)->value.gc->h) +#define bvalue(o) check_exp(ttisboolean(o), (o)->value.b) +#define thvalue(o) check_exp(ttisthread(o), &(o)->value.gc->th) + +#define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0)) + +/* +** for internal debug only +*/ +#define checkconsistency(obj) \ + lua_assert(!iscollectable(obj) || (ttype(obj) == (obj)->value.gc->gch.tt)) + +#define checkliveness(g,obj) \ + lua_assert(!iscollectable(obj) || \ + ((ttype(obj) == (obj)->value.gc->gch.tt) && !isdead(g, (obj)->value.gc))) + + +/* Macros to set values */ +#define setnilvalue(obj) ((obj)->tt=LUA_TNIL) + +#define setnvalue(obj,x) \ + { TValue *i_o=(obj); i_o->value.n=(x); i_o->tt=LUA_TNUMBER; } + +#define setpvalue(obj,x) \ + { TValue *i_o=(obj); i_o->value.p=(x); i_o->tt=LUA_TLIGHTUSERDATA; } + +#define setbvalue(obj,x) \ + { TValue *i_o=(obj); i_o->value.b=(x); i_o->tt=LUA_TBOOLEAN; } + +#define setsvalue(L,obj,x) \ + { TValue *i_o=(obj); \ + i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TSTRING; \ + checkliveness(G(L),i_o); } + +#define setuvalue(L,obj,x) \ + { TValue *i_o=(obj); \ + i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TUSERDATA; \ + checkliveness(G(L),i_o); } + +#define setthvalue(L,obj,x) \ + { TValue *i_o=(obj); \ + i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTHREAD; \ + checkliveness(G(L),i_o); } + +#define setclvalue(L,obj,x) \ + { TValue *i_o=(obj); \ + i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TFUNCTION; \ + checkliveness(G(L),i_o); } + +#define sethvalue(L,obj,x) \ + { TValue *i_o=(obj); \ + i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTABLE; \ + checkliveness(G(L),i_o); } + +#define setptvalue(L,obj,x) \ + { TValue *i_o=(obj); \ + i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TPROTO; \ + checkliveness(G(L),i_o); } + + + + +#define setobj(L,obj1,obj2) \ + { const TValue *o2=(obj2); TValue *o1=(obj1); \ + o1->value = o2->value; o1->tt=o2->tt; \ + checkliveness(G(L),o1); } + + +/* +** different types of sets, according to destination +*/ + +/* from stack to (same) stack */ +#define setobjs2s setobj +/* to stack (not from same stack) */ +#define setobj2s setobj +#define setsvalue2s setsvalue +#define sethvalue2s sethvalue +#define setptvalue2s setptvalue +/* from table to same table */ +#define setobjt2t setobj +/* to table */ +#define setobj2t setobj +/* to new object */ +#define setobj2n setobj +#define setsvalue2n setsvalue + +#define setttype(obj, tt) (ttype(obj) = (tt)) + + +#define iscollectable(o) (ttype(o) >= LUA_TSTRING) + + + +typedef TValue *StkId; /* index to stack elements */ + + +/* +** String headers for string table +*/ +typedef union TString { + L_Umaxalign dummy; /* ensures maximum alignment for strings */ + struct { + CommonHeader; + lu_byte reserved; + unsigned int hash; + size_t len; + } tsv; +} TString; + + +#define getstr(ts) cast(const char *, (ts) + 1) +#define svalue(o) getstr(rawtsvalue(o)) + + + +typedef union Udata { + L_Umaxalign dummy; /* ensures maximum alignment for `local' udata */ + struct { + CommonHeader; + struct Table *metatable; + struct Table *env; + size_t len; + } uv; +} Udata; + + + + +/* +** Function Prototypes +*/ +typedef struct Proto { + CommonHeader; + TValue *k; /* constants used by the function */ + Instruction *code; + struct Proto **p; /* functions defined inside the function */ + int *lineinfo; /* map from opcodes to source lines */ + struct LocVar *locvars; /* information about local variables */ + TString **upvalues; /* upvalue names */ + TString *source; + int sizeupvalues; + int sizek; /* size of `k' */ + int sizecode; + int sizelineinfo; + int sizep; /* size of `p' */ + int sizelocvars; + int linedefined; + int lastlinedefined; + GCObject *gclist; + lu_byte nups; /* number of upvalues */ + lu_byte numparams; + lu_byte is_vararg; + lu_byte maxstacksize; +} Proto; + + +/* masks for new-style vararg */ +#define VARARG_HASARG 1 +#define VARARG_ISVARARG 2 +#define VARARG_NEEDSARG 4 + + +typedef struct LocVar { + TString *varname; + int startpc; /* first point where variable is active */ + int endpc; /* first point where variable is dead */ +} LocVar; + + + +/* +** Upvalues +*/ + +typedef struct UpVal { + CommonHeader; + TValue *v; /* points to stack or to its own value */ + union { + TValue value; /* the value (when closed) */ + struct { /* double linked list (when open) */ + struct UpVal *prev; + struct UpVal *next; + } l; + } u; +} UpVal; + + +/* +** Closures +*/ + +#define ClosureHeader \ + CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist; \ + struct Table *env + +typedef struct CClosure { + ClosureHeader; + lua_CFunction f; + TValue upvalue[1]; +} CClosure; + + +typedef struct LClosure { + ClosureHeader; + struct Proto *p; + UpVal *upvals[1]; +} LClosure; + + +typedef union Closure { + CClosure c; + LClosure l; +} Closure; + + +#define iscfunction(o) (ttype(o) == LUA_TFUNCTION && clvalue(o)->c.isC) +#define isLfunction(o) (ttype(o) == LUA_TFUNCTION && !clvalue(o)->c.isC) + + +/* +** Tables +*/ + +typedef union TKey { + struct { + TValuefields; + struct Node *next; /* for chaining */ + } nk; + TValue tvk; +} TKey; + + +typedef struct Node { + TValue i_val; + TKey i_key; +} Node; + + +typedef struct Table { + CommonHeader; + lu_byte flags; /* 1<

lsizenode)) + + +#define luaO_nilobject (&luaO_nilobject_) + +LUAI_DATA const TValue luaO_nilobject_; + +#define ceillog2(x) (luaO_log2((x)-1) + 1) + +LUAI_FUNC int luaO_log2 (unsigned int x); +LUAI_FUNC int luaO_int2fb (unsigned int x); +LUAI_FUNC int luaO_fb2int (int x); +LUAI_FUNC int luaO_rawequalObj (const TValue *t1, const TValue *t2); +LUAI_FUNC int luaO_str2d (const char *s, lua_Number *result); +LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt, + va_list argp); +LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...); +LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len); + + +#endif + diff --git a/user/lua-5.1.4/src/lobject.o b/user/lua-5.1.4/src/lobject.o new file mode 100644 index 0000000000000000000000000000000000000000..7a80881ec945398138a27620e933bed83f959413 GIT binary patch literal 3676 zcmc&$Z){uD6~FJIZaqKp!Yp3yh z3Duh7={XWlPp-U)57UsQec)5~rPGkbssJyEWfRD>ESt7&B_f-G6yt(e$F|Jv*8R@= zW84ghP5ZDTUH|Uy-gD16_ndpL-*bV3eH_OzTR7%mA2Y^=1aoGe0UgZ6Zn9Mk40`9) zceS9P)WmUjZk#EzoHE1x@;&g0KP$B+b#dI4+rOUM{&O;P(_&~Y_wwDeGBK@h70 zf;uzvcZc$aR_SJCrAeu9iZ1+W1*+pL_{w#N;o>{B>sTzP%?)mu84*2 zwP7xlbMhPQdv*2Q0WBnG{Vr`lc<6CKavl!N<&_#I?STC=4=6PrC}9TERZ)y1rUtopX(#Vl>YyX0$@Z=-!wJ_Lnd-xg`BuQ{Ga24*?2;M|$j z<*M?**6u44iL&ExS{f_+ox{naZSk^SxQk_cJDI#kJ>Bk9TiVyIQHm_&=Hg|?U7?bn zXG*c<@H1hg5q{Js+J#S2FFPF`kB3!tt1Rl3s*zu%%qbrTs?RiDamkYwB-R zd0iV7)a}-$%nho&?SkpFPjJGxx*4U^{4Je}%DU^hZROr}C!JY41(;N3U7EbELTmDx z2IH5J1tTuIUQcTQH|iDBc5J7W!By|l1#}q7s0NDa#kD8`EC+P5TRj-hXKGO~TL#P2 zhQ#byqq7@z6SE`emjd&<#X=vK3(l7UZ?WeCZ^FVZSkU^5Rz3ncpF6{={Y8p)H~F-3 zJEf~7G5Z3nAnwj}+N)J4H8^eTS_@8>_nRB%HNT(@v~%2^quO3)EY*fq!GWc$M3=sn_1_F^&g)* zcTQR3s90J+S9Iz*tzzjp=Qn0n_`h9r_ywdv>-k90-CA%pw%0goa-ULsx_&R~Tehw* z+*B^W@h6Rc5y`xO46{l%Gz@Qf*5MzPPo4{vs^f0d5= zK|CV;Z{W(Q!3A>*@~T(Yf(u&z8{NNIZj}OJ;m*v}r=&+RSD%&ovX@?=7^E*4=fzy$ zt~T56hr9}Hu`s8UxWD%9=i21=y?XW%UQeayGk0y=L%5@=yQ!K8pze1`4gOjUEWUGM zak&+Ss^5hI>qyFpL?_!l%IM!Iq=~E}9$RJP}Gx3<+8;d18QtVlYd4?iVgn0(jY33PA5g~1_ z$7@sOiKb4Rh$W$#Oi3}%fv*SeO-qsJ@&CA9tSwb@$H1B}=NeL5^8pG9l@3OU`( z*b2tBpwW8zi=fwq4hwO5t4LmIutl8oNcNzS{-^2P2OYB4g+@a5;JPj}N9`*X^45$F zy*8S#q|L$uKpG~yBr8pfwVPez*S7ZG`q2pZ`>4x})AXvCi(ZVBZrW)mRs#0D;H;HMio_Ni{*-v>XB@n4{kzjKZA=+hsZ zE#&WYn*gb4?=pL1k%`zzIg)sE zaKs#l9+Q*Dhldz!L?aSGB9Vm;bd$gVY%uJA010gnD3C`nZg*4V-_FN zhOJ{`EF4acf=lsm^w@DSaVQ*38D=pp z3lD}9sVKRSQnIx$Ic%jSO!=cabGV~Z$RCeH<_K|#Unabjv1yC{(Zau2cn@mIZ)5CR zgwP)$#Aj@ta0g=xKn`!omvOcDojA9In17oP^AF;J)BHDqJifb5TD%!&fWL#WgM`o< mvhXC3^uJB~GmO1Rh)cOhh)ctv>1) /* `sBx' is signed */ +#else +#define MAXARG_Bx MAX_INT +#define MAXARG_sBx MAX_INT +#endif + + +#define MAXARG_A ((1<>POS_OP) & MASK1(SIZE_OP,0))) +#define SET_OPCODE(i,o) ((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \ + ((cast(Instruction, o)<>POS_A) & MASK1(SIZE_A,0))) +#define SETARG_A(i,u) ((i) = (((i)&MASK0(SIZE_A,POS_A)) | \ + ((cast(Instruction, u)<>POS_B) & MASK1(SIZE_B,0))) +#define SETARG_B(i,b) ((i) = (((i)&MASK0(SIZE_B,POS_B)) | \ + ((cast(Instruction, b)<>POS_C) & MASK1(SIZE_C,0))) +#define SETARG_C(i,b) ((i) = (((i)&MASK0(SIZE_C,POS_C)) | \ + ((cast(Instruction, b)<>POS_Bx) & MASK1(SIZE_Bx,0))) +#define SETARG_Bx(i,b) ((i) = (((i)&MASK0(SIZE_Bx,POS_Bx)) | \ + ((cast(Instruction, b)< C) then pc++ */ +OP_TESTSET,/* A B C if (R(B) <=> C) then R(A) := R(B) else pc++ */ + +OP_CALL,/* A B C R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */ +OP_TAILCALL,/* A B C return R(A)(R(A+1), ... ,R(A+B-1)) */ +OP_RETURN,/* A B return R(A), ... ,R(A+B-2) (see note) */ + +OP_FORLOOP,/* A sBx R(A)+=R(A+2); + if R(A) =) R(A)*/ +OP_CLOSURE,/* A Bx R(A) := closure(KPROTO[Bx], R(A), ... ,R(A+n)) */ + +OP_VARARG/* A B R(A), R(A+1), ..., R(A+B-1) = vararg */ +} OpCode; + + +#define NUM_OPCODES (cast(int, OP_VARARG) + 1) + + + +/*=========================================================================== + Notes: + (*) In OP_CALL, if (B == 0) then B = top. C is the number of returns - 1, + and can be 0: OP_CALL then sets `top' to last_result+1, so + next open instruction (OP_CALL, OP_RETURN, OP_SETLIST) may use `top'. + + (*) In OP_VARARG, if (B == 0) then use actual number of varargs and + set top (like in OP_CALL with C == 0). + + (*) In OP_RETURN, if (B == 0) then return up to `top' + + (*) In OP_SETLIST, if (B == 0) then B = `top'; + if (C == 0) then next `instruction' is real C + + (*) For comparisons, A specifies what condition the test should accept + (true or false). + + (*) All `skips' (pc++) assume that next instruction is a jump +===========================================================================*/ + + +/* +** masks for instruction properties. The format is: +** bits 0-1: op mode +** bits 2-3: C arg mode +** bits 4-5: B arg mode +** bit 6: instruction set register A +** bit 7: operator is a test +*/ + +enum OpArgMask { + OpArgN, /* argument is not used */ + OpArgU, /* argument is used */ + OpArgR, /* argument is a register or a jump offset */ + OpArgK /* argument is a constant or register/constant */ +}; + +LUAI_DATA const lu_byte luaP_opmodes[NUM_OPCODES]; + +#define getOpMode(m) (cast(enum OpMode, luaP_opmodes[m] & 3)) +#define getBMode(m) (cast(enum OpArgMask, (luaP_opmodes[m] >> 4) & 3)) +#define getCMode(m) (cast(enum OpArgMask, (luaP_opmodes[m] >> 2) & 3)) +#define testAMode(m) (luaP_opmodes[m] & (1 << 6)) +#define testTMode(m) (luaP_opmodes[m] & (1 << 7)) + + +LUAI_DATA const char *const luaP_opnames[NUM_OPCODES+1]; /* opcode names */ + + +/* number of list items to accumulate before a SETLIST instruction */ +#define LFIELDS_PER_FLUSH 50 + + +#endif diff --git a/user/lua-5.1.4/src/lopcodes.o b/user/lua-5.1.4/src/lopcodes.o new file mode 100644 index 0000000000000000000000000000000000000000..08dffdfa5cbd417bec76734b6841328c56846c1d GIT binary patch literal 1652 zcma)+&ubG=5XUD?TdjI%p$EktqExM7*H$Bl7VIY3#@LtaHrb>e6!W8zqWRG_8>v!M zq=<(K3I#y~y?OEA#aoWz$*V_C_U1|d0sYSIJQ5Fu4t(EdX5Q@V5B0;%)jM8~UiBth^Ops$QQa+QWjO~)LG8DHnanq&iX@{%@Qk*2$ z%DMi6z7#i=BG*hQ-^t>Y*$mCuS!LS})5%&6xjKO-R0>bWm7TNvHJ`PpU}nv1QXkGP z96f7m zj!fjs?S|KmM2)C%VKUnGql>45n8;{7sC%U{=&c1@)}B{g_sCc(c_lK+tri(;O%Awn z+L%UItx1ZEO0!^^8or~0QXAaO?t}f}9s{{9Eb(r2 zr?9_&4|Qiz!~M=fY~1gU?*$9*v91c`uS2s)eho_eH6s2Ma7cVc0vBltwFltyo#NlY zbMgJ-zEcp}AR3PcuD|jg%MtoXENAoplHeM)5lEj2$6QxrM@-i-dt1~n&?n^huJhbH z->~?-{l+l-N#wQZemd6d&G*yqzdFzS|0~3C?<5@ezL8^|rfXsU1bbsX$*zTIAHHRQ zy#+@42IvU*9^%!l{H@@8L^v*-5c>BG`%@D0edBumt}thWv%-Y%notQHp)0&0yeTXSmxRm0ns7zv V3D<=i!Y9H_;d9}Z@TG8D_z#ayu8;r# literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/loslib.c b/user/lua-5.1.4/src/loslib.c new file mode 100644 index 0000000..da06a57 --- /dev/null +++ b/user/lua-5.1.4/src/loslib.c @@ -0,0 +1,243 @@ +/* +** $Id: loslib.c,v 1.19.1.3 2008/01/18 16:38:18 roberto Exp $ +** Standard Operating System library +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include +#include +#include + +#define loslib_c +#define LUA_LIB + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +static int os_pushresult (lua_State *L, int i, const char *filename) { + int en = errno; /* calls to Lua API may change this value */ + if (i) { + lua_pushboolean(L, 1); + return 1; + } + else { + lua_pushnil(L); + lua_pushfstring(L, "%s: %s", filename, strerror(en)); + lua_pushinteger(L, en); + return 3; + } +} + + +static int os_execute (lua_State *L) { + lua_pushinteger(L, system(luaL_optstring(L, 1, NULL))); + return 1; +} + + +static int os_remove (lua_State *L) { + const char *filename = luaL_checkstring(L, 1); + return os_pushresult(L, remove(filename) == 0, filename); +} + + +static int os_rename (lua_State *L) { + const char *fromname = luaL_checkstring(L, 1); + const char *toname = luaL_checkstring(L, 2); + return os_pushresult(L, rename(fromname, toname) == 0, fromname); +} + + +static int os_tmpname (lua_State *L) { + char buff[LUA_TMPNAMBUFSIZE]; + int err; + lua_tmpnam(buff, err); + if (err) + return luaL_error(L, "unable to generate a unique filename"); + lua_pushstring(L, buff); + return 1; +} + + +static int os_getenv (lua_State *L) { + lua_pushstring(L, getenv(luaL_checkstring(L, 1))); /* if NULL push nil */ + return 1; +} + + +static int os_clock (lua_State *L) { + lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC); + return 1; +} + + +/* +** {====================================================== +** Time/Date operations +** { year=%Y, month=%m, day=%d, hour=%H, min=%M, sec=%S, +** wday=%w+1, yday=%j, isdst=? } +** ======================================================= +*/ + +static void setfield (lua_State *L, const char *key, int value) { + lua_pushinteger(L, value); + lua_setfield(L, -2, key); +} + +static void setboolfield (lua_State *L, const char *key, int value) { + if (value < 0) /* undefined? */ + return; /* does not set field */ + lua_pushboolean(L, value); + lua_setfield(L, -2, key); +} + +static int getboolfield (lua_State *L, const char *key) { + int res; + lua_getfield(L, -1, key); + res = lua_isnil(L, -1) ? -1 : lua_toboolean(L, -1); + lua_pop(L, 1); + return res; +} + + +static int getfield (lua_State *L, const char *key, int d) { + int res; + lua_getfield(L, -1, key); + if (lua_isnumber(L, -1)) + res = (int)lua_tointeger(L, -1); + else { + if (d < 0) + return luaL_error(L, "field " LUA_QS " missing in date table", key); + res = d; + } + lua_pop(L, 1); + return res; +} + + +static int os_date (lua_State *L) { + const char *s = luaL_optstring(L, 1, "%c"); + time_t t = luaL_opt(L, (time_t)luaL_checknumber, 2, time(NULL)); + struct tm *stm; + if (*s == '!') { /* UTC? */ + stm = gmtime(&t); + s++; /* skip `!' */ + } + else + stm = localtime(&t); + if (stm == NULL) /* invalid date? */ + lua_pushnil(L); + else if (strcmp(s, "*t") == 0) { + lua_createtable(L, 0, 9); /* 9 = number of fields */ + setfield(L, "sec", stm->tm_sec); + setfield(L, "min", stm->tm_min); + setfield(L, "hour", stm->tm_hour); + setfield(L, "day", stm->tm_mday); + setfield(L, "month", stm->tm_mon+1); + setfield(L, "year", stm->tm_year+1900); + setfield(L, "wday", stm->tm_wday+1); + setfield(L, "yday", stm->tm_yday+1); + setboolfield(L, "isdst", stm->tm_isdst); + } + else { + char cc[3]; + luaL_Buffer b; + cc[0] = '%'; cc[2] = '\0'; + luaL_buffinit(L, &b); + for (; *s; s++) { + if (*s != '%' || *(s + 1) == '\0') /* no conversion specifier? */ + luaL_addchar(&b, *s); + else { + size_t reslen; + char buff[200]; /* should be big enough for any conversion result */ + cc[1] = *(++s); + reslen = strftime(buff, sizeof(buff), cc, stm); + luaL_addlstring(&b, buff, reslen); + } + } + luaL_pushresult(&b); + } + return 1; +} + + +static int os_time (lua_State *L) { + time_t t; + if (lua_isnoneornil(L, 1)) /* called without args? */ + t = time(NULL); /* get current time */ + else { + struct tm ts; + luaL_checktype(L, 1, LUA_TTABLE); + lua_settop(L, 1); /* make sure table is at the top */ + ts.tm_sec = getfield(L, "sec", 0); + ts.tm_min = getfield(L, "min", 0); + ts.tm_hour = getfield(L, "hour", 12); + ts.tm_mday = getfield(L, "day", -1); + ts.tm_mon = getfield(L, "month", -1) - 1; + ts.tm_year = getfield(L, "year", -1) - 1900; + ts.tm_isdst = getboolfield(L, "isdst"); + t = mktime(&ts); + } + if (t == (time_t)(-1)) + lua_pushnil(L); + else + lua_pushnumber(L, (lua_Number)t); + return 1; +} + + +static int os_difftime (lua_State *L) { + lua_pushnumber(L, difftime((time_t)(luaL_checknumber(L, 1)), + (time_t)(luaL_optnumber(L, 2, 0)))); + return 1; +} + +/* }====================================================== */ + + +static int os_setlocale (lua_State *L) { + static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, + LC_NUMERIC, LC_TIME}; + static const char *const catnames[] = {"all", "collate", "ctype", "monetary", + "numeric", "time", NULL}; + const char *l = luaL_optstring(L, 1, NULL); + int op = luaL_checkoption(L, 2, "all", catnames); + lua_pushstring(L, setlocale(cat[op], l)); + return 1; +} + + +static int os_exit (lua_State *L) { + exit(luaL_optint(L, 1, EXIT_SUCCESS)); +} + +static const luaL_Reg syslib[] = { + {"clock", os_clock}, + {"date", os_date}, + {"difftime", os_difftime}, + {"execute", os_execute}, + {"exit", os_exit}, + {"getenv", os_getenv}, + {"remove", os_remove}, + {"rename", os_rename}, + {"setlocale", os_setlocale}, + {"time", os_time}, + {"tmpname", os_tmpname}, + {NULL, NULL} +}; + +/* }====================================================== */ + + + +LUALIB_API int luaopen_os (lua_State *L) { + luaL_register(L, LUA_OSLIBNAME, syslib); + return 1; +} + diff --git a/user/lua-5.1.4/src/loslib.o b/user/lua-5.1.4/src/loslib.o new file mode 100644 index 0000000000000000000000000000000000000000..25119d4f76e581fbe52fcd60a5c4bb88ebc61826 GIT binary patch literal 6560 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 sls;0fIF?v(EScilG)D>*M+mCFUGv*Czf + +#define lparser_c +#define LUA_CORE + +#include "lua.h" + +#include "lcode.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "llex.h" +#include "lmem.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" + + + +#define hasmultret(k) ((k) == VCALL || (k) == VVARARG) + +#define getlocvar(fs, i) ((fs)->f->locvars[(fs)->actvar[i]]) + +#define luaY_checklimit(fs,v,l,m) if ((v)>(l)) errorlimit(fs,l,m) + + +/* +** nodes for block list (list of active blocks) +*/ +typedef struct BlockCnt { + struct BlockCnt *previous; /* chain */ + int breaklist; /* list of jumps out of this loop */ + lu_byte nactvar; /* # active locals outside the breakable structure */ + lu_byte upval; /* true if some variable in the block is an upvalue */ + lu_byte isbreakable; /* true if `block' is a loop */ +} BlockCnt; + + + +/* +** prototypes for recursive non-terminal functions +*/ +static void chunk (LexState *ls); +static void expr (LexState *ls, expdesc *v); + + +static void anchor_token (LexState *ls) { + if (ls->t.token == TK_NAME || ls->t.token == TK_STRING) { + TString *ts = ls->t.seminfo.ts; + luaX_newstring(ls, getstr(ts), ts->tsv.len); + } +} + + +static void error_expected (LexState *ls, int token) { + luaX_syntaxerror(ls, + luaO_pushfstring(ls->L, LUA_QS " expected", luaX_token2str(ls, token))); +} + + +static void errorlimit (FuncState *fs, int limit, const char *what) { + const char *msg = (fs->f->linedefined == 0) ? + luaO_pushfstring(fs->L, "main function has more than %d %s", limit, what) : + luaO_pushfstring(fs->L, "function at line %d has more than %d %s", + fs->f->linedefined, limit, what); + luaX_lexerror(fs->ls, msg, 0); +} + + +static int testnext (LexState *ls, int c) { + if (ls->t.token == c) { + luaX_next(ls); + return 1; + } + else return 0; +} + + +static void check (LexState *ls, int c) { + if (ls->t.token != c) + error_expected(ls, c); +} + +static void checknext (LexState *ls, int c) { + check(ls, c); + luaX_next(ls); +} + + +#define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); } + + + +static void check_match (LexState *ls, int what, int who, int where) { + if (!testnext(ls, what)) { + if (where == ls->linenumber) + error_expected(ls, what); + else { + luaX_syntaxerror(ls, luaO_pushfstring(ls->L, + LUA_QS " expected (to close " LUA_QS " at line %d)", + luaX_token2str(ls, what), luaX_token2str(ls, who), where)); + } + } +} + + +static TString *str_checkname (LexState *ls) { + TString *ts; + check(ls, TK_NAME); + ts = ls->t.seminfo.ts; + luaX_next(ls); + return ts; +} + + +static void init_exp (expdesc *e, expkind k, int i) { + e->f = e->t = NO_JUMP; + e->k = k; + e->u.s.info = i; +} + + +static void codestring (LexState *ls, expdesc *e, TString *s) { + init_exp(e, VK, luaK_stringK(ls->fs, s)); +} + + +static void checkname(LexState *ls, expdesc *e) { + codestring(ls, e, str_checkname(ls)); +} + + +static int registerlocalvar (LexState *ls, TString *varname) { + FuncState *fs = ls->fs; + Proto *f = fs->f; + int oldsize = f->sizelocvars; + luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars, + LocVar, SHRT_MAX, "too many local variables"); + while (oldsize < f->sizelocvars) f->locvars[oldsize++].varname = NULL; + f->locvars[fs->nlocvars].varname = varname; + luaC_objbarrier(ls->L, f, varname); + return fs->nlocvars++; +} + + +#define new_localvarliteral(ls,v,n) \ + new_localvar(ls, luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char))-1), n) + + +static void new_localvar (LexState *ls, TString *name, int n) { + FuncState *fs = ls->fs; + luaY_checklimit(fs, fs->nactvar+n+1, LUAI_MAXVARS, "local variables"); + fs->actvar[fs->nactvar+n] = cast(unsigned short, registerlocalvar(ls, name)); +} + + +static void adjustlocalvars (LexState *ls, int nvars) { + FuncState *fs = ls->fs; + fs->nactvar = cast_byte(fs->nactvar + nvars); + for (; nvars; nvars--) { + getlocvar(fs, fs->nactvar - nvars).startpc = fs->pc; + } +} + + +static void removevars (LexState *ls, int tolevel) { + FuncState *fs = ls->fs; + while (fs->nactvar > tolevel) + getlocvar(fs, --fs->nactvar).endpc = fs->pc; +} + + +static int indexupvalue (FuncState *fs, TString *name, expdesc *v) { + int i; + Proto *f = fs->f; + int oldsize = f->sizeupvalues; + for (i=0; inups; i++) { + if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->u.s.info) { + lua_assert(f->upvalues[i] == name); + return i; + } + } + /* new one */ + luaY_checklimit(fs, f->nups + 1, LUAI_MAXUPVALUES, "upvalues"); + luaM_growvector(fs->L, f->upvalues, f->nups, f->sizeupvalues, + TString *, MAX_INT, ""); + while (oldsize < f->sizeupvalues) f->upvalues[oldsize++] = NULL; + f->upvalues[f->nups] = name; + luaC_objbarrier(fs->L, f, name); + lua_assert(v->k == VLOCAL || v->k == VUPVAL); + fs->upvalues[f->nups].k = cast_byte(v->k); + fs->upvalues[f->nups].info = cast_byte(v->u.s.info); + return f->nups++; +} + + +static int searchvar (FuncState *fs, TString *n) { + int i; + for (i=fs->nactvar-1; i >= 0; i--) { + if (n == getlocvar(fs, i).varname) + return i; + } + return -1; /* not found */ +} + + +static void markupval (FuncState *fs, int level) { + BlockCnt *bl = fs->bl; + while (bl && bl->nactvar > level) bl = bl->previous; + if (bl) bl->upval = 1; +} + + +static int singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { + if (fs == NULL) { /* no more levels? */ + init_exp(var, VGLOBAL, NO_REG); /* default is global variable */ + return VGLOBAL; + } + else { + int v = searchvar(fs, n); /* look up at current level */ + if (v >= 0) { + init_exp(var, VLOCAL, v); + if (!base) + markupval(fs, v); /* local will be used as an upval */ + return VLOCAL; + } + else { /* not found at current level; try upper one */ + if (singlevaraux(fs->prev, n, var, 0) == VGLOBAL) + return VGLOBAL; + var->u.s.info = indexupvalue(fs, n, var); /* else was LOCAL or UPVAL */ + var->k = VUPVAL; /* upvalue in this level */ + return VUPVAL; + } + } +} + + +static void singlevar (LexState *ls, expdesc *var) { + TString *varname = str_checkname(ls); + FuncState *fs = ls->fs; + if (singlevaraux(fs, varname, var, 1) == VGLOBAL) + var->u.s.info = luaK_stringK(fs, varname); /* info points to global name */ +} + + +static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { + FuncState *fs = ls->fs; + int extra = nvars - nexps; + if (hasmultret(e->k)) { + extra++; /* includes call itself */ + if (extra < 0) extra = 0; + luaK_setreturns(fs, e, extra); /* last exp. provides the difference */ + if (extra > 1) luaK_reserveregs(fs, extra-1); + } + else { + if (e->k != VVOID) luaK_exp2nextreg(fs, e); /* close last expression */ + if (extra > 0) { + int reg = fs->freereg; + luaK_reserveregs(fs, extra); + luaK_nil(fs, reg, extra); + } + } +} + + +static void enterlevel (LexState *ls) { + if (++ls->L->nCcalls > LUAI_MAXCCALLS) + luaX_lexerror(ls, "chunk has too many syntax levels", 0); +} + + +#define leavelevel(ls) ((ls)->L->nCcalls--) + + +static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isbreakable) { + bl->breaklist = NO_JUMP; + bl->isbreakable = isbreakable; + bl->nactvar = fs->nactvar; + bl->upval = 0; + bl->previous = fs->bl; + fs->bl = bl; + lua_assert(fs->freereg == fs->nactvar); +} + + +static void leaveblock (FuncState *fs) { + BlockCnt *bl = fs->bl; + fs->bl = bl->previous; + removevars(fs->ls, bl->nactvar); + if (bl->upval) + luaK_codeABC(fs, OP_CLOSE, bl->nactvar, 0, 0); + /* a block either controls scope or breaks (never both) */ + lua_assert(!bl->isbreakable || !bl->upval); + lua_assert(bl->nactvar == fs->nactvar); + fs->freereg = fs->nactvar; /* free registers */ + luaK_patchtohere(fs, bl->breaklist); +} + + +static void pushclosure (LexState *ls, FuncState *func, expdesc *v) { + FuncState *fs = ls->fs; + Proto *f = fs->f; + int oldsize = f->sizep; + int i; + luaM_growvector(ls->L, f->p, fs->np, f->sizep, Proto *, + MAXARG_Bx, "constant table overflow"); + while (oldsize < f->sizep) f->p[oldsize++] = NULL; + f->p[fs->np++] = func->f; + luaC_objbarrier(ls->L, f, func->f); + init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1)); + for (i=0; if->nups; i++) { + OpCode o = (func->upvalues[i].k == VLOCAL) ? OP_MOVE : OP_GETUPVAL; + luaK_codeABC(fs, o, 0, func->upvalues[i].info, 0); + } +} + + +static void open_func (LexState *ls, FuncState *fs) { + lua_State *L = ls->L; + Proto *f = luaF_newproto(L); + fs->f = f; + fs->prev = ls->fs; /* linked list of funcstates */ + fs->ls = ls; + fs->L = L; + ls->fs = fs; + fs->pc = 0; + fs->lasttarget = -1; + fs->jpc = NO_JUMP; + fs->freereg = 0; + fs->nk = 0; + fs->np = 0; + fs->nlocvars = 0; + fs->nactvar = 0; + fs->bl = NULL; + f->source = ls->source; + f->maxstacksize = 2; /* registers 0/1 are always valid */ + fs->h = luaH_new(L, 0, 0); + /* anchor table of constants and prototype (to avoid being collected) */ + sethvalue2s(L, L->top, fs->h); + incr_top(L); + setptvalue2s(L, L->top, f); + incr_top(L); +} + + +static void close_func (LexState *ls) { + lua_State *L = ls->L; + FuncState *fs = ls->fs; + Proto *f = fs->f; + removevars(ls, 0); + luaK_ret(fs, 0, 0); /* final return */ + luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction); + f->sizecode = fs->pc; + luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int); + f->sizelineinfo = fs->pc; + luaM_reallocvector(L, f->k, f->sizek, fs->nk, TValue); + f->sizek = fs->nk; + luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *); + f->sizep = fs->np; + luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar); + f->sizelocvars = fs->nlocvars; + luaM_reallocvector(L, f->upvalues, f->sizeupvalues, f->nups, TString *); + f->sizeupvalues = f->nups; + lua_assert(luaG_checkcode(f)); + lua_assert(fs->bl == NULL); + ls->fs = fs->prev; + L->top -= 2; /* remove table and prototype from the stack */ + /* last token read was anchored in defunct function; must reanchor it */ + if (fs) anchor_token(ls); +} + + +Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) { + struct LexState lexstate; + struct FuncState funcstate; + lexstate.buff = buff; + luaX_setinput(L, &lexstate, z, luaS_new(L, name)); + open_func(&lexstate, &funcstate); + funcstate.f->is_vararg = VARARG_ISVARARG; /* main func. is always vararg */ + luaX_next(&lexstate); /* read first token */ + chunk(&lexstate); + check(&lexstate, TK_EOS); + close_func(&lexstate); + lua_assert(funcstate.prev == NULL); + lua_assert(funcstate.f->nups == 0); + lua_assert(lexstate.fs == NULL); + return funcstate.f; +} + + + +/*============================================================*/ +/* GRAMMAR RULES */ +/*============================================================*/ + + +static void field (LexState *ls, expdesc *v) { + /* field -> ['.' | ':'] NAME */ + FuncState *fs = ls->fs; + expdesc key; + luaK_exp2anyreg(fs, v); + luaX_next(ls); /* skip the dot or colon */ + checkname(ls, &key); + luaK_indexed(fs, v, &key); +} + + +static void yindex (LexState *ls, expdesc *v) { + /* index -> '[' expr ']' */ + luaX_next(ls); /* skip the '[' */ + expr(ls, v); + luaK_exp2val(ls->fs, v); + checknext(ls, ']'); +} + + +/* +** {====================================================================== +** Rules for Constructors +** ======================================================================= +*/ + + +struct ConsControl { + expdesc v; /* last list item read */ + expdesc *t; /* table descriptor */ + int nh; /* total number of `record' elements */ + int na; /* total number of array elements */ + int tostore; /* number of array elements pending to be stored */ +}; + + +static void recfield (LexState *ls, struct ConsControl *cc) { + /* recfield -> (NAME | `['exp1`]') = exp1 */ + FuncState *fs = ls->fs; + int reg = ls->fs->freereg; + expdesc key, val; + int rkkey; + if (ls->t.token == TK_NAME) { + luaY_checklimit(fs, cc->nh, MAX_INT, "items in a constructor"); + checkname(ls, &key); + } + else /* ls->t.token == '[' */ + yindex(ls, &key); + cc->nh++; + checknext(ls, '='); + rkkey = luaK_exp2RK(fs, &key); + expr(ls, &val); + luaK_codeABC(fs, OP_SETTABLE, cc->t->u.s.info, rkkey, luaK_exp2RK(fs, &val)); + fs->freereg = reg; /* free registers */ +} + + +static void closelistfield (FuncState *fs, struct ConsControl *cc) { + if (cc->v.k == VVOID) return; /* there is no list item */ + luaK_exp2nextreg(fs, &cc->v); + cc->v.k = VVOID; + if (cc->tostore == LFIELDS_PER_FLUSH) { + luaK_setlist(fs, cc->t->u.s.info, cc->na, cc->tostore); /* flush */ + cc->tostore = 0; /* no more items pending */ + } +} + + +static void lastlistfield (FuncState *fs, struct ConsControl *cc) { + if (cc->tostore == 0) return; + if (hasmultret(cc->v.k)) { + luaK_setmultret(fs, &cc->v); + luaK_setlist(fs, cc->t->u.s.info, cc->na, LUA_MULTRET); + cc->na--; /* do not count last expression (unknown number of elements) */ + } + else { + if (cc->v.k != VVOID) + luaK_exp2nextreg(fs, &cc->v); + luaK_setlist(fs, cc->t->u.s.info, cc->na, cc->tostore); + } +} + + +static void listfield (LexState *ls, struct ConsControl *cc) { + expr(ls, &cc->v); + luaY_checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor"); + cc->na++; + cc->tostore++; +} + + +static void constructor (LexState *ls, expdesc *t) { + /* constructor -> ?? */ + FuncState *fs = ls->fs; + int line = ls->linenumber; + int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0); + struct ConsControl cc; + cc.na = cc.nh = cc.tostore = 0; + cc.t = t; + init_exp(t, VRELOCABLE, pc); + init_exp(&cc.v, VVOID, 0); /* no value (yet) */ + luaK_exp2nextreg(ls->fs, t); /* fix it at stack top (for gc) */ + checknext(ls, '{'); + do { + lua_assert(cc.v.k == VVOID || cc.tostore > 0); + if (ls->t.token == '}') break; + closelistfield(fs, &cc); + switch(ls->t.token) { + case TK_NAME: { /* may be listfields or recfields */ + luaX_lookahead(ls); + if (ls->lookahead.token != '=') /* expression? */ + listfield(ls, &cc); + else + recfield(ls, &cc); + break; + } + case '[': { /* constructor_item -> recfield */ + recfield(ls, &cc); + break; + } + default: { /* constructor_part -> listfield */ + listfield(ls, &cc); + break; + } + } + } while (testnext(ls, ',') || testnext(ls, ';')); + check_match(ls, '}', '{', line); + lastlistfield(fs, &cc); + SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */ + SETARG_C(fs->f->code[pc], luaO_int2fb(cc.nh)); /* set initial table size */ +} + +/* }====================================================================== */ + + + +static void parlist (LexState *ls) { + /* parlist -> [ param { `,' param } ] */ + FuncState *fs = ls->fs; + Proto *f = fs->f; + int nparams = 0; + f->is_vararg = 0; + if (ls->t.token != ')') { /* is `parlist' not empty? */ + do { + switch (ls->t.token) { + case TK_NAME: { /* param -> NAME */ + new_localvar(ls, str_checkname(ls), nparams++); + break; + } + case TK_DOTS: { /* param -> `...' */ + luaX_next(ls); +#if defined(LUA_COMPAT_VARARG) + /* use `arg' as default name */ + new_localvarliteral(ls, "arg", nparams++); + f->is_vararg = VARARG_HASARG | VARARG_NEEDSARG; +#endif + f->is_vararg |= VARARG_ISVARARG; + break; + } + default: luaX_syntaxerror(ls, " or " LUA_QL("...") " expected"); + } + } while (!f->is_vararg && testnext(ls, ',')); + } + adjustlocalvars(ls, nparams); + f->numparams = cast_byte(fs->nactvar - (f->is_vararg & VARARG_HASARG)); + luaK_reserveregs(fs, fs->nactvar); /* reserve register for parameters */ +} + + +static void body (LexState *ls, expdesc *e, int needself, int line) { + /* body -> `(' parlist `)' chunk END */ + FuncState new_fs; + open_func(ls, &new_fs); + new_fs.f->linedefined = line; + checknext(ls, '('); + if (needself) { + new_localvarliteral(ls, "self", 0); + adjustlocalvars(ls, 1); + } + parlist(ls); + checknext(ls, ')'); + chunk(ls); + new_fs.f->lastlinedefined = ls->linenumber; + check_match(ls, TK_END, TK_FUNCTION, line); + close_func(ls); + pushclosure(ls, &new_fs, e); +} + + +static int explist1 (LexState *ls, expdesc *v) { + /* explist1 -> expr { `,' expr } */ + int n = 1; /* at least one expression */ + expr(ls, v); + while (testnext(ls, ',')) { + luaK_exp2nextreg(ls->fs, v); + expr(ls, v); + n++; + } + return n; +} + + +static void funcargs (LexState *ls, expdesc *f) { + FuncState *fs = ls->fs; + expdesc args; + int base, nparams; + int line = ls->linenumber; + switch (ls->t.token) { + case '(': { /* funcargs -> `(' [ explist1 ] `)' */ + if (line != ls->lastline) + luaX_syntaxerror(ls,"ambiguous syntax (function call x new statement)"); + luaX_next(ls); + if (ls->t.token == ')') /* arg list is empty? */ + args.k = VVOID; + else { + explist1(ls, &args); + luaK_setmultret(fs, &args); + } + check_match(ls, ')', '(', line); + break; + } + case '{': { /* funcargs -> constructor */ + constructor(ls, &args); + break; + } + case TK_STRING: { /* funcargs -> STRING */ + codestring(ls, &args, ls->t.seminfo.ts); + luaX_next(ls); /* must use `seminfo' before `next' */ + break; + } + default: { + luaX_syntaxerror(ls, "function arguments expected"); + return; + } + } + lua_assert(f->k == VNONRELOC); + base = f->u.s.info; /* base register for call */ + if (hasmultret(args.k)) + nparams = LUA_MULTRET; /* open call */ + else { + if (args.k != VVOID) + luaK_exp2nextreg(fs, &args); /* close last argument */ + nparams = fs->freereg - (base+1); + } + init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2)); + luaK_fixline(fs, line); + fs->freereg = base+1; /* call remove function and arguments and leaves + (unless changed) one result */ +} + + + + +/* +** {====================================================================== +** Expression parsing +** ======================================================================= +*/ + + +static void prefixexp (LexState *ls, expdesc *v) { + /* prefixexp -> NAME | '(' expr ')' */ + switch (ls->t.token) { + case '(': { + int line = ls->linenumber; + luaX_next(ls); + expr(ls, v); + check_match(ls, ')', '(', line); + luaK_dischargevars(ls->fs, v); + return; + } + case TK_NAME: { + singlevar(ls, v); + return; + } + default: { + luaX_syntaxerror(ls, "unexpected symbol"); + return; + } + } +} + + +static void primaryexp (LexState *ls, expdesc *v) { + /* primaryexp -> + prefixexp { `.' NAME | `[' exp `]' | `:' NAME funcargs | funcargs } */ + FuncState *fs = ls->fs; + prefixexp(ls, v); + for (;;) { + switch (ls->t.token) { + case '.': { /* field */ + field(ls, v); + break; + } + case '[': { /* `[' exp1 `]' */ + expdesc key; + luaK_exp2anyreg(fs, v); + yindex(ls, &key); + luaK_indexed(fs, v, &key); + break; + } + case ':': { /* `:' NAME funcargs */ + expdesc key; + luaX_next(ls); + checkname(ls, &key); + luaK_self(fs, v, &key); + funcargs(ls, v); + break; + } + case '(': case TK_STRING: case '{': { /* funcargs */ + luaK_exp2nextreg(fs, v); + funcargs(ls, v); + break; + } + default: return; + } + } +} + + +static void simpleexp (LexState *ls, expdesc *v) { + /* simpleexp -> NUMBER | STRING | NIL | true | false | ... | + constructor | FUNCTION body | primaryexp */ + switch (ls->t.token) { + case TK_NUMBER: { + init_exp(v, VKNUM, 0); + v->u.nval = ls->t.seminfo.r; + break; + } + case TK_STRING: { + codestring(ls, v, ls->t.seminfo.ts); + break; + } + case TK_NIL: { + init_exp(v, VNIL, 0); + break; + } + case TK_TRUE: { + init_exp(v, VTRUE, 0); + break; + } + case TK_FALSE: { + init_exp(v, VFALSE, 0); + break; + } + case TK_DOTS: { /* vararg */ + FuncState *fs = ls->fs; + check_condition(ls, fs->f->is_vararg, + "cannot use " LUA_QL("...") " outside a vararg function"); + fs->f->is_vararg &= ~VARARG_NEEDSARG; /* don't need 'arg' */ + init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 1, 0)); + break; + } + case '{': { /* constructor */ + constructor(ls, v); + return; + } + case TK_FUNCTION: { + luaX_next(ls); + body(ls, v, 0, ls->linenumber); + return; + } + default: { + primaryexp(ls, v); + return; + } + } + luaX_next(ls); +} + + +static UnOpr getunopr (int op) { + switch (op) { + case TK_NOT: return OPR_NOT; + case '-': return OPR_MINUS; + case '#': return OPR_LEN; + default: return OPR_NOUNOPR; + } +} + + +static BinOpr getbinopr (int op) { + switch (op) { + case '+': return OPR_ADD; + case '-': return OPR_SUB; + case '*': return OPR_MUL; + case '/': return OPR_DIV; + case '%': return OPR_MOD; + case '^': return OPR_POW; + case TK_CONCAT: return OPR_CONCAT; + case TK_NE: return OPR_NE; + case TK_EQ: return OPR_EQ; + case '<': return OPR_LT; + case TK_LE: return OPR_LE; + case '>': return OPR_GT; + case TK_GE: return OPR_GE; + case TK_AND: return OPR_AND; + case TK_OR: return OPR_OR; + default: return OPR_NOBINOPR; + } +} + + +static const struct { + lu_byte left; /* left priority for each binary operator */ + lu_byte right; /* right priority */ +} priority[] = { /* ORDER OPR */ + {6, 6}, {6, 6}, {7, 7}, {7, 7}, {7, 7}, /* `+' `-' `/' `%' */ + {10, 9}, {5, 4}, /* power and concat (right associative) */ + {3, 3}, {3, 3}, /* equality and inequality */ + {3, 3}, {3, 3}, {3, 3}, {3, 3}, /* order */ + {2, 2}, {1, 1} /* logical (and/or) */ +}; + +#define UNARY_PRIORITY 8 /* priority for unary operators */ + + +/* +** subexpr -> (simpleexp | unop subexpr) { binop subexpr } +** where `binop' is any binary operator with a priority higher than `limit' +*/ +static BinOpr subexpr (LexState *ls, expdesc *v, unsigned int limit) { + BinOpr op; + UnOpr uop; + enterlevel(ls); + uop = getunopr(ls->t.token); + if (uop != OPR_NOUNOPR) { + luaX_next(ls); + subexpr(ls, v, UNARY_PRIORITY); + luaK_prefix(ls->fs, uop, v); + } + else simpleexp(ls, v); + /* expand while operators have priorities higher than `limit' */ + op = getbinopr(ls->t.token); + while (op != OPR_NOBINOPR && priority[op].left > limit) { + expdesc v2; + BinOpr nextop; + luaX_next(ls); + luaK_infix(ls->fs, op, v); + /* read sub-expression with higher priority */ + nextop = subexpr(ls, &v2, priority[op].right); + luaK_posfix(ls->fs, op, v, &v2); + op = nextop; + } + leavelevel(ls); + return op; /* return first untreated operator */ +} + + +static void expr (LexState *ls, expdesc *v) { + subexpr(ls, v, 0); +} + +/* }==================================================================== */ + + + +/* +** {====================================================================== +** Rules for Statements +** ======================================================================= +*/ + + +static int block_follow (int token) { + switch (token) { + case TK_ELSE: case TK_ELSEIF: case TK_END: + case TK_UNTIL: case TK_EOS: + return 1; + default: return 0; + } +} + + +static void block (LexState *ls) { + /* block -> chunk */ + FuncState *fs = ls->fs; + BlockCnt bl; + enterblock(fs, &bl, 0); + chunk(ls); + lua_assert(bl.breaklist == NO_JUMP); + leaveblock(fs); +} + + +/* +** structure to chain all variables in the left-hand side of an +** assignment +*/ +struct LHS_assign { + struct LHS_assign *prev; + expdesc v; /* variable (global, local, upvalue, or indexed) */ +}; + + +/* +** check whether, in an assignment to a local variable, the local variable +** is needed in a previous assignment (to a table). If so, save original +** local value in a safe place and use this safe copy in the previous +** assignment. +*/ +static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { + FuncState *fs = ls->fs; + int extra = fs->freereg; /* eventual position to save local variable */ + int conflict = 0; + for (; lh; lh = lh->prev) { + if (lh->v.k == VINDEXED) { + if (lh->v.u.s.info == v->u.s.info) { /* conflict? */ + conflict = 1; + lh->v.u.s.info = extra; /* previous assignment will use safe copy */ + } + if (lh->v.u.s.aux == v->u.s.info) { /* conflict? */ + conflict = 1; + lh->v.u.s.aux = extra; /* previous assignment will use safe copy */ + } + } + } + if (conflict) { + luaK_codeABC(fs, OP_MOVE, fs->freereg, v->u.s.info, 0); /* make copy */ + luaK_reserveregs(fs, 1); + } +} + + +static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) { + expdesc e; + check_condition(ls, VLOCAL <= lh->v.k && lh->v.k <= VINDEXED, + "syntax error"); + if (testnext(ls, ',')) { /* assignment -> `,' primaryexp assignment */ + struct LHS_assign nv; + nv.prev = lh; + primaryexp(ls, &nv.v); + if (nv.v.k == VLOCAL) + check_conflict(ls, lh, &nv.v); + luaY_checklimit(ls->fs, nvars, LUAI_MAXCCALLS - ls->L->nCcalls, + "variables in assignment"); + assignment(ls, &nv, nvars+1); + } + else { /* assignment -> `=' explist1 */ + int nexps; + checknext(ls, '='); + nexps = explist1(ls, &e); + if (nexps != nvars) { + adjust_assign(ls, nvars, nexps, &e); + if (nexps > nvars) + ls->fs->freereg -= nexps - nvars; /* remove extra values */ + } + else { + luaK_setoneret(ls->fs, &e); /* close last expression */ + luaK_storevar(ls->fs, &lh->v, &e); + return; /* avoid default */ + } + } + init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ + luaK_storevar(ls->fs, &lh->v, &e); +} + + +static int cond (LexState *ls) { + /* cond -> exp */ + expdesc v; + expr(ls, &v); /* read condition */ + if (v.k == VNIL) v.k = VFALSE; /* `falses' are all equal here */ + luaK_goiftrue(ls->fs, &v); + return v.f; +} + + +static void breakstat (LexState *ls) { + FuncState *fs = ls->fs; + BlockCnt *bl = fs->bl; + int upval = 0; + while (bl && !bl->isbreakable) { + upval |= bl->upval; + bl = bl->previous; + } + if (!bl) + luaX_syntaxerror(ls, "no loop to break"); + if (upval) + luaK_codeABC(fs, OP_CLOSE, bl->nactvar, 0, 0); + luaK_concat(fs, &bl->breaklist, luaK_jump(fs)); +} + + +static void whilestat (LexState *ls, int line) { + /* whilestat -> WHILE cond DO block END */ + FuncState *fs = ls->fs; + int whileinit; + int condexit; + BlockCnt bl; + luaX_next(ls); /* skip WHILE */ + whileinit = luaK_getlabel(fs); + condexit = cond(ls); + enterblock(fs, &bl, 1); + checknext(ls, TK_DO); + block(ls); + luaK_patchlist(fs, luaK_jump(fs), whileinit); + check_match(ls, TK_END, TK_WHILE, line); + leaveblock(fs); + luaK_patchtohere(fs, condexit); /* false conditions finish the loop */ +} + + +static void repeatstat (LexState *ls, int line) { + /* repeatstat -> REPEAT block UNTIL cond */ + int condexit; + FuncState *fs = ls->fs; + int repeat_init = luaK_getlabel(fs); + BlockCnt bl1, bl2; + enterblock(fs, &bl1, 1); /* loop block */ + enterblock(fs, &bl2, 0); /* scope block */ + luaX_next(ls); /* skip REPEAT */ + chunk(ls); + check_match(ls, TK_UNTIL, TK_REPEAT, line); + condexit = cond(ls); /* read condition (inside scope block) */ + if (!bl2.upval) { /* no upvalues? */ + leaveblock(fs); /* finish scope */ + luaK_patchlist(ls->fs, condexit, repeat_init); /* close the loop */ + } + else { /* complete semantics when there are upvalues */ + breakstat(ls); /* if condition then break */ + luaK_patchtohere(ls->fs, condexit); /* else... */ + leaveblock(fs); /* finish scope... */ + luaK_patchlist(ls->fs, luaK_jump(fs), repeat_init); /* and repeat */ + } + leaveblock(fs); /* finish loop */ +} + + +static int exp1 (LexState *ls) { + expdesc e; + int k; + expr(ls, &e); + k = e.k; + luaK_exp2nextreg(ls->fs, &e); + return k; +} + + +static void forbody (LexState *ls, int base, int line, int nvars, int isnum) { + /* forbody -> DO block */ + BlockCnt bl; + FuncState *fs = ls->fs; + int prep, endfor; + adjustlocalvars(ls, 3); /* control variables */ + checknext(ls, TK_DO); + prep = isnum ? luaK_codeAsBx(fs, OP_FORPREP, base, NO_JUMP) : luaK_jump(fs); + enterblock(fs, &bl, 0); /* scope for declared variables */ + adjustlocalvars(ls, nvars); + luaK_reserveregs(fs, nvars); + block(ls); + leaveblock(fs); /* end of scope for declared variables */ + luaK_patchtohere(fs, prep); + endfor = (isnum) ? luaK_codeAsBx(fs, OP_FORLOOP, base, NO_JUMP) : + luaK_codeABC(fs, OP_TFORLOOP, base, 0, nvars); + luaK_fixline(fs, line); /* pretend that `OP_FOR' starts the loop */ + luaK_patchlist(fs, (isnum ? endfor : luaK_jump(fs)), prep + 1); +} + + +static void fornum (LexState *ls, TString *varname, int line) { + /* fornum -> NAME = exp1,exp1[,exp1] forbody */ + FuncState *fs = ls->fs; + int base = fs->freereg; + new_localvarliteral(ls, "(for index)", 0); + new_localvarliteral(ls, "(for limit)", 1); + new_localvarliteral(ls, "(for step)", 2); + new_localvar(ls, varname, 3); + checknext(ls, '='); + exp1(ls); /* initial value */ + checknext(ls, ','); + exp1(ls); /* limit */ + if (testnext(ls, ',')) + exp1(ls); /* optional step */ + else { /* default step = 1 */ + luaK_codeABx(fs, OP_LOADK, fs->freereg, luaK_numberK(fs, 1)); + luaK_reserveregs(fs, 1); + } + forbody(ls, base, line, 1, 1); +} + + +static void forlist (LexState *ls, TString *indexname) { + /* forlist -> NAME {,NAME} IN explist1 forbody */ + FuncState *fs = ls->fs; + expdesc e; + int nvars = 0; + int line; + int base = fs->freereg; + /* create control variables */ + new_localvarliteral(ls, "(for generator)", nvars++); + new_localvarliteral(ls, "(for state)", nvars++); + new_localvarliteral(ls, "(for control)", nvars++); + /* create declared variables */ + new_localvar(ls, indexname, nvars++); + while (testnext(ls, ',')) + new_localvar(ls, str_checkname(ls), nvars++); + checknext(ls, TK_IN); + line = ls->linenumber; + adjust_assign(ls, 3, explist1(ls, &e), &e); + luaK_checkstack(fs, 3); /* extra space to call generator */ + forbody(ls, base, line, nvars - 3, 0); +} + + +static void forstat (LexState *ls, int line) { + /* forstat -> FOR (fornum | forlist) END */ + FuncState *fs = ls->fs; + TString *varname; + BlockCnt bl; + enterblock(fs, &bl, 1); /* scope for loop and control variables */ + luaX_next(ls); /* skip `for' */ + varname = str_checkname(ls); /* first variable name */ + switch (ls->t.token) { + case '=': fornum(ls, varname, line); break; + case ',': case TK_IN: forlist(ls, varname); break; + default: luaX_syntaxerror(ls, LUA_QL("=") " or " LUA_QL("in") " expected"); + } + check_match(ls, TK_END, TK_FOR, line); + leaveblock(fs); /* loop scope (`break' jumps to this point) */ +} + + +static int test_then_block (LexState *ls) { + /* test_then_block -> [IF | ELSEIF] cond THEN block */ + int condexit; + luaX_next(ls); /* skip IF or ELSEIF */ + condexit = cond(ls); + checknext(ls, TK_THEN); + block(ls); /* `then' part */ + return condexit; +} + + +static void ifstat (LexState *ls, int line) { + /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */ + FuncState *fs = ls->fs; + int flist; + int escapelist = NO_JUMP; + flist = test_then_block(ls); /* IF cond THEN block */ + while (ls->t.token == TK_ELSEIF) { + luaK_concat(fs, &escapelist, luaK_jump(fs)); + luaK_patchtohere(fs, flist); + flist = test_then_block(ls); /* ELSEIF cond THEN block */ + } + if (ls->t.token == TK_ELSE) { + luaK_concat(fs, &escapelist, luaK_jump(fs)); + luaK_patchtohere(fs, flist); + luaX_next(ls); /* skip ELSE (after patch, for correct line info) */ + block(ls); /* `else' part */ + } + else + luaK_concat(fs, &escapelist, flist); + luaK_patchtohere(fs, escapelist); + check_match(ls, TK_END, TK_IF, line); +} + + +static void localfunc (LexState *ls) { + expdesc v, b; + FuncState *fs = ls->fs; + new_localvar(ls, str_checkname(ls), 0); + init_exp(&v, VLOCAL, fs->freereg); + luaK_reserveregs(fs, 1); + adjustlocalvars(ls, 1); + body(ls, &b, 0, ls->linenumber); + luaK_storevar(fs, &v, &b); + /* debug information will only see the variable after this point! */ + getlocvar(fs, fs->nactvar - 1).startpc = fs->pc; +} + + +static void localstat (LexState *ls) { + /* stat -> LOCAL NAME {`,' NAME} [`=' explist1] */ + int nvars = 0; + int nexps; + expdesc e; + do { + new_localvar(ls, str_checkname(ls), nvars++); + } while (testnext(ls, ',')); + if (testnext(ls, '=')) + nexps = explist1(ls, &e); + else { + e.k = VVOID; + nexps = 0; + } + adjust_assign(ls, nvars, nexps, &e); + adjustlocalvars(ls, nvars); +} + + +static int funcname (LexState *ls, expdesc *v) { + /* funcname -> NAME {field} [`:' NAME] */ + int needself = 0; + singlevar(ls, v); + while (ls->t.token == '.') + field(ls, v); + if (ls->t.token == ':') { + needself = 1; + field(ls, v); + } + return needself; +} + + +static void funcstat (LexState *ls, int line) { + /* funcstat -> FUNCTION funcname body */ + int needself; + expdesc v, b; + luaX_next(ls); /* skip FUNCTION */ + needself = funcname(ls, &v); + body(ls, &b, needself, line); + luaK_storevar(ls->fs, &v, &b); + luaK_fixline(ls->fs, line); /* definition `happens' in the first line */ +} + + +static void exprstat (LexState *ls) { + /* stat -> func | assignment */ + FuncState *fs = ls->fs; + struct LHS_assign v; + primaryexp(ls, &v.v); + if (v.v.k == VCALL) /* stat -> func */ + SETARG_C(getcode(fs, &v.v), 1); /* call statement uses no results */ + else { /* stat -> assignment */ + v.prev = NULL; + assignment(ls, &v, 1); + } +} + + +static void retstat (LexState *ls) { + /* stat -> RETURN explist */ + FuncState *fs = ls->fs; + expdesc e; + int first, nret; /* registers with returned values */ + luaX_next(ls); /* skip RETURN */ + if (block_follow(ls->t.token) || ls->t.token == ';') + first = nret = 0; /* return no values */ + else { + nret = explist1(ls, &e); /* optional return values */ + if (hasmultret(e.k)) { + luaK_setmultret(fs, &e); + if (e.k == VCALL && nret == 1) { /* tail call? */ + SET_OPCODE(getcode(fs,&e), OP_TAILCALL); + lua_assert(GETARG_A(getcode(fs,&e)) == fs->nactvar); + } + first = fs->nactvar; + nret = LUA_MULTRET; /* return all values */ + } + else { + if (nret == 1) /* only one single value? */ + first = luaK_exp2anyreg(fs, &e); + else { + luaK_exp2nextreg(fs, &e); /* values must go to the `stack' */ + first = fs->nactvar; /* return all `active' values */ + lua_assert(nret == fs->freereg - first); + } + } + } + luaK_ret(fs, first, nret); +} + + +static int statement (LexState *ls) { + int line = ls->linenumber; /* may be needed for error messages */ + switch (ls->t.token) { + case TK_IF: { /* stat -> ifstat */ + ifstat(ls, line); + return 0; + } + case TK_WHILE: { /* stat -> whilestat */ + whilestat(ls, line); + return 0; + } + case TK_DO: { /* stat -> DO block END */ + luaX_next(ls); /* skip DO */ + block(ls); + check_match(ls, TK_END, TK_DO, line); + return 0; + } + case TK_FOR: { /* stat -> forstat */ + forstat(ls, line); + return 0; + } + case TK_REPEAT: { /* stat -> repeatstat */ + repeatstat(ls, line); + return 0; + } + case TK_FUNCTION: { + funcstat(ls, line); /* stat -> funcstat */ + return 0; + } + case TK_LOCAL: { /* stat -> localstat */ + luaX_next(ls); /* skip LOCAL */ + if (testnext(ls, TK_FUNCTION)) /* local function? */ + localfunc(ls); + else + localstat(ls); + return 0; + } + case TK_RETURN: { /* stat -> retstat */ + retstat(ls); + return 1; /* must be last statement */ + } + case TK_BREAK: { /* stat -> breakstat */ + luaX_next(ls); /* skip BREAK */ + breakstat(ls); + return 1; /* must be last statement */ + } + default: { + exprstat(ls); + return 0; /* to avoid warnings */ + } + } +} + + +static void chunk (LexState *ls) { + /* chunk -> { stat [`;'] } */ + int islast = 0; + enterlevel(ls); + while (!islast && !block_follow(ls->t.token)) { + islast = statement(ls); + testnext(ls, ';'); + lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg && + ls->fs->freereg >= ls->fs->nactvar); + ls->fs->freereg = ls->fs->nactvar; /* free registers */ + } + leavelevel(ls); +} + +/* }====================================================================== */ diff --git a/user/lua-5.1.4/src/lparser.h b/user/lua-5.1.4/src/lparser.h new file mode 100644 index 0000000..18836af --- /dev/null +++ b/user/lua-5.1.4/src/lparser.h @@ -0,0 +1,82 @@ +/* +** $Id: lparser.h,v 1.57.1.1 2007/12/27 13:02:25 roberto Exp $ +** Lua Parser +** See Copyright Notice in lua.h +*/ + +#ifndef lparser_h +#define lparser_h + +#include "llimits.h" +#include "lobject.h" +#include "lzio.h" + + +/* +** Expression descriptor +*/ + +typedef enum { + VVOID, /* no value */ + VNIL, + VTRUE, + VFALSE, + VK, /* info = index of constant in `k' */ + VKNUM, /* nval = numerical value */ + VLOCAL, /* info = local register */ + VUPVAL, /* info = index of upvalue in `upvalues' */ + VGLOBAL, /* info = index of table; aux = index of global name in `k' */ + VINDEXED, /* info = table register; aux = index register (or `k') */ + VJMP, /* info = instruction pc */ + VRELOCABLE, /* info = instruction pc */ + VNONRELOC, /* info = result register */ + VCALL, /* info = instruction pc */ + VVARARG /* info = instruction pc */ +} expkind; + +typedef struct expdesc { + expkind k; + union { + struct { int info, aux; } s; + lua_Number nval; + } u; + int t; /* patch list of `exit when true' */ + int f; /* patch list of `exit when false' */ +} expdesc; + + +typedef struct upvaldesc { + lu_byte k; + lu_byte info; +} upvaldesc; + + +struct BlockCnt; /* defined in lparser.c */ + + +/* state needed to generate code for a given function */ +typedef struct FuncState { + Proto *f; /* current function header */ + Table *h; /* table to find (and reuse) elements in `k' */ + struct FuncState *prev; /* enclosing function */ + struct LexState *ls; /* lexical state */ + struct lua_State *L; /* copy of the Lua state */ + struct BlockCnt *bl; /* chain of current blocks */ + int pc; /* next position to code (equivalent to `ncode') */ + int lasttarget; /* `pc' of last `jump target' */ + int jpc; /* list of pending jumps to `pc' */ + int freereg; /* first free register */ + int nk; /* number of elements in `k' */ + int np; /* number of elements in `p' */ + short nlocvars; /* number of elements in `locvars' */ + lu_byte nactvar; /* number of active local variables */ + upvaldesc upvalues[LUAI_MAXUPVALUES]; /* upvalues */ + unsigned short actvar[LUAI_MAXVARS]; /* declared-variable stack */ +} FuncState; + + +LUAI_FUNC Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, + const char *name); + + +#endif diff --git a/user/lua-5.1.4/src/lparser.o b/user/lua-5.1.4/src/lparser.o new file mode 100644 index 0000000000000000000000000000000000000000..f6851dd9b456d24ed0feb9db6978121b4a9ec92e GIT binary patch literal 17440 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 IxI)4I1uNk?ApigX literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/lstate.c b/user/lua-5.1.4/src/lstate.c new file mode 100644 index 0000000..4313b83 --- /dev/null +++ b/user/lua-5.1.4/src/lstate.c @@ -0,0 +1,214 @@ +/* +** $Id: lstate.c,v 2.36.1.2 2008/01/03 15:20:39 roberto Exp $ +** Global State +** See Copyright Notice in lua.h +*/ + + +#include + +#define lstate_c +#define LUA_CORE + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "llex.h" +#include "lmem.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" + + +#define state_size(x) (sizeof(x) + LUAI_EXTRASPACE) +#define fromstate(l) (cast(lu_byte *, (l)) - LUAI_EXTRASPACE) +#define tostate(l) (cast(lua_State *, cast(lu_byte *, l) + LUAI_EXTRASPACE)) + + +/* +** Main thread combines a thread state and the global state +*/ +typedef struct LG { + lua_State l; + global_State g; +} LG; + + + +static void stack_init (lua_State *L1, lua_State *L) { + /* initialize CallInfo array */ + L1->base_ci = luaM_newvector(L, BASIC_CI_SIZE, CallInfo); + L1->ci = L1->base_ci; + L1->size_ci = BASIC_CI_SIZE; + L1->end_ci = L1->base_ci + L1->size_ci - 1; + /* initialize stack array */ + L1->stack = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, TValue); + L1->stacksize = BASIC_STACK_SIZE + EXTRA_STACK; + L1->top = L1->stack; + L1->stack_last = L1->stack+(L1->stacksize - EXTRA_STACK)-1; + /* initialize first ci */ + L1->ci->func = L1->top; + setnilvalue(L1->top++); /* `function' entry for this `ci' */ + L1->base = L1->ci->base = L1->top; + L1->ci->top = L1->top + LUA_MINSTACK; +} + + +static void freestack (lua_State *L, lua_State *L1) { + luaM_freearray(L, L1->base_ci, L1->size_ci, CallInfo); + luaM_freearray(L, L1->stack, L1->stacksize, TValue); +} + + +/* +** open parts that may cause memory-allocation errors +*/ +static void f_luaopen (lua_State *L, void *ud) { + global_State *g = G(L); + UNUSED(ud); + stack_init(L, L); /* init stack */ + sethvalue(L, gt(L), luaH_new(L, 0, 2)); /* table of globals */ + sethvalue(L, registry(L), luaH_new(L, 0, 2)); /* registry */ + luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */ + luaT_init(L); + luaX_init(L); + luaS_fix(luaS_newliteral(L, MEMERRMSG)); + g->GCthreshold = 4*g->totalbytes; +} + + +static void preinit_state (lua_State *L, global_State *g) { + G(L) = g; + L->stack = NULL; + L->stacksize = 0; + L->errorJmp = NULL; + L->hook = NULL; + L->hookmask = 0; + L->basehookcount = 0; + L->allowhook = 1; + resethookcount(L); + L->openupval = NULL; + L->size_ci = 0; + L->nCcalls = L->baseCcalls = 0; + L->status = 0; + L->base_ci = L->ci = NULL; + L->savedpc = NULL; + L->errfunc = 0; + setnilvalue(gt(L)); +} + + +static void close_state (lua_State *L) { + global_State *g = G(L); + luaF_close(L, L->stack); /* close all upvalues for this thread */ + luaC_freeall(L); /* collect all objects */ + lua_assert(g->rootgc == obj2gco(L)); + lua_assert(g->strt.nuse == 0); + luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size, TString *); + luaZ_freebuffer(L, &g->buff); + freestack(L, L); + lua_assert(g->totalbytes == sizeof(LG)); + (*g->frealloc)(g->ud, fromstate(L), state_size(LG), 0); +} + + +lua_State *luaE_newthread (lua_State *L) { + lua_State *L1 = tostate(luaM_malloc(L, state_size(lua_State))); + luaC_link(L, obj2gco(L1), LUA_TTHREAD); + preinit_state(L1, G(L)); + stack_init(L1, L); /* init stack */ + setobj2n(L, gt(L1), gt(L)); /* share table of globals */ + L1->hookmask = L->hookmask; + L1->basehookcount = L->basehookcount; + L1->hook = L->hook; + resethookcount(L1); + lua_assert(iswhite(obj2gco(L1))); + return L1; +} + + +void luaE_freethread (lua_State *L, lua_State *L1) { + luaF_close(L1, L1->stack); /* close all upvalues for this thread */ + lua_assert(L1->openupval == NULL); + luai_userstatefree(L1); + freestack(L, L1); + luaM_freemem(L, fromstate(L1), state_size(lua_State)); +} + + +LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { + int i; + lua_State *L; + global_State *g; + void *l = (*f)(ud, NULL, 0, state_size(LG)); + if (l == NULL) return NULL; + L = tostate(l); + g = &((LG *)L)->g; + L->next = NULL; + L->tt = LUA_TTHREAD; + g->currentwhite = bit2mask(WHITE0BIT, FIXEDBIT); + L->marked = luaC_white(g); + set2bits(L->marked, FIXEDBIT, SFIXEDBIT); + preinit_state(L, g); + g->frealloc = f; + g->ud = ud; + g->mainthread = L; + g->uvhead.u.l.prev = &g->uvhead; + g->uvhead.u.l.next = &g->uvhead; + g->GCthreshold = 0; /* mark it as unfinished state */ + g->strt.size = 0; + g->strt.nuse = 0; + g->strt.hash = NULL; + setnilvalue(registry(L)); + luaZ_initbuffer(L, &g->buff); + g->panic = NULL; + g->gcstate = GCSpause; + g->rootgc = obj2gco(L); + g->sweepstrgc = 0; + g->sweepgc = &g->rootgc; + g->gray = NULL; + g->grayagain = NULL; + g->weak = NULL; + g->tmudata = NULL; + g->totalbytes = sizeof(LG); + g->gcpause = LUAI_GCPAUSE; + g->gcstepmul = LUAI_GCMUL; + g->gcdept = 0; + for (i=0; imt[i] = NULL; + if (luaD_rawrunprotected(L, f_luaopen, NULL) != 0) { + /* memory allocation error: free partial state */ + close_state(L); + L = NULL; + } + else + luai_userstateopen(L); + return L; +} + + +static void callallgcTM (lua_State *L, void *ud) { + UNUSED(ud); + luaC_callGCTM(L); /* call GC metamethods for all udata */ +} + + +LUA_API void lua_close (lua_State *L) { + L = G(L)->mainthread; /* only the main thread can be closed */ + lua_lock(L); + luaF_close(L, L->stack); /* close all upvalues for this thread */ + luaC_separateudata(L, 1); /* separate udata that have GC metamethods */ + L->errfunc = 0; /* no error function during GC metamethods */ + do { /* repeat until no more errors */ + L->ci = L->base_ci; + L->base = L->top = L->ci->base; + L->nCcalls = L->baseCcalls = 0; + } while (luaD_rawrunprotected(L, callallgcTM, NULL) != 0); + lua_assert(G(L)->tmudata == NULL); + luai_userstateclose(L); + close_state(L); +} + diff --git a/user/lua-5.1.4/src/lstate.h b/user/lua-5.1.4/src/lstate.h new file mode 100644 index 0000000..3bc575b --- /dev/null +++ b/user/lua-5.1.4/src/lstate.h @@ -0,0 +1,169 @@ +/* +** $Id: lstate.h,v 2.24.1.2 2008/01/03 15:20:39 roberto Exp $ +** Global State +** See Copyright Notice in lua.h +*/ + +#ifndef lstate_h +#define lstate_h + +#include "lua.h" + +#include "lobject.h" +#include "ltm.h" +#include "lzio.h" + + + +struct lua_longjmp; /* defined in ldo.c */ + + +/* table of globals */ +#define gt(L) (&L->l_gt) + +/* registry */ +#define registry(L) (&G(L)->l_registry) + + +/* extra stack space to handle TM calls and some other extras */ +#define EXTRA_STACK 5 + + +#define BASIC_CI_SIZE 8 + +#define BASIC_STACK_SIZE (2*LUA_MINSTACK) + + + +typedef struct stringtable { + GCObject **hash; + lu_int32 nuse; /* number of elements */ + int size; +} stringtable; + + +/* +** informations about a call +*/ +typedef struct CallInfo { + StkId base; /* base for this function */ + StkId func; /* function index in the stack */ + StkId top; /* top for this function */ + const Instruction *savedpc; + int nresults; /* expected number of results from this function */ + int tailcalls; /* number of tail calls lost under this entry */ +} CallInfo; + + + +#define curr_func(L) (clvalue(L->ci->func)) +#define ci_func(ci) (clvalue((ci)->func)) +#define f_isLua(ci) (!ci_func(ci)->c.isC) +#define isLua(ci) (ttisfunction((ci)->func) && f_isLua(ci)) + + +/* +** `global state', shared by all threads of this state +*/ +typedef struct global_State { + stringtable strt; /* hash table for strings */ + lua_Alloc frealloc; /* function to reallocate memory */ + void *ud; /* auxiliary data to `frealloc' */ + lu_byte currentwhite; + lu_byte gcstate; /* state of garbage collector */ + int sweepstrgc; /* position of sweep in `strt' */ + GCObject *rootgc; /* list of all collectable objects */ + GCObject **sweepgc; /* position of sweep in `rootgc' */ + GCObject *gray; /* list of gray objects */ + GCObject *grayagain; /* list of objects to be traversed atomically */ + GCObject *weak; /* list of weak tables (to be cleared) */ + GCObject *tmudata; /* last element of list of userdata to be GC */ + Mbuffer buff; /* temporary buffer for string concatentation */ + lu_mem GCthreshold; + lu_mem totalbytes; /* number of bytes currently allocated */ + lu_mem estimate; /* an estimate of number of bytes actually in use */ + lu_mem gcdept; /* how much GC is `behind schedule' */ + int gcpause; /* size of pause between successive GCs */ + int gcstepmul; /* GC `granularity' */ + lua_CFunction panic; /* to be called in unprotected errors */ + TValue l_registry; + struct lua_State *mainthread; + UpVal uvhead; /* head of double-linked list of all open upvalues */ + struct Table *mt[NUM_TAGS]; /* metatables for basic types */ + TString *tmname[TM_N]; /* array with tag-method names */ +} global_State; + + +/* +** `per thread' state +*/ +struct lua_State { + CommonHeader; + lu_byte status; + StkId top; /* first free slot in the stack */ + StkId base; /* base of current function */ + global_State *l_G; + CallInfo *ci; /* call info for current function */ + const Instruction *savedpc; /* `savedpc' of current function */ + StkId stack_last; /* last free slot in the stack */ + StkId stack; /* stack base */ + CallInfo *end_ci; /* points after end of ci array*/ + CallInfo *base_ci; /* array of CallInfo's */ + int stacksize; + int size_ci; /* size of array `base_ci' */ + unsigned short nCcalls; /* number of nested C calls */ + unsigned short baseCcalls; /* nested C calls when resuming coroutine */ + lu_byte hookmask; + lu_byte allowhook; + int basehookcount; + int hookcount; + lua_Hook hook; + TValue l_gt; /* table of globals */ + TValue env; /* temporary place for environments */ + GCObject *openupval; /* list of open upvalues in this stack */ + GCObject *gclist; + struct lua_longjmp *errorJmp; /* current error recover point */ + ptrdiff_t errfunc; /* current error handling function (stack index) */ +}; + + +#define G(L) (L->l_G) + + +/* +** Union of all collectable objects +*/ +union GCObject { + GCheader gch; + union TString ts; + union Udata u; + union Closure cl; + struct Table h; + struct Proto p; + struct UpVal uv; + struct lua_State th; /* thread */ +}; + + +/* macros to convert a GCObject into a specific value */ +#define rawgco2ts(o) check_exp((o)->gch.tt == LUA_TSTRING, &((o)->ts)) +#define gco2ts(o) (&rawgco2ts(o)->tsv) +#define rawgco2u(o) check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u)) +#define gco2u(o) (&rawgco2u(o)->uv) +#define gco2cl(o) check_exp((o)->gch.tt == LUA_TFUNCTION, &((o)->cl)) +#define gco2h(o) check_exp((o)->gch.tt == LUA_TTABLE, &((o)->h)) +#define gco2p(o) check_exp((o)->gch.tt == LUA_TPROTO, &((o)->p)) +#define gco2uv(o) check_exp((o)->gch.tt == LUA_TUPVAL, &((o)->uv)) +#define ngcotouv(o) \ + check_exp((o) == NULL || (o)->gch.tt == LUA_TUPVAL, &((o)->uv)) +#define gco2th(o) check_exp((o)->gch.tt == LUA_TTHREAD, &((o)->th)) + +/* macro to convert any Lua object into a GCObject */ +#define obj2gco(v) (cast(GCObject *, (v))) + + +LUAI_FUNC lua_State *luaE_newthread (lua_State *L); +LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1); + +#endif + diff --git a/user/lua-5.1.4/src/lstate.o b/user/lua-5.1.4/src/lstate.o new file mode 100644 index 0000000000000000000000000000000000000000..149d447441a4716c9e7c1609cd6355dbb644db71 GIT binary patch literal 3200 zcma)8ZD?Cn7(PkUdACKE&8SriMyRu6TWB@P)Pb=lO$*z!khU9cSxnR0wU{O~AMQhk zh1)?7*Fa$+%JyS|41f4z;FzNO(b59sU>-HG>YPj8R-QKJU5rCU+6p4!!qz zpYwj4_nvd!H+`#nd(`D}F?+aJ6RR`E{CAm}kc4)&nklxa!~yY(w%8)#OJYv%>JY_c zaY3}U8Id+GsY{;lxl2tV(x&KL?Ep_@xmvC2(M^puZfO$@)NSHRI)W|6=Srv7%TQ+@ zC%}4xF)^nt`t%8(9u6Q-%?Gj>pZn|t^giX>Ww+=@0?cVz(?_?OD~Fs~anXowrPV|< zBo-OBGbZp$}grZ`t@!_5Bv08qdLDOMYwus zd+k&Wo~Ct1W^~>@V(_OS8XS8qxE~2~MQ|^zMmFR+>8ZOOnJs>!&HKf|?)a5o|EX3> zXUGcc?;PyBfgD=(!{qCwOr0^vN^EVb4k$-v#oU^y51=nkPGR;@Q7(r)N;%w|Eb}d_ z%%5?U`3j~FCLdrmbm1d#5J7SCfv{q!TsiG$gs*+AJgrYiRQ|=`17~ zGjvakDebyRnKtXvmR1(8IuB{agFLM3jDudQ&9{ncyZ0t)h%g9Fv1j!i7rp`GT}BwtPIh6)iE#kI=Gn`XsXsZm_| z0yWSuUtgiVV%49v*e>GN^|&GqFN@+50xsxzU*$4t1Y1gR@TIbxD6Sdr z4P5KKW>CR<|If(i8I~43drS*Yz;?G!%7L`ZTIhi|N^6GVX z!DWq7ncucfsSn&ityT{IP3^r`AKZ?O)T4bOwp|~L2;R5mOmvHgMW*={9W9sRFN|w} z=7qkQ$rb`?CR^M$8W>l{v$=ze^>F@dpnYJdm?;zkp)l&DeQsj{NC@&?!EKhj&>51hb5t)F-RIEf^^7T*M<#{H?q@oUaz5cZhG0kzS@sF&176SMx& zvZk7Ft6r$9nGYNFQUiavf$szN;j<0_*CD^x8uU{Q{C)5l*x$rM_9wwRkbfU=o!iCa zKNOY^tv_$c1jN5<;6FC-pBwnq2L2Z~HC_54r1e%J4|`C2mPSRQHdAaQr>bUkrqbEG znvnA>l}xAcw=dPdgN-E8#bkCu%`j<~7|V5)mUNij0SH|NNpn}{=HdMtzHL^bM0ar9d_O?VH^k#G%TpIGzXTeuN> zO8VyrQJ5K^3w!%IaWsRSxSzxmK;oYfBK}nici=vde~u9IUlQKW*l!lPaDMIwP@{w` gjIAYn5d8z_LY;0P{t#pP3E^KNY-Mbk{O@DzUuP8ZUjP6A literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/lstring.c b/user/lua-5.1.4/src/lstring.c new file mode 100644 index 0000000..4911315 --- /dev/null +++ b/user/lua-5.1.4/src/lstring.c @@ -0,0 +1,111 @@ +/* +** $Id: lstring.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $ +** String table (keeps all strings handled by Lua) +** See Copyright Notice in lua.h +*/ + + +#include + +#define lstring_c +#define LUA_CORE + +#include "lua.h" + +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" + + + +void luaS_resize (lua_State *L, int newsize) { + GCObject **newhash; + stringtable *tb; + int i; + if (G(L)->gcstate == GCSsweepstring) + return; /* cannot resize during GC traverse */ + newhash = luaM_newvector(L, newsize, GCObject *); + tb = &G(L)->strt; + for (i=0; isize; i++) { + GCObject *p = tb->hash[i]; + while (p) { /* for each node in the list */ + GCObject *next = p->gch.next; /* save next */ + unsigned int h = gco2ts(p)->hash; + int h1 = lmod(h, newsize); /* new position */ + lua_assert(cast_int(h%newsize) == lmod(h, newsize)); + p->gch.next = newhash[h1]; /* chain it */ + newhash[h1] = p; + p = next; + } + } + luaM_freearray(L, tb->hash, tb->size, TString *); + tb->size = newsize; + tb->hash = newhash; +} + + +static TString *newlstr (lua_State *L, const char *str, size_t l, + unsigned int h) { + TString *ts; + stringtable *tb; + if (l+1 > (MAX_SIZET - sizeof(TString))/sizeof(char)) + luaM_toobig(L); + ts = cast(TString *, luaM_malloc(L, (l+1)*sizeof(char)+sizeof(TString))); + ts->tsv.len = l; + ts->tsv.hash = h; + ts->tsv.marked = luaC_white(G(L)); + ts->tsv.tt = LUA_TSTRING; + ts->tsv.reserved = 0; + memcpy(ts+1, str, l*sizeof(char)); + ((char *)(ts+1))[l] = '\0'; /* ending 0 */ + tb = &G(L)->strt; + h = lmod(h, tb->size); + ts->tsv.next = tb->hash[h]; /* chain new entry */ + tb->hash[h] = obj2gco(ts); + tb->nuse++; + if (tb->nuse > cast(lu_int32, tb->size) && tb->size <= MAX_INT/2) + luaS_resize(L, tb->size*2); /* too crowded */ + return ts; +} + + +TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { + GCObject *o; + unsigned int h = cast(unsigned int, l); /* seed */ + size_t step = (l>>5)+1; /* if string is too long, don't hash all its chars */ + size_t l1; + for (l1=l; l1>=step; l1-=step) /* compute hash */ + h = h ^ ((h<<5)+(h>>2)+cast(unsigned char, str[l1-1])); + for (o = G(L)->strt.hash[lmod(h, G(L)->strt.size)]; + o != NULL; + o = o->gch.next) { + TString *ts = rawgco2ts(o); + if (ts->tsv.len == l && (memcmp(str, getstr(ts), l) == 0)) { + /* string may be dead */ + if (isdead(G(L), o)) changewhite(o); + return ts; + } + } + return newlstr(L, str, l, h); /* not found */ +} + + +Udata *luaS_newudata (lua_State *L, size_t s, Table *e) { + Udata *u; + if (s > MAX_SIZET - sizeof(Udata)) + luaM_toobig(L); + u = cast(Udata *, luaM_malloc(L, s + sizeof(Udata))); + u->uv.marked = luaC_white(G(L)); /* is not finalized */ + u->uv.tt = LUA_TUSERDATA; + u->uv.len = s; + u->uv.metatable = NULL; + u->uv.env = e; + /* chain it on udata list (after main thread) */ + u->uv.next = G(L)->mainthread->next; + G(L)->mainthread->next = obj2gco(u); + return u; +} + diff --git a/user/lua-5.1.4/src/lstring.h b/user/lua-5.1.4/src/lstring.h new file mode 100644 index 0000000..73a2ff8 --- /dev/null +++ b/user/lua-5.1.4/src/lstring.h @@ -0,0 +1,31 @@ +/* +** $Id: lstring.h,v 1.43.1.1 2007/12/27 13:02:25 roberto Exp $ +** String table (keep all strings handled by Lua) +** See Copyright Notice in lua.h +*/ + +#ifndef lstring_h +#define lstring_h + + +#include "lgc.h" +#include "lobject.h" +#include "lstate.h" + + +#define sizestring(s) (sizeof(union TString)+((s)->len+1)*sizeof(char)) + +#define sizeudata(u) (sizeof(union Udata)+(u)->len) + +#define luaS_new(L, s) (luaS_newlstr(L, s, strlen(s))) +#define luaS_newliteral(L, s) (luaS_newlstr(L, "" s, \ + (sizeof(s)/sizeof(char))-1)) + +#define luaS_fix(s) l_setbit((s)->tsv.marked, FIXEDBIT) + +LUAI_FUNC void luaS_resize (lua_State *L, int newsize); +LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, Table *e); +LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l); + + +#endif diff --git a/user/lua-5.1.4/src/lstring.o b/user/lua-5.1.4/src/lstring.o new file mode 100644 index 0000000000000000000000000000000000000000..b7962a48ce2f80fff2df7196638999d02dbc5b45 GIT binary patch literal 1796 zcma)6Z)jUp6uk1;6a$7$|-nNIn%!){?kyQAArU5=z9@`DboOMP&7y_os`f;Dx+%e)pbp z?(hEY$vqbxj!{a9Hz@IuJBScTbXLN)*-5&{MlaO18vAZ^#Qag=hRlxhC-^mGft|3V}Bpu)w3TS*3lzqdze9F-{l~ z3p>o%ERRY&qOfQS!X~S)Z{wQ0uWIQ%q#>GE7E*hg#!YUt_^34bdEo8$?UF72n%s!C zF@j6xFZ6|XxzXn0mC33ea#-<%#HH>(tl)c-*Z3oBFB90O#t$4el3>Y0Bp?l%$XJgJheQ^1_~EuunQdn=$(-AL{A4N#g#V!;MAupZ>TB!CW>Ih%tKh#)8`;hDr~;C?6(q>X>IoPfn>YX2kcjyJTB9DmTawlOBdKJ>!Ti<&R6Wq z+Rp-=uYK>QtAWZ(YjnX1KfVtnY14YS#gjnM*09E+Z61;MCUco~H@Wx*h;f2xt?OM# zgA;&5y~kwZH)s*oU<+nL>HUU9zqs{*vBcwTRu5DX{y^nW(7fU6Zhq*~W%H(Qderae zY0e#FH*5u5eYKV~K+WHO3cOVVp4PzTe`_$H#>5cQ79C}d$y{4xbq046m-r#*yGXDe z6UBOL12J2^>6qV&DeMH?M_k4{yb3qBKDb>Wn58X3B0nOTE42GFuJGUmb`Mur_ySLe z=2glPB8bp?H83>YJ);x#`Lv!U>R7o<)J!p- z&lX^=P}H;P;it7dWj&pF5%2r|jt3wR--iuuLImun&jnx<*S!zyraRMQ1`>_{#{W0w z<2!)ZZG1m?Wq)$_1tJLg66D|X2G z`1^~E^*eV!?5XIa_||XF!+vs?TTKVMMWEzf7o$<&V0cg7K)fHodH8JwVi?~K{w44$ zE*=K#4Lmo=L1#`BPN^A^GtwieLiQEI?o2@OlwK^3O`O7&c&e05=W@kN%84sw%M-6= z*K@E6$!GJK(`O0U24w|kipS7`uvc9C3~)d^<=RWY7x5xmcx+XWN9ZDC2rcCQ1-lZt AG5`Po literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/lstrlib.c b/user/lua-5.1.4/src/lstrlib.c new file mode 100644 index 0000000..1b4763d --- /dev/null +++ b/user/lua-5.1.4/src/lstrlib.c @@ -0,0 +1,869 @@ +/* +** $Id: lstrlib.c,v 1.132.1.4 2008/07/11 17:27:21 roberto Exp $ +** Standard library for string operations and pattern-matching +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include +#include +#include + +#define lstrlib_c +#define LUA_LIB + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* macro to `unsign' a character */ +#define uchar(c) ((unsigned char)(c)) + + + +static int str_len (lua_State *L) { + size_t l; + luaL_checklstring(L, 1, &l); + lua_pushinteger(L, l); + return 1; +} + + +static ptrdiff_t posrelat (ptrdiff_t pos, size_t len) { + /* relative string position: negative means back from end */ + if (pos < 0) pos += (ptrdiff_t)len + 1; + return (pos >= 0) ? pos : 0; +} + + +static int str_sub (lua_State *L) { + size_t l; + const char *s = luaL_checklstring(L, 1, &l); + ptrdiff_t start = posrelat(luaL_checkinteger(L, 2), l); + ptrdiff_t end = posrelat(luaL_optinteger(L, 3, -1), l); + if (start < 1) start = 1; + if (end > (ptrdiff_t)l) end = (ptrdiff_t)l; + if (start <= end) + lua_pushlstring(L, s+start-1, end-start+1); + else lua_pushliteral(L, ""); + return 1; +} + + +static int str_reverse (lua_State *L) { + size_t l; + luaL_Buffer b; + const char *s = luaL_checklstring(L, 1, &l); + luaL_buffinit(L, &b); + while (l--) luaL_addchar(&b, s[l]); + luaL_pushresult(&b); + return 1; +} + + +static int str_lower (lua_State *L) { + size_t l; + size_t i; + luaL_Buffer b; + const char *s = luaL_checklstring(L, 1, &l); + luaL_buffinit(L, &b); + for (i=0; i 0) + luaL_addlstring(&b, s, l); + luaL_pushresult(&b); + return 1; +} + + +static int str_byte (lua_State *L) { + size_t l; + const char *s = luaL_checklstring(L, 1, &l); + ptrdiff_t posi = posrelat(luaL_optinteger(L, 2, 1), l); + ptrdiff_t pose = posrelat(luaL_optinteger(L, 3, posi), l); + int n, i; + if (posi <= 0) posi = 1; + if ((size_t)pose > l) pose = l; + if (posi > pose) return 0; /* empty interval; return no values */ + n = (int)(pose - posi + 1); + if (posi + n <= pose) /* overflow? */ + luaL_error(L, "string slice too long"); + luaL_checkstack(L, n, "string slice too long"); + for (i=0; i= ms->level || ms->capture[l].len == CAP_UNFINISHED) + return luaL_error(ms->L, "invalid capture index"); + return l; +} + + +static int capture_to_close (MatchState *ms) { + int level = ms->level; + for (level--; level>=0; level--) + if (ms->capture[level].len == CAP_UNFINISHED) return level; + return luaL_error(ms->L, "invalid pattern capture"); +} + + +static const char *classend (MatchState *ms, const char *p) { + switch (*p++) { + case L_ESC: { + if (*p == '\0') + luaL_error(ms->L, "malformed pattern (ends with " LUA_QL("%%") ")"); + return p+1; + } + case '[': { + if (*p == '^') p++; + do { /* look for a `]' */ + if (*p == '\0') + luaL_error(ms->L, "malformed pattern (missing " LUA_QL("]") ")"); + if (*(p++) == L_ESC && *p != '\0') + p++; /* skip escapes (e.g. `%]') */ + } while (*p != ']'); + return p+1; + } + default: { + return p; + } + } +} + + +static int match_class (int c, int cl) { + int res; + switch (tolower(cl)) { + case 'a' : res = isalpha(c); break; + case 'c' : res = iscntrl(c); break; + case 'd' : res = isdigit(c); break; + case 'l' : res = islower(c); break; + case 'p' : res = ispunct(c); break; + case 's' : res = isspace(c); break; + case 'u' : res = isupper(c); break; + case 'w' : res = isalnum(c); break; + case 'x' : res = isxdigit(c); break; + case 'z' : res = (c == 0); break; + default: return (cl == c); + } + return (islower(cl) ? res : !res); +} + + +static int matchbracketclass (int c, const char *p, const char *ec) { + int sig = 1; + if (*(p+1) == '^') { + sig = 0; + p++; /* skip the `^' */ + } + while (++p < ec) { + if (*p == L_ESC) { + p++; + if (match_class(c, uchar(*p))) + return sig; + } + else if ((*(p+1) == '-') && (p+2 < ec)) { + p+=2; + if (uchar(*(p-2)) <= c && c <= uchar(*p)) + return sig; + } + else if (uchar(*p) == c) return sig; + } + return !sig; +} + + +static int singlematch (int c, const char *p, const char *ep) { + switch (*p) { + case '.': return 1; /* matches any char */ + case L_ESC: return match_class(c, uchar(*(p+1))); + case '[': return matchbracketclass(c, p, ep-1); + default: return (uchar(*p) == c); + } +} + + +static const char *match (MatchState *ms, const char *s, const char *p); + + +static const char *matchbalance (MatchState *ms, const char *s, + const char *p) { + if (*p == 0 || *(p+1) == 0) + luaL_error(ms->L, "unbalanced pattern"); + if (*s != *p) return NULL; + else { + int b = *p; + int e = *(p+1); + int cont = 1; + while (++s < ms->src_end) { + if (*s == e) { + if (--cont == 0) return s+1; + } + else if (*s == b) cont++; + } + } + return NULL; /* string ends out of balance */ +} + + +static const char *max_expand (MatchState *ms, const char *s, + const char *p, const char *ep) { + ptrdiff_t i = 0; /* counts maximum expand for item */ + while ((s+i)src_end && singlematch(uchar(*(s+i)), p, ep)) + i++; + /* keeps trying to match with the maximum repetitions */ + while (i>=0) { + const char *res = match(ms, (s+i), ep+1); + if (res) return res; + i--; /* else didn't match; reduce 1 repetition to try again */ + } + return NULL; +} + + +static const char *min_expand (MatchState *ms, const char *s, + const char *p, const char *ep) { + for (;;) { + const char *res = match(ms, s, ep+1); + if (res != NULL) + return res; + else if (ssrc_end && singlematch(uchar(*s), p, ep)) + s++; /* try with one more repetition */ + else return NULL; + } +} + + +static const char *start_capture (MatchState *ms, const char *s, + const char *p, int what) { + const char *res; + int level = ms->level; + if (level >= LUA_MAXCAPTURES) luaL_error(ms->L, "too many captures"); + ms->capture[level].init = s; + ms->capture[level].len = what; + ms->level = level+1; + if ((res=match(ms, s, p)) == NULL) /* match failed? */ + ms->level--; /* undo capture */ + return res; +} + + +static const char *end_capture (MatchState *ms, const char *s, + const char *p) { + int l = capture_to_close(ms); + const char *res; + ms->capture[l].len = s - ms->capture[l].init; /* close capture */ + if ((res = match(ms, s, p)) == NULL) /* match failed? */ + ms->capture[l].len = CAP_UNFINISHED; /* undo capture */ + return res; +} + + +static const char *match_capture (MatchState *ms, const char *s, int l) { + size_t len; + l = check_capture(ms, l); + len = ms->capture[l].len; + if ((size_t)(ms->src_end-s) >= len && + memcmp(ms->capture[l].init, s, len) == 0) + return s+len; + else return NULL; +} + + +static const char *match (MatchState *ms, const char *s, const char *p) { + init: /* using goto's to optimize tail recursion */ + switch (*p) { + case '(': { /* start capture */ + if (*(p+1) == ')') /* position capture? */ + return start_capture(ms, s, p+2, CAP_POSITION); + else + return start_capture(ms, s, p+1, CAP_UNFINISHED); + } + case ')': { /* end capture */ + return end_capture(ms, s, p+1); + } + case L_ESC: { + switch (*(p+1)) { + case 'b': { /* balanced string? */ + s = matchbalance(ms, s, p+2); + if (s == NULL) return NULL; + p+=4; goto init; /* else return match(ms, s, p+4); */ + } + case 'f': { /* frontier? */ + const char *ep; char previous; + p += 2; + if (*p != '[') + luaL_error(ms->L, "missing " LUA_QL("[") " after " + LUA_QL("%%f") " in pattern"); + ep = classend(ms, p); /* points to what is next */ + previous = (s == ms->src_init) ? '\0' : *(s-1); + if (matchbracketclass(uchar(previous), p, ep-1) || + !matchbracketclass(uchar(*s), p, ep-1)) return NULL; + p=ep; goto init; /* else return match(ms, s, ep); */ + } + default: { + if (isdigit(uchar(*(p+1)))) { /* capture results (%0-%9)? */ + s = match_capture(ms, s, uchar(*(p+1))); + if (s == NULL) return NULL; + p+=2; goto init; /* else return match(ms, s, p+2) */ + } + goto dflt; /* case default */ + } + } + } + case '\0': { /* end of pattern */ + return s; /* match succeeded */ + } + case '$': { + if (*(p+1) == '\0') /* is the `$' the last char in pattern? */ + return (s == ms->src_end) ? s : NULL; /* check end of string */ + else goto dflt; + } + default: dflt: { /* it is a pattern item */ + const char *ep = classend(ms, p); /* points to what is next */ + int m = ssrc_end && singlematch(uchar(*s), p, ep); + switch (*ep) { + case '?': { /* optional */ + const char *res; + if (m && ((res=match(ms, s+1, ep+1)) != NULL)) + return res; + p=ep+1; goto init; /* else return match(ms, s, ep+1); */ + } + case '*': { /* 0 or more repetitions */ + return max_expand(ms, s, p, ep); + } + case '+': { /* 1 or more repetitions */ + return (m ? max_expand(ms, s+1, p, ep) : NULL); + } + case '-': { /* 0 or more repetitions (minimum) */ + return min_expand(ms, s, p, ep); + } + default: { + if (!m) return NULL; + s++; p=ep; goto init; /* else return match(ms, s+1, ep); */ + } + } + } + } +} + + + +static const char *lmemfind (const char *s1, size_t l1, + const char *s2, size_t l2) { + if (l2 == 0) return s1; /* empty strings are everywhere */ + else if (l2 > l1) return NULL; /* avoids a negative `l1' */ + else { + const char *init; /* to search for a `*s2' inside `s1' */ + l2--; /* 1st char will be checked by `memchr' */ + l1 = l1-l2; /* `s2' cannot be found after that */ + while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) { + init++; /* 1st char is already checked */ + if (memcmp(init, s2+1, l2) == 0) + return init-1; + else { /* correct `l1' and `s1' to try again */ + l1 -= init-s1; + s1 = init; + } + } + return NULL; /* not found */ + } +} + + +static void push_onecapture (MatchState *ms, int i, const char *s, + const char *e) { + if (i >= ms->level) { + if (i == 0) /* ms->level == 0, too */ + lua_pushlstring(ms->L, s, e - s); /* add whole match */ + else + luaL_error(ms->L, "invalid capture index"); + } + else { + ptrdiff_t l = ms->capture[i].len; + if (l == CAP_UNFINISHED) luaL_error(ms->L, "unfinished capture"); + if (l == CAP_POSITION) + lua_pushinteger(ms->L, ms->capture[i].init - ms->src_init + 1); + else + lua_pushlstring(ms->L, ms->capture[i].init, l); + } +} + + +static int push_captures (MatchState *ms, const char *s, const char *e) { + int i; + int nlevels = (ms->level == 0 && s) ? 1 : ms->level; + luaL_checkstack(ms->L, nlevels, "too many captures"); + for (i = 0; i < nlevels; i++) + push_onecapture(ms, i, s, e); + return nlevels; /* number of strings pushed */ +} + + +static int str_find_aux (lua_State *L, int find) { + size_t l1, l2; + const char *s = luaL_checklstring(L, 1, &l1); + const char *p = luaL_checklstring(L, 2, &l2); + ptrdiff_t init = posrelat(luaL_optinteger(L, 3, 1), l1) - 1; + if (init < 0) init = 0; + else if ((size_t)(init) > l1) init = (ptrdiff_t)l1; + if (find && (lua_toboolean(L, 4) || /* explicit request? */ + strpbrk(p, SPECIALS) == NULL)) { /* or no special characters? */ + /* do a plain search */ + const char *s2 = lmemfind(s+init, l1-init, p, l2); + if (s2) { + lua_pushinteger(L, s2-s+1); + lua_pushinteger(L, s2-s+l2); + return 2; + } + } + else { + MatchState ms; + int anchor = (*p == '^') ? (p++, 1) : 0; + const char *s1=s+init; + ms.L = L; + ms.src_init = s; + ms.src_end = s+l1; + do { + const char *res; + ms.level = 0; + if ((res=match(&ms, s1, p)) != NULL) { + if (find) { + lua_pushinteger(L, s1-s+1); /* start */ + lua_pushinteger(L, res-s); /* end */ + return push_captures(&ms, NULL, 0) + 2; + } + else + return push_captures(&ms, s1, res); + } + } while (s1++ < ms.src_end && !anchor); + } + lua_pushnil(L); /* not found */ + return 1; +} + + +static int str_find (lua_State *L) { + return str_find_aux(L, 1); +} + + +static int str_match (lua_State *L) { + return str_find_aux(L, 0); +} + + +static int gmatch_aux (lua_State *L) { + MatchState ms; + size_t ls; + const char *s = lua_tolstring(L, lua_upvalueindex(1), &ls); + const char *p = lua_tostring(L, lua_upvalueindex(2)); + const char *src; + ms.L = L; + ms.src_init = s; + ms.src_end = s+ls; + for (src = s + (size_t)lua_tointeger(L, lua_upvalueindex(3)); + src <= ms.src_end; + src++) { + const char *e; + ms.level = 0; + if ((e = match(&ms, src, p)) != NULL) { + lua_Integer newstart = e-s; + if (e == src) newstart++; /* empty match? go at least one position */ + lua_pushinteger(L, newstart); + lua_replace(L, lua_upvalueindex(3)); + return push_captures(&ms, src, e); + } + } + return 0; /* not found */ +} + + +static int gmatch (lua_State *L) { + luaL_checkstring(L, 1); + luaL_checkstring(L, 2); + lua_settop(L, 2); + lua_pushinteger(L, 0); + lua_pushcclosure(L, gmatch_aux, 3); + return 1; +} + + +static int gfind_nodef (lua_State *L) { + return luaL_error(L, LUA_QL("string.gfind") " was renamed to " + LUA_QL("string.gmatch")); +} + + +static void add_s (MatchState *ms, luaL_Buffer *b, const char *s, + const char *e) { + size_t l, i; + const char *news = lua_tolstring(ms->L, 3, &l); + for (i = 0; i < l; i++) { + if (news[i] != L_ESC) + luaL_addchar(b, news[i]); + else { + i++; /* skip ESC */ + if (!isdigit(uchar(news[i]))) + luaL_addchar(b, news[i]); + else if (news[i] == '0') + luaL_addlstring(b, s, e - s); + else { + push_onecapture(ms, news[i] - '1', s, e); + luaL_addvalue(b); /* add capture to accumulated result */ + } + } + } +} + + +static void add_value (MatchState *ms, luaL_Buffer *b, const char *s, + const char *e) { + lua_State *L = ms->L; + switch (lua_type(L, 3)) { + case LUA_TNUMBER: + case LUA_TSTRING: { + add_s(ms, b, s, e); + return; + } + case LUA_TFUNCTION: { + int n; + lua_pushvalue(L, 3); + n = push_captures(ms, s, e); + lua_call(L, n, 1); + break; + } + case LUA_TTABLE: { + push_onecapture(ms, 0, s, e); + lua_gettable(L, 3); + break; + } + } + if (!lua_toboolean(L, -1)) { /* nil or false? */ + lua_pop(L, 1); + lua_pushlstring(L, s, e - s); /* keep original text */ + } + else if (!lua_isstring(L, -1)) + luaL_error(L, "invalid replacement value (a %s)", luaL_typename(L, -1)); + luaL_addvalue(b); /* add result to accumulator */ +} + + +static int str_gsub (lua_State *L) { + size_t srcl; + const char *src = luaL_checklstring(L, 1, &srcl); + const char *p = luaL_checkstring(L, 2); + int tr = lua_type(L, 3); + int max_s = luaL_optint(L, 4, srcl+1); + int anchor = (*p == '^') ? (p++, 1) : 0; + int n = 0; + MatchState ms; + luaL_Buffer b; + luaL_argcheck(L, tr == LUA_TNUMBER || tr == LUA_TSTRING || + tr == LUA_TFUNCTION || tr == LUA_TTABLE, 3, + "string/function/table expected"); + luaL_buffinit(L, &b); + ms.L = L; + ms.src_init = src; + ms.src_end = src+srcl; + while (n < max_s) { + const char *e; + ms.level = 0; + e = match(&ms, src, p); + if (e) { + n++; + add_value(&ms, &b, src, e); + } + if (e && e>src) /* non empty match? */ + src = e; /* skip it */ + else if (src < ms.src_end) + luaL_addchar(&b, *src++); + else break; + if (anchor) break; + } + luaL_addlstring(&b, src, ms.src_end-src); + luaL_pushresult(&b); + lua_pushinteger(L, n); /* number of substitutions */ + return 2; +} + +/* }====================================================== */ + + +/* maximum size of each formatted item (> len(format('%99.99f', -1e308))) */ +#define MAX_ITEM 512 +/* valid flags in a format specification */ +#define FLAGS "-+ #0" +/* +** maximum size of each format specification (such as '%-099.99d') +** (+10 accounts for %99.99x plus margin of error) +*/ +#define MAX_FORMAT (sizeof(FLAGS) + sizeof(LUA_INTFRMLEN) + 10) + + +static void addquoted (lua_State *L, luaL_Buffer *b, int arg) { + size_t l; + const char *s = luaL_checklstring(L, arg, &l); + luaL_addchar(b, '"'); + while (l--) { + switch (*s) { + case '"': case '\\': case '\n': { + luaL_addchar(b, '\\'); + luaL_addchar(b, *s); + break; + } + case '\r': { + luaL_addlstring(b, "\\r", 2); + break; + } + case '\0': { + luaL_addlstring(b, "\\000", 4); + break; + } + default: { + luaL_addchar(b, *s); + break; + } + } + s++; + } + luaL_addchar(b, '"'); +} + +static const char *scanformat (lua_State *L, const char *strfrmt, char *form) { + const char *p = strfrmt; + while (*p != '\0' && strchr(FLAGS, *p) != NULL) p++; /* skip flags */ + if ((size_t)(p - strfrmt) >= sizeof(FLAGS)) + luaL_error(L, "invalid format (repeated flags)"); + if (isdigit(uchar(*p))) p++; /* skip width */ + if (isdigit(uchar(*p))) p++; /* (2 digits at most) */ + if (*p == '.') { + p++; + if (isdigit(uchar(*p))) p++; /* skip precision */ + if (isdigit(uchar(*p))) p++; /* (2 digits at most) */ + } + if (isdigit(uchar(*p))) + luaL_error(L, "invalid format (width or precision too long)"); + *(form++) = '%'; + strncpy(form, strfrmt, p - strfrmt + 1); + form += p - strfrmt + 1; + *form = '\0'; + return p; +} + + +static void addintlen (char *form) { + size_t l = strlen(form); + char spec = form[l - 1]; + strcpy(form + l - 1, LUA_INTFRMLEN); + form[l + sizeof(LUA_INTFRMLEN) - 2] = spec; + form[l + sizeof(LUA_INTFRMLEN) - 1] = '\0'; +} + + +static int str_format (lua_State *L) { + int arg = 1; + size_t sfl; + const char *strfrmt = luaL_checklstring(L, arg, &sfl); + const char *strfrmt_end = strfrmt+sfl; + luaL_Buffer b; + luaL_buffinit(L, &b); + while (strfrmt < strfrmt_end) { + if (*strfrmt != L_ESC) + luaL_addchar(&b, *strfrmt++); + else if (*++strfrmt == L_ESC) + luaL_addchar(&b, *strfrmt++); /* %% */ + else { /* format item */ + char form[MAX_FORMAT]; /* to store the format (`%...') */ + char buff[MAX_ITEM]; /* to store the formatted item */ + arg++; + strfrmt = scanformat(L, strfrmt, form); + switch (*strfrmt++) { + case 'c': { + sprintf(buff, form, (int)luaL_checknumber(L, arg)); + break; + } + case 'd': case 'i': { + addintlen(form); + sprintf(buff, form, (LUA_INTFRM_T)luaL_checknumber(L, arg)); + break; + } + case 'o': case 'u': case 'x': case 'X': { + addintlen(form); + sprintf(buff, form, (unsigned LUA_INTFRM_T)luaL_checknumber(L, arg)); + break; + } + case 'e': case 'E': case 'f': + case 'g': case 'G': { + sprintf(buff, form, (double)luaL_checknumber(L, arg)); + break; + } + case 'q': { + addquoted(L, &b, arg); + continue; /* skip the 'addsize' at the end */ + } + case 's': { + size_t l; + const char *s = luaL_checklstring(L, arg, &l); + if (!strchr(form, '.') && l >= 100) { + /* no precision and string is too long to be formatted; + keep original string */ + lua_pushvalue(L, arg); + luaL_addvalue(&b); + continue; /* skip the `addsize' at the end */ + } + else { + sprintf(buff, form, s); + break; + } + } + default: { /* also treat cases `pnLlh' */ + return luaL_error(L, "invalid option " LUA_QL("%%%c") " to " + LUA_QL("format"), *(strfrmt - 1)); + } + } + luaL_addlstring(&b, buff, strlen(buff)); + } + } + luaL_pushresult(&b); + return 1; +} + + +static const luaL_Reg strlib[] = { + {"byte", str_byte}, + {"char", str_char}, + {"dump", str_dump}, + {"find", str_find}, + {"format", str_format}, + {"gfind", gfind_nodef}, + {"gmatch", gmatch}, + {"gsub", str_gsub}, + {"len", str_len}, + {"lower", str_lower}, + {"match", str_match}, + {"rep", str_rep}, + {"reverse", str_reverse}, + {"sub", str_sub}, + {"upper", str_upper}, + {NULL, NULL} +}; + + +static void createmetatable (lua_State *L) { + lua_createtable(L, 0, 1); /* create metatable for strings */ + lua_pushliteral(L, ""); /* dummy string */ + lua_pushvalue(L, -2); + lua_setmetatable(L, -2); /* set string metatable */ + lua_pop(L, 1); /* pop dummy string */ + lua_pushvalue(L, -2); /* string library... */ + lua_setfield(L, -2, "__index"); /* ...is the __index metamethod */ + lua_pop(L, 1); /* pop metatable */ +} + + +/* +** Open string library +*/ +LUALIB_API int luaopen_string (lua_State *L) { + luaL_register(L, LUA_STRLIBNAME, strlib); +#if defined(LUA_COMPAT_GFIND) + lua_getfield(L, -1, "gmatch"); + lua_setfield(L, -2, "gfind"); +#endif + createmetatable(L); + return 1; +} + diff --git a/user/lua-5.1.4/src/lstrlib.o b/user/lua-5.1.4/src/lstrlib.o new file mode 100644 index 0000000000000000000000000000000000000000..d1d9f830c501bfb26fbdc8b65380285cfe5c5098 GIT binary patch literal 16196 zcmd5@e|%KcmA{irX@uxYZKPXR#h@@g=Bvq6|QGrDPfAJ%PWCAH6iIX=0U6A0+ zXkMRFV@s@CrNv!8U3ZHutB|4<8;g#B2bBIx|?yRMxZo+F#G-9d*5U-V!PeX z{?Yeg=KIdQ=bn4cx#!+{?#-~iXx7axmrFR0OQeedN{9pFRm~I$Tiy=eSW~ zb;>eZa)(>YC5qfcmi&`eYow^h3b&L0fVD3+%4p8KHrU~^zielJry(oY;__~n-Gs?s zH+q_6^}nmT$W|TNvNqNhsS^?TYPnU#4yt7@=kp+_uY31BGy!7S5d4A-iLzC&y+GO{wU0Ej9KMMZj*90Vgr?HH^K&vj z%Uj;~k}LN8i1~F4?*2$&nk)8jWZT!-K2kWs6}<%-YT6lJ8NYwk_)=5HCu)qH5tlJ2 zm9ph)xaFa-R)^AGkMKt>YZ3G>$f3iPhfc2l;Li-=;IL#MzdDZgK>y&;5q41)1=&TJ zbcLhunfvkeDfp_Y!7v?*7kNqa%PlLR) z*c;`Xzrmy9t;Hv-HY?C?t^3qFH*@`%a97|iyC}n&mE+FcEj>4&U~B^Ij69fToBi(K zxwu&vJa^8#+jgI^%$yAA-vMTO@d-Q7Z?F5*IttU#&T*$bJz;U|AnaiISEzYX`4*Jh z?tUy{6Vg-U#(pvopK^TVI2A&GN;p9)AKX+T5cUf;@R*dW{>Y+0t_qhQ9d~r`NA>O)|$A&0XHp=7m<9toFYj4D`6L5C+>vswJyV1l!WR z@729yG|xEa?Ogk^(VXt>T>oP1V6ZLC>NlFd+&k@DJdSPe$FWYSFX9!NxQ*t^>d)kv zH`bq7Xils@GuHeH2Ep5AY-|a(qq1coqD`)cM)RGRNbZG;qsPwDKX?yDT_CSeW`a(g zztY~f=j9)Q#a7?6)oyEcw?8{JPWB&cb4A>jdv9@Dt#y}Rircd@>;>JuK1d6<1l~uT zy&%Kt;1;!@hw(eR$2w;9_i|Q(VOTKc3V!4Yo{0y3pYVcIbYT5KzF_Ucj$;*dTeEwN zW>-OO-Aru4c2RflrZe%lJ-d6_y>6@1c=!l>pWkIPf3aYK5o$%S7>_@LqJk@pP$8&r zS9zlm%EBA8F37dk^{n0j-yoz{a1>>?7!3@S2>cjUc<*x?;rAf`dRy;dbK#1GonGw| z-S%yn)^2RLYsT7v?#TSt-NChQX2t^s76jNiH27gg@KoHq92~*^c;F+>=qu3=1lu}S$#>x$k;kHy(YF z7MdMd-Y)Bi_15v97~#z*aqTlgudqo`PnsQoCPSjvf`lCflZ?=Aa1`8NgcqSG++~D0 z&4ZmTj1NW`F%=y~-feO}Mu~L_v!XX0;rj~oM-&<13&0Rf!&f7u(=Q!q^=s0EIi&s} zjOB2;{wA;vcD>O&?7EAL&{YtUe=_$YBT{ zL}hO`lG9`#%Y9%q^gdv(>$U=iV>#uG(~8|ja2MJ_XM6SmsNZ`lnnCH%Pf?0Mv}Yf- z4q`@J3^Lqeb(n8NpI~3gUic%l1j?v>BlECaboVZY1gP|Fu-R}D?Cqqz3r%UM`58+Y z5~q9b@0WAM>d0^LUTV6r#Ka?a#W5|dw@`ZpW)fZb2~3Bs)@hj8dyy&(9hQYdtUyn6 zJ^F?`>3XC2Ay>of!*-3k5r%k=8^M=!>r+#AnIoqb9p(bm=E5X%wR(^He-A%zM|=1& z_@OKCYgUE+5e0|~w~mWZsvcda5P-?nsopm?n@z@gX`kOrOSRL4dCWgE0HJQpe=G<^RFbgA; zL7#D%IbWiaf2h2Xp^426v!DkawfcJh{$xDvJ+t<|gY6Toe!1MreFj79h?8lvK9Ggu z>tBxTmlH3M-^%l4C1-889pT7RO4F-&VcwPq8d>Fxp%reCjNJ|k79e3av9;wK3FVC6+0psI;~7~#NrVr%x+urPwFEJq8zKFc_F5#^|rUwc(jS_Hc=a7O5q=X%0E

b?n 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 oO^??!?;uz|S<_QA&ASN7E70_GO&4l +#include + +#define ltable_c +#define LUA_CORE + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "ltable.h" + + +/* +** max size of array part is 2^MAXBITS +*/ +#if LUAI_BITSINT > 26 +#define MAXBITS 26 +#else +#define MAXBITS (LUAI_BITSINT-2) +#endif + +#define MAXASIZE (1 << MAXBITS) + + +#define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t)))) + +#define hashstr(t,str) hashpow2(t, (str)->tsv.hash) +#define hashboolean(t,p) hashpow2(t, p) + + +/* +** for some types, it is better to avoid modulus by power of 2, as +** they tend to have many 2 factors. +*/ +#define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1)|1)))) + + +#define hashpointer(t,p) hashmod(t, IntPoint(p)) + + +/* +** number of ints inside a lua_Number +*/ +#define numints cast_int(sizeof(lua_Number)/sizeof(int)) + + + +#define dummynode (&dummynode_) + +static const Node dummynode_ = { + {{NULL}, LUA_TNIL}, /* value */ + {{{NULL}, LUA_TNIL, NULL}} /* key */ +}; + + +/* +** hash for lua_Numbers +*/ +static Node *hashnum (const Table *t, lua_Number n) { + unsigned int a[numints]; + int i; + if (luai_numeq(n, 0)) /* avoid problems with -0 */ + return gnode(t, 0); + memcpy(a, &n, sizeof(a)); + for (i = 1; i < numints; i++) a[0] += a[i]; + return hashmod(t, a[0]); +} + + + +/* +** returns the `main' position of an element in a table (that is, the index +** of its hash value) +*/ +static Node *mainposition (const Table *t, const TValue *key) { + switch (ttype(key)) { + case LUA_TNUMBER: + return hashnum(t, nvalue(key)); + case LUA_TSTRING: + return hashstr(t, rawtsvalue(key)); + case LUA_TBOOLEAN: + return hashboolean(t, bvalue(key)); + case LUA_TLIGHTUSERDATA: + return hashpointer(t, pvalue(key)); + default: + return hashpointer(t, gcvalue(key)); + } +} + + +/* +** returns the index for `key' if `key' is an appropriate key to live in +** the array part of the table, -1 otherwise. +*/ +static int arrayindex (const TValue *key) { + if (ttisnumber(key)) { + lua_Number n = nvalue(key); + int k; + lua_number2int(k, n); + if (luai_numeq(cast_num(k), n)) + return k; + } + return -1; /* `key' did not match some condition */ +} + + +/* +** returns the index of a `key' for table traversals. First goes all +** elements in the array part, then elements in the hash part. The +** beginning of a traversal is signalled by -1. +*/ +static int findindex (lua_State *L, Table *t, StkId key) { + int i; + if (ttisnil(key)) return -1; /* first iteration */ + i = arrayindex(key); + if (0 < i && i <= t->sizearray) /* is `key' inside array part? */ + return i-1; /* yes; that's the index (corrected to C) */ + else { + Node *n = mainposition(t, key); + do { /* check whether `key' is somewhere in the chain */ + /* key may be dead already, but it is ok to use it in `next' */ + if (luaO_rawequalObj(key2tval(n), key) || + (ttype(gkey(n)) == LUA_TDEADKEY && iscollectable(key) && + gcvalue(gkey(n)) == gcvalue(key))) { + i = cast_int(n - gnode(t, 0)); /* key index in hash table */ + /* hash elements are numbered after array ones */ + return i + t->sizearray; + } + else n = gnext(n); + } while (n); + luaG_runerror(L, "invalid key to " LUA_QL("next")); /* key not found */ + return 0; /* to avoid warnings */ + } +} + + +int luaH_next (lua_State *L, Table *t, StkId key) { + int i = findindex(L, t, key); /* find original element */ + for (i++; i < t->sizearray; i++) { /* try first array part */ + if (!ttisnil(&t->array[i])) { /* a non-nil value? */ + setnvalue(key, cast_num(i+1)); + setobj2s(L, key+1, &t->array[i]); + return 1; + } + } + for (i -= t->sizearray; i < sizenode(t); i++) { /* then hash part */ + if (!ttisnil(gval(gnode(t, i)))) { /* a non-nil value? */ + setobj2s(L, key, key2tval(gnode(t, i))); + setobj2s(L, key+1, gval(gnode(t, i))); + return 1; + } + } + return 0; /* no more elements */ +} + + +/* +** {============================================================= +** Rehash +** ============================================================== +*/ + + +static int computesizes (int nums[], int *narray) { + int i; + int twotoi; /* 2^i */ + int a = 0; /* number of elements smaller than 2^i */ + int na = 0; /* number of elements to go to array part */ + int n = 0; /* optimal size for array part */ + for (i = 0, twotoi = 1; twotoi/2 < *narray; i++, twotoi *= 2) { + if (nums[i] > 0) { + a += nums[i]; + if (a > twotoi/2) { /* more than half elements present? */ + n = twotoi; /* optimal size (till now) */ + na = a; /* all elements smaller than n will go to array part */ + } + } + if (a == *narray) break; /* all elements already counted */ + } + *narray = n; + lua_assert(*narray/2 <= na && na <= *narray); + return na; +} + + +static int countint (const TValue *key, int *nums) { + int k = arrayindex(key); + if (0 < k && k <= MAXASIZE) { /* is `key' an appropriate array index? */ + nums[ceillog2(k)]++; /* count as such */ + return 1; + } + else + return 0; +} + + +static int numusearray (const Table *t, int *nums) { + int lg; + int ttlg; /* 2^lg */ + int ause = 0; /* summation of `nums' */ + int i = 1; /* count to traverse all array keys */ + for (lg=0, ttlg=1; lg<=MAXBITS; lg++, ttlg*=2) { /* for each slice */ + int lc = 0; /* counter */ + int lim = ttlg; + if (lim > t->sizearray) { + lim = t->sizearray; /* adjust upper limit */ + if (i > lim) + break; /* no more elements to count */ + } + /* count elements in range (2^(lg-1), 2^lg] */ + for (; i <= lim; i++) { + if (!ttisnil(&t->array[i-1])) + lc++; + } + nums[lg] += lc; + ause += lc; + } + return ause; +} + + +static int numusehash (const Table *t, int *nums, int *pnasize) { + int totaluse = 0; /* total number of elements */ + int ause = 0; /* summation of `nums' */ + int i = sizenode(t); + while (i--) { + Node *n = &t->node[i]; + if (!ttisnil(gval(n))) { + ause += countint(key2tval(n), nums); + totaluse++; + } + } + *pnasize += ause; + return totaluse; +} + + +static void setarrayvector (lua_State *L, Table *t, int size) { + int i; + luaM_reallocvector(L, t->array, t->sizearray, size, TValue); + for (i=t->sizearray; iarray[i]); + t->sizearray = size; +} + + +static void setnodevector (lua_State *L, Table *t, int size) { + int lsize; + if (size == 0) { /* no elements to hash part? */ + t->node = cast(Node *, dummynode); /* use common `dummynode' */ + lsize = 0; + } + else { + int i; + lsize = ceillog2(size); + if (lsize > MAXBITS) + luaG_runerror(L, "table overflow"); + size = twoto(lsize); + t->node = luaM_newvector(L, size, Node); + for (i=0; ilsizenode = cast_byte(lsize); + t->lastfree = gnode(t, size); /* all positions are free */ +} + + +static void resize (lua_State *L, Table *t, int nasize, int nhsize) { + int i; + int oldasize = t->sizearray; + int oldhsize = t->lsizenode; + Node *nold = t->node; /* save old hash ... */ + if (nasize > oldasize) /* array part must grow? */ + setarrayvector(L, t, nasize); + /* create new hash part with appropriate size */ + setnodevector(L, t, nhsize); + if (nasize < oldasize) { /* array part must shrink? */ + t->sizearray = nasize; + /* re-insert elements from vanishing slice */ + for (i=nasize; iarray[i])) + setobjt2t(L, luaH_setnum(L, t, i+1), &t->array[i]); + } + /* shrink array */ + luaM_reallocvector(L, t->array, oldasize, nasize, TValue); + } + /* re-insert elements from hash part */ + for (i = twoto(oldhsize) - 1; i >= 0; i--) { + Node *old = nold+i; + if (!ttisnil(gval(old))) + setobjt2t(L, luaH_set(L, t, key2tval(old)), gval(old)); + } + if (nold != dummynode) + luaM_freearray(L, nold, twoto(oldhsize), Node); /* free old array */ +} + + +void luaH_resizearray (lua_State *L, Table *t, int nasize) { + int nsize = (t->node == dummynode) ? 0 : sizenode(t); + resize(L, t, nasize, nsize); +} + + +static void rehash (lua_State *L, Table *t, const TValue *ek) { + int nasize, na; + int nums[MAXBITS+1]; /* nums[i] = number of keys between 2^(i-1) and 2^i */ + int i; + int totaluse; + for (i=0; i<=MAXBITS; i++) nums[i] = 0; /* reset counts */ + nasize = numusearray(t, nums); /* count keys in array part */ + totaluse = nasize; /* all those keys are integer keys */ + totaluse += numusehash(t, nums, &nasize); /* count keys in hash part */ + /* count extra key */ + nasize += countint(ek, nums); + totaluse++; + /* compute new size for array part */ + na = computesizes(nums, &nasize); + /* resize the table to new computed sizes */ + resize(L, t, nasize, totaluse - na); +} + + + +/* +** }============================================================= +*/ + + +Table *luaH_new (lua_State *L, int narray, int nhash) { + Table *t = luaM_new(L, Table); + luaC_link(L, obj2gco(t), LUA_TTABLE); + t->metatable = NULL; + t->flags = cast_byte(~0); + /* temporary values (kept only if some malloc fails) */ + t->array = NULL; + t->sizearray = 0; + t->lsizenode = 0; + t->node = cast(Node *, dummynode); + setarrayvector(L, t, narray); + setnodevector(L, t, nhash); + return t; +} + + +void luaH_free (lua_State *L, Table *t) { + if (t->node != dummynode) + luaM_freearray(L, t->node, sizenode(t), Node); + luaM_freearray(L, t->array, t->sizearray, TValue); + luaM_free(L, t); +} + + +static Node *getfreepos (Table *t) { + while (t->lastfree-- > t->node) { + if (ttisnil(gkey(t->lastfree))) + return t->lastfree; + } + return NULL; /* could not find a free place */ +} + + + +/* +** inserts a new key into a hash table; first, check whether key's main +** position is free. If not, check whether colliding node is in its main +** position or not: if it is not, move colliding node to an empty place and +** put new key in its main position; otherwise (colliding node is in its main +** position), new key goes to an empty position. +*/ +static TValue *newkey (lua_State *L, Table *t, const TValue *key) { + Node *mp = mainposition(t, key); + if (!ttisnil(gval(mp)) || mp == dummynode) { + Node *othern; + Node *n = getfreepos(t); /* get a free place */ + if (n == NULL) { /* cannot find a free place? */ + rehash(L, t, key); /* grow table */ + return luaH_set(L, t, key); /* re-insert key into grown table */ + } + lua_assert(n != dummynode); + othern = mainposition(t, key2tval(mp)); + if (othern != mp) { /* is colliding node out of its main position? */ + /* yes; move colliding node into free position */ + while (gnext(othern) != mp) othern = gnext(othern); /* find previous */ + gnext(othern) = n; /* redo the chain with `n' in place of `mp' */ + *n = *mp; /* copy colliding node into free pos. (mp->next also goes) */ + gnext(mp) = NULL; /* now `mp' is free */ + setnilvalue(gval(mp)); + } + else { /* colliding node is in its own main position */ + /* new node will go into free position */ + gnext(n) = gnext(mp); /* chain new position */ + gnext(mp) = n; + mp = n; + } + } + gkey(mp)->value = key->value; gkey(mp)->tt = key->tt; + luaC_barriert(L, t, key); + lua_assert(ttisnil(gval(mp))); + return gval(mp); +} + + +/* +** search function for integers +*/ +const TValue *luaH_getnum (Table *t, int key) { + /* (1 <= key && key <= t->sizearray) */ + if (cast(unsigned int, key-1) < cast(unsigned int, t->sizearray)) + return &t->array[key-1]; + else { + lua_Number nk = cast_num(key); + Node *n = hashnum(t, nk); + do { /* check whether `key' is somewhere in the chain */ + if (ttisnumber(gkey(n)) && luai_numeq(nvalue(gkey(n)), nk)) + return gval(n); /* that's it */ + else n = gnext(n); + } while (n); + return luaO_nilobject; + } +} + + +/* +** search function for strings +*/ +const TValue *luaH_getstr (Table *t, TString *key) { + Node *n = hashstr(t, key); + do { /* check whether `key' is somewhere in the chain */ + if (ttisstring(gkey(n)) && rawtsvalue(gkey(n)) == key) + return gval(n); /* that's it */ + else n = gnext(n); + } while (n); + return luaO_nilobject; +} + + +/* +** main search function +*/ +const TValue *luaH_get (Table *t, const TValue *key) { + switch (ttype(key)) { + case LUA_TNIL: return luaO_nilobject; + case LUA_TSTRING: return luaH_getstr(t, rawtsvalue(key)); + case LUA_TNUMBER: { + int k; + lua_Number n = nvalue(key); + lua_number2int(k, n); + if (luai_numeq(cast_num(k), nvalue(key))) /* index is int? */ + return luaH_getnum(t, k); /* use specialized version */ + /* else go through */ + } + default: { + Node *n = mainposition(t, key); + do { /* check whether `key' is somewhere in the chain */ + if (luaO_rawequalObj(key2tval(n), key)) + return gval(n); /* that's it */ + else n = gnext(n); + } while (n); + return luaO_nilobject; + } + } +} + + +TValue *luaH_set (lua_State *L, Table *t, const TValue *key) { + const TValue *p = luaH_get(t, key); + t->flags = 0; + if (p != luaO_nilobject) + return cast(TValue *, p); + else { + if (ttisnil(key)) luaG_runerror(L, "table index is nil"); + else if (ttisnumber(key) && luai_numisnan(nvalue(key))) + luaG_runerror(L, "table index is NaN"); + return newkey(L, t, key); + } +} + + +TValue *luaH_setnum (lua_State *L, Table *t, int key) { + const TValue *p = luaH_getnum(t, key); + if (p != luaO_nilobject) + return cast(TValue *, p); + else { + TValue k; + setnvalue(&k, cast_num(key)); + return newkey(L, t, &k); + } +} + + +TValue *luaH_setstr (lua_State *L, Table *t, TString *key) { + const TValue *p = luaH_getstr(t, key); + if (p != luaO_nilobject) + return cast(TValue *, p); + else { + TValue k; + setsvalue(L, &k, key); + return newkey(L, t, &k); + } +} + + +static int unbound_search (Table *t, unsigned int j) { + unsigned int i = j; /* i is zero or a present index */ + j++; + /* find `i' and `j' such that i is present and j is not */ + while (!ttisnil(luaH_getnum(t, j))) { + i = j; + j *= 2; + if (j > cast(unsigned int, MAX_INT)) { /* overflow? */ + /* table was built with bad purposes: resort to linear search */ + i = 1; + while (!ttisnil(luaH_getnum(t, i))) i++; + return i - 1; + } + } + /* now do a binary search between them */ + while (j - i > 1) { + unsigned int m = (i+j)/2; + if (ttisnil(luaH_getnum(t, m))) j = m; + else i = m; + } + return i; +} + + +/* +** Try to find a boundary in table `t'. A `boundary' is an integer index +** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil). +*/ +int luaH_getn (Table *t) { + unsigned int j = t->sizearray; + if (j > 0 && ttisnil(&t->array[j - 1])) { + /* there is a boundary in the array part: (binary) search for it */ + unsigned int i = 0; + while (j - i > 1) { + unsigned int m = (i+j)/2; + if (ttisnil(&t->array[m - 1])) j = m; + else i = m; + } + return i; + } + /* else must find a boundary in hash part */ + else if (t->node == dummynode) /* hash part is empty? */ + return j; /* that is easy... */ + else return unbound_search(t, j); +} + + + +#if defined(LUA_DEBUG) + +Node *luaH_mainposition (const Table *t, const TValue *key) { + return mainposition(t, key); +} + +int luaH_isdummy (Node *n) { return n == dummynode; } + +#endif diff --git a/user/lua-5.1.4/src/ltable.h b/user/lua-5.1.4/src/ltable.h new file mode 100644 index 0000000..f5b9d5e --- /dev/null +++ b/user/lua-5.1.4/src/ltable.h @@ -0,0 +1,40 @@ +/* +** $Id: ltable.h,v 2.10.1.1 2007/12/27 13:02:25 roberto Exp $ +** Lua tables (hash) +** See Copyright Notice in lua.h +*/ + +#ifndef ltable_h +#define ltable_h + +#include "lobject.h" + + +#define gnode(t,i) (&(t)->node[i]) +#define gkey(n) (&(n)->i_key.nk) +#define gval(n) (&(n)->i_val) +#define gnext(n) ((n)->i_key.nk.next) + +#define key2tval(n) (&(n)->i_key.tvk) + + +LUAI_FUNC const TValue *luaH_getnum (Table *t, int key); +LUAI_FUNC TValue *luaH_setnum (lua_State *L, Table *t, int key); +LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key); +LUAI_FUNC TValue *luaH_setstr (lua_State *L, Table *t, TString *key); +LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key); +LUAI_FUNC TValue *luaH_set (lua_State *L, Table *t, const TValue *key); +LUAI_FUNC Table *luaH_new (lua_State *L, int narray, int lnhash); +LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, int nasize); +LUAI_FUNC void luaH_free (lua_State *L, Table *t); +LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key); +LUAI_FUNC int luaH_getn (Table *t); + + +#if defined(LUA_DEBUG) +LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key); +LUAI_FUNC int luaH_isdummy (Node *n); +#endif + + +#endif diff --git a/user/lua-5.1.4/src/ltable.o b/user/lua-5.1.4/src/ltable.o new file mode 100644 index 0000000000000000000000000000000000000000..adb2f4569a9869787cd26f1368fa2ed9bb149edc GIT binary patch literal 6176 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 + +#define ltablib_c +#define LUA_LIB + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +#define aux_getn(L,n) (luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n)) + + +static int foreachi (lua_State *L) { + int i; + int n = aux_getn(L, 1); + luaL_checktype(L, 2, LUA_TFUNCTION); + for (i=1; i <= n; i++) { + lua_pushvalue(L, 2); /* function */ + lua_pushinteger(L, i); /* 1st argument */ + lua_rawgeti(L, 1, i); /* 2nd argument */ + lua_call(L, 2, 1); + if (!lua_isnil(L, -1)) + return 1; + lua_pop(L, 1); /* remove nil result */ + } + return 0; +} + + +static int foreach (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + luaL_checktype(L, 2, LUA_TFUNCTION); + lua_pushnil(L); /* first key */ + while (lua_next(L, 1)) { + lua_pushvalue(L, 2); /* function */ + lua_pushvalue(L, -3); /* key */ + lua_pushvalue(L, -3); /* value */ + lua_call(L, 2, 1); + if (!lua_isnil(L, -1)) + return 1; + lua_pop(L, 2); /* remove value and result */ + } + return 0; +} + + +static int maxn (lua_State *L) { + lua_Number max = 0; + luaL_checktype(L, 1, LUA_TTABLE); + lua_pushnil(L); /* first key */ + while (lua_next(L, 1)) { + lua_pop(L, 1); /* remove value */ + if (lua_type(L, -1) == LUA_TNUMBER) { + lua_Number v = lua_tonumber(L, -1); + if (v > max) max = v; + } + } + lua_pushnumber(L, max); + return 1; +} + + +static int getn (lua_State *L) { + lua_pushinteger(L, aux_getn(L, 1)); + return 1; +} + + +static int setn (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); +#ifndef luaL_setn + luaL_setn(L, 1, luaL_checkint(L, 2)); +#else + luaL_error(L, LUA_QL("setn") " is obsolete"); +#endif + lua_pushvalue(L, 1); + return 1; +} + + +static int tinsert (lua_State *L) { + int e = aux_getn(L, 1) + 1; /* first empty element */ + int pos; /* where to insert new element */ + switch (lua_gettop(L)) { + case 2: { /* called with only 2 arguments */ + pos = e; /* insert new element at the end */ + break; + } + case 3: { + int i; + pos = luaL_checkint(L, 2); /* 2nd argument is the position */ + if (pos > e) e = pos; /* `grow' array if necessary */ + for (i = e; i > pos; i--) { /* move up elements */ + lua_rawgeti(L, 1, i-1); + lua_rawseti(L, 1, i); /* t[i] = t[i-1] */ + } + break; + } + default: { + return luaL_error(L, "wrong number of arguments to " LUA_QL("insert")); + } + } + luaL_setn(L, 1, e); /* new size */ + lua_rawseti(L, 1, pos); /* t[pos] = v */ + return 0; +} + + +static int tremove (lua_State *L) { + int e = aux_getn(L, 1); + int pos = luaL_optint(L, 2, e); + if (!(1 <= pos && pos <= e)) /* position is outside bounds? */ + return 0; /* nothing to remove */ + luaL_setn(L, 1, e - 1); /* t.n = n-1 */ + lua_rawgeti(L, 1, pos); /* result = t[pos] */ + for ( ;pos= P */ + while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) { + if (i>u) luaL_error(L, "invalid order function for sorting"); + lua_pop(L, 1); /* remove a[i] */ + } + /* repeat --j until a[j] <= P */ + while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) { + if (ji3o)x>1@HPr@+iQjkceVdnO zgzBAn`@QenbI(2J-22YGfsX2$%|4$`IL#*t#3U19`*x3QjoH7q+i%(LI6icCTZ`=d!6MrX7CO^p z>fg^;V;QK8*7vk@r7!!^SNwT9jxVkOFpwV%y&^i~)h9>H6V4>$p6Wm%i#HgJUk0^e{Z^w`;Tu8NAc%^DvvS`tA0?k<#p&TnD&c zS)D6>p%?EQFI~!;%-OYrnd(8e;cg#Rbo!j_{ugs*y*?7)09v1BKS<}X>!yoIWd&9y z;Ohcu&74&^-rn8PHS)Uhcb%2%%9_i>{uP&_f}=NyigZ9mIpFdMO2zOFY zT4!BsFSS1y?!Y@O0$g)XZlKQ7=t=jk+|dxO@1f$9>`&QP(`WpjA2Q?Sa_&&B?{^X9 za4(EvS?zH+#3WS@;%i9%(l@+Ar^4;d@XKJTo;;2MHTyON%9R^u2NuoO+on`4w%zCS zsIsItQfK#pc^F;9+D0p~WI3fql|72&Si9f8c1o6jG6a+Eon79&qoKYB_3jBexblB< z(3#5a%O|k1uYD$RPP525T)WOLS8%S1RoT~3G_sES%^u6{^LdJiOVK^t**BHr9cP^# zH(e=%6RM!okN+n=7|*u()CV=@H-qW10&@$5bSCKJ)7f6ST-sI+TUaZ}qUg9gnG?qA zU8c%DM7zJYV~(~na#DSd_IUQdgeNa*9jB>TmF>Cx=Z5!V8+P6KJcI}TZNtb3M%t$H zlYYDR_cZ(?onWYAE2kMdV!EO!H`et*yR#dE>#+ zQLENneE0|?bYJ(VozvM1W7#+Q=?51`Tc~`6@&oH-{k?z#ZYR3#8h6YE;L$j2x|)xfNP+F1cbj6^%9bFauWAp8#6!Ir)ahbQ#? zB9o<0^kry192xnZv?_!dX^a`7BxRWKl0Y;SNHnGrF~c;3XiCJJBBp3bB#lVZZU>`c z7gR-SWM5oF<0&I)ilot+*lP%y5UB(N(fHm-EZQ7MB%6(7pv8(enbAZ%080V(N8`JM zcqW;M?+V1N)<&o#S^|;eF00juo2h`A2$U$xyl^|VV9_!HrAt#~fruH1#+!|Ofu+rO z3CIYf@e<{-yr*O6v~2;TKbk4TVqn$BgeU{9{m`aIIGC@M^@=*CyS^_PEO|{t?KLbRX@~!(GHRl(_w#{XW+)3RE zyi@;9ddxZPbA8xo?=kf%f7!?93mP50JY0@Z#_&EVRccTv596U}=$f=j&i*Ak{ z(TRawPtF!%CkE2&JUomSA{m3*-dmr>TDt~1_MkeYx#fl8+Jw7v>c2S9U-t~;&MK=> z1>&y!zd~$-$cGGK`^cQt0{xKiyF7@8hd4QNSOq7(q&Xnp3b0%G-FBgW1E!{aIXJ(| zqd@Y{0r}kyYW^^g-}4pCHv_A%kblyg>&@@}l;+!kgWzA*{7E3|#NRcK00XEa&ujiP zkaeX2K5>3`D?q&NRv@70Y6V!Oq~@i-PhtE)S3lSBu!q0m;otXgc^T3&jz8_`f7`>~ z_3*!V_+<~j>ESb6A#=Vt9=_Pa%RPL9hi~=pr#!sL!`nQ(!^2kvW{H^phnf!(7o)}(DE%csAIjNsa`^iY z5&e(q{v*2oxb8ox`_JqCziC{H+Rbqd8ZF}eLiB2Wg^2u25Q8{_kvryZJ|6#4+~bJI zPc;#Gbwt?f()=h9WQM8v~OlYhAo z4-;W;GqFU7n3f+TGHxQqy+*`k>(|7ULW~nJZWhim#=DxsSLEXD<nB`?(+sgxY9OMOf&`GcCT*St#eO`883yI`tY literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/ltm.c b/user/lua-5.1.4/src/ltm.c new file mode 100644 index 0000000..c27f0f6 --- /dev/null +++ b/user/lua-5.1.4/src/ltm.c @@ -0,0 +1,75 @@ +/* +** $Id: ltm.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $ +** Tag methods +** See Copyright Notice in lua.h +*/ + + +#include + +#define ltm_c +#define LUA_CORE + +#include "lua.h" + +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" + + + +const char *const luaT_typenames[] = { + "nil", "boolean", "userdata", "number", + "string", "table", "function", "userdata", "thread", + "proto", "upval" +}; + + +void luaT_init (lua_State *L) { + static const char *const luaT_eventname[] = { /* ORDER TM */ + "__index", "__newindex", + "__gc", "__mode", "__eq", + "__add", "__sub", "__mul", "__div", "__mod", + "__pow", "__unm", "__len", "__lt", "__le", + "__concat", "__call" + }; + int i; + for (i=0; itmname[i] = luaS_new(L, luaT_eventname[i]); + luaS_fix(G(L)->tmname[i]); /* never collect these names */ + } +} + + +/* +** function to be used with macro "fasttm": optimized for absence of +** tag methods +*/ +const TValue *luaT_gettm (Table *events, TMS event, TString *ename) { + const TValue *tm = luaH_getstr(events, ename); + lua_assert(event <= TM_EQ); + if (ttisnil(tm)) { /* no tag method? */ + events->flags |= cast_byte(1u<metatable; + break; + case LUA_TUSERDATA: + mt = uvalue(o)->metatable; + break; + default: + mt = G(L)->mt[ttype(o)]; + } + return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject); +} + diff --git a/user/lua-5.1.4/src/ltm.h b/user/lua-5.1.4/src/ltm.h new file mode 100644 index 0000000..64343b7 --- /dev/null +++ b/user/lua-5.1.4/src/ltm.h @@ -0,0 +1,54 @@ +/* +** $Id: ltm.h,v 2.6.1.1 2007/12/27 13:02:25 roberto Exp $ +** Tag methods +** See Copyright Notice in lua.h +*/ + +#ifndef ltm_h +#define ltm_h + + +#include "lobject.h" + + +/* +* WARNING: if you change the order of this enumeration, +* grep "ORDER TM" +*/ +typedef enum { + TM_INDEX, + TM_NEWINDEX, + TM_GC, + TM_MODE, + TM_EQ, /* last tag method with `fast' access */ + TM_ADD, + TM_SUB, + TM_MUL, + TM_DIV, + TM_MOD, + TM_POW, + TM_UNM, + TM_LEN, + TM_LT, + TM_LE, + TM_CONCAT, + TM_CALL, + TM_N /* number of elements in the enum */ +} TMS; + + + +#define gfasttm(g,et,e) ((et) == NULL ? NULL : \ + ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e])) + +#define fasttm(l,et,e) gfasttm(G(l), et, e) + +LUAI_DATA const char *const luaT_typenames[]; + + +LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename); +LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, + TMS event); +LUAI_FUNC void luaT_init (lua_State *L); + +#endif diff --git a/user/lua-5.1.4/src/ltm.o b/user/lua-5.1.4/src/ltm.o new file mode 100644 index 0000000000000000000000000000000000000000..fba3deb247d80c54b1a10732b06111f30c9bc57e GIT binary patch literal 1988 zcma)6-)kII7`?OEw4<)LkqCkX7hFq9)1hltMTxkYqzSaqYO+;~>vnc#nyk*wth;x% z2^LzN1RaNfpf3uF;7cET(}zAuB>4x_H+|_t1cko%R#b@R%-pFf7W9L2&v(B2-EZ!% zxtHh8oYFK+WTuG`@wXD9Fp~CE6Pgfri#xN_gzM4IOW}=tTrb3ndfX_+&+6gLQF$`F zc~~BgUns_#?`$G*YeycX`skCZP|=(o)eGTXex>p2p9cpA+XE5j;+np-6a0wiHCA3} z>~71WBCS6jH}rU}7#%4`v*r9R921|_x4xHpxHpc>3m?Rbg=?Jm57+gXLkL!OSYW{M zFP&Se{1o1pi~}8c)1TIm7N09d)8(kXpVW#jmGe=Rwe_@ieSiD(M7XO(v+wKisbW0) zo_=Lvv=sg^7JL)#O|HDwZ0ri*wO!Hjeb+HP5%is&ZAw#kL8s;PL|^vW-l~vh%XP$s zz_VoA_k>*QIi@YTJzx4F=nhO*G@EVDcGkh3b1`#QE$EJKJ0RyxG^TB%?FTK!1CFxW z1NuJWUH>B5!0VuO9gnR{Tr`&NStgZbx-M3J8_OeB0PX{h01pAj0LC5xo&cT(ZfA1{ zE&?wD4ZsH4fDZ(~Tfp1EyTCT^A@DKq8Sn-0B_QT!W}Ylf)LVfkgHqL~8dE2#L82Z# zmTDo4{zeD836{N-*D|l?xQ2Arr7)5cFk1b-FnT@(vnxgg5;BMbA(dSN|E_#eQTY#m?@&JJYYaFEz6;=Z?z;{=thD;o#56mH zjCr)<0Q3JVkKbSko*j+#zDnJsWgju4IG04xz}d`va7p<*`{8x$V;$EK<2twp**Z?c zXI*}uwuyS>)J@v#yUS4YGrM|g0%;`c8-vW&${yy~X-d*&dF0^|4AB-5Lnkh`?lrY~)}4 z!#mG>UGQGfUIp&WY014v0%(fZh{rRb^gQ@H@D#xO7r~zcuPDtrnQ@=2On_OhtMnvz zEQd{VWyi3D8<@*YXMjJ+Gdqqk^;l&pjjcLTc3K;L>vigdCNzFS`p-A;Z&A>$>*WyKSUYl@R|Mc#taXB3}RoZNTx^NnOZ?l<|o XVq5W=VplQuoq1C6y5dWUuPFWt;ZZ9; literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/lua b/user/lua-5.1.4/src/lua new file mode 100755 index 0000000000000000000000000000000000000000..2b0674b90b6dce2cdda637909516a42f79ea29ea GIT binary patch literal 158673 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 aqcEj(&oDykWkIGG6e@|U1lAlM?f(JaKnwK% literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/lua.c b/user/lua-5.1.4/src/lua.c new file mode 100644 index 0000000..3a46609 --- /dev/null +++ b/user/lua-5.1.4/src/lua.c @@ -0,0 +1,392 @@ +/* +** $Id: lua.c,v 1.160.1.2 2007/12/28 15:32:23 roberto Exp $ +** Lua stand-alone interpreter +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include +#include + +#define lua_c + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + + +static lua_State *globalL = NULL; + +static const char *progname = LUA_PROGNAME; + + + +static void lstop (lua_State *L, lua_Debug *ar) { + (void)ar; /* unused arg. */ + lua_sethook(L, NULL, 0, 0); + luaL_error(L, "interrupted!"); +} + + +static void laction (int i) { + signal(i, SIG_DFL); /* if another SIGINT happens before lstop, + terminate process (default action) */ + lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1); +} + + +static void print_usage (void) { + fprintf(stderr, + "usage: %s [options] [script [args]].\n" + "Available options are:\n" + " -e stat execute string " LUA_QL("stat") "\n" + " -l name require library " LUA_QL("name") "\n" + " -i enter interactive mode after executing " LUA_QL("script") "\n" + " -v show version information\n" + " -- stop handling options\n" + " - execute stdin and stop handling options\n" + , + progname); + fflush(stderr); +} + + +static void l_message (const char *pname, const char *msg) { + if (pname) fprintf(stderr, "%s: ", pname); + fprintf(stderr, "%s\n", msg); + fflush(stderr); +} + + +static int report (lua_State *L, int status) { + if (status && !lua_isnil(L, -1)) { + const char *msg = lua_tostring(L, -1); + if (msg == NULL) msg = "(error object is not a string)"; + l_message(progname, msg); + lua_pop(L, 1); + } + return status; +} + + +static int traceback (lua_State *L) { + if (!lua_isstring(L, 1)) /* 'message' not a string? */ + return 1; /* keep it intact */ + lua_getfield(L, LUA_GLOBALSINDEX, "debug"); + if (!lua_istable(L, -1)) { + lua_pop(L, 1); + return 1; + } + lua_getfield(L, -1, "traceback"); + if (!lua_isfunction(L, -1)) { + lua_pop(L, 2); + return 1; + } + lua_pushvalue(L, 1); /* pass error message */ + lua_pushinteger(L, 2); /* skip this function and traceback */ + lua_call(L, 2, 1); /* call debug.traceback */ + return 1; +} + + +static int docall (lua_State *L, int narg, int clear) { + int status; + int base = lua_gettop(L) - narg; /* function index */ + lua_pushcfunction(L, traceback); /* push traceback function */ + lua_insert(L, base); /* put it under chunk and args */ + signal(SIGINT, laction); + status = lua_pcall(L, narg, (clear ? 0 : LUA_MULTRET), base); + signal(SIGINT, SIG_DFL); + lua_remove(L, base); /* remove traceback function */ + /* force a complete garbage collection in case of errors */ + if (status != 0) lua_gc(L, LUA_GCCOLLECT, 0); + return status; +} + + +static void print_version (void) { + l_message(NULL, LUA_RELEASE " " LUA_COPYRIGHT); +} + + +static int getargs (lua_State *L, char **argv, int n) { + int narg; + int i; + int argc = 0; + while (argv[argc]) argc++; /* count total number of arguments */ + narg = argc - (n + 1); /* number of arguments to the script */ + luaL_checkstack(L, narg + 3, "too many arguments to script"); + for (i=n+1; i < argc; i++) + lua_pushstring(L, argv[i]); + lua_createtable(L, narg, n + 1); + for (i=0; i < argc; i++) { + lua_pushstring(L, argv[i]); + lua_rawseti(L, -2, i - n); + } + return narg; +} + + +static int dofile (lua_State *L, const char *name) { + int status = luaL_loadfile(L, name) || docall(L, 0, 1); + return report(L, status); +} + + +static int dostring (lua_State *L, const char *s, const char *name) { + int status = luaL_loadbuffer(L, s, strlen(s), name) || docall(L, 0, 1); + return report(L, status); +} + + +static int dolibrary (lua_State *L, const char *name) { + lua_getglobal(L, "require"); + lua_pushstring(L, name); + return report(L, docall(L, 1, 1)); +} + + +static const char *get_prompt (lua_State *L, int firstline) { + const char *p; + lua_getfield(L, LUA_GLOBALSINDEX, firstline ? "_PROMPT" : "_PROMPT2"); + p = lua_tostring(L, -1); + if (p == NULL) p = (firstline ? LUA_PROMPT : LUA_PROMPT2); + lua_pop(L, 1); /* remove global */ + return p; +} + + +static int incomplete (lua_State *L, int status) { + if (status == LUA_ERRSYNTAX) { + size_t lmsg; + const char *msg = lua_tolstring(L, -1, &lmsg); + const char *tp = msg + lmsg - (sizeof(LUA_QL("")) - 1); + if (strstr(msg, LUA_QL("")) == tp) { + lua_pop(L, 1); + return 1; + } + } + return 0; /* else... */ +} + + +static int pushline (lua_State *L, int firstline) { + char buffer[LUA_MAXINPUT]; + char *b = buffer; + size_t l; + const char *prmt = get_prompt(L, firstline); + if (lua_readline(L, b, prmt) == 0) + return 0; /* no input */ + l = strlen(b); + if (l > 0 && b[l-1] == '\n') /* line ends with newline? */ + b[l-1] = '\0'; /* remove it */ + if (firstline && b[0] == '=') /* first line starts with `=' ? */ + lua_pushfstring(L, "return %s", b+1); /* change it to `return' */ + else + lua_pushstring(L, b); + lua_freeline(L, b); + return 1; +} + + +static int loadline (lua_State *L) { + int status; + lua_settop(L, 0); + if (!pushline(L, 1)) + return -1; /* no input */ + for (;;) { /* repeat until gets a complete line */ + status = luaL_loadbuffer(L, lua_tostring(L, 1), lua_strlen(L, 1), "=stdin"); + if (!incomplete(L, status)) break; /* cannot try to add lines? */ + if (!pushline(L, 0)) /* no more input? */ + return -1; + lua_pushliteral(L, "\n"); /* add a new line... */ + lua_insert(L, -2); /* ...between the two lines */ + lua_concat(L, 3); /* join them */ + } + lua_saveline(L, 1); + lua_remove(L, 1); /* remove line */ + return status; +} + + +static void dotty (lua_State *L) { + int status; + const char *oldprogname = progname; + progname = NULL; + while ((status = loadline(L)) != -1) { + if (status == 0) status = docall(L, 0, 0); + report(L, status); + if (status == 0 && lua_gettop(L) > 0) { /* any result to print? */ + lua_getglobal(L, "print"); + lua_insert(L, 1); + if (lua_pcall(L, lua_gettop(L)-1, 0, 0) != 0) + l_message(progname, lua_pushfstring(L, + "error calling " LUA_QL("print") " (%s)", + lua_tostring(L, -1))); + } + } + lua_settop(L, 0); /* clear stack */ + fputs("\n", stdout); + fflush(stdout); + progname = oldprogname; +} + + +static int handle_script (lua_State *L, char **argv, int n) { + int status; + const char *fname; + int narg = getargs(L, argv, n); /* collect arguments */ + lua_setglobal(L, "arg"); + fname = argv[n]; + if (strcmp(fname, "-") == 0 && strcmp(argv[n-1], "--") != 0) + fname = NULL; /* stdin */ + status = luaL_loadfile(L, fname); + lua_insert(L, -(narg+1)); + if (status == 0) + status = docall(L, narg, 0); + else + lua_pop(L, narg); + return report(L, status); +} + + +/* check that argument has no extra characters at the end */ +#define notail(x) {if ((x)[2] != '\0') return -1;} + + +static int collectargs (char **argv, int *pi, int *pv, int *pe) { + int i; + for (i = 1; argv[i] != NULL; i++) { + if (argv[i][0] != '-') /* not an option? */ + return i; + switch (argv[i][1]) { /* option */ + case '-': + notail(argv[i]); + return (argv[i+1] != NULL ? i+1 : 0); + case '\0': + return i; + case 'i': + notail(argv[i]); + *pi = 1; /* go through */ + case 'v': + notail(argv[i]); + *pv = 1; + break; + case 'e': + *pe = 1; /* go through */ + case 'l': + if (argv[i][2] == '\0') { + i++; + if (argv[i] == NULL) return -1; + } + break; + default: return -1; /* invalid option */ + } + } + return 0; +} + + +static int runargs (lua_State *L, char **argv, int n) { + int i; + for (i = 1; i < n; i++) { + if (argv[i] == NULL) continue; + lua_assert(argv[i][0] == '-'); + switch (argv[i][1]) { /* option */ + case 'e': { + const char *chunk = argv[i] + 2; + if (*chunk == '\0') chunk = argv[++i]; + lua_assert(chunk != NULL); + if (dostring(L, chunk, "=(command line)") != 0) + return 1; + break; + } + case 'l': { + const char *filename = argv[i] + 2; + if (*filename == '\0') filename = argv[++i]; + lua_assert(filename != NULL); + if (dolibrary(L, filename)) + return 1; /* stop if file fails */ + break; + } + default: break; + } + } + return 0; +} + + +static int handle_luainit (lua_State *L) { + const char *init = getenv(LUA_INIT); + if (init == NULL) return 0; /* status OK */ + else if (init[0] == '@') + return dofile(L, init+1); + else + return dostring(L, init, "=" LUA_INIT); +} + + +struct Smain { + int argc; + char **argv; + int status; +}; + + +static int pmain (lua_State *L) { + struct Smain *s = (struct Smain *)lua_touserdata(L, 1); + char **argv = s->argv; + int script; + int has_i = 0, has_v = 0, has_e = 0; + globalL = L; + if (argv[0] && argv[0][0]) progname = argv[0]; + lua_gc(L, LUA_GCSTOP, 0); /* stop collector during initialization */ + luaL_openlibs(L); /* open libraries */ + lua_gc(L, LUA_GCRESTART, 0); + s->status = handle_luainit(L); + if (s->status != 0) return 0; + script = collectargs(argv, &has_i, &has_v, &has_e); + if (script < 0) { /* invalid args? */ + print_usage(); + s->status = 1; + return 0; + } + if (has_v) print_version(); + s->status = runargs(L, argv, (script > 0) ? script : s->argc); + if (s->status != 0) return 0; + if (script) + s->status = handle_script(L, argv, script); + if (s->status != 0) return 0; + if (has_i) + dotty(L); + else if (script == 0 && !has_e && !has_v) { + if (lua_stdin_is_tty()) { + print_version(); + dotty(L); + } + else dofile(L, NULL); /* executes stdin as a file */ + } + return 0; +} + + +int main (int argc, char **argv) { + int status; + struct Smain s; + lua_State *L = lua_open(); /* create state */ + if (L == NULL) { + l_message(argv[0], "cannot create state: not enough memory"); + return EXIT_FAILURE; + } + s.argc = argc; + s.argv = argv; + status = lua_cpcall(L, &pmain, &s); + report(L, status); + lua_close(L); + return (status || s.status) ? EXIT_FAILURE : EXIT_SUCCESS; +} + diff --git a/user/lua-5.1.4/src/lua.h b/user/lua-5.1.4/src/lua.h new file mode 100644 index 0000000..e4bdfd3 --- /dev/null +++ b/user/lua-5.1.4/src/lua.h @@ -0,0 +1,388 @@ +/* +** $Id: lua.h,v 1.218.1.5 2008/08/06 13:30:12 roberto Exp $ +** Lua - An Extensible Extension Language +** Lua.org, PUC-Rio, Brazil (http://www.lua.org) +** See Copyright Notice at the end of this file +*/ + + +#ifndef lua_h +#define lua_h + +#include +#include + + +#include "luaconf.h" + + +#define LUA_VERSION "Lua 5.1" +#define LUA_RELEASE "Lua 5.1.4" +#define LUA_VERSION_NUM 501 +#define LUA_COPYRIGHT "Copyright (C) 1994-2008 Lua.org, PUC-Rio" +#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes" + + +/* mark for precompiled code (`Lua') */ +#define LUA_SIGNATURE "\033Lua" + +/* option for multiple returns in `lua_pcall' and `lua_call' */ +#define LUA_MULTRET (-1) + + +/* +** pseudo-indices +*/ +#define LUA_REGISTRYINDEX (-10000) +#define LUA_ENVIRONINDEX (-10001) +#define LUA_GLOBALSINDEX (-10002) +#define lua_upvalueindex(i) (LUA_GLOBALSINDEX-(i)) + + +/* thread status; 0 is OK */ +#define LUA_YIELD 1 +#define LUA_ERRRUN 2 +#define LUA_ERRSYNTAX 3 +#define LUA_ERRMEM 4 +#define LUA_ERRERR 5 + + +typedef struct lua_State lua_State; + +typedef int (*lua_CFunction) (lua_State *L); + + +/* +** functions that read/write blocks when loading/dumping Lua chunks +*/ +typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz); + +typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud); + + +/* +** prototype for memory-allocation functions +*/ +typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize); + + +/* +** basic types +*/ +#define LUA_TNONE (-1) + +#define LUA_TNIL 0 +#define LUA_TBOOLEAN 1 +#define LUA_TLIGHTUSERDATA 2 +#define LUA_TNUMBER 3 +#define LUA_TSTRING 4 +#define LUA_TTABLE 5 +#define LUA_TFUNCTION 6 +#define LUA_TUSERDATA 7 +#define LUA_TTHREAD 8 + + + +/* minimum Lua stack available to a C function */ +#define LUA_MINSTACK 20 + + +/* +** generic extra include file +*/ +#if defined(LUA_USER_H) +#include LUA_USER_H +#endif + + +/* type of numbers in Lua */ +typedef LUA_NUMBER lua_Number; + + +/* type for integer functions */ +typedef LUA_INTEGER lua_Integer; + + + +/* +** state manipulation +*/ +LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud); +LUA_API void (lua_close) (lua_State *L); +LUA_API lua_State *(lua_newthread) (lua_State *L); + +LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf); + + +/* +** basic stack manipulation +*/ +LUA_API int (lua_gettop) (lua_State *L); +LUA_API void (lua_settop) (lua_State *L, int idx); +LUA_API void (lua_pushvalue) (lua_State *L, int idx); +LUA_API void (lua_remove) (lua_State *L, int idx); +LUA_API void (lua_insert) (lua_State *L, int idx); +LUA_API void (lua_replace) (lua_State *L, int idx); +LUA_API int (lua_checkstack) (lua_State *L, int sz); + +LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n); + + +/* +** access functions (stack -> C) +*/ + +LUA_API int (lua_isnumber) (lua_State *L, int idx); +LUA_API int (lua_isstring) (lua_State *L, int idx); +LUA_API int (lua_iscfunction) (lua_State *L, int idx); +LUA_API int (lua_isuserdata) (lua_State *L, int idx); +LUA_API int (lua_type) (lua_State *L, int idx); +LUA_API const char *(lua_typename) (lua_State *L, int tp); + +LUA_API int (lua_equal) (lua_State *L, int idx1, int idx2); +LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2); +LUA_API int (lua_lessthan) (lua_State *L, int idx1, int idx2); + +LUA_API lua_Number (lua_tonumber) (lua_State *L, int idx); +LUA_API lua_Integer (lua_tointeger) (lua_State *L, int idx); +LUA_API int (lua_toboolean) (lua_State *L, int idx); +LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len); +LUA_API size_t (lua_objlen) (lua_State *L, int idx); +LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx); +LUA_API void *(lua_touserdata) (lua_State *L, int idx); +LUA_API lua_State *(lua_tothread) (lua_State *L, int idx); +LUA_API const void *(lua_topointer) (lua_State *L, int idx); + + +/* +** push functions (C -> stack) +*/ +LUA_API void (lua_pushnil) (lua_State *L); +LUA_API void (lua_pushnumber) (lua_State *L, lua_Number n); +LUA_API void (lua_pushinteger) (lua_State *L, lua_Integer n); +LUA_API void (lua_pushlstring) (lua_State *L, const char *s, size_t l); +LUA_API void (lua_pushstring) (lua_State *L, const char *s); +LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt, + va_list argp); +LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...); +LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); +LUA_API void (lua_pushboolean) (lua_State *L, int b); +LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p); +LUA_API int (lua_pushthread) (lua_State *L); + + +/* +** get functions (Lua -> stack) +*/ +LUA_API void (lua_gettable) (lua_State *L, int idx); +LUA_API void (lua_getfield) (lua_State *L, int idx, const char *k); +LUA_API void (lua_rawget) (lua_State *L, int idx); +LUA_API void (lua_rawgeti) (lua_State *L, int idx, int n); +LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec); +LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz); +LUA_API int (lua_getmetatable) (lua_State *L, int objindex); +LUA_API void (lua_getfenv) (lua_State *L, int idx); + + +/* +** set functions (stack -> Lua) +*/ +LUA_API void (lua_settable) (lua_State *L, int idx); +LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k); +LUA_API void (lua_rawset) (lua_State *L, int idx); +LUA_API void (lua_rawseti) (lua_State *L, int idx, int n); +LUA_API int (lua_setmetatable) (lua_State *L, int objindex); +LUA_API int (lua_setfenv) (lua_State *L, int idx); + + +/* +** `load' and `call' functions (load and run Lua code) +*/ +LUA_API void (lua_call) (lua_State *L, int nargs, int nresults); +LUA_API int (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc); +LUA_API int (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud); +LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt, + const char *chunkname); + +LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data); + + +/* +** coroutine functions +*/ +LUA_API int (lua_yield) (lua_State *L, int nresults); +LUA_API int (lua_resume) (lua_State *L, int narg); +LUA_API int (lua_status) (lua_State *L); + +/* +** garbage-collection function and options +*/ + +#define LUA_GCSTOP 0 +#define LUA_GCRESTART 1 +#define LUA_GCCOLLECT 2 +#define LUA_GCCOUNT 3 +#define LUA_GCCOUNTB 4 +#define LUA_GCSTEP 5 +#define LUA_GCSETPAUSE 6 +#define LUA_GCSETSTEPMUL 7 + +LUA_API int (lua_gc) (lua_State *L, int what, int data); + + +/* +** miscellaneous functions +*/ + +LUA_API int (lua_error) (lua_State *L); + +LUA_API int (lua_next) (lua_State *L, int idx); + +LUA_API void (lua_concat) (lua_State *L, int n); + +LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud); +LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud); + + + +/* +** =============================================================== +** some useful macros +** =============================================================== +*/ + +#define lua_pop(L,n) lua_settop(L, -(n)-1) + +#define lua_newtable(L) lua_createtable(L, 0, 0) + +#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n))) + +#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0) + +#define lua_strlen(L,i) lua_objlen(L, (i)) + +#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION) +#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE) +#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA) +#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL) +#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN) +#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD) +#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE) +#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0) + +#define lua_pushliteral(L, s) \ + lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1) + +#define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, (s)) +#define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, (s)) + +#define lua_tostring(L,i) lua_tolstring(L, (i), NULL) + + + +/* +** compatibility macros and functions +*/ + +#define lua_open() luaL_newstate() + +#define lua_getregistry(L) lua_pushvalue(L, LUA_REGISTRYINDEX) + +#define lua_getgccount(L) lua_gc(L, LUA_GCCOUNT, 0) + +#define lua_Chunkreader lua_Reader +#define lua_Chunkwriter lua_Writer + + +/* hack */ +LUA_API void lua_setlevel (lua_State *from, lua_State *to); + + +/* +** {====================================================================== +** Debug API +** ======================================================================= +*/ + + +/* +** Event codes +*/ +#define LUA_HOOKCALL 0 +#define LUA_HOOKRET 1 +#define LUA_HOOKLINE 2 +#define LUA_HOOKCOUNT 3 +#define LUA_HOOKTAILRET 4 + + +/* +** Event masks +*/ +#define LUA_MASKCALL (1 << LUA_HOOKCALL) +#define LUA_MASKRET (1 << LUA_HOOKRET) +#define LUA_MASKLINE (1 << LUA_HOOKLINE) +#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT) + +typedef struct lua_Debug lua_Debug; /* activation record */ + + +/* Functions to be called by the debuger in specific events */ +typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); + + +LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar); +LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar); +LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n); +LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n); +LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n); +LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n); + +LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count); +LUA_API lua_Hook lua_gethook (lua_State *L); +LUA_API int lua_gethookmask (lua_State *L); +LUA_API int lua_gethookcount (lua_State *L); + + +struct lua_Debug { + int event; + const char *name; /* (n) */ + const char *namewhat; /* (n) `global', `local', `field', `method' */ + const char *what; /* (S) `Lua', `C', `main', `tail' */ + const char *source; /* (S) */ + int currentline; /* (l) */ + int nups; /* (u) number of upvalues */ + int linedefined; /* (S) */ + int lastlinedefined; /* (S) */ + char short_src[LUA_IDSIZE]; /* (S) */ + /* private part */ + int i_ci; /* active function */ +}; + +/* }====================================================================== */ + + +/****************************************************************************** +* Copyright (C) 1994-2008 Lua.org, PUC-Rio. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be +* included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +******************************************************************************/ + + +#endif diff --git a/user/lua-5.1.4/src/lua.o b/user/lua-5.1.4/src/lua.o new file mode 100644 index 0000000000000000000000000000000000000000..972f89bc25b65b1fc438df297f88d8d695c86dd8 GIT binary patch literal 7840 zcma)A4RBP~b-pVtzZO}?6^>IF`waEzY+Ld?T zlOcszc(rL>-UyVLHevEpLYg#bl4(8DguxC;*9appZj1>71e6J#h>W(-4t6PEj8VVu z-usr-Bc16Rtw6$k``_XI?_xQ&F^^id_Lm!w+E5Ys(XNn4!@ z>zv}z02W3oS^_){*#p$;&l+l*j-B0Hi-x;L;(aWD(m%UW&+7(hQmv@G&4Q_ayW$Kv_I2l!v;C&@Sep6qG8NVEf@><8 zZB;=p3`V^M^5I|={tGF0VbFrgwyFxKW#12cJYUR&`t+{#ox^un%w4rui((hhtmnIt3XyzNw~Zk4^jo{-J0ni`vE)@!tg1;vKhj*WN)t6Erxdct1aiC1MfXU5hd;<^)1 zKXvhK2yU?=d-Fk&6w6@QX#m zjyxRde;uQG^4VLD{*AU3y4yqF`s$b06#d`=0YU!a8cLbEjty z1_ySG-@0|{+B-#1BF0)q2t)+WIwv^jCYCb%Z$=l644zUy)pKos)%8mc(QSd^!#mM4Uk6>7+#%S;` zPNRQf8FLp@BCE6oOj#E5*Tow(7 zuiJWjVEy#>8;@J})4ndMD(MYW;5`~{QBh6kaapSGWBXyRtzgKUN)ub?L-!mp=1xeV zyhL7@#gKccPgO|NTR|p;W1qKxVtpjjJA>Wu$-k$1_Rvz3$~@Igr=qPQj>`EiG!~42RE< zF&sXr$OxICeQN@JH{zlG&teaMslD$;BGf+vg1#HQsAs5u1K4||K62W|>E7ykwSL;XL56{l_Fr62X52<6^HirMXFgjMkxw?JKf?Afcx zu4N>56nBJB|9glfyL~he+PMKEna9Ohg9uaJH$weqF)2F~Xlxq|?OXy4H@F8&@t-O! z(>~R=rA!R0DYGX-$*tV;>HwWz9vk9@%v*1ujKfdJI1B60U$PYn%ZmMv8p5Wa5$hRR z2<~xy%S!)3u1rm+{{VE6OrZg@V}see+=kwI!^2#4BwZeR_kVB>7Q(7eX{usR?x_8f z!X9u2z4y-Lv9ritzIWcb_(p8d7roP(XX|_iA#oYxS)p6XZO!xWU$0*ga@9T8UxrN_ zLzl<85d)&nO-8V~XuFQVzp4VP3b%D6hgFe16+W5E+coa?5uRL2sMdBocP^A$$YINw z+|f|(0Svu$`|cHZxjgpt4Q%u&;Pc#N{Gr?docU-zRuaueQg{UlO1S5?Fg94&&56AN z?c?&bS_o*|a(?)6xupspg}ytb?i^R)Ds0I

Y*8VPAE_BP`Jm-~{!!c6=aM?u3tI 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

oKcegBe-b$P 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 SDx;+`tvHLb9Jx8_oc{%Q2Y3en literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/luac.c b/user/lua-5.1.4/src/luac.c new file mode 100644 index 0000000..d070173 --- /dev/null +++ b/user/lua-5.1.4/src/luac.c @@ -0,0 +1,200 @@ +/* +** $Id: luac.c,v 1.54 2006/06/02 17:37:11 lhf Exp $ +** Lua compiler (saves bytecodes to files; also list bytecodes) +** See Copyright Notice in lua.h +*/ + +#include +#include +#include +#include + +#define luac_c +#define LUA_CORE + +#include "lua.h" +#include "lauxlib.h" + +#include "ldo.h" +#include "lfunc.h" +#include "lmem.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lstring.h" +#include "lundump.h" + +#define PROGNAME "luac" /* default program name */ +#define OUTPUT PROGNAME ".out" /* default output file */ + +static int listing=0; /* list bytecodes? */ +static int dumping=1; /* dump bytecodes? */ +static int stripping=0; /* strip debug information? */ +static char Output[]={ OUTPUT }; /* default output file name */ +static const char* output=Output; /* actual output file name */ +static const char* progname=PROGNAME; /* actual program name */ + +static void fatal(const char* message) +{ + fprintf(stderr,"%s: %s\n",progname,message); + exit(EXIT_FAILURE); +} + +static void cannot(const char* what) +{ + fprintf(stderr,"%s: cannot %s %s: %s\n",progname,what,output,strerror(errno)); + exit(EXIT_FAILURE); +} + +static void usage(const char* message) +{ + if (*message=='-') + fprintf(stderr,"%s: unrecognized option " LUA_QS "\n",progname,message); + else + fprintf(stderr,"%s: %s\n",progname,message); + fprintf(stderr, + "usage: %s [options] [filenames].\n" + "Available options are:\n" + " - process stdin\n" + " -l list\n" + " -o name output to file " LUA_QL("name") " (default is \"%s\")\n" + " -p parse only\n" + " -s strip debug information\n" + " -v show version information\n" + " -- stop handling options\n", + progname,Output); + exit(EXIT_FAILURE); +} + +#define IS(s) (strcmp(argv[i],s)==0) + +static int doargs(int argc, char* argv[]) +{ + int i; + int version=0; + if (argv[0]!=NULL && *argv[0]!=0) progname=argv[0]; + for (i=1; itop+(i))->l.p) + +static const Proto* combine(lua_State* L, int n) +{ + if (n==1) + return toproto(L,-1); + else + { + int i,pc; + Proto* f=luaF_newproto(L); + setptvalue2s(L,L->top,f); incr_top(L); + f->source=luaS_newliteral(L,"=(" PROGNAME ")"); + f->maxstacksize=1; + pc=2*n+1; + f->code=luaM_newvector(L,pc,Instruction); + f->sizecode=pc; + f->p=luaM_newvector(L,n,Proto*); + f->sizep=n; + pc=0; + for (i=0; ip[i]=toproto(L,i-n-1); + f->code[pc++]=CREATE_ABx(OP_CLOSURE,0,i); + f->code[pc++]=CREATE_ABC(OP_CALL,0,1,1); + } + f->code[pc++]=CREATE_ABC(OP_RETURN,0,1,0); + return f; + } +} + +static int writer(lua_State* L, const void* p, size_t size, void* u) +{ + UNUSED(L); + return (fwrite(p,size,1,(FILE*)u)!=1) && (size!=0); +} + +struct Smain { + int argc; + char** argv; +}; + +static int pmain(lua_State* L) +{ + struct Smain* s = (struct Smain*)lua_touserdata(L, 1); + int argc=s->argc; + char** argv=s->argv; + const Proto* f; + int i; + if (!lua_checkstack(L,argc)) fatal("too many input files"); + for (i=0; i1); + if (dumping) + { + FILE* D= (output==NULL) ? stdout : fopen(output,"wb"); + if (D==NULL) cannot("open"); + lua_lock(L); + luaU_dump(L,f,writer,D,stripping); + lua_unlock(L); + if (ferror(D)) cannot("write"); + if (fclose(D)) cannot("close"); + } + return 0; +} + +int main(int argc, char* argv[]) +{ + lua_State* L; + struct Smain s; + int i=doargs(argc,argv); + argc-=i; argv+=i; + if (argc<=0) usage("no input files given"); + L=lua_open(); + if (L==NULL) fatal("not enough memory for state"); + s.argc=argc; + s.argv=argv; + if (lua_cpcall(L,pmain,&s)!=0) fatal(lua_tostring(L,-1)); + lua_close(L); + return EXIT_SUCCESS; +} diff --git a/user/lua-5.1.4/src/luac.o b/user/lua-5.1.4/src/luac.o new file mode 100644 index 0000000000000000000000000000000000000000..b7f46b365aa2d75977a3bd05108a5cd70e849b9b GIT binary patch literal 5560 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 vENSRHMH-9!c_QYY;yC1fLwbV{Z~tq@Vu=(*6T8 literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/luaconf.h b/user/lua-5.1.4/src/luaconf.h new file mode 100644 index 0000000..e2cb261 --- /dev/null +++ b/user/lua-5.1.4/src/luaconf.h @@ -0,0 +1,763 @@ +/* +** $Id: luaconf.h,v 1.82.1.7 2008/02/11 16:25:08 roberto Exp $ +** Configuration file for Lua +** See Copyright Notice in lua.h +*/ + + +#ifndef lconfig_h +#define lconfig_h + +#include +#include + + +/* +** ================================================================== +** Search for "@@" to find all configurable definitions. +** =================================================================== +*/ + + +/* +@@ LUA_ANSI controls the use of non-ansi features. +** CHANGE it (define it) if you want Lua to avoid the use of any +** non-ansi feature or library. +*/ +#if defined(__STRICT_ANSI__) +#define LUA_ANSI +#endif + + +#if !defined(LUA_ANSI) && defined(_WIN32) +#define LUA_WIN +#endif + +#if defined(LUA_USE_LINUX) +#define LUA_USE_POSIX +#define LUA_USE_DLOPEN /* needs an extra library: -ldl */ +#define LUA_USE_READLINE /* needs some extra libraries */ +#endif + +#if defined(LUA_USE_MACOSX) +#define LUA_USE_POSIX +#define LUA_DL_DYLD /* does not need extra library */ +#endif + + + +/* +@@ LUA_USE_POSIX includes all functionallity listed as X/Open System +@* Interfaces Extension (XSI). +** CHANGE it (define it) if your system is XSI compatible. +*/ +#if defined(LUA_USE_POSIX) +#define LUA_USE_MKSTEMP +#define LUA_USE_ISATTY +#define LUA_USE_POPEN +#define LUA_USE_ULONGJMP +#endif + + +/* +@@ LUA_PATH and LUA_CPATH are the names of the environment variables that +@* Lua check to set its paths. +@@ LUA_INIT is the name of the environment variable that Lua +@* checks for initialization code. +** CHANGE them if you want different names. +*/ +#define LUA_PATH "LUA_PATH" +#define LUA_CPATH "LUA_CPATH" +#define LUA_INIT "LUA_INIT" + + +/* +@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for +@* Lua libraries. +@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for +@* C libraries. +** CHANGE them if your machine has a non-conventional directory +** hierarchy or if you want to install your libraries in +** non-conventional directories. +*/ +#if defined(_WIN32) +/* +** In Windows, any exclamation mark ('!') in the path is replaced by the +** path of the directory of the executable file of the current process. +*/ +#define LUA_LDIR "!\\lua\\" +#define LUA_CDIR "!\\" +#define LUA_PATH_DEFAULT \ + ".\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua" +#define LUA_CPATH_DEFAULT \ + ".\\?.dll;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll" + +#else +#define LUA_ROOT "/usr/local/" +#define LUA_LDIR LUA_ROOT "share/lua/5.1/" +#define LUA_CDIR LUA_ROOT "lib/lua/5.1/" +#define LUA_PATH_DEFAULT \ + "./?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua" +#define LUA_CPATH_DEFAULT \ + "./?.so;" LUA_CDIR"?.so;" LUA_CDIR"loadall.so" +#endif + + +/* +@@ LUA_DIRSEP is the directory separator (for submodules). +** CHANGE it if your machine does not use "/" as the directory separator +** and is not Windows. (On Windows Lua automatically uses "\".) +*/ +#if defined(_WIN32) +#define LUA_DIRSEP "\\" +#else +#define LUA_DIRSEP "/" +#endif + + +/* +@@ LUA_PATHSEP is the character that separates templates in a path. +@@ LUA_PATH_MARK is the string that marks the substitution points in a +@* template. +@@ LUA_EXECDIR in a Windows path is replaced by the executable's +@* directory. +@@ LUA_IGMARK is a mark to ignore all before it when bulding the +@* luaopen_ function name. +** CHANGE them if for some reason your system cannot use those +** characters. (E.g., if one of those characters is a common character +** in file/directory names.) Probably you do not need to change them. +*/ +#define LUA_PATHSEP ";" +#define LUA_PATH_MARK "?" +#define LUA_EXECDIR "!" +#define LUA_IGMARK "-" + + +/* +@@ LUA_INTEGER is the integral type used by lua_pushinteger/lua_tointeger. +** CHANGE that if ptrdiff_t is not adequate on your machine. (On most +** machines, ptrdiff_t gives a good choice between int or long.) +*/ +#define LUA_INTEGER ptrdiff_t + + +/* +@@ LUA_API is a mark for all core API functions. +@@ LUALIB_API is a mark for all standard library functions. +** CHANGE them if you need to define those functions in some special way. +** For instance, if you want to create one Windows DLL with the core and +** the libraries, you may want to use the following definition (define +** LUA_BUILD_AS_DLL to get it). +*/ +#if defined(LUA_BUILD_AS_DLL) + +#if defined(LUA_CORE) || defined(LUA_LIB) +#define LUA_API __declspec(dllexport) +#else +#define LUA_API __declspec(dllimport) +#endif + +#else + +#define LUA_API extern + +#endif + +/* more often than not the libs go together with the core */ +#define LUALIB_API LUA_API + + +/* +@@ LUAI_FUNC is a mark for all extern functions that are not to be +@* exported to outside modules. +@@ LUAI_DATA is a mark for all extern (const) variables that are not to +@* be exported to outside modules. +** CHANGE them if you need to mark them in some special way. Elf/gcc +** (versions 3.2 and later) mark them as "hidden" to optimize access +** when Lua is compiled as a shared library. +*/ +#if defined(luaall_c) +#define LUAI_FUNC static +#define LUAI_DATA /* empty */ + +#elif defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \ + defined(__ELF__) +#define LUAI_FUNC __attribute__((visibility("hidden"))) extern +#define LUAI_DATA LUAI_FUNC + +#else +#define LUAI_FUNC extern +#define LUAI_DATA extern +#endif + + + +/* +@@ LUA_QL describes how error messages quote program elements. +** CHANGE it if you want a different appearance. +*/ +#define LUA_QL(x) "'" x "'" +#define LUA_QS LUA_QL("%s") + + +/* +@@ LUA_IDSIZE gives the maximum size for the description of the source +@* of a function in debug information. +** CHANGE it if you want a different size. +*/ +#define LUA_IDSIZE 60 + + +/* +** {================================================================== +** Stand-alone configuration +** =================================================================== +*/ + +#if defined(lua_c) || defined(luaall_c) + +/* +@@ lua_stdin_is_tty detects whether the standard input is a 'tty' (that +@* is, whether we're running lua interactively). +** CHANGE it if you have a better definition for non-POSIX/non-Windows +** systems. +*/ +#if defined(LUA_USE_ISATTY) +#include +#define lua_stdin_is_tty() isatty(0) +#elif defined(LUA_WIN) +#include +#include +#define lua_stdin_is_tty() _isatty(_fileno(stdin)) +#else +#define lua_stdin_is_tty() 1 /* assume stdin is a tty */ +#endif + + +/* +@@ LUA_PROMPT is the default prompt used by stand-alone Lua. +@@ LUA_PROMPT2 is the default continuation prompt used by stand-alone Lua. +** CHANGE them if you want different prompts. (You can also change the +** prompts dynamically, assigning to globals _PROMPT/_PROMPT2.) +*/ +#define LUA_PROMPT "> " +#define LUA_PROMPT2 ">> " + + +/* +@@ LUA_PROGNAME is the default name for the stand-alone Lua program. +** CHANGE it if your stand-alone interpreter has a different name and +** your system is not able to detect that name automatically. +*/ +#define LUA_PROGNAME "lua" + + +/* +@@ LUA_MAXINPUT is the maximum length for an input line in the +@* stand-alone interpreter. +** CHANGE it if you need longer lines. +*/ +#define LUA_MAXINPUT 512 + + +/* +@@ lua_readline defines how to show a prompt and then read a line from +@* the standard input. +@@ lua_saveline defines how to "save" a read line in a "history". +@@ lua_freeline defines how to free a line read by lua_readline. +** CHANGE them if you want to improve this functionality (e.g., by using +** GNU readline and history facilities). +*/ +#if defined(LUA_USE_READLINE) +#include +#include +#include +#define lua_readline(L,b,p) ((void)L, ((b)=readline(p)) != NULL) +#define lua_saveline(L,idx) \ + if (lua_strlen(L,idx) > 0) /* non-empty line? */ \ + add_history(lua_tostring(L, idx)); /* add it to history */ +#define lua_freeline(L,b) ((void)L, free(b)) +#else +#define lua_readline(L,b,p) \ + ((void)L, fputs(p, stdout), fflush(stdout), /* show prompt */ \ + fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */ +#define lua_saveline(L,idx) { (void)L; (void)idx; } +#define lua_freeline(L,b) { (void)L; (void)b; } +#endif + +#endif + +/* }================================================================== */ + + +/* +@@ LUAI_GCPAUSE defines the default pause between garbage-collector cycles +@* as a percentage. +** CHANGE it if you want the GC to run faster or slower (higher values +** mean larger pauses which mean slower collection.) You can also change +** this value dynamically. +*/ +#define LUAI_GCPAUSE 200 /* 200% (wait memory to double before next GC) */ + + +/* +@@ LUAI_GCMUL defines the default speed of garbage collection relative to +@* memory allocation as a percentage. +** CHANGE it if you want to change the granularity of the garbage +** collection. (Higher values mean coarser collections. 0 represents +** infinity, where each step performs a full collection.) You can also +** change this value dynamically. +*/ +#define LUAI_GCMUL 200 /* GC runs 'twice the speed' of memory allocation */ + + + +/* +@@ LUA_COMPAT_GETN controls compatibility with old getn behavior. +** CHANGE it (define it) if you want exact compatibility with the +** behavior of setn/getn in Lua 5.0. +*/ +#undef LUA_COMPAT_GETN + +/* +@@ LUA_COMPAT_LOADLIB controls compatibility about global loadlib. +** CHANGE it to undefined as soon as you do not need a global 'loadlib' +** function (the function is still available as 'package.loadlib'). +*/ +#undef LUA_COMPAT_LOADLIB + +/* +@@ LUA_COMPAT_VARARG controls compatibility with old vararg feature. +** CHANGE it to undefined as soon as your programs use only '...' to +** access vararg parameters (instead of the old 'arg' table). +*/ +#define LUA_COMPAT_VARARG + +/* +@@ LUA_COMPAT_MOD controls compatibility with old math.mod function. +** CHANGE it to undefined as soon as your programs use 'math.fmod' or +** the new '%' operator instead of 'math.mod'. +*/ +#define LUA_COMPAT_MOD + +/* +@@ LUA_COMPAT_LSTR controls compatibility with old long string nesting +@* facility. +** CHANGE it to 2 if you want the old behaviour, or undefine it to turn +** off the advisory error when nesting [[...]]. +*/ +#define LUA_COMPAT_LSTR 1 + +/* +@@ LUA_COMPAT_GFIND controls compatibility with old 'string.gfind' name. +** CHANGE it to undefined as soon as you rename 'string.gfind' to +** 'string.gmatch'. +*/ +#define LUA_COMPAT_GFIND + +/* +@@ LUA_COMPAT_OPENLIB controls compatibility with old 'luaL_openlib' +@* behavior. +** CHANGE it to undefined as soon as you replace to 'luaL_register' +** your uses of 'luaL_openlib' +*/ +#define LUA_COMPAT_OPENLIB + + + +/* +@@ luai_apicheck is the assert macro used by the Lua-C API. +** CHANGE luai_apicheck if you want Lua to perform some checks in the +** parameters it gets from API calls. This may slow down the interpreter +** a bit, but may be quite useful when debugging C code that interfaces +** with Lua. A useful redefinition is to use assert.h. +*/ +#if defined(LUA_USE_APICHECK) +#include +#define luai_apicheck(L,o) { (void)L; assert(o); } +#else +#define luai_apicheck(L,o) { (void)L; } +#endif + + +/* +@@ LUAI_BITSINT defines the number of bits in an int. +** CHANGE here if Lua cannot automatically detect the number of bits of +** your machine. Probably you do not need to change this. +*/ +/* avoid overflows in comparison */ +#if INT_MAX-20 < 32760 +#define LUAI_BITSINT 16 +#elif INT_MAX > 2147483640L +/* int has at least 32 bits */ +#define LUAI_BITSINT 32 +#else +#error "you must define LUA_BITSINT with number of bits in an integer" +#endif + + +/* +@@ LUAI_UINT32 is an unsigned integer with at least 32 bits. +@@ LUAI_INT32 is an signed integer with at least 32 bits. +@@ LUAI_UMEM is an unsigned integer big enough to count the total +@* memory used by Lua. +@@ LUAI_MEM is a signed integer big enough to count the total memory +@* used by Lua. +** CHANGE here if for some weird reason the default definitions are not +** good enough for your machine. (The definitions in the 'else' +** part always works, but may waste space on machines with 64-bit +** longs.) Probably you do not need to change this. +*/ +#if LUAI_BITSINT >= 32 +#define LUAI_UINT32 unsigned int +#define LUAI_INT32 int +#define LUAI_MAXINT32 INT_MAX +#define LUAI_UMEM size_t +#define LUAI_MEM ptrdiff_t +#else +/* 16-bit ints */ +#define LUAI_UINT32 unsigned long +#define LUAI_INT32 long +#define LUAI_MAXINT32 LONG_MAX +#define LUAI_UMEM unsigned long +#define LUAI_MEM long +#endif + + +/* +@@ LUAI_MAXCALLS limits the number of nested calls. +** CHANGE it if you need really deep recursive calls. This limit is +** arbitrary; its only purpose is to stop infinite recursion before +** exhausting memory. +*/ +#define LUAI_MAXCALLS 20000 + + +/* +@@ LUAI_MAXCSTACK limits the number of Lua stack slots that a C function +@* can use. +** CHANGE it if you need lots of (Lua) stack space for your C +** functions. This limit is arbitrary; its only purpose is to stop C +** functions to consume unlimited stack space. (must be smaller than +** -LUA_REGISTRYINDEX) +*/ +#define LUAI_MAXCSTACK 8000 + + + +/* +** {================================================================== +** CHANGE (to smaller values) the following definitions if your system +** has a small C stack. (Or you may want to change them to larger +** values if your system has a large C stack and these limits are +** too rigid for you.) Some of these constants control the size of +** stack-allocated arrays used by the compiler or the interpreter, while +** others limit the maximum number of recursive calls that the compiler +** or the interpreter can perform. Values too large may cause a C stack +** overflow for some forms of deep constructs. +** =================================================================== +*/ + + +/* +@@ LUAI_MAXCCALLS is the maximum depth for nested C calls (short) and +@* syntactical nested non-terminals in a program. +*/ +#define LUAI_MAXCCALLS 200 + + +/* +@@ LUAI_MAXVARS is the maximum number of local variables per function +@* (must be smaller than 250). +*/ +#define LUAI_MAXVARS 200 + + +/* +@@ LUAI_MAXUPVALUES is the maximum number of upvalues per function +@* (must be smaller than 250). +*/ +#define LUAI_MAXUPVALUES 60 + + +/* +@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system. +*/ +#define LUAL_BUFFERSIZE BUFSIZ + +/* }================================================================== */ + + + + +/* +** {================================================================== +@@ LUA_NUMBER is the type of numbers in Lua. +** CHANGE the following definitions only if you want to build Lua +** with a number type different from double. You may also need to +** change lua_number2int & lua_number2integer. +** =================================================================== +*/ + +#define LUA_NUMBER_DOUBLE +#define LUA_NUMBER double + +/* +@@ LUAI_UACNUMBER is the result of an 'usual argument conversion' +@* over a number. +*/ +#define LUAI_UACNUMBER double + + +/* +@@ LUA_NUMBER_SCAN is the format for reading numbers. +@@ LUA_NUMBER_FMT is the format for writing numbers. +@@ lua_number2str converts a number to a string. +@@ LUAI_MAXNUMBER2STR is maximum size of previous conversion. +@@ lua_str2number converts a string to a number. +*/ +#define LUA_NUMBER_SCAN "%lf" +#define LUA_NUMBER_FMT "%.14g" +#define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n)) +#define LUAI_MAXNUMBER2STR 32 /* 16 digits, sign, point, and \0 */ +#define lua_str2number(s,p) strtod((s), (p)) + + +/* +@@ The luai_num* macros define the primitive operations over numbers. +*/ +#if defined(LUA_CORE) +#include +#define luai_numadd(a,b) ((a)+(b)) +#define luai_numsub(a,b) ((a)-(b)) +#define luai_nummul(a,b) ((a)*(b)) +#define luai_numdiv(a,b) ((a)/(b)) +#define luai_nummod(a,b) ((a) - floor((a)/(b))*(b)) +#define luai_numpow(a,b) (pow(a,b)) +#define luai_numunm(a) (-(a)) +#define luai_numeq(a,b) ((a)==(b)) +#define luai_numlt(a,b) ((a)<(b)) +#define luai_numle(a,b) ((a)<=(b)) +#define luai_numisnan(a) (!luai_numeq((a), (a))) +#endif + + +/* +@@ lua_number2int is a macro to convert lua_Number to int. +@@ lua_number2integer is a macro to convert lua_Number to lua_Integer. +** CHANGE them if you know a faster way to convert a lua_Number to +** int (with any rounding method and without throwing errors) in your +** system. In Pentium machines, a naive typecast from double to int +** in C is extremely slow, so any alternative is worth trying. +*/ + +/* On a Pentium, resort to a trick */ +#if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) && !defined(__SSE2__) && \ + (defined(__i386) || defined (_M_IX86) || defined(__i386__)) + +/* On a Microsoft compiler, use assembler */ +#if defined(_MSC_VER) + +#define lua_number2int(i,d) __asm fld d __asm fistp i +#define lua_number2integer(i,n) lua_number2int(i, n) + +/* the next trick should work on any Pentium, but sometimes clashes + with a DirectX idiosyncrasy */ +#else + +union luai_Cast { double l_d; long l_l; }; +#define lua_number2int(i,d) \ + { volatile union luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; } +#define lua_number2integer(i,n) lua_number2int(i, n) + +#endif + + +/* this option always works, but may be slow */ +#else +#define lua_number2int(i,d) ((i)=(int)(d)) +#define lua_number2integer(i,d) ((i)=(lua_Integer)(d)) + +#endif + +/* }================================================================== */ + + +/* +@@ LUAI_USER_ALIGNMENT_T is a type that requires maximum alignment. +** CHANGE it if your system requires alignments larger than double. (For +** instance, if your system supports long doubles and they must be +** aligned in 16-byte boundaries, then you should add long double in the +** union.) Probably you do not need to change this. +*/ +#define LUAI_USER_ALIGNMENT_T union { double u; void *s; long l; } + + +/* +@@ LUAI_THROW/LUAI_TRY define how Lua does exception handling. +** CHANGE them if you prefer to use longjmp/setjmp even with C++ +** or if want/don't to use _longjmp/_setjmp instead of regular +** longjmp/setjmp. By default, Lua handles errors with exceptions when +** compiling as C++ code, with _longjmp/_setjmp when asked to use them, +** and with longjmp/setjmp otherwise. +*/ +#if defined(__cplusplus) +/* C++ exceptions */ +#define LUAI_THROW(L,c) throw(c) +#define LUAI_TRY(L,c,a) try { a } catch(...) \ + { if ((c)->status == 0) (c)->status = -1; } +#define luai_jmpbuf int /* dummy variable */ + +#elif defined(LUA_USE_ULONGJMP) +/* in Unix, try _longjmp/_setjmp (more efficient) */ +#define LUAI_THROW(L,c) _longjmp((c)->b, 1) +#define LUAI_TRY(L,c,a) if (_setjmp((c)->b) == 0) { a } +#define luai_jmpbuf jmp_buf + +#else +/* default handling with long jumps */ +#define LUAI_THROW(L,c) longjmp((c)->b, 1) +#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } +#define luai_jmpbuf jmp_buf + +#endif + + +/* +@@ LUA_MAXCAPTURES is the maximum number of captures that a pattern +@* can do during pattern-matching. +** CHANGE it if you need more captures. This limit is arbitrary. +*/ +#define LUA_MAXCAPTURES 32 + + +/* +@@ lua_tmpnam is the function that the OS library uses to create a +@* temporary name. +@@ LUA_TMPNAMBUFSIZE is the maximum size of a name created by lua_tmpnam. +** CHANGE them if you have an alternative to tmpnam (which is considered +** insecure) or if you want the original tmpnam anyway. By default, Lua +** uses tmpnam except when POSIX is available, where it uses mkstemp. +*/ +#if defined(loslib_c) || defined(luaall_c) + +#if defined(LUA_USE_MKSTEMP) +#include +#define LUA_TMPNAMBUFSIZE 32 +#define lua_tmpnam(b,e) { \ + strcpy(b, "/tmp/lua_XXXXXX"); \ + e = mkstemp(b); \ + if (e != -1) close(e); \ + e = (e == -1); } + +#else +#define LUA_TMPNAMBUFSIZE L_tmpnam +#define lua_tmpnam(b,e) { e = (tmpnam(b) == NULL); } +#endif + +#endif + + +/* +@@ lua_popen spawns a new process connected to the current one through +@* the file streams. +** CHANGE it if you have a way to implement it in your system. +*/ +#if defined(LUA_USE_POPEN) + +#define lua_popen(L,c,m) ((void)L, fflush(NULL), popen(c,m)) +#define lua_pclose(L,file) ((void)L, (pclose(file) != -1)) + +#elif defined(LUA_WIN) + +#define lua_popen(L,c,m) ((void)L, _popen(c,m)) +#define lua_pclose(L,file) ((void)L, (_pclose(file) != -1)) + +#else + +#define lua_popen(L,c,m) ((void)((void)c, m), \ + luaL_error(L, LUA_QL("popen") " not supported"), (FILE*)0) +#define lua_pclose(L,file) ((void)((void)L, file), 0) + +#endif + +/* +@@ LUA_DL_* define which dynamic-library system Lua should use. +** CHANGE here if Lua has problems choosing the appropriate +** dynamic-library system for your platform (either Windows' DLL, Mac's +** dyld, or Unix's dlopen). If your system is some kind of Unix, there +** is a good chance that it has dlopen, so LUA_DL_DLOPEN will work for +** it. To use dlopen you also need to adapt the src/Makefile (probably +** adding -ldl to the linker options), so Lua does not select it +** automatically. (When you change the makefile to add -ldl, you must +** also add -DLUA_USE_DLOPEN.) +** If you do not want any kind of dynamic library, undefine all these +** options. +** By default, _WIN32 gets LUA_DL_DLL and MAC OS X gets LUA_DL_DYLD. +*/ +#if defined(LUA_USE_DLOPEN) +#define LUA_DL_DLOPEN +#endif + +#if defined(LUA_WIN) +#define LUA_DL_DLL +#endif + + +/* +@@ LUAI_EXTRASPACE allows you to add user-specific data in a lua_State +@* (the data goes just *before* the lua_State pointer). +** CHANGE (define) this if you really need that. This value must be +** a multiple of the maximum alignment required for your machine. +*/ +#define LUAI_EXTRASPACE 0 + + +/* +@@ luai_userstate* allow user-specific actions on threads. +** CHANGE them if you defined LUAI_EXTRASPACE and need to do something +** extra when a thread is created/deleted/resumed/yielded. +*/ +#define luai_userstateopen(L) ((void)L) +#define luai_userstateclose(L) ((void)L) +#define luai_userstatethread(L,L1) ((void)L) +#define luai_userstatefree(L) ((void)L) +#define luai_userstateresume(L,n) ((void)L) +#define luai_userstateyield(L,n) ((void)L) + + +/* +@@ LUA_INTFRMLEN is the length modifier for integer conversions +@* in 'string.format'. +@@ LUA_INTFRM_T is the integer type correspoding to the previous length +@* modifier. +** CHANGE them if your system supports long long or does not support long. +*/ + +#if defined(LUA_USELONGLONG) + +#define LUA_INTFRMLEN "ll" +#define LUA_INTFRM_T long long + +#else + +#define LUA_INTFRMLEN "l" +#define LUA_INTFRM_T long + +#endif + + + +/* =================================================================== */ + +/* +** Local configuration. You can use this space to add your redefinitions +** without modifying the main part of the file. +*/ + + + +#endif + diff --git a/user/lua-5.1.4/src/lualib.h b/user/lua-5.1.4/src/lualib.h new file mode 100644 index 0000000..469417f --- /dev/null +++ b/user/lua-5.1.4/src/lualib.h @@ -0,0 +1,53 @@ +/* +** $Id: lualib.h,v 1.36.1.1 2007/12/27 13:02:25 roberto Exp $ +** Lua standard libraries +** See Copyright Notice in lua.h +*/ + + +#ifndef lualib_h +#define lualib_h + +#include "lua.h" + + +/* Key to file-handle type */ +#define LUA_FILEHANDLE "FILE*" + + +#define LUA_COLIBNAME "coroutine" +LUALIB_API int (luaopen_base) (lua_State *L); + +#define LUA_TABLIBNAME "table" +LUALIB_API int (luaopen_table) (lua_State *L); + +#define LUA_IOLIBNAME "io" +LUALIB_API int (luaopen_io) (lua_State *L); + +#define LUA_OSLIBNAME "os" +LUALIB_API int (luaopen_os) (lua_State *L); + +#define LUA_STRLIBNAME "string" +LUALIB_API int (luaopen_string) (lua_State *L); + +#define LUA_MATHLIBNAME "math" +LUALIB_API int (luaopen_math) (lua_State *L); + +#define LUA_DBLIBNAME "debug" +LUALIB_API int (luaopen_debug) (lua_State *L); + +#define LUA_LOADLIBNAME "package" +LUALIB_API int (luaopen_package) (lua_State *L); + + +/* open all previous libraries */ +LUALIB_API void (luaL_openlibs) (lua_State *L); + + + +#ifndef lua_assert +#define lua_assert(x) ((void)0) +#endif + + +#endif diff --git a/user/lua-5.1.4/src/lundump.c b/user/lua-5.1.4/src/lundump.c new file mode 100644 index 0000000..8010a45 --- /dev/null +++ b/user/lua-5.1.4/src/lundump.c @@ -0,0 +1,227 @@ +/* +** $Id: lundump.c,v 2.7.1.4 2008/04/04 19:51:41 roberto Exp $ +** load precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#include + +#define lundump_c +#define LUA_CORE + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstring.h" +#include "lundump.h" +#include "lzio.h" + +typedef struct { + lua_State* L; + ZIO* Z; + Mbuffer* b; + const char* name; +} LoadState; + +#ifdef LUAC_TRUST_BINARIES +#define IF(c,s) +#define error(S,s) +#else +#define IF(c,s) if (c) error(S,s) + +static void error(LoadState* S, const char* why) +{ + luaO_pushfstring(S->L,"%s: %s in precompiled chunk",S->name,why); + luaD_throw(S->L,LUA_ERRSYNTAX); +} +#endif + +#define LoadMem(S,b,n,size) LoadBlock(S,b,(n)*(size)) +#define LoadByte(S) (lu_byte)LoadChar(S) +#define LoadVar(S,x) LoadMem(S,&x,1,sizeof(x)) +#define LoadVector(S,b,n,size) LoadMem(S,b,n,size) + +static void LoadBlock(LoadState* S, void* b, size_t size) +{ + size_t r=luaZ_read(S->Z,b,size); + IF (r!=0, "unexpected end"); +} + +static int LoadChar(LoadState* S) +{ + char x; + LoadVar(S,x); + return x; +} + +static int LoadInt(LoadState* S) +{ + int x; + LoadVar(S,x); + IF (x<0, "bad integer"); + return x; +} + +static lua_Number LoadNumber(LoadState* S) +{ + lua_Number x; + LoadVar(S,x); + return x; +} + +static TString* LoadString(LoadState* S) +{ + size_t size; + LoadVar(S,size); + if (size==0) + return NULL; + else + { + char* s=luaZ_openspace(S->L,S->b,size); + LoadBlock(S,s,size); + return luaS_newlstr(S->L,s,size-1); /* remove trailing '\0' */ + } +} + +static void LoadCode(LoadState* S, Proto* f) +{ + int n=LoadInt(S); + f->code=luaM_newvector(S->L,n,Instruction); + f->sizecode=n; + LoadVector(S,f->code,n,sizeof(Instruction)); +} + +static Proto* LoadFunction(LoadState* S, TString* p); + +static void LoadConstants(LoadState* S, Proto* f) +{ + int i,n; + n=LoadInt(S); + f->k=luaM_newvector(S->L,n,TValue); + f->sizek=n; + for (i=0; ik[i]); + for (i=0; ik[i]; + int t=LoadChar(S); + switch (t) + { + case LUA_TNIL: + setnilvalue(o); + break; + case LUA_TBOOLEAN: + setbvalue(o,LoadChar(S)!=0); + break; + case LUA_TNUMBER: + setnvalue(o,LoadNumber(S)); + break; + case LUA_TSTRING: + setsvalue2n(S->L,o,LoadString(S)); + break; + default: + error(S,"bad constant"); + break; + } + } + n=LoadInt(S); + f->p=luaM_newvector(S->L,n,Proto*); + f->sizep=n; + for (i=0; ip[i]=NULL; + for (i=0; ip[i]=LoadFunction(S,f->source); +} + +static void LoadDebug(LoadState* S, Proto* f) +{ + int i,n; + n=LoadInt(S); + f->lineinfo=luaM_newvector(S->L,n,int); + f->sizelineinfo=n; + LoadVector(S,f->lineinfo,n,sizeof(int)); + n=LoadInt(S); + f->locvars=luaM_newvector(S->L,n,LocVar); + f->sizelocvars=n; + for (i=0; ilocvars[i].varname=NULL; + for (i=0; ilocvars[i].varname=LoadString(S); + f->locvars[i].startpc=LoadInt(S); + f->locvars[i].endpc=LoadInt(S); + } + n=LoadInt(S); + f->upvalues=luaM_newvector(S->L,n,TString*); + f->sizeupvalues=n; + for (i=0; iupvalues[i]=NULL; + for (i=0; iupvalues[i]=LoadString(S); +} + +static Proto* LoadFunction(LoadState* S, TString* p) +{ + Proto* f; + if (++S->L->nCcalls > LUAI_MAXCCALLS) error(S,"code too deep"); + f=luaF_newproto(S->L); + setptvalue2s(S->L,S->L->top,f); incr_top(S->L); + f->source=LoadString(S); if (f->source==NULL) f->source=p; + f->linedefined=LoadInt(S); + f->lastlinedefined=LoadInt(S); + f->nups=LoadByte(S); + f->numparams=LoadByte(S); + f->is_vararg=LoadByte(S); + f->maxstacksize=LoadByte(S); + LoadCode(S,f); + LoadConstants(S,f); + LoadDebug(S,f); + IF (!luaG_checkcode(f), "bad code"); + S->L->top--; + S->L->nCcalls--; + return f; +} + +static void LoadHeader(LoadState* S) +{ + char h[LUAC_HEADERSIZE]; + char s[LUAC_HEADERSIZE]; + luaU_header(h); + LoadBlock(S,s,LUAC_HEADERSIZE); + IF (memcmp(h,s,LUAC_HEADERSIZE)!=0, "bad header"); +} + +/* +** load precompiled chunk +*/ +Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name) +{ + LoadState S; + if (*name=='@' || *name=='=') + S.name=name+1; + else if (*name==LUA_SIGNATURE[0]) + S.name="binary string"; + else + S.name=name; + S.L=L; + S.Z=Z; + S.b=buff; + LoadHeader(&S); + return LoadFunction(&S,luaS_newliteral(L,"=?")); +} + +/* +* make header +*/ +void luaU_header (char* h) +{ + int x=1; + memcpy(h,LUA_SIGNATURE,sizeof(LUA_SIGNATURE)-1); + h+=sizeof(LUA_SIGNATURE)-1; + *h++=(char)LUAC_VERSION; + *h++=(char)LUAC_FORMAT; + *h++=(char)*(char*)&x; /* endianness */ + *h++=(char)sizeof(int); + *h++=(char)sizeof(size_t); + *h++=(char)sizeof(Instruction); + *h++=(char)sizeof(lua_Number); + *h++=(char)(((lua_Number)0.5)==0); /* is lua_Number integral? */ +} diff --git a/user/lua-5.1.4/src/lundump.h b/user/lua-5.1.4/src/lundump.h new file mode 100644 index 0000000..c80189d --- /dev/null +++ b/user/lua-5.1.4/src/lundump.h @@ -0,0 +1,36 @@ +/* +** $Id: lundump.h,v 1.37.1.1 2007/12/27 13:02:25 roberto Exp $ +** load precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#ifndef lundump_h +#define lundump_h + +#include "lobject.h" +#include "lzio.h" + +/* load one chunk; from lundump.c */ +LUAI_FUNC Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name); + +/* make header; from lundump.c */ +LUAI_FUNC void luaU_header (char* h); + +/* dump one chunk; from ldump.c */ +LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip); + +#ifdef luac_c +/* print one chunk; from print.c */ +LUAI_FUNC void luaU_print (const Proto* f, int full); +#endif + +/* for header of binary files -- this is Lua 5.1 */ +#define LUAC_VERSION 0x51 + +/* for header of binary files -- this is the official format */ +#define LUAC_FORMAT 0 + +/* size of header of binary files */ +#define LUAC_HEADERSIZE 12 + +#endif diff --git a/user/lua-5.1.4/src/lundump.o b/user/lua-5.1.4/src/lundump.o new file mode 100644 index 0000000000000000000000000000000000000000..9171684af0fdbfb51ffb84ee67983de5168c4e91 GIT binary patch literal 3652 zcmb7GeQXK`J`wOrkAl`J<$P@O$oq zxNarjr1S56zTWrwdLQ3Nv~$11;b8XTU@o>!fqTCx2^rABHZj3gHBjX5tBZ|VRH#H( z$*#h-cPhzp*!|6NcmwlZ5Le6L``qQQfcJj)xvqwCc%x7bZ(>&_iUs*W2K#P4p)NM@ zr~Mu+?5TA4-Lx_9@C%xYyZ!p=+S;1tBEF0G7Dt_IIuf7gEw0;l`UULa*1~REXSAdU zwjPjQKQh*gE#eE`FFeNzmmZ>X#EW#C?L2vWxU#BCq$Vy0OQW;$qgsSK6A+TSCZyOhFY|GJU2iqFW;d= z#T{UW}G_#OFP;jkZ|QZ~SX*jYrzB zx`x$7s%}A?=aDctqu_Xd8=beg=OPEe&ECa*0^D!i#r-pSr?mJL&@BX$?F!WtUmQa-2sze2G8*1%2V4*l9`k(}vL*wd80Q zMRBY5>|fD6nmALxQ^9@c^1KsC_h3)E+r$|j5k_ZucZ>J@>vUXfCOBKTKqn*FNT#tW zd0MBH4}+!P8dv5}%lOrWFBZM$KaGRhT;4N(a{}GoGt)pVIyV-Dk-iz;sbz;+@w6&4 zr(;_5D!*;#&~;dVp1unz-V4$BHiz;iXj`gp0Y6xJ@zgx4Lq_N^I8gY+1jJU7x zzi?%S|K7}t_N=cE`iUW*aA?sP*YQTZ3x2f5=Xk@&4Go&N;aUN=xwg(*;o1LL=O(K2 z!@7%hTGHDH%vjAjzlGFj;#_^K_pUR--A3Vl^>hZo24{PVR9}jMsYZF1f@{GmG^e!g zZ8$eJ{NXMIo`H0GaCibAt-kJO68b+lQ3634cln&YmK zoBSgxOS3s*F)Te}hY&bi>sx`#4QjvO=~eqf4t25lD-p18stZ>%A3aqz$fmXZXszHgSaq^JeNt| zsvRFEjT_{ucvIT5mE2Hvp=?Ic48Pm9%jm|bV)X@#1pIGRqEknpRjdwzHauW#$M7S* z9mBqXj4zj$QrV&0z@U`&rTUf3F{Wgs6FDg*gCS+otS6a`*UWQ#~ktY;vT%%AiP%lUy!pTX{zl4%&XKhD^JNaPV;i`b)NWW^T>gaUhZ zhZKX_yVIl@3k;tel9N3^Id5XWy~<020a-dBvp_m2Ct09pc$fw9St3X~7znZeq8XCl zP#}|)rNDuw#NBW(bqpE!AD_=akD8^y(hmct@3RO%qqW=)v_6>(PRC{d42ehfbZMyb zcUUxC5_&wwbuicTYy8at>7#>0|4r{<=+ORO!b=bBcidbWza*m<={At`=~1EQHkZ7&IbrwK*j^RVN>+qhF|_ zc^&<79sTn<`t3TpR7d}jXoN8hAb;PjmD74q$)uH`Tp-1yd_J3Jo!Ml1-(VJZj#f|L zE)sT|1A&(Nl}t(=$Yx-f6cg5X!1^1BoHE?sibNXL`PA_Ax5TdEyu;dFC?nOH|(NISSw=ni2 z!jCgHg1R~}yJsxig*K&quK +#include +#include + +#define lvm_c +#define LUA_CORE + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lvm.h" + + + +/* limit for table tag-method chains (to avoid loops) */ +#define MAXTAGLOOP 100 + + +const TValue *luaV_tonumber (const TValue *obj, TValue *n) { + lua_Number num; + if (ttisnumber(obj)) return obj; + if (ttisstring(obj) && luaO_str2d(svalue(obj), &num)) { + setnvalue(n, num); + return n; + } + else + return NULL; +} + + +int luaV_tostring (lua_State *L, StkId obj) { + if (!ttisnumber(obj)) + return 0; + else { + char s[LUAI_MAXNUMBER2STR]; + lua_Number n = nvalue(obj); + lua_number2str(s, n); + setsvalue2s(L, obj, luaS_new(L, s)); + return 1; + } +} + + +static void traceexec (lua_State *L, const Instruction *pc) { + lu_byte mask = L->hookmask; + const Instruction *oldpc = L->savedpc; + L->savedpc = pc; + if ((mask & LUA_MASKCOUNT) && L->hookcount == 0) { + resethookcount(L); + luaD_callhook(L, LUA_HOOKCOUNT, -1); + } + if (mask & LUA_MASKLINE) { + Proto *p = ci_func(L->ci)->l.p; + int npc = pcRel(pc, p); + int newline = getline(p, npc); + /* call linehook when enter a new function, when jump back (loop), + or when enter a new line */ + if (npc == 0 || pc <= oldpc || newline != getline(p, pcRel(oldpc, p))) + luaD_callhook(L, LUA_HOOKLINE, newline); + } +} + + +static void callTMres (lua_State *L, StkId res, const TValue *f, + const TValue *p1, const TValue *p2) { + ptrdiff_t result = savestack(L, res); + setobj2s(L, L->top, f); /* push function */ + setobj2s(L, L->top+1, p1); /* 1st argument */ + setobj2s(L, L->top+2, p2); /* 2nd argument */ + luaD_checkstack(L, 3); + L->top += 3; + luaD_call(L, L->top - 3, 1); + res = restorestack(L, result); + L->top--; + setobjs2s(L, res, L->top); +} + + + +static void callTM (lua_State *L, const TValue *f, const TValue *p1, + const TValue *p2, const TValue *p3) { + setobj2s(L, L->top, f); /* push function */ + setobj2s(L, L->top+1, p1); /* 1st argument */ + setobj2s(L, L->top+2, p2); /* 2nd argument */ + setobj2s(L, L->top+3, p3); /* 3th argument */ + luaD_checkstack(L, 4); + L->top += 4; + luaD_call(L, L->top - 4, 0); +} + + +void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) { + int loop; + for (loop = 0; loop < MAXTAGLOOP; loop++) { + const TValue *tm; + if (ttistable(t)) { /* `t' is a table? */ + Table *h = hvalue(t); + const TValue *res = luaH_get(h, key); /* do a primitive get */ + if (!ttisnil(res) || /* result is no nil? */ + (tm = fasttm(L, h->metatable, TM_INDEX)) == NULL) { /* or no TM? */ + setobj2s(L, val, res); + return; + } + /* else will try the tag method */ + } + else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX))) + luaG_typeerror(L, t, "index"); + if (ttisfunction(tm)) { + callTMres(L, val, tm, t, key); + return; + } + t = tm; /* else repeat with `tm' */ + } + luaG_runerror(L, "loop in gettable"); +} + + +void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) { + int loop; + for (loop = 0; loop < MAXTAGLOOP; loop++) { + const TValue *tm; + if (ttistable(t)) { /* `t' is a table? */ + Table *h = hvalue(t); + TValue *oldval = luaH_set(L, h, key); /* do a primitive set */ + if (!ttisnil(oldval) || /* result is no nil? */ + (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */ + setobj2t(L, oldval, val); + luaC_barriert(L, h, val); + return; + } + /* else will try the tag method */ + } + else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX))) + luaG_typeerror(L, t, "index"); + if (ttisfunction(tm)) { + callTM(L, tm, t, key, val); + return; + } + t = tm; /* else repeat with `tm' */ + } + luaG_runerror(L, "loop in settable"); +} + + +static int call_binTM (lua_State *L, const TValue *p1, const TValue *p2, + StkId res, TMS event) { + const TValue *tm = luaT_gettmbyobj(L, p1, event); /* try first operand */ + if (ttisnil(tm)) + tm = luaT_gettmbyobj(L, p2, event); /* try second operand */ + if (ttisnil(tm)) return 0; + callTMres(L, res, tm, p1, p2); + return 1; +} + + +static const TValue *get_compTM (lua_State *L, Table *mt1, Table *mt2, + TMS event) { + const TValue *tm1 = fasttm(L, mt1, event); + const TValue *tm2; + if (tm1 == NULL) return NULL; /* no metamethod */ + if (mt1 == mt2) return tm1; /* same metatables => same metamethods */ + tm2 = fasttm(L, mt2, event); + if (tm2 == NULL) return NULL; /* no metamethod */ + if (luaO_rawequalObj(tm1, tm2)) /* same metamethods? */ + return tm1; + return NULL; +} + + +static int call_orderTM (lua_State *L, const TValue *p1, const TValue *p2, + TMS event) { + const TValue *tm1 = luaT_gettmbyobj(L, p1, event); + const TValue *tm2; + if (ttisnil(tm1)) return -1; /* no metamethod? */ + tm2 = luaT_gettmbyobj(L, p2, event); + if (!luaO_rawequalObj(tm1, tm2)) /* different metamethods? */ + return -1; + callTMres(L, L->top, tm1, p1, p2); + return !l_isfalse(L->top); +} + + +static int l_strcmp (const TString *ls, const TString *rs) { + const char *l = getstr(ls); + size_t ll = ls->tsv.len; + const char *r = getstr(rs); + size_t lr = rs->tsv.len; + for (;;) { + int temp = strcoll(l, r); + if (temp != 0) return temp; + else { /* strings are equal up to a `\0' */ + size_t len = strlen(l); /* index of first `\0' in both strings */ + if (len == lr) /* r is finished? */ + return (len == ll) ? 0 : 1; + else if (len == ll) /* l is finished? */ + return -1; /* l is smaller than r (because r is not finished) */ + /* both strings longer than `len'; go on comparing (after the `\0') */ + len++; + l += len; ll -= len; r += len; lr -= len; + } + } +} + + +int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) { + int res; + if (ttype(l) != ttype(r)) + return luaG_ordererror(L, l, r); + else if (ttisnumber(l)) + return luai_numlt(nvalue(l), nvalue(r)); + else if (ttisstring(l)) + return l_strcmp(rawtsvalue(l), rawtsvalue(r)) < 0; + else if ((res = call_orderTM(L, l, r, TM_LT)) != -1) + return res; + return luaG_ordererror(L, l, r); +} + + +static int lessequal (lua_State *L, const TValue *l, const TValue *r) { + int res; + if (ttype(l) != ttype(r)) + return luaG_ordererror(L, l, r); + else if (ttisnumber(l)) + return luai_numle(nvalue(l), nvalue(r)); + else if (ttisstring(l)) + return l_strcmp(rawtsvalue(l), rawtsvalue(r)) <= 0; + else if ((res = call_orderTM(L, l, r, TM_LE)) != -1) /* first try `le' */ + return res; + else if ((res = call_orderTM(L, r, l, TM_LT)) != -1) /* else try `lt' */ + return !res; + return luaG_ordererror(L, l, r); +} + + +int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2) { + const TValue *tm; + lua_assert(ttype(t1) == ttype(t2)); + switch (ttype(t1)) { + case LUA_TNIL: return 1; + case LUA_TNUMBER: return luai_numeq(nvalue(t1), nvalue(t2)); + case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); /* true must be 1 !! */ + case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2); + case LUA_TUSERDATA: { + if (uvalue(t1) == uvalue(t2)) return 1; + tm = get_compTM(L, uvalue(t1)->metatable, uvalue(t2)->metatable, + TM_EQ); + break; /* will try TM */ + } + case LUA_TTABLE: { + if (hvalue(t1) == hvalue(t2)) return 1; + tm = get_compTM(L, hvalue(t1)->metatable, hvalue(t2)->metatable, TM_EQ); + break; /* will try TM */ + } + default: return gcvalue(t1) == gcvalue(t2); + } + if (tm == NULL) return 0; /* no TM? */ + callTMres(L, L->top, tm, t1, t2); /* call TM */ + return !l_isfalse(L->top); +} + + +void luaV_concat (lua_State *L, int total, int last) { + do { + StkId top = L->base + last + 1; + int n = 2; /* number of elements handled in this pass (at least 2) */ + if (!(ttisstring(top-2) || ttisnumber(top-2)) || !tostring(L, top-1)) { + if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT)) + luaG_concaterror(L, top-2, top-1); + } else if (tsvalue(top-1)->len == 0) /* second op is empty? */ + (void)tostring(L, top - 2); /* result is first op (as string) */ + else { + /* at least two string values; get as many as possible */ + size_t tl = tsvalue(top-1)->len; + char *buffer; + int i; + /* collect total length */ + for (n = 1; n < total && tostring(L, top-n-1); n++) { + size_t l = tsvalue(top-n-1)->len; + if (l >= MAX_SIZET - tl) luaG_runerror(L, "string length overflow"); + tl += l; + } + buffer = luaZ_openspace(L, &G(L)->buff, tl); + tl = 0; + for (i=n; i>0; i--) { /* concat all strings */ + size_t l = tsvalue(top-i)->len; + memcpy(buffer+tl, svalue(top-i), l); + tl += l; + } + setsvalue2s(L, top-n, luaS_newlstr(L, buffer, tl)); + } + total -= n-1; /* got `n' strings to create 1 new */ + last -= n-1; + } while (total > 1); /* repeat until only 1 result left */ +} + + +static void Arith (lua_State *L, StkId ra, const TValue *rb, + const TValue *rc, TMS op) { + TValue tempb, tempc; + const TValue *b, *c; + if ((b = luaV_tonumber(rb, &tempb)) != NULL && + (c = luaV_tonumber(rc, &tempc)) != NULL) { + lua_Number nb = nvalue(b), nc = nvalue(c); + switch (op) { + case TM_ADD: setnvalue(ra, luai_numadd(nb, nc)); break; + case TM_SUB: setnvalue(ra, luai_numsub(nb, nc)); break; + case TM_MUL: setnvalue(ra, luai_nummul(nb, nc)); break; + case TM_DIV: setnvalue(ra, luai_numdiv(nb, nc)); break; + case TM_MOD: setnvalue(ra, luai_nummod(nb, nc)); break; + case TM_POW: setnvalue(ra, luai_numpow(nb, nc)); break; + case TM_UNM: setnvalue(ra, luai_numunm(nb)); break; + default: lua_assert(0); break; + } + } + else if (!call_binTM(L, rb, rc, ra, op)) + luaG_aritherror(L, rb, rc); +} + + + +/* +** some macros for common tasks in `luaV_execute' +*/ + +#define runtime_check(L, c) { if (!(c)) break; } + +#define RA(i) (base+GETARG_A(i)) +/* to be used after possible stack reallocation */ +#define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i)) +#define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i)) +#define RKB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \ + ISK(GETARG_B(i)) ? k+INDEXK(GETARG_B(i)) : base+GETARG_B(i)) +#define RKC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \ + ISK(GETARG_C(i)) ? k+INDEXK(GETARG_C(i)) : base+GETARG_C(i)) +#define KBx(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, k+GETARG_Bx(i)) + + +#define dojump(L,pc,i) {(pc) += (i); luai_threadyield(L);} + + +#define Protect(x) { L->savedpc = pc; {x;}; base = L->base; } + + +#define arith_op(op,tm) { \ + TValue *rb = RKB(i); \ + TValue *rc = RKC(i); \ + if (ttisnumber(rb) && ttisnumber(rc)) { \ + lua_Number nb = nvalue(rb), nc = nvalue(rc); \ + setnvalue(ra, op(nb, nc)); \ + } \ + else \ + Protect(Arith(L, ra, rb, rc, tm)); \ + } + + + +void luaV_execute (lua_State *L, int nexeccalls) { + LClosure *cl; + StkId base; + TValue *k; + const Instruction *pc; + reentry: /* entry point */ + lua_assert(isLua(L->ci)); + pc = L->savedpc; + cl = &clvalue(L->ci->func)->l; + base = L->base; + k = cl->p->k; + /* main loop of interpreter */ + for (;;) { + const Instruction i = *pc++; + StkId ra; + if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) && + (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) { + traceexec(L, pc); + if (L->status == LUA_YIELD) { /* did hook yield? */ + L->savedpc = pc - 1; + return; + } + base = L->base; + } + /* warning!! several calls may realloc the stack and invalidate `ra' */ + ra = RA(i); + lua_assert(base == L->base && L->base == L->ci->base); + lua_assert(base <= L->top && L->top <= L->stack + L->stacksize); + lua_assert(L->top == L->ci->top || luaG_checkopenop(i)); + switch (GET_OPCODE(i)) { + case OP_MOVE: { + setobjs2s(L, ra, RB(i)); + continue; + } + case OP_LOADK: { + setobj2s(L, ra, KBx(i)); + continue; + } + case OP_LOADBOOL: { + setbvalue(ra, GETARG_B(i)); + if (GETARG_C(i)) pc++; /* skip next instruction (if C) */ + continue; + } + case OP_LOADNIL: { + TValue *rb = RB(i); + do { + setnilvalue(rb--); + } while (rb >= ra); + continue; + } + case OP_GETUPVAL: { + int b = GETARG_B(i); + setobj2s(L, ra, cl->upvals[b]->v); + continue; + } + case OP_GETGLOBAL: { + TValue g; + TValue *rb = KBx(i); + sethvalue(L, &g, cl->env); + lua_assert(ttisstring(rb)); + Protect(luaV_gettable(L, &g, rb, ra)); + continue; + } + case OP_GETTABLE: { + Protect(luaV_gettable(L, RB(i), RKC(i), ra)); + continue; + } + case OP_SETGLOBAL: { + TValue g; + sethvalue(L, &g, cl->env); + lua_assert(ttisstring(KBx(i))); + Protect(luaV_settable(L, &g, KBx(i), ra)); + continue; + } + case OP_SETUPVAL: { + UpVal *uv = cl->upvals[GETARG_B(i)]; + setobj(L, uv->v, ra); + luaC_barrier(L, uv, ra); + continue; + } + case OP_SETTABLE: { + Protect(luaV_settable(L, ra, RKB(i), RKC(i))); + continue; + } + case OP_NEWTABLE: { + int b = GETARG_B(i); + int c = GETARG_C(i); + sethvalue(L, ra, luaH_new(L, luaO_fb2int(b), luaO_fb2int(c))); + Protect(luaC_checkGC(L)); + continue; + } + case OP_SELF: { + StkId rb = RB(i); + setobjs2s(L, ra+1, rb); + Protect(luaV_gettable(L, rb, RKC(i), ra)); + continue; + } + case OP_ADD: { + arith_op(luai_numadd, TM_ADD); + continue; + } + case OP_SUB: { + arith_op(luai_numsub, TM_SUB); + continue; + } + case OP_MUL: { + arith_op(luai_nummul, TM_MUL); + continue; + } + case OP_DIV: { + arith_op(luai_numdiv, TM_DIV); + continue; + } + case OP_MOD: { + arith_op(luai_nummod, TM_MOD); + continue; + } + case OP_POW: { + arith_op(luai_numpow, TM_POW); + continue; + } + case OP_UNM: { + TValue *rb = RB(i); + if (ttisnumber(rb)) { + lua_Number nb = nvalue(rb); + setnvalue(ra, luai_numunm(nb)); + } + else { + Protect(Arith(L, ra, rb, rb, TM_UNM)); + } + continue; + } + case OP_NOT: { + int res = l_isfalse(RB(i)); /* next assignment may change this value */ + setbvalue(ra, res); + continue; + } + case OP_LEN: { + const TValue *rb = RB(i); + switch (ttype(rb)) { + case LUA_TTABLE: { + setnvalue(ra, cast_num(luaH_getn(hvalue(rb)))); + break; + } + case LUA_TSTRING: { + setnvalue(ra, cast_num(tsvalue(rb)->len)); + break; + } + default: { /* try metamethod */ + Protect( + if (!call_binTM(L, rb, luaO_nilobject, ra, TM_LEN)) + luaG_typeerror(L, rb, "get length of"); + ) + } + } + continue; + } + case OP_CONCAT: { + int b = GETARG_B(i); + int c = GETARG_C(i); + Protect(luaV_concat(L, c-b+1, c); luaC_checkGC(L)); + setobjs2s(L, RA(i), base+b); + continue; + } + case OP_JMP: { + dojump(L, pc, GETARG_sBx(i)); + continue; + } + case OP_EQ: { + TValue *rb = RKB(i); + TValue *rc = RKC(i); + Protect( + if (equalobj(L, rb, rc) == GETARG_A(i)) + dojump(L, pc, GETARG_sBx(*pc)); + ) + pc++; + continue; + } + case OP_LT: { + Protect( + if (luaV_lessthan(L, RKB(i), RKC(i)) == GETARG_A(i)) + dojump(L, pc, GETARG_sBx(*pc)); + ) + pc++; + continue; + } + case OP_LE: { + Protect( + if (lessequal(L, RKB(i), RKC(i)) == GETARG_A(i)) + dojump(L, pc, GETARG_sBx(*pc)); + ) + pc++; + continue; + } + case OP_TEST: { + if (l_isfalse(ra) != GETARG_C(i)) + dojump(L, pc, GETARG_sBx(*pc)); + pc++; + continue; + } + case OP_TESTSET: { + TValue *rb = RB(i); + if (l_isfalse(rb) != GETARG_C(i)) { + setobjs2s(L, ra, rb); + dojump(L, pc, GETARG_sBx(*pc)); + } + pc++; + continue; + } + case OP_CALL: { + int b = GETARG_B(i); + int nresults = GETARG_C(i) - 1; + if (b != 0) L->top = ra+b; /* else previous instruction set top */ + L->savedpc = pc; + switch (luaD_precall(L, ra, nresults)) { + case PCRLUA: { + nexeccalls++; + goto reentry; /* restart luaV_execute over new Lua function */ + } + case PCRC: { + /* it was a C function (`precall' called it); adjust results */ + if (nresults >= 0) L->top = L->ci->top; + base = L->base; + continue; + } + default: { + return; /* yield */ + } + } + } + case OP_TAILCALL: { + int b = GETARG_B(i); + if (b != 0) L->top = ra+b; /* else previous instruction set top */ + L->savedpc = pc; + lua_assert(GETARG_C(i) - 1 == LUA_MULTRET); + switch (luaD_precall(L, ra, LUA_MULTRET)) { + case PCRLUA: { + /* tail call: put new frame in place of previous one */ + CallInfo *ci = L->ci - 1; /* previous frame */ + int aux; + StkId func = ci->func; + StkId pfunc = (ci+1)->func; /* previous function index */ + if (L->openupval) luaF_close(L, ci->base); + L->base = ci->base = ci->func + ((ci+1)->base - pfunc); + for (aux = 0; pfunc+aux < L->top; aux++) /* move frame down */ + setobjs2s(L, func+aux, pfunc+aux); + ci->top = L->top = func+aux; /* correct top */ + lua_assert(L->top == L->base + clvalue(func)->l.p->maxstacksize); + ci->savedpc = L->savedpc; + ci->tailcalls++; /* one more call lost */ + L->ci--; /* remove new frame */ + goto reentry; + } + case PCRC: { /* it was a C function (`precall' called it) */ + base = L->base; + continue; + } + default: { + return; /* yield */ + } + } + } + case OP_RETURN: { + int b = GETARG_B(i); + if (b != 0) L->top = ra+b-1; + if (L->openupval) luaF_close(L, base); + L->savedpc = pc; + b = luaD_poscall(L, ra); + if (--nexeccalls == 0) /* was previous function running `here'? */ + return; /* no: return */ + else { /* yes: continue its execution */ + if (b) L->top = L->ci->top; + lua_assert(isLua(L->ci)); + lua_assert(GET_OPCODE(*((L->ci)->savedpc - 1)) == OP_CALL); + goto reentry; + } + } + case OP_FORLOOP: { + lua_Number step = nvalue(ra+2); + lua_Number idx = luai_numadd(nvalue(ra), step); /* increment index */ + lua_Number limit = nvalue(ra+1); + if (luai_numlt(0, step) ? luai_numle(idx, limit) + : luai_numle(limit, idx)) { + dojump(L, pc, GETARG_sBx(i)); /* jump back */ + setnvalue(ra, idx); /* update internal index... */ + setnvalue(ra+3, idx); /* ...and external index */ + } + continue; + } + case OP_FORPREP: { + const TValue *init = ra; + const TValue *plimit = ra+1; + const TValue *pstep = ra+2; + L->savedpc = pc; /* next steps may throw errors */ + if (!tonumber(init, ra)) + luaG_runerror(L, LUA_QL("for") " initial value must be a number"); + else if (!tonumber(plimit, ra+1)) + luaG_runerror(L, LUA_QL("for") " limit must be a number"); + else if (!tonumber(pstep, ra+2)) + luaG_runerror(L, LUA_QL("for") " step must be a number"); + setnvalue(ra, luai_numsub(nvalue(ra), nvalue(pstep))); + dojump(L, pc, GETARG_sBx(i)); + continue; + } + case OP_TFORLOOP: { + StkId cb = ra + 3; /* call base */ + setobjs2s(L, cb+2, ra+2); + setobjs2s(L, cb+1, ra+1); + setobjs2s(L, cb, ra); + L->top = cb+3; /* func. + 2 args (state and index) */ + Protect(luaD_call(L, cb, GETARG_C(i))); + L->top = L->ci->top; + cb = RA(i) + 3; /* previous call may change the stack */ + if (!ttisnil(cb)) { /* continue loop? */ + setobjs2s(L, cb-1, cb); /* save control variable */ + dojump(L, pc, GETARG_sBx(*pc)); /* jump back */ + } + pc++; + continue; + } + case OP_SETLIST: { + int n = GETARG_B(i); + int c = GETARG_C(i); + int last; + Table *h; + if (n == 0) { + n = cast_int(L->top - ra) - 1; + L->top = L->ci->top; + } + if (c == 0) c = cast_int(*pc++); + runtime_check(L, ttistable(ra)); + h = hvalue(ra); + last = ((c-1)*LFIELDS_PER_FLUSH) + n; + if (last > h->sizearray) /* needs more space? */ + luaH_resizearray(L, h, last); /* pre-alloc it at once */ + for (; n > 0; n--) { + TValue *val = ra+n; + setobj2t(L, luaH_setnum(L, h, last--), val); + luaC_barriert(L, h, val); + } + continue; + } + case OP_CLOSE: { + luaF_close(L, ra); + continue; + } + case OP_CLOSURE: { + Proto *p; + Closure *ncl; + int nup, j; + p = cl->p->p[GETARG_Bx(i)]; + nup = p->nups; + ncl = luaF_newLclosure(L, nup, cl->env); + ncl->l.p = p; + for (j=0; jl.upvals[j] = cl->upvals[GETARG_B(*pc)]; + else { + lua_assert(GET_OPCODE(*pc) == OP_MOVE); + ncl->l.upvals[j] = luaF_findupval(L, base + GETARG_B(*pc)); + } + } + setclvalue(L, ra, ncl); + Protect(luaC_checkGC(L)); + continue; + } + case OP_VARARG: { + int b = GETARG_B(i) - 1; + int j; + CallInfo *ci = L->ci; + int n = cast_int(ci->base - ci->func) - cl->p->numparams - 1; + if (b == LUA_MULTRET) { + Protect(luaD_checkstack(L, n)); + ra = RA(i); /* previous call may change the stack */ + b = n; + L->top = ra + n; + } + for (j = 0; j < b; j++) { + if (j < n) { + setobjs2s(L, ra + j, ci->base - n + j); + } + else { + setnilvalue(ra + j); + } + } + continue; + } + } + } +} + diff --git a/user/lua-5.1.4/src/lvm.h b/user/lua-5.1.4/src/lvm.h new file mode 100644 index 0000000..bfe4f56 --- /dev/null +++ b/user/lua-5.1.4/src/lvm.h @@ -0,0 +1,36 @@ +/* +** $Id: lvm.h,v 2.5.1.1 2007/12/27 13:02:25 roberto Exp $ +** Lua virtual machine +** See Copyright Notice in lua.h +*/ + +#ifndef lvm_h +#define lvm_h + + +#include "ldo.h" +#include "lobject.h" +#include "ltm.h" + + +#define tostring(L,o) ((ttype(o) == LUA_TSTRING) || (luaV_tostring(L, o))) + +#define tonumber(o,n) (ttype(o) == LUA_TNUMBER || \ + (((o) = luaV_tonumber(o,n)) != NULL)) + +#define equalobj(L,o1,o2) \ + (ttype(o1) == ttype(o2) && luaV_equalval(L, o1, o2)) + + +LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r); +LUAI_FUNC int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2); +LUAI_FUNC const TValue *luaV_tonumber (const TValue *obj, TValue *n); +LUAI_FUNC int luaV_tostring (lua_State *L, StkId obj); +LUAI_FUNC void luaV_gettable (lua_State *L, const TValue *t, TValue *key, + StkId val); +LUAI_FUNC void luaV_settable (lua_State *L, const TValue *t, TValue *key, + StkId val); +LUAI_FUNC void luaV_execute (lua_State *L, int nexeccalls); +LUAI_FUNC void luaV_concat (lua_State *L, int total, int last); + +#endif diff --git a/user/lua-5.1.4/src/lvm.o b/user/lua-5.1.4/src/lvm.o new file mode 100644 index 0000000000000000000000000000000000000000..638e48fdf194b7402739aeab4afa23ac2766a53e GIT binary patch literal 12628 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 + +#define lzio_c +#define LUA_CORE + +#include "lua.h" + +#include "llimits.h" +#include "lmem.h" +#include "lstate.h" +#include "lzio.h" + + +int luaZ_fill (ZIO *z) { + size_t size; + lua_State *L = z->L; + const char *buff; + lua_unlock(L); + buff = z->reader(L, z->data, &size); + lua_lock(L); + if (buff == NULL || size == 0) return EOZ; + z->n = size - 1; + z->p = buff; + return char2int(*(z->p++)); +} + + +int luaZ_lookahead (ZIO *z) { + if (z->n == 0) { + if (luaZ_fill(z) == EOZ) + return EOZ; + else { + z->n++; /* luaZ_fill removed first byte; put back it */ + z->p--; + } + } + return char2int(*z->p); +} + + +void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) { + z->L = L; + z->reader = reader; + z->data = data; + z->n = 0; + z->p = NULL; +} + + +/* --------------------------------------------------------------- read --- */ +size_t luaZ_read (ZIO *z, void *b, size_t n) { + while (n) { + size_t m; + if (luaZ_lookahead(z) == EOZ) + return n; /* return number of missing bytes */ + m = (n <= z->n) ? n : z->n; /* min. between n and z->n */ + memcpy(b, z->p, m); + z->n -= m; + z->p += m; + b = (char *)b + m; + n -= m; + } + return 0; +} + +/* ------------------------------------------------------------------------ */ +char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n) { + if (n > buff->buffsize) { + if (n < LUA_MINBUFFER) n = LUA_MINBUFFER; + luaZ_resizebuffer(L, buff, n); + } + return buff->buffer; +} + + diff --git a/user/lua-5.1.4/src/lzio.h b/user/lua-5.1.4/src/lzio.h new file mode 100644 index 0000000..51d695d --- /dev/null +++ b/user/lua-5.1.4/src/lzio.h @@ -0,0 +1,67 @@ +/* +** $Id: lzio.h,v 1.21.1.1 2007/12/27 13:02:25 roberto Exp $ +** Buffered streams +** See Copyright Notice in lua.h +*/ + + +#ifndef lzio_h +#define lzio_h + +#include "lua.h" + +#include "lmem.h" + + +#define EOZ (-1) /* end of stream */ + +typedef struct Zio ZIO; + +#define char2int(c) cast(int, cast(unsigned char, (c))) + +#define zgetc(z) (((z)->n--)>0 ? char2int(*(z)->p++) : luaZ_fill(z)) + +typedef struct Mbuffer { + char *buffer; + size_t n; + size_t buffsize; +} Mbuffer; + +#define luaZ_initbuffer(L, buff) ((buff)->buffer = NULL, (buff)->buffsize = 0) + +#define luaZ_buffer(buff) ((buff)->buffer) +#define luaZ_sizebuffer(buff) ((buff)->buffsize) +#define luaZ_bufflen(buff) ((buff)->n) + +#define luaZ_resetbuffer(buff) ((buff)->n = 0) + + +#define luaZ_resizebuffer(L, buff, size) \ + (luaM_reallocvector(L, (buff)->buffer, (buff)->buffsize, size, char), \ + (buff)->buffsize = size) + +#define luaZ_freebuffer(L, buff) luaZ_resizebuffer(L, buff, 0) + + +LUAI_FUNC char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n); +LUAI_FUNC void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, + void *data); +LUAI_FUNC size_t luaZ_read (ZIO* z, void* b, size_t n); /* read next n bytes */ +LUAI_FUNC int luaZ_lookahead (ZIO *z); + + + +/* --------- Private Part ------------------ */ + +struct Zio { + size_t n; /* bytes still unread */ + const char *p; /* current position in buffer */ + lua_Reader reader; + void* data; /* additional data */ + lua_State *L; /* Lua state (for reader) */ +}; + + +LUAI_FUNC int luaZ_fill (ZIO *z); + +#endif diff --git a/user/lua-5.1.4/src/lzio.o b/user/lua-5.1.4/src/lzio.o new file mode 100644 index 0000000000000000000000000000000000000000..7e3ac76b423cb0d6bf357ff5cea23ddcc479b5bc GIT binary patch literal 1388 zcma)6&ubGw6rN4Can)$oHV46AD@1LPE{YLp@lZ^YBL1LIqhh*=n{>6In`~)jgB8TX zn!_*zJo-O)@gPOiLotP1t9bArD1uUK4hlu8t;F~Chm9wF@b-J(n{VFiyqVp5$qOk# z5QuLA36gC_$W*``i90Yrc99*v)WJ0SG-hWZlr==z`!X{*% zmYbuZOC+9-u!*qRVBfd(c56Sgwzw5$>IPRqFY%N#{I)V?Z}wID>gNUf$FFLXMZ6aY zv8=>FX>GBV+IZfNt4zhPDH0EX3cKUH^4gnvmGIEE7WV`Dy?O;Y8s&FoZb`Mabz<#| zqhp)H&1!%(cuItNlGEg57@F)98$2jv#liPf7Su3{yE%KKZ8h!XDBH+nb83T-@kC;z ze;}Q=%GBzQD{<$qEr@2RLcX>c^7B=XkIrIs^6wWnbxRAlzgQ^l!93* z>1D{3O{y#7m(oKOsugCjpZ{xpAjCTt@+OP|KI*uHvX?&qxYLUf#<~a@0F=N{j)#cx zVUGs^(OMm~kUNJBcnlo%|I!@?4VFMe!+J3{be=edKJ1~Bgoo^XJ3dDZ+CFf9P2{LM zhk<9l4zaUD3nqPq9QFXeLfi-T26<<_cQBws&NsiF&wcF7i{x9|&m;c*7eL;*0&>5L z?yTUS)AMfa}e%9lM03UKnzQ}p1WBz3^y`Nb5@(twP}|Y%SGx&=A2%x%xMK3>BSs1&3y5e v8_(;SVVH%SD+D%8N_wd?Y(iVi@v>dkJ}n2p8=)?ZXyP literal 0 HcmV?d00001 diff --git a/user/lua-5.1.4/src/print.c b/user/lua-5.1.4/src/print.c new file mode 100644 index 0000000..e240cfc --- /dev/null +++ b/user/lua-5.1.4/src/print.c @@ -0,0 +1,227 @@ +/* +** $Id: print.c,v 1.55a 2006/05/31 13:30:05 lhf Exp $ +** print bytecodes +** See Copyright Notice in lua.h +*/ + +#include +#include + +#define luac_c +#define LUA_CORE + +#include "ldebug.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lundump.h" + +#define PrintFunction luaU_print + +#define Sizeof(x) ((int)sizeof(x)) +#define VOID(p) ((const void*)(p)) + +static void PrintString(const TString* ts) +{ + const char* s=getstr(ts); + size_t i,n=ts->tsv.len; + putchar('"'); + for (i=0; ik[i]; + switch (ttype(o)) + { + case LUA_TNIL: + printf("nil"); + break; + case LUA_TBOOLEAN: + printf(bvalue(o) ? "true" : "false"); + break; + case LUA_TNUMBER: + printf(LUA_NUMBER_FMT,nvalue(o)); + break; + case LUA_TSTRING: + PrintString(rawtsvalue(o)); + break; + default: /* cannot happen */ + printf("? type=%d",ttype(o)); + break; + } +} + +static void PrintCode(const Proto* f) +{ + const Instruction* code=f->code; + int pc,n=f->sizecode; + for (pc=0; pc0) printf("[%d]\t",line); else printf("[-]\t"); + printf("%-9s\t",luaP_opnames[o]); + switch (getOpMode(o)) + { + case iABC: + printf("%d",a); + if (getBMode(o)!=OpArgN) printf(" %d",ISK(b) ? (-1-INDEXK(b)) : b); + if (getCMode(o)!=OpArgN) printf(" %d",ISK(c) ? (-1-INDEXK(c)) : c); + break; + case iABx: + if (getBMode(o)==OpArgK) printf("%d %d",a,-1-bx); else printf("%d %d",a,bx); + break; + case iAsBx: + if (o==OP_JMP) printf("%d",sbx); else printf("%d %d",a,sbx); + break; + } + switch (o) + { + case OP_LOADK: + printf("\t; "); PrintConstant(f,bx); + break; + case OP_GETUPVAL: + case OP_SETUPVAL: + printf("\t; %s", (f->sizeupvalues>0) ? getstr(f->upvalues[b]) : "-"); + break; + case OP_GETGLOBAL: + case OP_SETGLOBAL: + printf("\t; %s",svalue(&f->k[bx])); + break; + case OP_GETTABLE: + case OP_SELF: + if (ISK(c)) { printf("\t; "); PrintConstant(f,INDEXK(c)); } + break; + case OP_SETTABLE: + case OP_ADD: + case OP_SUB: + case OP_MUL: + case OP_DIV: + case OP_POW: + case OP_EQ: + case OP_LT: + case OP_LE: + if (ISK(b) || ISK(c)) + { + printf("\t; "); + if (ISK(b)) PrintConstant(f,INDEXK(b)); else printf("-"); + printf(" "); + if (ISK(c)) PrintConstant(f,INDEXK(c)); else printf("-"); + } + break; + case OP_JMP: + case OP_FORLOOP: + case OP_FORPREP: + printf("\t; to %d",sbx+pc+2); + break; + case OP_CLOSURE: + printf("\t; %p",VOID(f->p[bx])); + break; + case OP_SETLIST: + if (c==0) printf("\t; %d",(int)code[++pc]); + else printf("\t; %d",c); + break; + default: + break; + } + printf("\n"); + } +} + +#define SS(x) (x==1)?"":"s" +#define S(x) x,SS(x) + +static void PrintHeader(const Proto* f) +{ + const char* s=getstr(f->source); + if (*s=='@' || *s=='=') + s++; + else if (*s==LUA_SIGNATURE[0]) + s="(bstring)"; + else + s="(string)"; + printf("\n%s <%s:%d,%d> (%d instruction%s, %d bytes at %p)\n", + (f->linedefined==0)?"main":"function",s, + f->linedefined,f->lastlinedefined, + S(f->sizecode),f->sizecode*Sizeof(Instruction),VOID(f)); + printf("%d%s param%s, %d slot%s, %d upvalue%s, ", + f->numparams,f->is_vararg?"+":"",SS(f->numparams), + S(f->maxstacksize),S(f->nups)); + printf("%d local%s, %d constant%s, %d function%s\n", + S(f->sizelocvars),S(f->sizek),S(f->sizep)); +} + +static void PrintConstants(const Proto* f) +{ + int i,n=f->sizek; + printf("constants (%d) for %p:\n",n,VOID(f)); + for (i=0; isizelocvars; + printf("locals (%d) for %p:\n",n,VOID(f)); + for (i=0; ilocvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1); + } +} + +static void PrintUpvalues(const Proto* f) +{ + int i,n=f->sizeupvalues; + printf("upvalues (%d) for %p:\n",n,VOID(f)); + if (f->upvalues==NULL) return; + for (i=0; iupvalues[i])); + } +} + +void PrintFunction(const Proto* f, int full) +{ + int i,n=f->sizep; + PrintHeader(f); + PrintCode(f); + if (full) + { + PrintConstants(f); + PrintLocals(f); + PrintUpvalues(f); + } + for (i=0; ip[i],full); +} diff --git a/user/lua-5.1.4/src/print.o b/user/lua-5.1.4/src/print.o new file mode 100644 index 0000000000000000000000000000000000000000..6321f868760df5ba2dd0e913701970a683285b8a GIT binary patch literal 6784 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 a90CplM}cnx$AA;SN#GQ48W;u60RIK|c posted to lua-l +-- modified to use ANSI terminal escape sequences +-- modified to use for instead of while + +local write=io.write + +ALIVE="¥" DEAD="þ" +ALIVE="O" DEAD="-" + +function delay() -- NOTE: SYSTEM-DEPENDENT, adjust as necessary + for i=1,10000 do end + -- local i=os.clock()+1 while(os.clock() 0 do + local xm1,x,xp1,xi=self.w-1,self.w,1,self.w + while xi > 0 do + local sum = self[ym1][xm1] + self[ym1][x] + self[ym1][xp1] + + self[y][xm1] + self[y][xp1] + + self[yp1][xm1] + self[yp1][x] + self[yp1][xp1] + next[y][x] = ((sum==2) and self[y][x]) or ((sum==3) and 1) or 0 + xm1,x,xp1,xi = x,xp1,xp1+1,xi-1 + end + ym1,y,yp1,yi = y,yp1,yp1+1,yi-1 + end +end + +-- output the array to screen +function _CELLS:draw() + local out="" -- accumulate to reduce flicker + for y=1,self.h do + for x=1,self.w do + out=out..(((self[y][x]>0) and ALIVE) or DEAD) + end + out=out.."\n" + end + write(out) +end + +-- constructor +function CELLS(w,h) + local c = ARRAY2D(w,h) + c.spawn = _CELLS.spawn + c.evolve = _CELLS.evolve + c.draw = _CELLS.draw + return c +end + +-- +-- shapes suitable for use with spawn() above +-- +HEART = { 1,0,1,1,0,1,1,1,1; w=3,h=3 } +GLIDER = { 0,0,1,1,0,1,0,1,1; w=3,h=3 } +EXPLODE = { 0,1,0,1,1,1,1,0,1,0,1,0; w=3,h=4 } +FISH = { 0,1,1,1,1,1,0,0,0,1,0,0,0,0,1,1,0,0,1,0; w=5,h=4 } +BUTTERFLY = { 1,0,0,0,1,0,1,1,1,0,1,0,0,0,1,1,0,1,0,1,1,0,0,0,1; w=5,h=5 } + +-- the main routine +function LIFE(w,h) + -- create two arrays + local thisgen = CELLS(w,h) + local nextgen = CELLS(w,h) + + -- create some life + -- about 1000 generations of fun, then a glider steady-state + thisgen:spawn(GLIDER,5,4) + thisgen:spawn(EXPLODE,25,10) + thisgen:spawn(FISH,4,12) + + -- run until break + local gen=1 + write("\027[2J") -- ANSI clear screen + while 1 do + thisgen:evolve(nextgen) + thisgen,nextgen = nextgen,thisgen + write("\027[H") -- ANSI home cursor + thisgen:draw() + write("Life - generation ",gen,"\n") + gen=gen+1 + if gen>2000 then break end + --delay() -- no delay + end +end + +LIFE(40,20) diff --git a/user/lua-5.1.4/test/luac.lua b/user/lua-5.1.4/test/luac.lua new file mode 100644 index 0000000..96a0a97 --- /dev/null +++ b/user/lua-5.1.4/test/luac.lua @@ -0,0 +1,7 @@ +-- bare-bones luac in Lua +-- usage: lua luac.lua file.lua + +assert(arg[1]~=nil and arg[2]==nil,"usage: lua luac.lua file.lua") +f=assert(io.open("luac.out","wb")) +assert(f:write(string.dump(assert(loadfile(arg[1]))))) +assert(f:close()) diff --git a/user/lua-5.1.4/test/printf.lua b/user/lua-5.1.4/test/printf.lua new file mode 100644 index 0000000..58c63ff --- /dev/null +++ b/user/lua-5.1.4/test/printf.lua @@ -0,0 +1,7 @@ +-- an implementation of printf + +function printf(...) + io.write(string.format(...)) +end + +printf("Hello %s from %s on %s\n",os.getenv"USER" or "there",_VERSION,os.date()) diff --git a/user/lua-5.1.4/test/readonly.lua b/user/lua-5.1.4/test/readonly.lua new file mode 100644 index 0000000..85c0b4e --- /dev/null +++ b/user/lua-5.1.4/test/readonly.lua @@ -0,0 +1,12 @@ +-- make global variables readonly + +local f=function (t,i) error("cannot redefine global variable `"..i.."'",2) end +local g={} +local G=getfenv() +setmetatable(g,{__index=G,__newindex=f}) +setfenv(1,g) + +-- an example +rawset(g,"x",3) +x=2 +y=1 -- cannot redefine `y' diff --git a/user/lua-5.1.4/test/sieve.lua b/user/lua-5.1.4/test/sieve.lua new file mode 100644 index 0000000..0871bb2 --- /dev/null +++ b/user/lua-5.1.4/test/sieve.lua @@ -0,0 +1,29 @@ +-- the sieve of of Eratosthenes programmed with coroutines +-- typical usage: lua -e N=1000 sieve.lua | column + +-- generate all the numbers from 2 to n +function gen (n) + return coroutine.wrap(function () + for i=2,n do coroutine.yield(i) end + end) +end + +-- filter the numbers generated by `g', removing multiples of `p' +function filter (p, g) + return coroutine.wrap(function () + while 1 do + local n = g() + if n == nil then return end + if math.mod(n, p) ~= 0 then coroutine.yield(n) end + end + end) +end + +N=N or 1000 -- from command line +x = gen(N) -- generate primes up to N +while 1 do + local n = x() -- pick a number until done + if n == nil then break end + print(n) -- must be a prime number + x = filter(n, x) -- now remove its multiples +end diff --git a/user/lua-5.1.4/test/sort.lua b/user/lua-5.1.4/test/sort.lua new file mode 100644 index 0000000..0bcb15f --- /dev/null +++ b/user/lua-5.1.4/test/sort.lua @@ -0,0 +1,66 @@ +-- two implementations of a sort function +-- this is an example only. Lua has now a built-in function "sort" + +-- extracted from Programming Pearls, page 110 +function qsort(x,l,u,f) + if ly end) + show("after reverse selection sort",x) + qsort(x,1,n,function (x,y) return x>> ",string.rep(" ",level)) + if t~=nil and t.currentline>=0 then io.write(t.short_src,":",t.currentline," ") end + t=debug.getinfo(2) + if event=="call" then + level=level+1 + else + level=level-1 if level<0 then level=0 end + end + if t.what=="main" then + if event=="call" then + io.write("begin ",t.short_src) + else + io.write("end ",t.short_src) + end + elseif t.what=="Lua" then +-- table.foreach(t,print) + io.write(event," ",t.name or "(Lua)"," <",t.linedefined,":",t.short_src,">") + else + io.write(event," ",t.name or "(C)"," [",t.what,"] ") + end + io.write("\n") +end + +debug.sethook(hook,"cr") +level=0 diff --git a/user/lua-5.1.4/test/trace-globals.lua b/user/lua-5.1.4/test/trace-globals.lua new file mode 100644 index 0000000..295e670 --- /dev/null +++ b/user/lua-5.1.4/test/trace-globals.lua @@ -0,0 +1,38 @@ +-- trace assigments to global variables + +do + -- a tostring that quotes strings. note the use of the original tostring. + local _tostring=tostring + local tostring=function(a) + if type(a)=="string" then + return string.format("%q",a) + else + return _tostring(a) + end + end + + local log=function (name,old,new) + local t=debug.getinfo(3,"Sl") + local line=t.currentline + io.write(t.short_src) + if line>=0 then io.write(":",line) end + io.write(": ",name," is now ",tostring(new)," (was ",tostring(old),")","\n") + end + + local g={} + local set=function (t,name,value) + log(name,g[name],value) + g[name]=value + end + setmetatable(getfenv(),{__index=g,__newindex=set}) +end + +-- an example + +a=1 +b=2 +a=10 +b=20 +b=nil +b=200 +print(a,b,c) diff --git a/user/lua-5.1.4/test/xd.lua b/user/lua-5.1.4/test/xd.lua new file mode 100644 index 0000000..ebc3eff --- /dev/null +++ b/user/lua-5.1.4/test/xd.lua @@ -0,0 +1,14 @@ +-- hex dump +-- usage: lua xd.lua < file + +local offset=0 +while true do + local s=io.read(16) + if s==nil then return end + io.write(string.format("%08X ",offset)) + string.gsub(s,"(.)", + function (c) io.write(string.format("%02X ",string.byte(c))) end) + io.write(string.rep(" ",3*(16-string.len(s)))) + io.write(" ",string.gsub(s,"%c","."),"\n") + offset=offset+16 +end diff --git a/user/pdclib.tar.gz b/user/pdclib.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..fcd6bdb4f0d19fb237b2af0d671187a0a391ee60 GIT binary patch literal 69029 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 z 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

w&KH@eA=pbe$VHc^IoROC%Y%kyI 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 literal 0 HcmV?d00001 diff --git a/user/pdclib/Makefile b/user/pdclib/Makefile new file mode 100644 index 0000000..8429f9a --- /dev/null +++ b/user/pdclib/Makefile @@ -0,0 +1,121 @@ +# $Id$ + +# This is a list of all non-source files that are part of the distribution. +AUXFILES := Makefile Readme.txt + +# Directories belonging to the project +PROJDIRS := functions includes internals +# All source files of the project +SRCFILES := $(shell find $(PROJDIRS) -mindepth 1 -maxdepth 3 -name "*.c") +# All header files of the project +HDRFILES := $(shell find $(PROJDIRS) -mindepth 1 -maxdepth 3 -name "*.h") +# All .c files in functions/_PDCLIB that do not have a regression test driver +INTFILES := _Exit atomax digits open print remove rename seed stdinit strtox_main strtox_prelim cleanstream fflush filemode +# All object files in the library +OBJFILES := $(patsubst %.c,%.o,$(SRCFILES)) +# All test drivers (.t) +TSTFILES := $(patsubst %.c,%.t,$(SRCFILES)) +# All regression test drivers (.r) +REGFILES := $(filter-out $(patsubst %,functions/_PDCLIB/%.r,$(INTFILES)),$(patsubst %.c,%.r,$(SRCFILES))) +# All dependency files (.d) +DEPFILES := $(patsubst %.c,%.d,$(SRCFILES)) +# All files belonging to the source distribution +ALLFILES := $(SRCFILES) $(HDRFILES) $(AUXFILES) + +# All files in platform/example/functions/_PDCLIB (for development only) +PATCHFILES1 := $(shell ls platform/csos/functions/_PDCLIB/*.c) +# All files in platform/example/functions/stdlib (for development only) +PATCHFILES2 := $(shell ls platform/csos/functions/stdlib/*.c) + +WARNINGS := -Wall -Wextra -pedantic -Wno-unused-parameter -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline -Wno-long-long -Wconversion -fno-builtin +CFLAGS := -nostdlib -fno-builtin -nostartfiles -nodefaultlibs -fno-exceptions -fno-stack-protector -g -std=c99 -I./internals $(WARNINGS) $(USERFLAGS) + +.PHONY: all clean srcdist bindist test tests testdrivers regtests regtestdrivers todos fixmes find links unlink help + +all: pdclib.a + +pdclib.a: $(OBJFILES) + @echo " AR $@" + @ar rc pdclib.a $? + @echo + +test: functions/$(FILE) + functions/$(FILE) + +tests: testdrivers + -@rc=0; count=0; failed=""; echo; for file in $(TSTFILES); do echo " TST $$file"; ./$$file; test=$$?; if [ $$test != 0 ]; then rc=`expr $$rc + $$test`; failed="$$failed $$file"; fi; count=`expr $$count + 1`; done; echo; echo "Tests executed (linking PDCLib): $$count Tests failed: $$rc"; echo; for file in $$failed; do echo "Failed: $$file"; done; + +testdrivers: $(TSTFILES) + +regtests: regtestdrivers + -@rc=0; count=0; failed=""; echo; for file in $(REGFILES); do echo " RTST $$file"; ./$$file; test=$$?; if [ $$test != 0 ]; then rc=`expr $$rc + $$test`; failed="$$failed $$file"; fi; count=`expr $$count + 1`; done; echo; echo "Tests executed (linking system libc): $$count Tests failed: $$rc"; echo; for file in $$failed; do echo "Failed: $$file"; done; + +regtestdrivers: $(REGFILES) + +-include $(DEPFILES) + +clean: + @for file in $(OBJFILES) $(DEPFILES) $(TSTFILES) $(REGFILES) pdclib.a pdclib.tgz; do if [ -f $$file ]; then rm $$file; fi; done + +srcdist: + @tar czf pdclib.tgz $(ALLFILES) + +todos: + -@for file in $(ALLFILES); do grep -H TODO $$file; done; true + +fixmes: + -@for file in $(ALLFILES); do grep -H FIXME $$file; done; true + +find: + @find functions/ includes/ internals/ platform/ old_stdio/ -name "*\.[ch]" -type f | xargs grep $$FIND + +links: + @echo "Linking platform/example..." + @cd internals && ln -s ../platform/example/internals/_PDCLIB_config.h + @cd includes && ln -s ../platform/example/includes/float.h + @cd functions/_PDCLIB && for file in $(PATCHFILES1); do basfile=`basename $$file`; if [ ! -f $$basfile ]; then ln -s `ls ../../$$file` .; fi; done + @cd functions/stdlib && for file in $(PATCHFILES2); do basfile=`basename $$file`; if [ ! -f $$basfile ]; then ln -s `ls ../../$$file` .; fi; done + +unlink: + @echo "Unlinking platform files..." + @if [ -f internals/_PDCLIB_config.h ]; then rm internals/_PDCLIB_config.h; fi + @if [ -f includes/float.h ]; then rm includes/float.h; fi + @cd functions/_PDCLIB && for file in $(PATCHFILES1); do basfile=`basename $$file`; if [ -f $$basfile ]; then rm $$basfile; fi; done + @cd functions/stdlib && for file in $(PATCHFILES2); do basfile=`basename $$file`; if [ -f $$basfile ]; then rm $$basfile; fi; done + +help: + @echo "Available make targets:" + @echo + @echo "all - build pdclib.a" + @echo "clean - remove all object files, dependency files and test drivers" + @echo "srcdist - build pdclib.tgz (source tarball)" + @echo "test - test a single testdriver (Usage: FILE=\"test.[rt]\" make test)" + @echo "tests - build and run test drivers (link pdclib.a)" + @echo " testdrivers - build but do not run test drivers" + @echo "regtests - build and run regression test drivers (link system clib)" + @echo " regtestdrivers - build but do not run regression test drivers" + @echo "todos - list all TODO comments in the sources" + @echo "fixmes - list all FIXME comments in the sources" + @echo "find - find a phrase in the sources (Usage: FIND=\"phrase\" make find)" + @echo "links - link example platform files (development only)" + @echo "unlink - remove links to example platform files (development only)" + @echo "%.o - build an individual object file" + @echo "%.t - build an individual test driver" + @echo "%.r - build an individual regression test driver" + @echo "help - print this list" + @echo + @echo "Any additional compiler flags you want to use can be passed as USERFLAGS" + @echo "(Usage: USERFLAGS=\"flags\" make [...])." + +%.o: %.c Makefile + @echo " CC $(patsubst functions/%,%,$@)" + @$(CC) $(CFLAGS) -MMD -MP -MT "$*.d $*.t" -I./includes -c $< -o $@ + +%.t: %.c Makefile pdclib.a + @echo " CC $(patsubst functions/%,%,$@)" + @$(CC) $(CFLAGS) -DTEST -I./includes $< pdclib.a -o $@ + +%.r: %.c Makefile + @echo " CC $(patsubst functions/%,%,$@)" + @$(CC) $(CFLAGS) -Wno-format -DTEST -DREGTEST $< -o $@ + diff --git a/user/pdclib/Notes.txt b/user/pdclib/Notes.txt new file mode 100644 index 0000000..a5ec9d2 --- /dev/null +++ b/user/pdclib/Notes.txt @@ -0,0 +1,104 @@ +$Id$ + +Credits +======= + +The vast majority of PDCLib is original work by me. I felt it was the only way +to ensure that the code was indeed free of third-party rights, and thus free to +be released into the Public Domain. + +Another issue was that of coding style, quality and stability of the code, and +the urge to really understand every miniscule part of the code as to be able to +maintain it well once v1.0 has been released. + +That is not to say there are no credits to be given. To the contrary: + +Paul Edwards (author of the PDPCLIB), for inspirational code fragments, thanks. + +P.J. Plauger (author of "The Standard C Library"), for a book without which I +would not have been able to create PDCLib at this quality, thanks. + +Paul Bourke (author of mathlib), for allowing me access to a complete math +library under public domain terms so I could use it as a reference, thanks. + +Peter ("Candy") Bindels (netizen of osdev.org), who located a copy of Cody +& Waite's "Software Manual for the Elementary Functions" for me and saved me +serious cash in the process, thanks. + +Michael Moody, who contributed the generic implementation for to +the Public Domain which can now be found in <_PDCLIB_config.h>, thanks. + +Rod Pemberton, for pointing out several flaws in early versions of PDCLib and +giving other valuable hints, thanks. + +Everyone involved in the first, "public" attempt at PDCLib, for bearing with me +when I restarted from scratch, thanks. + +Everyone bearing with me during the "stdio block", a period of many months in +which PDCLib received not a single update because I was stuck and could not +find the energy to work it out. + +Lennart Fridén and Sammy Nordström, who have been great pals even after I sunk +some other project that had eaten countless hours of work between the three of +us, thanks. + +My wife, daughter, and son for sharing husband and daddy with this strange +machine, thanks. + + +Style +===== + +I followed a set of guidelines in creating PDCLib. If you find some piece that +does not adhere to them, that's a bug worth reporting. I mean it. I am a bit +obsessive when it comes to coding style. ;-) + +- all the stuff that is not part of the standard specification is "hidden" in + the _PDCLIB_* namespace - functions, variables, macros, files, directories. + This is to make it easier to distinguish between what the standard dictates + and what I added to make PDCLib work. + +- any internal includes (i.e. those not specified by the standard) have their + header guards defined in the *including* file, for a tiny bit of performance. + +- I always try to minimize the use of local variables. Wherever possible I used + parameters passed by-value directly, and deferred declaration of locals to the + innermost block of statements, in hopes that it might reduce memory footprint + when the library is compiled with a compiler that is not that great at + optimization. + +- every function, every static data item that could possibly be shared, got its + own implementation file. This means the library itself is probably larger than + strictly necessary, and might take a couple of clock cycles longer to link, + but it reduces size of object files and executables. + +- where possible, I tried to share functionality between similar functions (as + can be seen in the atoi() and strtol() function families). This means one or + two additional function calls, but again reduces memory footprint and eases + maintenance of the library. + +- function arguments are named exactly as in the standard document. + +- the standard is taken quite literally in places. For example, memcpy() really + copies char-wise. This runs contrary to earlier claims of performance, but is + consistent with the *letter* of the standard, and you will probably use your + compiler builtins (through a platform overlay) anyhow. + +- every file has an Id tag, so that it is on file for *every* code file. + +- PDCLib code has no bias towards POSIX; indeed the absence of POSIX tidbits is + one of its hallmarks. However, PDCLib also has no bias *against* POSIX, and + when one platform abstraction is as good as another, I chose the POSIX one for + sheer familiarity. (This is mainly referring to naming and parameter lists of + OS "glue" functions.) + +- identifiers are tersely named, but not cryptically abbreviated, and should be + intuitive enough to allow easy understanding of PDCLib inner workings. + +- I disagree with the notion that good code needs no comments. Code tells you + *how*, but not the *why*, and you have to figure out the *what* yourself. So + I added comments to every nontrivial piece of code explaining my motives and + hopefully keeping overly ambitious editors from repeating my mistakes. The + header files especially should be self-documenting to the point of being a + suitable replacement for any library reference book you might be using. + diff --git a/user/pdclib/Readme.txt b/user/pdclib/Readme.txt new file mode 100644 index 0000000..512ee7f --- /dev/null +++ b/user/pdclib/Readme.txt @@ -0,0 +1,192 @@ +$Id$ + +PDCLib - Public Domain C Library +================================ + +License +------- + +Permission is granted to use, modify, and / or redistribute at will. + +This includes removing authorship notices, re-use of code parts in +other software (with or without giving credit), and / or creating a +commercial product based on it. + +This permission is not revocable by the author. + +This software is provided as-is. Use it at your own risk. There is +no warranty whatsoever, neither expressed nor implied, and by using +this software you accept that the author(s) shall not be held liable +for any loss of data, loss of service, or other damages, be they +incidental or consequential. Your only option other than accepting +this is not to use the software at all. + +A case for Public Domain +------------------------ + +There was a time when you could just post a piece of code to usenet +and say, "I give it away for free; perhaps it's useful for you." + +Then came the lawyers. + +There are building blocks in software engineering that are so basic +that everyone should have free access to them without having to +employ a complete legal department for advice. They should be FREE. +Available for free, free of licensing implications, free of attached +propaganda, free of everything but their useful self. + +Today, even the term "free" has to be defined by several paragraphs +of legal blah-blah. + +Sick and tired of it, the author brought you this piece of software +under a "license" that should not be neccessary in the first place: +"Free" should have been enough. + +Unfortunately, German law does not even *allow* to declare a work to +be "in the Public Domain", so the "free for all" license I intended +had to be made expressively. + +What is it +---------- + +This is a C Standard Library. Nothing more, nothing less. No POSIX +or other extensions, just what's defined in ISO/IEC 9899. + +(Well, this is what it will be when the 1.0 release comes out. See +the "Development Status" section to see what's implemented so far.) + +Internals +--------- + +As a namespace convention, everything (files, typedefs, functions, +macros) not defined in ISO/IEC 9899 is prefixed with _PDCLIB. +The standard defines any identifiers starting with '_' and a capital +letter as reserved for the implementation, and since the chances of +your compiler using an identifier in the _PDCLIB range are slim, +any strictly conforming application should work with this library. + +PDCLib consists of several parts: + +1) standard headers; +2) implementation files for standard functions; +3) internal header files keeping complex stuff out of the standard + headers; +4) the central, platform-specific file _PDCLIB_config.h; +5) platform-specific implementation files; +6) platform-specific, optimized "overlay" implementations (optional). + +The standard headers (in ./includes/) only contain what they are +defined to contain. Where additional logic or macro magic is +necessary, that is deferred to the internal files. This has been done +so that the headers are actually educational as to what they provide +(as opposed to how the library does it). + +Note that there *might* be some feature to remove this additional +level of indirection for a production release, to ease the workload +put on the preprocessor. + +There is a seperate implementation file (in ./function/{header}/) for +every function defined by the standard, named {function}.c. Not only +does this avoid linking in huge amounts of unused code when you use +but a single function, it also allows the optimization overlay to work +(see below). + +(The directory ./functions/_PDCLIB/ contains internal and helper +functions that are not part of the standard.) + +Then there are internal header files (in ./internal/), which contain +all the "black magic" and "code fu" that was kept out of the standard +headers. You should not have to touch them if you want to adapt PDCLib +to a new platform. Note that, if you *do* have to touch them, I would +consider it a serious design flaw, and would be happy to fix it in the +next PDCLib release. Any adaption work should be covered by the steps +detailed below. + +For adapting PDCLib to a new platform (the trinity of CPU, operating +system, and compiler), make a copy of ./platform/example/ named +./platform/{your_platform}/, and modify the files of your copy to suit +the constraints of your platform. When you are done, copy the contents +of your platform directory over the source directory structure +of PDCLib (or link them into the appropriate places). That should be +all that is actually required to make PDCLib work for your platform. + +Of course, your platform might provide more efficient replacements +for the generic implementations offered by PDCLib. The math functions +are an especially "juicy" target for optimization - while PDCLib does +provide generic implementations for each of them, there are usually +FPU opcodes that do the same job, only orders of magnitude faster. For +this, you might want to create an "optimization overlay" for PDCLib. + +Optimization Overlay +-------------------- + +The basic idea of PDCLib is to provide a generic implementation that +is useable even on platforms I have never heard of - for example, the +OS and/or compiler *you* just wrote and now need a C library for. That +is actually what PDCLib was written for: To provide a C library for +compiler and OS builders that do not want the usual baggage of POSIX +and GNU extensions, licensing considerations etc. etc. + +Thus, PDCLib provides generic implementations. They do work, and do +so correctly, but they are not very efficient when compared to hand- +crafted assembler or compiler build-ins. So I wanted to provide a +means to modify PDCLib to run more efficiently on a given platform, +without cluttering the main branch with tons of #ifdef statements and +"featureset #defines" that grow stale quickly. + +The solution is the "optimization overlay". Every function has its +own implementation file, which makes it possible to replace them +piecemeal by copying a platform-specific overlay over the main PDCLib +branch to create a PDCLib adapted / optimized for the platform in +question. That overlay could be part of the PDCLib source tree (for +established platforms where maintainers won't bother with PDCLib), or +part of that platform's source tree (for under-development platforms +PDCLib maintainers won't bother with). + +So, to use PDCLib on your given platform, you unpack PDCLib (as you +obviously have done already since you are reading this), and copy +the overlay for your platform over the PDCLib source tree structure. + +Development Status +------------------ + +v0.1 - 2004-12-12 +Freestanding-only C99 implementation without any overlay, and missing +the INTN_C() / UINTN_C() macros. still has the enquire.c +values hardcoded into it; not sure whether to include enquire.c in the +package, to leave to the overlay, or devise some parameterized +macro magic as for / . Not thoroughly tested, but +I had to make the 0.1 release sometime so why not now. + +v0.2 - 2005-01-12 +Adds implementations for (excluding strerror()), INTN_C() / +UINTN_C() macros, and some improvements in the internal headers. +Test drivers still missing, but added warnings about that. + +v0.3 - 2005-11-21 +Adds test drivers, fixes some bugs in . + +v0.4 - 2005-02-06 +Implementations for parts of . Still missing are the floating +point conversions, and the wide-/multibyte-character functions. + +v0.4.1 - 2006-11-16 +With v0.5 () taking longer than expected, v0.4.1 was set up as +a backport of bugfixes in the current development code. +- #1427211 realloc( NULL, size ) fails (fixed) +- #1427548 stdlib.h - insufficient documentation (fixed) +- #1428100 Misspelled name in credits (fixed) +- #1428101 malloc() splits off too-small nodes (fixed) +- #1494254 qsort() stack overflow (fixed) +- #1514883 malloc() bug in list handling (fixed) +- #1527437 strncmp() does not terminate at '\0' (fixed) +- #1529792 stdint.h dysfunctional (fixed) +- #1529796 NULL redefinition warnings (fixed) + +v0.5 - unreleased +Implementations for parts of . Still no locale / wide-char +support. Enabled all GCC compiler warnings I could find, and fixed +everything that threw a warning. (You see this, maintainers of Open +Source software? No warnings whatsoever. Stop telling me it cannot +be done.) Fixed all known bugs in the v0.4 release. + diff --git a/user/pdclib/functions/_PDCLIB/Xdigits.c b/user/pdclib/functions/_PDCLIB/Xdigits.c new file mode 100644 index 0000000..7568474 --- /dev/null +++ b/user/pdclib/functions/_PDCLIB/Xdigits.c @@ -0,0 +1,27 @@ +/* $Id$ */ + +/* _PDCLIB_Xdigits + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef _PDCLIB_INT_H +#define _PDCLIB_INT_H _PDCLIB_INT_H +#include <_PDCLIB_int.h> +#endif + +char _PDCLIB_Xdigits[] = "0123456789ABCDEF"; + +#ifdef TEST +#include <_PDCLIB_test.h> + +#include + +int main( void ) +{ + TESTCASE( strcmp( _PDCLIB_Xdigits, "0123456789ABCDEF" ) == 0 ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/_PDCLIB/Xdigits.d b/user/pdclib/functions/_PDCLIB/Xdigits.d new file mode 100644 index 0000000..dba9bc1 --- /dev/null +++ b/user/pdclib/functions/_PDCLIB/Xdigits.d @@ -0,0 +1,9 @@ +functions/_PDCLIB/Xdigits.d functions/_PDCLIB/Xdigits.t: \ + functions/_PDCLIB/Xdigits.c internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/_PDCLIB/Xdigits.o b/user/pdclib/functions/_PDCLIB/Xdigits.o new file mode 100644 index 0000000000000000000000000000000000000000..51441eec1c71190296edf9be678342e2b72c40a2 GIT binary patch literal 1816 zcma)6OK;Oa5T1?mD5MPufdi_LQdFQw)GlpWN`WGpwh*WgLMj3-!Aac2G;ylfMny;z z35gT0N}S=s58)Re{t9OfFyDGNam$5~X1Ir^ z6nehf@|h!!;Ns0rt28P^B`jL6KMd|(LsMheL!}3U{Tb0UEX=<|`dO;X9FkKF%HGe@h zM5h0u8`yQmpdVpdYk{*HklC~Yo6NfJv+C5tR?V*0`_6MR`%Xu#xZYMzdpoY@#C;YlnDOgr(sB6nkLX3l*LhVfkTBluEtNtq>PA!j>FZ1uIWwm#AtKi!#C333{J#-7(@+gpjN!ZXCB&5UOUD- z%8Ya5nQ_*5y(Z5Y|B$A5PkId)Ur*AnKXKo|*BbTXoxqOo2pioD$&g<-Zp%k;uwck9 zF)%qF@A8lgdBV7zC4SQ-VSWYlGkhHmKPU3;2%Z<_BzQo`0iINdhgxun(+Vem+@huY h3kt6*Tvdp79(5ile5~-P!j{54h3|me1n#n6@fX-m#y9`~ literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/_PDCLIB/assert.c b/user/pdclib/functions/_PDCLIB/assert.c new file mode 100644 index 0000000..ed56fc6 --- /dev/null +++ b/user/pdclib/functions/_PDCLIB/assert.c @@ -0,0 +1,74 @@ +/* $Id$ */ + +/* _PDCLIB_assert( char const * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include +#include + +#ifndef REGTEST + +#ifndef _PDCLIB_AUX_H +#define _PDCLIB_AUX_H _PDCLIB_AUX_H +#include <_PDCLIB_aux.h> +#endif + +#if _PDCLIB_C_VERSION == 99 +void _PDCLIB_assert( char const * const message1, char const * const function, char const * const message2 ) +{ + fputs( message1, stderr ); + fputs( function, stderr ); + fputs( message2, stderr ); + abort(); +} +#else +void _PDCLIB_assert( char const * const message ) +{ + fputs( message, stderr ); + abort(); +} +#endif + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> +#include + +static int EXPECTED_ABORT = 0; +static int UNEXPECTED_ABORT = 1; + +static void aborthandler( int sig ) +{ + TESTCASE( ! EXPECTED_ABORT ); + exit( (signed int)rc ); +} + +#define NDEBUG +#include + +static int disabled_test( void ) +{ + int i = 0; + assert( i == 0 ); /* NDEBUG set, condition met */ + assert( i == 1 ); /* NDEBUG set, condition fails */ + return i; +} + +#undef NDEBUG +#include + +int main( void ) +{ + TESTCASE( signal( SIGABRT, &aborthandler ) != SIG_ERR ); + TESTCASE( disabled_test() == 0 ); + assert( UNEXPECTED_ABORT ); /* NDEBUG not set, condition met */ + assert( EXPECTED_ABORT ); /* NDEBUG not set, condition fails - should abort */ + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/_PDCLIB/assert.d b/user/pdclib/functions/_PDCLIB/assert.d new file mode 100644 index 0000000..f0a17ab --- /dev/null +++ b/user/pdclib/functions/_PDCLIB/assert.d @@ -0,0 +1,16 @@ +functions/_PDCLIB/assert.d functions/_PDCLIB/assert.t: \ + functions/_PDCLIB/assert.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdlib.h \ + includes/assert.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdlib.h: + +includes/assert.h: diff --git a/user/pdclib/functions/_PDCLIB/assert.o b/user/pdclib/functions/_PDCLIB/assert.o new file mode 100644 index 0000000000000000000000000000000000000000..95e7ee907c135058645172083450c0231b12ded8 GIT binary patch literal 3348 zcmb7GONbm*6uqyidZs(w)0uBFl1Mtt6|ps26meEUJ2xhhStWLH zSN@S$7#LIeJOu^I;80@Oxk4m6rtD&D&Cr_D*38@(tt(u$x6li;slcW84bUr}Nn%*= zDr^+4IW&`K_ZA*4An#AnB#RvoNBxCS4L}jb3XwUDmXm1&k=RaVKdg2(^Bw)2eHd*u za2=5O1%vhL28;t)>(+C?!Oy9>O_enzg8;Gq?n#bhPEq{l1V%)7j8RqAr(|W;Q?dr% zq~r{KNyrYKhBD)l|Nec9*+~qW?V>sceeMeNE7cJImdbHqdss0EYs$%OVZ0HwD;5j6 zZ)hD=oMTN5=RTx3rp58xCW_-)oXkB=aYAuPYiex{TPgM`9jcT&#mKAU9IUBnbmR-z zSEwCOs|gJK4!#2^zZ(iQLDqUh@;6eFlRuo2vQoGNC&#&rv9J%8p%Dzub{2~>{x$?l z&R|sPR&fX;lo0S=?*`SV(GJ4${1XRfkIfwrw~VdxJAu~>W4_w#)_iQR7lwW(a;u!C zednv~px#(;7kMI#4zqiTFse1$U~McVnfT10GYi?>{Cmo>m{~6iOphE2bOoO!@+?`> zWd~zgkFj^~uEO;M96KOae@ zTla%nq755oscrdT=q>o$4YLEYy{H=|e)Xkx2)}L+HWmWER;n&~9VsuiTYi~rvjGg- zVY!P=mX~VPW}_nEV!IQSk|}&`uzI6*Mi#xG*7OB28{DCOSo*}F;mFj)Y@#&V!9pn> z=wtd*uOX=;$4{1KOEd0_`(WaqYv5J1sXGfp5Hqwwt;6n zL+8L;GXl`q4y1URcf!CI*^puPK#{KF3hRK8b+8Af4&DT24p_N~--dU|Xfn3rkkj#g z#3jbM7>{V;Jq_N>0W0Uxpa;lkGPV|E!_)K`{Mb`N#@2u$z3$D_x+p1G_hs;A4rAOv zyb>8r#`YrQbi6+hkM9lZ7{X)fcpW_Fa9>D&B3{P?flQXqC5^^!F(Wb!ogw4*0Tij} zauI%MGB)nH;c2H|x_``%bQMp!4hPAbI!0kLb?^d1>Iq##yss0fzZTc*T?;+qBtBlY zLAeUzN<56m_*^p`?yVxgN*x^3e=!{um4(d_t;5~hF+_%zQ^2WR5{&#`7 zZuCu|Z`S%!Hwwk8;FgQO=@d4Ddt)Ir{$^3WU(01J^EZI@St3&Ad#}(s9C=Y_0jna$ zzimL~tZ)eK)wrIB56Czk>y#^b!B8c%C%XpFy*U_Y +#include +#include + +_PDCLIB_intmax_t _PDCLIB_atomax( const char * s ) +{ + _PDCLIB_intmax_t rc = 0; + char sign = '+'; + const char * x; + /* TODO: In other than "C" locale, additional patterns may be defined */ + while ( isspace( *s ) ) ++s; + if ( *s == '+' ) ++s; + else if ( *s == '-' ) sign = *(s++); + /* TODO: Earlier version was missing tolower() but was not caught by tests */ + while ( ( x = memchr( _PDCLIB_digits, tolower(*(s++)), 10 ) ) != NULL ) + { + rc = rc * 10 + ( x - _PDCLIB_digits ); + } + return ( sign == '+' ) ? rc : -rc; +} + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + /* basic functionality */ + TESTCASE( _PDCLIB_atomax( "123" ) == 123 ); + /* testing skipping of leading whitespace and trailing garbage */ + TESTCASE( _PDCLIB_atomax( " \n\v\t\f123xyz" ) == 123 ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/_PDCLIB/atomax.d b/user/pdclib/functions/_PDCLIB/atomax.d new file mode 100644 index 0000000..416f238 --- /dev/null +++ b/user/pdclib/functions/_PDCLIB/atomax.d @@ -0,0 +1,11 @@ +functions/_PDCLIB/atomax.d functions/_PDCLIB/atomax.t: \ + functions/_PDCLIB/atomax.c internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/string.h + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/string.h: diff --git a/user/pdclib/functions/_PDCLIB/atomax.o b/user/pdclib/functions/_PDCLIB/atomax.o new file mode 100644 index 0000000000000000000000000000000000000000..265d819347002e1fd2da3f13762d74b14cf6f7f5 GIT binary patch literal 3452 zcma)8U2GIp6h3!mwlj3w-EFI=0mG6MDMEJ<>K`B=?TU>+6etN%SZ23FchmjL?kqwA z0n=dEG#d292aUeyn~z2?A*KWr0*O%{6p7(QjWw-N0tpY8;Q40m-JMnwJ;~hf{M~cz zIrrX~IiA|~oDhN(3DT)05&hieTLwJnqX+0d8fpBpXV=7R{8DNf+DoZfz?Z38D`$*} zlqIJBx_9s1WNb2JML(tJ=Tl_ zsau|5-DGNZ{BrwbYI=N%#QC%Boav4;Exu`7ncR2#GbC=@Sn*ZkX5;GlyGz97uIr7| zbYo<8Mx1WuN1%q$>n-cjP_Km;jiFxSlF^I#p1zT~J#p+d)lZ)|c59^@<$RMPvv;md zd`ow(&$RjC#Kri_`}bWS(Iu8edct~SQKU!ombV_3I{bje1DjD@5})`i!H zhkJ-ZzMiPf5aBSig0*HJyDaV`vJzrbhwr_-W4H%_H@CrKL5OtA52EqP+Xv=|VHRZy zSUaM;4rJ?mga8pChIcvu*?e##v0`MW36vk#6rk0+YJ4& zA6a8=WBG(;S^&fRl~pG!a|jSKyP%AlX-HFK4njO3%r%gC&UQv&@<5uoo=3yn!=pu( zIL;^{Vw?e_>gneI3upW?^{V<7c->pC$##**@!W6-P zg+wW4Bg%I16y^y+8#Fq|qY!r^ojiKC3&w->Qr69vOSNSB#i7A%!&@kkOnkpxd$i|=RaS1b z_H;~pa-sEsW@1TL3qKmU1`xBDw}5DgMs+^6J}vcR@H^QRJEM~O3xb6f^CJ(9Cu2~( z1)m}ny;SS#1KNT-^tjAje@4ApYwsvF1A;u&LAyOIM_L6^Xc z=Ew3LlPTDxacJy9sa^zAtJqnG3gyyR+#3+1$;?}Ey;RGOm7LKy)Pl61re3LVjIBFH z;)C&l#6V(g)7^_%BicGRxGvr|lBt*6y6@6IQ1_(ASI8+b>=Bb7an$NCj8nY5*hfX! zzh@)XmXlg%Xzzsax_7h^wIfB>&QPM}R(;GVuIdyLu5;L>#Hj7sl*rU-%sQF+SlZ5H zs?H%wz{S_(O9#tAxsWe8%DYg`22GWEreqf#4%V7(SMAamRDLvG0wuELV$tCpNtDX2 zli=p`*IYY09-MZt%7IjU{|A?_6E2AS{wWyQl3JNR`4R?=L}-uDeh`G;dOD;KgDS`j~(0kW#vkEYYy=IPB_t?a10MLOZHuthrI +#endif + +char _PDCLIB_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz"; + +#ifdef TEST +#include <_PDCLIB_test.h> + +#include + +int main( void ) +{ + TESTCASE( strcmp( _PDCLIB_digits, "0123456789abcdefghijklmnopqrstuvwxyz" ) == 0 ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/_PDCLIB/digits.d b/user/pdclib/functions/_PDCLIB/digits.d new file mode 100644 index 0000000..4df8fb5 --- /dev/null +++ b/user/pdclib/functions/_PDCLIB/digits.d @@ -0,0 +1,9 @@ +functions/_PDCLIB/digits.d functions/_PDCLIB/digits.t: \ + functions/_PDCLIB/digits.c internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/_PDCLIB/digits.o b/user/pdclib/functions/_PDCLIB/digits.o new file mode 100644 index 0000000000000000000000000000000000000000..ab2d45d8396f623ff149b6214fce463ebaab3a48 GIT binary patch literal 1844 zcma)6Ur!T35TEV!4_c_y#s@=8N&*oRxPlZ=h-fTIszi+mCi;TC_Gk~2l4gH|))3%h}p)cU-Ugq~{0W&ePq!X9yH|F`g@Ajoe5s zFHVc$G*M!Vvf1UVF+gM}HAj>bqFN9IqSPo=3#BYkI&u_Kl_3V=)OkMu}v~aRV}vsVl1ykIJbm=pFNOW)-&)g~3Ci>pM-?ZWOU2rPf=u9{DY=7Zi`UOD(Tsm*8zX zjK1fWLf`I{x{Z3A|#Yamc=vcur!|I*&Vx?F%%jRrs zNkr3XrLtI@Shqqq2&0Ipawx623u*?L{$3}jS&Tt1!j{$odp97nQ44BhTE5S!ZH3K^ znq~Fu9Wr}%Ta7sGrl-Aa$F<|WZfLo+j@_Tl$;qsHosP{FnywevChuU%4{CLs^MBI_ zN8%mvJ(m={A7wBkm5NhGoO)(-jrDP6O+}@gXXJ;{k87!M4LTn#Kk{ip+yiYeYTt59 zhZ}DK_fC_J!>vD|2N^%`hTbyrOQjSu)nnDrc1=`I^fP!wt3Bet~;*Go3y`_(?w z9A9^m-y+t*x#Bp)bzB~`= zGlL&-Z(@Nu4j51Im7DgH$4)U1GGiaZ%-Cx@-wW4;4OE*i?9+@D-4YkoB +#include +#include + +#include <_PDCLIB_glue.h> + +_PDCLIB_size_t _PDCLIB_flushbuffer( struct _PDCLIB_file_t * stream, _PDCLIB_size_t written, int retries ) +{ + _PDCLIB_size_t n = stream->bufidx - written; + int count = _PDCLIB_write( stream, stream->buffer + written, ( n <= INT_MAX ? (int)n : INT_MAX ) ); + written += count; /* if count is -1, we don't need written anyway */ + switch ( count ) + { + case -1: + /* write error */ + stream->status |= _PDCLIB_ERRORFLAG; + /* FIXME: Map host errno to PDCLib errno */ + return 0; + case 0: + /* no characters written - retry */ + if ( retries == _PDCLIB_FLUSH_RETRIES ) + { + /* max. number of retries without characters being written */ + stream->status |= _PDCLIB_ERRORFLAG; + /* FIXME: Set errno */ + return 0; + } + _PDCLIB_FLUSH_RETRY_PREP; + return _PDCLIB_flushbuffer( stream, written, retries + 1 ); + default: + /* If the following assert fails, we wrote more characters than + available in the buffer. (???) + */ + assert( written <= stream->bufidx ); + if ( written == stream->bufidx ) + { + /* write complete */ + stream->bufidx = 0; + return written; + } + return _PDCLIB_flushbuffer( stream, written, 0 ); + } +} + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif + diff --git a/user/pdclib/functions/_PDCLIB/fflush.d b/user/pdclib/functions/_PDCLIB/fflush.d new file mode 100644 index 0000000..8ffaa59 --- /dev/null +++ b/user/pdclib/functions/_PDCLIB/fflush.d @@ -0,0 +1,18 @@ +functions/_PDCLIB/fflush.d functions/_PDCLIB/fflush.t: \ + functions/_PDCLIB/fflush.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/limits.h \ + includes/assert.h internals/_PDCLIB_glue.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/limits.h: + +includes/assert.h: + +internals/_PDCLIB_glue.h: diff --git a/user/pdclib/functions/_PDCLIB/fflush.o b/user/pdclib/functions/_PDCLIB/fflush.o new file mode 100644 index 0000000000000000000000000000000000000000..e6c413c052b9ad5d4ac4a00e5021c7329215a259 GIT binary patch literal 3880 zcmb7HZHQb~8Gg^bcXsb&W@kTUldfh;+o6VT6#1cXmp)C$Gvv+1k zXYZtQ?=)MhRtN!?ElBi-BKT3nj~^}iLujCaK_f+^;*Ua6&>u=c*@98}qtNR5Jm;P> zbJGgqyUcmsuk)Vwyyw05+aRBv6qv6TVrX0Gq;?LD)z=I>n0yKDLFvy1-rBa0rqx4p%`z60ZS_065? zo2r_}c;&6Vc3H+ozxdK`eL7#5zs@E9_H_(bzA)tu=Kj0G?o&I}sVg@W z7urEGXK!0;_c1+d_GC35&A$v6#sqq8qPKVqppzQ94JN_9ygW-s#M^zpo%P<}zy76& znpXD|iaED%urRG=)YO=WvnaXT>70wTT*DSbyh&(Riz1l=;ucQiPHJJSsB$?93YPJS zq2>5K5x=P1g0^O8%^GWFwMgr}viev)33MpGTIAx(WAw{qhEW{&<(I_uljSH*Ks2jU zEKpo6F6AjqDz#c)*Rv;zQIF6U; zgt53@rVfqkXBGgSw+uH|jU9lHxgUdb>mF#veCO@Uz;U*n^A1(c0wm(U63LUyCn^5> zB1S~`3_M-se}$5hxj@Moze&j(&rWAx`R9Ci!pJj~fYQ9r590kBk- z3%gT_NjM8$_ECz{>Vy{a*@F~k)bm=L%Dx74i$DMP7t`pL!ajn$$7C4Xbz)-Z}QGnq=0_HOWO<(y3hYa^KRDF3~kV zAEFf#%f`ef;IC#9OSfrJaoP1Uxs2geD5f|RW!f8`;bOvqI?}+X)Z2v#jQYjE zsjWfSj61zBs?;u=T{*vcM#>eOanKLzU1Zg2bqCQ#xye!*hg!22wmR+d2K&Y8FeOpo zbaWfx7}_s6$BOMg__NP-{MpO?E6$U4wBd)BYmC6AQ4oiHdZ zeW;8M7I`p=f<7}Xwd$C-exh`_--+WOEPeD;DT@0+ee>w)#-P<%-$H1!tI{w*y$_gM zL7&m|tI(0yV|iTs!23kDx+4Sgaum5&+c3xzlzSLnvyoAjcqFA8Mn{=cwh>K_s;rcUG$n&8BH3+W|(ss4_s^E0@-r-A+TIjb1-44X1LA zq~x+u57)ba*uoFnX?UE1OglV3xox^$9Wl7i)HWE|_Eu{hJ3ROBT4|-UR9-57Sem^7 z%tU8^@5 z{oqL{(uGh#UuZ06)&BAD=M3 z$SCu{BP~-%k&SmBboBpUe!TS4AsFxPsd(0Q=3Rajyt4RsTe9qFDAN1*3HI?2jNAun zVE4i6%gzBSc^JM%#*no=3^^U|Eqp$3UyMhz@jeZnbM%`O_+1!ynOLG9sfC}7P5EF3 z-*sdRS=#`z>VBk9d5} zxL<6281Eb4Ifv&*x`ud9+aQq1^7lQ1)-R8*iACrvSwCKvsp)bIerd9{8&F!FcKW63 zXY2ek*wXu$OYMUnPqr@8;BAkBmB$h96*7kGT10!cG`)c@vSldm0M8hV$2xJ%bi5FD;GV|c-q z??3jy@zD*Gx;O2u#JhELdDr#V31gnb&q0bmB;qjHI|?PbY4A4&e@8n~=NAb5_&!l6 zHLIa;&g=u?euM8LqG|3lcsCLKRWbGl46Yb_$lzlJI|jE5^4VnkXASawMfsZspELL) zgD)7oZtzzIUp4p_ga0(hFHFXpGI*E4vcXdZA2C=XVt-A8Z6X@!lCgi$;IjsQVDP5~ ce@;Z5dt4uJbUiUx + +/* Helper function that parses the C-style mode string passed to fopen() into + the PDCLib flags FREAD, FWRITE, FAPPEND, FRW (read-write) and FBIN (binary + mode). +*/ +unsigned int _PDCLIB_filemode( char const * const mode ) +{ + int rc = 0; + switch ( mode[0] ) + { + case 'r': + rc |= _PDCLIB_FREAD; + break; + case 'w': + rc |= _PDCLIB_FWRITE; + break; + case 'a': + rc |= _PDCLIB_FAPPEND; + break; + default: + /* Other than read, write, or append - invalid */ + return 0; + } + for ( size_t i = 1; i < 4; ++i ) + { + switch ( mode[i] ) + { + case '+': + if ( rc & _PDCLIB_FRW ) return 0; /* Duplicates are invalid */ + rc |= _PDCLIB_FRW; + break; + case 'b': + if ( rc & _PDCLIB_FBIN ) return 0; /* Duplicates are invalid */ + rc |= _PDCLIB_FBIN; + break; + case '\0': + /* End of mode */ + return rc; + default: + /* Other than read/write or binary - invalid. */ + return 0; + } + } + /* Longer than three chars - invalid. */ + return 0; +} + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( _PDCLIB_filemode( "r" ) == _PDCLIB_FREAD ); + TESTCASE( _PDCLIB_filemode( "w" ) == _PDCLIB_FWRITE ); + TESTCASE( _PDCLIB_filemode( "a" ) == _PDCLIB_FAPPEND ); + TESTCASE( _PDCLIB_filemode( "r+" ) == ( _PDCLIB_FREAD | _PDCLIB_FRW ) ); + TESTCASE( _PDCLIB_filemode( "w+" ) == ( _PDCLIB_FWRITE | _PDCLIB_FRW ) ); + TESTCASE( _PDCLIB_filemode( "a+" ) == ( _PDCLIB_FAPPEND | _PDCLIB_FRW ) ); + TESTCASE( _PDCLIB_filemode( "rb" ) == ( _PDCLIB_FREAD | _PDCLIB_FBIN ) ); + TESTCASE( _PDCLIB_filemode( "wb" ) == ( _PDCLIB_FWRITE | _PDCLIB_FBIN ) ); + TESTCASE( _PDCLIB_filemode( "ab" ) == ( _PDCLIB_FAPPEND | _PDCLIB_FBIN ) ); + TESTCASE( _PDCLIB_filemode( "r+b" ) == ( _PDCLIB_FREAD | _PDCLIB_FRW | _PDCLIB_FBIN ) ); + TESTCASE( _PDCLIB_filemode( "w+b" ) == ( _PDCLIB_FWRITE | _PDCLIB_FRW | _PDCLIB_FBIN ) ); + TESTCASE( _PDCLIB_filemode( "a+b" ) == ( _PDCLIB_FAPPEND | _PDCLIB_FRW | _PDCLIB_FBIN ) ); + TESTCASE( _PDCLIB_filemode( "rb+" ) == ( _PDCLIB_FREAD | _PDCLIB_FRW | _PDCLIB_FBIN ) ); + TESTCASE( _PDCLIB_filemode( "wb+" ) == ( _PDCLIB_FWRITE | _PDCLIB_FRW | _PDCLIB_FBIN ) ); + TESTCASE( _PDCLIB_filemode( "ab+" ) == ( _PDCLIB_FAPPEND | _PDCLIB_FRW | _PDCLIB_FBIN ) ); + TESTCASE( _PDCLIB_filemode( "x" ) == 0 ); + TESTCASE( _PDCLIB_filemode( "r++" ) == 0 ); + TESTCASE( _PDCLIB_filemode( "wbb" ) == 0 ); + TESTCASE( _PDCLIB_filemode( "a+bx" ) == 0 ); + return TEST_RESULTS; +} + +#endif + diff --git a/user/pdclib/functions/_PDCLIB/filemode.d b/user/pdclib/functions/_PDCLIB/filemode.d new file mode 100644 index 0000000..d5ab966 --- /dev/null +++ b/user/pdclib/functions/_PDCLIB/filemode.d @@ -0,0 +1,12 @@ +functions/_PDCLIB/filemode.d functions/_PDCLIB/filemode.t: \ + functions/_PDCLIB/filemode.c includes/stddef.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_aux.h + +includes/stddef.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/_PDCLIB/filemode.o b/user/pdclib/functions/_PDCLIB/filemode.o new file mode 100644 index 0000000000000000000000000000000000000000..4e874f4e71ff46f1f375e9a28516efd98494e97f GIT binary patch literal 2824 zcma)8Ux-vy82`?_GdovjoY_CQSSHMtn_4-ev=ta_<~oTb7QsGP)HZ+a&JNDb$jqHJ zBhwfpWwX+t9)jwzmmne{BE;xHg&uqt!&WjFxgSfX2~YLVEoFl3x(^fxN>m0aD92!I~{Xu!cuT| zw^us0=fwG7y4$;_GtJ;DJ0Y6b8J%q>vuy!8c^r8L)=8*R$7xJ~TNw}QWxA->J$l_; zdQ&SdeWOOyWO^*=rq`!O)TkOB5^*+4GC7@eJrUQiX_45txal3qhmw28MB+L1NGcRJ zrS^_7a_5kOVJP1Ba#o8Zro{EaAc|fRun=a=WmVu*Vi zYsJ+#W|dLYlWbAq(8rimhOBc&60NeRkx4Ba@}2}b?;mg+EQSG`90_7XW&rOI^|qyh>k!hNfbguYf_oLiuEefS``zAm({0u|+f)ke z+Drai(2xC_*iTh&HmX@YbsFtjwc%H?yaauryijaOexbSO=gHPP17x*s*lB*PhqU1_#T%n3z>Qv{7rBcgZl3dHL8%?b--;B!jTEn;A^=3J0 zI@BpOii@~}k?>-x*r-w!=0|zSm79x;KDM80Gy^|}9&K$0#qz;u*nA6#?4JG)u7?vZ zCEg}Ye2=3y$=-uu{j@_5m3~*7i8$Xuco##6rh>eB^AtXTaMS zu#&{axi?GJR)fOwv^@wv_R5mA@$jN`uSDvC?bkgD-o`M;^T?MaW60W$K#u174N3Sd za33iQyN}nwGiDnG=@sN#30XbU#__H}>sLd9joKretlx*m&zerNP=x45`V7PJl;471 zw0}126WF5r=tcH10vr8!KIF0VK79ql*L`VFi#5ZCHZ)#iFqCTn84TuQpI9@R?-~>v zptBTRyVVh+`k4H2BWk<(KOyFiu7q;5B4yi!FpH~i^dO_FZ)8-Cc8c-5IRkR_$wy`U z4-z3)?|h(ebyuTurk~+5)T7*O1Ck#Gq@PNS=3|0-+4IVbwHTVV*_0Af6hlsntH-YQ=(&*0_3=Hc1V6w=& O!aVDUYee`9P5CcU6@xJV literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/_PDCLIB/print.c b/user/pdclib/functions/_PDCLIB/print.c new file mode 100644 index 0000000..d47a48d --- /dev/null +++ b/user/pdclib/functions/_PDCLIB/print.c @@ -0,0 +1,776 @@ +/* $Id$ */ + +/* _PDCLIB_print( const char *, struct _PDCLIB_status_t * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include +#include +#include +#include + +/* Using an integer's bits as flags for both the conversion flags and length + modifiers. +*/ +#define E_minus 1<<0 +#define E_plus 1<<1 +#define E_alt 1<<2 +#define E_space 1<<3 +#define E_zero 1<<4 +#define E_done 1<<5 +#define E_char 1<<6 +#define E_short 1<<7 +#define E_long 1<<8 +#define E_llong 1<<9 +#define E_intmax 1<<10 +#define E_size 1<<11 +#define E_ptrdiff 1<<12 +#define E_intptr 1<<13 +#define E_ldouble 1<<14 +#define E_lower 1<<15 +#define E_unsigned 1<<16 + +/* This macro delivers a given character to either a memory buffer or a stream, + depending on the contents of 'status' (struct _PDCLIB_status_t). + x - the character to be delivered + i - pointer to number of characters already delivered in this call + n - pointer to maximum number of characters to be delivered in this call + s - the buffer into which the character shall be delivered +*/ +#define DELIVER( x ) \ +do { \ + if ( status->i < status->n ) { \ + if ( status->stream != NULL ) { \ + status->stream->buffer[status->stream->bufidx++] = x; \ + if ( ( status->stream->bufidx == status->stream->bufsize ) \ + || ( ( status->stream->status & _IOLBF ) && ( x == '\n' ) ) \ + || ( status->stream->status & _IONBF ) ) \ + fflush( status->stream ); \ + } else \ + status->s[status->i] = x; \ + } \ + ++(status->i); \ +} while ( 0 ) + +/* This function recursively converts a given integer value to a character + stream. The conversion is done under the control of a given status struct + and written either to a character string or a stream, depending on that + same status struct. The status struct also keeps the function from exceeding + snprintf() limits, and enables any necessary padding / prefixing of the + output once the number of characters to be printed is known, which happens + at the lowermost recursion level. +*/ +static void int2base( intmax_t value, struct _PDCLIB_status_t * status ) +{ + /* Registering the character being printed at the end of the function here + already so it will be taken into account when the deepestmost recursion + does the prefix / padding stuff. + */ + ++(status->this); + if ( ( value / status->base ) != 0 ) + { + /* More digits to be done - recurse deeper */ + int2base( value / status->base, status ); + } + else + { + /* We reached the last digit, the deepest point of our recursion, and + only now know how long the number to be printed actually is. Now we + have to do the sign, prefix, width, and precision padding stuff + before printing the numbers while we resurface from the recursion. + */ + /* At worst, we need two prefix characters (hex prefix). */ + char preface[3] = "\0"; + size_t preidx = 0; + if ( ( status->flags & E_alt ) && ( status->base == 16 || status->base == 8 ) ) + { + /* Octal / hexadecimal prefix for "%#" conversions */ + preface[ preidx++ ] = '0'; + if ( status->base == 16 ) + { + preface[ preidx++ ] = ( status->flags & E_lower ) ? 'x' : 'X'; + } + } + if ( value < 0 ) + { + /* Negative sign for negative values - at all times. */ + preface[ preidx++ ] = '-'; + } + else if ( ! ( status->flags & E_unsigned ) ) + { + /* plus sign / extra space are only for unsigned conversions */ + if ( status->flags & E_plus ) + { + preface[ preidx++ ] = '+'; + } + else if ( status->flags & E_space ) + { + preface[ preidx++ ] = ' '; + } + } + { + size_t prec_pads = ( status->prec > status->this ) ? ( status->prec - status->this ) : 0; + if ( ! ( status->flags & ( E_minus | E_zero ) ) ) + { + /* Space padding is only done if no zero padding or left alignment + is requested. Leave space for any prefixes determined above. + */ + /* The number of characters to be printed, plus prefixes if any. */ + /* This line contained probably the most stupid, time-wasting bug + I've ever perpetrated. Greetings to Samface, DevL, and all + sceners at Breakpoint 2006. + */ + size_t characters = preidx + ( ( status->this > status->prec ) ? status->this : status->prec ); + if ( status->width > characters ) + { + for ( int i = 0; i < status->width - characters; ++i ) + { + DELIVER( ' ' ); + /* + do + { + if ( status->i < status->n ) + { + if ( status->stream != 0 ) + do + { + status->stream->buffer[status->stream->bufidx++] = (char)' ', + if ( ( status->stream->bufidx == status->stream->bufsize ) + || ( ( status->stream->status & 2 ) && (char)' ' == '\n' ) + || ( status->stream->status & 4 ) ) + fflush( status->stream ) + } while (0), + ' '; + else status->s[status->i] = ' '; + } + ++(status->i); + } while ( 0 ); + */ + ++(status->this); + } + } + } + /* Now we did the padding, do the prefixes (if any). */ + preidx = 0; + while ( preface[ preidx ] != '\0' ) + { + DELIVER( preface[ preidx++ ] ); + ++(status->this); + } + if ( ( ! ( status->flags & E_minus ) ) && ( status->flags & E_zero ) ) + { + /* If field is not left aligned, and zero padding is requested, do + so. + */ + while ( status->this < status->width ) + { + DELIVER( '0' ); + ++(status->this); + } + } + /* Do the precision padding if necessary. */ + for ( int i = 0; i < prec_pads; ++i ) + { + DELIVER( '0' ); + } + } + } + /* Recursion tail - print the current digit. */ + { + int digit = value % status->base; + if ( digit < 0 ) + { + digit *= -1; + } + if ( status->flags & E_lower ) + { + /* Lowercase letters. Same array used for strto...(). */ + DELIVER( _PDCLIB_digits[ digit ] ); + } + else + { + /* Uppercase letters. Array only used here, only 0-F. */ + DELIVER( _PDCLIB_Xdigits[ digit ] ); + } + } +} + +const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status ) +{ + const char * orig_spec = spec; + if ( *(++spec) == '%' ) + { + /* %% -> print single '%' */ + DELIVER( *spec ); + return ++spec; + } + /* Initializing status structure */ + status->flags = 0; + status->base = 0; + status->this = 0; + status->width = 0; + status->prec = 0; + + /* First come 0..n flags */ + do + { + switch ( *spec ) + { + case '-': + /* left-aligned output */ + status->flags |= E_minus; + ++spec; + break; + case '+': + /* positive numbers prefixed with '+' */ + status->flags |= E_plus; + ++spec; + break; + case '#': + /* alternative format (leading 0x for hex, 0 for octal) */ + status->flags |= E_alt; + ++spec; + break; + case ' ': + /* positive numbers prefixed with ' ' */ + status->flags |= E_space; + ++spec; + break; + case '0': + /* right-aligned padding done with '0' instead of ' ' */ + status->flags |= E_zero; + ++spec; + break; + default: + /* not a flag, exit flag parsing */ + status->flags |= E_done; + break; + } + } while ( ! ( status->flags & E_done ) ); + + /* Optional field width */ + if ( *spec == '*' ) + { + /* Retrieve width value from argument stack */ + if ( ( status->width = va_arg( status->arg, int ) ) < 0 ) + { + /* Negative value is '-' flag plus absolute value */ + status->flags |= E_minus; + status->width *= -1; + } + ++spec; + } + else + { + /* If a width is given, strtol() will return its value. If not given, + strtol() will return zero. In both cases, endptr will point to the + rest of the conversion specifier - just what we need. + */ + status->width = (int)strtol( spec, (char**)&spec, 10 ); + } + + /* Optional precision */ + if ( *spec == '.' ) + { + ++spec; + if ( *spec == '*' ) + { + /* Retrieve precision value from argument stack. A negative value + is as if no precision is given - as precision is initalized to + EOF (negative), there is no need for testing for negative here. + */ + status->prec = va_arg( status->arg, int ); + } + else + { + char * endptr; + status->prec = (int)strtol( spec, &endptr, 10 ); + if ( spec == endptr ) + { + /* Decimal point but no number - bad conversion specifier. */ + return orig_spec; + } + spec = endptr; + } + /* Having a precision cancels out any zero flag. */ + status->flags ^= E_zero; + } + + /* Optional length modifier + We step one character ahead in any case, and step back only if we find + there has been no length modifier (or step ahead another character if it + has been "hh" or "ll"). + */ + switch ( *(spec++) ) + { + case 'h': + if ( *spec == 'h' ) + { + /* hh -> char */ + status->flags |= E_char; + ++spec; + } + else + { + /* h -> short */ + status->flags |= E_short; + } + break; + case 'l': + if ( *spec == 'l' ) + { + /* ll -> long long */ + status->flags |= E_llong; + ++spec; + } + else + { + /* k -> long */ + status->flags |= E_long; + } + break; + case 'j': + /* j -> intmax_t, which might or might not be long long */ + status->flags |= E_intmax; + break; + case 'z': + /* z -> size_t, which might or might not be unsigned int */ + status->flags |= E_size; + break; + case 't': + /* t -> ptrdiff_t, which might or might not be long */ + status->flags |= E_ptrdiff; + break; + case 'L': + /* L -> long double */ + status->flags |= E_ldouble; + break; + default: + --spec; + break; + } + + /* Conversion specifier */ + switch ( *spec ) + { + case 'd': + /* FALLTHROUGH */ + case 'i': + status->base = 10; + break; + case 'o': + status->base = 8; + status->flags |= E_unsigned; + break; + case 'u': + status->base = 10; + status->flags |= E_unsigned; + break; + case 'x': + status->base = 16; + status->flags |= ( E_lower | E_unsigned ); + break; + case 'X': + status->base = 16; + status->flags |= E_unsigned; + break; + case 'f': + case 'F': + case 'e': + case 'E': + case 'g': + case 'G': + break; + case 'a': + case 'A': + break; + case 'c': + /* TODO: Flags, wide chars. */ + DELIVER( va_arg( status->arg, int ) ); + return ++spec; + case 's': + /* TODO: Flags, wide chars. */ + { + char * s = va_arg( status->arg, char * ); + while ( *s != '\0' ) + { + DELIVER( *(s++) ); + } + return ++spec; + } + case 'p': + /* TODO: E_long -> E_intptr */ + status->base = 16; + status->flags |= ( E_lower | E_unsigned | E_alt | E_long ); + break; + case 'n': + { + int * val = va_arg( status->arg, int * ); + *val = status->i; + return ++spec; + } + default: + /* No conversion specifier. Bad conversion. */ + return orig_spec; + } + + /* Do the actual output based on our findings */ + if ( status->base != 0 ) + { + /* Integer conversions */ + /* TODO: Check for invalid flag combinations. */ + if ( status->flags & E_unsigned ) + { + uintmax_t value; + switch ( status->flags & ( E_char | E_short | E_long | E_llong | E_size ) ) + { + case E_char: + value = (uintmax_t)(unsigned char)va_arg( status->arg, int ); + break; + case E_short: + value = (uintmax_t)(unsigned short)va_arg( status->arg, int ); + break; + case 0: + value = (uintmax_t)va_arg( status->arg, unsigned int ); + break; + case E_long: + value = (uintmax_t)va_arg( status->arg, unsigned long ); + break; + case E_llong: + value = (uintmax_t)va_arg( status->arg, unsigned long long ); + break; + case E_size: + value = (uintmax_t)va_arg( status->arg, size_t ); + break; + } + ++(status->this); + if ( ( value / status->base ) != 0 ) + { + int2base( (intmax_t)(value / status->base), status ); + } + int digit = value % status->base; + if ( digit < 0 ) + { + digit *= -1; + } + if ( status->flags & E_lower ) + { + DELIVER( _PDCLIB_digits[ digit ] ); + } + else + { + DELIVER( _PDCLIB_Xdigits[ digit ] ); + } + } + else + { + switch ( status->flags & ( E_char | E_short | E_long | E_llong | E_intmax ) ) + { + case E_char: + int2base( (intmax_t)(char)va_arg( status->arg, int ), status ); + break; + case E_short: + int2base( (intmax_t)(short)va_arg( status->arg, int ), status ); + break; + case 0: + int2base( (intmax_t)va_arg( status->arg, int ), status ); + break; + case E_long: + int2base( (intmax_t)va_arg( status->arg, long ), status ); + break; + case E_llong: + int2base( (intmax_t)va_arg( status->arg, long long ), status ); + break; + case E_ptrdiff: + int2base( (intmax_t)va_arg( status->arg, ptrdiff_t ), status ); + break; + case E_intmax: + int2base( va_arg( status->arg, intmax_t ), status ); + break; + } + } + if ( status->flags & E_minus ) + { + while ( status->this < status->width ) + { + DELIVER( ' ' ); + ++(status->this); + } + } + if ( status->i >= status->n ) + { + status->s[status->n - 1] = '\0'; + } + } + return ++spec; +} + +#ifdef TEST +#include <_PDCLIB_test.h> + +#include +#include + +static int testprintf( char * buffer, size_t n, const char * format, ... ) +{ + /* Members: base, flags, n, i, this, s, width, prec, stream, arg */ + struct _PDCLIB_status_t status = { 0, 0, n, 0, 0, buffer, 0, 0, NULL, NULL }; + memset( buffer, '\0', 100 ); + va_start( status.arg, format ); + if ( *(_PDCLIB_print( format, &status )) != '\0' ) + { + printf( "_PDCLIB_print() did not return end-of-specifier on '%s'.\n", format ); + ++rc; + } + va_end( status.arg ); + return status.i; +} + +int main( void ) +{ + char buffer[100]; + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MIN ) == 4 ); + TESTCASE( strcmp( buffer, "-128" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MAX ) == 3 ); + TESTCASE( strcmp( buffer, "127" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhd", 0 ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MIN ) == 6 ); + TESTCASE( strcmp( buffer, "-32768" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MAX ) == 5 ); + TESTCASE( strcmp( buffer, "32767" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", 0 ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", 0 ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", 0l ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MIN ) == 20 ); + TESTCASE( strcmp( buffer, "-9223372036854775808" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MAX ) == 19 ); + TESTCASE( strcmp( buffer, "9223372036854775807" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", 0ll ) ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhu", UCHAR_MAX ) == 3 ); + TESTCASE( strcmp( buffer, "255" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhu", (unsigned char)-1 ) == 3 ); + TESTCASE( strcmp( buffer, "255" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hu", USHRT_MAX ) == 5 ); + TESTCASE( strcmp( buffer, "65535" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hu", (unsigned short)-1 ) == 5 ); + TESTCASE( strcmp( buffer, "65535" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%u", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%u", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lu", ULONG_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lu", -1ul ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%llu", ULLONG_MAX ) == 20 ); + TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%llu", -1ull ) == 20 ); + TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%X", UINT_MAX ) == 8 ); + TESTCASE( strcmp( buffer, "FFFFFFFF" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#X", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "0XFFFFFFFF" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%x", UINT_MAX ) == 8 ); + TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#x", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%o", UINT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "37777777777" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#o", -1u ) == 12 ); + TESTCASE( strcmp( buffer, "037777777777" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", 0 ) == 2 ); + TESTCASE( strcmp( buffer, "+0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+u", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+u", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", 0 ) == 2 ); + TESTCASE( strcmp( buffer, " 0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% u", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% u", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, " -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "02147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, "-02147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "002147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 8, "%9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483" ) == 0 ); + TESTCASE( testprintf( buffer, 8, "%9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-214748" ) == 0 ); + TESTCASE( testprintf( buffer, 9, "%9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 9, "%9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483" ) == 0 ); + TESTCASE( testprintf( buffer, 10, "%9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 10, "%9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 9, "%10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 9, "%10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483" ) == 0 ); + TESTCASE( testprintf( buffer, 10, "%10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 10, "%10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 11, "%10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 11, "%10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 10, "%11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 10, "%11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 11, "%11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 11, "%11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 12, "%11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 12, "%11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 11, "%12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, " 21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 11, "%12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, " -21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 12, "%12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, " 214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 12, "%12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, " -214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 13, "%12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 13, "%12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, " -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%030.20d", INT_MAX ) == 30 ); + TESTCASE( strcmp( buffer, " 00000000002147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%.6x", UINT_MAX ) == 8 ); + TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#6.3x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#3.6x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%.6d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%6.3d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%3.6d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#0.6x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#06.3x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#03.6x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#0.6d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#06.3d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#03.6d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+6.3d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+3.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+0.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+06.3d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+03.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%c", 'x' ) == 1 ); + TESTCASE( strcmp( buffer, "x" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%s", "abcdef" ) == 6 ); + TESTCASE( strcmp( buffer, "abcdef" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%p", (void *)0xdeadbeef ) == 10 ); + TESTCASE( strcmp( buffer, "0xdeadbeef" ) == 0 ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/_PDCLIB/print.d b/user/pdclib/functions/_PDCLIB/print.d new file mode 100644 index 0000000..368a766 --- /dev/null +++ b/user/pdclib/functions/_PDCLIB/print.d @@ -0,0 +1,20 @@ +functions/_PDCLIB/print.d functions/_PDCLIB/print.t: \ + functions/_PDCLIB/print.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdint.h \ + includes/stdarg.h includes/stdlib.h includes/stddef.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdint.h: + +includes/stdarg.h: + +includes/stdlib.h: + +includes/stddef.h: diff --git a/user/pdclib/functions/_PDCLIB/print.o b/user/pdclib/functions/_PDCLIB/print.o new file mode 100644 index 0000000000000000000000000000000000000000..b393d9bb850556f544101c7c7568e2715aab687c GIT binary patch literal 12232 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 + +int main( void ) +{ + /* no tests for raw data */ + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/_PDCLIB/seed.d b/user/pdclib/functions/_PDCLIB/seed.d new file mode 100644 index 0000000..492f951 --- /dev/null +++ b/user/pdclib/functions/_PDCLIB/seed.d @@ -0,0 +1,2 @@ +functions/_PDCLIB/seed.d functions/_PDCLIB/seed.t: \ + functions/_PDCLIB/seed.c diff --git a/user/pdclib/functions/_PDCLIB/seed.o b/user/pdclib/functions/_PDCLIB/seed.o new file mode 100644 index 0000000000000000000000000000000000000000..e6c208069a3198026f77a416244aec065702d1df GIT binary patch literal 1496 zcma)6&2G~`5T1=wN^uDZ6%wdIq@sl)sEyQAKr32_098?idT9?_BHP(EhQzL78^HxQ zbKuMy@H%}2UV$?Q_-4J+xWIvt#^20*v$L~5-jC0ApDU$EM3F-ikLYTxWI6_xsYw?N zuUcxUG3Pps`9@1!R?TxnwGKIrb$7$vncJGJT_AE6$#pl8gRvXXvQ%B&fURDbf@eRq z$IQ$;;O~^foKv5^%eV%uk&mxZKO1PF>=~V^!y<|DI88FYxA(NWyYqx7)4K0Prca)$ zoOcV>64Yk(I0-J1KS)Q~j|Rbb7z493^NUQ6{o{T#j6>Rfx!>-#J6^|IrD2*JwTmQ+ zj}qN)$4P#++Fz~swiDX!cGug>`(csfMOka5Qy6dUj;&2z_I{KHAuu18I1nq>?{f0` zK^~A7W*JN!7Dv4x49EH{d1F1akvKU_g&oF;u5!mkm;@tzIvT~vi_+0ZV;x?S=Gwzr zSF${a-k6Q~pU*s!_`cx$jgcRz$|!LyYT* zaNd1!fWmE7Y^DcLz6m0dw~oM!1c9HXi1vVdcVU|TxG%o8G6p7ngFa%zig2&si_O$` z=uI}P2zLO#I`0W4<9T>qMqV%DYbcMAH9Bx2_#(`)78WJ%5Wz)BvK;4qu(nX2Iam>K zTZqY7FwJ>i{*lM|_Ng%JS2TVC>k@Pp%Ij!Cd9BrY1FZK7Vj?oH_=44Voqqh1IOEwD zi~VXR>{n-GpSzieV@|m0Pfr|JjyZuz$RRv#6>-c8Cjp1t(-AyVi~F%J!Jn@W|2GPI mzyIlSMDyeEv;7%}|1#RW#Rcgymtj2O)Km-9_Me0~GPDTrYJ literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/_PDCLIB/stdarg.c b/user/pdclib/functions/_PDCLIB/stdarg.c new file mode 100644 index 0000000..6cc701c --- /dev/null +++ b/user/pdclib/functions/_PDCLIB/stdarg.c @@ -0,0 +1,115 @@ +/* $Id$ */ + +/* stdarg + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include +#include + +#include <_PDCLIB_test.h> + +typedef int (*intfunc_t)( void ); + +enum tag_t +{ + TAG_END, + TAG_INT, + TAG_LONG, + TAG_LLONG, + TAG_DBL, + TAG_LDBL, + TAG_INTPTR, + TAG_LDBLPTR, + TAG_FUNCPTR +}; + +#ifdef TEST + +static int test( enum tag_t s, ... ) +{ + enum tag_t tag = s; + va_list ap; + va_start( ap, s ); + for (;;) + { + switch ( tag ) + { + case TAG_INT: + { + TESTCASE( va_arg( ap, int ) == INT_MAX ); + tag = va_arg( ap, enum tag_t ); + break; + } + case TAG_LONG: + { + TESTCASE( va_arg( ap, long ) == LONG_MAX ); + tag = va_arg( ap, enum tag_t ); + break; + } + case TAG_LLONG: + { + TESTCASE( va_arg( ap, long long ) == LLONG_MAX ); + tag = va_arg( ap, enum tag_t ); + break; + } + case TAG_DBL: + { + TESTCASE( va_arg( ap, double ) == DBL_MAX ); + tag = va_arg( ap, enum tag_t ); + break; + } + case TAG_LDBL: + { + TESTCASE( va_arg( ap, long double ) == LDBL_MAX ); + tag = va_arg( ap, enum tag_t ); + break; + } + case TAG_INTPTR: + { + TESTCASE( *( va_arg( ap, int * ) ) == INT_MAX ); + tag = va_arg( ap, enum tag_t ); + break; + } + case TAG_LDBLPTR: + { + TESTCASE( *( va_arg( ap, long double * ) ) == LDBL_MAX ); + tag = va_arg( ap, enum tag_t ); + break; + } + case TAG_FUNCPTR: + { + TESTCASE( (va_arg( ap, intfunc_t ))() == INT_MAX ); + tag = va_arg( ap, enum tag_t ); + break; + } + case TAG_END: + { + va_end( ap ); + return 0; + } + } + } +} + +static int dummy( void ) +{ + return INT_MAX; +} + +int main( void ) +{ + int x = INT_MAX; + long double d = LDBL_MAX; + test( TAG_END ); + test( TAG_INT, INT_MAX, TAG_END ); + test( TAG_LONG, LONG_MAX, TAG_LLONG, LLONG_MAX, TAG_END ); + test( TAG_DBL, DBL_MAX, TAG_LDBL, LDBL_MAX, TAG_END ); + test( TAG_INTPTR, &x, TAG_LDBLPTR, &d, TAG_FUNCPTR, dummy, TAG_END ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/_PDCLIB/stdarg.d b/user/pdclib/functions/_PDCLIB/stdarg.d new file mode 100644 index 0000000..90de8c4 --- /dev/null +++ b/user/pdclib/functions/_PDCLIB/stdarg.d @@ -0,0 +1,18 @@ +functions/_PDCLIB/stdarg.d functions/_PDCLIB/stdarg.t: \ + functions/_PDCLIB/stdarg.c includes/stdarg.h internals/_PDCLIB_config.h \ + includes/limits.h internals/_PDCLIB_int.h internals/_PDCLIB_aux.h \ + internals/_PDCLIB_test.h includes/stdio.h + +includes/stdarg.h: + +internals/_PDCLIB_config.h: + +includes/limits.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_aux.h: + +internals/_PDCLIB_test.h: + +includes/stdio.h: diff --git a/user/pdclib/functions/_PDCLIB/stdarg.o b/user/pdclib/functions/_PDCLIB/stdarg.o new file mode 100644 index 0000000000000000000000000000000000000000..4b50f8b0546a51e95b1ee846071f7dbca8e6f8e5 GIT binary patch literal 2080 zcma)7&x;&I6n-_`y))}qajL60v_U~d!{opIMW@v zdvrxKo^lb?lP8f}^pLBf9?a2$dhqDq;3eQW2mQY4s+rye!3Xue_p4sL>UvduXZO+t zrIc7w;>c1H`NSzbJq?@EmX@ftI@Rhloz{s~TOCvDDxWh%FJfCr)Fl zd9K;-)E*P@lM`UF~`kkODQZHjg8i;I_k*};VcJ(QQV9nn#YImL&u^$mcV4MZKk0m*Y*@+~l? z(0M$myLD_2B^u--QuKWOd zh_fV|<|2Dn$44ZGD_lMmtS_F48~z5!8o18 z0mbPAn5TI#&*Ln(JseCYk>ukvE4qs*oL^Rbz@#%Rmt)k$%h$Tw-Jaj`pEpTp)iD%I zJ$mAytzF#S-s)~%i{?o&FB6>U&9(NzGbW+<`3JKijDST};@C<>ykCev42w|wD9<6r z(R{QQMo|{OCw>-Bjb)PDO09P~Nn-fYa@sQH_B=|$S-i-CMZ_PZvssKi_(@vCJ~nzL zFT%mQ`cVECJAo+POSV6$ypN?!&W0tikr`*M?SIBSjTm-wHBNUoY$TiSG-T$p#C4}u z0b1YricI%C4ECla8^=4fYK_2~b&;QdM=?AMuFE=J!?1H8N($v11w+<%9XjRmHi+DZ zvSx#fk7`trssDgDJ_wd9I1_A&x|_bzNBEt#u2M2HqkiiFs{Rnms#(FGWS%?cNXWt z-mqlzS>0mQ?#kc)SUd6HAB1|f66)0zsoQQVvpBjFmKhyEQ5AAKGsvG)|L;Bjn!u!=me*SwXTm1<$gX^`q-r~u`U!(doA9|TMU!k$tlL}?<{D{X5 zGOxntdD7qp5!(%n|3!l@8{9GYxHe literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/_PDCLIB/strtox_main.c b/user/pdclib/functions/_PDCLIB/strtox_main.c new file mode 100644 index 0000000..fbdf8bb --- /dev/null +++ b/user/pdclib/functions/_PDCLIB/strtox_main.c @@ -0,0 +1,84 @@ +/* $Id$ */ + +/* _PDCLIB_strtox_main( const char * *, int, _PDCLIB_uintmax_t, _PDCLIB_uintmax_t, int ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#define _PDCLIB_INT_H _PDCLIB_INT_H +#include <_PDCLIB_int.h> +#include +#include +#include +#include + +_PDCLIB_uintmax_t _PDCLIB_strtox_main( const char ** p, unsigned int base, uintmax_t error, uintmax_t limval, int limdigit, char * sign ) +{ + _PDCLIB_uintmax_t rc = 0; + int digit = -1; + const char * x; + while ( ( x = memchr( _PDCLIB_digits, tolower(**p), base ) ) != NULL ) + { + digit = x - _PDCLIB_digits; + if ( ( rc < limval ) || ( ( rc == limval ) && ( digit <= limdigit ) ) ) + { + rc = rc * base + digit; + ++(*p); + } + else + { + errno = ERANGE; + /* TODO: Only if endptr != NULL - but do we really want *another* parameter? */ + /* TODO: Earlier version was missing tolower() here but was not caught by tests */ + while ( memchr( _PDCLIB_digits, tolower(**p), base ) != NULL ) ++(*p); + /* TODO: This is ugly, but keeps caller from negating the error value */ + *sign = '+'; + return error; + } + } + if ( digit == -1 ) + { + *p = NULL; + return 0; + } + return rc; +} + +#ifdef TEST +#include <_PDCLIB_test.h> +#include + +int main( void ) +{ + const char * p; + char test[] = "123_"; + char fail[] = "xxx"; + char sign = '-'; + /* basic functionality */ + p = test; + errno = 0; + TESTCASE( _PDCLIB_strtox_main( &p, 10u, (uintmax_t)999, (uintmax_t)12, 3, &sign ) == 123 ); + TESTCASE( errno == 0 ); + TESTCASE( p == &test[3] ); + /* proper functioning to smaller base */ + p = test; + TESTCASE( _PDCLIB_strtox_main( &p, 8u, (uintmax_t)999, (uintmax_t)12, 3, &sign ) == 0123 ); + TESTCASE( errno == 0 ); + TESTCASE( p == &test[3] ); + /* overflowing subject sequence must still return proper endptr */ + p = test; + TESTCASE( _PDCLIB_strtox_main( &p, 4u, (uintmax_t)999, (uintmax_t)1, 2, &sign ) == 999 ); + TESTCASE( errno == ERANGE ); + TESTCASE( p == &test[3] ); + TESTCASE( sign == '+' ); + /* testing conversion failure */ + errno = 0; + p = fail; + sign = '-'; + TESTCASE( _PDCLIB_strtox_main( &p, 10u, (uintmax_t)999, (uintmax_t)99, 8, &sign ) == 0 ); + TESTCASE( p == NULL ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/_PDCLIB/strtox_main.d b/user/pdclib/functions/_PDCLIB/strtox_main.d new file mode 100644 index 0000000..6b6ef52 --- /dev/null +++ b/user/pdclib/functions/_PDCLIB/strtox_main.d @@ -0,0 +1,14 @@ +functions/_PDCLIB/strtox_main.d functions/_PDCLIB/strtox_main.t: \ + functions/_PDCLIB/strtox_main.c internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/string.h \ + includes/stdint.h + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/string.h: + +includes/stdint.h: diff --git a/user/pdclib/functions/_PDCLIB/strtox_main.o b/user/pdclib/functions/_PDCLIB/strtox_main.o new file mode 100644 index 0000000000000000000000000000000000000000..6d27e11e31d1eae31dbdadbd291610c93b0b30bf GIT binary patch literal 3512 zcma)9U2Gdg5T3m|Cr;zoZXKXNp#efEKed6nAX;cc(*p%4lpmuC1jcr*vB5v(d~Sh)mY8Zz#jgLt`3lV;m6b4|NmIuJ~O%Z45jw}`uF_&A-ylg(=s?t)6`K;F{))s{hGUKN2)M^%WX3~xV+m0os2a_5Nq&K~ zA2ec3tRkLqK!~vn$4Xv;6{nO>Y%H@WadQHidvK@>AQmZ(q8ERl`;IwUL!CIoiq)DP znO5w1XiY2&&9X+Ah@NH$?@5S1#$d!Q!%)-cJ;coFMGY{lcM~9XAv$C3@zAga&|~$+ zjx*izB>G;_MlaHW2{*ln)rc712@4Cx6!kp}qexfK8&g)_T4+W3Imx#7y)JDb+tzo1 zv|TQ3%ljUbw)K*&SmIVlEaSP1smJ=)uwy24tS;F@VlXQwt0P;MEGv&bF#`7i?zVs> zDRls%u~pmzhAYc+8^j3;@n>=Xy}ZY4+|g-PyjrW-&K0+98NF+4Gi7tAtm8II^|q8N z_0G713bZ}fYwamEO0{MdD8dpJ0OkHo}w2zFYxIOU!dkFR4%oh zZp2Ep7`>1gkI zs}eQs?3A0O22OZnc*!j_Cs-9m!xAW4X*C)S%8+fgJSU5yuW5Uw$`jFHJ6r_Px&0qp z2`7|*dXzK&c1F*qKDGRY>Qg=p+wr0t0iJ`0$Fm<_4}MQDmlqItkV&NJcvnNm{{Q87 zEqtOOINp&+JZ;;&$ghg)$#+vXEpCJ&n#U{1V-7mbgKMDkxDT=(1Cc(!Lf>RTHEp{a zJR0wXfiN$Q$NA}ak3!aCAkw2ST*HED+SUNqGMiq6-&M+oLECDOqw^k!%-au}p7)u^ z7>M*X3_~oarsM4ekH&ii@%Zj=9uUvQI{=x-@V;>S3i0?IuN#Z}ysA+94WPKg+DX~i z@1T;k={kK7l|qN+PYx}!DGxs#n>m&t+uP`)dAt?LV;OAh$NRDrk3M@4X&mv6vY?ut zi!prDhlV5g$QXh0T+kFAj+e&6b4KG?I9Ggzbkp%P*BI4X^vk@~GcNqPWgeY@xz0Kq zWl}6U9QK99G-c*p7n6`oq?yDgr`t@q^HI(jcbh4z80B2yZZlCCJ%ZmU%dmr&bfsl>T?-_*}dgIk5g(Ap5Ul4n0>{p!C>s5-1^`Ek^ln1fI_vhv*`O zmoVbLN>2IRppbLtad#-ZSK)SrMTI*QHWYFWJZ_&t{vc)kvclIGG5;G14>95re4y-~ nD?Fj_CxyQ%Ome=6XDi&zdc>1?qtnRufc5 +#include + +const char * _PDCLIB_strtox_prelim( const char * p, char * sign, int * base ) +{ + /* skipping leading whitespace */ + while ( isspace( *p ) ) ++p; + /* determining / skipping sign */ + if ( *p != '+' && *p != '-' ) *sign = '+'; + else *sign = *(p++); + /* determining base */ + if ( *p == '0' ) + { + ++p; + if ( ( *base == 0 || *base == 16 ) && ( *p == 'x' || *p == 'X' ) ) + { + *base = 16; + ++p; + } + else if ( *base == 0 ) + { + *base = 8; + } + else + { + --p; + } + } + else if ( ! *base ) + { + *base = 10; + } + return ( ( *base >= 2 ) && ( *base <= 36 ) ) ? p : NULL; +} + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + int base = 0; + char sign = '\0'; + char test1[] = " 123"; + char test2[] = "\t+0123"; + char test3[] = "\v-0x123"; + TESTCASE( _PDCLIB_strtox_prelim( test1, &sign, &base ) == &test1[2] ); + TESTCASE( sign == '+' ); + TESTCASE( base == 10 ); + base = 0; + sign = '\0'; + TESTCASE( _PDCLIB_strtox_prelim( test2, &sign, &base ) == &test2[3] ); + TESTCASE( sign == '+' ); + TESTCASE( base == 8 ); + base = 0; + sign = '\0'; + TESTCASE( _PDCLIB_strtox_prelim( test3, &sign, &base ) == &test3[4] ); + TESTCASE( sign == '-' ); + TESTCASE( base == 16 ); + base = 10; + sign = '\0'; + TESTCASE( _PDCLIB_strtox_prelim( test3, &sign, &base ) == &test3[2] ); + TESTCASE( sign == '-' ); + TESTCASE( base == 10 ); + base = 1; + TESTCASE( _PDCLIB_strtox_prelim( test3, &sign, &base ) == NULL ); + base = 37; + TESTCASE( _PDCLIB_strtox_prelim( test3, &sign, &base ) == NULL ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/_PDCLIB/strtox_prelim.d b/user/pdclib/functions/_PDCLIB/strtox_prelim.d new file mode 100644 index 0000000..8e9e6e1 --- /dev/null +++ b/user/pdclib/functions/_PDCLIB/strtox_prelim.d @@ -0,0 +1,12 @@ +functions/_PDCLIB/strtox_prelim.d functions/_PDCLIB/strtox_prelim.t: \ + functions/_PDCLIB/strtox_prelim.c includes/stddef.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_aux.h + +includes/stddef.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/_PDCLIB/strtox_prelim.o b/user/pdclib/functions/_PDCLIB/strtox_prelim.o new file mode 100644 index 0000000000000000000000000000000000000000..d7f0e6b5f0d4cfc32d6774252547a3a36134bc45 GIT binary patch literal 3204 zcma)8U2GIp6h3!mwlnQ6yGvUY1B5jesTOuoi%~!n+Cmx#5~Yb6VVT_yyBl_AH@h=Z z;t$nIf>smS@M3%+(Zm;xJ{T}QXcMA__~Z-flZjD7(#FImNhGP?nYnj&3KBiZ-0%F| zbM86!&Yd|uc3`g%f)okTsUr~`?g}l#0SwYz)K3#{{x-8@EgCapmbi9fd3kv@Jv(Nl zE>h~t1+nmsp`|WS>e9kS$`GAd@P7=AJBPep$!+nh*|EeoG_;rsG?<<^o91xRVXHq8 zO6gfd@Ooy)z|34v`vcNpiglcF=d(U$r@y5%7RYnXEp86HkvJY0EEpEo%+xHgi2Ol7 zzdNw>z!GR?u8UW(k|4*x=@=p}#y*FUu3Q$Y#l~b`Tu-h|t`@x_jdo}Q6p!zMib$6% zau^{?6idN8-bd7BhYaWA+yuQ_ILvGfuijSgWH;_u`tjKNulmpJabMXyqKTe|6h^iDOLY&qP3Sg;LxLX@=!`mK+D zzp!81)IYax_x$-Y^YhjfO+zwX0uLH_2BRMG79&@vkY7nOhMIW%+KaQgWTi44;FxP%PU`j#90kbedGHyQNIq z#*TsJRyBvBg57d>ZllSbU`kE9Q6?2~YO+$Q$OtP#Nq4*2DBIL3*PGtTq;jD_pnV4? zG9#Jc>~QvBPT@BiSSOgG>ou#CE7xmIjvcENV5{E3-a5@(W3pJS6xgp&wcQgkiOk#J z1Hra%f&bopnC+_T*NFCwjBL*gP859C^TUN~8TJEd+x>E3*a^Ota6>K&5-(c`!#In* z?dL6$#JjdTY3(_qt%^~$b*kps1t88|fMvzu6lOhV%A@S0?b(zqv|3=Df?vwpg+kML zk+SR(YAWvWdQ`4fTt|6V>&2+4;TK%H<{(&Sy4|$h605>!SOR5>^;*rrc4pnW=Va0S zEiKP3o`_C6-b5f(*Z;u{aN@T@eqv}CeDoBnv%MDj;F<$64afP)Ai4t&&u2fDH%gh` zE~X3{Bc$T-ZOH!r<+l|+(GVQ(TqK^d?YYVCQyBOiR;1WnP(Ri}sKE%=8(aXdPapj$YW*eyj$MrMKyA#QVA} zb#ige@QV-{mk>M+<(&{ycsL&SiE~Ed-N5g|Hs};Z*RFJoQN2NbE=O%E{{lIFGy}`3 z>Ts4$E1Rdc-)d#&6WJl1`0uMjI`PTrkRI%OROX61q!V|sLppJXJEWsC%3}%YUR1lO zV-EUu%P0OeSAIVD?&k}6zB@sDCN(sk-&ujOvCSl~e9p%h+)Kc_S;hvgmv|2&evJmD zUryp95+9d1DsjKW=OiAJSdw^B;u{iYCC*Fae=%Oq1&JR@{6yjP2|5Amj3}-J+XWM literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/clearerr.c b/user/pdclib/functions/stdio/clearerr.c new file mode 100644 index 0000000..4c51d71 --- /dev/null +++ b/user/pdclib/functions/stdio/clearerr.c @@ -0,0 +1,58 @@ +/* $Id$ */ + +/* clearerr( FILE * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +void clearerr( struct _PDCLIB_file_t * stream ) +{ + stream->status &= ~( _PDCLIB_ERRORFLAG | _PDCLIB_EOFFLAG ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ +#ifndef REGTEST + FILE file = { 0, { 0 }, NULL, 0, 0, 0, NULL }; + FILE * fh = &file; + TESTCASE( ! ferror( fh ) ); + TESTCASE( ! feof( fh ) ); + fh->status |= _PDCLIB_ERRORFLAG; + TESTCASE( ferror( fh ) ); + TESTCASE( ! feof( fh ) ); + clearerr( fh ); + TESTCASE( ! ferror( fh ) ); + TESTCASE( ! feof( fh ) ); + fh->status |= _PDCLIB_EOFFLAG; + TESTCASE( ! ferror( fh ) ); + TESTCASE( feof( fh ) ); + clearerr( fh ); + TESTCASE( ! ferror( fh ) ); + TESTCASE( ! feof( fh ) ); + fh->status |= _PDCLIB_EOFFLAG | _PDCLIB_ERRORFLAG; + TESTCASE( ferror( fh ) ); + TESTCASE( feof( fh ) ); + clearerr( fh ); + TESTCASE( ! ferror( fh ) ); + TESTCASE( ! feof( fh ) ); +#else + /* TODO: The above is ad-hoc and PDCLib specific. A better test driver + should be internals-agnostic (provoking the error / eof flag by + "regular" operations). + */ + TESTCASE( NO_TESTDRIVER ); +#endif + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/clearerr.d b/user/pdclib/functions/stdio/clearerr.d new file mode 100644 index 0000000..b4655e9 --- /dev/null +++ b/user/pdclib/functions/stdio/clearerr.d @@ -0,0 +1,11 @@ +functions/stdio/clearerr.d functions/stdio/clearerr.t: \ + functions/stdio/clearerr.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdio/clearerr.o b/user/pdclib/functions/stdio/clearerr.o new file mode 100644 index 0000000000000000000000000000000000000000..a8ef8c717ba538be01a2d13c4807bc9bbf1aba92 GIT binary patch literal 2952 zcmb7GONbm*6uqxLGu`Q#o|$wKqZvtuNlX+|9dP^*NgOkYal#N{G$00+9{RF!HQiHv9($iai-v1s)@K;#IEkIJeV0{HC3t5P>76A4kHh2 z5GmD^UCp8{qh%d+muie|@YF*SInnM3rd~kmiaTVmFh&w=%gT1)sN0~c8!#?r4#Bo^ zu^cyyQn4NPehjfo?lt%wX92yf#(n^}kE64G--UjxWL-Z89RG^0Kk2gOWE>#YU%BOo zdzj|mC((mpfvl>;S+?cgLCYF{mzFdB4WTrC2H<+szk3UPX)C%tc2zB7aQPGZr_@mZ zQk9w5o>ru@=A80A^3ACInK@DZh0%@b{mh&$e?+sU%}wRqG&gB;Yxw}p&59|lx!Lj* z%`KX$US@LpmTV2y+)kVb$u_8~=+z`*qZ6#)s^Q}V>s6>1&@5@vsjgQi(P!0$u<8t= zRvPxBq>-fUurFQ%XCK6o-%CVVy}*xyIQCks$CVR@7nhd~t+e`4CtUTqyh-E3q}+jX z%P!cSR0m2m%R(-s&C1!5)S+RcK`#+`=avk(-b}Wk&kN)nhMq(-YskX0!?2Ut>`d8E zUu!0*p9Yeoap12>C+r20zZMLaNykbm%|R!K+Cy&=UZ9s#2g%UeIonU*H9PFIVf6aZ zYCY=)Q4+33LA%aU9U85!A4{X#Uke&kdm%9CCyhZ8#ErA{lv7WHK zE?qxr_kz)mv4D_wGvepqEC*(A)rAEy^smcon6tzE9X)=kzF434=DmCL3UuO55a%qk z^`5d6QLvth99>-8U*B`8If&9hK7H@}AhYhhQ`5;bPW}c&iF&Ry;W#hj+BWezwD5)= zu9gm6v?g8glJje+-vp*{j$Nar%;>fK)EBRrBv6CqV0FcBHsjz~@#3JTJz>;ArH<@g z7zJi@uiq+$&JLQa0FaG_`>`Lb(v|Zgy?Cwu+FF1U@S=VicsQ-SD2LWF#c7?GrSw09 z#ms`oLzoHQ?_#x@8r}gv$MJ)pEax!n%{aam{8IjF+}#*MJ|pDgn_|So4#Ht{#(qWP zXJ^Eye9Owl3FLEMN04{yqH%p(*Kss62den^l3$>r#l()mF7iED$>)=gFSp@)3c8sC zRlWru_h!VzLO6`hSOo{P-3%(kczMOVX9{`w>tymiUzh_`?gC$(iWZaWJnSN07kvB{ zxQ_`m!}khw&e?}XIR?JR3<+$iY_DrHm@c0(Q9(@XL->r&@MjoT zJU=t-3Sz~5tQYn%gBZv0eyN+_EO((_qtelb9+07U2 z>d1g*XFDIc?CeyF_SBGpZ^cF)T;UxzDrfLrQTPB^YYKP9`yuiSiMJB5{o6I}AYwZW z9luZGqQ*xxp4J#@T-SI}V^+`Le@)wOXnaTGdm2B`__4;T8o$=~y~aN@@~;BdJ*{!O sMo;4bjZbJiO~n3IG`5H+)UJ;A$%}Y)PUsA>_UPxoIyEW6e-*U<0Xth#j{pDw literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/fclose.c b/user/pdclib/functions/stdio/fclose.c new file mode 100644 index 0000000..0b42330 --- /dev/null +++ b/user/pdclib/functions/stdio/fclose.c @@ -0,0 +1,77 @@ +/* $Id$ */ + +/* fclose( FILE * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include + +#ifndef REGTEST +#include <_PDCLIB_glue.h> + +extern struct _PDCLIB_file_t * _PDCLIB_filelist; + +/* FIXME: Last file not removed from list. */ +int fclose( struct _PDCLIB_file_t * stream ) +{ + struct _PDCLIB_file_t * current = _PDCLIB_filelist; + struct _PDCLIB_file_t * previous = NULL; + /* Checking that the FILE handle is actually one we had opened before. */ + while ( current != NULL ) + { + if ( stream == current ) + { + if ( stream->status & _PDCLIB_WROTELAST ) fflush( stream ); + if ( stream->status & _PDCLIB_LIBBUFFER ) free( stream->buffer ); + _PDCLIB_close( stream->handle ); + if ( previous != NULL ) + { + previous->next = stream->next; + } + else + { + _PDCLIB_filelist = stream->next; + } + free( stream ); + return 0; + } + previous = current; + current = current->next; + } + return -1; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ +#ifndef REGTEST + struct _PDCLIB_file_t * file1; + struct _PDCLIB_file_t * file2; + TESTCASE( _PDCLIB_filelist == NULL ); + TESTCASE( ( file1 = fopen( "testfile1", "w" ) ) != NULL ); + TESTCASE( _PDCLIB_filelist == file1 ); + TESTCASE( ( file2 = fopen( "testfile2", "w" ) ) != NULL ); + TESTCASE( _PDCLIB_filelist == file2 ); + TESTCASE( fclose( file2 ) == 0 ); + TESTCASE( _PDCLIB_filelist == file1 ); + TESTCASE( ( file2 = fopen( "testfile1", "w" ) ) != NULL ); + TESTCASE( _PDCLIB_filelist == file2 ); + TESTCASE( fclose( file1 ) == 0 ); + TESTCASE( _PDCLIB_filelist == file2 ); + TESTCASE( fclose( file2 ) == 0 ); + TESTCASE( _PDCLIB_filelist == NULL ); + system( "rm testfile1 testfile2" ); +#else + puts( " NOTEST fclose() test driver is PDCLib-specific." ); +#endif + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/fclose.d b/user/pdclib/functions/stdio/fclose.d new file mode 100644 index 0000000..2d4ac39 --- /dev/null +++ b/user/pdclib/functions/stdio/fclose.d @@ -0,0 +1,16 @@ +functions/stdio/fclose.d functions/stdio/fclose.t: \ + functions/stdio/fclose.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdlib.h \ + internals/_PDCLIB_glue.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdlib.h: + +internals/_PDCLIB_glue.h: diff --git a/user/pdclib/functions/stdio/fclose.o b/user/pdclib/functions/stdio/fclose.o new file mode 100644 index 0000000000000000000000000000000000000000..9a2a2dd2c50b3ae73487a908471a67329ab07033 GIT binary patch literal 3460 zcmb7GU2GIp6h1Sv+wQX4ZRrnSs8VeS5M`IdY6!oTQji3Z5NhI2sQWY99o(I5c4iTO zPzjRQln01DK|(_0fd?Tbnn+?|j7AL)zVTr64Synmhe~(@t=~6u@9vZr<4NXz=R4=z zbMHO(-kEuKV(%`)Fhq+Xmb973PaUCWG=R0TT>52l_V*LF*IuAyc4GdAiM!Npo zk=Q&j-)sWs#s*i*dm<;l_EVs+@0M& za*K)P#zsEoc#)h}$!|R}H!(juaThH@Fs~EG=B4}OVT^ed&%(8D#aL>r&h(|M%*xDC zqu1!c(##P_rM9K4govfoj7Y2-);)b9@nvFVHl;QPq@&MBrAQ2TI=fn)jY~uleTJ0@ zym5My${XL)NAHrXu{|9oT9e+>$HB)s7?+B-vY3cVk1nEJZMr?ZC5=U1#MYp4keIOn zy73m&j{<|p7YfZ-+;M%eV)03YSc&)mAQl^g+cG*5An{=|=KN|{Iuho+*MXgP(3tmW zGKZxTAm-m8i%EQv^q&K0k>L=t8i`-X%=i{Ev-2~uSm!-LqO$~uXQ|&fk2bLa%~~sC z>_u?$I_=%YZUBZ#a$u{+;3Ul9SaKKhEj2a;G@a}s?KM6LXixHc2KOo2pIk%Qujq>8 zR?-23Lz=^b$!^kRD%DW(FjFlL=3owwpdu{T65~g-*buIjqN{io(J34Y_&96xjHI6f z8vP-wq;JwU5VERt?Ii6c#ckqUFy&R6jC+|bw80glv)puxzEgL-oadLEx@2?MEW6?6 ztDZ=?Sgm_@w#X|uwSVXM-aR{}igmZ_OlK?Hcx^+M(10=r=K&>}K5^uw_Y-FlUtX*H zeC6_yX{&bH8aV%=X>vlG2_94Y7|{y#1d$6irOBlR@(|kaj9o(L0X*TX0_R}M84EZY zT`}slg6HRbTRgvE=W9}SsO1@EbfL`6pH9fnLn<*8mPC>j%z2Ofn zN`>h;rK5V?mAqT3+R}<(CYfp2N1Qrli#a*m&$geF31X0jD~n8+F1?5464tVN-{jEv z&}eov`=pu(L(s8oH>B8XG;Gjdt+cDv2FYFfs4ud6e0~q zY_VReu^w5s?%P?EZaq#+@wI5Ta)YPsf5g}4!-MkAE@#ICVHBR67Aau9?f^KD_j@zaeX@9A?UgfRQUt>o}i*c`)c4? zr>hqU9#$~~?Q@_<$9*L-F1DsM?(s+;sFFjzAu39AzGL9gd?n=Lz2Q2bw(_wC?8AMb zJdb>JodldJpK}Uz+*fgt5!kfoxQj4Ey2}m3MMeAgkE3<^e?wffewaoepQDYg!;h?^ z7e2;uUzXz0XAi3IXXraBO7vL7@M{n{X7HOb2IDeNeqWi7b>f)Oe4k@^uez{zPe^zx|7#zRIo7iT+xa%hje=k#fUse|Cf4 zir}x#K$49}V`3tcL`=Cr#NX&~ApNJ5o$mt!CB-X343vg*C-P1Z`KMsuaPWQ-A0^_~ zF{k`bD;!t&tiqQSItq^}JgJc5GyjJQ&nmp2@RGvI3WK|Wc%EPOyRPt8g?AM4KZyPw zg{u^16>e2{P~j92>nbXoCgKRqDE~VOPboa7u*UJwFQ^|Hjod%lR}gV8`7=fSFZmMB AX8-^I literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/feof.c b/user/pdclib/functions/stdio/feof.c new file mode 100644 index 0000000..784ea4e --- /dev/null +++ b/user/pdclib/functions/stdio/feof.c @@ -0,0 +1,29 @@ +/* $Id$ */ + +/* feof( FILE * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +int feof( struct _PDCLIB_file_t * stream ) +{ + return stream->status & _PDCLIB_EOFFLAG; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + /* Testing covered by clearerr(). */ + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/feof.d b/user/pdclib/functions/stdio/feof.d new file mode 100644 index 0000000..20c22c5 --- /dev/null +++ b/user/pdclib/functions/stdio/feof.d @@ -0,0 +1,11 @@ +functions/stdio/feof.d functions/stdio/feof.t: functions/stdio/feof.c \ + includes/stdio.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdio/feof.o b/user/pdclib/functions/stdio/feof.o new file mode 100644 index 0000000000000000000000000000000000000000..b5f74f83a1b263dc0dc320f0b077c22aaad9ca21 GIT binary patch literal 2924 zcmb7G%ZnUE82_ptJ2RQt+1*TDlGRMugsfnC1Xl^sJj`y4D@%}QF20s|^z62o=?T+4 zCh>u%KqOwogCHXDCX#?cKrbFd^dHbej^g7g>NRTo{i>^GI$p#Nx_;lI>i1QBRbAb0 zo?LrEDJ52vxH7RsKJc^1l7>auAvHPs)-P927Ox(k-!HQwFMh4&)c$I%>{fSI=hRj; zJ0;@mlXCfJ*)58=My-l?Gw`m~MEo7%Ru7jS)y7m!mCG~~B8BO37V{}WPj#VAzXnL$Md5&71#3{ zh`L4p2e>`&I9gXteFyM=MdSRoAMI4pxqSgx_>!(a>2emN01)S|%<{xvq51b2v|uEXp_yP4FKSW#Hg=W#Msx@>jeMbL`It4(g5)-?#ij!~_ zywW21=G0+rR!X-R-Kwr@bGGye&6+W{l@8F{X3SlsBQ&=wrgRqOOEWZg7^-?{h0Htk z9Gr!HsL1DtZ&6>MRnv-VrPwN#vElG@#?CuXM|d20iB5I9I*nGJHH1}n6t~l85GRc! z?L-3!8mNCbjGMhgq#F*pL7OLW{ppqEwbc{r?Lpj)HiAv=r1fDy=0M%_2D{Vh$PLFq z8f4Vx*pbwu;o^Z_ByzHjj5t*-JJDw6<27_WgNNyLXnq{>w9Uq@m3qIGq|G#xBprs$ zzI3Br7&rUjc!qSWr_vgA!?-i{Cef?(a_A@-d%Ncc3B0{QyiwQ9C{Ch{IPBDUFvmuF zvpJN;=Aa)osP-aYGDsSuBpf!*ciO$ECCTPsnAXQbI381oIu~WL8FzYNwm{^IxC0Yz zcGUdn%}M4a!;r0ew}W|}I(@djTwe;7f`{Z^d)YACmrcWD?}o#Sj<#8t&J~9jQ;}24 z%ZKZWXIrB<9c8Qsmqyxp_9o5NYQy?@BH&mNd@$26Q`y9DBf5r((p$xVAjs8u+-sTt@|uUB}zdIp#q; zlw;sqwIr~q^5It}-|q?t_Q7Yx_PYiLbt~7IC?_^{6F#dm%zpX$*h|nGm0JjWMa78CMa=H)EKngioZA8Xijj|XqC3x5!6r<@XT|ba+hX4D$?tcp zpLq9Q67BpuVd_AfjkJ6F)~@#C4s}SY$ov-$leh<4*+be*isVLRkO+ literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/ferror.c b/user/pdclib/functions/stdio/ferror.c new file mode 100644 index 0000000..6f24080 --- /dev/null +++ b/user/pdclib/functions/stdio/ferror.c @@ -0,0 +1,29 @@ +/* $Id$ */ + +/* ferror( FILE * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +int ferror( struct _PDCLIB_file_t * stream ) +{ + return stream->status & _PDCLIB_ERRORFLAG; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + /* Testing covered by clearerr(). */ + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/ferror.d b/user/pdclib/functions/stdio/ferror.d new file mode 100644 index 0000000..5eeea74 --- /dev/null +++ b/user/pdclib/functions/stdio/ferror.d @@ -0,0 +1,11 @@ +functions/stdio/ferror.d functions/stdio/ferror.t: \ + functions/stdio/ferror.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdio/ferror.o b/user/pdclib/functions/stdio/ferror.o new file mode 100644 index 0000000000000000000000000000000000000000..3e8589def62e2f8251daa938b66d3012e359a75c GIT binary patch literal 2936 zcmb7G-D@0G6hC)9lHF{w`Pej8T5)R<8ljyP8bzwDwP|gmv6Ny!6p8yWn;qPpjWe^h zwMw4~N_|j#5PXmdKKNikp`dRfBKQaBOP{3bd-b)}`uok?yP5bR9+>+(=lsq+=YGwd zxqNc%8KsmMQDV!sCGwe@G0Q0|$(&SV{oUWMo-ABFws%nqBCmX}rqyD(QnJf?%F}8_ zO^t|H3sNc_E!p60t(HZcNqAQ)BJP~n<-?^XQe&i|N+lW!%;?0Bd3;QyP*HX{WnHpG z&AO`S?D5rAu^@Wa@-(H#CF_6 zVC{l?3xwkwLu;#%p8@V|G}i4!v?B%U&UxVIw{-nQmo+b=0I}|7mLu+SH2*$_78#yo zR#kYNmgPP~%NqTJmNWVzp)mRq!1bu#B2n0lX2~wAH3S#Gp?^}H0-#iph3zTDL0I!n z@c{EptHY@|Uc5o4boAXzo%hY0d8~PSTvysj9`(%zR%u z25Wu+EAln?F?9s3noyi8#jIip8xB85Y<&PV9iO~Pr@B*~K%1U5(5gKMn@P|Q<64}w zg1&e)tiKTE_M@mDc}e;iH2YyY*z`KwOXEYA%z>3lx7eOgN3L5I z3ZZ6tk}XLb8a5v21tN!Q$$*1R<$ko;3Au#Ob9k}=q~zWq>7+IrGhgbxMx4|WU*aV4 z>pf`)T|cb%{NWhs*hr)?X!~Jn=#7In>D6_ZVGs|=_EtXz+3km$)wCIeaj+Tstt!vx z&}eq*k<>cD0qk*B6uuxDVTD z8Iz_)AcvV72Pw1m?G}c3>dbm|rMm1bdxzv-J6aoVVm1a{8s01+Z9S{BTIgR$L{6=& z9Ih^{HwIxc$nqXs9;DWz59>Ny{Cf~3>aD`K?QRE zFo`nk7%gEzuT@X#;x*zJs^1uFZqyr%$bUn;$nR=T5VmnXx9x5a`X;*DZ|143L4%u* zWZU8Os2*<8mE}iy@tXZ!&&L9IVL$Obtl~i&f#z%ZZtaMt=zqu_#PX!$3QUD}cK)E6 z&{@B+w-iQ_%NSLDCq4j_j4j4975fWzqI zMzBB+n4lcT&CAz4o2$$3lBxT4t`Ah1N4_c*EvD8**!g@fA|Lmc^BBit^1TP0eICI> zSwX(%O%m8t`Fy0&#J!IM3-B2+ao6C;b(b3~loP|X z-1)aeJ3kWI`HHm7Dr8yg^h9rGw6nj6p~K#>QtZ!@vn_VI^LZQpSvj$H+yLyKpE2#p zVMeae3>R*AaqF)W{Jc{XUOt{Ph5cd{BG;J6FQ~%Q`5qAW5%F@>H2;{!6^*AgzN|6O zctPV8jp + +#ifndef REGTEST +#include <_PDCLIB_glue.h> + +extern struct _PDCLIB_file_t * _PDCLIB_filelist; + +int fflush( struct _PDCLIB_file_t * stream ) +{ + if ( stream == NULL ) + { + stream = _PDCLIB_filelist; + /* TODO: Check what happens when fflush( NULL ) encounters write errors, in other libs */ + int rc = 0; + while ( stream != NULL ) + { + if ( stream->bufidx > stream->bufend ) + { + rc |= _PDCLIB_fflush( stream ); + } + stream = stream->next; + } + return rc; + } + else + { + return _PDCLIB_fflush( stream ); + } +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif + diff --git a/user/pdclib/functions/stdio/fflush.d b/user/pdclib/functions/stdio/fflush.d new file mode 100644 index 0000000..3694ee7 --- /dev/null +++ b/user/pdclib/functions/stdio/fflush.d @@ -0,0 +1,14 @@ +functions/stdio/fflush.d functions/stdio/fflush.t: \ + functions/stdio/fflush.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h \ + internals/_PDCLIB_glue.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +internals/_PDCLIB_glue.h: diff --git a/user/pdclib/functions/stdio/fflush.o b/user/pdclib/functions/stdio/fflush.o new file mode 100644 index 0000000000000000000000000000000000000000..7232a8b7ae2230b0df8797cc0e3921597cd77ed8 GIT binary patch literal 3280 zcmb7GU5pb|6h3#R-EC>N>>mrt8mhZw*C;K9)gUUYEGuqABt%RM$l9Ojc49l-bXr6r z8u>9IK46T-s8NYN@SuhV6MZxqW7POy^nq73CMIa2X5T>8@0;E`9e6RGWbSwV?m73I zd*{wPJG<*XrIZ*_VoO&NDfe_NQvpoMY8jS&r+z*D`{ePX32D!qrT)}x;;Y#uau+8~ z&n8aq8Rj^>=FZO#Wx$<^jsJFed3iZGyAg%#Z<)O>o3%RTAvw8*_pMO z0X3-lk=`1YRBCI=PKel=&4|QSLOVAk5+4yevn6#`AoL8WREmOvrMEA%Y+fOf7*cj7 zu*PXkYHNIMh}IQ3wJqHVG?AVgV)E%8`laGw6bpXo6qY!M7WGYuo#^DHJ_AuNV_W*} zG*n0tkb(tz_OnL!g{nL?R5-(G{vKJ#FJjkdj@ggNFzKN36`w693@85((uMddt zB>(f<7!zwSOxhW>3(m>!sb8sRMyeze+x?1*u*PD^dl+v(Z3)D5GDdMweGrKK$#3X9 zq{ZRnG{s>pu1P*Zag}09Yiu;RlH!OCl}$d%P^*JASYzYp2-mzqJ%&;BE7nRfU3?YZ zDVz`3xN7TVNplAt!qe9*i5dx-^KuQ_^b@@@^unn>2EmfYsZy6ReHepRfyPSPE4AE) z=jZ)a*=aP+edLUH;3Lc8GMFEaB`tOkZ(zVDh^)|(Hfsy$I*gq|^&VXJ;_0j=R3U#TtHODK|op8BS%(vv4((_@p#dgK<%AvdO9-%v9wtce> zQ+j2w;lo&KcnjHJXnVf9;5p?i&wD78s)eTHtBtyoCtGuYe#6hVeW#gUESG9-QT%G7 z*~*4fI3Fu<%ZH^}@X9qukjmv=g)3trHP?^i;iMoJW^&z;h0zqQx{NjN+`TV5lby;< zWuI%UOacIHvm)dWF3=Wt78=giEO?Bu>;+iSHu(>F}D1L^jgbvWtAHsC5;R-&Fx zq+_ucu!Ft1LUyalQ{(Xa%`l^XTBgD&K} zM$5^eV;gV`N>4t%eM{6^dvbRn)N=M%KX| zm^yfsn>k?R3NC=>$!IdR-H@a4-o+irx)_gW;vEEU=75zGDEwA3nvAUu+3+--hu;m_ zhhS_j_-Nj9k-R7=%==tq4p{jP@v>wznRrJbN8_DGJia%qqYsa%gZ<|m?hEM;#5-t$ zKqkxQO^wFyfw;&xbcT%I`%pxtO9OsUGPX~z@mqvnw0~S5>0><6IzEfkF$kNfV*oss z9@1Ng_hl$`*TnptyT4<+jNn-)M!)yB>f*(F=>4;3L>cyhXA2Rk2?S#g(aVHdk(3p?B;8=Wy3 zc&7|vr=v62x0|}|K_9!HdHszIzY^y25-NiK0Z!-nR0zhq%R&PF=JS4ran5l3KA+n>?;V;W!6`rr=2 Uyr6#=40691kN3Vp(?_-ZFLV!*K>z>% literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/fgetc.c b/user/pdclib/functions/stdio/fgetc.c new file mode 100644 index 0000000..900cd0a --- /dev/null +++ b/user/pdclib/functions/stdio/fgetc.c @@ -0,0 +1,30 @@ +/* $Id$ */ + +/* fgetc( FILE * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +int fgetc( struct _PDCLIB_file_t * stream ) +{ + /* TODO: Implement. */ + return 0; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/fgetc.d b/user/pdclib/functions/stdio/fgetc.d new file mode 100644 index 0000000..927b076 --- /dev/null +++ b/user/pdclib/functions/stdio/fgetc.d @@ -0,0 +1,11 @@ +functions/stdio/fgetc.d functions/stdio/fgetc.t: functions/stdio/fgetc.c \ + includes/stdio.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdio/fgetc.o b/user/pdclib/functions/stdio/fgetc.o new file mode 100644 index 0000000000000000000000000000000000000000..e404507f13c3b8ad7678cad98e629517afdef043 GIT binary patch literal 2924 zcmb7GO^6&t6n@n|J2RQx+1<=0Mv~x!O-K~eqqvH!Ca&3NTwQ`hbI>Tu{PfJW&h&)o zp8TnJ3PkXrco0M+-aJI~AegI)2X7t}^d^d4y!dmHsPX%%t7bZ0#0OR1`>Xe=UcLT# z`JwfPl~Q6!i7OLHZSRaNCO1qDlCW^B24i%7Am+={mPw3dw3U#rr( zB~TAcXMy%luT`0R1WUWUN}p1!8gZetpW=cMca#oM+@_e)S=?2crMTUMs+AsQ$U^uctrMgy`!L0iXX4M(Rtuz|MNj*v1(LjPa z>K_i{MlTWRbi=e2wAh9lj~`uKUpunV8pNHb8*K6_tqv_pK=`JK}y}k zj-(z17Xy5e$lW?J;$Ahe&{>1L0M`>3I={B<8rwWAbF!x;-)|;qBMl`LFWRTQHNjR*ZZnt_-Q|BBX0LX!4@K3%Oo9r zbV@jK-=;W|UDCncNT-bh96Nrpwpv>XmV&!XLX)Qx4ztryHb>K;Vxpv@W za}=keZ27^Zk(Tbh)r6Zv$*+Tys27XVo_7hCwZMBY#H)F*Qap0enein^&iB(s6POM& z+_YTEgh9KJHY8{!3D~eX>TWce&0%;(f??P*nkep|Hz#s0ibLz&8?^GK)1xM@9>FH= zjbS71QkBI=dI?&Cem_J3f_RXI0g81Heb9P7zpOK45B(3?317B3UVobSuFkiqZQec5 z(~pk+@(ot9O5iRWq6Q=H z*vH`hxUb_Fb`4lLh3EGI8AI0gDCB&+`^(vS#w%dhcu#}3Yrx9ah{v;8vbG2c%hRS% zAig3jSsO1epZ91kFYm?XeF?l>!x*~}uSUj@wVj8YkGGC^d=_|)X$%|hRq$MM2L|a7 z;yq@AKqkxara|j>2?6#(XUY0qh9b9It}s!KtnDM{EKf82^7XUJK7=iQj%RY`n1_vi zykGLR_rS_GFnmJBkj+KRUfr2tn!%ym2H=;B@mMFS^YNx}3A9_X@vLkyulMBF>sC*^ z@h^#TekYXk87bQ;WKmq*(UXX7_6IRmxHnXa>)AOIa`nyUW&C61$kivGC|q6DygWP3 zz{p!!IQtzjUqHT36dpYGn8IE0UWlwO@n#~9z1!d(A|9-|vEO5G)!-urPZ^91@|TS9 zE*jK*4EYTszh&@UgYOx9-{4h)pBwzj;133WGsqtU=9x2ii^0I)A%jmE+#uq7ErVSm b8nkEZJ;sGy*9ntF_8j&6wNNwJJA(2*Iz2+f literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/fgetpos.c b/user/pdclib/functions/stdio/fgetpos.c new file mode 100644 index 0000000..b023bfe --- /dev/null +++ b/user/pdclib/functions/stdio/fgetpos.c @@ -0,0 +1,30 @@ +/* $Id$ */ + +/* fgetpos( FILE * , fpos_t * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +int fgetpos( struct _PDCLIB_file_t * _PDCLIB_restrict stream, _PDCLIB_fpos_t * _PDCLIB_restrict pos ) +{ + /* TODO: Implement. */ + return 0; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/fgetpos.d b/user/pdclib/functions/stdio/fgetpos.d new file mode 100644 index 0000000..a163fbf --- /dev/null +++ b/user/pdclib/functions/stdio/fgetpos.d @@ -0,0 +1,11 @@ +functions/stdio/fgetpos.d functions/stdio/fgetpos.t: \ + functions/stdio/fgetpos.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdio/fgetpos.o b/user/pdclib/functions/stdio/fgetpos.o new file mode 100644 index 0000000000000000000000000000000000000000..9362348c1d52a2f7d7c42be44ac5176901f8c3aa GIT binary patch literal 2980 zcmb7GO^6$17=FL`*-e^ky4$q1+NvqLr4`zV;8vv4b?vHk%TlGZ2NhW+$s{|POqR?< zTdC-w1%-l?3W5iJZXOg=1no@`?;bn}f>^w_f~Q*R^UQqTWa>qHVZP`6f4`r1X1+I` zTzg6>C5DvPGLb}nbTi9h3I}AT)aA_EzkfsV#qUMboZ45bSM1vE+ML>^W~W4~1*ue) zDt1Z4)@)70*$VAyUBulfcI`;z(NvhKt4f7}f@OLpw>+{%q*PaSEw#F|mbKMgt<$>2 zQ;$`%MEk3&brxTqqF=?$vsmz}LM&zFD9Srnos}-eQM{Q9R`6_VwXAIU~R9W*f4G`;ACOP7+QT+Q9Mr2rG zR#h5NvfKqq*7S#zoat+X()0@e*CYSi2N+AcFdVRJY7NfitJH5*#{no+W?_3)aT3u+rZC#e?<}ijtgLT`m;~0tgRkfZx5qx*z-1c z$VP{lOo1&;&)%LnluW|CL+gIR*p0doN0}tWSoT`S{$d+;Rkd&?D{O8+aM+Ce5vX-dQ;UMr5l2CZ>#-EXxD*CDh+`{iO-cf?lu zAG903?00;xQ{wl%*sZ3A_d-uUz7M43bes&vkDn2~DF5Ym5I)RjXc^2GMgSVyQh}%W z1|Gh3h78M(T-hjrr?H3zj67o(59h~uoy22ez{&-@$mhvuGPV%t zgEui?(}i{UT2l0?zLcV8A63ArvyrXca zEBuQ4XTm;*t+{u&D0cw(vtvH)6V=6h z%QysFE^;#Ya)oA!dPi>DF52(BSuuZcCX|a6DVtr$ve;=yPcqusB_mhZckC47**O!k z(~~dCxR({kPFFrr*y*koW!&Mk$jsZgag*Ob{xjq^MPdKhX9@v48zT3ZcsCJCzgOd4 zB3`bhwm+`Jy$tz^mfzR-vBpm{ex{L^SjPXL@h6SfH2$HH zw*>mlYP??~?^)Cz)p%OtIuYw@YwQuxq?_6vF)!@tK4CD(zN4O3JvAf38wKTm0M7wV Ay#N3J literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/fgets.c b/user/pdclib/functions/stdio/fgets.c new file mode 100644 index 0000000..203d3ff --- /dev/null +++ b/user/pdclib/functions/stdio/fgets.c @@ -0,0 +1,30 @@ +/* $Id$ */ + +/* fgets( char *, int, FILE * ); + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +char * fgets( char * _PDCLIB_restrict s, int n, struct _PDCLIB_file_t * _PDCLIB_restrict stream ) +{ + /* TODO: Implement. */ + return NULL; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/fgets.d b/user/pdclib/functions/stdio/fgets.d new file mode 100644 index 0000000..83c5940 --- /dev/null +++ b/user/pdclib/functions/stdio/fgets.d @@ -0,0 +1,11 @@ +functions/stdio/fgets.d functions/stdio/fgets.t: functions/stdio/fgets.c \ + includes/stdio.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdio/fgets.o b/user/pdclib/functions/stdio/fgets.o new file mode 100644 index 0000000000000000000000000000000000000000..069b8cb177828eb275e2b2409ca2e7a9432ed86f GIT binary patch literal 2964 zcmb7GO^6&t6n@n|yEB>H*`G;bLLyGw4OzkT2(BV4iEDOETn#~@IjG1oKRvUpGd*Ft zCvJiwNCFCigd7A9qBjvG3W8pPdi9dryeS?$`E&4+X#BqFs+o=#@j=)3zW1u$t9tdi zXWn??k{gov{! zrP9%oTM%)LS{CtUVBM&Q_`Ag|uaq9uWTK)-5g6Pc@w_enMI?bZ7Ap=}trU6pxVZQcUSA>@Uuc?lz&S#p8^8 zm)?W3u!xF$1^*7^z^tbAEbvhkO9`xc7nh|JL)XQ)>`kFBz<3hpGW2txj%?DXZkDGp z>ULz%_AqXyQ9n*bZbzM9i&t!I zSdke}P<`|6v^x5{;~)=G>Rxvw^+;Si&Sno+Y>V|Q>7ml__!)7XtVLOalBWn^}pp{F9$;jG1+fQKa_Tx@f z55qW#I&s*lvSml4xm6!XZL8l4YgD@tFzF|?VG<5%XIsr~)R1JWKS-;iC0vg!M6GSv zs>iKvC`c8t{Nu2kqeEjN_m|rTUAE@!7Pffe)S2p9bvalL9yGPe5}G{iaFDGg|JOy= z?A@B9>6CG}or;`TTU)6vooNi?beIJ{ygbzGq5DiSnMKWSLzJl33R9l<7H(@NFTx1# z=J9gj*d=G$mmoRcOY03_I>>O#YAG`Yt$JFQpphg{!^W_)S#LB3;W-HgVb@rqxQ*r< z^KKM}c6PVl%)8DG8@zi28&9tf>T!prEI!gp(CqhmAu1EZ{WJ_v%fo1d<}3MS?E#zU zf5<+}WuN0SsfFM4e4pCxJpeoB@jald>Tx{SdHi_r1^KUe_hSy@Sy_d0)e@lf9nI-< z|B8oin-#0_qf)d+;5rUbg_C#eH~$s(kp9l%IDM0TyAiV&{Db19dCcnJ6dL_a$sr zr~3xx_(Z+B*2W^fpH0r(Tgc&ro6 z`FP8?1p2Mmc$Qnt+dcXHwzU)Q{5M6O-wAm>Be|_Y7RA*aJ&x#Re=SA^_l`<&Jv(PC zuDD^N|HB5?3_fY_MT3#SZG)E#>OMyND~7*s@FRmC8~n^5|0r=k-x<7N@F#kk>zlEC4z7gdA03|m_OaK4? literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/fopen.c b/user/pdclib/functions/stdio/fopen.c new file mode 100644 index 0000000..d181cc1 --- /dev/null +++ b/user/pdclib/functions/stdio/fopen.c @@ -0,0 +1,82 @@ +/* $Id$ */ + +/* fopen( const char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include + +#ifndef REGTEST +#include <_PDCLIB_glue.h> + +/* FIXME: This approach is a possible attack vector. */ +struct _PDCLIB_file_t * _PDCLIB_filelist = NULL; + +struct _PDCLIB_file_t * fopen( const char * _PDCLIB_restrict filename, const char * _PDCLIB_restrict mode ) +{ + struct _PDCLIB_file_t * rc; + if ( mode == NULL || filename == NULL || filename[0] == '\0' ) + { + /* Mode or filename invalid */ + return NULL; + } + if ( ( rc = calloc( 1, sizeof( struct _PDCLIB_file_t ) ) ) == NULL ) + { + /* no memory for another FILE */ + return NULL; + } + if ( ( rc->status = _PDCLIB_filemode( mode ) ) == 0 ) goto fail; /* invalid mode */ + rc->handle = _PDCLIB_open( filename, rc->status ); + if ( rc->handle == _PDCLIB_NOHANDLE ) goto fail; /* OS open() failed */ + /* Adding to list of open files */ + rc->next = _PDCLIB_filelist; + _PDCLIB_filelist = rc; + /* Setting buffer, and mark as internal. TODO: Check for unbuffered */ + if ( ( rc->buffer = malloc( BUFSIZ ) ) == NULL ) goto fail; + rc->bufsize = BUFSIZ; + rc->bufidx = 0; + /* Setting buffer to _IOLBF because "when opened, a stream is fully + buffered if and only if it can be determined not to refer to an + interactive device." + */ + rc->status |= ( _PDCLIB_LIBBUFFER | _PDCLIB_VIRGINSTR /* | _IOLBF */ ); /* FIXME: Uncommenting the _IOLBF here breaks output. */ + /* TODO: Setting mbstate */ + return rc; +fail: + free( rc ); + return NULL; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + /* Some of the tests are not executed for regression tests, as the libc on + my system is at once less forgiving (segfaults on mode NULL) and more + forgiving (accepts undefined modes). + */ +#ifndef REGTEST + TESTCASE( fopen( NULL, NULL ) == NULL ); +#endif + TESTCASE( fopen( NULL, "w" ) == NULL ); +#ifndef REGTEST + TESTCASE( fopen( "", NULL ) == NULL ); +#endif + TESTCASE( fopen( "", "w" ) == NULL ); + TESTCASE( fopen( "foo", "" ) == NULL ); +#ifndef REGTEST + TESTCASE( fopen( "testfile", "wq" ) == NULL ); /* Undefined mode */ + TESTCASE( fopen( "testfile", "wr" ) == NULL ); /* Undefined mode */ +#endif + TESTCASE( fopen( "testfile", "w" ) != NULL ); + system( "rm testfile" ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/fopen.d b/user/pdclib/functions/stdio/fopen.d new file mode 100644 index 0000000..aee103a --- /dev/null +++ b/user/pdclib/functions/stdio/fopen.d @@ -0,0 +1,15 @@ +functions/stdio/fopen.d functions/stdio/fopen.t: functions/stdio/fopen.c \ + includes/stdio.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h includes/stdlib.h internals/_PDCLIB_glue.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdlib.h: + +internals/_PDCLIB_glue.h: diff --git a/user/pdclib/functions/stdio/fopen.o b/user/pdclib/functions/stdio/fopen.o new file mode 100644 index 0000000000000000000000000000000000000000..165ba0ae9b91af77af61ae42ca9681a4d90599d4 GIT binary patch literal 3676 zcmb7GU5I4G6+U(E?U~!tJw3nfYTRJUjBzAx_llFCt69e#$8}&3BMuk^$NsrJbG7^S z(0x0uA!`h?3mL|TT>}ymh!gZdWJMpu1cJ%3LBy9lh$ub?k{=S;JR~{<$(oGcSGQ{V z?!M)~t?&HRIaQ~sZq<(#mhM(ci6tej^d*r;2NTPzh8fu}ld`<|*NuP7Y@EnTJi2kh zmw0Gv!5?{3PM+%x{f2&@evIawyQaMvqBqTefB$lKcXxAPXXC_U!;Vr;@Pa{ zwJpycbNN%};zQuxnH!~p<|a*lW;*}$9|yEM2XbNm=?mWJ3+gmAW|Vq{@BRT@)R?-i zFp+Z$R~N?AxEdW0ai%4gJCbvK5!bK<5pM+A#R-wjK5+|&bGK<>U_#|`6cj9j!+Vxn zhD7`ci^x377-R1Rr$|Qax!H~&fxDU zd4r!4{J|a|a|`)D{SvJ|hGxbss3kaOKcap_9Rna$_7jSuii2>byzH%vH>M72F`vCi z>$p0r#nJ406eo;0nPm)j(uh}P@1=N!VoGP~Ko$!v?miQ$m|bS%{dx?}6n3EZYuJa> z&(UI$I5d*2;!BWojG)HJI%g#30^Im~am;*bqj7E*p zNo8E{BG2M;WCg8K7YoB^^#P|xqZifUupM>F-MAjMrBuc;2A!zV?20tn>p@gPN|BZO z?wVg(Ji1bAM~!f`w8kA_b?A{OFcG~`P`fq%;cfq|ZU006%=T|j`tQE*qCe@bKX~L$ zH&=Z1dya!KaAa&8i9I663f?EOAdd7{3QY&mCVTKaEcfHnW0Tjw*nS zuLI7sAzNjNt!g)}#DTC=RA~j5L|KXDvbvOQDQvQC_=5m$)m|fr>cUvP?jNw;c67ri##-YLT#$PTBmF`-* z6BqY7G75$g){o0tC8{?ALBf#h+7C`2odAv;y|mi(AT=b~_r_btXph~yT%0e?mS#&g zn|vlsBj_akD4Tic$Wd?{m8*nJkz@1ohl?}I)m{|$k{AbPds_O|4JM|@C>8>jz^)SY zLqG3%Kf!A1UvFx`?kxC6PdURGDRrN0#g!^B?j*QoxlYh5#mrr*SK^A4s@*QwpxRqq zsZ^_-;QLadOQH#*2DW)$ZiZ1{y_@Y?+O*!Qa&I75-@VeQM5|OK(J%xl)!MCAfLfHI zb{v#Yw}aRawa3%l8Xa!3|AVf9FUldfLp1TeO>bbkt*?eYo4DxqY+i&vL0*CEPd^?b z{#Gd`e*}@+DWu58`zCbyA7*Uyvo@+Me+Ya!1pPiReF)ZeG{sXtj$_O-Y{{}mph(Z- zFPO(YFmfKOft?5M1KS6zypIVzN5+t~@wc3gcO$M{&WrJgHr^xPZ6C1m7z{U(F=TBm z$d;$+Ir!aVdA91To>Njc8`LUpCR7cWDMC{#N@+g%1AdcW;Jl2Uh)A1g}zWOe7 zmTWvLTTJUc`PZ)16EA%cQ%+}~Y-gSHawU`Q4*R9WboI>pF0Sz1)hAcDbNb}!l~2o@ zai3gW#k9-{_sK{@W7V;Jw(jG6zKaja;u@2=~3{be%$F_u{81uFn4FI^_@Jtp?< z7<*kOH+ikn-!}652LEjEGlP6faXh02uQ6CM_#J}}803F}^Q#$LCF1a{ o8~alRpEvjd5&o|m`7I*q+hl&|bv@Bo +#include + +#ifndef REGTEST + +int fprintf( struct _PDCLIB_file_t * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... ) +{ + int rc; + va_list ap; + va_start( ap, format ); + rc = vfprintf( stream, format, ap ); + va_end( ap ); + return rc; +} + +#endif + +#ifdef TEST +#include +#include +#include <_PDCLIB_test.h> + +#define testprintf( stream, n, format, ... ) fprintf( stream, format, __VA_ARGS__ ) + +int main( void ) +{ + FILE * buffer; + TESTCASE( ( buffer = fopen( "testfile", "w" ) ) != NULL ); + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MIN ) == 4 ); + //TESTCASE( strcmp( buffer, "-128" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MAX ) == 3 ); + //TESTCASE( strcmp( buffer, "127" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhd", 0 ) == 1 ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MIN ) == 6 ); + //TESTCASE( strcmp( buffer, "-32768" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MAX ) == 5 ); + //TESTCASE( strcmp( buffer, "32767" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", 0 ) == 1 ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", 0 ) == 1 ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", 0l ) == 1 ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MIN ) == 20 ); + //TESTCASE( strcmp( buffer, "-9223372036854775808" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MAX ) == 19 ); + //TESTCASE( strcmp( buffer, "9223372036854775807" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", 0ll ) ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhu", UCHAR_MAX ) == 3 ); + //TESTCASE( strcmp( buffer, "255" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhu", (unsigned char)-1 ) == 3 ); + //TESTCASE( strcmp( buffer, "255" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hu", USHRT_MAX ) == 5 ); + //TESTCASE( strcmp( buffer, "65535" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hu", (unsigned short)-1 ) == 5 ); + //TESTCASE( strcmp( buffer, "65535" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%u", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%u", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lu", ULONG_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lu", -1ul ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%llu", ULLONG_MAX ) == 20 ); + //TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%llu", -1ull ) == 20 ); + //TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%X", UINT_MAX ) == 8 ); + //TESTCASE( strcmp( buffer, "FFFFFFFF" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#X", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "0XFFFFFFFF" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%x", UINT_MAX ) == 8 ); + //TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#x", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%o", UINT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "37777777777" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#o", -1u ) == 12 ); + //TESTCASE( strcmp( buffer, "037777777777" ) == 0 ); + /* TODO: This test case is broken, doesn't test what it was intended to. */ + TESTCASE( testprintf( buffer, 100, "%.0#o", 0 ) == 5 ); + //TESTCASE( strcmp( buffer, "%.0#o" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", 0 ) == 2 ); + //TESTCASE( strcmp( buffer, "+0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+u", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+u", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", 0 ) == 2 ); + //TESTCASE( strcmp( buffer, " 0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% u", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% u", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MIN ) == 12 ); + //TESTCASE( strcmp( buffer, " -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MIN ) == 12 ); + //TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "02147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MIN ) == 12 ); + //TESTCASE( strcmp( buffer, "-02147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, "002147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MIN ) == 12 ); + //TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%030.20d", INT_MAX ) == 30 ); + //TESTCASE( strcmp( buffer, " 00000000002147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%.6x", UINT_MAX ) == 8 ); + //TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#6.3x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#3.6x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%.6d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%6.3d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%3.6d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#0.6x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#06.3x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#03.6x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#0.6d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#06.3d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#03.6d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+.6d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+6.3d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+3.6d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+0.6d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+06.3d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+03.6d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "- %d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, "- 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "- %d %% %d", INT_MAX, INT_MIN ) == 26 ); + //TESTCASE( strcmp( buffer, "- 2147483647 % -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%c", 'x' ) == 1 ); + //TESTCASE( strcmp( buffer, "x" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%s", "abcdef" ) == 6 ); + //TESTCASE( strcmp( buffer, "abcdef" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%p", (void *)0xdeadbeef ) == 10 ); + //TESTCASE( strcmp( buffer, "0xdeadbeef" ) == 0 ); + { + int val1, val2; + TESTCASE( testprintf( buffer, 100, "123456%n789%n", &val1, &val2 ) == 9 ); + //TESTCASE( strcmp( buffer, "123456789" ) == 0 ); + TESTCASE( val1 == 6 ); + TESTCASE( val2 == 9 ); + } + TESTCASE( fclose( buffer ) == 0 ); + char readbuffer[1000]; + TESTCASE( ( buffer = fopen( "testfile", "r" ) ) != NULL ); + TESTCASE( fread( readbuffer, 1, 1000, buffer ) == 985 ); + TESTCASE( fclose( buffer ) == 0 ); + TESTCASE( memcmp( readbuffer, "-1281270-32768327670-214748364821474836470-214748364821474836470-922337203685477580892233720368547758070255255655356553542949672954294967295429496729542949672951844674407370955161518446744073709551615FFFFFFFF0XFFFFFFFFffffffff0xffffffff37777777777037777777777%.0#o-2147483648+2147483647+042949672954294967295-2147483648 2147483647 042949672954294967295-21474836482147483647-21474836482147483647-2147483648 2147483647 -2147483648 2147483647-21474836482147483647-21474836482147483647-21474836482147483647 -2147483648 2147483647 -21474836482147483647-21474836482147483647-214748364802147483647-02147483648002147483647-21474836482147483647-21474836482147483647-21474836482147483647 -2147483648 2147483647 00000000002147483647ffffffff0xffffffff0xffffffff-2147483648-2147483648-21474836480xffffffff0xffffffff0xffffffff214748364721474836472147483647+2147483647+2147483647+2147483647+2147483647+2147483647+2147483647- 2147483647- 2147483647 % -2147483648xabcdef0xdeadbeef123456789", 985 ) == 0 ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/fprintf.d b/user/pdclib/functions/stdio/fprintf.d new file mode 100644 index 0000000..fb466eb --- /dev/null +++ b/user/pdclib/functions/stdio/fprintf.d @@ -0,0 +1,13 @@ +functions/stdio/fprintf.d functions/stdio/fprintf.t: \ + functions/stdio/fprintf.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdarg.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdarg.h: diff --git a/user/pdclib/functions/stdio/fprintf.o b/user/pdclib/functions/stdio/fprintf.o new file mode 100644 index 0000000000000000000000000000000000000000..227f7a581c3d300311cb4de7c1e32cd4812d1bd9 GIT binary patch literal 3248 zcmb7GU2GIp6h3!mw%uj7OH0d-fLhZcMP+M3RfK>@S)mb$QHW2_%o;o_9unyS22mG+(^-ZSe*tE)=g_y)0@#ZO9L1?fkm@fLfvY5!xD+Y<6eX zPK(%@&5Jmz#LjQaZqH5)ilmmqg-p+&%4Vrm5PJJME?bw0qz9FqkF6)Qop2kCZ zq77m>DL;tBc2Wo7Vy9C%fU|{Dzc0ck$xW zBE0~yZnq^zoIMo(IgAkz4l{vDHz`@ENlI4l`;?sC>x6XgivXuU{^yS|rdi#XomVfx zIrBC3%hd}2q{=X{-LJR^YsASs$9MyZYqmym8HeHu^<^yfXFj9zpcaQR8z~NHaZP3i z#g&RFt&#PadzEr zc}k29UTp>9xlI~vE+GXMbRn<&#q_7G9hQYfP{YBJh~17I!KXQaEwH4;;$vEiF%BVD z;W~>)uPC;z?^vB!=3tsgzFrC=H}WKmnx0#is$cU0x9)WoO~rI1rB>AoDjjX;zd|ji zw!)6KI@buHtu=y~;dp2Tp+6INm0{ikv#O4=JnJ@Pe6~^d#>v)vVAu%9TcOt+pR1H> zeo4aFMl%}jOko@>#jhNfSvRQEJh^L^#=ERqbe4f)vV)dfh`G3PB_C3h3cxoS5><$!XOlPuu^X`{Bzgp+7~!Z&C6< zn`6EX`V1aJyRvxcL0E~0^XW&KuL#QVT?E$fB+0~k7)tv8m*1oCVLU^OchLwyW80nJ zY2E|_FR&rQ?t~&)$3E1t6-L&<9+*1#?lyD4%5}UG-XWvO*bYEW#yg$s_J#GCct^mS zISet6!XF`{$=K?U4Nub-@Vig@5RA?aUMM9a9>D&BVJ&FKqkxQU5&=iO^J*`XUO<{2t{JLoP}SKjP0wt{LaBI z**~t2bOBGYjt>%btbonbF#sM*@6ZLryV8-mYhwQP=b&vI!f#7Il&c`}>&tlT6LTix zjban{u`p!nFtWj<-jTof@6w?={}vfPnSrvYx;@2~JDX>BZnd%VM0Uv*6q6uZcyhXA z$2*^tS#g(aVHdk(3p?B;8=Wx``A%7Zo#yYJA@sm> zG=8ozKBMrvtmW@C{-p6wjkh)O2bOWyX?#fIlN$GFJfiWa#ugFvp3r!Th^>7?+uzoB YmU-Y8_YZ?X_MLkEvnpI}o>R*I0w}wUR{#J2 literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/fputc.c b/user/pdclib/functions/stdio/fputc.c new file mode 100644 index 0000000..e903611 --- /dev/null +++ b/user/pdclib/functions/stdio/fputc.c @@ -0,0 +1,57 @@ +/* $Id$ */ + +/* fputc( int, FILE * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +/* Write the value c (cast to unsigned char) to the given stream. + Returns c if successful, EOF otherwise. + If a write error occurs, sets the error indicator of the stream is set. +*/ +int fputc( int c, struct _PDCLIB_file_t * stream ) +{ + /* FIXME: This is devoid of any error checking (file writeable? r/w + constraints honored?) (Text format translations?) + */ + stream->buffer[stream->bufidx++] = (char)c; + if ( ( stream->bufidx == stream->bufsize ) /* _IOFBF */ + || ( ( stream->status & _IOLBF ) && ( (char)c == '\n' ) ) /* _IOLBF */ + || ( stream->status & _IONBF ) /* _IONBF */ + ) + { + /* buffer filled, unbuffered stream, or end-of-line. */ + fflush( stream ); + } + else + { + stream->status |= _PDCLIB_WROTELAST; + } + return c; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + FILE * fh; + char buffer[100]; + TESTCASE( ( fh = fopen( "testfile", "w" ) ) != NULL ); + TESTCASE( fputc( '!', fh ) == '!' ); + TESTCASE( fclose( fh ) == 0 ); + TESTCASE( ( fh = fopen( "testfile", "r" ) ) != NULL ); + TESTCASE( fread( buffer, 1, 1, fh ) == 1 ); + TESTCASE( buffer[0] == '!' ); + TESTCASE( fclose( fh ) == 0 ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/fputc.d b/user/pdclib/functions/stdio/fputc.d new file mode 100644 index 0000000..0e1bd17 --- /dev/null +++ b/user/pdclib/functions/stdio/fputc.d @@ -0,0 +1,11 @@ +functions/stdio/fputc.d functions/stdio/fputc.t: functions/stdio/fputc.c \ + includes/stdio.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdio/fputc.o b/user/pdclib/functions/stdio/fputc.o new file mode 100644 index 0000000000000000000000000000000000000000..d01ee95e1e6613ef40c0027fb4511f2cd9ae0369 GIT binary patch literal 3152 zcmb7GTWDNW6y5hRoteyJn#c4ZjdV&P# zEsB*=+7PQ2zf=$e5kD&aC@TJxiikhb5B(HMMG*DF$B)u#T7TZ)9n7xHW!X;U&u7iG`P8|= z^K%9it8@9#7`9Ub4_pp*gl;3JubO8r1dRBq&y8Tj7oUnTXza`lXRO?|+@LXJ3}9*Im}D~hGFD2&Qr(=0y%E}(VUfgUv2v4{ zJt5gJY-BPd1}w?`u4Q+hNNU)ya-lUrYg$Asu~JcV z6JA+RH5sX#Mjg$tY_^d{-`EOrHdKf_tI2HT!OYZ)890VI-) z^Yc!0H>Aw#9GLtZjd_DAb5xQ5G5?I1Er~}-|2l>i5hfYcNSz=v69qCe`8JuIyh2DN z%YejQ_OHExHuVFVaVuxc!a043`i;h60H#WFVr#(QBFs@ceFx(W8j~T-rmxXDWLymC zK>B0SVMX)l`$_YPZcWdUZZbHfIXaTwNV-{tDx?oF@|JK7=I9tI@*(Vf#@%Rn3;+~e z#Y_d-umBe%i?aa6)teXWsN$w9P-$Gx^`i}sJIqF{<5hxs%kztVP_4JbDPk|&wpVKS zBDLjCP;n4gWMS^W^z6+3g-Xk-)fb&5ZmZT|M5I6w!`((bo=AQ2+e=6G%)U5hoxEuE zIjQ_!)5OGFG88NqLE0?)K`C&> z587_2DYbgT^-4`w{*iA{rx-;pcWSOz?Iz~ePr3^MVw8f8-__QZTRyanmbX|4n~vw# z7d^LH;4$u!%2KH<#idr$EwbCF1O1j??D%fGxLmC?>SghlTJ50F9m4TgLcO{oOC_(` za0OGzB;MP2xOYJ{n z_9w*gPc(y485p!9T++R^+i(I->QqZXNu09pqwAJCiwmW4x$QnB4qYNm-K*ii_IRW2 zx!SwYs>Dspoieu{!FukccF9|$DvE|Bh*N1bn=Xprc&)&7P_SLt{K}K@VYN2T(f^R` z@a0j*a~TSMN8(3SAK-1!rz4lJ{T(kT@4_a098W)TUUG6?84BN;xafFyLP`Js@(Ul7 zSOCU*FUC0+Wj{XMCqE9ti>XC-_dyZQLoy--7?}rap!4AKtjC}$*KpU@*ioWwN5SLq z3fW#=n4gaKIQn`FLo|{2UF;~)wkEjl)ATC*_?&3bwmKB?dB0cV%r>k74BAt5pbofhr)78J4J zasYmD(YBBN#V=kzu8;CQzIYx}u{?%g(|HV{kEM5I8S{SDWxX|V{^*&Hj8_nR0Lsmv z{7Gay)`@e*<6Xu5ppO=vhvpjNdRu;3*Lvd3|MbY?Gmz`7qfwUJTs*6LtF@gcvL}}C zZ%|JxUWS-h;m-FIR+w>|vx+^jgca_Ih05r?;F~gpoo3Cnux{O-@#r_MR%>+pC8&?% zGvUBHX&^0ZqZn8oXC#L24)7LoY|yO=cM$Q9tEl|=r-uI13LjC(_|(@Gt|&aC@CAjh zD11%fn+o4i_^!h6d?Fst5aWKO@LPqyD&(IG+IfbE+Z8$r_bPl$;Q|r)RTM4~v5hOr Z-e6qV!#bhS$l6lRzbOVTFy9dJzX3n;e@XxV literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/fputs.c b/user/pdclib/functions/stdio/fputs.c new file mode 100644 index 0000000..94af1ad --- /dev/null +++ b/user/pdclib/functions/stdio/fputs.c @@ -0,0 +1,65 @@ +/* $Id$ */ + +/* fputs( const char *, FILE * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +int fputs( const char * _PDCLIB_restrict s, struct _PDCLIB_file_t * _PDCLIB_restrict stream ) +{ + /* FIXME: This is devoid of any error checking (file writeable? r/w + constraints honored?) + */ + /* FIXME: Proper buffering handling. */ + char written; + while ( stream->bufidx < stream->bufsize ) + { + written = ( stream->buffer[stream->bufidx++] = *(s++) ); + if ( ( written == '\0' ) || + ( ( stream->status & _IOLBF ) && ( written == '\n' ) ) || + ( stream->status & _IONBF ) ) + { + break; + } + } + fflush( stream ); + if ( written != '\0' ) + { + /* FIXME: For _IONBF, this recurses once per character - unacceptable. */ + return fputs( s, stream ); + } + else + { + return 1; + } +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +#include + +int main( void ) +{ + FILE * fh; + char buffer[100]; + char text[] = "SUCCESS testing fputs()."; + TESTCASE( ( fh = fopen( "testfile", "w" ) ) != NULL ); + TESTCASE( fputs( text, fh ) != EOF ); + TESTCASE( fclose( fh ) == 0 ); + TESTCASE( ( fh = fopen( "testfile", "r" ) ) != NULL ); + TESTCASE( fread( buffer, 1, strlen( text ), fh ) == strlen( text ) ); + TESTCASE( memcmp( buffer, text, strlen( text ) ) == 0 ); + TESTCASE( fclose( fh ) == 0 ); + TESTCASE( remove( "testfile" ) == 0 ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/fputs.d b/user/pdclib/functions/stdio/fputs.d new file mode 100644 index 0000000..76b672e --- /dev/null +++ b/user/pdclib/functions/stdio/fputs.d @@ -0,0 +1,11 @@ +functions/stdio/fputs.d functions/stdio/fputs.t: functions/stdio/fputs.c \ + includes/stdio.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdio/fputs.o b/user/pdclib/functions/stdio/fputs.o new file mode 100644 index 0000000000000000000000000000000000000000..026d8bd09dd529eb00bab622250ad4f2707d7ccc GIT binary patch literal 3256 zcmb7GU2GIp6h3!;+S%?;f42M>N?6k(^@mv^)c^*pEw$7jX;2>2#JWGT?Zn;LW@lEa zfv9P!g{na0fv6#vV8VmE8Rf-DFe*Oz;-e4##6*J+$_p`|^?Wn;?hd{fPcrvA-#O== zd(S<0X7}ZZ{f`PENQoew+KlLAN8}j^VVKrYKOH*u^WtyA*QQq{QY-sX7^nN+GuEGKHp| zomU#?SUYA6{c>w{bu~=T55wLeV`aip_G{)P?Dp%=MX%VL$tLy8hD@*M6Ft0bZHSV| zJxSdn(xsXqGP>D1l_fIQlAhU>d?+LxS&>YF2=;WQTb>H5TO&@}=}YJ&rb zZqT(dRW5M=nb(DT&<2P2L_T4Em)OgrNDI^oQKxu@qmw>+plGKk#rK36D$q_D>3Oj1 zD398yI_Eme_6%s)4vl756XIqj&13lfuwPV~UMXuFvch;Um&y|g5L-t648hu*R zcwOuUgGPY?)Fa&jqD+mNC@K_mD7snaIrJbu;eJBjK+9)@9D_P0=(VCB6at6*py3p1 zRB@}0SExCyEyFMqP_bEYymHIxyD!0tsZC$5ri!f0*M0U?>)vcG9Gaf*&U#Kchns!4 z;Rb=@QOj7GD>NuSSFbsFs8yHIulxC??=p#6DXrmD?Es6~qMfOrcn8I4_WmkjUbC6~4D^UUfZ3 zMOW*kxNE*y#5Le#?eIdQ;LXAmW#cW7U8>h=4j+Q;)dR=o1KY}XqV#-xTBU*e^gm=1 z$KuL&$T=g7I1eT2B5zi~{d2XZxn)~NE`%NE4{SKKy^ zK|UqO_mv`y$~P9%;Xc6*yr4>yx`z$%I-cV?@MT6FI0ID&KH+K(tF)ardK`)r8dJ9e-a0w-w(M@P7am?wF?l literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/fread.c b/user/pdclib/functions/stdio/fread.c new file mode 100644 index 0000000..83bc3b7 --- /dev/null +++ b/user/pdclib/functions/stdio/fread.c @@ -0,0 +1,30 @@ +/* $Id$ */ + +/* fread( void *, size_t, size_t, FILE * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include <_PDCLIB_glue.h> + +#ifndef REGTEST + +size_t fread( void * _PDCLIB_restrict ptr, size_t size, size_t nmemb, struct _PDCLIB_file_t * _PDCLIB_restrict stream ) +{ + return _PDCLIB_read( stream->handle, ptr, size * nmemb ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + /* Testing handled by fwrite(). */ + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/fread.d b/user/pdclib/functions/stdio/fread.d new file mode 100644 index 0000000..2677800 --- /dev/null +++ b/user/pdclib/functions/stdio/fread.d @@ -0,0 +1,13 @@ +functions/stdio/fread.d functions/stdio/fread.t: functions/stdio/fread.c \ + includes/stdio.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h internals/_PDCLIB_glue.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +internals/_PDCLIB_glue.h: diff --git a/user/pdclib/functions/stdio/fread.o b/user/pdclib/functions/stdio/fread.o new file mode 100644 index 0000000000000000000000000000000000000000..1989790afcbdc76c2d43773a110593b5e7086dda GIT binary patch literal 3184 zcmb7GU1%It6h8Bp%yu`MpH16Ht6fP-TeP!^QA)M7ZCcwvT1smW5l!}IHd)=B4Lh@1 zMG=*XAqoZsK|v4{eNY4|>Z^!~5Bk(sU;F_P!M_I|T8-Z~bMNj{1o6P!@BH0!?m73~ znR)!!+#QBth$cfU=}RKF4J4N77hHO7n)gfpikn?0DdToFsLc@cXU+S!7L zvqh}@{_L%>FiqwU@wXVSFyoqS%tReqAiNkWMD{2&ZKn}LV%g3u0?k!*1mDgJc^BO)ATRKtCmlIiTC zWDZ`SWDkB#a0lA}=P3DaUd8Bo7>3<5GSIV|=t3qTUUvQKKD%r7)^B+TxY4b$%x(H^Z2(HoG-H6sdRoa?Pvq z5-glPIx{zWWTDy)>Ww9DnFm7aFga1g(ZE_rDo%W4(EcU&chf|ADmj=E*+hDQcZn<- zi)9fpO<+up+y`*I7f-yF*tWfAvtyZqZW{SkC5+0EFJXk`w&fOp=8A;zO_&bFVy_KkCA6mhc-=iMXc%^^p;@ZnZet^lJ> zg3Frg_)RZjey>)J%HmZ*9M76x=`JmlE0vD_pm=miG>xE+gWQ*!jlkF5&2}|yTIp8U z0R-#2mpkQPiK-+TmLOiW-D>&hhZnRX-$N7k;sjJ5NKdPG*vkJwJK)R1KcMDJ1Jj3B zAL(t-XOvG2coFkW%sVAFMsg2&Q(6d~THJ*l6IIg=NEV!VjpBT({}BmQUt*(c^q$NLWd zEC04{aJz!iHQDm(M%sAg-yY+qGf>u5C$lWMvUyhTR%<&?WS=a-B2#1uPfnk#c<0kH zEAEpe>|&oRVTb!OJr7J z{O$o>MH!oPwZdzO_<1WSzgrZ}C_JI?9)%5s=M9@O(35qBu`6dq7`R^fue`-!MCP}m`2OIMZsC53M&e3JR#ANLP~ QM)sZh2_h~x&ne}<0VWf2`v3p{ literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/freopen.c b/user/pdclib/functions/stdio/freopen.c new file mode 100644 index 0000000..13992de --- /dev/null +++ b/user/pdclib/functions/stdio/freopen.c @@ -0,0 +1,56 @@ +/* $Id$ */ + +/* freopen( const char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +#include <_PDCLIB_glue.h> +#include + +/* Close any file currently associated with the given stream. Open the file + identified by the given filename with the given mode (equivalent to fopen()), + and associate it with the given stream. If filename is a NULL pointer, + attempt to change the mode of the given stream. + This implementation allows the following mode changes: TODO + (Primary use of this function is to redirect stdin, stdout, and stderr.) +*/ + +struct _PDCLIB_file_t * freopen( const char * _PDCLIB_restrict filename, const char * _PDCLIB_restrict mode, struct _PDCLIB_file_t * stream ) +{ + /* FIXME: This is ad-hoc (to make the vprintf() testdriver work), and must be checked. */ + /* FIXME: If filename is NULL, change mode. */ + /* TODO: This function can change wide orientation of a stream */ + if ( filename == NULL ) return NULL; + if ( stream->status & _PDCLIB_WROTELAST ) fflush( stream ); + if ( stream->status & _PDCLIB_LIBBUFFER ) free( stream->buffer ); + _PDCLIB_close( stream->handle ); + clearerr( stream ); + if ( ( mode == NULL ) || ( filename[0] == '\0' ) ) return NULL; + if ( ( stream->status = _PDCLIB_filemode( mode ) ) == 0 ) return NULL; + stream->handle = _PDCLIB_open( filename, stream->status ); + if ( ( stream->buffer = malloc( BUFSIZ ) ) == NULL ) return NULL; + stream->bufsize = BUFSIZ; + stream->bufidx = 0; + stream->status |= ( _PDCLIB_LIBBUFFER | _PDCLIB_VIRGINSTR ); + /* TODO: Setting mbstate */ + return stream; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/freopen.d b/user/pdclib/functions/stdio/freopen.d new file mode 100644 index 0000000..6b064cd --- /dev/null +++ b/user/pdclib/functions/stdio/freopen.d @@ -0,0 +1,16 @@ +functions/stdio/freopen.d functions/stdio/freopen.t: \ + functions/stdio/freopen.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h \ + internals/_PDCLIB_glue.h includes/stdlib.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +internals/_PDCLIB_glue.h: + +includes/stdlib.h: diff --git a/user/pdclib/functions/stdio/freopen.o b/user/pdclib/functions/stdio/freopen.o new file mode 100644 index 0000000000000000000000000000000000000000..0dd047d9f34059cb534cdbad7387386caaf41628 GIT binary patch literal 3572 zcmb7GU2GIp6h3!mww>)ROUo9h07k6iyomoXA zib0GOj8=WpMAR6gi9TqIn)pKei7^^qjx*+2i&kzYrS9CD>I@DcTA&Y?NBbMV;2 z>J4&O0i>d+%O>G=9Qg`tSMU4+M1fm(>hR8H)rEOS7xX3Og_;^ zzf7td#e!e<3Sm}x4ZDgB06A(6c!lA~bCCkU^p;yrs_utkJE^VE*lx-KIL-vzY}I!b zkQ#)>I=caEpKG0e0NDQ>8tX5rto70l5bN()awK&x#eeppMTAL4Rqo@ItkgzIR{y({ zoc_}Ux4#KU-A4Y0m(jY{pc%7sYB!wI-%`I+?E)ZGnu+Z}#X(r>o%FSgH>9>kVmAE; zt;^KgkvN$CjACAk!|Cl5hqXA8zKh~=#gx|i)#;5CSLjfM^zDqiG8%)m9u?$#2>XEg z3auK6)Zn_S_#(VBjG#uyS__i-J0Urlb&e`L+5?ahCgT zbm$W+u*y+6*dyw|@9u*8@t5zo3)Z?knhp6AC*0wiEDPy5C^nXa4$+Qzm&mHIq{Bjr z=u)(CiM;{KK74vuk#%*~ii4%e)E&iUIS5OkCl}3gyf?KVYJL%Npq-$rt^Z)k>pYmSDEk4h!8b?2jSTs|UN&o-O&+h9^i_=g#%Q(>F?i4jiX6TU9SH zDB8`A)v6fpu08t;lZ7qCEyZhfUY)Mywc~!2^-QA3zIQMb*)=)2wJ^57-0{Os+}DP3N$gzo(@X5q_ME%psI?>|#o)naSSka%(_E*_{YJ2!d#PRW zXQ+y!VF*&Jw3oY zL-%AwZh){HAN$jf2ZjGd$~-@$2?_}^@vef7{{Q8-89vDnjQ3U|p0Vw?$nOjcJf(&V zyA6uuJYK*&Hp9qya1G2n_(L~+z{)ci=mHr{#?@atAkJG{W_611DnbFSfUSDIRHa}j3yKB5aeXMQ;5fN!+C)1 z#(Ne#`*2@KPa)nNCJ1D*{9e*%{Ju|#j6!F~_`MEAqPtk85VfPR@#SN9njH8g*AK&p z=zX-wdHk4|$1>RH$9);XXKD|uY(~7#$!IdUi19x^Hav?b#~hR^ATGtncw8suOvV$` z)!on;GVzRTFsXOsw?(5TUiea_d_e|CX4Y{pTd>Fpvb(3+*g5ka*@DR=$QD*kkL+mY zlQL)ABRg8fq|6oWk&Trx5&2J9h8^Tn%@Eg(cd8-E{2v*jyvYba%GX~c^QmNr_B)IK zq-^dgyd2DBU8^-Z!7Rnz6V_;%w@$#h%`$L{=uXAvyfy8 zX)F}fokT1_iHM0lLBvJ#9uWuWQz8n7C9belC=pRuAl4$0XN`CX5k#B1ntvA%&($xhKSPSxuX3MjmI_m%me>u-Ow21{!%|e#5v~+jPk##u-$?H literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/fscanf.c b/user/pdclib/functions/stdio/fscanf.c new file mode 100644 index 0000000..bc5bebf --- /dev/null +++ b/user/pdclib/functions/stdio/fscanf.c @@ -0,0 +1,35 @@ +/* $Id$ */ + +/* fscanf( FILE *, const char *, ... ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include + +#ifndef REGTEST + +int fscanf( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... ) +{ + int rc; + va_list ap; + va_start( ap, format ); + rc = vfscanf( stream, format, ap ); + va_end( ap ); + return rc; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/fscanf.d b/user/pdclib/functions/stdio/fscanf.d new file mode 100644 index 0000000..82e6ba6 --- /dev/null +++ b/user/pdclib/functions/stdio/fscanf.d @@ -0,0 +1,13 @@ +functions/stdio/fscanf.d functions/stdio/fscanf.t: \ + functions/stdio/fscanf.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdarg.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdarg.h: diff --git a/user/pdclib/functions/stdio/fscanf.o b/user/pdclib/functions/stdio/fscanf.o new file mode 100644 index 0000000000000000000000000000000000000000..f0941d55e008e1cd641e9da8d8522de67a3be362 GIT binary patch literal 3284 zcmb7GTZkJ~82-=9WH)Ip-AixUimSVAw`#Km*IP?3cAM74Qi@tcuw5s~WHXvf)=W~W zc&~y>5$#h2QBl?hr9OxSeG$ZZeUT#42SEfu5b;u>;6q#2@0*;HOnni5nDhO&^Z)1n z&p9*mWMS`arIZ*_VoOgFdAYA+nT%juR?0FtF#prhU&mi4WR8C9%ooldD`buxI6r^S zSaN>Xm~*Ua?gqwKg}LwsWgGZa= zofNS(n-g(Xh@IP<-jbdk7D+6H3z@!Ql}=NuAoORuF1IcbNe(MJ7g-aurnEINJxuG8 zyxN}WL|mVl9%k|#ee_Ewx=}3nWmaLW*-5dJo#fQz)(Ml#S#-r>E#jyv!K-x`jzkKP zTQpiu!Vg+vJBj_U+R4Ns{XfTGeN(`gaPGuttG-{T&obn>wP5>_)`e$){U2elE>dNU zN^gw;l~HPW5J`B;KqJ|a~&DAzpMJ-xRe$mesfx+^&B&eZ&{C6z|A z?#5Dbev}qLxOOp)y|vQC>{+FZGWP5{FfuhVnV-zxDE~SX6Wz`4tWz(q;x#+PQ`UQ+ z8xSQAydy1WTg?tu4cGK)`4-dW%Wlh+d@;l+E_=oH?2KD1Hoe1=r%OlU z2Nj(6o?P<-&v@4wrMPLXUF0!Au%5fybc0!{I?=EM$(I`Sx`%G$gGS5Cqoo^hW=apm zr&XFfZ~ud?hA;1g{!9tKQ}H8h4*F{7Q+N#BpT-Lj!g4&EPe00hXHbqVBd~@iPA1;< zP}2Xu{5HXd@eDB@-?fH}Z6_3lr)>iS-e5z9-3CRxjxy@l0VC^R4@@0=ubVkw#l}M4 zAfw6H_Cb!vTgdeK!um|SL*UIEhFCzn8^~xfwmM|P({u)YS7{%DvH9TRc~8djqNHx# zr(<)#%5R7_LPnE`_c-KuyilOQ(kVRgIzElnF$5d^xG#fv(26ddLA=kpQZE;C zcD@H4<0kyl3_!U8BEQUx$38J34O;%hfLVqEXYpZwqH(&c}Wj33WH*;L(` zV$0>tv%9z2*jagxY(X(GvV|w7M|QOHahVnO$d0-gm)YSS+31YPz<0_Js%75|v2VRk zzkbIb?tO2^V7B1Id#O+wwo(+9$QZ=v-J|=gut~fp#A}H7`J2#wH*4IYk$0B!`F}^O zXvFsaNO*A%w+xVFEp@kQo?U(`no2HAh=`CqGW$@zOj`5&s3l5_w7 literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/fseek.c b/user/pdclib/functions/stdio/fseek.c new file mode 100644 index 0000000..ca0017c --- /dev/null +++ b/user/pdclib/functions/stdio/fseek.c @@ -0,0 +1,34 @@ +/* $Id$ */ + +/* fseek( FILE *, long int, int ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +int fseek( struct _PDCLIB_file_t * stream, long int offset, int whence ) +{ + if ( stream->status & _PDCLIB_WROTELAST ) + { + fflush( stream ); + } + /* TODO: Implement. */ + return 0; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/fseek.d b/user/pdclib/functions/stdio/fseek.d new file mode 100644 index 0000000..1a8d353 --- /dev/null +++ b/user/pdclib/functions/stdio/fseek.d @@ -0,0 +1,11 @@ +functions/stdio/fseek.d functions/stdio/fseek.t: functions/stdio/fseek.c \ + includes/stdio.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdio/fseek.o b/user/pdclib/functions/stdio/fseek.o new file mode 100644 index 0000000000000000000000000000000000000000..01e6fa01b81d9bf9c08ec320fbd8a14e5779df90 GIT binary patch literal 3088 zcmb7GO^6&t6n@p+von*~o&A~3k7OkyyCD%xPry||LVnC9#>EgM7$hn#^V2iaWTq!h z_m~(WiO7N>9ujg86htA1927kWdJ;i$@FE_(c?pWL2M| zUcKt-zI62XQ%Wf@q{NnyB(j!CEQ>Mhl+7|Lr>^|`=C50>9?e}nG`C$Yi>!VX6(C-5 z7S`^sudjbW-*3JaHLbQ6O9i{QwK%P2)YO=WwIGGUfr6bAu{B#1aVDW%E{S9|iCx@V z*cS_9B~>U;P_SethL$}WL~ z+(4lg*D8+M3SO;&U5ynYJ2YBO#t$N~oy1jhJ$a!PX$)FZzagq1LA_&sqe=#AG8 zs+~}z8G7Csx6b~oJbPs6`10YEdM{}DEw{}!8y#jO3T$fJeS1Q+e);6IWg!!i#>d~1 z$f0240iPqX7E1=KBqp{YIX>^e^(3Bn1+i^zXmetjgV_u6-C7t`BTvGp?^V0f^gCWq z?RvvSQn31p*H=#&Pmp_;& zMaIT|48zk*zx4i@X`jKCu0zI0b + +#ifndef REGTEST + +int fsetpos( struct _PDCLIB_file_t * stream, const _PDCLIB_fpos_t * pos ) +{ + if ( stream->status & _PDCLIB_WROTELAST ) + { + fflush( stream ); + } + /* TODO: Implement. */ + return 0; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/fsetpos.d b/user/pdclib/functions/stdio/fsetpos.d new file mode 100644 index 0000000..58957c5 --- /dev/null +++ b/user/pdclib/functions/stdio/fsetpos.d @@ -0,0 +1,11 @@ +functions/stdio/fsetpos.d functions/stdio/fsetpos.t: \ + functions/stdio/fsetpos.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdio/fsetpos.o b/user/pdclib/functions/stdio/fsetpos.o new file mode 100644 index 0000000000000000000000000000000000000000..ebc1704bb19acb3d8738755d6db0db87fe5f8f1f GIT binary patch literal 3096 zcmb7GO^6&t6n@p+von*~ne6UtlGQ{rvKteB(j&MLi5O$n7+01k!3d(b%umlu<4n&o z-J>!1iv$eG!DtQ=K?vmFA>u_)Zvhb$yy?lKLCL{G6a*oO>-Tk6&2+qo54yhh)qC}- z-mB{Be)HhU<4P$pqQsUl6SMhk}WbTM^FCp&Tn(44(3kn-?l^E5;<`xDuAAJ z7Oq@hUtj-{zTbTJF$AIqTXh!0bqf#H$+SrSK7tkz_A#o;ohGv~3uIRID>5g0 znUKp40htG=|NJr9+#H%+c1f+kIsXIuH>yJbOqJ)v_LSlxta&HzGTyY>8`H`BpR~@X zi!q(be@|N0bT-eF?O9Fd@&`#bDNbq4Z_95a-K;}Z@=r4ImUs=;`~oWS1?(G?i&hmC zbETLno`!b;hXFRO+BzeXYyA+62J4K2@$W+`a@}$qk0mvFt81kq+W6qYu3E#O5&8Wf ztcFq3?~7Z-=6Hjk)(u5kp%)>l+u+GwefqJbmE{AgjegMb+ir(DZTc`K=|ElM17H_b z``6E&vnmN!Vok?Y0BK?Cnt zBywnJX>VoM(fTlmhRN{Vi^G`hxl4zWDbyWT*SZq*T5i&D-o>8Hax=7We;zI64xF%x z8F9l`dr_?pj0OpIj5hGPZp2yLW-Y3TTMt91UVYeJt<~!T?`3i6lJxjN3rBU#yMEvq z?{2@5HmwcoJOc_!fCoU}PSwfysk6wHX6dF5;DcgNhboI}DzV zccn0{3-dGaUW9JOFvQ(R{9YY^5j!~WpY7-W6fKS#t%%zBdl1Kks5jQ{`u literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/ftell.c b/user/pdclib/functions/stdio/ftell.c new file mode 100644 index 0000000..9838156 --- /dev/null +++ b/user/pdclib/functions/stdio/ftell.c @@ -0,0 +1,30 @@ +/* $Id$ */ + +/* ftell( FILE * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +long int ftell( struct _PDCLIB_file_t * stream ) +{ + /* TODO: Implement. */ + return 0; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/ftell.d b/user/pdclib/functions/stdio/ftell.d new file mode 100644 index 0000000..667c939 --- /dev/null +++ b/user/pdclib/functions/stdio/ftell.d @@ -0,0 +1,11 @@ +functions/stdio/ftell.d functions/stdio/ftell.t: functions/stdio/ftell.c \ + includes/stdio.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdio/ftell.o b/user/pdclib/functions/stdio/ftell.o new file mode 100644 index 0000000000000000000000000000000000000000..121579d9db3e7f8b7558ef9f06858b0bf654d100 GIT binary patch literal 2924 zcmb7GON(4Z6h3ty)7|Nro<}D!AqjSvghVj66-SZL#4$4_P8@;+vxrfKe%zk9*nNBG zdpj>*t3U)d;zAIWxN{L93qeNU^HiinjW+mWXgks?wzz@j({1N8jE=-5ridutn>2vC*)ky$Sm6+I_QQU+x@0I2lZ&od8 zakBISt#j&z7H3K~DOQcRy>y7;b|da89i_NKF{LxVw=_+0rwLUnonYkq^d6k~1Go`x zWSd&Stfth10Fu4MG71hockH|a_5y|@>r|@Sl_|`+&tO)aVcbfiew@^kv>o*&sN?>_ zLEPvjBAqnsc7qn%aQ*p}<+au0>#cs=i8g{wmeT65B2(bvbcNk1b?ltuAP-XNCUzwC zD7YBli$w0$ksRatrH)=|<*&n2}(Gsr5Mxyp5*=)q^ZYW39e)v+Cs1pJYrIr44rTw|Eh1@mQ){!e&$d*SsY$UMNTd+FV+s9Z4Tpf zn1wyEFx1kc512GFxbnLoCF-@}q~~2jv9_}ghFF@XE5+kiohe^}@`<;Mqr@hmNYxo!oZwH?dxH2;XfkIj;0`GS?K61W$KsKLk@`xx9G z_jMY>t^q6O@%>&QW60W0LC(i}vYf4FyaI-e_ab<^2CRICc=mClY;94F*LqwKp9o9V zkHyR9UCHHTU2NXh!P_;Au@CWTWDHr`Wytw>Ylz2hf#;aSu<_mo&ovKWkd7kWb2bQM zvK;Rjw0_qR-~e=%tlxDga?9lg6XnR-K7-EkG}AACe|FhT*z)IiDR+)p*yzXllDEAF zR=$VfD>8;`E@Jj{XNE}zhjIsizhsQZd!jlYZxThI-I9%GWs7;eCx6_vdg8tRk|^hQ zLOGw2vb}{YimN+%9MR4GL5vjcJvYVm?3^*Vy7GA$|FLr9>XVNZuD;d0JUz<5$aB0n z`%If(K)xpmA0B&5p;oL5k@rj7O~kSH8Qf3AhgCQB#|$nTeAeK3gOR~Y2Co{_eT?|; z8u@*L9~=C{;HL)pXO#Q-#^5c3zZm?}ApaQ9Z^q#L1_Ogf4ZdJ-orv?b3~mt7pj~6{ XGA``;o-kQt&r#367HTScBPjm^6ZAs} literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/fwrite.c b/user/pdclib/functions/stdio/fwrite.c new file mode 100644 index 0000000..8765d0b --- /dev/null +++ b/user/pdclib/functions/stdio/fwrite.c @@ -0,0 +1,35 @@ +/* $Id$ */ + +/* fwrite( const void *, size_t, size_t, FILE * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include <_PDCLIB_glue.h> + +#ifndef REGTEST + +size_t fwrite( const void * _PDCLIB_restrict ptr, size_t size, size_t nmemb, struct _PDCLIB_file_t * _PDCLIB_restrict stream ) +{ + return _PDCLIB_write( stream->handle, ptr, size * nmemb ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + FILE * fh; + TESTCASE( ( fh = fopen( "testfile", "w" ) ) != NULL ); + TESTCASE( fwrite( "SUCCESS testing fwrite()\n", 1, 25, fh ) == 25 ); + TESTCASE( fclose( fh ) == 0 ); + /* TODO: Add readback test. */ + TESTCASE( remove( "testfile" ) == 0 ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/fwrite.d b/user/pdclib/functions/stdio/fwrite.d new file mode 100644 index 0000000..5320b06 --- /dev/null +++ b/user/pdclib/functions/stdio/fwrite.d @@ -0,0 +1,14 @@ +functions/stdio/fwrite.d functions/stdio/fwrite.t: \ + functions/stdio/fwrite.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h \ + internals/_PDCLIB_glue.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +internals/_PDCLIB_glue.h: diff --git a/user/pdclib/functions/stdio/fwrite.o b/user/pdclib/functions/stdio/fwrite.o new file mode 100644 index 0000000000000000000000000000000000000000..115072d7baf7c81e86d930941784152418cd1c7c GIT binary patch literal 3196 zcmb7GTZkKF6h3pw?xe|PFWFwCl}2`}Ewzc@R%+E+yIt$zQfuvkc-!VO$&MzIC7HBU zsv@P}vPG>v2nvFrAXxE1v5Fvw^g-y0pl?1^L>~&?9$Q_%@6Z1y)4qrYX1?>CbN+Mw z>-_WL%-sE!Wr-0>9O*NW{R3Ukl!C3YUdCm9`R7xYH>}L0hd-VfS^j!u-dmX&UyVVNM}z z#5!>@yHj^5GLW@WDH02w!J(dK*BTKoYdIO^P0*Xv-o$K{-Zgpa-gGz7E$P`Ti|-v^ zTq+@s*UfJuE)A;7kq+I=fu6?{*lNVCH38lF4dje6h-}knyNMu-#BmdQ5#o3W58%3c z;dZQnOMt{W=J|aK)B(@FavV5#5ik2HP4^WP2S0Tqtxi#bztY^_s9fIucY)$YL?9)O|szfNRxH%NUg! zf$XJRx15FEvh_R2HfFV|74-eU!TH>DZYn>Ozg_o1m#+G)?!d_Ps8qGkKS2ZP$${zV z-MOvvrA`=ix;b`CbrjpVP3M#mtOLG%tCm9g()av4*(OP~zAF*`4QjCg{FSW5pD}Jd{TPT)FE&rJ08Pc@`VHLZ%&+9?xo9KG8 z9Cs~sO56oV)(p5^5tfu;bSWDVG~CI)3yVfq5Mp|S+&LO^gm=XVtD{? z2Pom465qdOS8s$p*$q+ebPAs~XlwDXJ>$sv*(6uT4tNw#Tui?0Ff#tX;%-9>^BFk` z+J7~etgc)q!G ze_l8~lkX|$rVUe+G4NZdXfeJ9xY6l)6>0TjN>)vY{PY-TtvPFlLVY9pSLxdxa|p%N!W~-xc6X)HJ67F z7Z>CE{JOY9h>Oo3`$zc{PkbEp*f_@EGvgSAj;{CQB=TM8v3{ReUtJ#B_al;zz{snU zmmTwQo>()U?=t>dc(#m~aTsneZg=I6RbwY!``1SvuRv}_-EHN_wUg)cPPOrKNA|@L zbTTH6aOd>JQ7a$k9C2S9;VkyW5zcU59L$WVunp!htaQ8u=dFLS>zmSC4eGuZnLvn* zK%Pwt!^3ilg>EtrQGI`ayreBG6weCrCL;di3Oeo%jnf(*(D=BUk7leN9CE{j{d5!mId_*J97~`HMVtk>-77@$3 eto?6ld|%@!) +#include + +#ifndef REGTEST + +char * gets( char * s ) +{ + return fgets( s, INT_MAX, stdin ); /* TODO: Replace with an unchecking call. */ +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/gets.d b/user/pdclib/functions/stdio/gets.d new file mode 100644 index 0000000..018663c --- /dev/null +++ b/user/pdclib/functions/stdio/gets.d @@ -0,0 +1,13 @@ +functions/stdio/gets.d functions/stdio/gets.t: functions/stdio/gets.c \ + includes/stdio.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h includes/limits.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/limits.h: diff --git a/user/pdclib/functions/stdio/gets.o b/user/pdclib/functions/stdio/gets.o new file mode 100644 index 0000000000000000000000000000000000000000..0b606a170dcadf8abcb51463e3dc46316691b322 GIT binary patch literal 3104 zcmb7GONbm*6uqxLGu`Q)&iwL`B-%0^646u(jvu1=m`O|qhM>WKAUO1=x~H+HI(AiS zl!Op8Vl)dy+$adaEJVyg6m{W35D|AG0hfXzxX2>9kU*m2Ij`R9E(I4}sCVw~-S_T& zw_eqmLrae+rNojFS4NV^RX?@NYuG89WLA!!|K-K2n=evx{$M5d&B2PdwzhWWwL`h{ zUgg)D;J^J!O{wjrnSxu|QkqiJYI01(sYs!)x8UYPT*H<`y!Fs7&WQLM#VzeFJg9}S z8C57yP_T?o3@s0=6Uogex1_B;t$Abh7iVZ)7pQ&3G|-OX;tUtxKSsZTFK#Z4@4&A( zKMcCB_)rnKyo|gZou-G~i>MzVJfjsN6@!lFccMgG&kx|@=KMck@VxyPT{ZSS!1oyE z+IFyGIp@Z6!0|6II5(+s=42co&Y!8|iNA;9U&k;a!u^b@at%t3zm1YJ{yHUZ{A)sP zdCA1-;}pf+XhN0q3yi!;@4=a?pdz2azD|9FQI)h8 zxM3Af!MhN{qIdEJPUBNpy(&{cGhTq;NPI=1xp@V^Sv8MRC3sBK^ z?y}=>L)-}-?1_h~y};+_&BkzKz;bBXgfZ=+SK)dL54WOCTZbl3%N%T9kzcLHNi7Mb z)#-*&Z8aQjlZxd;>VsAoHHX@`^8&S;Gl+-U)`?yWZMPS-%X%0@ai<-H%`*FTC^S}T zeW|YWR>LaUZU-3m;_4s{`_&W8Mz>R!c%|1*%EKv~k1ceXCuOA;HM?P&8A}%lR_*Xy zMk~-=uYx(;s{HHds^*ABJLL>}GOZ?(IDGVYd7(TX%m??F&6qv3!hV_|Ws{y>D+*7d zZ4NIi>@M#-ULQosAf3KzexRj$?=ayeQEyySYf99qT+#Dh!9mUP5Df8L9xmk$oO338 z3F7BhlUf~^^iy21TtDmv2^S5TwWKCNJw_ik!}_4TT&vgn;j{`V1icc*sA$S?e zjS$!4VZ2E^Tr(T*68h>E=q%ZIR<@Ycd-B_w)f4~ucSbq80%eD?B0>m9Z;Upq|DFW+Sq0_*okgW&1JLAJX)5 z)3P5`{!A%2-3oNDG~ZW+lyStOuyyW+sP7~o>#uNl+YH`LM3AcS<6jQ_7YrUT_@u#( z!IK8h8N6WdO@nV6ylC)!gO?5J-o-lXFRpjR;LiqsH^`q4+9wU(W{`iM)bBC)xWQ#2 h@@p7u6H)Nf#(tJ@Vb^uSV3BpEelrmV!haRYe*>I(WOo1n literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/perror.c b/user/pdclib/functions/stdio/perror.c new file mode 100644 index 0000000..c59ca0b --- /dev/null +++ b/user/pdclib/functions/stdio/perror.c @@ -0,0 +1,30 @@ +/* $Id$ */ + +/* perror( const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +void perror( const char * s ) +{ + /* TODO: Implement. */ + return; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/perror.d b/user/pdclib/functions/stdio/perror.d new file mode 100644 index 0000000..226c563 --- /dev/null +++ b/user/pdclib/functions/stdio/perror.d @@ -0,0 +1,11 @@ +functions/stdio/perror.d functions/stdio/perror.t: \ + functions/stdio/perror.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdio/perror.o b/user/pdclib/functions/stdio/perror.o new file mode 100644 index 0000000000000000000000000000000000000000..23072e227a14c0c8f53edeaa8e5106547837e75c GIT binary patch literal 2328 zcma)8&5ImG6o1v-^P#gdo6V{yi7$0T z0xN1-a-s`HG`QYN~ zuNY%Q$w(+mP2|V0^7Jj7l?P-~c0d00ogbi^4f9B6vlVtubT-U!bF3~BoR(JWd@F2< zgih>;M6tQB7IwB;&$iC2aq0_ovnf)mN!X-uXEV50q`r=|JFqt%6@q+$5!k$uxy*c@ zf<0~xSnM!}YLm2-FsdEF5;kjh2&VpZ1#Jt>ln~TzT4+2(h#KHn(0CINncLu|ZA;hC zpTSfsV5Ja%)uYcLHMYRyB5l$GH|Fn78{Bpg0nGk99hH+TEqX<{H_1c}lRVGzcvN+^ zW@`%D=0Xr)8H14pQbt5J9CDM$odhyRH!I@CtB!mH=^92A+ImkeoRQVZv=qwow3v+3 zWUtG9IdOC_$fY>Q^0K?)?j2;aq(|>`0xYtkH!qUBcepp2PKI*n%5HbN+mHM4lQPZH zao4hy2n)rguzs7@=A!hkF7*~ovI|^Y%ivrhm$tXJx@UKX^R%2->Cg4&R(t9(w;dFE z4C5}yh&gJmMbSrS>wWBiBR1v5PV=RkLAxe#abs2vhQKnf@Ia+9xn4@VHz)@Z4~qg~ zGMta!9Snzg@}9(bGIf?ox}W*_bdn}Idzy`W*WrAa4rU30Ete1SK{}?XijVXXkFwb; zLCJBNl}U_#pDW72=$gN5KSv;~>HpvfOyUW{J+;I;?H>?5Hm6|MlgNqBk$I%^&cMc_ z>7I!HoX0E6cuI_SRTZH6&U-T5Ut;i_E9pGmzkAdOd=;Cx1>`qoJ=`Dnbp=D$K$K^o z>`-u|zSp4p@qWW%u4g>xm&(HgZmlyBh zBJcZiW5QqExjpsNBKe8l_(_&+i}iNBS1SucHY?>)3!#>!7S>5297RvqHr* z7t!BRpC1**`vL11jK}!Q>BsA%f6Sqz@l;pz?UDR>SM9{rUsLM-PN@4CscRRiDB;Qt zrQiN+EmDLlouZ#7XGx*`^1hDWV~;{x`O*-sRLpqmi-^2i$Jw~WQ@#B4;hSPGf#=M$ zs=g7~VX^A2Bjc-i3_4&QQk)#2FT%wb7H{Ob;ni1?0t Vb7;5w1XJX9r~N@9{w$ny`agbD +#include + +#ifndef REGTEST + +int printf( const char * _PDCLIB_restrict format, ... ) +{ + for(;;) ; + int rc; + va_list ap; + va_start( ap, format ); + rc = vfprintf( stdout, format, ap ); + va_end( ap ); + return rc; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( printf( "SUCCESS testing printf().\n" ) == 26 ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/printf.d b/user/pdclib/functions/stdio/printf.d new file mode 100644 index 0000000..a046617 --- /dev/null +++ b/user/pdclib/functions/stdio/printf.d @@ -0,0 +1,13 @@ +functions/stdio/printf.d functions/stdio/printf.t: \ + functions/stdio/printf.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdarg.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdarg.h: diff --git a/user/pdclib/functions/stdio/printf.o b/user/pdclib/functions/stdio/printf.o new file mode 100644 index 0000000000000000000000000000000000000000..2baab388c4bd5e42fe7133d3e606b61aefbb7999 GIT binary patch literal 3304 zcmb7GTWB0r82-=9Y_i+kY_7f0sw+v`sO@gSC~c~}#aKgQm1^`s+OU_|WOXwec4tc~ zEnbRZETRFy2T?32A_xj97JMmIu@w<7FXD?(5EMir6kpmJzi;N8-KpqZl#nMQesP65_!2Jw2TBWEURTerWSra`P=Xd5ekX+3rC zrG?3%_`-uj&Vn=a%a!Hj<%RL3FUBtg#_^>K=fJ35wISV~wA1U-y{b?3AiOms$>h$Y z9T%}Rn-+0aiJcxz?nqAbi^RI&LZ+i%C6m-D2%TLmmu)LV;{D1_2i6#^32lu{^wYW` zt9GTrh?`Oq{Y<{QgMP_aD~bib)Eca^YeejLn4G%wMq%=9X!VkIrS3?%pr{U>5_0$aamE6RUW>*iP&qTUZPti8=c*+N$GEfYVF;(gv^{aqIHa zz|LRgju|1Tm&i5%foxc*|oi4!HP5$CL z7~{PdhV8U^7|w|=sqa6;+n*L6jv&yvTaTw7pV-!eLZ%)vC1{9K{o=Y3bom8$FI=iJu1shIYq&@8)N zN&eB5T&sFhW~1^r-5IReXa||EHK485yqQceG`&V;#&b&<-jJ41oXywSlUmc4+-z;m z%~4aW02{SNuGw(wx%pDDS}90lwpRBut(gpiC00sDWj61Xs;(eoh5IK*^3&By!0TwPMsX-z@N$AXwWyU(b6pRE5#71j!a_b8{}5ko9W5n?)bD;Aj*di%u)odEWj9 z-2h)+2K|W=exssi*_`lo&?oR1noo+buPgCzKK*!m_|BlrOGTOwp*5O#w?GrTz_jJR z{I;%z3Q$=K!~8=j``;dh<(AsAZ)d^GRbNM4lG%KKDg z4p>=2ybKvlCf*6i(Rk+(uLnBT(S^s<@e+8>;l7Z1V5piPkje6SRip7c9upaY&XDnY z6N<=mc>{h?GPX1S;uq~7*GKvgPqdC7B6ak^MnCQgKiOzSi@rkM&s$P^P0SyD2twm# z{K{mYTm`Wk596^<%o&Y0iA}f>Izy%oBO8qB9rq;`NV)w1#&0D4PDC~WEd=DfRVW=>Eea(t2Qhdz0oPK-Ch{H;xi1R;fI01VyT%elNw*r_=?8YHNK_sU5y`T49+m(p40L-8h_IGyT+>;Q#c%4$2yJt z-KD%;<2@P=YkX8=lZZNxX*@y1)<3K5pJ;rMdEgiH4}(GO1NGb+h0D+X9m; + +#ifndef REGTEST + +int puts( const char * s ) +{ + /* TODO: Implement. */ + return 0; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/puts.d b/user/pdclib/functions/stdio/puts.d new file mode 100644 index 0000000..82d80d0 --- /dev/null +++ b/user/pdclib/functions/stdio/puts.d @@ -0,0 +1,11 @@ +functions/stdio/puts.d functions/stdio/puts.t: functions/stdio/puts.c \ + includes/stdio.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdio/puts.o b/user/pdclib/functions/stdio/puts.o new file mode 100644 index 0000000000000000000000000000000000000000..81c792e9a369915e6c7f03296cc33cbcfc93573c GIT binary patch literal 2324 zcma)7O>Y}T7=CAW9UC0GP0gnYk}IXONMwzK;SfX!Bv1lX4@fx_sVcU!aje?Ak#`rh zQu(+bf#AXcaX^R`@dI)|f)f&gUx4@taN`2v#-TjV?7a1a3%t_I^M21e@67DJ`_jdi zjWMERB$S0D@>5t@`WDX11JaS*4}bfP;*}po%!)bN?li;p>Gp~_Wlk=M1gp|)ZZyM& zNa)zMNEDmrm&5jY^V#OP<(&?lH<@oAgIGiVMNjy)cPBTgOGhd!g(nP(d*~m8?mcw)~OOR|4K9~>EF;!K5EHCjW zo6QpJH%_x6iP4X>ycmqG`CtkJ)Ff<0N zY(aR1j3c$Z3fa&1D}ou%e02=X_Xc>40V^Lt;NFzfHi1HU+P;Or-Ycn%hv%>RySFaS zMb~{Byv8uc&k(v~9I5RFWIx|u$j7(9eJo>WK7Jw@!w(?oPYB;vtet7&_{^dD9pQ_! zYCWn+{cbrwHT?oVpXf*W219wu^z-}2`bb9@{yriIx{npubRXpP?t!(!50c|YI;2J{mkBUy-tQp~@248@ + +#ifndef REGTEST +#include <_PDCLIB_glue.h> + +int remove( const char * filename ) +{ + /* TODO: Check open file list, flush and close file if open */ + return _PDCLIB_remove( filename ); +} + +#endif + +#ifdef TEST +/* TODO: Work around the following undef */ +#undef SEEK_SET +#include <_PDCLIB_test.h> + +#include +#include + +int main( void ) +{ + /* TODO: Extend to internal testing (buffer etc.) */ + char filename[] = "touch testfile"; + system( filename ); + /* file is actually readable */ + TESTCASE( fopen( filename + 6, "r" ) != NULL ); + /* remove function does not return error */ + TESTCASE( remove( filename + 6 ) == 0 ); + /* file is no longer readable */ + TESTCASE( fopen( filename + 6, "r" ) == NULL ); + /* remove function does return error */ + TESTCASE( remove( filename + 6 ) != 0 ); + memcpy( filename, "mkdir", 5 ); + /* create directory */ + system( filename ); + /* remove function does not return error */ + TESTCASE( remove( filename + 6 ) == 0 ); + /* remove function does return error */ + TESTCASE( remove( filename + 6 ) != 0 ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/remove.d b/user/pdclib/functions/stdio/remove.d new file mode 100644 index 0000000..6d16253 --- /dev/null +++ b/user/pdclib/functions/stdio/remove.d @@ -0,0 +1,14 @@ +functions/stdio/remove.d functions/stdio/remove.t: \ + functions/stdio/remove.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h \ + internals/_PDCLIB_glue.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +internals/_PDCLIB_glue.h: diff --git a/user/pdclib/functions/stdio/remove.o b/user/pdclib/functions/stdio/remove.o new file mode 100644 index 0000000000000000000000000000000000000000..6d7f24b7ece27dd4cf21c4777da71c6ea639fc93 GIT binary patch literal 2444 zcmb7F&5ImG6o1v-vpYJwll_PqNyHI08qxF!t{zs6x|X zL|8E*qKh8%AUTM7&_fVC2swE16g)`&2@eV$0_s^|{r#%z?bHe$d{Fg!-(BxjRo7dm z&Yd>Kh?0>|#*)Y{VQE>ka7^xzgR-{s>pQm(eQ>I}6D|Dq_wMfQPdCNPnxpmkT3A0^ zpEYx4W38b)E`GH_2x+P3osJ=%CDxX`J zyq6G7Vn)DZ4-lEFm`&Xr1&}oTHSm?|m`t5)@G;gIeFkoF36q?rPMVmF`KvyS*>)EF zG#jI|Q}nVlZ{|g}mx&CML3TNbJ7u>kwz9Bpw!RGl#4#JEK#GXST>xJtaxsC7(AJW; z{<1M&g1d-O=C;-&d&bDhoU|J9qcrbrrb)NKwmG)5)f!5^l?{u=K67&`8zfCy`#oTu z<;_u^44ap_oqn$^|0=P$SE0?<&(h6?o%ZE)OWo6reeHtmBFJs@`bpXvBy#4$T4SZL z7%#?;%Qz=p>^|aHRHtY8Zq0|sVI6M-95-gIAU*} zuUD7f4W=s+=Wh&(RvTChOWaa!nDpZ!xl%~nZ51tv+j$N)X^%G7TkZBRxhyeVN=+}_ z$b7lqOB40(XC2>kY1C$!NHz{{4O{6ZRb@6TLE=s}7$hhJNb@}c9sS*} z=0E)&gAem5F<)B+pxTx_p60JHcr}#N?*tTn9XGIu>(H?d_CV`+8N9}TmGcl@B;!bJ z7a;rjUWLHAn2)IWUIVW&VC5PF{gF{t+rZK=uJ_##_g5LskO6vC&6y%kD zho4Vs`yNW=Y5xO$e*d^W(hUs1j%}}wIoPz0S@3%Hz{(K_Kaz2z-y-@;+QyqP1LfV& zAHZNf_KDy0^L>cTZ$PJ{`BYZ)^^yF!t9s)8SDCW^1`5+o>6z>Z00V4LwKFqK`>HME@c+%lnhxWe1?-eJ%?r_tg ly_c|Gp^W_74zCi?)*T}3PdmL`FD6CS%D6*B6va21@;`&I``iEk literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/rename.c b/user/pdclib/functions/stdio/rename.c new file mode 100644 index 0000000..f3ff01e --- /dev/null +++ b/user/pdclib/functions/stdio/rename.c @@ -0,0 +1,70 @@ +/* $Id$ */ + +/* rename( const char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST +#include <_PDCLIB_glue.h> + +int rename( const char * old, const char * new ) +{ + /* TODO: Search open file list, flush and close file */ + return _PDCLIB_rename( old, new ); +} + +#endif + +#ifdef TEST +/* TODO: Work around the following undef */ +#undef SEEK_SET +#include <_PDCLIB_test.h> + +#include + +int main( void ) +{ + /* TODO: Extend to internal testing (buffer etc.) */ + char filename1[] = "touch testfile1"; + char filename2[] = "testfile2"; + /* check that neither file exists */ + TESTCASE( fopen( filename1 + 6, "r" ) == NULL ); + TESTCASE( fopen( filename2, "r" ) == NULL ); + /* rename file 1 to file 2 - expected to fail */ + TESTCASE( rename( filename1 + 6, filename2 ) == -1 ); + /* create file 1 */ + system( filename1 ); + /* check that file 1 exists */ + TESTCASE( fopen( filename1 + 6, "r" ) != NULL ); + /* rename file 1 to file 2 */ + TESTCASE( rename( filename1 + 6, filename2 ) == 0 ); + /* check that file 2 exists, file 1 does not */ + TESTCASE( fopen( filename1 + 6, "r" ) == NULL ); + TESTCASE( fopen( filename2, "r" ) != NULL ); + /* create another file 1 */ + system( filename1 ); + /* check that file 1 exists */ + TESTCASE( fopen( filename1 + 6, "r" ) != NULL ); + /* rename file 1 to file 2 - expected to fail, see comment in + _PDCLIB_rename() itself. + */ +#ifndef REGTEST + TESTCASE( rename( filename1 + 6, filename2 ) == -1 ); +#else + /* glibc rename() overwrites existing destination file. */ + TESTCASE( rename( filename1 + 6, filename2 ) == 0 ); +#endif + /* remove both files */ + remove( filename1 + 6 ); + remove( filename2 ); + /* check that they're gone */ + TESTCASE( fopen( filename1 + 6, "r" ) == NULL ); + TESTCASE( fopen( filename2, "r" ) == NULL ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/rename.d b/user/pdclib/functions/stdio/rename.d new file mode 100644 index 0000000..02e5dc8 --- /dev/null +++ b/user/pdclib/functions/stdio/rename.d @@ -0,0 +1,14 @@ +functions/stdio/rename.d functions/stdio/rename.t: \ + functions/stdio/rename.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h \ + internals/_PDCLIB_glue.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +internals/_PDCLIB_glue.h: diff --git a/user/pdclib/functions/stdio/rename.o b/user/pdclib/functions/stdio/rename.o new file mode 100644 index 0000000000000000000000000000000000000000..746186b80f7772ef163a1adc4d6a088f3f84c675 GIT binary patch literal 2452 zcma)7%ZnUE82_ptGov#**+(?dC{AFb5tAOlRbkbr`*2wjLJ;=g#dRLNvqNUO!*q{{ z5K%FLOFZbwgB}F+Bnpa%2TxHC{t0>)Ja`cV4=UsDS6wwz@uDA8{l0hC_f=KbE1Tz@ zQA&v=CBDogk>CBovZCRn9FfDabMW))zaG85Sv%NR4z6!j4ua)h{+diCKYS~q7SxIQ zQq`{?t1qZUHD40(mZe%fQ}rt%zG3SkL8P9n`SsQ6W7Yd=+e>tQs-%`g!chDQ)!R$n zts>*x;g=YWYd2PK1>H)QFXH3I}#@G<*5`%Dfk5X@+v0TqK7mw zEA?l64zunza;v>@(#iX2k~Oou+fPMCanc&bQK#60P}k|#)qdr;=OK{kIC+xmwQ+O6 zSBPAjCu4NEpgXio{&S3r7)5ew-;Ph#smNIS0S(zwkNfn>Ar)~J>As4B8y2@-YE;V?!Eq9o1Z2z@%8<*m*| zH*9Z&M7FN~gZIFRrww;l6aNA3AqkBB81NRu6TZP2@;jSs=v`rzH~4xH~+VYAzQl0rxaQQc2%D{A0lYnXVC58q@5val-y*t8 zdJ8YnJe0RXe+Yy5*e8C|&G$YwzX6>ko6pJ?U40Jr-)66&d5(53 zY^ s;rE=8UohA+sP850S12R@RfDe*(bmU}tk;RjB5S1oQ6er9A7#q_04rYnwg3PC literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/rewind.c b/user/pdclib/functions/stdio/rewind.c new file mode 100644 index 0000000..d97e4e2 --- /dev/null +++ b/user/pdclib/functions/stdio/rewind.c @@ -0,0 +1,34 @@ +/* $Id$ */ + +/* frewind( FILE * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +void rewind( struct _PDCLIB_file_t * stream ) +{ + if ( stream->status & _PDCLIB_WROTELAST ) + { + fflush( stream ); + } + /* TODO: Implement. */ + return; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/rewind.d b/user/pdclib/functions/stdio/rewind.d new file mode 100644 index 0000000..0295c02 --- /dev/null +++ b/user/pdclib/functions/stdio/rewind.d @@ -0,0 +1,11 @@ +functions/stdio/rewind.d functions/stdio/rewind.t: \ + functions/stdio/rewind.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdio/rewind.o b/user/pdclib/functions/stdio/rewind.o new file mode 100644 index 0000000000000000000000000000000000000000..5ca35401c6994e3e0162cff7bd74ef6a434d7662 GIT binary patch literal 3024 zcmb7GO^g&p6n@n|yEDx0uz$cBFpTUHFhY-!)ff~+76l>_LL@PgxXe$_PRE%ZobHj; zV89p>2_7`wH1Q|#z(EsCOynjBn&@3G9x)nCJfH_Jfa~|wRL!(rj4$c>-e0{}_3CwX zpL^oSlS(PEq{Nk>By!d7TNX5Imklx_CocZ<`fszBp2%I=w`r@K7rAgPEkL~J&Hr+H zb#?XI>mq7WZ7oh0+~UUKq?%F_BO=bc6bgF_ZcfBCY*EBp3+>@)5r4h7#odKRv@kNQ z3Iz%ZmeKKn<>56VxoPDVwbiFJZ>;{|XanqYplxGJy$`7i{vd(_A4#x9NAJi} zcYtadigQ{avc;g|`B9vT>-oE2b#wj=7(8zuMpun|5AbhdaBgnJIFfU2odJ%1N!4wt zoH-c`o{y!kP2(I~Z?L?bhO0{s&s8)F)b;$bUw0+K4mxZ4_sWIGf)? zah+mHXKqt|EyeXFR4IRmkvHfyICJx;$QQ7$Q3o)paoC0xEa0f2<7%C^!LHzOJ;>~z!8 zU<&7BB~g7vnw7ZT3I(Ym9>g##eROCza+#TR&@@}nLz1r?W`(MXLDno z_XZAZ#vTWdr}KC*xBr4O?n{uo+)gW1VA}0t({kOg6{O4>)GKL4f@+e04XeH7rAoEh z4PTOgE`3cDH_)X+xfR8s^=@@)S<~rWl^uX!L-$Iz5-(HLkA@{kQ0uhYA*v9>oiq$k z%AIJ3+6&ofjV@d1f6!+5vfXhBYT`Yf?N-~v8==qlUG%uZix%8EJe*HI%Dl=b^R*#8 z+lRquwWBWDMDOuR_koyMiEmZ&;UcJa!*%f#)2a3+XuGJ#B+PCd=nN zgVyf@1ek};lJ)x-ip+Gm&O{lqHh#=3PxDvs%hu0M`y96HKCWfXXmP-0_fHUB#@-3J=LeWo(8mP*33m zS$9jU+wj|MKB0|9tCuuIe?{TI9Vl#TjELoNK2hI0Kz@o94v6mv@g5?6tIEdjA%lws z4;egZFfzDe@PffN4ZdUWU4tJPyln7OgStPl9`+E|_npBX4gO(}KN_^NhlraE1_t*S me8%8OBKEaputvl&HjQ217qII(VX(;Bavpn7;RR+rDgO=hI$V4J literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/scanf.c b/user/pdclib/functions/stdio/scanf.c new file mode 100644 index 0000000..cafdf58 --- /dev/null +++ b/user/pdclib/functions/stdio/scanf.c @@ -0,0 +1,32 @@ +/* $Id$ */ + +/* scanf( const char *, ... ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include + +#ifndef REGTEST + +int scanf( const char * _PDCLIB_restrict format, ... ) +{ + va_list ap; + va_start( ap, format ); + return vfscanf( stdin, format, ap ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/scanf.d b/user/pdclib/functions/stdio/scanf.d new file mode 100644 index 0000000..89e415c --- /dev/null +++ b/user/pdclib/functions/stdio/scanf.d @@ -0,0 +1,13 @@ +functions/stdio/scanf.d functions/stdio/scanf.t: functions/stdio/scanf.c \ + includes/stdio.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h includes/stdarg.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdarg.h: diff --git a/user/pdclib/functions/stdio/scanf.o b/user/pdclib/functions/stdio/scanf.o new file mode 100644 index 0000000000000000000000000000000000000000..6bc1621b48d40db4b0d58e5b286f0b39d85049f8 GIT binary patch literal 3264 zcmb7GTZkM*6us5mvpcghJNwK-5^-cV$@<7lz*S?SNlc8%;u?Gf^OJ1m(X-n++p|pf z#6%J#1|LgM;*W}gFBBq(1R_KbK@1B1s0e-w0Z~DWLjIDtp3_}5(-D8X&~@&sZryvU zy1Jj)IeouUN(?Enr7MXn^u(6Q2qt8OjLP1{pHKWg@zT!pi7%YRotIATO}|U)$pI+M0_auFFl0aPe(D z^vk9?Q7ri7RwDKONwL%M;?(8W3Kt)MR;RQzcXtkc=g=C9wTh$qz^jKbJQXQKZq;Zx zDbEkZc2al3YNt~d>A##)f7l5&7a}CCxv~~GeVDINtU7^YvlU{&W zS7XT$=N^iG@5hJ;+qi&Adz7ryT1r;$tCXDH9|`H+X@Iki{DluOriU<0*m?ChoHJ*r zA5f0~uvCT%+k=WpSYu9R1LF-T=4_4SGQZF|tjS?UE{c7kn{h$J?4eSlF%Vy2Kh9RwOi6=3nSuzjRMGLaGk>wB^KFMcWh21 zb1=OlKVJ#La_CCkYq)-S-t8n!#Y`xbcHQ-B9c|z}O)clNgO0Yo&rlYFPm0MDpYtFkRvJDRyG=ow*a9gE?TD9R-B$#Wq!a`>XqaYElc39@h zey!m~-SY*@dfX>DRGw*gK`8ZRYrY)HH4~%tFq^3-Qe;fCLG>E4-?e9NVMk%II9a@{ zV=!^!d~_Ohw-v{Uii_)v7V+J~Na5PEQ!-~ncJ0`)sW7p(()Po4yv+K^b|l??lU{ZZ z8-h!6Nr^g|&Nq0q=2qIXGv!L9MgoXbPx>hB}2xx9SXzKR)oOU z){tShK#{CtAL`f$BkN!fOdY(c%^a}u8*YNP$Y?UQJ&=>}PUYgd7?1Utcn83nIbh`l zG$`3;W1Ih%-&y$avN2@*JSdXuzMfbYC3V(44&KaRjPDSyKt_|X9fO>V_YUHj{q2X% z)Nu+t=Wt(07ZJ}hK_HXm^QK1Qw=X3!4xJ(6_dXPf>2ef)Niw!i|HCiYKjugJ1W&S# zGl@EeVKa5`^NiFxbQ8Ctmx9NIAIzWm9!L%a&`KXLsIeWAA+1B84p|CPB9FNdo_%mX3q?F5)jlWG&Fb@_c6% z%EmT}Li)^z7~M<2>nLLbxfjG6iTKwmX+Qoy(SNf>zR#2&)mYaUYCNIwl*ZRI@^0X~ z4>W$H@vO$^{K9@-%inAKN#h?HuWHQUU@+b)jW=t&OXF^h2Q)sRu}wssM>HNIV%wkB c_K!8b%yr-w^$&wV?g91u`BB(@-aVB60X^!4R{#J2 literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/setbuf.c b/user/pdclib/functions/stdio/setbuf.c new file mode 100644 index 0000000..e77d2d4 --- /dev/null +++ b/user/pdclib/functions/stdio/setbuf.c @@ -0,0 +1,64 @@ +/* $Id$ */ + +/* setbuf( FILE *, char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +void setbuf( struct _PDCLIB_file_t * _PDCLIB_restrict stream, char * _PDCLIB_restrict buf ) +{ + /* TODO: Only allowed on a "virgin" stream; add check. */ + if ( buf == NULL ) + { + setvbuf( stream, buf, _IONBF, BUFSIZ ); + } + else + { + setvbuf( stream, buf, _IOFBF, BUFSIZ ); + } +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + /* TODO: Extend testing once setvbuf() is finished. */ +#ifndef REGTEST + char const * const filename = "testfile"; + char buffer[ 100 ]; + struct _PDCLIB_file_t * fh; + /* full buffered */ + TESTCASE( ( fh = fopen( filename, "w" ) ) != NULL ); + TESTCASE( fh->status & _PDCLIB_LIBBUFFER ); + TESTCASE( fh->bufsize == BUFSIZ ); + setbuf( fh, buffer ); +#if 0 + TESTCASE( fh->buffer == buffer ); + TESTCASE( fh->bufsize == BUFFERSIZE ); +#endif + TESTCASE( ( fh->status & ( _IOFBF | _IONBF | _IOLBF ) ) == _IOFBF ); + TESTCASE( fclose( fh ) == 0 ); + /* not buffered */ + TESTCASE( ( fh = fopen( filename, "w" ) ) != NULL ); + setbuf( fh, NULL ); +#if 0 + TESTCASE( fh->buffer == NULL ); + TESTCASE( fh->bufsize == 0 ); +#endif + TESTCASE( ( fh->status & ( _IOFBF | _IONBF | _IOLBF ) ) == _IONBF ); + TESTCASE( fclose( fh ) == 0 ); +#else + puts( " NOTEST setbuf() test driver is PDCLib-specific." ); +#endif + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/setbuf.d b/user/pdclib/functions/stdio/setbuf.d new file mode 100644 index 0000000..9d114ed --- /dev/null +++ b/user/pdclib/functions/stdio/setbuf.d @@ -0,0 +1,11 @@ +functions/stdio/setbuf.d functions/stdio/setbuf.t: \ + functions/stdio/setbuf.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdio/setbuf.o b/user/pdclib/functions/stdio/setbuf.o new file mode 100644 index 0000000000000000000000000000000000000000..05b41c78c29bd2f41bda671d26f9a1a1fbf08baa GIT binary patch literal 3120 zcmb7GO^g&p6n@p+!}c(SdqOEChLqScl0=GYQp-XD+hv2y$f+woUHoU4UFYRJ^iO zajqV6uQ-*TZ?CSd{<0%*sh4J*^-E} z4%(yBBDqED~e2Ng=G!;d;fK^yYLmV{=UhRYMR-zC&snK$BK^TkeDXv#cY0YoSucJ7tLzVMK7Q-qSV{(k)tXhMx5eL06szz}$ z=!sXwPWb(>)g(P2ueKo676w#QYwZB=Hi zEi;ydbjX}s6-#1=f{h2fOXMN2WWWU^bPvY##9V^w2|Q^TiE-1=$QzWBIYpGZ^(d~z zzC>}~uXUvrbo{W^^@o*Gu^bCl<%i9oHVR&%_O4!3hs$ToL1gMMt8Sg?MVQs;g)8M` z7=%%<68gx-%saJ*2O15L;qYX za(HoZPkH;P`XG!4>GYiogGAbWzYd3w}f$TD{))&x%KvR1<_P9M+NC2}0j^ zcY2Mi>CB+cGk{$-b_~!};{%4dMHZGA|D4atg!I#Cs4L`u~^TL-1id zLyY&K5rD>aFvHWl8wOraLx$ZCMRpzEVI5@{xeoTgtb;FRGY71Ef*XHo&|5_fR(*i_zp6fjI9gV@HDN!?_TXgFtz}EHm{q>TY$~vy^xs$R$fKC zG8s)K9^b&(coT?c_IDgM6YmZ1oWp$~T}QkpO%TXr`Mjgi_}xT+3Ur2y-*qT5(`9|m zc%*1-AK&FS2fu9pSRd&Ip6oixnRQITMnCS$Bp#GLq$R}rY$%OtV*d1HpBk?t_ym-* z5cx4=Jobq>v+-`=T=7F;$gIQ22D5rcZmt?V@y@?D%GnH*&8pK`w%pk~dw8pjohu)a zEhsWWw(#VP$QJJWi0ov=S(#lNkuB`-h-`GmWZ*kx3Ok*h!M=??;rb&AIEya^O%LF) z;KVyd`$D{ri2tst_Ip_4qQ)Z{PiqV`p3`_q_cXq*k?$qelblr`&lBZuH2$dZ4~_iopq=N5xLKp8ai7MM8c!3ku4Ro4BDS=x Y?a8|X_M}f346@IhH%G*l@*jorKhVf)>i_@% literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/setvbuf.c b/user/pdclib/functions/stdio/setvbuf.c new file mode 100644 index 0000000..5ac14a9 --- /dev/null +++ b/user/pdclib/functions/stdio/setvbuf.c @@ -0,0 +1,126 @@ +/* $Id$ */ + +/* setvbuf( FILE *, char *, int, size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include + +#ifndef REGTEST + +int setvbuf( struct _PDCLIB_file_t * _PDCLIB_restrict stream, char * _PDCLIB_restrict buf, int mode, size_t size ) +{ + /* TODO: Honor user-provided buffer / buffer size. (Not actually required + by the standard...) */ + stream->status &= ~( _IOFBF | _IOLBF | _IONBF ); + stream->status |= mode; /* TODO: Unchecked use of mode -> vulnerable. */ + return 0; + +#if 0 + /* Only allowed on "virgin" streams (i.e., before first I/O occurs), a + valid value for mode, and only once per stream (i.e., the buffer + attached to the stream should always be the one allocated by fopen(). + */ + if ( ( ! stream->status & _PDCLIB_VIRGINSTR ) || + ( ( mode != _IOFBF ) && ( mode != _IOLBF ) && ( mode != _IONBF ) ) || + ! ( stream->status & _PDCLIB_LIBBUFFER ) ) + { + return -1; + } + if ( mode == _IONBF ) + { + /* When unbuffered I/O is requested, we don't need a buffer. */ + buf = NULL; + size = 0; + } + else + { + /* The standard does not really require this - only BUFSIZ is required + to be no smaller than 256 - but it makes sense not to make buffers + too small anyway. + */ + if ( size < 256 ) + { + buf = NULL; /* do not use too-small user buffer */ + size = 256; + } + } + /* If a suitable buffer is provided by user... */ + if ( buf != NULL ) + { + /* ...do not free it in library functions like fclose(), freopen(). */ + stream->status &= ~_PDCLIB_LIBBUFFER; + } + /* If we cannot allocate enough memory, that is not a reason for failure - + the standard does not actually *require* that setvbuf() honors user- + supplied buffer and buffer size, so we can quietly ignore this. + */ + /* FIXME: Logic stops here. Handle _IONBF, new buf value etc. correctly. */ + puts("foo"); + if ( ( ( buf = malloc( size ) ) != NULL ) || ( mode == _IONBF ) ) + { + free( stream->buffer ); + } + puts("bar"); + /* Applying new settings to stream. */ + stream->status &= ~( _IOFBF | _IOLBF | _IONBF ); + stream->status |= mode; + stream->bufsize = size; + stream->status &= ~_PDCLIB_VIRGINSTR; + return 0; +#endif +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +#define BUFFERSIZE 500 + +int main( void ) +{ +#ifndef REGTEST + char const * const filename = "testfile"; + char buffer[ BUFFERSIZE ]; + struct _PDCLIB_file_t * fh; + /* full buffered, user-supplied buffer */ + TESTCASE( ( fh = fopen( filename, "w" ) ) != NULL ); + TESTCASE( fh->status & _PDCLIB_LIBBUFFER ); + TESTCASE( fh->bufsize == BUFSIZ ); + TESTCASE( setvbuf( fh, buffer, _IOFBF, BUFFERSIZE ) == 0 ); +#if 0 + TESTCASE( fh->buffer == buffer ); + TESTCASE( fh->bufsize == BUFFERSIZE ); +#endif + TESTCASE( ( fh->status & ( _IOFBF | _IONBF | _IOLBF ) ) == _IOFBF ); + TESTCASE( fclose( fh ) == 0 ); + /* line buffered, lib-supplied buffer */ + TESTCASE( ( fh = fopen( filename, "w" ) ) != NULL ); + TESTCASE( setvbuf( fh, NULL, _IOLBF, BUFFERSIZE ) == 0 ); +#if 0 + TESTCASE( fh->buffer != buffer ); + TESTCASE( fh->buffer != NULL ); + TESTCASE( fh->bufsize == BUFFERSIZE ); +#endif + TESTCASE( ( fh->status & ( _IOFBF | _IONBF | _IOLBF ) ) == _IOLBF ); + TESTCASE( fclose( fh ) == 0 ); + /* not buffered, user-supplied buffer */ + TESTCASE( ( fh = fopen( filename, "w" ) ) != NULL ); + TESTCASE( setvbuf( fh, buffer, _IONBF, BUFFERSIZE ) == 0 ); +#if 0 + TESTCASE( fh->buffer == NULL ); + TESTCASE( fh->bufsize == 0 ); +#endif + TESTCASE( ( fh->status & ( _IOFBF | _IONBF | _IOLBF ) ) == _IONBF ); + TESTCASE( fclose( fh ) == 0 ); +#else + puts( " NOTEST setvbuf() test driver is PDCLib-specific." ); +#endif + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/setvbuf.d b/user/pdclib/functions/stdio/setvbuf.d new file mode 100644 index 0000000..e1f85f2 --- /dev/null +++ b/user/pdclib/functions/stdio/setvbuf.d @@ -0,0 +1,13 @@ +functions/stdio/setvbuf.d functions/stdio/setvbuf.t: \ + functions/stdio/setvbuf.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdlib.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdlib.h: diff --git a/user/pdclib/functions/stdio/setvbuf.o b/user/pdclib/functions/stdio/setvbuf.o new file mode 100644 index 0000000000000000000000000000000000000000..acd6cf1e77b412cfae9156d152907a291d16b063 GIT binary patch literal 3108 zcmb7GO^g&p6t3!@-5zFlc9&TelvRf85-^b-5*HzjLGG46ydCCkWZ?U6{>3sf2-| z%;zacSO$lCmMzPK@QTtdD630rPFvmiBCX4Oxos#7w0>y5$mH9RJn!~mSnwKx=%vXh zifgFdQl&a_8ob;L;Vq>Q;!%y3aH0=O#~=a+S02R!Tc zN#NkO7_2)~SyN&VAgsSr$r0{hivJwMhzNTbReEPAS?(rE*5JpKoWbu2-e3T5*O0&U zK1S~^3>)l%+z02}H`I^F-2kM@F|j==xd>~@$;~p}n4DGOQ0`}1m&q?aQd}XK(wdsgO;DWBp-Q>KjJ#5vT93oS+k-CF{WqkI$V$9 z(MwX+$)43wG6&N)@~vu|RFXi%NhheZL>#^nEF_{4HiM|r3VMszdK4N&b#Y&B%KaWN zSU2uXYaDOK2-j>!izPL5qc~iQf_jNJpeNLpDxKb{%S-K6P^PLG0^@dE?#4l7!D>k%fp>yWTI2wcfKvx|>aF)M47a z|4?bJG~>_skLmO}Ya{5SwNciEsYFq5iVCC>yXWR+OB)VVyHV0jV{Dx1Drxg0IwrPZ z6wh6d6!MHWzJ zRJ)4{m1?yUoDhB|XlhLuHE^c;ax;tq!IY$ z`7b}_U|vJVz3qiH$HByV5xkiLRy>cwv;8x+@IJq@@OzjOG#Ni`UN-NYOkREf zP2N|*n>h?|1@TH`G#T4z$k}+#P z^qnHne{7YIn7}AR_L%qp5v4z*aV-&-tE}yhYn;=#N8=HVp~h1h&uP4<@v_GEG+xno zRpW;m`76xze68_2jX!AoO(TCB=r^iyjYePNQyQPsxS;VRBI=AZc8GWxoz(Wr8n0-4 Yo%!I;ce2D_kmr&5Rm5Q-`0GLWUyW{W9{>OV literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/snprintf.c b/user/pdclib/functions/stdio/snprintf.c new file mode 100644 index 0000000..9fd2dd7 --- /dev/null +++ b/user/pdclib/functions/stdio/snprintf.c @@ -0,0 +1,292 @@ +/* $Id$ */ + +/* snprintf( char *, size_t, const char *, ... ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include + +#ifndef REGTEST + +int snprintf( char * _PDCLIB_restrict s, size_t n, const char * _PDCLIB_restrict format, ...) +{ + int rc; + va_list ap; + va_start( ap, format ); + rc = vsnprintf( s, n, format, ap ); + va_end( ap ); + return rc; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +#include +#include + +#define testprintf( s, n, format, ... ) snprintf( s, n, format, __VA_ARGS__ ) + +int main( void ) +{ + char buffer[100]; + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MIN ) == 4 ); + TESTCASE( strcmp( buffer, "-128" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MAX ) == 3 ); + TESTCASE( strcmp( buffer, "127" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhd", 0 ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MIN ) == 6 ); + TESTCASE( strcmp( buffer, "-32768" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MAX ) == 5 ); + TESTCASE( strcmp( buffer, "32767" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", 0 ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", 0 ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", 0l ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MIN ) == 20 ); + TESTCASE( strcmp( buffer, "-9223372036854775808" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MAX ) == 19 ); + TESTCASE( strcmp( buffer, "9223372036854775807" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", 0ll ) ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhu", UCHAR_MAX ) == 3 ); + TESTCASE( strcmp( buffer, "255" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhu", (unsigned char)-1 ) == 3 ); + TESTCASE( strcmp( buffer, "255" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hu", USHRT_MAX ) == 5 ); + TESTCASE( strcmp( buffer, "65535" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hu", (unsigned short)-1 ) == 5 ); + TESTCASE( strcmp( buffer, "65535" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%u", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%u", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lu", ULONG_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lu", -1ul ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%llu", ULLONG_MAX ) == 20 ); + TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%llu", -1ull ) == 20 ); + TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%X", UINT_MAX ) == 8 ); + TESTCASE( strcmp( buffer, "FFFFFFFF" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#X", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "0XFFFFFFFF" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%x", UINT_MAX ) == 8 ); + TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#x", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%o", UINT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "37777777777" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#o", -1u ) == 12 ); + TESTCASE( strcmp( buffer, "037777777777" ) == 0 ); + /* TODO: This test case is broken, doesn't test what it was intended to. */ + TESTCASE( testprintf( buffer, 100, "%.0#o", 0 ) == 5 ); + TESTCASE( strcmp( buffer, "%.0#o" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", 0 ) == 2 ); + TESTCASE( strcmp( buffer, "+0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+u", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+u", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", 0 ) == 2 ); + TESTCASE( strcmp( buffer, " 0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% u", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% u", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, " -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "02147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, "-02147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "002147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 8, "%9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483" ) == 0 ); + TESTCASE( testprintf( buffer, 8, "%9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-214748" ) == 0 ); + TESTCASE( testprintf( buffer, 9, "%9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 9, "%9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483" ) == 0 ); + TESTCASE( testprintf( buffer, 10, "%9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 10, "%9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 9, "%10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 9, "%10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483" ) == 0 ); + TESTCASE( testprintf( buffer, 10, "%10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 10, "%10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 11, "%10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 11, "%10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 10, "%11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 10, "%11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 11, "%11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 11, "%11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 12, "%11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 12, "%11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 11, "%12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, " 21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 11, "%12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, " -21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 12, "%12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, " 214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 12, "%12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, " -214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 13, "%12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 13, "%12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, " -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%030.20d", INT_MAX ) == 30 ); + TESTCASE( strcmp( buffer, " 00000000002147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%.6x", UINT_MAX ) == 8 ); + TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#6.3x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#3.6x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%.6d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%6.3d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%3.6d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#0.6x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#06.3x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#03.6x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#0.6d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#06.3d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#03.6d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+6.3d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+3.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+0.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+06.3d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+03.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "- %d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "- 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "- %d %% %d", INT_MAX, INT_MIN ) == 26 ); + TESTCASE( strcmp( buffer, "- 2147483647 % -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%c", 'x' ) == 1 ); + TESTCASE( strcmp( buffer, "x" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%s", "abcdef" ) == 6 ); + TESTCASE( strcmp( buffer, "abcdef" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%p", (void *)0xdeadbeef ) == 10 ); + TESTCASE( strcmp( buffer, "0xdeadbeef" ) == 0 ); + { + int val1, val2; + TESTCASE( testprintf( buffer, 100, "123456%n789%n", &val1, &val2 ) == 9 ); + TESTCASE( strcmp( buffer, "123456789" ) == 0 ); + TESTCASE( val1 == 6 ); + TESTCASE( val2 == 9 ); + } + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/snprintf.d b/user/pdclib/functions/stdio/snprintf.d new file mode 100644 index 0000000..53fdfb4 --- /dev/null +++ b/user/pdclib/functions/stdio/snprintf.d @@ -0,0 +1,13 @@ +functions/stdio/snprintf.d functions/stdio/snprintf.t: \ + functions/stdio/snprintf.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdarg.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdarg.h: diff --git a/user/pdclib/functions/stdio/snprintf.o b/user/pdclib/functions/stdio/snprintf.o new file mode 100644 index 0000000000000000000000000000000000000000..974b912a1044d6c844c3aa2b4b1552d1c655f101 GIT binary patch literal 2808 zcma)8O^6&t6n@p+v(wqxOm?#|Mq+TpjYc#*0ap)+M$KlFUxeX4Ky5Y{jkauFk0KYI;J%nUhN8 zaK-gST*FpHyq)4!4^|FUj?Idcw!wwWM4%p>%Juh59h+r}$0igE<&wC5?(R&A_z+Dr z#VxzAgUR`uTq<`9Gm3|j9qtg^Ma=3Drspt7hjS3eD@Ac8u2=dM8rLsf0C?YGa=ve1 zE_qK;uO>dt;dc%Geu7i_QA2r1@XF^1et9RrE0g~@CW|57>}k#$m`XDTF;A$om{nEn z1(589Zh$YRuyA!}L&`Duw>9ti9{^RAF3yI(Win}rnq~rLqdOU{;tbx?LJ!+^P<@4a zmvhv~o0yflUfqgWUk%vR@-S{?(I8IiY1WPg64cR*P7;T`RP(Lgu-!>T(s(t2WjVlt zB1=ynT{wR1$Wm(%FGnjumtD3xc;yP65Uh*ntQ{uw1CRRknYdLIZ8&$$4j*wG?1%aPCG8H9tTxKV z)HYa7hD*ID&189y^uxlEbkfU?_eRx|Cl+f9wfSH^cwkh7O_47{FCC+o$&1m6J2-8Dc9Rulh&ca<-NvNMGq^ zVH21oId(0Vbb3M7Ih9G!4zo~#W{NA-?lgxhOJTE_bWTb@ms}IY%eZ`FxfjJ9>)ji) zil)_JGYlm+)N3F8&2@@&|G1g$~8-$5gSc#w4hG;M#Hg{_y0Vao{;*}DD@-T^1x zPJG)m@%vf4TKcI&#~Zpud*suf5O{rW!C*Z7DD&x3*6#wCVHC;cyAMkG|CiqZ_%NR( z=HnN^lC>Ry!t%6DK;T=lWLef$tV8g{y#yWWU=M5^&w#fvV5N%pcb<$PYdZnCnC}ul z=+H4A(dK&ryo~`X7m)9MGKQ?J583iG{RBUrktJ)3peU~UU18k{Ys};k-osNJZ1V7`)9*Ghpkx0l|micVWS_{>*$Y($q3JPjp( z5w~G5AN#~Li}@}?@o(n_x0}eWL!~EwY!;0-|HEPa;tG^))p?XFrD8bj_ElRuD<6}~ z%U>W@cyq?&>XR?ZtawbW?qX49hsWfiGgC(7yW5TvkJY*vDrEFA&l8AB>%UmuT1ZV6w +#include +#include + +#ifndef REGTEST + +int sprintf( char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, ...) +{ + int rc; + va_list ap; + va_start( ap, format ); + rc = vsnprintf( s, SIZE_MAX, format, ap ); /* TODO: replace with non-checking call */ + va_end( ap ); + return rc; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +#include +#include + +#define testprintf( s, n, format, ... ) sprintf( s, format, __VA_ARGS__ ) + +int main( void ) +{ + char buffer[100]; + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MIN ) == 4 ); + TESTCASE( strcmp( buffer, "-128" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MAX ) == 3 ); + TESTCASE( strcmp( buffer, "127" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhd", 0 ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MIN ) == 6 ); + TESTCASE( strcmp( buffer, "-32768" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MAX ) == 5 ); + TESTCASE( strcmp( buffer, "32767" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", 0 ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", 0 ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", 0l ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MIN ) == 20 ); + TESTCASE( strcmp( buffer, "-9223372036854775808" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MAX ) == 19 ); + TESTCASE( strcmp( buffer, "9223372036854775807" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", 0ll ) ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhu", UCHAR_MAX ) == 3 ); + TESTCASE( strcmp( buffer, "255" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhu", (unsigned char)-1 ) == 3 ); + TESTCASE( strcmp( buffer, "255" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hu", USHRT_MAX ) == 5 ); + TESTCASE( strcmp( buffer, "65535" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hu", (unsigned short)-1 ) == 5 ); + TESTCASE( strcmp( buffer, "65535" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%u", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%u", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lu", ULONG_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lu", -1ul ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%llu", ULLONG_MAX ) == 20 ); + TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%llu", -1ull ) == 20 ); + TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%X", UINT_MAX ) == 8 ); + TESTCASE( strcmp( buffer, "FFFFFFFF" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#X", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "0XFFFFFFFF" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%x", UINT_MAX ) == 8 ); + TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#x", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%o", UINT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "37777777777" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#o", -1u ) == 12 ); + TESTCASE( strcmp( buffer, "037777777777" ) == 0 ); + /* TODO: This test case is broken, doesn't test what it was intended to. */ + TESTCASE( testprintf( buffer, 100, "%.0#o", 0 ) == 5 ); + TESTCASE( strcmp( buffer, "%.0#o" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", 0 ) == 2 ); + TESTCASE( strcmp( buffer, "+0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+u", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+u", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", 0 ) == 2 ); + TESTCASE( strcmp( buffer, " 0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% u", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% u", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, " -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "02147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, "-02147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "002147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%030.20d", INT_MAX ) == 30 ); + TESTCASE( strcmp( buffer, " 00000000002147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%.6x", UINT_MAX ) == 8 ); + TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#6.3x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#3.6x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%.6d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%6.3d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%3.6d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#0.6x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#06.3x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#03.6x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#0.6d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#06.3d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#03.6d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+6.3d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+3.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+0.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+06.3d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+03.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "- %d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "- 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "- %d %% %d", INT_MAX, INT_MIN ) == 26 ); + TESTCASE( strcmp( buffer, "- 2147483647 % -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%c", 'x' ) == 1 ); + TESTCASE( strcmp( buffer, "x" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%s", "abcdef" ) == 6 ); + TESTCASE( strcmp( buffer, "abcdef" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%p", (void *)0xdeadbeef ) == 10 ); + TESTCASE( strcmp( buffer, "0xdeadbeef" ) == 0 ); + { + int val1, val2; + TESTCASE( testprintf( buffer, 100, "123456%n789%n", &val1, &val2 ) == 9 ); + TESTCASE( strcmp( buffer, "123456789" ) == 0 ); + TESTCASE( val1 == 6 ); + TESTCASE( val2 == 9 ); + } + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/sprintf.d b/user/pdclib/functions/stdio/sprintf.d new file mode 100644 index 0000000..2f8cf1f --- /dev/null +++ b/user/pdclib/functions/stdio/sprintf.d @@ -0,0 +1,16 @@ +functions/stdio/sprintf.d functions/stdio/sprintf.t: \ + functions/stdio/sprintf.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdint.h \ + includes/stdarg.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdint.h: + +includes/stdarg.h: diff --git a/user/pdclib/functions/stdio/sprintf.o b/user/pdclib/functions/stdio/sprintf.o new file mode 100644 index 0000000000000000000000000000000000000000..5d66224fb39ed73e08f59f80e07d5ec23c8e89b7 GIT binary patch literal 2704 zcma)8O^6&t6n@p+vpc&pJNp-7H2#b*(G^XPkk!Km6W!f0tcD=sf(Lc&nVmnK=^49w zmIx6ei`ftlUw73`uORrK-uM3My{cDL zJ@Z!O>{Ci9F{H$nktXuJlXw|T&I@lEq(&+@max!f{65GkV1dEOIAm=EU^<4!#<2(ay ztFadnxD-S7X@ZscI)?E9!5PQqkYW4;z-dsPT>>9d4}q&`bqqiT*q)~;lI zpqi%H+I1!-gBqI3N!D&_((8+wyAUfKEb1pnIj&5$F)V3}l3Oqh|9Jgu={94rR z`C&PXHrqXM%h+l?@V!nL%eBs6vmT0s{Q!=Ji+Um(&#tbVU0dF$_54P=>9*KHO!orH zHY;Z0rrOi0y=#@`2aj78iqb)5N#qb22{}vThAkQ38YFaQtW*9S<6R8B0-EG541H{| zPG(w0xzqET#hCHn27cIX`t{8s6|?p&Z==%=qy4m_DF?#$m0HUSBxd`0O^QY@=z7T1 z>IG48e*%l?y79C#=hllW#YK0~Jt5^*uUjwE+-U>DURWN4^`P9}taaK|orwwlbv)(K zG02&fm8IgsdUfDOgCyRaM6B(b#p2CmUa@3j58 ziSG1jX;*(x^}Q~xS1Q~KJikd(k_}4`x7O=+>*$8-_oBLsMjj6%ul8DcS|dOrv#yCcyuS zdjvk_GsL(Li~=;i<&;eK7#w^uhD_Wk7}ERr49b_VaUbk~*~fE`%^Zkw0}7v?A>%s- zLpt9p{P4oYd_3v*G?PCr;vyWNG=~6Rrd<&Z)Q;Uc#?o%I! zIs@ZjSf(+Uk9}gzbiRu)+zp!{lh5b|({@Mxyk+dfga1URrz=o5yG~}=l1Wd8-@Iz$ z=ZzeZEoe@PY~jrrksY6WTIY^OWDC1EB3szu5!vXB$;fZY98Qq`HVmatfp4Z5C!g)iDmx-wNp~jDiX!GaV&+ire@%q6Ga__VsA>x7Yr=0pf&#*jH literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/sscanf.c b/user/pdclib/functions/stdio/sscanf.c new file mode 100644 index 0000000..368ae53 --- /dev/null +++ b/user/pdclib/functions/stdio/sscanf.c @@ -0,0 +1,32 @@ +/* $Id$ */ + +/* sscanf( const char *, const char *, ... ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include + +#ifndef REGTEST + +int sscanf( const char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, ... ) +{ + va_list ap; + va_start( ap, format ); + return vsscanf( s, format, ap ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/sscanf.d b/user/pdclib/functions/stdio/sscanf.d new file mode 100644 index 0000000..1c810f1 --- /dev/null +++ b/user/pdclib/functions/stdio/sscanf.d @@ -0,0 +1,13 @@ +functions/stdio/sscanf.d functions/stdio/sscanf.t: \ + functions/stdio/sscanf.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdarg.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdarg.h: diff --git a/user/pdclib/functions/stdio/sscanf.o b/user/pdclib/functions/stdio/sscanf.o new file mode 100644 index 0000000000000000000000000000000000000000..15ca487ea8f7d0ce3f8987df36e2769f14eac331 GIT binary patch literal 2660 zcma)8O=u)V6n@p+lXNo4Y<|{tWfe!5)wsGnf>9wWt0o!O;1WbO;6Y4!{xYL8J#o4x zt`b=!_!ENQs^Eei#j}c_2M?ln5cQ&X@aRF7_dzocEg*mxVj>_8J@4J7@y;+&q{mR>`T-&cq?5|zhyHN7?mP_7# z#ozNvSN}OUIQZ@x5jCw&7H0Eq;Y49t&8Vpn5vL^i{Mo$gi@2ICh^OqX_r+&orFL#OaBOdG!|7L<6IX163|HA*m$@lYHBC7b+C`0 z!R5Ibp`Rm7%u4-Tn8ci(E7noXK~ziHy(linNxj{Zpp5Do{V43jDPQXh>Wx?=j%#7m z3~Iar>rX5%onKj8ul1s4doyUUX^0N{o{1DT27869+7U~eIn~~ zWPnr8=%!RA|0~Ap7}@I7$jun~kW!hGX%Kns`k%VWhx_mJqRnDD4WhWc88zxfp68)Z zYlVF&w|d=1nQW&GjC*l;5I6eet$MA~u1ehM^^@XZ2;;ZI^-eoZq}l6tLn|F^Y0BZc zRGnL0D=ro1gZbdz!*-e!S$2A*F=X^c(?oJ^X=$N2w^kiQ$skK{dVY{f_uZ*ePN5Na zW(P{tjz8gfZ=mHz*&R)6*dqmh@l|IsCqevTHwml2q@Q8SaQ#LnNE#Ot3F=`IN>Gh) zE9#BvU~@gJR{M=@3Fwk(+EEktXDD~tQNwt5dNtd$HK;~m7x&6?5Bp)XNmZ5&TacjE z>vkKcKZtrsBS6zm$4OXw&JJt#k;v5bfACf~@dl1)XMVrz3#315asv7>?L$Z)@QU7m z!Fc*n<|{Qf8mw$^vdHAS3p)Cz4+OY@VUzK@2TJBMv;pRABLIzU(c)?T3xn^)knuYU zg=ZO~%%R zYp;1Y^IKB@b*$yA$$v+A+r_{B_7gaIMgX9k3n+;gZbDeu4(6c3JQL?4VipKHfZZT z`SZZ&iP!(bplq)|*;JiHxstQPVK=YZ*m)y|JGr}14P*5iL3;s->u_!Di%AB9w(?jMsu P)=mH8L_9A3h*SO-yC5pK literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/ungetc.c b/user/pdclib/functions/stdio/ungetc.c new file mode 100644 index 0000000..fdafc9d --- /dev/null +++ b/user/pdclib/functions/stdio/ungetc.c @@ -0,0 +1,30 @@ +/* $Id$ */ + +/* ungetc( int, FILE * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +int ungetc( int c, struct _PDCLIB_file_t * stream ) +{ + /* TODO: Implement. */ + return 0; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/ungetc.d b/user/pdclib/functions/stdio/ungetc.d new file mode 100644 index 0000000..f79419e --- /dev/null +++ b/user/pdclib/functions/stdio/ungetc.d @@ -0,0 +1,11 @@ +functions/stdio/ungetc.d functions/stdio/ungetc.t: \ + functions/stdio/ungetc.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdio/ungetc.o b/user/pdclib/functions/stdio/ungetc.o new file mode 100644 index 0000000000000000000000000000000000000000..d374cb7e1a66575feff0d6ccb0797ab4353a334b GIT binary patch literal 2960 zcmb7GONbm*6uqxLGu`Q)o|$wKBZ=5y5;8(kEjWsdB#xPA9Em}qSs0N?f2yZTyQ_z; z>NxR(f&>-Z1Q&t}(Ul^K3W6@&1aYOf(VaWRg)5B<5u(O(UcJ{{aU))+ckbuCbKmDy z)qDQlllLj5#EKGECYH$Oeim8MuqeBvDra8#=`)&-e<7mg)qzU2#C`50RGQtoL>*1ohmq2p8`&EOPoLHau#G7AkJTz<%xfs=HI8$ zf?<)Ys_+CY$1l=yreCM!O)R*ku%c#!4}W9}{&?AB`Kp8U~%@&B~L`pRnF0=u2yEy>JlVT zXB4;6Xb>m$ByC3n3FNrS*oVvgrNj(}a9_R%kr|!szlhtw~+N@e$Lf6xHvI*$m-f<8MGGf^J1X^uK!+#Y+A=xKU6bd-#}oy|c4Z*LH9)O0h7 zlV~Fj+cg&I*l2YdL#cNM{jg587Xgz&QXeJZu)f)D^`fRE-N7)ejfZeNrVzEaq}zzw zy-<)U;sH!(*+)~OBj=Z!2Saw#J8ewy#Hlm2)!I_96x?PvE6d29ak!vtdg?8jGuvZC8bWBc)=!FS}p`W-?a@>yAd@}V_=Hg+_pGyDr4 zzHnBo%1>I+I)N)#L=8cnv5$xIH7Z7It_!g9e4F6o zyTEmn@mRiBp>xcwcqnJV_n;+#O_dLSMfra3fM7p-R&2kw;Gk~hD<;Z`jeP>2)fxU8 z{qp-~hkb-tejP95)-jJ5`|*6K+uDOFe;{y~iV>TOn0>ypz#)>uxf8%&8~M0Tbm#dF z;SiX^isiGm#k}8>E7z=_c>OJkc77(b^BHN|UC3BmUC|RpH@i}d9qx5I#qq41iMaaY z^EU2aIdS#MCl2?z6_amv%t+?#+_>@Qc=8+MH$~y)W1T6S7x#_GJtp!Os<3pv2gH3u zyj*n?zr*0F!TSw9W-v0yI~w^e8q~E6`!!>~VeoB(?;8BTATLQA|E0n24E|{FH-o$& yu-}|P-T-L_29Fqg#Nav+>uMR?AfiaOOuSEC#PvR*vB +#include +#include + +#ifndef REGTEST + +int vfprintf( struct _PDCLIB_file_t * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, va_list arg ) +{ + /* TODO: This function should interpret format as multibyte characters. */ + /* Members: base, flags, n, i, this, s, width, prec, stream, arg */ + struct _PDCLIB_status_t status = { 0, 0, SIZE_MAX, 0, 0, NULL, 0, 0, stream, arg }; + while ( *format != '\0' ) + { + const char * rc; + if ( ( *format != '%' ) || ( ( rc = _PDCLIB_print( format, &status ) ) == format ) ) + { + /* No conversion specifier, print verbatim */ + putc( *(format++), stream ); + status.i++; + } + else + { + /* Continue parsing after conversion specifier */ + format = rc; + } + } + return status.i; +} + +#endif + +#ifdef TEST +#include +#include +#include +#include <_PDCLIB_test.h> + +static int testprintf( FILE * stream, size_t n, const char * format, ... ) +{ + int i; + va_list arg; + va_start( arg, format ); + i = vfprintf( stream, format, arg ); + va_end( arg ); + return i; +} + +int main( void ) +{ + FILE * buffer; + TESTCASE( ( buffer = fopen( "testfile", "w" ) ) != NULL ); + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MIN ) == 4 ); + //TESTCASE( strcmp( buffer, "-128" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MAX ) == 3 ); + //TESTCASE( strcmp( buffer, "127" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhd", 0 ) == 1 ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MIN ) == 6 ); + //TESTCASE( strcmp( buffer, "-32768" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MAX ) == 5 ); + //TESTCASE( strcmp( buffer, "32767" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", 0 ) == 1 ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", 0 ) == 1 ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", 0l ) == 1 ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MIN ) == 20 ); + //TESTCASE( strcmp( buffer, "-9223372036854775808" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MAX ) == 19 ); + //TESTCASE( strcmp( buffer, "9223372036854775807" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", 0ll ) ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhu", UCHAR_MAX ) == 3 ); + //TESTCASE( strcmp( buffer, "255" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhu", (unsigned char)-1 ) == 3 ); + //TESTCASE( strcmp( buffer, "255" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hu", USHRT_MAX ) == 5 ); + //TESTCASE( strcmp( buffer, "65535" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hu", (unsigned short)-1 ) == 5 ); + //TESTCASE( strcmp( buffer, "65535" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%u", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%u", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lu", ULONG_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lu", -1ul ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%llu", ULLONG_MAX ) == 20 ); + //TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%llu", -1ull ) == 20 ); + //TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%X", UINT_MAX ) == 8 ); + //TESTCASE( strcmp( buffer, "FFFFFFFF" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#X", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "0XFFFFFFFF" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%x", UINT_MAX ) == 8 ); + //TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#x", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%o", UINT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "37777777777" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#o", -1u ) == 12 ); + //TESTCASE( strcmp( buffer, "037777777777" ) == 0 ); + /* TODO: This test case is broken, doesn't test what it was intended to. */ + TESTCASE( testprintf( buffer, 100, "%.0#o", 0 ) == 5 ); + //TESTCASE( strcmp( buffer, "%.0#o" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", 0 ) == 2 ); + //TESTCASE( strcmp( buffer, "+0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+u", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+u", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", 0 ) == 2 ); + //TESTCASE( strcmp( buffer, " 0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% u", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% u", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MIN ) == 12 ); + //TESTCASE( strcmp( buffer, " -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MIN ) == 12 ); + //TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "02147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MIN ) == 12 ); + //TESTCASE( strcmp( buffer, "-02147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, "002147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MIN ) == 12 ); + //TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%030.20d", INT_MAX ) == 30 ); + //TESTCASE( strcmp( buffer, " 00000000002147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%.6x", UINT_MAX ) == 8 ); + //TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#6.3x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#3.6x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%.6d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%6.3d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%3.6d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#0.6x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#06.3x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#03.6x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#0.6d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#06.3d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#03.6d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+.6d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+6.3d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+3.6d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+0.6d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+06.3d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+03.6d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "- %d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, "- 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "- %d %% %d", INT_MAX, INT_MIN ) == 26 ); + //TESTCASE( strcmp( buffer, "- 2147483647 % -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%c", 'x' ) == 1 ); + //TESTCASE( strcmp( buffer, "x" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%s", "abcdef" ) == 6 ); + //TESTCASE( strcmp( buffer, "abcdef" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%p", (void *)0xdeadbeef ) == 10 ); + //TESTCASE( strcmp( buffer, "0xdeadbeef" ) == 0 ); + { + int val1, val2; + TESTCASE( testprintf( buffer, 100, "123456%n789%n", &val1, &val2 ) == 9 ); + //TESTCASE( strcmp( buffer, "123456789" ) == 0 ); + TESTCASE( val1 == 6 ); + TESTCASE( val2 == 9 ); + } + TESTCASE( fclose( buffer ) == 0 ); + char readbuffer[1000]; + TESTCASE( ( buffer = fopen( "testfile", "r" ) ) != NULL ); + TESTCASE( fread( readbuffer, 1, 1000, buffer ) == 985 ); + TESTCASE( fclose( buffer ) == 0 ); + TESTCASE( memcmp( readbuffer, "-1281270-32768327670-214748364821474836470-214748364821474836470-922337203685477580892233720368547758070255255655356553542949672954294967295429496729542949672951844674407370955161518446744073709551615FFFFFFFF0XFFFFFFFFffffffff0xffffffff37777777777037777777777%.0#o-2147483648+2147483647+042949672954294967295-2147483648 2147483647 042949672954294967295-21474836482147483647-21474836482147483647-2147483648 2147483647 -2147483648 2147483647-21474836482147483647-21474836482147483647-21474836482147483647 -2147483648 2147483647 -21474836482147483647-21474836482147483647-214748364802147483647-02147483648002147483647-21474836482147483647-21474836482147483647-21474836482147483647 -2147483648 2147483647 00000000002147483647ffffffff0xffffffff0xffffffff-2147483648-2147483648-21474836480xffffffff0xffffffff0xffffffff214748364721474836472147483647+2147483647+2147483647+2147483647+2147483647+2147483647+2147483647- 2147483647- 2147483647 % -2147483648xabcdef0xdeadbeef123456789", 985 ) == 0 ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/vfprintf.d b/user/pdclib/functions/stdio/vfprintf.d new file mode 100644 index 0000000..159f28a --- /dev/null +++ b/user/pdclib/functions/stdio/vfprintf.d @@ -0,0 +1,16 @@ +functions/stdio/vfprintf.d functions/stdio/vfprintf.t: \ + functions/stdio/vfprintf.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdarg.h \ + includes/stdint.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdarg.h: + +includes/stdint.h: diff --git a/user/pdclib/functions/stdio/vfprintf.o b/user/pdclib/functions/stdio/vfprintf.o new file mode 100644 index 0000000000000000000000000000000000000000..19a79bb4eb088ee52535980d61d0a0c4162118c9 GIT binary patch literal 3820 zcmb7GZ-^Xc8GqiH*}L7_z1_XrOHyfSSMQQbvE5aBsWE9{&D|J-;S}45f_m(q+1;VL zv&YVCY{e=yZSXvWM1+1Ql%N(7YO5&f2a#Zvpp8u+aY{pe-)3VoN| z=M(tTTae4{)x>%!fxjg1ast-~+irHteRbO{Z@JfBxo_Jolzt|6?;GFpP4~*y+L8mu zma}y24J6xgU)y$HJK`3`%L%RYt4n9yg4#Zv-MVkdF|=*>>e)+b%f0%_6zE%SAt66< zY5X08e)p`XIkm4?$=k)7i*ssTm8V3kCCTTHE4P^sA|LWN;$-ukS-Um9<{~DsXxme(MdotVNjyi1nYu za>V&GgKvHgPGop9hU|+3D|1&2(<@-u&h#=NJ6#4ie`n-5=5X$z`qv+z%`T%kU>8*r zl-wE8OX`#GVbmOJu*-_|Sc^`sOLI=Sv02CkH0RZ?W3!z5IMA+Wb0OEIxuDIPawkaM zr8uOuxHtDHMtAE})!b8z?ul!#7MHL%e?UC@Fq#AQikiY|=Pr_RQ0WE9&Ct9{{XEX+ z%miY8K#!H3@x?x*jY95T5d>4-;5297-_2Mkr_(j7sopI2L{9zE* z!>H{KrB=sr^hQCWAI5sCKW=-W$eGUO2$4<=gNST=Vr})*$>STXVbJlrwI0v8@qv{% zkPvl4w^>656s%K8`PN$Heb(}>><_*LTH)i>L% zzTce8spI#(jYz`Ya1>Q}U(IAg|BDPX#~r`@fRGk62A-U0Z1nvw_Ip8FzTmf`-lR{b zjUJN(C}SML(H{ogYTPjYLU*Kmp!xZPTK0zO>K9)Hxro4po3IEWfeU^GgwXS9*muSFcS z)^0=%sWn4fhPKxncQ+c%=EyrEHBu6fA9QeScI>_%c!u2{w$h=^ag)ab$#&?CQ6uQm zm1IK+Qfmzd0}snz3x<(b!@Aso)7rW}-K{g?Ir~54R&aT#@Xd{d{}JgMVeSbpRxY8$ z?cQ0uTA=O1!~W#)7V-saE-6%bnN3PezW2aKe*6*u{x9Bp5o10h#)=Leu>`{_Gdn#$@h8a zrVmuHGa|QB(PCl)*hXil4j%W&h>7`dq{sbDYTP_xX55FNn?B63j(k-rT1@OA*y(&% zkk9NdmS~diJaqQqzEA?>`>{y^n<}5jH5%Tn_y<{n&xqlD4~|rKSp_dGCiaWB@z%gg zuOH`2`6-_CJYGu8V;(WHE_2Y$*@G&Z$oE?+TFkh_)G?ChvA9(@cf()8!+cyPj+xGP zy&!TMd`3(@V;fBS9r@Q=#!tNQPoH*r1lnfSNiSQl87Z+Rx7x&cB6q|V{Jo~c7M`3P zv4uOoBX&IFw9QrA5nH&zJ7QyHune*AoidM|=Dje&bz3wBkoM#&fKS-ugJ8a8@xO+2 zHpfwm)HWUqowkW6h4)us2{@+0R9GD`en$b{K^vQSi^g{mvF~-wMW$yjNpK zBR)GZ@2tl28Xwd6gvKW|KBe&|8soE!ah}!oA2q(H@gExhtuc#3!n*co+^_MV#x;%n zS0&Ha$lr0=k7|5c8S>rX0(^wnwD;nQP#Pe>A`-wP0bs~62HGW28mx$+njptZD V^mt#;800?Fe-jZ$jDKac{|i!I{9ph8 literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/vfscanf.c b/user/pdclib/functions/stdio/vfscanf.c new file mode 100644 index 0000000..bb1ebca --- /dev/null +++ b/user/pdclib/functions/stdio/vfscanf.c @@ -0,0 +1,31 @@ +/* $Id$ */ + +/* vfscanf( FILE *, const char *, va_list ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include + +#ifndef REGTEST + +int vfscanf( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, va_list arg ) +{ + /* TODO: Implement using vsscanf() reading from file buffer */ + return 0; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/vfscanf.d b/user/pdclib/functions/stdio/vfscanf.d new file mode 100644 index 0000000..b3001f2 --- /dev/null +++ b/user/pdclib/functions/stdio/vfscanf.d @@ -0,0 +1,13 @@ +functions/stdio/vfscanf.d functions/stdio/vfscanf.t: \ + functions/stdio/vfscanf.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdarg.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdarg.h: diff --git a/user/pdclib/functions/stdio/vfscanf.o b/user/pdclib/functions/stdio/vfscanf.o new file mode 100644 index 0000000000000000000000000000000000000000..a0851579886da24f4d514519185e3d29de464a65 GIT binary patch literal 3144 zcmb7GU5Fc16h3!mvYRy7bhl}1wN+DhYgcI#!BuJtb?w^L)ul+aNR_%wlF9C1GAWr! zX+^PE1qH$ON$^2^@j*}!6jXewt%zVj^hJCT1i>e%PYSix@4ItvGWA6~F!wuu_uO;N zy?16_*uQi@DJ7PaxH6JN9v@3Ba~fu4qg3R`tG|3o@z@0sHKn$dD@C`wxjd!TsY$py zGg2(>ExLIT*RW*~Z=<;7-Nik{#fnI7EnLWqRaCJ^t%5K z4LV*fj1qCZ+)=o=`P>x1+r_Eh?T1g!djzAa#ysk8rT+3ZXvXr+l^22IKVfkGqRN?; zaez2iQ^^x=iQ?bKFd{+&lUxS@?#|6(g=MY^S*1h?@$W zxN4|jF`;o(Kn*9}QZfZBiHL8YDl@&WcvTgnx zF^V`Xu#t7nN%69l&TGjl`TZ5xR<)GJ8ppupyst1$a0B$dIdX<`)RpoCMt!1TSM5R6 zOu}9i*W;uW_M}$Fjt2e6@5GvKb_T5=7CF(5n|{=;HF^4%AAN9PX>s3jvlq3)mD(y# ziq&Cys?hPkx*}kaV#*^kc%vz0wfCswAQws;97%XiIDveg$QC#nJopiZYw2#kAieGmuz`teq? z6E-AX?e&xDFc>2v$*^@&R{f~e3FN@y(tbfEA@@>F_{*IzPNd!Icl}HfoTn4PWLA^O znkHLlyM=-d9y(H8sLs{qYIhF}Hg1}Z$)X+f(>Rn(>3WeUIGKnXTv*s$ojuYRM9Clx zw{vcwrF-r$;U}>**FZ|tbNQ0zy@G9B&;2sQEqtJy-}kaJk&{|{s+;%?VA4-<)p7|J zthM~ams%sn`E3P_!OF7VX!L^d0kx=?1T{2oC(cRpne4Q7pJ(lV&}R7ZLYPmC@Eemo&i0URHGaG> zqGY71EfOu6hhU{9WAZO#vA|CGo>i|29_ZoQ4xeE{J65{dI zXNfGIHw;?8c{F#%IvE@N-Z4BtQ;VCBAshN*=qyh&{dQ#hSTE^AJlQ&SW$KuM&Gv;n zQXkS;#5+HfMr(1+^d+AfFETik8vy*gG9LRxbvE8bYy$sXEM;@II$~Du$?w;)w(I}y z7(bf{n=rcWA$0@LPlYfusI6gI5ifP%ibG4c=++K7;&or2T1w sp}~Q{(?rz$l0klp6kbl}jQwqcx(@j1K4P%QbIJMq`BW1k{3W6M4{erlK>z>% literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/vprintf.c b/user/pdclib/functions/stdio/vprintf.c new file mode 100644 index 0000000..d7ad502 --- /dev/null +++ b/user/pdclib/functions/stdio/vprintf.c @@ -0,0 +1,253 @@ +/* $Id$ */ + +/* vprintf( const char *, va_list arg ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include + +#ifndef REGTEST + +int vprintf( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) +{ + return vfprintf( stdout, format, arg ); +} + +#endif + +#ifdef TEST +#include +#include +#include <_PDCLIB_test.h> + +static int testprintf( FILE * stream, size_t n, const char * format, ... ) +{ + int i; + va_list arg; + va_start( arg, format ); + i = vprintf( format, arg ); + va_end( arg ); + return i; +} + +int main( void ) +{ + FILE * buffer; + TESTCASE( ( buffer = freopen( "testfile", "w", stdout ) ) != NULL ); + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MIN ) == 4 ); + //TESTCASE( strcmp( buffer, "-128" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MAX ) == 3 ); + //TESTCASE( strcmp( buffer, "127" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhd", 0 ) == 1 ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MIN ) == 6 ); + //TESTCASE( strcmp( buffer, "-32768" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MAX ) == 5 ); + //TESTCASE( strcmp( buffer, "32767" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", 0 ) == 1 ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", 0 ) == 1 ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", 0l ) == 1 ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MIN ) == 20 ); + //TESTCASE( strcmp( buffer, "-9223372036854775808" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MAX ) == 19 ); + //TESTCASE( strcmp( buffer, "9223372036854775807" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", 0ll ) ); + //TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhu", UCHAR_MAX ) == 3 ); + //TESTCASE( strcmp( buffer, "255" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhu", (unsigned char)-1 ) == 3 ); + //TESTCASE( strcmp( buffer, "255" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hu", USHRT_MAX ) == 5 ); + //TESTCASE( strcmp( buffer, "65535" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hu", (unsigned short)-1 ) == 5 ); + //TESTCASE( strcmp( buffer, "65535" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%u", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%u", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lu", ULONG_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lu", -1ul ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%llu", ULLONG_MAX ) == 20 ); + //TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%llu", -1ull ) == 20 ); + //TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%X", UINT_MAX ) == 8 ); + //TESTCASE( strcmp( buffer, "FFFFFFFF" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#X", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "0XFFFFFFFF" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%x", UINT_MAX ) == 8 ); + //TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#x", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%o", UINT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "37777777777" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#o", -1u ) == 12 ); + //TESTCASE( strcmp( buffer, "037777777777" ) == 0 ); + /* TODO: This test case is broken, doesn't test what it was intended to. */ + TESTCASE( testprintf( buffer, 100, "%.0#o", 0 ) == 5 ); + //TESTCASE( strcmp( buffer, "%.0#o" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", 0 ) == 2 ); + //TESTCASE( strcmp( buffer, "+0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+u", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+u", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", 0 ) == 2 ); + //TESTCASE( strcmp( buffer, " 0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% u", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% u", -1u ) == 10 ); + //TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MIN ) == 12 ); + //TESTCASE( strcmp( buffer, " -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MIN ) == 12 ); + //TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "02147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MIN ) == 12 ); + //TESTCASE( strcmp( buffer, "-02147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, "002147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MIN ) == 12 ); + //TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%030.20d", INT_MAX ) == 30 ); + //TESTCASE( strcmp( buffer, " 00000000002147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%.6x", UINT_MAX ) == 8 ); + //TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#6.3x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#3.6x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%.6d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%6.3d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%3.6d", INT_MIN ) == 11 ); + //TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#0.6x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#06.3x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#03.6x", UINT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#0.6d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#06.3d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#03.6d", INT_MAX ) == 10 ); + //TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+.6d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+6.3d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+3.6d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+0.6d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+06.3d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+03.6d", INT_MAX ) == 11 ); + //TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "- %d", INT_MAX ) == 12 ); + //TESTCASE( strcmp( buffer, "- 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "- %d %% %d", INT_MAX, INT_MIN ) == 26 ); + //TESTCASE( strcmp( buffer, "- 2147483647 % -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%c", 'x' ) == 1 ); + //TESTCASE( strcmp( buffer, "x" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%s", "abcdef" ) == 6 ); + //TESTCASE( strcmp( buffer, "abcdef" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%p", (void *)0xdeadbeef ) == 10 ); + //TESTCASE( strcmp( buffer, "0xdeadbeef" ) == 0 ); + { + int val1, val2; + TESTCASE( testprintf( buffer, 100, "123456%n789%n", &val1, &val2 ) == 9 ); + //TESTCASE( strcmp( buffer, "123456789" ) == 0 ); + TESTCASE( val1 == 6 ); + TESTCASE( val2 == 9 ); + } + TESTCASE( fclose( buffer ) == 0 ); + char readbuffer[1000]; + TESTCASE( ( buffer = fopen( "testfile", "r" ) ) != NULL ); + TESTCASE( fread( readbuffer, 1, 1000, buffer ) == 985 ); + TESTCASE( fclose( buffer ) == 0 ); + TESTCASE( memcmp( readbuffer, "-1281270-32768327670-214748364821474836470-214748364821474836470-922337203685477580892233720368547758070255255655356553542949672954294967295429496729542949672951844674407370955161518446744073709551615FFFFFFFF0XFFFFFFFFffffffff0xffffffff37777777777037777777777%.0#o-2147483648+2147483647+042949672954294967295-2147483648 2147483647 042949672954294967295-21474836482147483647-21474836482147483647-2147483648 2147483647 -2147483648 2147483647-21474836482147483647-21474836482147483647-21474836482147483647 -2147483648 2147483647 -21474836482147483647-21474836482147483647-214748364802147483647-02147483648002147483647-21474836482147483647-21474836482147483647-21474836482147483647 -2147483648 2147483647 00000000002147483647ffffffff0xffffffff0xffffffff-2147483648-2147483648-21474836480xffffffff0xffffffff0xffffffff214748364721474836472147483647+2147483647+2147483647+2147483647+2147483647+2147483647+2147483647- 2147483647- 2147483647 % -2147483648xabcdef0xdeadbeef123456789", 985 ) == 0 ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/vprintf.d b/user/pdclib/functions/stdio/vprintf.d new file mode 100644 index 0000000..870b336 --- /dev/null +++ b/user/pdclib/functions/stdio/vprintf.d @@ -0,0 +1,13 @@ +functions/stdio/vprintf.d functions/stdio/vprintf.t: \ + functions/stdio/vprintf.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdarg.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdarg.h: diff --git a/user/pdclib/functions/stdio/vprintf.o b/user/pdclib/functions/stdio/vprintf.o new file mode 100644 index 0000000000000000000000000000000000000000..f877f5ac57ead7d62fcb494eaba2d57e3acb10d4 GIT binary patch literal 3224 zcmb7GU1%It6h3!mHrefNwn;Yq(N?=9sg2g|7K~C`ZMA8w!B9jE7Nmy#nN3!AXT#2H ztbh2^3N3xG#fLtK7EvFBBBFx&RxCdBMXK*26a^6xeQs;~zL|Sxr=kxYnERc-d(J)Q z-kCeE9GHDbDJ6!K*wU9oW(Ok6R0xx@PR3;J{# zm*UWE!o2yZ*lBO>z8oq%k8W6D@s8RAUi}K;)leZauF-N*O)n7JNzKB=PNy7zvyD@~ zKLDSU^9V*;4g3IbMydZ}3)q3Qb@g@N-~|lUHL9#}83c%RJ(3)8W-0!41S2BMVY02# zT}oDJHzjNE93^M)G9f+q6u>Ewzw!~r^azGYJFlLEbLK1RSF6VWNR_!jaaeH?*0_^7 zz<48yYqrL7nJcu8sxLxuIP)pRf)>XzMT%ouT%Wn0;u^)2*7(K@wpr}8I#e-JVdQn; z8m#dNbmVK;SE>CNRbH`Hl4>VvmAaZA!Wf=z8XG;Y7BoAaU-pA~vm>Q4HqGsNm6jj!wN|h0`Xb9qT^Jgr z8sCKZNB2+9&g`47b-YG%p|r@uV07?`6k$BDHquH89;h|17SiV|i)#XLuq5EQ2))3k z>CJ*I>9JWM-Hb7uFQ35m2p+wf(7G|UI-$(Lw2XYa>Iap;l}5AWdX=^tuat`UK&ril z>(vFz?ev1!=r>=WkyCqqoX-^5SnBw&wmRNIF&uiH-(2wAdXYyy7HW%?u9O!$ZMRIe z)dcz-zufcPZh5I*Yc;FlFLt^?F`mNtSW&ZnR2C~7rMqIoa%H~N^ih4dHoc^V+l>mQtg8*vd+yOd z{zQ zl>F!0L8S@|x)ClKuIsi+0h5;Mm7pS}s*kf;cdNaH`AW6gb(f_?mq^p}8aUN`xz+Ss zxc$!Yb?^f+YFt#T6WZtDjUX&E)eJwEu ztbB}kMKYR9yq6&-;~hmjv%f>InL18`=N#?}>088Wm>`hJ@_AdM@taDCOh9MI_tbTxc*h!|Y_2?9_~x?J zH{^07`W3(*8r&3|Zvk3Z0^eJO(y`T|kdUh)hTkUOO_Z^T^e1j6B1l>L-J@~0M!wUW z|G376M%*@`{+Pzo8qaEcSL25o&ujclV|a!U_o9|BYy45;?;5Xb%;9iw9UC;>q48dg q4{My)_zV&Cc^bP!Z261Y{=UZJj1RxCZx{@+|J1K1V(a;bL-}vjmwTfC literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/vscanf.c b/user/pdclib/functions/stdio/vscanf.c new file mode 100644 index 0000000..564aa22 --- /dev/null +++ b/user/pdclib/functions/stdio/vscanf.c @@ -0,0 +1,30 @@ +/* $Id$ */ + +/* vscanf( const char *, va_list arg ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include + +#ifndef REGTEST + +int vscanf( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) +{ + return vfscanf( stdin, format, arg ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/vscanf.d b/user/pdclib/functions/stdio/vscanf.d new file mode 100644 index 0000000..91ae94d --- /dev/null +++ b/user/pdclib/functions/stdio/vscanf.d @@ -0,0 +1,13 @@ +functions/stdio/vscanf.d functions/stdio/vscanf.t: \ + functions/stdio/vscanf.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdarg.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdarg.h: diff --git a/user/pdclib/functions/stdio/vscanf.o b/user/pdclib/functions/stdio/vscanf.o new file mode 100644 index 0000000000000000000000000000000000000000..80b12eae420313d786ac80660372af7d780dabf8 GIT binary patch literal 3216 zcmb7GONbm*6uqyidZs(w)5(1Dkwom!6B9q_jyQ@Yn&^x%84`k+3@RAM{#4JDc2^Hw z)kFM8gJ1|~bd!Zd5p^MC5m3;T3!{sGf{J@TptumxbrQ#Os@|)v1YCHb-nsw#?)y~L zOM4GKsFV^zN^BWOBKwD8%Txs0WW7wt+{s^0{ITIZYEI1+P9B-eo|?-7oRiMv@0V9r zRxVx;HLA80$Mbe^V{ufCsWnJrO-eq$J8x%2Y|R!$oONOscjkBHXU9b{tKmXsXk6v< z)G7$WBZdIy{Hfu%hN2wHCa(4B^E{AyU?8IT_Cn#db2&aIv$QKVfh-GxYnt zU^C7EjJ6v3nfikmtiQHk9LidkUI7k&N!4Yltg;LP#JUnojyU&H{O2e}WH`VAD!W9< z%G^fD8a_+O8UBHg9exbpY$gB8M;NoC7`E9(^$47EpHjbCJq$pp91GiP6enSoo!l#D&<(*ULVcD zDox7W53%`EQ_5MY7hLQmFM7AnkNit z5#}FyVCLZL^n9c1x4ebQBF}=+Av#t>>A>2kDj9g7)uLL+zH3>W5{QE(p+lq>_$-nA zTGHoQMRXm;C|=IP^(dZrGLdmpVss*z0}~kP)Pt}Vy3+F6u3zi8$waA`52fC3xqdUz z2HvyOGNvCS+SXDxfY$WbYC>pt{e@CA^!>nF@ZDyK$2}1mi?yCq7rPy|O1A9*gKkjm z2X3#r)NHi9x&({eURX*(7?1gQ&114y^P6oK^Jsd$pt{FBl2*6ZsikT#AgY5X&O9|K zny%T~YO;s>4$YNjN>i1o%I!&0%eDEo7ohcMPI@XWw-@K6thTfstZ$60ASoepdDc+UO@-2h)+0{vML zepk|G*qrQ*(C6?ND&-|w*R@bEo_@SFd~r~=@sJ*kAsJ1+TcC;FNZRsWemh`iK11}o zXau0KO{aL8H^aayYsj#>p-A_!1AXj(k$rFtOdot7n;5Y29o_mSnh}|V&XDo@0E$$&9EM+- zjP0{){Eomcy?&e@=@UHZK8~mQ7=z99!EZ38p3rgR`znzJb7KAY0}va3Lh=%n>maVi z!+cyP)=cLUYy$6=A=8JE4W{*u{JmoI#H;`OC|^|plIc2*vgPW^zYJvIRd{ zDY7}~6xq?v4-|IPaa!go4#*a+@PKTrjHytDdJH?Aj^MhjAGk;BIQZD>4{iJzT5d)E z0QfV5zd|7IgoR|hvkGlvn?+&z%ukHoOF(|W6*iFm#LYw`scJv|B+-ADM&4)2hc&h| zh8j<3JgxDJ#&t4}Vz`>xrQRB@T@7B0q +#include + +#ifndef REGTEST + +int vsnprintf( char * s, size_t n, const char * format, _PDCLIB_va_list arg ) +{ + /* TODO: This function should interpret format as multibyte characters. */ + /* Members: base, flags, n, i, this, s, width, prec, stream, arg */ + struct _PDCLIB_status_t status = { 0, 0, n, 0, 0, s, 0, 0, NULL, arg }; + while ( *format != '\0' ) + { + const char * rc; + if ( ( *format != '%' ) || ( ( rc = _PDCLIB_print( format, &status ) ) == format ) ) + { + /* No conversion specifier, print verbatim */ + s[ status.i++ ] = *(format++); + } + else + { + /* Continue parsing after conversion specifier */ + format = rc; + } + } + s[ status.i ] = '\0'; + return status.i; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +#include +#include +#include + + +static int testprintf( char * s, size_t n, const char * format, ... ) +{ + int i; + va_list arg; + va_start( arg, format ); + i = vsnprintf( s, n, format, arg ); + va_end( arg ); + return i; +} + +int main( void ) +{ + char buffer[100]; + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MIN ) == 4 ); + TESTCASE( strcmp( buffer, "-128" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MAX ) == 3 ); + TESTCASE( strcmp( buffer, "127" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhd", 0 ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MIN ) == 6 ); + TESTCASE( strcmp( buffer, "-32768" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MAX ) == 5 ); + TESTCASE( strcmp( buffer, "32767" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", 0 ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", 0 ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", 0l ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MIN ) == 20 ); + TESTCASE( strcmp( buffer, "-9223372036854775808" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MAX ) == 19 ); + TESTCASE( strcmp( buffer, "9223372036854775807" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", 0ll ) ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhu", UCHAR_MAX ) == 3 ); + TESTCASE( strcmp( buffer, "255" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhu", (unsigned char)-1 ) == 3 ); + TESTCASE( strcmp( buffer, "255" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hu", USHRT_MAX ) == 5 ); + TESTCASE( strcmp( buffer, "65535" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hu", (unsigned short)-1 ) == 5 ); + TESTCASE( strcmp( buffer, "65535" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%u", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%u", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lu", ULONG_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lu", -1ul ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%llu", ULLONG_MAX ) == 20 ); + TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%llu", -1ull ) == 20 ); + TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%X", UINT_MAX ) == 8 ); + TESTCASE( strcmp( buffer, "FFFFFFFF" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#X", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "0XFFFFFFFF" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%x", UINT_MAX ) == 8 ); + TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#x", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%o", UINT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "37777777777" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#o", -1u ) == 12 ); + TESTCASE( strcmp( buffer, "037777777777" ) == 0 ); + /* TODO: This test case is broken, doesn't test what it was intended to. */ + TESTCASE( testprintf( buffer, 100, "%.0#o", 0 ) == 5 ); + TESTCASE( strcmp( buffer, "%.0#o" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", 0 ) == 2 ); + TESTCASE( strcmp( buffer, "+0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+u", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+u", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", 0 ) == 2 ); + TESTCASE( strcmp( buffer, " 0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% u", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% u", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, " -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "02147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, "-02147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "002147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 8, "%9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483" ) == 0 ); + TESTCASE( testprintf( buffer, 8, "%9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-214748" ) == 0 ); + TESTCASE( testprintf( buffer, 9, "%9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 9, "%9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483" ) == 0 ); + TESTCASE( testprintf( buffer, 10, "%9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 10, "%9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 9, "%10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 9, "%10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483" ) == 0 ); + TESTCASE( testprintf( buffer, 10, "%10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 10, "%10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 11, "%10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 11, "%10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 10, "%11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 10, "%11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 11, "%11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 11, "%11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 12, "%11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 12, "%11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 11, "%12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, " 21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 11, "%12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, " -21474836" ) == 0 ); + TESTCASE( testprintf( buffer, 12, "%12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, " 214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 12, "%12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, " -214748364" ) == 0 ); + TESTCASE( testprintf( buffer, 13, "%12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 13, "%12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, " -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%030.20d", INT_MAX ) == 30 ); + TESTCASE( strcmp( buffer, " 00000000002147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%.6x", UINT_MAX ) == 8 ); + TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#6.3x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#3.6x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%.6d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%6.3d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%3.6d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#0.6x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#06.3x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#03.6x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#0.6d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#06.3d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#03.6d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+6.3d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+3.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+0.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+06.3d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+03.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "- %d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "- 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "- %d %% %d", INT_MAX, INT_MIN ) == 26 ); + TESTCASE( strcmp( buffer, "- 2147483647 % -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%c", 'x' ) == 1 ); + TESTCASE( strcmp( buffer, "x" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%s", "abcdef" ) == 6 ); + TESTCASE( strcmp( buffer, "abcdef" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%p", (void *)0xdeadbeef ) == 10 ); + TESTCASE( strcmp( buffer, "0xdeadbeef" ) == 0 ); + { + int val1, val2; + TESTCASE( testprintf( buffer, 100, "123456%n789%n", &val1, &val2 ) == 9 ); + TESTCASE( strcmp( buffer, "123456789" ) == 0 ); + TESTCASE( val1 == 6 ); + TESTCASE( val2 == 9 ); + } + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/vsnprintf.d b/user/pdclib/functions/stdio/vsnprintf.d new file mode 100644 index 0000000..478063f --- /dev/null +++ b/user/pdclib/functions/stdio/vsnprintf.d @@ -0,0 +1,13 @@ +functions/stdio/vsnprintf.d functions/stdio/vsnprintf.t: \ + functions/stdio/vsnprintf.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdarg.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdarg.h: diff --git a/user/pdclib/functions/stdio/vsnprintf.o b/user/pdclib/functions/stdio/vsnprintf.o new file mode 100644 index 0000000000000000000000000000000000000000..8c728402d4321569d0f0901706fd214017271afe GIT binary patch literal 3792 zcmb7GZ-^Xc8GqiH*}K`>y}iBL%O6Rqr*}ys+C6J7F(z$Va~b1l3}U!1f}Z~&{0rbQ8rkt|0ghed@#X~BYmim0d`LyHD$Eh>IE(GNisqAgOPAkygh`^~)X?nLl| z56t^}{=LupJkR^SGxIs`{QH$sVn~TCBT3|8H?=G!a76aWtgH_HeC5>--1J_e?xy!E z!j@MYc)z{r?WDRtq&j!t-MZ=hDb?Lh;nmbMJMdn6Wo64NPyI+9IMl!A3Gb!B*#!rR zfwOS?&hGB+zbh2=&uu>7p zO~HlCSVa{I)G7$$lS7vi6C!R!*`>sqqcyLsxs?j76A)d@)MBBk9xA2_+*@3!FqenN zIIWmV{ji*cX_F9j8Wc-QcZpL4)H8$qDMQcbde-z|VYYJJLV4`3IO;Uq)Z-Ywo+w1V ztkd`c zyo>|H`d2DB;ygm}-yg?_2#+P;UL{z$Pa>3UjsKXEGj3CI$DiUNt5p4hF`S3U{_$HF z-M3&kVwY4MF8NjnW-s~5Q;*_W>`N5){8~q%;BkK~ zmR8XA!&=85Rzd~zquBL+%MY7FyPn5b{b;B~{cEjS6d!#z=9;FoHoFnTC|D2u=3HZ= z){}mimEw&clEsZ~$6uti9RQ;< zrx{_r&7R*7EFExDb$KF4)*I9(=cUm8j3SMaQ{@lQhd6*Th5czLI<9s)e_FHF~TQ z*XqEym*R%udVaeaGo5O)7T2U&k8mBDe!aiGR;$;0{w1l>CDjCB3m0c3w}a3(-tBH9 zYufDBdBPBE{61`H<5Ssbtsal+|3Q40^J3xq zn-KpevX{bKl>^Y{Qp(UeP#ZzTDg1KB68nT>b5nBE1b6Eg9PY%r^L--%7;ZE^5Ey8c%7wpz)%{ zmd04)6^++5eof=k8lTh1`k2QLG$!X2@(WsiS>x|D{#D~YHM%$moWD=wVU5Q$p4E6! zW1#Vp#;Y2?tMNsRztebI<2ZW5bt)R)OvLjxjfaUiCg+IoYiN8_+xr^7#Js^L`+>nA P_mukmL~K5P$|(N_0t)nd literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/vsprintf.c b/user/pdclib/functions/stdio/vsprintf.c new file mode 100644 index 0000000..6baa912 --- /dev/null +++ b/user/pdclib/functions/stdio/vsprintf.c @@ -0,0 +1,252 @@ +/* $Id$ */ + +/* vsprintf( char *, const char *, va_list ap ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include +#include + +#ifndef REGTEST + +int foo = SIZE_MAX; + +int vsprintf( char * str, const char * format, va_list arg ) +{ + return vsnprintf( str, SIZE_MAX, format, arg ); /* TODO: Replace with a non-checking call */ +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +#include +#include +#include + + +static int testprintf( char * s, size_t n, const char * format, ... ) +{ + int i; + va_list arg; + va_start( arg, format ); + i = vsprintf( s, format, arg ); + va_end( arg ); + return i; +} + +int main( void ) +{ + char buffer[100]; + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MIN ) == 4 ); + TESTCASE( strcmp( buffer, "-128" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MAX ) == 3 ); + TESTCASE( strcmp( buffer, "127" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhd", 0 ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MIN ) == 6 ); + TESTCASE( strcmp( buffer, "-32768" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MAX ) == 5 ); + TESTCASE( strcmp( buffer, "32767" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hd", 0 ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%d", 0 ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%ld", 0l ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MIN ) == 20 ); + TESTCASE( strcmp( buffer, "-9223372036854775808" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MAX ) == 19 ); + TESTCASE( strcmp( buffer, "9223372036854775807" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lld", 0ll ) ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhu", UCHAR_MAX ) == 3 ); + TESTCASE( strcmp( buffer, "255" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hhu", (unsigned char)-1 ) == 3 ); + TESTCASE( strcmp( buffer, "255" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hu", USHRT_MAX ) == 5 ); + TESTCASE( strcmp( buffer, "65535" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%hu", (unsigned short)-1 ) == 5 ); + TESTCASE( strcmp( buffer, "65535" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%u", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%u", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lu", ULONG_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%lu", -1ul ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%llu", ULLONG_MAX ) == 20 ); + TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%llu", -1ull ) == 20 ); + TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%X", UINT_MAX ) == 8 ); + TESTCASE( strcmp( buffer, "FFFFFFFF" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#X", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "0XFFFFFFFF" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%x", UINT_MAX ) == 8 ); + TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#x", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%o", UINT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "37777777777" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#o", -1u ) == 12 ); + TESTCASE( strcmp( buffer, "037777777777" ) == 0 ); + /* TODO: This test case is broken, doesn't test what it was intended to. */ + TESTCASE( testprintf( buffer, 100, "%.0#o", 0 ) == 5 ); + TESTCASE( strcmp( buffer, "%.0#o" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+d", 0 ) == 2 ); + TESTCASE( strcmp( buffer, "+0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+u", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+u", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% d", 0 ) == 2 ); + TESTCASE( strcmp( buffer, " 0" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% u", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "% u", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, " -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "02147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, "-02147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "002147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%030.20d", INT_MAX ) == 30 ); + TESTCASE( strcmp( buffer, " 00000000002147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%.6x", UINT_MAX ) == 8 ); + TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#6.3x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#3.6x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%.6d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%6.3d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%3.6d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#0.6x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#06.3x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#03.6x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#0.6d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#06.3d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#03.6d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+6.3d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%#+3.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+0.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+06.3d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%+03.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "- %d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "- 2147483647" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "- %d %% %d", INT_MAX, INT_MIN ) == 26 ); + TESTCASE( strcmp( buffer, "- 2147483647 % -2147483648" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%c", 'x' ) == 1 ); + TESTCASE( strcmp( buffer, "x" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%s", "abcdef" ) == 6 ); + TESTCASE( strcmp( buffer, "abcdef" ) == 0 ); + TESTCASE( testprintf( buffer, 100, "%p", (void *)0xdeadbeef ) == 10 ); + TESTCASE( strcmp( buffer, "0xdeadbeef" ) == 0 ); + { + int val1, val2; + TESTCASE( testprintf( buffer, 100, "123456%n789%n", &val1, &val2 ) == 9 ); + TESTCASE( strcmp( buffer, "123456789" ) == 0 ); + TESTCASE( val1 == 6 ); + TESTCASE( val2 == 9 ); + } + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/vsprintf.d b/user/pdclib/functions/stdio/vsprintf.d new file mode 100644 index 0000000..9ea3cca --- /dev/null +++ b/user/pdclib/functions/stdio/vsprintf.d @@ -0,0 +1,16 @@ +functions/stdio/vsprintf.d functions/stdio/vsprintf.t: \ + functions/stdio/vsprintf.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdint.h \ + includes/stdarg.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdint.h: + +includes/stdarg.h: diff --git a/user/pdclib/functions/stdio/vsprintf.o b/user/pdclib/functions/stdio/vsprintf.o new file mode 100644 index 0000000000000000000000000000000000000000..83af8dda32d87b408c88ae17ff60842e8fe85dce GIT binary patch literal 2728 zcma)8O^6&t6n@p+vop!ePBPgTBT*d5YO-j01Xm9UB)UI_#Slc;gCMRw{}X4rV|ULI zA!0;>SvFt-9s&wpym=86l7k09L_7)N4|v*3Ac7twM}_!()m1yao_tXCz5mzmbyd&2 zy?o|*rIc7w;>tu4`N_*H^BRuI{jy(HH*UZC$HC3zy&FrjmCfY}p!D6+talHzxm?=t zX7Bt1_WN%TL!GLrN2@bsw|b~rQ~T83DG_H@%H@+~w!AVPkjbd z=dj(>3XwU3j#n6jskmO@WoTUF26>0DIX^CAFL*Ctch%HZ2A^msX{A&6g_2XeO7M#4 z3>k`#1H2~r+HvetY5_ZE10dPbKY%YLX$%`HIoG9h8K`PBIM=;m5ceQm)KUpg@-w(y zth~D$MWXgFp(?o8MJ{1E(#NjU-_>dC`eox4tL`{#rGqF;8cEt7MB+ElaVHLgVWRog zaNO=BBJ0Wd7?!Tz;>lQhacS|)%EDSJ3cG`z-{&Y1k7oj}YZmly-J0r^?m7-CqPRX& zj-(z1dVwzy*|Z~LoP&%GYnl9?Snp%m^70!5Hb{C9OP3LIJ|Wxr(LRjAUR`f|i{mgE z^ukWNPQf;?9;^)qNt$!r;kI3NTifafapui5HvB(RY}hzVs~g3mAeE#a#c6#z4TH_& z=!~b&uGSap^Zva5lr;L$sMDZ&H~=P5(ikV5xN*MS8V;H!6BFo2IlZ`eynb}GIS$it zmf_g^SW8dOnT&fe41EVhT`W~R?+RYPeon{`hxS~xv~by(E{LDJIZA^jFpV?pTQ2Sl z{j_r-6~7&%f%we?hos$Uj(clCvl(~R#ivWA8H8ONr-?iqgdOWWj9Piq`EfH0MmT0U z_aF|!9#vU3UIo7ujYb_b?uSv@@iDVwNgA|X&xdtmB(i<|AAA^2JdgMuY2r67e~9eS z;;rA6x#<0K2t2U&VKJV5l=Zy>>RSMO4a?>LyUp`MK!5AkrZGo0=1J(7-xB>kumaH9 z^minuzYCtX$CC9s2}Qn-TM)j6j(uYX;Oj|^JBukfO0wMVvDzfX;yHEr1gVHETu z-NLdwW%}jk$LAw`iIwl;My`*2u-QIp;Pa&_FnkN0C0mP#7Po1Lms*GN05p5Bn2&Q} z&3wMAP#lKNlFesji+Q~#f8Dcs;?92|l=BrR+pe=HR|@%X*zK*hcAm%yxq{*3$Q7QP z3Ay^s=Vf+0Ay+uX3Aw@vPsqh&Dn{g!*6>7}6=@D@AKvH#TFN$U+wt2GO@8^-lQ8=U z&gSZ%G`mx1nKcw1olis5-y|S&E4;ji3_e0EiZqPhGX_r>zlTe~^gF#~*si{{lIRK3o6* literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdio/vsscanf.c b/user/pdclib/functions/stdio/vsscanf.c new file mode 100644 index 0000000..75f334d --- /dev/null +++ b/user/pdclib/functions/stdio/vsscanf.c @@ -0,0 +1,31 @@ +/* $Id$ */ + +/* vsscanf( const char *, const char *, va_list arg ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include + +#ifndef REGTEST + +int vsscanf( const char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, va_list arg ) +{ + /* TODO: Implement. */ + return 0; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdio/vsscanf.d b/user/pdclib/functions/stdio/vsscanf.d new file mode 100644 index 0000000..aea964d --- /dev/null +++ b/user/pdclib/functions/stdio/vsscanf.d @@ -0,0 +1,13 @@ +functions/stdio/vsscanf.d functions/stdio/vsscanf.t: \ + functions/stdio/vsscanf.c includes/stdio.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdarg.h + +includes/stdio.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdarg.h: diff --git a/user/pdclib/functions/stdio/vsscanf.o b/user/pdclib/functions/stdio/vsscanf.o new file mode 100644 index 0000000000000000000000000000000000000000..02151bc3ba4db18e7aa3c630cf467c706ec13e23 GIT binary patch literal 2536 zcma)8O^6&t6n@p+voq`LPO@2z#;8mnF%e9U;Ob!m>zd6PRzvWzh@vb#Jw3CnGu?5z zXGw7VK@p7vK@cM1!LuiY9QGuNmt6FqhKfv)DFOf%uJ}Bnyd6D=Qb9ZVs%ErP_K#KsNB7~L>drHG{xD6 zh0*dWhR08lKz)o^-N1B$G6;T}yr7n5rT9VZC&+%I_6{KU9FzC+I_6sN9A;n5yivh# z8XET!yxLb9>gNbSJtH*gm?e0D{K7Kk8MTF3wbY%Ze}uYTz(U6RL>dF_S4lxV8V_LG z)wTw{;}>wV{1|zQI?>+hpVqu!i?}Nosz1r%GR?E1Q=Z>DW&JQ_)YkLo)-G(E-HP+9pAN!pb`9b90PsF5)^s2JmRfny^H7gEPM(wjkxt+n zM0VDb2{yQ*`?XB|4~!2mOmV8@0SvQATIOW;hWs$k25mh}vLYR1Nw3ZQ+85&OXe^!W ze3W#^4pU%}7oACwj60Wl@i6U5v7L|0_I?QCccQIfS^%p)NIxHsA}1|{jS+mRTX;Ou?d}NvvoGQn5F0va(-=XxqWK0JITsPmHhP5L`zRRVv30z zL^E!Kl&IatTo8PSzTeFb8Di6(ZZ*!n@6FdFEUt{os0%E|6>eLuOfHua_M$S9uv_3% z^pfsmuoZQ?<77v|aWXWTH0$I1OyyykCDwbG$FAwpq?<(}oGZsY8b{fHswzLqOBm;) zQG(TnSzaa~nt8e?qxdy9tUpE~yQcqxN8!XHh_^)(-y-(_nI}q)L2r*L9alLyWc^M; z$Fr-?J#ZDnCF}Pnl+0&o6$~$?C2L!O!t%6zi@}Rv$=di-%vvQ80v}TDaSelY`CS(= zYz$br4&hxghOF&b$Zozp2#jaGI)=^n5_lT}R*v8{a&4BZErr7Jw5`MMA?xJWxOr~f z@0_~a7hCsDCkCv<$k!%g$kw_7+0Azo0`CIXF^6IET?5aU$1q6mA>W@Bt7qCct{b#| zeQfk`?NLqE?@QxnO&{39!0$>y`NMOPol-?y!v_}_m4l-)0(>{g^~ zyHI8E^@*Nl^!15!Ww%p|cW*Rh?);Q|X-x%izFzrM$SAYxy?G4|5v`6en%7I_{RcOP-S`thawFP@SU<^TWy literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdlib/_Exit.c b/user/pdclib/functions/stdlib/_Exit.c new file mode 100644 index 0000000..7871385 --- /dev/null +++ b/user/pdclib/functions/stdlib/_Exit.c @@ -0,0 +1,36 @@ +/* $Id$ */ + +/* _Exit( int ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include +#include <_PDCLIB_glue.h> + +#ifndef REGTEST + +void _Exit( int status ) +{ + /* TODO: Flush and close open streams. Remove tmpfile() files. Make this + called on process termination automatically. + */ + _PDCLIB_Exit( status ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + int UNEXPECTED_RETURN = 0; + _Exit( 0 ); + TESTCASE( UNEXPECTED_RETURN ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/_Exit.d b/user/pdclib/functions/stdlib/_Exit.d new file mode 100644 index 0000000..857f376 --- /dev/null +++ b/user/pdclib/functions/stdlib/_Exit.d @@ -0,0 +1,16 @@ +functions/stdlib/_Exit.d functions/stdlib/_Exit.t: \ + functions/stdlib/_Exit.c includes/stdlib.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdio.h \ + internals/_PDCLIB_glue.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdio.h: + +internals/_PDCLIB_glue.h: diff --git a/user/pdclib/functions/stdlib/_Exit.o b/user/pdclib/functions/stdlib/_Exit.o new file mode 100644 index 0000000000000000000000000000000000000000..efa5beff7acbcef6cce0c32b3f2c88422e31dc00 GIT binary patch literal 2396 zcma)7O^X~w7=EiivZJ#*`;n-TD2}kvh)Iv==pn|ayIGUPB}8ElBDm?9?VTMn(;cR} zWrY<9Dj4EHFM{MChzGrR5)58d@E`aK1P>ncY+&;|)m1Y!LBSWQp7*=zeY>jb{k4r( zlu}|zi7yjLNXbpQU*#FSZB$j>y*9UcZRCRU1QHhCi>~ z_UZ^j2Ces`2q>_-;A=!K?n#MuRdiI#18! zhVAagBa zORuj3^`?rrD09)u^A|UptIc-Qj-GMS(@V~;uAXk5*zA;PQC1$O+NGABeZoY@0t&_{ zJW!(cYqLS{F*i?{+K!7@qE4QJ zO*&<7EADhg$vYC!rPB1%oy?U7{WP)OgRJYCu9lrN9wtaO36Do{+M}w_ae@dH=J!K5P3+XoqzgDcC zY2&zQ(E5FeztOVxs3z<8wehp2pQ^u>6~}wOb(i1I@N@ge{gJ-MaO>D`>R5u!*1PVW6AjATW#$;krVQTZ|Q`5;mMhhufM!2v*HQ)Q-2Ds#|}@(M`!G} zV855pO*aGkHhvAOw`=Rtxz&yJl}g~b^WemLsZiQ15nE&~qW<>)^#hHM^f2|nM~V1O z`aOpIIphC=!E***HK^}8{N6C~WrIC~`cA@*=SJt>Gq_JgORpKfGe)oXi^(GE +#include + +#ifndef REGTEST + +void abort( void ) +{ +// raise( SIGABRT ); + exit( EXIT_FAILURE ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +#include + +static void aborthandler( int sig ) +{ + exit( 0 ); +} + +int main( void ) +{ + int UNEXPECTED_RETURN_FROM_ABORT = 0; + TESTCASE( signal( SIGABRT, &aborthandler ) != SIG_ERR ); + abort(); + TESTCASE( UNEXPECTED_RETURN_FROM_ABORT ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/abort.d b/user/pdclib/functions/stdlib/abort.d new file mode 100644 index 0000000..284a250 --- /dev/null +++ b/user/pdclib/functions/stdlib/abort.d @@ -0,0 +1,11 @@ +functions/stdlib/abort.d functions/stdlib/abort.t: \ + functions/stdlib/abort.c includes/stdlib.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdlib/abort.o b/user/pdclib/functions/stdlib/abort.o new file mode 100644 index 0000000000000000000000000000000000000000..ee395b4a169680e89b63b1fc4f44f651b495706f GIT binary patch literal 2388 zcma)8y^kA36o0e3jt#yux#J^22f|1fk%(lCghLS^KrSQ^K@mc_f(Eko?b#OgZt(6x zkOBx0UxES(DjEt38mLkPQ365~RQwG{6ckW{6n?+idG;J2!INfw?|bIG-PzgK9)I$T zF-DY(gtC-Gu7$OwZ{e^UkXvN?y`SIw_2Bo>=5^37e`5OK8?$B(b#88losG_#SvULl zi3FR{Zl7$2Es@Z%9g(PJMH;a@vJ!Sqv>$BWv%;815hL$l1a_^+d<8TgV>)LQf~9K; zqQ)dEC5##$KoPbY-x18dt2G?4(0Y{+G%y32#|csMMnbDO0z^?0iUZ&p=1a_`V++?s zg*60H zMikgn@GT;j3#3AmYC33T^6z6*7&bK(atDTMj+HqrwhO)(V-sDrrpk)RC`)&&FwL`3 zcaO#yhvQ`Kg7%nu<9wF(Xq`@gMPBr(BAxdx?F?D0&G*lwixf7kwR0Zgu-{Kfd3~&S*KiwRNIsMAfe#AxWN9lYOjhHK~l_+`_J@(r| z{;^K$)LX%7L*nA)S(yxg<-EqRa`SW=m+9qF;+>>SBpwt6*mO{ho=XOUdHSNnbg4Cy zY&ZAi=_E_ldzue@)1_*VC9@RCmf^`f$wpMw*{}tPhxu%lqUJcu%QQw$jumAxeBKY+ zog)#-`QLOGJo(D;Y?1mHes3bH71;pZ;CMob7n1Mftr(1_ALT<%cAtgC(S+KP=DQaX z{r}7FKKL-d(m603N@_a=h4Qq0h`|G*q_&e#_;p;tCO(Ibb+89o$J5|72CQsAc!G>0 zwOxSh=i7vUlr|qx^F0e*W57xZ;V2nLYMVh;o~Dl=@K`IUZ32bA?on^uHf*}?>)D44(_>M+iUFtet7&_{5?5eTwhWruC>N_4~~E zsp;GL`=#Py@7Mmt&+i}iN4kpP*KyjbV;wfFV-38%dtl`^tjk+MiTfiF{VhG!L|>r1 z4f>lfn2&wpntr~Ec=-M~(tL2+L%u$e->>_|y*DlM`zuh^s_Upw>}9q{5iU-(+WAH< zDHPszOA3W=&XPj==D!%GU$8GRP)#X7p_XJFqJ7i0akPcKhO!C!y` zF!DSal(a&`*0>tcesh4gQ^v!&)8XAjJRf@{!~THtf7sz^hvyyIGY-FJoP5zCFMqD{ lg2R^_@`r)zz2Wd}B3k;8lkI*nDY8EL^U5|jL_Eio{{okz_Lcwu literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdlib/abs.c b/user/pdclib/functions/stdlib/abs.c new file mode 100644 index 0000000..da6aa9f --- /dev/null +++ b/user/pdclib/functions/stdlib/abs.c @@ -0,0 +1,32 @@ +/* $Id$ */ + +/* abs( int ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +int abs( int j ) +{ + return ( j >= 0 ) ? j : -j; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> +#include + +int main( void ) +{ + TESTCASE( abs( 0 ) == 0 ); + TESTCASE( abs( INT_MAX ) == INT_MAX ); + TESTCASE( abs( INT_MIN + 1 ) == -( INT_MIN + 1 ) ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/abs.d b/user/pdclib/functions/stdlib/abs.d new file mode 100644 index 0000000..5420251 --- /dev/null +++ b/user/pdclib/functions/stdlib/abs.d @@ -0,0 +1,11 @@ +functions/stdlib/abs.d functions/stdlib/abs.t: functions/stdlib/abs.c \ + includes/stdlib.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdlib/abs.o b/user/pdclib/functions/stdlib/abs.o new file mode 100644 index 0000000000000000000000000000000000000000..0bfdf573d31dced272a1bb9d1f74086518e75468 GIT binary patch literal 2284 zcma)8&5ImG6tC)!Z0qcd*{p`uC{AEQ63O-m89l5der(nlBSC~cD2VBv?VTMn(;cR} zC4q=uL>EPj7sZ2m6ufv)h~Op0qlX+lcr<^2S3Shvuex5QHW2VZ)$e^*z1KBW^WOR^ zFKVrokXF8$NlJa^H63qZ`Jvr8WnljE33`%2wO$Qc+fO5 zG-dd0ed3nqAqokM!BbU0fei*95xKIbYILlj{YEDLImQJHZk6;XhV74$Imy1s*LgV_ z=GkVK4YKTDJDI9-yO>tpUFP0)G0A$gjz_?2n+1wQfJ|$H$%gG^^8VYpdNO8)=p$puZ{H7Q5%8!_F~)y zX{E13^FiMx@U0|G zr`bCyo@QgK8Rc7rE00HcCf?&>;F>PhX`W0nB%6gN(Qm_(>V+V|M!zSp7kuoIa{vvU&mWI}8PnqrC?1>BpZY z^9eEEt0Dl!cGBT#{t|;{TS)v?p}0?!z-4TLzN{t0;QqL;a~Ki>Ry_fMYYU0(WhmTy zzaW_L%*V?>^1T6GV!)~?1i5x7i*4la)PD`bBV;UzA3vVE?r+Yzyys-ycfm^xQ(S}4 zC1Xi!yv*Euzat-i3#?-vL-KtBo-t2ikp6)1bHkdMHjXbWir-aSD$B;BnZ)l~>nEn4 zn#)JTJA41}F28H=bNk2rk$%8%>-f{DV*xg)gS?zQu<9@5yH3Uu_eUbSTUz2rh4LZ5 z0~pN5K56@Qf%^Nl=!v^uOv>&~D7!0CmM%0|d~>2_8GUmiUD@pv z<9TvssR#N^ChNR*& literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdlib/atexit.c b/user/pdclib/functions/stdlib/atexit.c new file mode 100644 index 0000000..558190f --- /dev/null +++ b/user/pdclib/functions/stdlib/atexit.c @@ -0,0 +1,62 @@ +/* $Id$ */ + +/* atexit( void (*)( void ) ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +extern void (*_PDCLIB_regstack[])( void ); +extern size_t _PDCLIB_regptr; + +int atexit( void (*func)( void ) ) +{ + if ( _PDCLIB_regptr == 0 ) + { + return -1; + } + else + { + _PDCLIB_regstack[ --_PDCLIB_regptr ] = func; + return 0; + } +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> +#include + +static int flags[ 32 ]; + +static void counthandler( void ) +{ + static int count = 0; + flags[ count ] = count; + ++count; +} + +static void checkhandler( void ) +{ + for ( int i = 0; i < 31; ++i ) + { + assert( flags[ i ] == i ); + } +} + +int main( void ) +{ + TESTCASE( atexit( &checkhandler ) == 0 ); + for ( int i = 0; i < 31; ++i ) + { + TESTCASE( atexit( &counthandler ) == 0 ); + } + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/atexit.d b/user/pdclib/functions/stdlib/atexit.d new file mode 100644 index 0000000..1612235 --- /dev/null +++ b/user/pdclib/functions/stdlib/atexit.d @@ -0,0 +1,11 @@ +functions/stdlib/atexit.d functions/stdlib/atexit.t: \ + functions/stdlib/atexit.c includes/stdlib.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdlib/atexit.o b/user/pdclib/functions/stdlib/atexit.o new file mode 100644 index 0000000000000000000000000000000000000000..6c9a4f645d12b4777dce8e9b4e0c1ed87726b033 GIT binary patch literal 2788 zcma)8O^6&t6n@n`voqP*oy`7ZRiZcx30cwYQCvMFCeds(EQTP$f(GI`KfSX&{NmoizQWR!NOp(p z850@V4o}LtKph-Q&3nd{rWonr5d}j&J6Pq7ifmJAX^Q&MS>!J)42%cI9zs0%0mH*U zI`tW5bsf__%Af~R5HFK$MTz*C?6=VP`RvC8HS%@}*EHnk310Rq4Y}ilOzt&8J~so% z zRN*~B@g*(D8Gt7ZE&Np+hh6Wmg3D?@swb^(6j$P;(QefwsGz{G7ggJ_=IiZ#BaB6= zNx0EUf;vyb$`gkdk1icrfoHJBrlo7a`^X_#-A2Ep_P@E2|KzymAtCjgJV`P{I)cv= zS)V6;?0HJJX_@?w7+V-=a%$vu46{vI=42a0K5ji9t|Ws;G-A6OHOqSHM{%neg^e=z zaUj&!sy(T!bvt2&Y`X=FyK$u-hrP;rqt4F6Yu#Q_9xUN{cF#VXZAvd}#!0n)au}SR zI)US|p7dn+Q1m!*Y`MHxUI-R~`%NlpwGSEd)H=@1n^qZYjvQHB+*_VouJxm&p9Y&> z=xgbLyG(E?p-p^Em8ci;W0}mW*pO-V&Jf%ANHKqC(;Lr95TEWORh)}B>7}@4xn9@~ za4HfB8r7sKK`q9SX@s?YbER6V^}|KOc);`zi~q>1;Od%Vo`Cp)3v zmb&QqDug+3J21GOemu~8hwXU>D{W2=*?4zDM}PeS0sqVIUf3AV68&Dc0?^tHIXumO zV(@LUWc?06;nwjxgs-7v9qfUv<4N##4Osae!dWtgtnCJi^;JJqTLb`%@f2XXTY2$d;p!NF#8@)?=q?7gg(D+%?&-OqV1^r0;h+3ZV zb@;jcE(y@?1Dlt-swbs zGKsSWdDkc;W;YaCG)6?Jd={do)FI&e2a*D?-+cah^_j_*smD;#^7^A`0IKwS!6${zm + +#ifndef REGTEST + +int atoi( const char * s ) +{ + return (int) _PDCLIB_atomax( s ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + /* no tests for a simple wrapper */ + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/atoi.d b/user/pdclib/functions/stdlib/atoi.d new file mode 100644 index 0000000..c568c42 --- /dev/null +++ b/user/pdclib/functions/stdlib/atoi.d @@ -0,0 +1,11 @@ +functions/stdlib/atoi.d functions/stdlib/atoi.t: functions/stdlib/atoi.c \ + includes/stdlib.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdlib/atoi.o b/user/pdclib/functions/stdlib/atoi.o new file mode 100644 index 0000000000000000000000000000000000000000..b048abd4ca274c98807cfd9f7beeb59c96646f69 GIT binary patch literal 2416 zcma)8O=w(I6h8O8H_7NE)BIFhsp1H!R*<;duQHU zz4D?lMwE<%GL}Ss4ol0Tg)?$Oj?3n)-{1N3a%9f%uI*`3sS3{uZ2~S(6M!qC^pYeh4rP{x!Pk>Yx8uzFk$9JDisNoIq*aK}ffPiQZdOPbRYs7)YUL|}nK&q6+CsHM2r6$_ zn0$Z`O=3pCzK{7IZY)<(|-iMlEXqK_yD_%J^?qmgh^JZlNhrxck0uaZC}w% zvop%tMR$ln;TSsui24YM*QErk3i%e$Q{-EOdBj&1KIL&V)GEXS_d8)Th^osNXw6>M&6w+q@u$o;!HP1hUif9dLGW2LbeFUC*HcmamV zrInSX#+l95C@V&#$Jxb^m7aOrMTpFxP@K?1BWAxk6-77E(BrJ$5gYPCy}JBvFkO*2 zf3066EnqP$aaXxv+KY>HuaI~+=sFfxC6v@Wn$uP+}RF&DV1&P~(em_OkaW*K@7+pD=7fJiNAGR|@BCYHH;KOj@ z`NCbb#5?XEkjUvz0q=1<;bWXW9>DuB7*9XSye*X7lOdPE`=t4vfRg_I<@XePm`{oM zaCPpI+LobFp2jaQZj*7Ow)2qvIu5Xj1L#->d!Ti^1YTpn$~uHKGLF=C6|$f20tD8@ zd_>Ln3V4kHD<4A8hl{e>`W{dH_b{;cO6u2z!e95Yw{8tKUH5J98p9mFKxmM0q_)=~ z`}sB?@ZPWvzL=WteejIocOl(@@LkE;nKlkSiN4>rc!d_MM>(nAXUwk^IlSm_-J!kf$n&z3uQ}vj1g>N6 gByf*1*4cOX77+!WbF$qhCPmgq|C2-%&htR|AM!Htp8x;= literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdlib/atol.c b/user/pdclib/functions/stdlib/atol.c new file mode 100644 index 0000000..00ce447 --- /dev/null +++ b/user/pdclib/functions/stdlib/atol.c @@ -0,0 +1,29 @@ +/* $Id$ */ + +/* atol( const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +long int atol( const char * s ) +{ + return (long int) _PDCLIB_atomax( s ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + /* no tests for a simple wrapper */ + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/atol.d b/user/pdclib/functions/stdlib/atol.d new file mode 100644 index 0000000..3797f39 --- /dev/null +++ b/user/pdclib/functions/stdlib/atol.d @@ -0,0 +1,11 @@ +functions/stdlib/atol.d functions/stdlib/atol.t: functions/stdlib/atol.c \ + includes/stdlib.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdlib/atol.o b/user/pdclib/functions/stdlib/atol.o new file mode 100644 index 0000000000000000000000000000000000000000..046dcfb7767df3fed13179387522b2495bb47a48 GIT binary patch literal 2416 zcma)8PiP!f82{ePY_ht^Hh-$ERB?q=E81DX=pn^glg2irlv2pSi|OoUvRS%2TXtq8 zLi~paEnXB91QAlui{L@JaZox>s*E6o)ymfdGqGR7w1sMi5LDi@ zF!>N6n#7EN$#pWLHs(%!8nf*yx@opY zS-a>Cvb>oWTfHu_C&i!_x64*nY+2#7>3kIg2xBr%ffNyuj{tm?$U*}dp{FGsvoiVH z7}qhFnX){L;TmRTPTD8(qb%=svUID#jyblylME%_84QcYA#-zQ&`+DR_PW4)kT*wp zI&9w9YO|c)AnP>jbSTPhZJq3bb`f&-HmB)&WBo5&-e{~e7URYES#K4F$%U1b zrN*g^)+j4RrN`;Tk(Hi%(nW~OpirF910!ayIu%7X(a@u;-Vqz}QoXwTUNBveIDfrg zBrRYuEOAG_x*xVZL?W&0|KOu=;`ze6 zYKiZ-e?TIqKLNbY@q|xs`gi~zz+gQ6D4%q)yE5b=WS=zOQ&7_XzxLn zDtL_nD<477n}xF4`W{dH4=}LzO6u2z!e95Iw{8tKUH2XE8p9mFLTHe2q_#I8`}wXw z;CsV5cw=h555O~q&xLdc!uKU>XWBS;CHj8f;TBr39_6HdpF2M_{Z`&qD%ur+Csvn}`C>IN9zKlOpS*|8XJ;=Xs#~4$^ZZW literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdlib/atoll.c b/user/pdclib/functions/stdlib/atoll.c new file mode 100644 index 0000000..fcd44ad --- /dev/null +++ b/user/pdclib/functions/stdlib/atoll.c @@ -0,0 +1,29 @@ +/* $Id$ */ + +/* atoll( const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +long long int atoll( const char * s ) +{ + return (long long int) _PDCLIB_atomax( s ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + /* no tests for a simple wrapper */ + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/atoll.d b/user/pdclib/functions/stdlib/atoll.d new file mode 100644 index 0000000..b4c3e3c --- /dev/null +++ b/user/pdclib/functions/stdlib/atoll.d @@ -0,0 +1,11 @@ +functions/stdlib/atoll.d functions/stdlib/atoll.t: \ + functions/stdlib/atoll.c includes/stdlib.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdlib/atoll.o b/user/pdclib/functions/stdlib/atoll.o new file mode 100644 index 0000000000000000000000000000000000000000..f3bd122e656bbfa65e13d2ce3552cc544cdac687 GIT binary patch literal 2424 zcma)7&1+m$6hHU9H_7NE(|lB|)Q=HTt!Uo}jV_{AP5Kp6N)ZCOF}|6+Ooq<93G?1a z3l%FxFbJZHu0&`-Py|=Ha3vIR;eX)9jVQQq<60&De)rvzxpAWh?){ywd+t5we!YF> z!dYXCC>aT5EQ$OWmX<{e$K^gbEbF_!-uV5<`)8`V(ZX+k?d|RT@ST`hbF4mJ3+qSg zvu4iBOo#*vQmdV+g;kNzv2~FsHZM$t^`+Xgwa2Db=jr_7gqatqR3xlYy*eMY>Bzg>(TmwYr26{7XPErZd@HfF%a#+X&A7Pcz$KWQH(8*cqq>0{`KkL)zZCz1K zvo*@vMR$My)LArwBG4o(z+$Lsc0KOOUud==W1(9cP0gjZu{od6Bd)`@^<|2&8%aAAA^2 zJYu-7mUz$oBN93NQQ%#UC)~mTxw0(hgn~Wp1or3J=@i`W83p(b(8fYG`fY&i#Wevj1WE`pOB4j__c?isl z@rWAlb?`a{tlWg4j~8XN^*x^YJ23DXE2&=>3V+^9-n=!~bl!Ks>lnuP2||O6BelH+ z*^l=s1l}9w!B1ih+tbFzXOXCW-{KuwfUKl`pF%-i>F4sjQgPq* z4K%*rFYxp0$MuoEM)UL7_VSp6P4k!quV)Xe%s}{_j3b?k=r3sp|HKTG_dHefYu4qcP%8d#*!5PcohNckq2QnOC={NY zF@<*LeVG}LDHK+5OrfyCV+v6j-3z`cbJ#&Y0_(Q_5tbjp#--CM7gm=yAoY_gF!SsM zaAYP1=}i%_OwLTS?+=ilxWPs}=|7J)x#sXX5oLYO$#$LS6qzIa`Ar)n!@ErRAK+p2y#N3J literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdlib/bsearch.c b/user/pdclib/functions/stdlib/bsearch.c new file mode 100644 index 0000000..e8e4f31 --- /dev/null +++ b/user/pdclib/functions/stdlib/bsearch.c @@ -0,0 +1,61 @@ +/* $Id$ */ + +/* bsearch( const void *, const void *, size_t, size_t, int(*)( const void *, const void * ) ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +void * bsearch( const void * key, const void * base, size_t nmemb, size_t size, int (*compar)( const void *, const void * ) ) +{ + const void * pivot; + int rc; + int corr; + while ( nmemb ) + { + /* algorithm needs -1 correction if remaining elements are an even number. */ + corr = ( nmemb % 2 ) - 1; + nmemb /= 2; + pivot = (const char *)base + (nmemb * size); + rc = compar( key, pivot ); + if ( rc > 0 ) + { + base = (const char *)pivot + size; + nmemb += corr; + } + else if ( rc == 0 ) + { + return (void *)pivot; + } + } + return NULL; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +static int compare( const void * left, const void * right ) +{ + return *( (unsigned char *)left ) - *( (unsigned char *)right ); +} + +int main( void ) +{ + TESTCASE( bsearch( "e", abcde, 4, 1, compare ) == NULL ); + TESTCASE( bsearch( "e", abcde, 5, 1, compare ) == &abcde[4] ); + TESTCASE( bsearch( "a", abcde + 1, 4, 1, compare ) == NULL ); + TESTCASE( bsearch( "0", abcde, 1, 1, compare ) == NULL ); + TESTCASE( bsearch( "a", abcde, 1, 1, compare ) == &abcde[0] ); + TESTCASE( bsearch( "a", abcde, 0, 1, compare ) == NULL ); + TESTCASE( bsearch( "e", abcde, 3, 2, compare ) == &abcde[4] ); + TESTCASE( bsearch( "b", abcde, 3, 2, compare ) == NULL ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/bsearch.d b/user/pdclib/functions/stdlib/bsearch.d new file mode 100644 index 0000000..e830160 --- /dev/null +++ b/user/pdclib/functions/stdlib/bsearch.d @@ -0,0 +1,11 @@ +functions/stdlib/bsearch.d functions/stdlib/bsearch.t: \ + functions/stdlib/bsearch.c includes/stdlib.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdlib/bsearch.o b/user/pdclib/functions/stdlib/bsearch.o new file mode 100644 index 0000000000000000000000000000000000000000..01977ab43879fb232f1993408425f776ead24b78 GIT binary patch literal 2860 zcma)8O^6&t6n@p+v(w4^>}+-uV-jTo8xtkzQL=i77)>^v5EG&Zi$;-ketLJt%=9eX zJ<*6!!bWi%6{DcROFSre5d}SndlEs&ErKAP3_>7~Jw(VsP>JuWu9~TM(FaxE`+rrh z-*nHb{?UU%2+}0TrjbN+K9gEzBS9IZ!rJk)xKY1 z9RI?fvi*GDUmf_X{R7j^z<2x3^uXVE^HSfxzI^&Ry)rfMrv`JYZ#!1s&ky_?!Y^IR z!P3ic5ZDs+E_{Qc7rz%1Vq0-CXBRgYC&W5Y8Y8l%DVN)uvt1%vu|**h$GI+14uB&0yZD5K z^#T=;yO<%Uslq+9aC&mYx4erBygde)X(2$C54Rf4+@ zU}b)gkPQJ&_H}@py@$bB&ztqzvtYRgWKW*pJtMC3E()Tko~AAedF(`Rifttv@*HK) zNY7MqveQyJ$-8yV&0aI4eD-}Q?UZpP_ZLXxXVQU<@9UC%J8lR!mVc&TBKGB*7dM?>KL8pQq3~ zMd;_gqPzb!tB@ftKGjL8JSK4xrP$P561!xX`R|~5hoSHCoBIgliN`!z{hYKdg7bDAKk^SvK?i zg;zW4kT1(i=X;uY9m6bb;)~;MnzXIO3eCfIkp1q|PKFH+&#de4*Fx9jBMj@FHe#5i z2Inh-QKV~~V%f}>=Y04r;2wEi`W|?DBIaIRptGFs@0680Y*-&E)P83;!L;;9H|_Va z^3$eIQOF?pfxhOYdB~r!pV>bh_9ffQdu%c8F~K(Yp-Iq5 zMRHc+V>r$W`Oqh*&3rCD1bm=1nP=BJps9E0_nW5e)_+LIZ=M9QSrM}CLYl>v6Ftgk z%ZW5)vr~x2WFOa5Vv2_67TD9+tEvX`02tsMevUgb0# +#include + +#ifndef REGTEST + +void * calloc( size_t nmemb, size_t size ) +{ + /* assign memory for nmemb elements of given size */ + void * rc = malloc( nmemb * size ); + if ( rc != NULL ) + { + /* zero-initialize the memory */ + memset( rc, 0, nmemb * size ); + } + return rc; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + char * s; + TESTCASE( ( s = calloc( 3, 2 ) ) != NULL ); + TESTCASE( s[0] == '\0' ); + TESTCASE( s[5] == '\0' ); + free( s ); + TESTCASE( ( s = calloc( 6, 1 ) ) != NULL ); + TESTCASE( s[0] == '\0' ); + TESTCASE( s[5] == '\0' ); + free( s ); + TESTCASE( ( s = calloc( 1, 6 ) ) != NULL ); + TESTCASE( s[0] == '\0' ); + TESTCASE( s[5] == '\0' ); + free( s ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/calloc.d b/user/pdclib/functions/stdlib/calloc.d new file mode 100644 index 0000000..4a78803 --- /dev/null +++ b/user/pdclib/functions/stdlib/calloc.d @@ -0,0 +1,13 @@ +functions/stdlib/calloc.d functions/stdlib/calloc.t: \ + functions/stdlib/calloc.c includes/stdlib.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/string.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/string.h: diff --git a/user/pdclib/functions/stdlib/calloc.o b/user/pdclib/functions/stdlib/calloc.o new file mode 100644 index 0000000000000000000000000000000000000000..91d87cfc595bc5e6f9cb77b4cb1b8eaa94514d3a GIT binary patch literal 2684 zcmai0OK4nG82;~LGFK;=G)b*WeM~XMi1vYk zrA13D8d}7%5GWR`hD}ynTt!o__d|cEr0rte|L6vwwAUx&uvTg zkkKzr2R9d|RrtlFZQ};^hi{R~nQ-=(r%GOVZ+XI*basu1xYJT99WHr+h^N`Ih`&d? z@?7b;((;r@A#|P}&BaGYm!}x{!iWRINMYdR-Yrs`6)(txC+L#~SzY2f5a<`d}&J|NC3z8?S--H$nM{g2?zW8|wV z;{yYuzHN}1z>s!L+h?M+Y_L@=CY`8Lm$;j3RMgZ@()LCYH7h*DfzW8xdQxq5J5iNv z+y%Q) z=sl{GEJWn!!opl-X0_f=vVIs?!p+eu`+af58r$$mYlb#S|^@LI2yY*3YF!xkiLbUU30eF&3o7KLcmfi$Z%PS|1V zJtVS9yCeHBJkSooyF?M+S@tzDmuoNdcjYc>J_~_;y$6Hw^y9_duVwWFfIp34lgalu zl=Q!o-;?lRenZUHHv-Vuj#xa+e_`;cF=YG>Lt)o(3BnENSOUb5ri2*CuA$&ka zld&CxZ0B3ys}nlrBbt0~f;TZ>xiv7CSju=&t(F`Ug~EE-$7@{tVKkL z13HM{3Y2@G8OLBg_K9oS`Hn-uXUmYuXJmu6-j~03jGpM-RxxFJ1 + +#ifndef REGTEST + +div_t div( int numer, int denom ) +{ + div_t rc; + rc.quot = numer / denom; + rc.rem = numer % denom; + /* TODO: pre-C99 compilers might require modulus corrections */ + return rc; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +#ifndef _PDCLIB_CONFIG_H +#include <_PDCLIB_config.h> +#endif + +int main( void ) +{ + div_t result; + result = div( 5, 2 ); + TESTCASE( result.quot == 2 && result.rem == 1 ); + result = div( -5, 2 ); + TESTCASE( result.quot == -2 && result.rem == -1 ); + result = div( 5, -2 ); + TESTCASE( result.quot == -2 && result.rem == 1 ); + TESTCASE( sizeof( result.quot ) == _PDCLIB_INT_BYTES ); + TESTCASE( sizeof( result.rem ) == _PDCLIB_INT_BYTES ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/div.d b/user/pdclib/functions/stdlib/div.d new file mode 100644 index 0000000..2b6140b --- /dev/null +++ b/user/pdclib/functions/stdlib/div.d @@ -0,0 +1,11 @@ +functions/stdlib/div.d functions/stdlib/div.t: functions/stdlib/div.c \ + includes/stdlib.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdlib/div.o b/user/pdclib/functions/stdlib/div.o new file mode 100644 index 0000000000000000000000000000000000000000..d07b9892815e6006f5539f0c017583c23794ad6a GIT binary patch literal 2608 zcma)8&5ImG6o1v-GuxZlne1jYenfGCiHTr(L`Mh_V$8aRjWOt9LA)&U(Yrf1)16HB z1cL@KB4mh&5rc>a^9LC9;6+a+1k{75AczO`Ac6-kf}m(1{(jX}I~76jLDlblSJkW6 zHS@yakw=wMVo8ZF6G`MsP*|E8cFR_om*w%#Fa0`u_VMuS;>`H+rN8d@^b83s4EsJ>b%CA)_`zjAs)Vzpa6~9Jd zX@2h}kpN;i5lcIyQrTbeLy@v!Ya&xyH)2G>NIf)D#O#_`n&&bHu*`I6!^cD3P0fwG z6y-+@PaiN)?*VlI4r+zSUV~l>Oz15g1^C}#@(z>r?v!8{55#+{kOC01?vY=(J^s$Diln_k4N(iTJ2TYyD4G1K=rRg&e zR8=p0E||W_k-|;Gj;PIy@Xj3*IYmag^iY4-s+jeqk8lyo`$s(Ss~-!FP) zEJrOTPx63BH}D~m=ka8Odo5_ImdXEw@eT$HK)MY>rxw$fkZm<+|MyuM#h$xyk`APw zCTn#)jgqXlmc-pUFKR>Rtha{JSWgFWgKWPC%+jne%Hm<;ShvI4*rOxwN-o)YI?U@E z37D-gB%?t*oMfg!XP<0=szXPY>kIW})Qs*osi@UHWXv9Q;PFwKiyT^5*jL}Z+#V(Q zsEFIs9BJu+yGWNQrtroC$(6sP_%5jv*H8;aYg`Wv^P2C_6dGTe$Qr9~QW7 zxjcS0m#EvyTN1T1^g=gokJeUN?e;J}A<;1I8%-}+OcMojLXNi7qSpjHm`yHO<5)AwRELp#OP)u7T@BoBQ zfV|@p2KUE(@m;VnVC5GGFOo52ZHFPd`2=qw*UyYdG5NQvo4=yyDr}@H{binSBK7$wVi~*%{PlA{1$kQ84R2674VF?7lZUA z^8HY-dZvxzO@r3&A})G|_9!Oncft5s)7Q2kjDmio4>2rH`5XAT_2d3XA7HrWs5|GF zgUz0U{B=vga0xm~b}b@~xIs-`E|fO{He)a!>%=wPd`&1S&{?witZdQM2lCrBt0!Ln zZ-TPB6Uy$2lx-D?EWYmONk(6Hq$|6XVmv!%LcYFvSFTM2aK1kIMCA*sIw2nw;x|Cz zTd{?OGe0W)P2yXk@X@iq6pF=YB5O;$g@_~bC!M&Rh=g|;`+WwVGPq)J)!@KjZtyvS urwxt`zGm>e!FP#RkG(|Hy@z}M$k;zMc-+|aIWSpdKQQiQVzv0;rTh + +#ifndef REGTEST + +/* TODO - "except that a function is called after any previously registered + functions that had already been called at the time it was registered. +*/ + +/* TODO: 32 is guaranteed. This should be dynamic but ATM gives problems + with my malloc. +*/ +#define NUMBER_OF_SLOTS 40 + +void (*_PDCLIB_regstack[ NUMBER_OF_SLOTS ])( void ); +size_t _PDCLIB_regptr = NUMBER_OF_SLOTS; + +void exit( int status ) +{ + while ( _PDCLIB_regptr < NUMBER_OF_SLOTS ) + { + _PDCLIB_regstack[ _PDCLIB_regptr++ ](); + } + _Exit( status ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + /* Unwinding of regstack tested in atexit(). */ + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/exit.d b/user/pdclib/functions/stdlib/exit.d new file mode 100644 index 0000000..f246c6f --- /dev/null +++ b/user/pdclib/functions/stdlib/exit.d @@ -0,0 +1,11 @@ +functions/stdlib/exit.d functions/stdlib/exit.t: functions/stdlib/exit.c \ + includes/stdlib.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdlib/exit.o b/user/pdclib/functions/stdlib/exit.o new file mode 100644 index 0000000000000000000000000000000000000000..077f2272b32b865b5da752e17d6e92e1a0e43bfd GIT binary patch literal 2884 zcmai0PiP!f82{ePZg$h%Y?~%c8(MK&QWDY57McoHZ8d2v!BUD)!Gp%#&1AE5GaGhh zODk$ArC{tuJt+PG|J0iZ6+GxoQ4d~wP%lC$78N~cPlCnu_j~i+?u!>cc<=Z9fAf9s z&6~M!?8IYADY2x)mw_a*Bb!=gHO$C%8JE-Rw=Vs@PRs)PZyczks$?jKHHD+Hi--?wJ=8grrokIRw;-S z()=RD*}mtIB7Nl+hKGTb)#sSiH<*r71|3X6yiB$kCE{nYKSSf^vmX)E&>JcIp&|bO z!OQ-rA-7D(qk7V8 zM{y-imRil41QnDUcA{!4)_lFyT?%87@LV$q>O3fmr;g5_SeRRcU$DXkrjg+F`dQsl ze^NE}=b!xGW6#5KSXm!2Pm&A;I)cv=S+6Hu9EFsQXqo)480#2ZTD}HjSMG$3IH}gp z$afo+Ye@$RkzE-2Dbgluooy?HxcOYTn521aPNPHKq#H}C9W}~&>PB(15rs=-o`Swm zU#WJaveI4+D`Z$4{Ov z&zEO|+2DZucjqc*htg%~tz*fU3Uq!sK0kk`Jaf9%jgoGfYTs;EO9$^UsYSM+OL&KS zO4RfDVkYwvc5PhuF`d}WM@#v+%ic&3$N47i5jlJ(mUCG%OL-x3VUpY(G z?=Tc@9S@<7AE09$?18Q03Gg-stlWlhk&Gd0I|xTc%$1{4RNvt;vG z*`lk@$e%r{CvNY1{(%>H!{x!gI5f`M#Q?W8+?n1MqV{`o>RtMC!)UZjr + +#ifndef REGTEST + +#ifndef _PDCLIB_INT_H +#define _PDCLIB_INT_H _PDCLIB_INT_H +#include <_PDCLIB_int.h> +#endif + +/* TODO: Primitive placeholder. Much room for improvement. */ + +/* structure holding first and last element of free node list */ +extern struct _PDCLIB_headnode_t _PDCLIB_memlist; + +void free( void * ptr ) +{ + ptr = (void *)( (char *)ptr - sizeof( struct _PDCLIB_memnode_t ) ); + ( (struct _PDCLIB_memnode_t *)ptr )->next = NULL; + if ( _PDCLIB_memlist.last != NULL ) + { + _PDCLIB_memlist.last->next = ptr; + } + else + { + _PDCLIB_memlist.first = ptr; + } + _PDCLIB_memlist.last = ptr; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + /* tests covered in malloc test driver */ + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/free.d b/user/pdclib/functions/stdlib/free.d new file mode 100644 index 0000000..a925818 --- /dev/null +++ b/user/pdclib/functions/stdlib/free.d @@ -0,0 +1,11 @@ +functions/stdlib/free.d functions/stdlib/free.t: functions/stdlib/free.c \ + includes/stdlib.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdlib/free.o b/user/pdclib/functions/stdlib/free.o new file mode 100644 index 0000000000000000000000000000000000000000..d32e449b9947099a8c93812c0485f5bd57dc1f74 GIT binary patch literal 2836 zcma)8ONbm*6uqxLJ(cuK=QBwrnuskXWn?)XX&Lt{%Fo z;|E1#5-?=r2iz!##zl6z$ikh1iXb8`)Scib*{C3b8&QboRK43>aibUNo%?&|)xGc4 z=Y=CD9x}#=iV;^vmdI8=kIZB+EmN{V<}O@Y=?1~YBf)0}J^J6~c>bewB2zBT1s6_v zzc7A@Q6dvge~iJbGutbZWw)}Wvd*kGYfB=|HYu0)m)$_bwQ5Dg+azvfZ~6Z6u}Kks z(zum!8K!SwmL~F;e{AyJ)gohSK)|#hGzZ4>Sv$r_f3U>#Rlc}EPURqdHPc1PGs6WA zj6X1rdkavw1H|IyCyeF;3@zG_`*IM+^V@MMuIK*=j~n>k5KM`s0vvF-CYYt=_`hW^ zwnFg6UMB=&cLF@N)%o!>M*m?9fwRNB11xQzf7*OWxLrzGvlwy1YFr6 z0gYK0#Lcwbi<4TCwmR*Ggf(;|>c{m?BC^nrqOi#`G=J*w?1^KC<`E2+^2YjEd)+Cs z@AzAF}PC_OsD^Dhus?GIDmKZrp3p-|5AR)od8VNqaGlT2*fP&}c5z`$Mj!sNS;kYD>Lt zRAaQ$1}43vHb|m=ZMoHCqmrdwKdlZ~ZlI)b11;{R)5hKXyWKV0;jHk{jdK3clXKPC z>P$Ej?y+mpo8?fkm1L{10n(|1Uyjbs?yXMGH3o4y$S3cf8D!SoJ1v>WT6FL_#E5w= z827xF(0-m(6?Xc;N^t1BGvP~^Jkw3N3> zjYdB@DStc_WizhF8N5Z!S*QzWdAFjfvLfwdq^O?t! zzTMh<04U2j3`gbL1rPK8EAKAkkY9y-Z>j;**r9^XFds2qDyr^>qgaQBm+JTMu@3e? z>v#mZ&VeeM@p$rOrJ}Kua1{Bjf{%5PkEnc4K-W1?Wd(eEnW|{43y12Ay@x#ZUPWVV zIEw53T3EM?n6CRGbe%(v&%sxvVnt)m!!Gju0X{xAtYZR~^1Te5bGR>*pTW0TNnlgu z^@c^wb3m{SJ{8S-7mmVoxq}N8L}UD%sm|~;@{0Y_X;%;{*5RQUTE}|Cn8$rthfB{M zRCyGEPpMeZwTLKjC|59fEu5R+S%ZswL=d#H$%I) z0&T52pXG{QoQ}9Y)f#8zBXI?rTo6}yaz^52J72U}@krdPi$$9q9*K+2=!$%&tj7-W zEUB<>`pwP02>R94&j-R}G)Uw#K-^_bz)Ft?>KKW5l!VE1nqwSGATF? literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdlib/labs.c b/user/pdclib/functions/stdlib/labs.c new file mode 100644 index 0000000..e2119de --- /dev/null +++ b/user/pdclib/functions/stdlib/labs.c @@ -0,0 +1,32 @@ +/* $Id$ */ + +/* labs( long int ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +long int labs( long int j ) +{ + return ( j >= 0 ) ? j : -j; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> +#include + +int main( void ) +{ + TESTCASE( labs( 0 ) == 0 ); + TESTCASE( labs( LONG_MAX ) == LONG_MAX ); + TESTCASE( labs( LONG_MIN + 1 ) == -( LONG_MIN + 1 ) ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/labs.d b/user/pdclib/functions/stdlib/labs.d new file mode 100644 index 0000000..3439048 --- /dev/null +++ b/user/pdclib/functions/stdlib/labs.d @@ -0,0 +1,11 @@ +functions/stdlib/labs.d functions/stdlib/labs.t: functions/stdlib/labs.c \ + includes/stdlib.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdlib/labs.o b/user/pdclib/functions/stdlib/labs.o new file mode 100644 index 0000000000000000000000000000000000000000..dd95a200a3c61fc892aace41d0b2962d098b6159 GIT binary patch literal 2304 zcma)7&5ImG6o1tp+0oe(-|$wXNT7{QczC&gqrfv7NVmHw)&e=3+f;9&9d{ z17`m|k>Ie@>*wlWO(b+|QzS~vv-4qdseYz@WPWv#&d2<)1X z`5tK2FrBapkp~?HQ9Q^?38VN+Xu?|j1HtUuuApI|_7Ne7FIbp+j1bLXM!?(%5Sec= zn}*q&K7JQkDuXXDt&ov~uI8U+1G8-#nq@Yod9NId^P*jp>%&1;WSDk~q*rw^wsnLJ zbM{scAPgC-A&@enzz&125m{LvQ?#t2N32Yq6<)$%X3Fw7hU<`(Ica0aPxE5X&$IOw zTjbc@W;&5#b37?qyUgv)@hEH4IvfCtanYU@*`$4Wy~lE@2UV+s^Uc}|9|w(ClH%&9OuN8xQsJg@Wp<^MWIZiYNxDS=HtSCNZ>Qbv zBzsSiNj7wvLB28e<>4UD)O$GY`KHU$Zk~=ZB%6h&lQi#BRprO>lJv%-QHGL}d|YM; zT5_@|)7~XNY-55%DCK|CL3r|T;n%X%!R+@Xa{5C+J%m)f?DPuicLWNaN_QRnryqY8 z=2K$6*Hi$i?VQKc{51xTxRUxUL2;idfv2#EZ6IrjF}OeO>mr86fR*DAR>?S0+bfX$ zd^-qcJoE8V(0p%#*BG!;K+yYvvf2h7PyKf=u=h&p$B*Z)d(&H&_nof$K6s5`j-Md3 z$T(8lRmgt6Kar3B0_&K^(0rePXUr)K(jO3hsaQMH#_^Ry_4@`_%VFzLP3pJp{M7Vw zbp@$-Z|^_u@%t5ie*d^X(sc~Kj=#J*7GTpl$m`hyE4PvF1{p`(ABpI1sl|^9aW+1Y^L_V(u zWk2EY5E0*??d;DuJnQg9hZh{a?(hwV?>Ou` + +#ifndef REGTEST + +ldiv_t ldiv( long int numer, long int denom ) +{ + ldiv_t rc; + rc.quot = numer / denom; + rc.rem = numer % denom; + /* TODO: pre-C99 compilers might require modulus corrections */ + return rc; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +#ifndef _PDCLIB_CONFIG_H +#include <_PDCLIB_config.h> +#endif + +int main( void ) +{ + ldiv_t result; + result = ldiv( 5, 2 ); + TESTCASE( result.quot == 2 && result.rem == 1 ); + result = ldiv( -5, 2 ); + TESTCASE( result.quot == -2 && result.rem == -1 ); + result = ldiv( 5, -2 ); + TESTCASE( result.quot == -2 && result.rem == 1 ); + TESTCASE( sizeof( result.quot ) == _PDCLIB_LONG_BYTES ); + TESTCASE( sizeof( result.rem ) == _PDCLIB_LONG_BYTES ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/ldiv.d b/user/pdclib/functions/stdlib/ldiv.d new file mode 100644 index 0000000..b738cff --- /dev/null +++ b/user/pdclib/functions/stdlib/ldiv.d @@ -0,0 +1,11 @@ +functions/stdlib/ldiv.d functions/stdlib/ldiv.t: functions/stdlib/ldiv.c \ + includes/stdlib.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdlib/ldiv.o b/user/pdclib/functions/stdlib/ldiv.o new file mode 100644 index 0000000000000000000000000000000000000000..a45142cec9967fb8d63990c24104811ccb3fa16f GIT binary patch literal 2628 zcma)8O^6&t6n@n|Grc=Ilif^=N+M2hB@x{o!4cvbqGnyg${LfyfC#e8PtVTiO!wM9 z!KhJ)2pQIc5r6RF&s{-56b~MfgGTV6UUE?MAc_Ysf}m(1zOTA!rW6DpRDJKS-m7}` zs%M^EUB6EVL7D{FG?j?HaB@pS!U5V%RcelZeD0U|?FYQ=)w%J7^M79d`|0`d>K~@` z<#_e-HmjPK$6|cK8DISTfb* zM3u-XlU;$ZRy{aN_mss|!2b&De*F0Ir!CE(v8wVq@PUMn91;_n_ z4F%7A5+Dj$4xdW!t^-)^%MyzB1Ds+X;1zktRQ!-9`@36s_QWGRi?V<-NN;JT&4MV) zjOUygn6%{0#vKwnu);dGMf4093g99Bs+4(_m(Eu$dRf>>2T_>Rle9Y=w8^jYL4!DK z4HLg9`>w>b&9vYvKXymaZecdY{F zgBFuTsRM)?^BxcfvMA#&$mwb+ga3iYn>>&kGVSG|?n=s-bUna#gD@J=FbX$oa>~MF zuo(v38ZK`lbo#BB>iuXG)WHr1j7gN#vm}V?Tip)Iko2QCtxc9-z1&5Zje>X@3VIoC zniHy{$C|a3TElPnx2Z_b{=3$7Ra3wQ$H%ter}ix4KAuJCq~gkvj;^dM*A6t>S(s*d zmZe4}rQ2^(S!tfjafL~cc-otDoU>f^U8s>Fl}xI! zo=C~>w$c{)?Sy-x8?>{{jaIuI2PesogQ3z4!d_&`!$BBm?_tz2Ol|9jODGk z6>dV6$LI9qccRfK;DY#Jlm&nJw{4YPeWyI42zt^?EsBMQ09%h#fcn6xa-!d!YqgRG?7A`W6 zJ9c?sf7sVC9(oP4^fL=*z$nr-e1yz+yZGCP^@vyGq2oQwyk5gBJ<9J9XVau@16F7r zwpZB?wb!I=xI8oOUL!BFlf0*y*J}{teU4WHqe$CMv24a$cV + +#ifndef REGTEST + +long long int llabs( long long int j ) +{ + return ( j >= 0 ) ? j : -j; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> +#include + +int main( void ) +{ + TESTCASE( llabs( 0ll ) == 0 ); + TESTCASE( llabs( LLONG_MAX ) == LLONG_MAX ); + TESTCASE( llabs( LLONG_MIN + 1 ) == -( LLONG_MIN + 1 ) ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/llabs.d b/user/pdclib/functions/stdlib/llabs.d new file mode 100644 index 0000000..7a466f8 --- /dev/null +++ b/user/pdclib/functions/stdlib/llabs.d @@ -0,0 +1,11 @@ +functions/stdlib/llabs.d functions/stdlib/llabs.t: \ + functions/stdlib/llabs.c includes/stdlib.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdlib/llabs.o b/user/pdclib/functions/stdlib/llabs.o new file mode 100644 index 0000000000000000000000000000000000000000..689ba266d8ffed719db7368cf49827e7f8819760 GIT binary patch literal 2344 zcma)8&5ImG6t9}@*=?Nf&jviKxAM2V;%mz_b{2*x0Oz+H?nVvA+ zBMC+n7Qtaf(1Ut2c=0Oe!J9-qj|#t+f);%2QKGsUN-E(lBsD-K7@P`sDZLH~%Patp$^{>sxE($=dc7n6ulHpRe4w zckf*}v$+gAx?W0%sU)%hl{L0zy^}N2Xx=`|}2deXWkDi-Rs&Gh^O2wrPrmbkE-WVsXtT#;3dYZNSy{1zAe$-6ER^IBODa5PjpdNfyn88W} zF{XmbdTV3%B_nf^?8%RlwAV@Ec8zVaY^xiM zRN5Vmvf2*w?jq_^L%lm3#C0y~_kigzt&h`qR6pNtvDW@D>D0`$Bit>)>}TvuBF{bF zp0cr?II~_`t~J6&xafqVS)Ev3UaB2gZ;q2}oO>K=jE(f*QM*FTq0*Zmt@Nd!?ECMb zrRHb?Or zDjdaqtLY^hLs#zil32X^!=r9>(afqfI zOS7nT&Rw=KLLjN@|KI^Q@rL0MGsIrFH^jI4gFv~7RN=z!An`j4Ew841ZTzPnA6Lc` zV!UTX0E+Fn!_)i?2Jg9$_$@(kn<#-VB8khuy%J)_2WGsp86l6Ev zUs%lbjK`OQ#CsXMtO2V&hQQi{#MXmCc-p>$z^7A4Y&<-7Ukb7>-+Qv}Ti|64WBdZ4 zM#hrZE<$$W1rYc=u#Pf@#Csn+*F1nh`WwQPoHa9T9G_Sezi;t+Ib=NYN&GHbKQaB9 zzlKD-mHXGb{C7 zQ}WEoyE4AJ4tb{Xslrq2>XbZmKz3+Ay@!pHuYvve@O`53;PH;>k}?s9>@Sg@S&g#q zv3QV(Gceyz*dMZfk6L`n;xiVXv-pz5*DQ7{4lG_EVxLPE-yz}*AF;B@6O$m%oc{bi LX#61X8KwLWxOV&r literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdlib/lldiv.c b/user/pdclib/functions/stdlib/lldiv.c new file mode 100644 index 0000000..70e282c --- /dev/null +++ b/user/pdclib/functions/stdlib/lldiv.c @@ -0,0 +1,47 @@ +/* $Id$ */ + +/* lldiv( long long int, long long int ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +/* +lldiv_t lldiv( long long int numer, long long int denom ) +{ + lldiv_t rc; + rc.quot = numer / denom; + rc.rem = numer % denom; + // TODO: pre-C99 compilers might require modulus corrections + return rc; +} +*/ + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +#ifndef _PDCLIB_CONFIG_H +#include <_PDCLIB_config.h> +#endif + +int main( void ) +{ + lldiv_t result; + result = lldiv( 5ll, 2ll ); + TESTCASE( result.quot == 2 && result.rem == 1 ); + result = lldiv( -5ll, 2ll ); + TESTCASE( result.quot == -2 && result.rem == -1 ); + result = lldiv( 5ll, -2ll ); + TESTCASE( result.quot == -2 && result.rem == 1 ); + TESTCASE( sizeof( result.quot ) == _PDCLIB_LLONG_BYTES ); + TESTCASE( sizeof( result.rem ) == _PDCLIB_LLONG_BYTES ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/lldiv.d b/user/pdclib/functions/stdlib/lldiv.d new file mode 100644 index 0000000..f9e44a4 --- /dev/null +++ b/user/pdclib/functions/stdlib/lldiv.d @@ -0,0 +1,11 @@ +functions/stdlib/lldiv.d functions/stdlib/lldiv.t: \ + functions/stdlib/lldiv.c includes/stdlib.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdlib/lldiv.o b/user/pdclib/functions/stdlib/lldiv.o new file mode 100644 index 0000000000000000000000000000000000000000..2635c9672336923d6156b32aca685d70e987960d GIT binary patch literal 1452 zcma)6J8#rL5S~5zat9`-91#VIkQ^z9fD#*tgCY_U(gBeGQ6L402JkC)2A>_->xf4I zEiE+-^hosd6#NltY6|#fy_@qD2u7a$zIp8I)BEPuz1u?@Saqzy+F&S7iUTdgh@}q=EGy{0X6SU^E9jkNuzP6Hp%*i?D9yO zM$@3AYFd=iT?qTrVwU(E%~D`hRDNA0rGFSlSsKzookub)^2)Dd42Pd(aeCxMlok2J zRn0=VV?&Ln;%X9VU}nm{cYog={xis6D=n85H|D6+W!Oi zRdWW8u?8AV-X}OW;4@>Qa9+> zME{d>1I*$Tn7 +#include + +#ifndef REGTEST + +#ifndef _PDCLIB_GLUE_H +#define _PDCLIB_GLUE_H _PDLIB_GLUE_H +#include <_PDCLIB_glue.h> +#endif + +/* TODO: Primitive placeholder. Much room for improvement. */ + +/* Keeping pointers to the first and the last element of the free list. */ +struct _PDCLIB_headnode_t _PDCLIB_memlist = { NULL, NULL }; + +void * malloc( size_t size ) +{ + if ( size == 0 ) + { + return NULL; + } + if ( size < _PDCLIB_MINALLOC ) + { + size = _PDCLIB_MINALLOC; + } + { + struct _PDCLIB_memnode_t * current = _PDCLIB_memlist.first; + struct _PDCLIB_memnode_t * previous = NULL; + struct _PDCLIB_memnode_t * firstfit = NULL; + struct _PDCLIB_memnode_t * firstfit_previous = NULL; + /* Trying exact fit */ + while ( current != NULL ) + { + if ( current->size == size ) + { + /* Found exact fit, allocate node */ + if ( previous != NULL ) + { + /* Node in the middle of the list */ + previous->next = current->next; + } + else + { + /* Node is first in list */ + _PDCLIB_memlist.first = current->next; + } + if ( _PDCLIB_memlist.last == current ) + { + /* Node is last in list */ + _PDCLIB_memlist.last = previous; + } + return (char *)current + sizeof( struct _PDCLIB_memnode_t ); + } + else if ( current->size > size && ( firstfit == NULL || current->size < firstfit->size ) ) + { + /* Remember previous node in case we do not get an exact fit. + Note that this is the node *pointing to* the first fit, + as we need that for allocating (i.e., changing next pointer). + */ + firstfit_previous = previous; + firstfit = current; + } + /* Skip to next node */ + previous = current; + current = current->next; + } + /* No exact fit; go for first fit */ + if ( firstfit != NULL ) + { + if ( ( firstfit->size - size ) > _PDCLIB_MINALLOC ) + { + /* Oversized - split into two nodes */ + struct _PDCLIB_memnode_t * newnode = (struct _PDCLIB_memnode_t *)( (char *)firstfit + sizeof( struct _PDCLIB_memnode_t ) + size ); + newnode->size = firstfit->size - size - sizeof( struct _PDCLIB_memnode_t ); + newnode->next = firstfit->next; + firstfit->next = newnode; + firstfit->size = firstfit->size - newnode->size - sizeof( struct _PDCLIB_memnode_t ); + } + if ( firstfit_previous != NULL ) + { + /* Node in the middle of the list */ + firstfit_previous->next = firstfit->next; + } + else + { + /* Node is first in list */ + _PDCLIB_memlist.first = firstfit->next; + } + if ( _PDCLIB_memlist.last == firstfit ) + { + /* Node is last in list */ + _PDCLIB_memlist.last = firstfit_previous; + } + return (char *)firstfit + sizeof( struct _PDCLIB_memnode_t ); + } + } + { + /* No fit possible; how many additional pages do we need? */ + int pages = ( ( size + sizeof( struct _PDCLIB_memnode_t ) - 1 ) / _PDCLIB_PAGESIZE ) + 1; + /* Allocate more pages */ + struct _PDCLIB_memnode_t * newnode = (struct _PDCLIB_memnode_t *)_PDCLIB_allocpages( pages ); + if ( newnode != NULL ) + { + newnode->next = NULL; + newnode->size = pages * _PDCLIB_PAGESIZE - sizeof( struct _PDCLIB_memnode_t ); + if ( ( newnode->size - size ) > ( _PDCLIB_MINALLOC + sizeof( struct _PDCLIB_memnode_t ) ) ) + { + /* Oversized - split into two nodes */ + struct _PDCLIB_memnode_t * splitnode = (struct _PDCLIB_memnode_t *)( (char *)newnode + sizeof( struct _PDCLIB_memnode_t ) + size ); + splitnode->size = newnode->size - size - sizeof( struct _PDCLIB_memnode_t ); + newnode->size = size; + /* Add splitted node as last element to free node list */ + if ( _PDCLIB_memlist.last == NULL ) + { + _PDCLIB_memlist.first = splitnode; + } + else + { + _PDCLIB_memlist.last->next = splitnode; + } + splitnode->next = NULL; /* TODO: This is bug #1514883, uncovered by testdriver yet. */ + _PDCLIB_memlist.last = splitnode; + } + return (char *)newnode + sizeof( struct _PDCLIB_memnode_t ); + } + } + /* No fit, heap extension not possible - out of memory */ + return NULL; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> +#include + +#define MEMTEST( ptr, size ) ( ( ptr = malloc( size ) ) != NULL ) && ( memset( ptr, 0, size ) == ptr ) +#define PAGETEST( x ) ( pages_start + x * _PDCLIB_PAGESIZE ) == sbrk( 0 ) +#define EFFECTIVE _PDCLIB_PAGESIZE - sizeof( struct _PDCLIB_memnode_t ) + +/* This can be enabled to give a dump of available nodes */ +#if 0 +#define NODETRACE( x ) do { struct _PDCLIB_memnode_t * tracer = _PDCLIB_memlist.first; printf( "Node trace #%d, %d allocated pages\n", x, ( (intptr_t)sbrk( 0 ) - (intptr_t)pages_start ) / _PDCLIB_PAGESIZE ); while ( tracer != NULL ) { printf( "- node %p, size %#x\n", (void *)tracer, tracer->size ); tracer = tracer->next; } } while ( 0 ) +#else +#define NODETRACE( x ) ( (void) 0 ) +#endif + +/* Note that this test driver heavily tests *internals* of the implementation + above (and of free() and realloc(), too). That means that changes in the + implementation must be accompanied with appropriate changes of the test + driver. It does *not* make a good regression tester for the implementation, + I am afraid, and thus there is no REGTEST equivalent. +*/ + +void * sbrk( intptr_t ); + +int main( void ) +{ +#ifndef REGTEST + void * ptr1, * ptr2, * ptr3, * ptr4, * ptr5, * ptr6, * ptr7, * ptr8, * ptr9; + char * pages_start = _PDCLIB_allocpages( 0 ); + /* allocating 10 byte; expected: 1 page allocation, node split */ + TESTCASE( MEMTEST( ptr1, 10 ) ); + TESTCASE( PAGETEST( 1 ) ); + NODETRACE( 1 ); + /* allocating EFFECTIVE - 10 byte; expected: no page allocation, receiving split node */ + TESTCASE( MEMTEST( ptr2, EFFECTIVE - 10 - sizeof( struct _PDCLIB_memnode_t ) ) ); + TESTCASE( PAGETEST( 1 ) ); + NODETRACE( 2 ); + /* allocating EFFECTIVE; expected: 1 page allocation, no node split */ + TESTCASE( MEMTEST( ptr3, EFFECTIVE ) ); + TESTCASE( PAGETEST( 2 ) ); + NODETRACE( 3 ); + /* allocating EFFECTIVE - 4; expected: 1 page allocation, no node split */ + TESTCASE( MEMTEST( ptr4, EFFECTIVE - 4 ) ); + TESTCASE( PAGETEST( 3 ) ); + NODETRACE( 4 ); + /* freeing and re-allocating EFFECTIVE - 4; expected: no page allocation, no node split */ + free( ptr4 ); + TESTCASE( MEMTEST( ptr5, EFFECTIVE - 4 ) ); + TESTCASE( ptr4 == ptr5 ); + TESTCASE( PAGETEST( 3 ) ); + NODETRACE( 5 ); + /* releasing EFFECTIVE; expected: no page release */ + free( ptr3 ); + TESTCASE( PAGETEST( 3 ) ); + NODETRACE( 6 ); + /* allocating EFFECTIVE + _PDCLIB_PAGESIZE; expected: 2 page allocation, no node split */ + TESTCASE( MEMTEST( ptr3, EFFECTIVE + _PDCLIB_PAGESIZE ) ); + TESTCASE( PAGETEST( 5 ) ); + NODETRACE( 7 ); + /* reallocating to 10 byte; expected: no page allocation, no node split */ + TESTCASE( realloc( ptr3, 10 ) == ptr3 ); + TESTCASE( PAGETEST( 5 ) ); + NODETRACE( 8 ); + /* reallocating to EFFECTIVE + _PDCLIB_PAGESIZE; expected: no page allocation, no node split */ + TESTCASE( realloc( ptr3, EFFECTIVE + _PDCLIB_PAGESIZE ) == ptr3 ); + TESTCASE( PAGETEST( 5 ) ); + NODETRACE( 9 ); + /* reallocating to EFFECTIVE + _PDCLIB_PAGESIZE * 2; expected: 3 page allocations, no node split */ + TESTCASE( realloc( ptr3, EFFECTIVE + _PDCLIB_PAGESIZE * 2 ) != ptr3 ); + TESTCASE( PAGETEST( 8 ) ); + NODETRACE( 10 ); + /* allocating EFFECTIVE + _PDCLIB_PAGESIZE; expected: no page allocation, no node split */ + TESTCASE( MEMTEST( ptr4, EFFECTIVE + _PDCLIB_PAGESIZE ) ); + TESTCASE( PAGETEST( 8 ) ); + NODETRACE( 11 ); + /* allocating zero size; expected: no page allocation, no node split */ + TESTCASE( ! MEMTEST( ptr6, 0 ) ); + TESTCASE( PAGETEST( 8 ) ); + NODETRACE( 12 ); + /* allocating 4 byte; expected: no page allocation, upsizing of size, node split */ + TESTCASE( MEMTEST( ptr7, 4 ) ); + TESTCASE( PAGETEST( 8 ) ); + NODETRACE( 13 ); + /* allocating rest of page; expected: no page allocation, no node split */ + TESTCASE( MEMTEST( ptr8, EFFECTIVE - _PDCLIB_MINALLOC - sizeof( struct _PDCLIB_memnode_t ) ) ); + TESTCASE( PAGETEST( 8 ) ); + NODETRACE( 14 ); + /* freeing, and allocating one byte more; expected: 1 page allocation, no node split */ + free( ptr8 ); + NODETRACE( 15 ); + TESTCASE( MEMTEST( ptr8, EFFECTIVE + 1 - _PDCLIB_MINALLOC - sizeof( struct _PDCLIB_memnode_t ) ) ); + TESTCASE( PAGETEST( 9 ) ); + NODETRACE( 16 ); + /* realloc with NULL pointer; expected: no page allocation, no node split */ + ptr9 = realloc( NULL, 4072 ); + TESTCASE( ptr9 != NULL ); + TESTCASE( memset( ptr9, 0, 4072 ) == ptr9 ); + TESTCASE( PAGETEST( 9 ) ); + NODETRACE( 17 ); +#else + puts( " NOTEST malloc() test driver is PDCLib-specific." ); +#endif + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/malloc.d b/user/pdclib/functions/stdlib/malloc.d new file mode 100644 index 0000000..7211419 --- /dev/null +++ b/user/pdclib/functions/stdlib/malloc.d @@ -0,0 +1,16 @@ +functions/stdlib/malloc.d functions/stdlib/malloc.t: \ + functions/stdlib/malloc.c includes/stdlib.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdint.h \ + internals/_PDCLIB_glue.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdint.h: + +internals/_PDCLIB_glue.h: diff --git a/user/pdclib/functions/stdlib/malloc.o b/user/pdclib/functions/stdlib/malloc.o new file mode 100644 index 0000000000000000000000000000000000000000..ee266f17a506b40d9e6672e8ddc743b4fbd5303b GIT binary patch literal 3952 zcmai1ZERat8Gf(tb$lB;PTG_b7>G!pZ9&whi{(tjz3^omY89QE!&*PQ*NLcRd7H)EW2g0_1EV5UCl*T{NC3n zzxiLdfR8Q2u6Zs!E>hg`malm?NL}+f0jv<#o^E@~Z8_q({ui2yH>8myKjE~!8?6av zElzICxkS^84yGgCvhPB9i42s@EAGv2V?`5Xez>{V(NPB4UZ*Xe|5ZJ~Xx<8JT99zQ zLHjWWSv41zrT^^0*47ps`X;?F3vjca4<4EnKtwUbawZ!pgdUC_Y%2~*HU%iA;x zWw;p_PP(lD)$6lY{NA>=shYnQSEBahrYd!_yUeCebpxrcMb!~_^VcHQPHSIsFm5Mr zOYXFGSpz*Hkr9cngO(M{U^f9JLa$9|Gg0Au! z4poGm6vslEV(rHihmd1Wppl3ZEmj(0JJIWq+HRCe+v-6B2sahDKO#h;pM4rso8h$N}pus`pCIM~MeD>qzu@@UGVP{FBO* zbz0lLO-y%fV-5p4pTJ}f(#EyEjNsOg^?mu>X{OA-cQw5%iz!$Vy zFA53zI%LfjE)*7;zCVBG#o`|?UtGHEzBOB%wWpr5M}BbOx3B->^>gmLQoQuHcP_l} z4kSzGU%dRn(l<{=B1n=^I7Ou45E&e_OXT)M#OHge#$n8AS@|VQ{|qijSbhT5^RISVotBEK2!AB;Cj}4EeMpK`WQU)RF#c$-N8uG#RrMqp) z`n6gfo@Qf$@R08QjwVY4Wpi~6btM#;B z&)3p(xhzji5R;*9iE9ck@$L=0JFgfj48h+5=!=t|9K6_9% zd;r^lmwn3;>nS(kIL~5BcdHExCT`n(N%!d4NMBS^^(V`X49;=AQ46qOs9L_1YOo8b zT&9tc)N~z3JeQyLXQwjL(`dY;Xc9<@m6>XoFBL0!V~vXtR?Yd-l}s7MgxoW=OojF7 zXh=a)*=o7WBay098~GHD)Zuy~lRX`Fo2emCsI>n}@&)7F!0(9~{1yoxV{^D~gM3F| zqUJ)M$SF`C!XN!<$IHa$hP=ASz~jNC0u>As?+{qphwZwT5prX9CuqhqgYm8!2559g zLp0TW2+W&oh9U2PAY8|F)bRwAtb;u;b$ki5@c}7sLh&jIJ&f)V@Zor4{Xt!f$9hb> zuYoo`AmvO{fp>^^5+g@&wJ_zTx@DpbcV=*)iX1Z~b9NO=YEenUbJvlcOYgm)*cGnuY({9<-CJ$+;TuMOewb|! zTX=G|hpl!#%(LR{VGFysJ#1lzw}*`rWLDtHJCQHHxj6X7?81)T9SC zboKAC5v$LM;5T3dZWdCT)yVG{@=t1f08J+Uu*SzVE&?McVOjGl8rL-1$dP`07c8_E zTQ3$`#Hxwv?E`*7|GLgo^&gW#o)fM&M8rMgrx^MF0iu<4SO5S3 literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdlib/qsort.c b/user/pdclib/functions/stdlib/qsort.c new file mode 100644 index 0000000..6bb636f --- /dev/null +++ b/user/pdclib/functions/stdlib/qsort.c @@ -0,0 +1,163 @@ +/* $Id$ */ + +/* qsort( void *, size_t, size_t, int(*)( const void *, const void * ) ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +/* This implementation is taken from Paul Edward's PDPCLIB. + + Original code is credited to Raymond Gardner, Englewood CO. + Minor mods are credited to Paul Edwards. + Some reformatting and simplification done by Martin Baute. + All code is still Public Domain. +*/ + +/* Wrapper for _PDCLIB_memswp protects against multiple argument evaluation. */ +static inline void memswp( char * i, char * j, size_t size ) +{ + _PDCLIB_memswp( i, j, size ); +} + +/* For small sets, insertion sort is faster than quicksort. + T is the threshold below which insertion sort will be used. + Must be 3 or larger. +*/ +#define T 7 + +/* Macros for handling the QSort stack */ +#define PREPARE_STACK char * stack[STACKSIZE]; char * * stackptr = stack +#define PUSH( base, limit ) stackptr[0] = base; stackptr[1] = limit; stackptr += 2 +#define POP( base, limit ) stackptr -= 2; base = stackptr[0]; limit = stackptr[1] +/* TODO: This is platform-dependent */ +#define STACKSIZE 40 + +void qsort( void * base, size_t nmemb, size_t size, int (*compar)( const void *, const void * ) ) +{ + char * i; + char * j; + _PDCLIB_ptrdiff_t thresh = T * size; + char * base_ = (char *)base; + char * limit = base_ + nmemb * size; + PREPARE_STACK; + + for ( ;; ) + { + if ( limit - base_ > thresh ) /* QSort for more than T elements. */ + { + /* We work from second to last - first will be pivot element. */ + i = base_ + size; + j = limit - size; + /* We swap first with middle element, then sort that with second + and last element so that eventually first element is the median + of the three - avoiding pathological pivots. + TODO: Instead of middle element, chose one randomly. + */ + memswp( ( ( ( (size_t)( limit - base_ ) ) / size ) / 2 ) * size + base_, base_, size ); + if ( compar( i, j ) > 0 ) memswp( i, j, size ); + if ( compar( base_, j ) > 0 ) memswp( base_, j, size ); + if ( compar( i, base_ ) > 0 ) memswp( i, base_, size ); + /* Now we have the median for pivot element, entering main Quicksort. */ + for ( ;; ) + { + do + { + /* move i right until *i >= pivot */ + i += size; + } while ( compar( i, base_ ) < 0 ); + do + { + /* move j left until *j <= pivot */ + j -= size; + } while ( compar( j, base_ ) > 0 ); + if ( i > j ) + { + /* break loop if pointers crossed */ + break; + } + /* else swap elements, keep scanning */ + memswp( i, j, size ); + } + /* move pivot into correct place */ + memswp( base_, j, size ); + /* larger subfile base / limit to stack, sort smaller */ + if ( j - base_ > limit - i ) + { + /* left is larger */ + PUSH( base_, j ); + base_ = i; + } + else + { + /* right is larger */ + PUSH( i, limit ); + limit = j; + } + } + else /* insertion sort for less than T elements */ + { + for ( j = base_, i = j + size; i < limit; j = i, i += size ) + { + for ( ; compar( j, j + size ) > 0; j -= size ) + { + memswp( j, j + size, size ); + if ( j == base_ ) + { + break; + } + } + } + if ( stackptr != stack ) /* if any entries on stack */ + { + POP( base_, limit ); + } + else /* else stack empty, done */ + { + break; + } + } + } +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> +#include +#include + +static int compare( const void * left, const void * right ) +{ + return *( (unsigned char *)left ) - *( (unsigned char *)right ); +} + +int main( void ) +{ + char presort[] = { "shreicnyjqpvozxmbt" }; + char sorted1[] = { "bcehijmnopqrstvxyz" }; + char sorted2[] = { "bticjqnyozpvreshxm" }; + char s[19]; + strcpy( s, presort ); + qsort( s, 18, 1, compare ); + TESTCASE( strcmp( s, sorted1 ) == 0 ); + strcpy( s, presort ); + qsort( s, 9, 2, compare ); + TESTCASE( strcmp( s, sorted2 ) == 0 ); + strcpy( s, presort ); + qsort( s, 1, 1, compare ); + TESTCASE( strcmp( s, presort ) == 0 ); +#if __BSD_VISIBLE + puts( "qsort.c: Skipping test #4 for BSD as it goes into endless loop here." ); +#else + qsort( s, 100, 0, compare ); + TESTCASE( strcmp( s, presort ) == 0 ); +#endif + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/qsort.d b/user/pdclib/functions/stdlib/qsort.d new file mode 100644 index 0000000..f5110b6 --- /dev/null +++ b/user/pdclib/functions/stdlib/qsort.d @@ -0,0 +1,11 @@ +functions/stdlib/qsort.d functions/stdlib/qsort.t: \ + functions/stdlib/qsort.c includes/stdlib.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdlib/qsort.o b/user/pdclib/functions/stdlib/qsort.o new file mode 100644 index 0000000000000000000000000000000000000000..62157d86fa93a36001f42c1c6d6b98f164f09263 GIT binary patch literal 3960 zcma)9ZERat89vANI=-o$#A&v$YMbVYj3%(!lbXTSpb?f{*20*EAX)~Ug6-IenLje$ z>#arIs?DpYWjeKhGzkzINMpYk)2JpsBv{u`bQ>3DhPpjo^#KM zZwpKu<(%jJKJR(Y$90an4}3yODNK{X5`9jHLxX{4TEV0k7h__+_19)M*>;_g*Tr$S z*LD*luaiBVY`TtA?0k<*LN+T&*?cM~8W+x=h1+MJ>HZFZ+HSJ-=9x=Y>%!ET)>|#N z1Lv08rRNXbq~&&7?#78@v%OxgP1tRB4U)EdL+>}o z-gtTkGu#K;u(D%^&AabqPG#r!|6=s+dqoc^JKtC4Ny!C;uQ-2Yc$&Reg;P` zA^#b7{fWD-Ph4g4DTba`o+ynf(ppf^d(Iq9U75Y!iKXa_!|C#4YRTAxZVNlSdEz0P zC5bfMP1I%$dv^Izl{PHa`W73;VjUZKc}7`aPq_r75$xKPg8?Vs)U$I_7#vf7>z`_0 zX56kn1?|;~SoRfpvhS`oEWG|7DK!$}9IAvU$433_;1u2CZu+-0E6jPbE!0WdY`$TW z+_?O0Om^~_b3B({c=W6smA4O%#jW9+hezdhnH&%zG9lved*hZPgr&)0A?y)I4~z*B z9T(Q{-uR4S2GTNMb|vUOJ0M{ZiwesLEF#;4aKLH@vV+stXt$;1#}fY;BMz&OQ-ZS# zF?6Hcl{hfQNrt0>*^GPu>qtr&2uF89n1SK;AaUq^h1(MWVg>RFMtKfHfjrtD1C5B- z(NfhHmL28OU^&r0L228w7%e&QlK@7klFq~ABGIb~V$Tum*h>T_HVcTxFhu@vJINg+ zFXc(13v28M#(`}JB*!rb@evMae@2g$Al(Zha!SO$v_;#_gtGsN(l~>DWmU+VW)=6O z*e3Z>$w|pbT+SW9lW=feRC1Dt=cE-E#Ly8ZbwuYirF%tLCI*qk2ZJmY29d>w0{US5 zR%UU>tWlQlpO}~YlP*=QY)rF+=8waC2YlWFqeR|SNd{c(ch}es$X9!6^kK>HppeY!lI~F z3YDCW?)lmLW1?KEE~nJcsCuR4YGEnGi?zk%SF&}HS*cYD8It7^(5rcwhF7R(R+sYJ zH*W>|liG5jzY30I1n2EXqbgsktRkigTrO2gzPSD%WXy*5lcVGP56-9NQq$?_^d3DW zrOJi`mgYUVih`&`sPO(uz2L2=8VPa#+}z&O_rha_bx$jtHD9TM^qwFQ@kdYs0;y9$e!xcY^6Ycr+09Op<7Y_L% zy_EH{BAxSa(3c9i#`0n|m#Y_^5b1iMtRgbrE0-gmuva3YPFH8W-GWVA@^)O zTV19oh>z(-8l|rkP^xsb<`>ea=kDMTgxrdC1X2t8KZl!P$IF24kZOG0!UxnG+ntcp zPTf;r(h#88jNLBKyhTR+zwG#IGM;I)d&e+9qq{dmQ~fUNc+E^RBrm4^DXCORd_pIo zkkHNOO5hDm z)n8!8$H6qC%hnR$u9!yG6&C`J;(8^N+Zj7Q|0;dp-=68Imb-%Px| zB%s1_TfEx~>#zL}i1EXjkPpvD-c%uoVgt?#tUHmv;3Ud%tHzx~ zoW+dRe^}$3M&48UeMTei9{EL$MU54Wb&cx&!0x!_zpn9{M9lvkjo%}pd}p=(9gQ8W z?`qs2!tU={A43V$x-`CD;{lBiYbL&)E$`DxAn E8!;`&@Bjb+ literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdlib/rand.c b/user/pdclib/functions/stdlib/rand.c new file mode 100644 index 0000000..b4d01de --- /dev/null +++ b/user/pdclib/functions/stdlib/rand.c @@ -0,0 +1,35 @@ +/* $Id$ */ + +/* rand( void ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +int rand( void ) +{ + _PDCLIB_seed = _PDCLIB_seed * 1103515245 + 12345; + return (unsigned int) ( _PDCLIB_seed / 65536 ) % 32768; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + int rnd1, rnd2; + TESTCASE( ( rnd1 = rand() ) < RAND_MAX ); + TESTCASE( ( rnd2 = rand() ) < RAND_MAX ); + srand( 1 ); + TESTCASE( rand() == rnd1 ); + TESTCASE( rand() == rnd2 ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/rand.d b/user/pdclib/functions/stdlib/rand.d new file mode 100644 index 0000000..4db0309 --- /dev/null +++ b/user/pdclib/functions/stdlib/rand.d @@ -0,0 +1,11 @@ +functions/stdlib/rand.d functions/stdlib/rand.t: functions/stdlib/rand.c \ + includes/stdlib.h internals/_PDCLIB_int.h internals/_PDCLIB_config.h \ + internals/_PDCLIB_aux.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdlib/rand.o b/user/pdclib/functions/stdlib/rand.o new file mode 100644 index 0000000000000000000000000000000000000000..4e2d1773269bf8f8a033a149c9b524d8af410fdf GIT binary patch literal 2500 zcma)8ONd-W6us52JJZ@9=ciGl*g}RxG_M6m!DxOn6NfQj5MdBO9sBd9=aKH$q2KEe zF%n$_%uXRLL>GRtaU)q|A+92RK+vTNH?9<1iLPCY=hUk^T?r^&s5tUXCHyIgMfQ_DaV0C%gA*V~NSHZI_c|6UZWAI~9;+{xHG5k7y#U`#n z$2!;pt%Esq4Om%)&?e(ZZR?Qzcvm2>F2*BjJU%G82CRGr;Sn;9)HZ;uJWW4AVDFXG z7DM6Z{m{!>flc$i1zy)M#-9)xWE`pO4ak1Hs}T6zu#Osr#(M`m*YI3O(|DJD$yqzo z#_@qe_4@;U`>jVlsoz!Sr>0rG5Kciq(ia%YQ=W&P-#_k;bREO5ybGE;Fc^=0VopEaH5~rE&?#v=l@)z`QU2OdJ@MvWZpwZJ z%35{4Dv*-D9CrPx)y^9^p+Ih*2;c(Y&6!YOPu`bV@q_|l7bg@5J3OHPozaYZQ)Y33 zyh}>#oBm?j=lrJMg}k>0PJFA0_c&x#2Bq>Jgu#}%3!;6CfYuL(c0cvN2Z=bhrt^Ek z;Sq-`4o^9>-#+5J=;T)&_8i)86!!C!5&we2H;E|t5)t+*4sAU6*?nVDWc^&vchsOU I{4J;a54(>Ac>n+a literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdlib/realloc.c b/user/pdclib/functions/stdlib/realloc.c new file mode 100644 index 0000000..099ad5d --- /dev/null +++ b/user/pdclib/functions/stdlib/realloc.c @@ -0,0 +1,58 @@ +/* $Id$ */ + +/* void * realloc( void *, size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include +#include + +#ifndef REGTEST + +/* TODO: Primitive placeholder. Improve. */ + +void * realloc( void * ptr, size_t size ) +{ + void * newptr = NULL; + if ( ptr == NULL ) + { + return malloc( size ); + } + if ( size > 0 ) + { + struct _PDCLIB_memnode_t * baseptr = (struct _PDCLIB_memnode_t *)( (char *)ptr - sizeof( struct _PDCLIB_memnode_t ) ); + if ( baseptr->size >= size ) + { + /* Current memnode is large enough; nothing to do. */ + return ptr; + } + else + { + /* Get larger memnode and copy over contents. */ + if ( ( newptr = malloc( size ) ) == NULL ) + { + return NULL; + } + memcpy( newptr, ptr, baseptr->size ); + } + } + free( ptr ); + return newptr; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + /* tests covered in malloc test driver */ + return TEST_RESULTS; +} + +#endif + diff --git a/user/pdclib/functions/stdlib/realloc.d b/user/pdclib/functions/stdlib/realloc.d new file mode 100644 index 0000000..3f789cd --- /dev/null +++ b/user/pdclib/functions/stdlib/realloc.d @@ -0,0 +1,16 @@ +functions/stdlib/realloc.d functions/stdlib/realloc.t: \ + functions/stdlib/realloc.c includes/stdlib.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/string.h \ + includes/stddef.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/string.h: + +includes/stddef.h: diff --git a/user/pdclib/functions/stdlib/realloc.o b/user/pdclib/functions/stdlib/realloc.o new file mode 100644 index 0000000000000000000000000000000000000000..6bffd72c7350e513b327f0d8ece8527ad8147ca9 GIT binary patch literal 3016 zcmai0TWB0r82;y$opv|dCR?kvURIiFigvbO6lrPICTj_nB0?YfP}99kvP*Yo2DR;^?Ill7y@}HC6SJ$aqUUH>Bx>_x)*b~?P-PqW; zQD0svNPKLy>Mmb*SE~Q4;wJ~Hh0uZO#!SX_rMkYnv@ZSJRc5-eC-GdFnQ-916(+*uqm#*M8bBIbnT^M~@5D`F|OC}M9HtGGXZAU|6YaY}|& z%;zCG2E>uk)aJ~Vp4cps+kymib3Nn9LK^i@VYb8xo*H4mCPyqcO=cosGenh}Vt(ot zv5?0i$I;AD=0$d z>3o$y?nQ!~dz0Yi_5$nz2J^R*7@eIMTyxU+2spy6Ha+7s&AVhIN30|!bC)eS`wSE| z9Ho`mC}wxCcho7+)%X)s^lI#$xLZG6P<1zg{b|qKNm~jzZ4HvtaQ47 zuHOxMO?q{D!9qD1`a#rQ2>fQ5hh!i$TD4FrtzOr!knOaAQ7@|WBR{MxHXH0+)ar$C zc@V;Qz1~}tNv^;@%gr6mOZOwkj+dv)Q{I&KsLDody%zZcUnFNFD$>a5Y5ckv6d#Cz|^w=IXm25@3aItI{V!Y}WZ2KbGy)9{IIOiFvXVULcin1?6=pf#WnHj5l&IlulE<`YV~^PpAnBPsiqyw_p)-Q9r)TC zM=fhw?AL=@7w0e&UJGl%0##`?EJ3_RuiN#}ATQ{}zK3q^jpAD4bT({0M50V-w`K2# z2M;Rlzl3;CXOEe!^t=Q%DV}f<_f;8q2Oh@Lk0*P#l9Rs*_~d2=YSQ^0hJyaL^V z=GVl0UuXfSZHF^F%^eu{x6-89Lr`SvxPm(P9%3Erfv$tss*V9Guj9Y?78ym_b_{Yh z-z8kstc&@GI^PT6bqrY9g2Epmqe$DjkTp-!0r=ggdJ7s?#V-oNPGk`d_W> ztb9n8V38TJgePZ6Ry?1X{#@VmyqqPYLW + +#ifndef REGTEST + +void srand( unsigned int seed ) +{ + _PDCLIB_seed = seed; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + /* tested in rand.c */ + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/srand.d b/user/pdclib/functions/stdlib/srand.d new file mode 100644 index 0000000..83dc5e0 --- /dev/null +++ b/user/pdclib/functions/stdlib/srand.d @@ -0,0 +1,11 @@ +functions/stdlib/srand.d functions/stdlib/srand.t: \ + functions/stdlib/srand.c includes/stdlib.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/stdlib.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/stdlib/srand.o b/user/pdclib/functions/stdlib/srand.o new file mode 100644 index 0000000000000000000000000000000000000000..f4e300970fe0879e3ab14f5eb6456f7787abd150 GIT binary patch literal 2504 zcma)8&5K)A6hHU9yqRb+alUMoDvi)$Mf)NcT~yoZ%(SICmQoqSMIB#~H%VynQu1D; zLPd%c6gP@4L^p+2n1#4<(S;ikS8iOYD>wZE+_>qY{(kpka^nYh;NIW)y64<;?tLHc zo!UIDloCfuLYYb;t0iM;YB(bMWmUF5yz|ki@=asl&CEN?1EkTT;tvaZV&S zB$djEN>~;NEn5>Q#p+}=tR1U7UwOPr*B9s1ibxcRQJ!51?iZPB?ujR>FI17>7Dj-9 z2x=Fzx`yd6Wzd2F2})5vD!wrrt+vcAlmko189M)T^{)iqSdb%=-GV`jM^HBr7H+$kFCROV2)GgUTYhaSxiRofA{cLCC%Y%NFI`6@#?VB!7T3Is0CGwUhxK3TFOf+mk;`V4bOwo=w8x?7c zz8%erqwlhW`SJ(f+gK*+4#PhC+?+E`E*;j`gfc`$?qUT?5M|n*j#Nc}RQRWlv zZZ%lp)9I6o_av0`=dCCGm*3N{F`gs(B~Ac3+nUGI{1wJ78B5OZ1Z2OC-?53?(6J8o zfcxXVE?~GdVC7W^2^mYyb`G*1?{f%T&v--^?@jP-4OsaG!c$}{IolAj<7xU00-tn8 z&en&*&wInmTY=5xy$0T`VT?Z^)X7+Kws#@>@pd8bxnUi=4=&!v;JJq9LfVH{&>h3- znKq6uEjquu@H?bE%;fxTSwCkw=q`j+(2vA3ay;ca{QUlLeR1Br zr`m+@BXo{jE~0tM8q3%C!Yo3$58?wDjK@APryuV-9R9zZ8{B5d<)N}9f86tpvtMz> z_cKs-Rhw0zME-Kv-Ba!CypdB11z&29LgCGsQaJM_U_MqnrBK+#DTTrgPboxa+*$Ar zE#n0J2<+S5chh`DW{`^%B9(Jvv||uYee|#{bO>-x~b>aU7<0& HCzSsJv*-mo literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdlib/strtol.c b/user/pdclib/functions/stdlib/strtol.c new file mode 100644 index 0000000..04c8617 --- /dev/null +++ b/user/pdclib/functions/stdlib/strtol.c @@ -0,0 +1,122 @@ +/* $Id$ */ + +/* strtol( const char *, char * *, int ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include + +#ifndef REGTEST + +#include + +long int strtol( const char * s, char ** endptr, int base ) +{ + long int rc; + char sign = '+'; + const char * p = _PDCLIB_strtox_prelim( s, &sign, &base ); + if ( base < 2 || base > 36 ) return 0; + if ( sign == '+' ) + { + rc = _PDCLIB_strtox_main( &p, (unsigned)base, (uintmax_t)LONG_MAX, (uintmax_t)( LONG_MAX / base ), (int)( LONG_MAX % base ), &sign ); + } + else + { + /* FIXME: This breaks on some machines that round negatives wrongly */ + rc = _PDCLIB_strtox_main( &p, (unsigned)base, (uintmax_t)LONG_MIN, (uintmax_t)( LONG_MIN / -base ), (int)( -( LONG_MIN % base ) ), &sign ); + } + if ( endptr != NULL ) *endptr = ( p != NULL ) ? (char *) p : (char *) s; + return ( sign == '+' ) ? rc : -rc; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +#ifndef _PDCLIB_INT_H +#define _PDCLIB_INT_H +#include <_PDCLIB_int.h> +#endif + +#include + +int main( void ) +{ + char * endptr; + /* this, to base 36, overflows even a 256 bit integer */ + char overflow[] = "-ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ_"; + errno = 0; + /* basic functionality */ + TESTCASE( strtol( "123", NULL, 10 ) == 123 ); + /* proper detecting of default base 10 */ + TESTCASE( strtol( "123", NULL, 0 ) == 123 ); + /* proper functioning to smaller base */ + TESTCASE( strtol( "14", NULL, 8 ) == 12 ); + /* proper autodetecting of octal */ + TESTCASE( strtol( "014", NULL, 0 ) == 12 ); + /* proper autodetecting of hexadecimal, lowercase 'x' */ + TESTCASE( strtol( "0xFF", NULL, 0 ) == 255 ); + /* proper autodetecting of hexadecimal, uppercase 'X' */ + TESTCASE( strtol( "0XFF", NULL, 0 ) == 255 ); + /* errno should still be 0 */ + TESTCASE( errno == 0 ); + /* overflowing subject sequence must still return proper endptr */ + TESTCASE( strtol( overflow, &endptr, 36 ) == LONG_MIN ); + TESTCASE( errno == ERANGE ); + TESTCASE( ( endptr - overflow ) == 53 ); + /* same for positive */ + errno = 0; + TESTCASE( strtol( overflow + 1, &endptr, 36 ) == LONG_MAX ); + TESTCASE( errno == ERANGE ); + TESTCASE( ( endptr - overflow ) == 53 ); + /* testing skipping of leading whitespace */ + TESTCASE( strtol( " \n\v\t\f123", NULL, 0 ) == 123 ); + /* testing conversion failure */ + TESTCASE( strtol( overflow, &endptr, 10 ) == 0 ); + TESTCASE( endptr == overflow ); + endptr = NULL; + TESTCASE( strtol( overflow, &endptr, 0 ) == 0 ); + TESTCASE( endptr == overflow ); + /* These tests assume two-complement, but conversion should work for */ + /* one-complement and signed magnitude just as well. Anyone having a */ + /* platform to test this on? */ + errno = 0; +#if _PDCLIB_LONG_BYTES == 4 + /* testing "even" overflow, i.e. base is power of two */ + TESTCASE( strtol( "0x7FFFFFFF", NULL, 0 ) == 0x7fffffff ); + TESTCASE( errno == 0 ); + TESTCASE( strtol( "0x80000000", NULL, 0 ) == LONG_MAX ); + TESTCASE( errno == ERANGE ); + errno = 0; + TESTCASE( strtol( "-0x7FFFFFFF", NULL, 0 ) == (long)0x80000001 ); + TESTCASE( errno == 0 ); + TESTCASE( strtol( "-0x80000000", NULL, 0 ) == LONG_MIN ); + TESTCASE( errno == 0 ); + TESTCASE( strtol( "-0x80000001", NULL, 0 ) == LONG_MIN ); + TESTCASE( errno == ERANGE ); + /* TODO: test "odd" overflow, i.e. base is not power of two */ +#elif _PDCLIB_LONG_BYTES == 8 + /* testing "even" overflow, i.e. base is power of two */ + TESTCASE( strtol( "0x7FFFFFFFFFFFFFFF", NULL, 0 ) == 0x7fffffffffffffff ); + TESTCASE( errno == 0 ); + TESTCASE( strtol( "0x8000000000000000", NULL, 0 ) == LONG_MAX ); + TESTCASE( errno == ERANGE ); + errno = 0; + TESTCASE( strtol( "-0x7FFFFFFFFFFFFFFF", NULL, 0 ) == -0x8000000000000001 ); + TESTCASE( errno == 0 ); + TESTCASE( strtol( "-0x8000000000000000", NULL, 0 ) == LONG_MIN ); + TESTCASE( errno == 0 ); + TESTCASE( strtol( "-0x8000000000000001", NULL, 0 ) == LONG_MIN ); + TESTCASE( errno == ERANGE ); + /* TODO: test "odd" overflow, i.e. base is not power of two */ +#else +#error Unsupported width of 'long' (neither 32 nor 64 bit). +#endif + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/stdlib/strtol.d b/user/pdclib/functions/stdlib/strtol.d new file mode 100644 index 0000000..04a3537 --- /dev/null +++ b/user/pdclib/functions/stdlib/strtol.d @@ -0,0 +1,16 @@ +functions/stdlib/strtol.d functions/stdlib/strtol.t: \ + functions/stdlib/strtol.c includes/limits.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdlib.h \ + includes/stdint.h + +includes/limits.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdlib.h: + +includes/stdint.h: diff --git a/user/pdclib/functions/stdlib/strtol.o b/user/pdclib/functions/stdlib/strtol.o new file mode 100644 index 0000000000000000000000000000000000000000..2b513bcf58bd3e4d1fd269a9d048967f07f68919 GIT binary patch literal 2988 zcma)8O>7%Q6n?Y2j<>PvxJjTzEvhTIv?$a;B5-J-gr-ZCQcC$r#a|lP&L**HuY-4u ziqtX~)2;r_fm>ns7R z8OIK-{I7qntgM92;*67>`dys1CFW1JU*;G$IDE%v&eEej&GO9C*~{=f6JEXY=ho#v z!XMxoIt!Za)Pl6ZakjY>2Kg=FtNBexl?`9WcYlk_yd0S3*x{kPHR~+4ws8Aqg;T(E zR;BnpytaIu(_CHtIUHKhY+9<}C8XJcbZb&^7*2(hEB{V4bt+9k_l&bR{Z)_v+%(aR znW1!OMAZh#8Rz!$PprN@HQ)crvEi=~P;3y}GhHb&vpKUtbc$>nk&&lVYH!N4iOiVI z5Lq424t5bG3gYp!nc1D%liHCU?BZ4ZZ32e21erFg2fK`Rq9jD=6^VA=8tXcUnzj8t z;@Gr^VPGJixPVz4$8?cp&|rKp3@cIb0y3>c30l*ZN5r!FSrBc*5nPdAKf_=oK9`V0 z9axs!#$YE4fP|RFEVAMO0Fz2`9ekS)3p2(XCBFlT>ldCFo4tk$Arc4iDu9a(#uq!b8+MQLnkZ9H3eO`gOmz>AQ{I z$;(titbuPVsE+zc5%0%{l{4FTydR_Tdk+Ef(j%Ib-=)}3nZDpe8nGV}e*s*%YEXUdb~-Tt3A*u z()X@(jJn>U-&SoQl| zB2#uzm$}0&GSL~8f!~x)RLgx=#C_YL1R%?;AJOKlV^YX{;yC>N3S3V9 HO=I~V9v`%y literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/stdlib/strtoll.c b/user/pdclib/functions/stdlib/strtoll.c new file mode 100644 index 0000000..0eb8423 --- /dev/null +++ b/user/pdclib/functions/stdlib/strtoll.c @@ -0,0 +1,122 @@ +/* $Id$ */ + +/* strtoll( const char *, char * *, int ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include + +#ifndef REGTEST + +#include + +long long int strtoll( const char * s, char ** endptr, int base ) +{ + long long int rc; + char sign = '+'; + const char * p = _PDCLIB_strtox_prelim( s, &sign, &base ); + if ( base < 2 || base > 36 ) return 0; + if ( sign == '+' ) + { + rc = _PDCLIB_strtox_main( &p, (unsigned)base, (uintmax_t)LLONG_MAX, (uintmax_t)( LLONG_MAX / base ), (int)( LLONG_MAX % base ), &sign ); + } + else + { + /* FIXME: This breaks on some machines that round negatives wrongly */ + /* FIXME: Sign error not caught by testdriver */ + rc = _PDCLIB_strtox_main( &p, (unsigned)base, (uintmax_t)LLONG_MIN, (uintmax_t)( LLONG_MIN / -base ), (int)( -( LLONG_MIN % base ) ), &sign ); + } + if ( endptr != NULL ) *endptr = ( p != NULL ) ? (char *) p : (char *) s; + return ( sign == '+' ) ? rc : -rc; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +#ifndef _PDCLIB_INT_H +#define _PDCLIB_INT_H +#include <_PDCLIB_int.h> +#endif + +#include + +int main( void ) +{ + char * endptr; + /* this, to base 36, overflows even a 256 bit integer */ + char overflow[] = "-ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ_"; + errno = 0; + /* basic functionality */ + TESTCASE( strtoll( "123", NULL, 10 ) == 123 ); + /* proper detecting of default base 10 */ + TESTCASE( strtoll( "123", NULL, 0 ) == 123 ); + /* proper functioning to smaller base */ + TESTCASE( strtoll( "14", NULL, 8 ) == 12 ); + /* proper autodetecting of octal */ + TESTCASE( strtoll( "014", NULL, 0 ) == 12 ); + /* proper autodetecting of hexadecimal, lowercase 'x' */ + TESTCASE( strtoll( "0xFF", NULL, 0 ) == 255 ); + /* proper autodetecting of hexadecimal, uppercase 'X' */ + TESTCASE( strtoll( "0XFF", NULL, 0 ) == 255 ); + /* errno should still be 0 */ + TESTCASE( errno == 0 ); + /* overflowing subject sequence must still return proper endptr */ + TESTCASE( strtoll( overflow, &endptr, 36 ) == LLONG_MIN ); + TESTCASE( errno == ERANGE ); + TESTCASE( ( endptr - overflow ) == 53 ); + /* same for positive */ + errno = 0; + TESTCASE( strtoll( overflow + 1, &endptr, 36 ) == LLONG_MAX ); + TESTCASE( errno == ERANGE ); + TESTCASE( ( endptr - overflow ) == 53 ); + /* testing skipping of leading whitespace */ + TESTCASE( strtoll( " \n\v\t\f123", NULL, 0 ) == 123 ); + /* testing conversion failure */ + TESTCASE( strtoll( overflow, &endptr, 10 ) == 0 ); + TESTCASE( endptr == overflow ); + endptr = NULL; + TESTCASE( strtoll( overflow, &endptr, 0 ) == 0 ); + TESTCASE( endptr == overflow ); + /* These tests assume two-complement, but conversion should work for */ + /* one-complement and signed magnitude just as well. Anyone having a */ + /* platform to test this on? */ + errno = 0; +#if _PDCLIB_LLONG_BYTES == 8 + /* testing "even" overflow, i.e. base is power of two */ + TESTCASE( strtoll( "0x7FFFFFFFFFFFFFFF", NULL, 0 ) == 0x7fffffffffffffff ); + TESTCASE( errno == 0 ); + TESTCASE( strtoll( "0x8000000000000000", NULL, 0 ) == LLONG_MAX ); + TESTCASE( errno == ERANGE ); + errno = 0; + TESTCASE( strtoll( "-0x7FFFFFFFFFFFFFFF", NULL, 0 ) == (long long)0x8000000000000001 ); + TESTCASE( errno == 0 ); + TESTCASE( strtoll( "-0x8000000000000000", NULL, 0 ) == LLONG_MIN ); + TESTCASE( errno == 0 ); + TESTCASE( strtoll( "-0x8000000000000001", NULL, 0 ) == LLONG_MIN ); + TESTCASE( errno == ERANGE ); + /* TODO: test "odd" overflow, i.e. base is not power of two */ +#elif _PDCLIB_LONG_BYTES == 16 + /* testing "even" overflow, i.e. base is power of two */ + TESTCASE( strtoll( "0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", NULL, 0 ) == 0x7fffffffffffffffffffffffffffffff ); + TESTCASE( errno == 0 ); + TESTCASE( strtoll( "0x80000000000000000000000000000000", NULL, 0 ) == LLONG_MAX ); + TESTCASE( errno == ERANGE ); + errno = 0; + TESTCASE( strtoll( "-0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", NULL, 0 ) == -0x80000000000000000000000000000001 ); + TESTCASE( errno == 0 ); + TESTCASE( strtoll( "-0x80000000000000000000000000000000", NULL, 0 ) == LLONG_MIN ); + TESTCASE( errno == 0 ); + TESTCASE( strtoll( "-0x80000000000000000000000000000001", NULL, 0 ) == LLONG_MIN ); + TESTCASE( errno == ERANGE ); + /* TODO: test "odd" overflow, i.e. base is not power of two */ +#else +#error Unsupported width of 'long long' (neither 64 nor 128 bit). +#endif + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/stdlib/strtoll.d b/user/pdclib/functions/stdlib/strtoll.d new file mode 100644 index 0000000..46fe465 --- /dev/null +++ b/user/pdclib/functions/stdlib/strtoll.d @@ -0,0 +1,16 @@ +functions/stdlib/strtoll.d functions/stdlib/strtoll.t: \ + functions/stdlib/strtoll.c includes/limits.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdlib.h \ + includes/stdint.h + +includes/limits.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdlib.h: + +includes/stdint.h: diff --git a/user/pdclib/functions/stdlib/strtoll.o b/user/pdclib/functions/stdlib/strtoll.o new file mode 100644 index 0000000000000000000000000000000000000000..0a651994d1ea3beec24808d08ed7ba5d36b5388e GIT binary patch literal 3172 zcma)8U2GIp6ux(6wmYy(yR=nNs;qHA46?;gjR69cb|qEBKWa2u*4^&5-MBkjcV-bI zKWfFe*%akf*d3oykrVE+b4bz!KV=!e;XJ!Fb zGh;Wb)XeSq`T0g>rkP1h{VfmM3R8zWPBO+RPFMF~kB;v%v)eXw96bgFTpDK@XV2VP za}sOkPhlKs>`vK@H&Ss#Z0t>0e$=z{{OQa;Yq%@a@rzc9D=uPpE>d32=MvNP*@lqj_VfYR7I+~dq&EcDKm!~d? zx! z=a}Unrmrc3z6~y(VMR)gCrm3+gVwYoG+I_a1=&{dfw#t#c9vj7&MSz%N3fzO2g{-l z0U~lWW|@$i0VKW274U5?EM$!1BKk8>Cax;UitbR-S|!=$3LK5PLpNPO}vI-h{rHXd8>T|X7#M0P&rn2M!iziaeG~_P%h<#aJ`yW zEtk{SjB6vRQD#DZ^sN1z{p)Gtm|SH{%WnI){euxjC^~U6gl7>=pSOuD(-3u>u}}8_ z{Knq^_clhbn=1Na=}Aw>F=)mcI_EX4kY{1ed*1jccNM;_EKFg0o|(GTX&1K z-pRr!`|C$yfTB~F^l-O!4Ge5at{=|V9k1@k*w|NB(&LW=F%zhsFAXW=K|5|)pP;Yo zmL_)TsdjtkQDa49WXk%Oy%%Zs-HMmX15u*F3C-1t<+N8k;E8l0=jB8?@48@%`TBS^ zm(SOV`$d{AzNX}iRl{<**795}=ZsV3M?(rCJzA|)ifBRF zsd~jUy0_8wa-(mBmyOjBNZ0p&a1ESz|AJ42;I|@td-R>+lei2+(_l=9Cn4O0!S(dx zh2>L6S@jb5JB1MGcpIRj|9|;yf=@UE<9!;6r)@iz_*L=1@M+Pc{kB69uHzu;;J1x+ zum`%1m%!^aU_};*j*tmR+x9>X$Lqt#fORn*QODZ{UatWwP9xr=Ik_kx1I|Ml#ZxHeL{IHG{7`l$nz;g}Hg|rTa zUwl^0v~he9p!T~Bzm)RuC++uD;HOQ=h~`>;2RSz}ml ziNEHxp1AmLj&gVh%DQTQl_?fC&s=z_wVjo>$P`F2M5f@)X_2W;J}k517MZGxVVNCn zk%`WPBeGB3Ewk#|{ejGPPA5)y?GpReC9?iz;X|9vR;q +#include + +#ifndef REGTEST + +#include + +unsigned long int strtoul( const char * s, char ** endptr, int base ) +{ + unsigned long int rc; + char sign = '+'; + const char * p = _PDCLIB_strtox_prelim( s, &sign, &base ); + if ( base < 2 || base > 36 ) return 0; + rc = _PDCLIB_strtox_main( &p, (unsigned)base, (uintmax_t)ULONG_MAX, (uintmax_t)( ULONG_MAX / base ), (int)( ULONG_MAX % base ), &sign ); + if ( endptr != NULL ) *endptr = ( p != NULL ) ? (char *) p : (char *) s; + return ( sign == '+' ) ? rc : -rc; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> +#include + +int main( void ) +{ + char * endptr; + /* this, to base 36, overflows even a 256 bit integer */ + char overflow[] = "-ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ_"; + errno = 0; + /* basic functionality */ + TESTCASE( strtoul( "123", NULL, 10 ) == 123 ); + /* proper detecting of default base 10 */ + TESTCASE( strtoul( "123", NULL, 0 ) == 123 ); + /* proper functioning to smaller base */ + TESTCASE( strtoul( "14", NULL, 8 ) == 12 ); + /* proper autodetecting of octal */ + TESTCASE( strtoul( "014", NULL, 0 ) == 12 ); + /* proper autodetecting of hexadecimal, lowercase 'x' */ + TESTCASE( strtoul( "0xFF", NULL, 0 ) == 255 ); + /* proper autodetecting of hexadecimal, uppercase 'X' */ + TESTCASE( strtoul( "0XFF", NULL, 0 ) == 255 ); + /* errno should still be 0 */ + TESTCASE( errno == 0 ); + /* overflowing subject sequence must still return proper endptr */ + TESTCASE( strtoul( overflow, &endptr, 36 ) == ULONG_MAX ); + TESTCASE( errno == ERANGE ); + TESTCASE( ( endptr - overflow ) == 53 ); + /* same for positive */ + errno = 0; + TESTCASE( strtoul( overflow + 1, &endptr, 36 ) == ULONG_MAX ); + TESTCASE( errno == ERANGE ); + TESTCASE( ( endptr - overflow ) == 53 ); + /* testing skipping of leading whitespace */ + TESTCASE( strtoul( " \n\v\t\f123", NULL, 0 ) == 123 ); + /* testing conversion failure */ + TESTCASE( strtoul( overflow, &endptr, 10 ) == 0 ); + TESTCASE( endptr == overflow ); + endptr = NULL; + TESTCASE( strtoul( overflow, &endptr, 0 ) == 0 ); + TESTCASE( endptr == overflow ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/stdlib/strtoul.d b/user/pdclib/functions/stdlib/strtoul.d new file mode 100644 index 0000000..78e043c --- /dev/null +++ b/user/pdclib/functions/stdlib/strtoul.d @@ -0,0 +1,16 @@ +functions/stdlib/strtoul.d functions/stdlib/strtoul.t: \ + functions/stdlib/strtoul.c includes/limits.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdlib.h \ + includes/stdint.h + +includes/limits.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdlib.h: + +includes/stdint.h: diff --git a/user/pdclib/functions/stdlib/strtoul.o b/user/pdclib/functions/stdlib/strtoul.o new file mode 100644 index 0000000000000000000000000000000000000000..4742f4974bc13099e11e81a13ef0954d2553ce1e GIT binary patch literal 2904 zcma)8U2IfE6h3qB-R`AZwo6+T1a(Okg&_qGwa%~XI5jGRQr|8z>ip!34lG!(cY7B=5h<2<*&^g>k)roHn(u%tRDkh zv9Z0`v7WZo`%P}~$<2OzHh1m%FH~QfIY0c`p@Zi{)GD?#17e{h|>%0Xun7-t9JC*$!&=z5)br@_A_d@OTo|;6WgVFwBPC$i9^(0f#?n` zv#x*`v3B1t%q@!;7RwVyoyM$2F?~fD^jiR8Ik8IJ7u$&)g~oREkvYyV1=aO-0H-v# z6@nG}NkjYu!HJ_BgvGZ2V(M4SDy4o0kjx^KyF6GffwAT#egUXbe`(2ym$bA&ORn22 zit1y8HD6t^i>CfzEgg2JMGXWgN?dv^)Q)onb2mL4XB%eOhhfP>n3eiFxe~L!qPUo9 zqE#>Yl}6ng^!!q_QV{X{rr&5)vsja{G2Jgar9ODx{nDMc%Kh%VyWWZ;3C)}=@g1Ta z@Gg;cTGGNH2XwcV$zR8K6C+%QDp`jSo{N?_nNE?fHtLgUJ@I5(b+0m6FPG93wDxw* z?P|uzt>vO>Q*9ydl{=}6Q~9Ro>E^QDRHNyqmn{|UL;LOCJC+_v4`qk456j?GqgEcI zx>^Bx4R5gJm79apr6PMAWa92k6Uz0{wBHojJuYD2s{5@V*OsA{mLAy@=9Uy1 z!cSF+I_mZ~&WGqd8)%4)dphavJYlVj9h`Aa@;D^xy;Jk^1t1F6IAyqIxtjIMM|{ba z@_t^j1}c^MyjQ{FY?t5@;&*iAGeeR_bNrU2PPjrs-Cpp0AaWtP`GZ=IfJG z1=+9#$rc;6S{c2_)*F5~i#BfY{Cx3nG;E@YM5ey~gZIISR}$}yCcd}P3+04*elIIR zo^Sv!3;TNq2IJ|+JIpW9Tye0Hq7WgIZ!>iC*F6XRm)};{qABS25p;%(Z6_3lr|mNc z{D2G@+jc0Tbxfg-v(T{)_Q2HfGI$dMRzAU3x1UT%#I|ezL?{OqC z=erU%Q^&{P8N+iS?MJ@L0jp=)I6e*0`0YS~jP?j7<99mrGo~UJiV*!s{0%oejGOkLR)q!`wZvatisrCliucix@n(f#C*%(@@?Cu@{5eWuLfa zG~a66tEZqdWbzr=U{vqO)g_}RF8@bFIl2Pn<;}7s77d5peAR*4);F@_Vhc7IAzOHJ zI%Eq^zC*UII4ZM?9kPWT?vRbnn2dZ=`f!5$b76>m+hhbFW%JPESJgcE<1g+S*)zIx zT+2tsr}0QuYI2LVmao(qz8=FuqR)xg9y_4W7XDXL*bH|})bAE>4P_kgJs~n)#YF}~ zzehtH3GulQUkdR+h~ptngs8t` +#include + +#ifndef REGTEST + +#include + +unsigned long long int strtoull( const char * s, char ** endptr, int base ) +{ + unsigned long long int rc; + char sign = '+'; + const char * p = _PDCLIB_strtox_prelim( s, &sign, &base ); + if ( base < 2 || base > 36 ) return 0; + rc = _PDCLIB_strtox_main( &p, (unsigned)base, (uintmax_t)ULLONG_MAX, (uintmax_t)( ULLONG_MAX / base ), (int)( ULLONG_MAX % base ), &sign ); + if ( endptr != NULL ) *endptr = ( p != NULL ) ? (char *) p : (char *) s; + return ( sign == '+' ) ? rc : -rc; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> +#include + +int main( void ) +{ + char * endptr; + /* this, to base 36, overflows even a 256 bit integer */ + char overflow[] = "-ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ_"; + errno = 0; + /* basic functionality */ + TESTCASE( strtoull( "123", NULL, 10 ) == 123 ); + /* proper detecting of default base 10 */ + TESTCASE( strtoull( "123", NULL, 0 ) == 123 ); + /* proper functioning to smaller base */ + TESTCASE( strtoull( "14", NULL, 8 ) == 12 ); + /* proper autodetecting of octal */ + TESTCASE( strtoull( "014", NULL, 0 ) == 12 ); + /* proper autodetecting of hexadecimal, lowercase 'x' */ + TESTCASE( strtoull( "0xFF", NULL, 0 ) == 255 ); + /* proper autodetecting of hexadecimal, uppercase 'X' */ + TESTCASE( strtoull( "0XFF", NULL, 0 ) == 255 ); + /* errno should still be 0 */ + TESTCASE( errno == 0 ); + /* overflowing subject sequence must still return proper endptr */ + TESTCASE( strtoull( overflow, &endptr, 36 ) == ULLONG_MAX ); + TESTCASE( errno == ERANGE ); + TESTCASE( ( endptr - overflow ) == 53 ); + /* same for positive */ + errno = 0; + TESTCASE( strtoull( overflow + 1, &endptr, 36 ) == ULLONG_MAX ); + TESTCASE( errno == ERANGE ); + TESTCASE( ( endptr - overflow ) == 53 ); + /* testing skipping of leading whitespace */ + TESTCASE( strtoull( " \n\v\t\f123", NULL, 0 ) == 123 ); + /* testing conversion failure */ + TESTCASE( strtoull( overflow, &endptr, 10 ) == 0 ); + TESTCASE( endptr == overflow ); + endptr = NULL; + TESTCASE( strtoull( overflow, &endptr, 0 ) == 0 ); + TESTCASE( endptr == overflow ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/stdlib/strtoull.d b/user/pdclib/functions/stdlib/strtoull.d new file mode 100644 index 0000000..9d7a3b9 --- /dev/null +++ b/user/pdclib/functions/stdlib/strtoull.d @@ -0,0 +1,16 @@ +functions/stdlib/strtoull.d functions/stdlib/strtoull.t: \ + functions/stdlib/strtoull.c includes/limits.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdlib.h \ + includes/stdint.h + +includes/limits.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdlib.h: + +includes/stdint.h: diff --git a/user/pdclib/functions/stdlib/strtoull.o b/user/pdclib/functions/stdlib/strtoull.o new file mode 100644 index 0000000000000000000000000000000000000000..1ca652677197906e5377e5f30820045f40f434a2 GIT binary patch literal 2996 zcma)8U2GIp6h3!mwmZ;eyR=m?U|5qyA;^|U^#Ki3%Bn>qD%M~W*4^&5UD=zh5dsA-f z;sY&os--Z!Y|`o|WK^U3OATzKn`Qoi+7zV!Aos@>1)te+@Dd$m~Um8>GgF z;CH4obM2eF(Hg!vc`PPg?^I^)iRM>|LA6~YbtYNYWU`@E0aIU ztzWKn_~zurtuGxqI4h!7s}1p4JBtMsa_s52MxND$8A&!`U3s67Tdw1>aG{?1 z5UbjQlUz*DZz}ZF4bGqF%05$C7&CQ)yNkrLk(UkX&MnjOXg1#3f10mwc{Kl;tg>^Tm$a z3?y!h*XmyKUo!D2nxg;T-oT%`!I_V!#oR~@6vXTvQ>dZbpV6fxj*wdNJmnB$g) zmm4`8-ZokXk?HUM;CdwS4C33Oh2P`w0W!ym=WvCeqSw#x6-h$70~hx*kB63T9c?{J z;BFcrF?^fhWBz~TZADI)f_(3X_)Kiqvb>)V;2UGa7ik9p*dH>GwrG_GkDGK{tD#$~rXu0F^*YtODEU3_XcFJ|iP0R)Qm3 z_q|YEsEc*qhHmzdV+?#rDuI~TG1y_gk3horhkdNVW%~F4I`{CoP)>vIim&RGF>g!G_fZLu+#SliTd z;@pgIZppylH>VrZ*kpo0#&<5W7k~cnLz~SuE44zQw2fM!bcCAuRg&y8y9f6U?aFG$ z(d-01t)Te(LZrV5`_XJ2j z6&2|V@*WOwFu*+lJ{#bH0J8y(2B^OU;BN%>aU$xx6W}Q#4zqsOkoRejcQHWDj`{lj Su^8lB>0d*{%gx_J+W!E+BdBWt literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/string/memchr.c b/user/pdclib/functions/string/memchr.c new file mode 100644 index 0000000..fac5054 --- /dev/null +++ b/user/pdclib/functions/string/memchr.c @@ -0,0 +1,42 @@ +/* $Id$ */ + +/* memchr( const void *, int, size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +void * memchr( const void * s, int c, size_t n ) +{ + const unsigned char * p = (const unsigned char *) s; + while ( n-- ) + { + if ( *p == (unsigned char) c ) + { + return (void *) p; + } + ++p; + } + return NULL; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( memchr( abcde, 'c', 5 ) == &abcde[2] ); + TESTCASE( memchr( abcde, 'a', 1 ) == &abcde[0] ); + TESTCASE( memchr( abcde, 'a', 0 ) == NULL ); + TESTCASE( memchr( abcde, '\0', 5 ) == NULL ); + TESTCASE( memchr( abcde, '\0', 6 ) == &abcde[5] ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/functions/string/memchr.d b/user/pdclib/functions/string/memchr.d new file mode 100644 index 0000000..252de75 --- /dev/null +++ b/user/pdclib/functions/string/memchr.d @@ -0,0 +1,11 @@ +functions/string/memchr.d functions/string/memchr.t: \ + functions/string/memchr.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/memchr.o b/user/pdclib/functions/string/memchr.o new file mode 100644 index 0000000000000000000000000000000000000000..c47f9d02af9ee305c0c7a5b710812d97e9465c36 GIT binary patch literal 2592 zcma)8U1(fI6h3qB-OVPOY?4Mpr3zc!#{mU;z)VSJRnkf3E9i?%#O^xM6yj@Z(9xVC= z5#NXsT=XX@VJV-uWtD6ini=fp2$QQnZqz|0o4FpA6~g9N4- z+JjXT_XuVA1?+)QO1*(meTv}#b8oQfah-i5_4>Ta<<+<`qI1}Duve2qyD3}H5iT^&6O27AVbZ&08yl0~Y3xCK(8o-GUq!OQ6NZETAncIu&0;qVLINKV4!Y&)&ifN3|w zRV$^@GpU5j)wC*MEx~PAj%vNeQngm=MrS1KMlEA$#w#6HZ#Cn{Mz=b3*R|HG#nm?M zlQX^At;P+SvivA7VZGCCM`%kJchV?C@1~QqT0iYhTj?T^-P8ZU9SGvJ!&{??Z<%{* z%o8U&VP~Aa%fL0TOEzvVjJ&V^6*q+#=Cj0nuUG|WeFq(x?!Umi{FZDS*F0#Az(Y{p z2l9+_V6KnrItjLOAj&l;FHtaLeaE4@`Tl^y`OL=`%jR2zZ0A6f2%jMLX36@RFj$$s z%ZR(n201<+o?G{(Qx}hTzwUWw4n%nm`N|Xw*;;3zyZHo3_$_cB!(h9QS0QuGelY1< zc$V%y#+-eO z!)NzF*)4Sw%4e`yvbBiVVxOjXxG>%h7zHyQ`^1`Vz9|@3!;;Nsb&IY&kUwu(J8|p3 z2 + +#ifndef REGTEST + +int memcmp( const void * s1, const void * s2, size_t n ) +{ + const unsigned char * p1 = (const unsigned char *) s1; + const unsigned char * p2 = (const unsigned char *) s2; + while ( n-- ) + { + if ( *p1 != *p2 ) + { + return *p1 - *p2; + } + ++p1; + ++p2; + } + return 0; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + char const xxxxx[] = "xxxxx"; + TESTCASE( memcmp( abcde, abcdx, 5 ) < 0 ); + TESTCASE( memcmp( abcde, abcdx, 4 ) == 0 ); + TESTCASE( memcmp( abcde, xxxxx, 0 ) == 0 ); + TESTCASE( memcmp( xxxxx, abcde, 1 ) > 0 ); + return 0; +} +#endif diff --git a/user/pdclib/functions/string/memcmp.d b/user/pdclib/functions/string/memcmp.d new file mode 100644 index 0000000..f27c223 --- /dev/null +++ b/user/pdclib/functions/string/memcmp.d @@ -0,0 +1,11 @@ +functions/string/memcmp.d functions/string/memcmp.t: \ + functions/string/memcmp.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/memcmp.o b/user/pdclib/functions/string/memcmp.o new file mode 100644 index 0000000000000000000000000000000000000000..6196bcb37389b626d941f26dd411734ba0bd5a60 GIT binary patch literal 2636 zcma)8-HRJl6hC)nvYBmmlWkXv+6pObzo4Dex{6e-+HI`cmLfu-6=hAb(`;xmSu>Mr z)glswE)}r_^}(0^1>%D&B8aW}pbvuLlfDRIMQ9Ne!9@%8_q%g%cIt~Bxc7Iy@4e@q z`FOc{_)(>lSW@E3swDD@ms+MZY?JjeDMy#C46aR_tNKgTm2=gxrRw#oyU$fuO3Tn) zFD=V`pC)%`SxU=ar>fHOrKNASUtap+>c&BJMGdOg)!@v8l-{~D=uD_rFZDn9kPCeI znOdth7bgpDaYJ#fTBjyPM4Txp6!sQeU&J+RQN&v>ZgEfH{=)2}NG?zhjiut&vDryR zK0Kme7|Dt2r(Vt)k^J;cqF+L0#*c2n;%l}DdHEH?!N3~oJ{oF-@8hJN`uQd3qn(O2~(vW|V;N{;S`1v~l9u6YTk57}u5O?w<=A6o7R^w_j zbs)Rw58y}QyI>;coQJS`D0m|g_*2^8=NI8s`dJH$`9*k5q(UOTcLnNE-@67_^B5*M zi{Z#TW~Kfvj$_sxfj&?t`cWfkb)&cvC%snGl%RrhhrOuQjy2zC_vgb{q!V@;oyDNR z?wNah|IFdpeRJ>(7Ff$P7QD;la=N<6A(vQPlWpTdIZq+4T==PHGFxgF+Dd_C0 zTcGN|k)!3A@^mmA+-<_C)jnj*9(AA`n3>sA-gdO!kCJ{GvU9qxrF*uU6f%Jd+yE(2 zFZpAhcNVq2g=I0sNI_?N$_8?{>G5H7)k*QLTff%7oW?wWvu|njgzc(CBtLAr2oz z-6RZ9p`CG3Yn;r6o#-KvJ=6ce4RB)H;k~1YPjI$t%)5h_RLF@M|E_zCP zq?7f#X#A|{PumbiK|j(57?!8J0>5nixIYr_GJB2(GUr$en>`2l>{3%OT!zk)U5kh# z4(S*#7s^`!B@E_cow#N;-!Uk-h9#TN$`-SFPky^$^~9V1I4Ea#LOHu4Wm|o_& zHKVILGAm~*#dvnkD!KaRvob%+tK{mFXXWgPnXfd=$alp$7H;@0Sp6jNoucsYvCmW? zts9XwCh~KpaCANg#7#szToq%#*WiN&_ZvK9@Ck#*4L)PAX|QeZIfDa({2}3b7Yx2l Y#Qi^OWW8@p7TE{%zl}JaerYNH16J-nivR!s literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/string/memcpy.c b/user/pdclib/functions/string/memcpy.c new file mode 100644 index 0000000..dcdb49f --- /dev/null +++ b/user/pdclib/functions/string/memcpy.c @@ -0,0 +1,40 @@ +/* $Id$ */ + +/* memcpy( void *, const void *, size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +void * memcpy( void * _PDCLIB_restrict s1, const void * _PDCLIB_restrict s2, size_t n ) +{ + char * dest = (char *) s1; + const char * src = (const char *) s2; + while ( n-- ) + { + *dest++ = *src++; + } + return s1; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + char s[] = "xxxxxxxxxxx"; + TESTCASE( memcpy( s, abcde, 6 ) == s ); + TESTCASE( s[4] == 'e' ); + TESTCASE( s[5] == '\0' ); + TESTCASE( memcpy( s + 5, abcde, 5 ) == s + 5 ); + TESTCASE( s[9] == 'e' ); + TESTCASE( s[10] == 'x' ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/string/memcpy.d b/user/pdclib/functions/string/memcpy.d new file mode 100644 index 0000000..e1e8c7e --- /dev/null +++ b/user/pdclib/functions/string/memcpy.d @@ -0,0 +1,11 @@ +functions/string/memcpy.d functions/string/memcpy.t: \ + functions/string/memcpy.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/memcpy.o b/user/pdclib/functions/string/memcpy.o new file mode 100644 index 0000000000000000000000000000000000000000..cc7b34df47e5d7ff5e8b883b2b7476101e49cd11 GIT binary patch literal 2644 zcma)8&x;&I6n@p+v(vjXJ3Gm0P@*t_HHnb)L|r{37-KeL*bssq7J`>$X0~^BaHeN7 z-6KX4MAl%|co7s8MEnChc#z=Dh^OEwde1=+BMK^_EVvNAuexfsA_zXH`rfa4uixvc z>VB}5^biCw; zBEDfOBEbx_i?bqyJ>pl6mX2v*B2v$kbMZiVah4%YOelC23*v{lmp3I6&W{&SoP_9D zrx;tLv>!#4_Y1Sg7KW#b4AiGURm8NU6(YwBdO@L^Wa0;fo6z`S;bTA$oS>j4KFr}; z4dH2mSNKvxF(U-Uw+UhK2%xYJllOg_EQa{A7cft#FEFcV^&@p4o0@VleGDdY-a8N; zhwzgYf?@*xlIFwkO`w`Ns-^YGbl4VE{Y^`mOa(#kEBI0n`~@hVz$C9@c(Q_7slO}J znDvgpK2WQpq@8sKNm@^{VK?bWR7VHmVbbiSns4_;D{(5)kNfTQixF~(EI)s0;q2nc zWq3ww>}tLiyw7w6-DiJVbvm6R;h{TEdmd8K!pV~?Akr0lNMsW{8DWRy^q`i>Z)33D zJUun?5Qce^TIOWCNIvbp8ZT$^@5<`q3hd(>$KD|6)bun;(rzb-S8Ch@W1+p)97=s{ z(2wh6dtG2UNb93C9@f`a+P!W|(zU@btBsd%J-X%up+*PV$wt-bb4#^_+I%!0Jz-1C zL(!;R$(X0o>*e&q!qM8nrPe6PM)}Ia^CK-i`KXD6CR8!*f|RIBVL1q{qUHCoJBHY> zXDi{!E8cWLqV!@vYqo&dFvm5^W$`PSL@Uj#DN!rMmRN~fqt0@()f&bxOEipoM$=7J z2d>=fCb9MI4ce}0ebh>teQYXcd2`rII#lKHkzS(qpx=*Cev}NdI6|uqr&+W8lDlkm zh(NZc|ATws#NCH`NfYlqck`I*Q1(G@cPSm$IXPtg4nW6kt2aLIzx)ot#(0+K$NR*R zwH=4T^0ZAt;2E%FZ9M&xRtfAu;LXB!%)=JrHAgT=e<0rNoYgaJ9Pb;nez)+V=d?#YS-($=pEdnyH-u5p zkMuc)@`J=3w{=I!iVe5haf4JYO!9_XB1y7>|8o zPB-3pD44^Njb~+xu0D|8?^-?a-aih??vqe + +#ifndef REGTEST + +void * memmove( void * s1, const void * s2, size_t n ) +{ + char * dest = (char *) s1; + const char * src = (const char *) s2; + if ( dest <= src ) + { + while ( n-- ) + { + *dest++ = *src++; + } + } + else + { + src += n; + dest += n; + while ( n-- ) + { + *--dest = *--src; + } + } + return s1; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + char s[] = "xxxxabcde"; + TESTCASE( memmove( s, s + 4, 5 ) == s ); + TESTCASE( s[0] == 'a' ); + TESTCASE( s[4] == 'e' ); + TESTCASE( s[5] == 'b' ); + TESTCASE( memmove( s + 4, s, 5 ) == s + 4 ); + TESTCASE( s[4] == 'a' ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/string/memmove.d b/user/pdclib/functions/string/memmove.d new file mode 100644 index 0000000..6e3434c --- /dev/null +++ b/user/pdclib/functions/string/memmove.d @@ -0,0 +1,11 @@ +functions/string/memmove.d functions/string/memmove.t: \ + functions/string/memmove.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/memmove.o b/user/pdclib/functions/string/memmove.o new file mode 100644 index 0000000000000000000000000000000000000000..3c1c1f3127a36f8ca52e15430f33dcf24091c571 GIT binary patch literal 2716 zcma)8Ply{;82{ePWHW8D*|gE(T9p)PTcJ%>-3qp}Zo5WlDMb$j@v zY4NZXyKWH$iwYi!7cU+>RPos2NqX?&Sws*i71WC?bfNx!Z{FLy3W6WJ_xpbD`#0~K zH!pd+aq0!7lvq*X%b1DGX2q1 zsPdnhrLr{$fmOg0B#@gJk+KKCr{FV$Pnluk=^iQ#C~ac7_&|$8_?dxFwdc_k8D~4%{keAQn$WI z_pN9l-F#|8dxN-B)zc_Wx}7*$tn%e=lJ;_QDD~w*KdMvhb%DtssgIIqSUU?#!Hd}kzr01&kp<lru8g&+$t=2F)C$(YJGb`PAY2fl+H;$}#Z_sv4XGg8L z*~bBM!kfcp+~HD|ALXUi9`ySWwqJ_}X;edx4kT%_{hAxLG(;l1r~iXH;lu-oJ4y@h zPxtuPL$wR*_Mp=7OHPhhzr9$~U%IjVm*0Nana>LSKD7jBZATrQ<^~M>46Il`-UM6h zBJeuMw?MvQ{xtCU_*|zkYz$O6hA-=VDn_jBB)FTe#|sy0%$LWo`Cf%?W1z|p$j7}| zv9>N2tWMiq`0<9cVr_hRZr#+W3w5*ZMd&t$Ii_)QRH+!Tw)5a_z6(ggZ-M(LV%U9L zfzFs249c^}_p{cri8hXp4O+ixB-ov~=-K*RGk(@|goPZTALTlR)ye1J=l0KreFdAl zk1NhTw!ua}z8~tmM6L8-xM>N{)*@z?YG%B~U@Sfe;Exvbu}`e&=DUUk{*+p=`7F2S zt_SkhJ-bf4|DOxF`y}LUMRMDPEQ_yC^f;rhPo&G;PBES*XDq&c^Df7K5l4Kz^YMbO zyXtcMw=k4<#dbDse8byc9DS!Ke0)4-3ITjKME00CO~lq8HMon2kE?F%&lsFHc+%j@ z2469_U~tJ`-{8=o{#H + +#ifndef REGTEST + +void * memset( void * s, int c, size_t n ) +{ + unsigned char * p = (unsigned char *) s; + while ( n-- ) + { + *p++ = (unsigned char) c; + } + return s; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + char s[] = "xxxxxxxxx"; + TESTCASE( memset( s, 'o', 10 ) == s ); + TESTCASE( s[9] == 'o' ); + TESTCASE( memset( s, '_', 0 ) == s ); + TESTCASE( s[0] == 'o' ); + TESTCASE( memset( s, '_', 1 ) == s ); + TESTCASE( s[0] == '_' ); + TESTCASE( s[1] == 'o' ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/string/memset.d b/user/pdclib/functions/string/memset.d new file mode 100644 index 0000000..658b942 --- /dev/null +++ b/user/pdclib/functions/string/memset.d @@ -0,0 +1,11 @@ +functions/string/memset.d functions/string/memset.t: \ + functions/string/memset.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/memset.o b/user/pdclib/functions/string/memset.o new file mode 100644 index 0000000000000000000000000000000000000000..2a8afd9dae8f835e72e20ff96f0080ffb5e4d1c6 GIT binary patch literal 2552 zcma)8U5Hyn6h4!C^Rs3*o9*gSsX_`Zt>E4ij6Q7Hs@=xAT8apLP>?l0ceA0%&6;~t ztyq^5EnQXwrRr-z@xdoSpM0_Ei#}PQ5B0So6!gVs7wY#-W|CQ7^uWw_zB6aenK?6e zlCA2QXOvQ6MTsX9CUVUmjZ`!ol?9oXbKAcU|19oQbKBM3KMFh5>Fw`#s=HTmGuqI&1X;5Rt^^n;pHhYRz0uW+C+r}n90MkIAe^7#{aFDK#|wIJdzh*wz3 zAJ4DOi=+efde%%?I61DUjVxsg}uK9Ou?56#UYvd9#HVdNHCO0V8m*MRC< zbjP(p`US1$vYVo2f6;m(Ie*H37P@TF zAWig2{au(rua6Ojr`88iBWd@dxEv?_cGQxfjNOI(sMd+K-slXPVJy-OyK$HV$Sbn; z!l{)rt0&js8Emj(qq)#Mrc3J@dNZokI(F;saw>&{w6jY|;uGlzJxAmwQ!>B-kK{qk zsozGsj5bP6i#&v8&Pa21wo26F_M72aGG3ygonF)`>246k?N$^vOFYCeX>8Q`Qr_rw z!!p%Q8yNTE@*ocT<;`ZJ)2>Ur(d#Fr@f6NC>)K<}p(gq0cKYnO(n_fkRD#D$6k4?p z6|*2c@!#iB9@kw?udFPUj-IOzqGT`%wpbZx_V^=;Ws zTJO2M(~d&x-RU*lq0K=(s&#RfoawcGEo#v;ijVXXGJ=-pdmo-R2EJN@)M2J)M6#rhqAk@xk#{2ql5<5^+6w=DtM zu@jEY;X7!&{8p^r5)4z;2;2|yC6H&FM&tUpuCr)%4pjLDWJtw`9eWPkjrSu6=QAE( zC>xItn4JSvmhlO4Z&vJB8wRU$tPQ`1t&=mx!*lcAbn@b%9_PK}%z-Lb5U)hVh|P5o z+>Lh|gx>=9F^y*T@g8)}v1k7|;{6J4g=1`=7_@#{IOs#x$&AtOy3qkzKD8IZaQaZb zMzcEkXYh0D$MsQomhL|8I{TQznB50;H`Ps$?_jfHa}lw{vG_b(7#{%4qA?!p#GGzC z9|q>IV&hqE(Y5>X*F9?|?)`T_?yiK~%}8#mFpA>o8$F5W=^N>Cw^E$Xn==tlpS;WQ zzrhht?|fqL_UxGPX2%hE5B9Nelw$AT>c#w#X zt8B)fFt}{+l)>i>zG(0zgRdHF8SEH*-QdvR`$XjX(BQ{Jod0Wv>vf~E$a_Hl{luBk HFD>~$eDfkT literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/string/strcat.c b/user/pdclib/functions/string/strcat.c new file mode 100644 index 0000000..bb7db50 --- /dev/null +++ b/user/pdclib/functions/string/strcat.c @@ -0,0 +1,46 @@ +/* $Id$ */ + +/* strcat( char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +char * strcat( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2 ) +{ + char * rc = s1; + if ( *s1 ) + { + while ( *++s1 ); + } + while ( (*s1++ = *s2++) ); + return rc; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + char s[] = "xx\0xxxxxx"; + TESTCASE( strcat( s, abcde ) == s ); + TESTCASE( s[2] == 'a' ); + TESTCASE( s[6] == 'e' ); + TESTCASE( s[7] == '\0' ); + TESTCASE( s[8] == 'x' ); + s[0] = '\0'; + TESTCASE( strcat( s, abcdx ) == s ); + TESTCASE( s[4] == 'x' ); + TESTCASE( s[5] == '\0' ); + TESTCASE( strcat( s, "\0" ) == s ); + TESTCASE( s[5] == '\0' ); + TESTCASE( s[6] == 'e' ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/string/strcat.d b/user/pdclib/functions/string/strcat.d new file mode 100644 index 0000000..e1b296b --- /dev/null +++ b/user/pdclib/functions/string/strcat.d @@ -0,0 +1,11 @@ +functions/string/strcat.d functions/string/strcat.t: \ + functions/string/strcat.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/strcat.o b/user/pdclib/functions/string/strcat.o new file mode 100644 index 0000000000000000000000000000000000000000..76de4db477fdc05eff36642c21cc1fd790e8c5ce GIT binary patch literal 2456 zcma)8OK%%h6h3!moDA5plbWXrl8aheBx(l;EP`4Bsi^|A5)u)J1(oeg9IN&?cxF&5 z@rX!4DPdCy#0n`}c1T27Ar$Ba{sAj??AVkomCEV(+qF+8Rxv?39RiQi{d%ML!hrjaU{5DzL6p zMGAHGQpqnb7GEr$F0E9VwKS#Rm@0@L(!5gj?iZO}IHHD63bW-W3{N)`sE>i_JFrvQ zAo99FFDUflRQ#au6)b*O*aQT@5*0OdHHU9Cgbx$E!WSB*FA#$1_Xy!MxD?de;A%!K zQUlpZ4j@k@&%i~GcMHn1P-ymU1=FLBs7mfhG53!!hf82`3B!|laHak!&w%Uw!>+0I zEbgSeVVpFQbkvKxBEU{7t)muG3%YZEMs>S;zk5$q&v_ow=^^tZ4Tyd&heUp?CmHr4 zr$@C;`4^1$G4dH`k;gF1+G?H5c1yWGjJq|>vN-8=<7lnMWgaV?jn+sS8^b}=pxEyL zlVQ@xl4#V}Tw)IrC+di_6Q4wKJ>jEKak$*x7|lYtKJriqE3edmtt1!>|+tJ6O~Q*uNnz$;;*N zmCwAHg4C1igS6EKrlTA;tdvIAQmL=C(w5ZQNdhryXWc8Uc6$_kAoWqyH{GaL*eEKfZircoVBcQ#2|ovUuz`Ur(= zPyYvxBZ%hpFC|-Zdz^3+$tWVf*+JGIRKZkp`%DI~O&lkK-GIHf|mpeNso{%*O4RIO}@L9tdM# z9BCiJ%G4R>t{=aT^gV{#$Bxs-9DKG9%I;KKP=1EZlAVi)7RR*DO@;A6Km~*KxK5nY zt+$Uuz&R}0dRDjS+5@?B&)SJcf6b}8UqaoTk-A-lyo#?+^rWJ%Po%56E5&@CoC*1Q z=UpAYjnn~6NCCM1?qoF9r!sB`*_ai`a8iaa^D&E2yrI= H38nroF!u`u literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/string/strchr.c b/user/pdclib/functions/string/strchr.c new file mode 100644 index 0000000..826d687 --- /dev/null +++ b/user/pdclib/functions/string/strchr.c @@ -0,0 +1,40 @@ +/* $Id$ */ + +/* strchr( const char *, int ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +char * strchr( const char * s, int c ) +{ + do + { + if ( *s == (char) c ) + { + return (char *) s; + } + } while ( *s++ ); + return NULL; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + char abccd[] = "abccd"; + TESTCASE( strchr( abccd, 'x' ) == NULL ); + TESTCASE( strchr( abccd, 'a' ) == &abccd[0] ); + TESTCASE( strchr( abccd, 'd' ) == &abccd[4] ); + TESTCASE( strchr( abccd, '\0' ) == &abccd[5] ); + TESTCASE( strchr( abccd, 'c' ) == &abccd[2] ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/string/strchr.d b/user/pdclib/functions/string/strchr.d new file mode 100644 index 0000000..2b9beb1 --- /dev/null +++ b/user/pdclib/functions/string/strchr.d @@ -0,0 +1,11 @@ +functions/string/strchr.d functions/string/strchr.t: \ + functions/string/strchr.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/strchr.o b/user/pdclib/functions/string/strchr.o new file mode 100644 index 0000000000000000000000000000000000000000..baa5a1e0a3af8e4ac98422cc2da886fcc7696261 GIT binary patch literal 2396 zcma)8&x;&I6n@n|W?E-wb~mfC5|s($myq-*t|F@@tLqvzhDZ(z8qhE^+dDgCre~e* zmR;}%XcRTM2#O~mH}N0}ig;WNi1;sf_T)*(%|raY>Z+MqLGVG<_r6!}y{dXu)idv` zU3ft$C03O9GG!uBP>w8VI4SqZf^2;B$Mv;n_J_IaYco&&T!bKhE^3Qh+n@bx|Gl+H zUE42y|B*4T-V!yhjx`o)e&cXsUL8_%6%p^K)M{sHek9@>wILGB!n(d762|K6jNe$U zJykm~v%bKnm5RbZB@{oRd40jVTcmni=q}%&d7MoG^)`C-6}nU8kX8xe1z|tU#Sg+y zVezAI2M`1+B&u??gfBEi4-vfZV-3|82|@KWLR75+LR}+OSIZz2JIR;OE19S|74H+N zbfF*9dVtBkhE`ocC(P-|Bj}a-yHQ84PXT$=R*`n|{wU2_Sw8NkJrQ7cdmJMdLqok) zzpl>yb~$Rj;&}+Bot-CnK=eyJB64k>6sUD6_iIl5JG9r)%KWs*18Am{nzOT;qi$RW zqqNu5U6E$}UYcw+S=i8t2VP$bong zontx?P3JCdG*_ET@lyPl38z*2P%$gff&Z=|i&+*?&aJL4H&1SKiZn0EWT%%3%^rW) zB%i}p??9BOH=~&#_z*?Chx<3el04gpo_pV`hZ1Ld!@S)A=Hn8#t(GUdxx}08ye)Aj z%b+HmqIad;>5P*%BpxRNW9g?`BbN{QX=1$xqpmx&Q*_eyFhR0uczfJVdo-2#F}=jy z(QufcDsei>lNhBto#pNBRX1#Fj6`-%{|67liT4X{SPQ=k?)5OA3poP2y@zz%Wao(W zI{_OnChsZbzx?=^na>LSI+g(K*cnIX@Goe*$-?$ zW1z|&$V*g=*s=5AZoX3>jAyqsVuwRCUiWw$BY( zzuWLTsy)ii`rR~sc4*OF2xFih<$E-%lhe8 zKHf7`E9*vNjfwo-QrJ4*0r3bC=fIpCf5PCZLB2`aFByE<;1z>g28RYSgZdu?^1n+C a{D6pae8zCSPIMM|?(|zE*2|wz@_zuncK0^` literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/string/strcmp.c b/user/pdclib/functions/string/strcmp.c new file mode 100644 index 0000000..42ed51c --- /dev/null +++ b/user/pdclib/functions/string/strcmp.c @@ -0,0 +1,39 @@ +/* $Id$ */ + +/* strcmp( const char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +int strcmp( const char * s1, const char * s2 ) +{ + while ( ( *s1 ) && ( *s1 == *s2 ) ) + { + ++s1; + ++s2; + } + return ( *s1 - *s2 ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + char cmpabcde[] = "abcde"; + char empty[] = ""; + TESTCASE( strcmp( abcde, cmpabcde ) == 0 ); + TESTCASE( strcmp( abcde, abcdx ) < 0 ); + TESTCASE( strcmp( abcdx, abcde ) > 0 ); + TESTCASE( strcmp( empty, abcde ) < 0 ); + TESTCASE( strcmp( abcde, empty ) > 0 ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/string/strcmp.d b/user/pdclib/functions/string/strcmp.d new file mode 100644 index 0000000..01a5366 --- /dev/null +++ b/user/pdclib/functions/string/strcmp.d @@ -0,0 +1,11 @@ +functions/string/strcmp.d functions/string/strcmp.t: \ + functions/string/strcmp.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/strcmp.o b/user/pdclib/functions/string/strcmp.o new file mode 100644 index 0000000000000000000000000000000000000000..c0fe9db6a9b73f2e12521b79b138940b03aec2ab GIT binary patch literal 2416 zcmah~O>7%Q6n^7f+YA0nYCu4Xb2 zrNojFPo|Q{0Y9_MX*eqPNnKXA|N1-FS_;(GQdxbr6x4o}kFKXPn!{X%{M4`MpP8k0 z?e|PoyLNs1k7GBse|z&La;aH$xLPlH)&133wNK3yL~@6uR60}g0uj%!RS`c_XUkr7 zzVvkINO`4B=W_*B7s=Fn zi&OFZ{P)m!LH<*MD!iY;FB*bVgk1g`4aK(ze(@bbP<#;Jt1Zl`q7DN{HvQM&^T{cg z$mKqV@YqD~rQm-Hb#We(yhH~%iCL+Cs};=pRIqEcK8`zSZx|=dBpvnQt_ZL**bF;a zQF&daS5c==o?i~W2*$Y_!kLs)PEw!fWqd$f(EJ#k&gcOxlm7wZ5=OQHHF5yMG*Zi) zn84Eix5r&(yXz0*ZbMJwIO%ocXsy9+PlV1!Yb4E$;UH>~?e~DmFlmmHXw=+X>-2kV zNj8R~v@r?U6Hh_sFuR?uN6Yes)y86DE}RP=H(99FK4i>>bi6DtF3vZOuC~W>wABWtqYO7JmqwRU z3D;U_OTu=NfQ{PY?%S<)dlbDZ;V9}GO)p*_x^ll4N7lPP?6{`QaXW4eA|#uJw??hF zOI4O1%S+f94h9jb5947Pg=o=ku>pt(SiW7s-&z%z!A7-_ec5>!>!|@Q^zc9whr>{ zQm;X{0i7kg77-;*XorUi<-LF!2J^8`T+_|BgG<0QEZKZkw&?18`RBIP6Zih5DZ4wN z?5;@Jb|K5+=^H)G=;<5j%5J9^&zmzPPoKOi<6rHNrz@W-ygd~&Uu}|c0dD))xa=9n zZ!KdO%{N8i?cb3KgYHI-2eap literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/string/strcoll.c b/user/pdclib/functions/string/strcoll.c new file mode 100644 index 0000000..58814d6 --- /dev/null +++ b/user/pdclib/functions/string/strcoll.c @@ -0,0 +1,35 @@ +/* $Id$ */ + +/* strcoll( const char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +/* TODO: Dummy function, PDCLib does not support locales yet. */ +int strcoll( const char * s1, const char * s2 ) +{ + return strcmp( s1, s2 ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + char cmpabcde[] = "abcde"; + char empty[] = ""; + TESTCASE( strcmp( abcde, cmpabcde ) == 0 ); + TESTCASE( strcmp( abcde, abcdx ) < 0 ); + TESTCASE( strcmp( abcdx, abcde ) > 0 ); + TESTCASE( strcmp( empty, abcde ) < 0 ); + TESTCASE( strcmp( abcde, empty ) > 0 ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/string/strcoll.d b/user/pdclib/functions/string/strcoll.d new file mode 100644 index 0000000..cca7328 --- /dev/null +++ b/user/pdclib/functions/string/strcoll.d @@ -0,0 +1,11 @@ +functions/string/strcoll.d functions/string/strcoll.t: \ + functions/string/strcoll.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/strcoll.o b/user/pdclib/functions/string/strcoll.o new file mode 100644 index 0000000000000000000000000000000000000000..b99981ec045319e7fe1fae235c83ab2c06163441 GIT binary patch literal 2452 zcma)7&5ImG6o1tpGp#e*$?is7jUN-(XhgRs(bdC>QM1{E#TZ1`gBRn>Z13!lnVx03 zN1{YjRCI}lc-2cl5kycC4+`GYga3lyQSji!TR>s_{i>^GD!J%`s^9yrdatXx-q<*I zMkythl=w1}M6Ua#WmUs5xkC=g*8cBr|G9K!qrQK7Ik>VB?FY+${4<$Me)&;E&8wsF zV$F{a$Mb4I9ju6W%TlYItof0MZ`fEQNYqnxKVGXnQG1}ixk%@yD{4_B48@PA-dyx< z6{#FR^d|Jx`-LE1V0d~rf%*ujE?`>G3X!`EdO_IB3h{&RYiRr^{D7b;@0IYqhUh+m z7k;LpdX5lOUn4|S>{bHZ2^FiO5J)!tC*Z^Ugs7OD_aTHwra~Z<;B%;}YnWt{4srss zQh&#Dn02?2S?!FoPSG1?c{49Yy{sz&>6UH z?r@Mc$@Y7|e3&=Kc{*zDZFl;;w&c6RQPG%&F#hJ!*#T4e4SqWPY!3`Qdw#32-dIgm zlSfTvYPAm;vq>E&XV=%)8ppQU-L>>Yp~gM z-*RHW%5@}YkTGQQy$;#US3uysVPEDjY`&}D8N=^FTEb7}=aSVkZ5$sPw0^(AZ&`bk zllA-5_*s*(2f`@mNBR!K@{|Mkx&7n*NZ(?(b-d%$u>hN`V;;P_)Nu$m*8vy3CbmAM zt5x&`8@U~t0~pN5K5hwGGFeIS2LrUo!KzSNZ66)4-P%P3z$Hyn0* ztF4_Uaz?)3{dLF}o}3x^`pdgAE1r=r?Ba}kVTWhrqcb)md$E9S@`bm=zS)NePojAu zG!FJ);y>Dh6RS`ttxiNju1eJZ9^jpn@saK^c!Y@W)HHsN8+_8>X@k!i)OQ_uUNrK{ p2Jv9)b@ZKt{SsxYbJ^gVM6{Iu6zcUpF + +#ifndef REGTEST + +char * strcpy( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2 ) +{ + char * rc = s1; + while ( ( *s1++ = *s2++ ) ); + return rc; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + char s[] = "xxxxx"; + TESTCASE( strcpy( s, "" ) == s ); + TESTCASE( s[0] == '\0' ); + TESTCASE( s[1] == 'x' ); + TESTCASE( strcpy( s, abcde ) == s ); + TESTCASE( s[0] == 'a' ); + TESTCASE( s[4] == 'e' ); + TESTCASE( s[5] == '\0' ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/string/strcpy.d b/user/pdclib/functions/string/strcpy.d new file mode 100644 index 0000000..2b43e1d --- /dev/null +++ b/user/pdclib/functions/string/strcpy.d @@ -0,0 +1,11 @@ +functions/string/strcpy.d functions/string/strcpy.t: \ + functions/string/strcpy.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/strcpy.o b/user/pdclib/functions/string/strcpy.o new file mode 100644 index 0000000000000000000000000000000000000000..45aff15953a3369feac18b6695c227901ea1bb5d GIT binary patch literal 2432 zcma)8&u<$=6n?Y2P8RIgNeuy1kX+Q#BDHHEfkU7r5Sc1~3J682I8bb7V_UV?!MjF8 z;)g^EY6+K0AP)4w(l{l5F>{9Yrx*0{6RC{^~UUu9R>mn#RAuMTz_ zq1tVf)RlwrZ+ne9zuXqJpiY#lMZbKsyr7P#`56)KxD<=$ihd~K8?`JFRA61NiWDOC ze914b6rU}gEUi}=wK}8Vm??-K(!5^v?iHC`K19REgwgUNnx_{XsE>f^OLV8TL1f9G z7ZiF)CVo)(78XA&Yy*N|l|;>4&f$9v;R6J(@VSQBR|vuE+k|iyy%f|5^lDD6kU{Ju z`_O07C*h*UyAJXc2+iL0V0P3NRmnXW=KcZZa21_!3QwLuuhie=IrRFRa5`#hoV2sv zFiGoaHtHoE5ny|JCqgcU7WB^jIo0WSk5j^+@vRGm`J zudS`rPHnWtNjA=tomn1h_VnW>xyU>=dl#ZaeGry{;3~>`A1h#lMR}ndzWAv(SCA;( z8Dz~CFdOCAwOSUxpGmaY%$gFl(iCdk8h0)=Tdh(2odpH=x*nN}?vp7QW&ZJqhec27$8X=M0)BnMv7{nWf zZ(IxC4)=nXCq<6IZf_z7cG)>%$DM?YSCcoD@?Yclbu*t8j^o|6VtwaeusVIeqVb+v zu|9s3_gEwF78Y?6$TKdWaeZ9Z1vDE2RlWgvjfxTLdl}r#_c{pUnU7D1&G!~`8v|AT z0I@F@x%KrNo%Th1m5)#{V#o3D+<7lL^Wp)W%=;m98^aV!$XBCc#QJu?-F)wW@LS+M zN@#W;UqELJpD@as$agzebx$AL*9PslMI7{TJtFVyxSM92b*U2NN%f;XYuuoo@Vs*jdZzNDaP~WOvTqH?{fT>JL2n| zPYwQ|9W!5Ll96x45f*OpNaqTp`KBm*e7t9>nAeTS8WZ`;rLc8=2gGAUoI~CCpE0;* ykl!TZ-Y|I4;3b1w1_uUHgZeK8@_#}O{EUcmJZrdKCpwEfcaD3IIG6v3lK%sCasR{s literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/string/strcspn.c b/user/pdclib/functions/string/strcspn.c new file mode 100644 index 0000000..5239d26 --- /dev/null +++ b/user/pdclib/functions/string/strcspn.c @@ -0,0 +1,50 @@ +/* $Id$ */ + +/* strcspn( const char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +size_t strcspn( const char * s1, const char * s2 ) +{ + size_t len = 0; + const char * p; + while ( s1[len] ) + { + p = s2; + while ( *p ) + { + if ( s1[len] == *p++ ) + { + return len; + } + } + ++len; + } + return len; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( strcspn( abcde, "x" ) == 5 ); + TESTCASE( strcspn( abcde, "xyz" ) == 5 ); + TESTCASE( strcspn( abcde, "zyx" ) == 5 ); + TESTCASE( strcspn( abcdx, "x" ) == 4 ); + TESTCASE( strcspn( abcdx, "xyz" ) == 4 ); + TESTCASE( strcspn( abcdx, "zyx" ) == 4 ); + TESTCASE( strcspn( abcde, "a" ) == 0 ); + TESTCASE( strcspn( abcde, "abc" ) == 0 ); + TESTCASE( strcspn( abcde, "cba" ) == 0 ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/string/strcspn.d b/user/pdclib/functions/string/strcspn.d new file mode 100644 index 0000000..f84076e --- /dev/null +++ b/user/pdclib/functions/string/strcspn.d @@ -0,0 +1,11 @@ +functions/string/strcspn.d functions/string/strcspn.t: \ + functions/string/strcspn.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/strcspn.o b/user/pdclib/functions/string/strcspn.o new file mode 100644 index 0000000000000000000000000000000000000000..5e6559ae33ee4c73fa8be59aeb7c70b559517d04 GIT binary patch literal 2620 zcma)8O>7%Q6n?Y2jveeczeGR_a-=|u)UFEzgi^IYQ`4qY6++|y0)p*q9IMVc@~#6# zKm{p+5UN}@ahaU;`3YQ`dNJvPaaw(@sR4U)MJ7Z6|z>{Xa_dhf5&5nJx za`H)~lo(RtN?#JW>ZO*M1oq0LjLX9L-!}dn`M$D4-L=`xO5uFv#=(ZqV`Bp@Ys(Xv$dAGQ$ zII70f$bg75E&2T6yqgnoHCq(%CdDnz<`3rQ$3-%}daRI&dkXX8jC_1R!7z{!HmpScWETAq{6O>oOyryk z5FYFaUbYp4qJ|mdTv*Gli5f}WV##?wK|45$N#3Vj0?bPNT^z!kbRRue%iXXZH``%U zj^a);Y=~dRA%jj>ZAA%RZ*`Y~NCf73v=;hxUX{hCkItQ(Ke7l{e}$DxgTcF8FO$^L z9a4?;1C0Z@tIvMvuAguVe;slhtW6J2j>I03A>eaF9@~*FTAtEfiA??%jJGiKKB$u2 z7`knV%*hmveAIj`Sd4qS)ncn1HcH9V4Wniw43Cecc}6PJ1+j5iy*MVaL4FG#;*rxr?cr5S(5e@LgHHt|W)q&rFi|J@w+ zNH;-_&CSi0_Ab=AVcbo#?Vsr;(!=-b>?0__O^_1xdamGk@1fcgtcxa=>WO0R$UDwZ zM*Qf^YFw=W<4%ezhKqw&WAT@&aaH_Ugln-B)VhtuYOU4@*2V7xEv;#W%WYe3HN(Jo zx7u~vwAQVK)m2<9E4Kz;nM9S1&Yw?B%j_0x9PatDdbnf?#% zf)g(u-k5~=&e_*SKYua>J^hk94ZMh9lkwXFC2#D1`R#)b^BH2kH;n)^w!;=r^B4@g z{)UVnzwJSz1ik>_DQSIgw%qh?~j z%2|AaJewh7YeHdo+AhKG9^+)$*gSjP32R-jy>;KPV!+B3jt{^y<^Tri59H%7fg##BKGSIYzC)v@jgz*~?{m!q68ha-2rbixbQ#0&l<8;J zkNYFBm-adKS?3sq&76b0z0?E@UqffetVP5Tdvu)5h4Oa5Fb4CnPF&N@cN~gw=nR>B zMmA{cJ-L3<=!v)f!=P;MgtEONWmAPTi<{i&envOBk+y7Cit)TTeR7k|+cN%3SmY)r z?<-tkRr}cE(lYfQY8h@;=Faf*nKtE}yhXgs9x zsK%!>KBMtDjW26#Xl!YGMdOA>e(zlOV~w8@(f^K?`4%cn26+$Ye+O|W{i&t=57lZw AGynhq literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/string/strlen.c b/user/pdclib/functions/string/strlen.c new file mode 100644 index 0000000..c9ac465 --- /dev/null +++ b/user/pdclib/functions/string/strlen.c @@ -0,0 +1,34 @@ +/* $Id$ */ + +/* strlen( const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +size_t strlen( const char * s ) +{ + size_t rc = 0; + while ( s[rc] ) + { + ++rc; + } + return rc; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( strlen( abcde ) == 5 ); + TESTCASE( strlen( "" ) == 0 ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/string/strlen.d b/user/pdclib/functions/string/strlen.d new file mode 100644 index 0000000..81adbcd --- /dev/null +++ b/user/pdclib/functions/string/strlen.d @@ -0,0 +1,11 @@ +functions/string/strlen.d functions/string/strlen.t: \ + functions/string/strlen.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/strlen.o b/user/pdclib/functions/string/strlen.o new file mode 100644 index 0000000000000000000000000000000000000000..8a36741d4f382d1884b8b9f0ccaa3863ddda1d60 GIT binary patch literal 2524 zcmai0-D_M$6hCwC-R#Cqc9TYfQiTmv8^PW!7=4JeYSLJvwTO@hMTz@yvst^jTld~u zTTx4iAJwW*5q*XPN{J;UzKkT1vq5fI&@eBvG9zp6{<(d9>Zg@m>i!D0S9aB=8>RnUQp=9 zsrW(Rb7=fh;cbE%yO6`L8cN)}?-j0SC^iT|F(s6WcL9PTChw0I$YO{;a|&}o&0I`)tTl5?7V+kx|yvtG?v_w_ue4zq!%cQ4j|K0uTtWBC zpH!Xf@Z%T*{QnGi6nU@B8g)uJzP!9xn_p{Y zahm1H4lQI_df;A@T&B>08z3d>wbDcoTtu&L)ji55cIweeY3VI*vLIn{ZYymxf$1Q} zP0OXx*;K-IBW+07OmGw0Q8VkTH=4~sbVkBK)H9lHywP{%UN?@ccdy@aO{cSF+}Ofh za>5&fM%Q{WJ>EyF*FZXq|GyHU>!KZ0n}%et7WO;qB1GPtmenOdH3i2CZKU2Yo<$9eW{+f_|hO49io#2tT)fTpx*N>F(nf zXCKqB*?o|AOYK1T9y&|577<$<(ls6`l(zw@7|h2$v8J2v8ZH5AShD%7Y|+&R^7jp^ zC+__RK-pahWw#<_+l4%fuW$4yqpxqIE4!UyJa5j3e0}n+jQo=Owd{Y!YKHf7`&ih7WkBR&_Q`kDc1L7PJ=TJBH2Mr!Ec+B9F2A?tb tticxzb`16mzG86O;D + +#ifndef REGTEST + +char * strncat( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2, size_t n ) +{ + char * rc = s1; + while ( *s1 ) + { + ++s1; + } + while ( n && ( *s1++ = *s2++ ) ) + { + --n; + } + if ( n == 0 ) + { + *s1 = '\0'; + } + return rc; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + char s[] = "xx\0xxxxxx"; + TESTCASE( strncat( s, abcde, 10 ) == s ); + TESTCASE( s[2] == 'a' ); + TESTCASE( s[6] == 'e' ); + TESTCASE( s[7] == '\0' ); + TESTCASE( s[8] == 'x' ); + s[0] = '\0'; + TESTCASE( strncat( s, abcdx, 10 ) == s ); + TESTCASE( s[4] == 'x' ); + TESTCASE( s[5] == '\0' ); + TESTCASE( strncat( s, "\0", 10 ) == s ); + TESTCASE( s[5] == '\0' ); + TESTCASE( s[6] == 'e' ); + TESTCASE( strncat( s, abcde, 0 ) == s ); + TESTCASE( s[5] == '\0' ); + TESTCASE( s[6] == 'e' ); + TESTCASE( strncat( s, abcde, 3 ) == s ); + TESTCASE( s[5] == 'a' ); + TESTCASE( s[7] == 'c' ); + TESTCASE( s[8] == '\0' ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/string/strncat.d b/user/pdclib/functions/string/strncat.d new file mode 100644 index 0000000..c52ea11 --- /dev/null +++ b/user/pdclib/functions/string/strncat.d @@ -0,0 +1,11 @@ +functions/string/strncat.d functions/string/strncat.t: \ + functions/string/strncat.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/strncat.o b/user/pdclib/functions/string/strncat.o new file mode 100644 index 0000000000000000000000000000000000000000..6419c8d011a9184878605bf1b0dd2c71a1116ab7 GIT binary patch literal 2620 zcma)8O=w(I6h8O8H<^hunIugNYO748+6c{?sL@4=H8ze-ODVbtNEO1&*yg5yghMu%PHdLArC-g>>bjRZv{HaZwON#6QrD-CC&Mci+8}7eVmAJ>U7e=iGbl zeRt-K+UaMMQesJoE4!M=4KMX9Xqc55nUdA*U$*|7*r^q^Yq$RJwrT|hdHkxpc`dmK zy*Ht@HYX&$f2UR&zsk6aWIAB{{cDWhs+AO?zhhi70_RsEJGEQid?{*DJy4!1y5;@l zNwrT+jEFdgq*y#wbPFP`5z8XpIIJh9L~=9YmKTdhwKC$XCrhb%xO8%gDV9bQqVhR$ z3u%;dhe%;zk2?CGFqQm>;pm-u>IzULU`Mq<#>g-B5Th+y?pxQ@im0{ZMH9+4B2J9oNlN) zrdqA}mCN%h&g@LP{e2d8y1 z+ce5i=e1xh9xm0W-G11rXqJRgrxgb46`t%+X}0SFskZyQph~gZ0Y?3(nnb~%dTzbh z?KC86_XlxhIEC}=!v5V(cGa|PPrNR(yB4N6ab~r$Tv_lJ{6|d%T6K)BkSp>%Ft<@WiLGX(BgP?0Hop7U{)w`WAu+iOqGwV8+ zG{Slh_bM~JKB$K+n$r9zFMhM%>jh|oANJ$GM~mj7xZZpzJ8fftM0QXA2lpe0R}b%u zCcbmoi({TYIS9MGq739WoFyA~7)IV%ef5F=6?X(a=Cj1O*R2AyzGE4g?lK(w04&)! ze(9su2z(LB6(G-;FALYlb)CVmb0Er1C_5AkS>Gw>*?c8Fny@h+-z=N&EMz+eqHN+T zm%_jv->!b*~cV&b{~|prKaJy4x1%gi-;`_X@!RiSTmb%1qS|7TC(}9 zZZT{35Ea?zopQTbNvW8-$;b|a;4io(aod!{gfS%~a0@oplvey_oUM0{LT11Y literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/string/strncmp.c b/user/pdclib/functions/string/strncmp.c new file mode 100644 index 0000000..ac9c10f --- /dev/null +++ b/user/pdclib/functions/string/strncmp.c @@ -0,0 +1,52 @@ +/* $Id$ */ + +/* strncmp( const char *, const char *, size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +int strncmp( const char * s1, const char * s2, size_t n ) +{ + while ( *s1 && n && ( *s1 == *s2 ) ) + { + ++s1; + ++s2; + --n; + } + if ( ( n == 0 ) ) + { + return 0; + } + else + { + return ( *s1 - *s2 ); + } +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + char cmpabcde[] = "abcde\0f"; + char empty[] = ""; + char x[] = "x"; + TESTCASE( strncmp( abcde, cmpabcde, 5 ) == 0 ); + TESTCASE( strncmp( abcde, cmpabcde, 10 ) == 0 ); + TESTCASE( strncmp( abcde, abcdx, 5 ) < 0 ); + TESTCASE( strncmp( abcdx, abcde, 5 ) > 0 ); + TESTCASE( strncmp( empty, abcde, 5 ) < 0 ); + TESTCASE( strncmp( abcde, empty, 5 ) > 0 ); + TESTCASE( strncmp( abcde, abcdx, 4 ) == 0 ); + TESTCASE( strncmp( abcde, x, 0 ) == 0 ); + TESTCASE( strncmp( abcde, x, 1 ) < 0 ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/string/strncmp.d b/user/pdclib/functions/string/strncmp.d new file mode 100644 index 0000000..b588cf6 --- /dev/null +++ b/user/pdclib/functions/string/strncmp.d @@ -0,0 +1,11 @@ +functions/string/strncmp.d functions/string/strncmp.t: \ + functions/string/strncmp.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/strncmp.o b/user/pdclib/functions/string/strncmp.o new file mode 100644 index 0000000000000000000000000000000000000000..60ec6a2f738ee712dcf37c7a67a187abbd793b70 GIT binary patch literal 2580 zcma)8L5Lhh6#doRv(q}Wv%6VcqEVSZViItBqOKwv5;dDmST_U_7E}o9%xv$>keQxk zx@S#-A%r#Hq6m6W$VHDHa|q%=HXB6|R5akto9M;lB6!OozSmtfQ}Lo7s@{M9|N2$+ ztGZ?`&YwK4loBIKTp2Qvt6t`rNnyWC$)qf8{&B0gG4HF5`J&qBjH`F&{jtyG?d@c0 zF0#2!4JF;N{Udzn!LvChp`J^f`46y&6?}X@i(azkxmyKM5B#=L3+Z2E-eQ zps%M6U-I7f(EM3+a+x*>(JOVQG>SewSRAKX?ML;b)s5mxob*~zLxKvn751WPJ5Kd_ zyT1~~B5+6b&RS6CEm(f}*xbp5qss^lnyghe7`n^(a%uJ4QFZv>;^J}t&*oWw-ElB2 zo$MS*JR+l^`$X>1kvf zva-6me8V*``oyWF@?3c)m@S;v-ZYkqUTm6MPRz~CmiI5!`ccx)hEC7)Q})aO zol0aJMYs!5qTce0p7##w{QxVYg~fWYI&n6PARFkR% zwHS9|C9L%u%hg(~7p_at3)|Y#idMTeZ?~e*M7O(j+qKrOMb!>&l{LKDt40l)viz7{ zf_k^p39Ly`;QccH6wSLAPw%S7?v#0-qyAZ^yhc_e@zF+pm(a)OfhMjTgg$BNd zW{Zj22P5z7f5kn480Is=d|g9;#&^Wh>Ar);55S0tpF#I z#z2)HKsKppF}|0;?R>w3a6I$zkuv%ChM6%?WeHy)_h!WSS}+)$zDtOE%mi6J9-ck# zZEIdU&VzX`SYx2dC&*W(qQ%U04&2W7HweE4?xToi_QCpd%t18Db>#asQ`4S4wvRQM zxGOm5J!wSNnYd4NoN;ZL3!x2+qg+EXI{7x@?D}zi6rQEM4-dsK`J)oqX) zuo*FP5wXRAlzF%?J_r~?V?O5RoOZr44E#|vV)7Yo(6)Q>*Ii>L-uusi++GQ}JtMiP zLYBo%Z}c#uo8Cy9+m+&Y-khPh>B-w1{}n88)140uuCS^@aZ#ayrhF@QuyDf{U2EB! zqVVzYo+%7q79wj*e29pxKdNyz5g%7Y`=8Z#SmQB`iyB|i_?pHyG&VH0HNL5FL*x5I e%=@9nkBB(`p5}ZD6*_~w2aMlI9L;`g$^QX;b}teD literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/string/strncpy.c b/user/pdclib/functions/string/strncpy.c new file mode 100644 index 0000000..2fb3f00 --- /dev/null +++ b/user/pdclib/functions/string/strncpy.c @@ -0,0 +1,63 @@ +/* $Id$ */ + +/* strncpy( char *, const char *, size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +/* TODO: Debuggung only */ +#include + +#ifndef REGTEST + +char * strncpy( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2, size_t n ) +{ + char * rc = s1; + while ( ( n > 0 ) && ( *s1++ = *s2++ ) ) + { + /* Cannot do "n--" in the conditional as size_t is unsigned and we have + to check it again for >0 in the next loop. + */ + --n; + } + /* TODO: This works correctly, but somehow the handling of n is ugly as + hell. + */ + if ( n > 0 ) + { + while ( --n ) + { + *s1++ = '\0'; + } + } + return rc; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + char s[] = "xxxxxxx"; + TESTCASE( strncpy( s, "", 1 ) == s ); + TESTCASE( s[0] == '\0' ); + TESTCASE( s[1] == 'x' ); + TESTCASE( strncpy( s, abcde, 6 ) == s ); + TESTCASE( s[0] == 'a' ); + TESTCASE( s[4] == 'e' ); + TESTCASE( s[5] == '\0' ); + TESTCASE( s[6] == 'x' ); + TESTCASE( strncpy( s, abcde, 7 ) == s ); + TESTCASE( s[6] == '\0' ); + TESTCASE( strncpy( s, "xxxx", 3 ) == s ); + TESTCASE( s[0] == 'x' ); + TESTCASE( s[2] == 'x' ); + TESTCASE( s[3] == 'd' ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/string/strncpy.d b/user/pdclib/functions/string/strncpy.d new file mode 100644 index 0000000..86a95a2 --- /dev/null +++ b/user/pdclib/functions/string/strncpy.d @@ -0,0 +1,13 @@ +functions/string/strncpy.d functions/string/strncpy.t: \ + functions/string/strncpy.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h includes/stdio.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: + +includes/stdio.h: diff --git a/user/pdclib/functions/string/strncpy.o b/user/pdclib/functions/string/strncpy.o new file mode 100644 index 0000000000000000000000000000000000000000..498fc77671449dc8a8e229e000d0a2e5a11e80c3 GIT binary patch literal 2620 zcma)8O^6&t6n@p+vopIpnVtP{Q4?h%(X5d4M6>Y_F~+Q8eh5Ji3!=g@Gut~eIMcIE zcZ(}YJZ!`)>%oAchX|rKPdP|V9##UPCodiXf`}*vl8asq#P6%Fn(Y+?A5?wszp7rn zu9dIBa| zoGTEXgg~`(#mk4_&uhL=7&JvqrCu?1_cPR^$1%xe3`YXYO8s5hg;`%eE?uo8VKeUZ z!>Ag?gHG5IzlxIvgRtI>G~etd%RwXpbJ$#6^Rb4=(u>b8oIQPF39f#dBo;5!g>#Vl?ks8>S2qjG(VOXzuE8g0vz5C`*Gl-LId#3+`yWzyn z!#ksi?_9QTY&Y$N-gYP*`3+~u`t663Evs7}_+NepU}HW@^t)&UptT*#@HCfTVE}Nz6u#b*0u&Yn{N-2l%eA} ziWv4BtN~*VVUTVi-%ly4XWBSEHfa5B;G*|wk94wrpBX=E`olJaQP7X{6^7+0--2JZ ze%v34cbPrMfy_B3VYBBTpIvGOhHs#=WY;3%h(kKX%Z2hjzyt>Ku})kwo9`49{H3&H z^I6$qR`1E5_pF|{^B)G~>`o|WSEOvKkY;hy-^yW1S9j!4gnzbDjA!R;ldEq&E93t} zhFpE}ZG|hW>NdHk(6|x#R!p&Q+fTdU(l; GQvL^YQZvy2 literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/string/strpbrk.c b/user/pdclib/functions/string/strpbrk.c new file mode 100644 index 0000000..41211db --- /dev/null +++ b/user/pdclib/functions/string/strpbrk.c @@ -0,0 +1,49 @@ +/* $Id$ */ + +/* strpbrk( const char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +char * strpbrk( const char * s1, const char * s2 ) +{ + const char * p1 = s1; + const char * p2; + while ( *p1 ) + { + p2 = s2; + while ( *p2 ) + { + if ( *p1 == *p2++ ) + { + return (char *) p1; + } + } + ++p1; + } + return NULL; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( strpbrk( abcde, "x" ) == NULL ); + TESTCASE( strpbrk( abcde, "xyz" ) == NULL ); + TESTCASE( strpbrk( abcdx, "x" ) == &abcdx[4] ); + TESTCASE( strpbrk( abcdx, "xyz" ) == &abcdx[4] ); + TESTCASE( strpbrk( abcdx, "zyx" ) == &abcdx[4] ); + TESTCASE( strpbrk( abcde, "a" ) == &abcde[0] ); + TESTCASE( strpbrk( abcde, "abc" ) == &abcde[0] ); + TESTCASE( strpbrk( abcde, "cba" ) == &abcde[0] ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/string/strpbrk.d b/user/pdclib/functions/string/strpbrk.d new file mode 100644 index 0000000..d0f925a --- /dev/null +++ b/user/pdclib/functions/string/strpbrk.d @@ -0,0 +1,11 @@ +functions/string/strpbrk.d functions/string/strpbrk.t: \ + functions/string/strpbrk.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/strpbrk.o b/user/pdclib/functions/string/strpbrk.o new file mode 100644 index 0000000000000000000000000000000000000000..1d82e1fe3dfcfb5e4612e7f7db1027fa4dce5620 GIT binary patch literal 2492 zcma)7&5K)A6hHU9m&wy)l9|Tu+LB6ZE7)YJQDlTVI>gc<14T#FO-VADBs6)6c`v0E zKfoEa!^}n~2qMyjx^mHl6y1$2g2jc~`3GE0H||CpsK4KP_fGBzf(Oq1o$q_^x%b`o zQT4S~l~Q6zi7R7Gr0pf1N(?9DAt}h>+8---r`D_fT6Jf;vR=)uRd=@!uUB{SH(}k) z-;@__<*#k7RCm?tW|V?s`%q$E-5hPLRCiPyE6{HJ$hvoKi<(x)a)peWJD8hR2h`Mr zh;vjjnbR597jd95 z^`8`G%Wq(ZlZ&Um#Hfy8m;;kuPe2?m)d?bTz0?g@TtBq|@Vq%HYT~m5eu}|=nBb(o ziy?i1;HBRq_-TxiQbUYtQq58WnMrO#o(NCDMalUb$}@Y4mma{APdtP40G_EtiLj76 zNbu({$eUnCPGMB)@7yHD_)u|_YIzhiqE0^u%V9L^1T7KZpgz1SBs#bfZ zHRG?o@vVF5oSXgnZO1_!R_EYIU(%@>u6! znn1bR4_d`|7zJUc6*QNM?Eaq8XxE1F@7-`ydNbvAzt=1?s@nmE{jfX=o5S*8snPA! zC2aSHQE{&tOPkg0Gse@5*TT3n3ya11Vx?3mJ*&&m8pp(ClEub}a%O&hws>N(J_@2y zl5(;#inZsS(j~ChDeygz67{~H^}MTS?E`FrCidm!od3!v&SXkT;gw!gs{^B9f^8#3 z&C8LLmTFN=O7$>=*sPCQ7i#tTuz5*J!)8}oI>B<^*1MgcX`;LRhV2@R>Orm7M6q#t zZCDFhG$r*hy_6dLUayHhl!AWLETKmy!>HD{Xs0a?QONA+|KLFc@s{EHkBRS&eMj_j zBu8L3w~>KYIap-kj>E?5$=gc$uehh-V?9HR%d@S z`W6s(*aTTV9-ck#HEUixu6y%-VC6uRF6tF2XfktMfo|9P3JSjk?js8}``|;%oEb1_ z1NDAM#CW8S{DnpncOD0QG>%9H6L($58P~{M2yI{-=?Acpsb5B%-9N66bOUVf<9ll# z)9{&nP`0P~2FlN{88UMbvBf>w;-SL$ARrHBJ@$!n+V!?@2@0?oGWCpZ(6)Q>=RIR5 z?*HRcw^u^lo{_rgLQ=(zZ}hmL8{bG!mr-kdSH@yXjd{__^O@y^EvSJ>4tx#&$(y3^@$sH1B(MsRJtjU%#MTdKJVL}dl(qkPjq@7$O)~Gi# + +#ifndef REGTEST + +char * strrchr( const char * s, int c ) +{ + size_t i = 0; + while ( s[i++] ); + do + { + if ( s[--i] == (char) c ) + { + return (char *) s + i; + } + } while ( i ); + return NULL; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + char abccd[] = "abccd"; + TESTCASE( strrchr( abcde, '\0' ) == &abcde[5] ); + TESTCASE( strrchr( abcde, 'e' ) == &abcde[4] ); + TESTCASE( strrchr( abcde, 'a' ) == &abcde[0] ); + TESTCASE( strrchr( abccd, 'c' ) == &abccd[3] ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/string/strrchr.d b/user/pdclib/functions/string/strrchr.d new file mode 100644 index 0000000..e8b1f80 --- /dev/null +++ b/user/pdclib/functions/string/strrchr.d @@ -0,0 +1,11 @@ +functions/string/strrchr.d functions/string/strrchr.t: \ + functions/string/strrchr.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/strrchr.o b/user/pdclib/functions/string/strrchr.o new file mode 100644 index 0000000000000000000000000000000000000000..3db9e570a8f70e23e0951244fcf3593e21584649 GIT binary patch literal 2596 zcma)8O^6&t6n@p+v(w4!&Tg_Xs8N|fVj`HHfU8IXF=n%dgb?(wpk9`l+1{DKnV#4` zVnU*aP0$cMCV5COs$Nys z%XQUv|p8EMNI`{g1hCm&UYRT^e6q4&M&E+0W(D#_Y9? z^`)`8v{C%FJ{&8@Id^qw`pK`0+QjsGZT;d{iXXpVm7CvyscmX+eZJ<`ch$G4?P_jH z#M>ja+L4+ciugvXiv+W=eI#sCHN@Q;~XVx>WZ~pPXljqf-h|)r$CG8Rcyi z2^a2Cw>&H?CEsCq7$~nk0axe24pRp$mmpqH=_k4PLFG$W{IK#NAPA09QB&7S_*O%B zfZ$bbXsEtO2&zLuSltPzRKdJoIutR)pMM#AN_`KmX4E0tKz8bzkgFLy6uft&+JU@R z%R$%|HG4tJIhJz^(w3uOvX0?N46fAQ^%-z|);M9cRwSLgKT5J@mZ$xsD^U|$i_@ev z$h6!U6svJ20(aW!r4i;6S$X#O;^~veRuCHX*sn4fvd{S{x`Y0V>K5VUu=iQ_1<%8z zbdhi zA8fp``ql&gEACPFSkDsUUb70&`i?j<-CN<{{kLS}_$q9%M&NNM*MU4^z9L*7*L4QN z=0KF6q3~O>WPPV#aO?dAh54+<_sQ1d^JQ}&${IdG?#+_*^q#GDkrhXf7ZvVJG63^1z#|~#7+u*bNpzKaHhVm6` zmh44*7cLn+9Ll)lKrzp_) + +#ifndef REGTEST + +size_t strspn( const char * s1, const char * s2 ) +{ + size_t len = 0; + const char * p; + while ( s1[ len ] ) + { + p = s2; + while ( *p ) + { + if ( s1[len] == *p ) + { + break; + } + ++p; + } + if ( ! *p ) + { + return len; + } + ++len; + } + return len; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( strspn( abcde, "abc" ) == 3 ); + TESTCASE( strspn( abcde, "b" ) == 0 ); + TESTCASE( strspn( abcde, abcde ) == 5 ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/string/strspn.d b/user/pdclib/functions/string/strspn.d new file mode 100644 index 0000000..f0892fd --- /dev/null +++ b/user/pdclib/functions/string/strspn.d @@ -0,0 +1,11 @@ +functions/string/strspn.d functions/string/strspn.t: \ + functions/string/strspn.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/strspn.o b/user/pdclib/functions/string/strspn.o new file mode 100644 index 0000000000000000000000000000000000000000..309d9c2824d39098140e354cbc94b9525f328f54 GIT binary patch literal 2632 zcma)8PiP!f82{eP?C!)(Hk(FcZ56fdn6g@!&}>q9BN#;-%6<#6bQ1X5QOOyyyq-{l5R-``&x= zb}v>=J+71zLrQGfl|+7X63b)^V=^McGJom!jX#RtRJN(xn%=DRU#jeE9oVdFZ_c}y z9c%DfakH{BcukIc6%{usJ1UW0{i6HxmU^ovWDu}*`$lCO_FkmG>qE%jel4Pg)ZK;Q zyj?h07*hLGF)Lz?N&JkMt+v;r`iSMn0NVFk~}g zyNQ=|i%4#AkLV5}GvoX25rX`LVX;GT)Md=-b4*7mgO(By%gHo@NNgwb0W`Loxkymi z^#neS!5t@9nX576&Jvv53c<~d0Gu2q>(^(=Vu(F_4s%Amhgl7%HR?d7==b2W;r%d? zv#vmRpeH!FmLG^3WRP`bHMc6Nn7BpaIzK|&H-$;wq+J#a` zR@wuqu{P0|aG$Z)=RO;~de%NaXAk{(%(76QZk#NM93tbuyF|8bNf*bS&>gW%{uhi_ zFp{-UBX?rxlZ$0eX79*{&2@hv>aAFdt#;5T#Zxy3n~lI zHGyF}EO$e{Q(j%Hx0*Exm)o7F)C<`YPa)2+TZpQYr{_yErAcqnd(iZdWT7#3C8HM< z$N&3ycuL7J$jOBi{|67ki5D-co%!aa?~Q&6<&gG^FE;r1wZ8%5cNhxZ*#Gjo4?e7Gi1}VN0?^ow zr+AtVz`*No$oTR5?lVf@GK7zSJmU-o*T;38#xOBpd_T%+rJoEA8 zGWqzhnHaFLiI0%I88Wse6o#kmQ~2FwoKiL(Ub=26RTpfp?n|i{u<`@)mB?r^wJtzT z=Nm&3ehciQAH($V26)CyV32MgA0JLbv~j$v(fECbgB~?b+D5;tng_&m-CPJQ(}(m4 zhT$pSfM0t5xIPlkGTq0KR3AgInLfy;OO;^w5;{Ys77;D>=nM}R%G&^g7|h3gV$F2E zGf=RGA(PL@2Ge>+uHQ6z;@*E7l+!DroUTaO>_U>oj&JmCMmxTdX*s=9jOWeSB|AR( zw2c1~DYE0vcNO-Yj+t+;myvJ9K5ks^K~5M(^G#9s_;}A$KG`=S_n62ZG= + +#ifndef REGTEST + +char * strstr( const char * s1, const char * s2 ) +{ + const char * p1 = s1; + const char * p2; + while ( *s1 ) + { + p2 = s2; + while ( *p2 && ( *p1 == *p2 ) ) + { + ++p1; + ++p2; + } + if ( ! *p2 ) + { + return (char *) s1; + } + ++s1; + p1 = s1; + } + return NULL; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + char s[] = "abcabcabcdabcde"; + TESTCASE( strstr( s, "x" ) == NULL ); + TESTCASE( strstr( s, "xyz" ) == NULL ); + TESTCASE( strstr( s, "a" ) == &s[0] ); + TESTCASE( strstr( s, "abc" ) == &s[0] ); + TESTCASE( strstr( s, "abcd" ) == &s[6] ); + TESTCASE( strstr( s, "abcde" ) == &s[10] ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/string/strstr.d b/user/pdclib/functions/string/strstr.d new file mode 100644 index 0000000..f60b83c --- /dev/null +++ b/user/pdclib/functions/string/strstr.d @@ -0,0 +1,11 @@ +functions/string/strstr.d functions/string/strstr.t: \ + functions/string/strstr.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/strstr.o b/user/pdclib/functions/string/strstr.o new file mode 100644 index 0000000000000000000000000000000000000000..c8cd0167b56019c54d9d5486b56a653bd7d6addd GIT binary patch literal 2504 zcma)8PiP!f82{e<$xhv5H)&L?RoFtc73^%Pt4PE)8rBdi1rGr&V!ON9Y!-KCIQi^?Pc& zey@B}uKt+7W50Y8Gvyb4N`5z%)JN>zkP#p0Qw8;H1?Es1z#XqRV2{7{{pbW8Ka7mFt*muDHZFri?W@WlOx z5Gm9Sh{2P>X!!-h;p*b4YnZb`IGZU%ni?I???#EZp8pLrZs2bMJa2)5n)oP(-3)@$ z1joOTLE#;OS9p&Q6dncm>IckfO3edEW)V~`6Y*)7$T`;_JTnr!!Uinm+_F*FfMq%t z5^UrS0)hoh@+O8ObC{L-yEKJ4yJS?Q*3zhzbO%vfjgw(F>WBdG3tM^7es&D*l_}31z+x5IOoP|Zu#rC90!@0pOb^`Ai6mp5LtvHDefqzBbiM8R}7Y)FGh_#hLJ5M zy2~J&Q=t9dJLQJ+jrImnr;<%+6n8sOd$q!g840cR#!#y3gMPb8w$}y5gSeW;?O}Ce zwbko3C0-v4lgcRMKs<#k$9N&Cmd>wK7Av)|7Cx)Psm*-I=$&MNrp%?q#rev~m1Y_x zX&!m1mS)m(Pw7n4DD^%_iTW^@^t{h;s1LG!O+1p9OTjCjI#a%c@#TKfXabXAj_Za? z+8-nmt~Qc}gv~ex+is?vi;ZS;*nVHaVY{a_-DquK%e`*YHr~BK%QkJK&8X3DBiT5- zF>FK~s`C6;Uc%O(-*4jx!f24RL!8s8IBB%rwZqniNMvgIKX?>Q>@Pg~8Sx!tw})w( zW6+yEq~mo?78$=2(6KSur=egI>1UrG_ea{ru1po5mDlZ?($Nhdo87!E;~Q_0n^itmxCbg`zVawz6K;oj zaQV9!-?yA$G~X!-4 + +#ifndef REGTEST + +char * strtok( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2 ) +{ + static char * tmp = NULL; + const char * p = s2; + + if ( s1 != NULL ) + { + /* new string */ + tmp = s1; + } + else + { + /* old string continued */ + if ( tmp == NULL ) + { + /* No old string, no new string, nothing to do */ + return NULL; + } + s1 = tmp; + } + + /* skipping leading s2 characters */ + while ( *p && *s1 ) + { + if ( *s1 == *p ) + { + /* found seperator; skip and start over */ + ++s1; + p = s2; + continue; + } + ++p; + } + + if ( ! *s1 ) + { + /* no more to parse */ + return ( tmp = NULL ); + } + + /* skipping non-s2 characters */ + tmp = s1; + while ( *tmp ) + { + p = s2; + while ( *p ) + { + if ( *tmp == *p++ ) + { + /* found seperator; overwrite with '\0', position tmp, return */ + *tmp++ = '\0'; + return s1; + } + } + ++tmp; + } + + /* parsed to end of string */ + return ( tmp = NULL ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + char s[] = "_a_bc__d_"; + TESTCASE( strtok( s, "_" ) == &s[1] ); + TESTCASE( s[1] == 'a' ); + TESTCASE( s[2] == '\0' ); + TESTCASE( strtok( NULL, "_" ) == &s[3] ); + TESTCASE( s[3] == 'b' ); + TESTCASE( s[4] == 'c' ); + TESTCASE( s[5] == '\0' ); + TESTCASE( strtok( NULL, "_" ) == &s[7] ); + TESTCASE( s[6] == '_' ); + TESTCASE( s[7] == 'd' ); + TESTCASE( s[8] == '\0' ); + TESTCASE( strtok( NULL, "_" ) == NULL ); + return TEST_RESULTS; +} +#endif diff --git a/user/pdclib/functions/string/strtok.d b/user/pdclib/functions/string/strtok.d new file mode 100644 index 0000000..a2765a8 --- /dev/null +++ b/user/pdclib/functions/string/strtok.d @@ -0,0 +1,11 @@ +functions/string/strtok.d functions/string/strtok.t: \ + functions/string/strtok.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/strtok.o b/user/pdclib/functions/string/strtok.o new file mode 100644 index 0000000000000000000000000000000000000000..3474306c34e5518b5e504b5ee5063302d717ae8b GIT binary patch literal 2880 zcma)8U5pb|6h3#R-5qGR+hzGPtFb1a7-hC%RYZZ6wGz-^G$HaNX}jIFp+9RoBVYt0 zD@4QxiM$yNL`n2rH^!$`B5Hy@nE0kICOnumA;y@HxDmha&b{q`FP`My@BE*8&)hpR zuN9wpN+~6ll(;gGL<-5sQqZtT*2!wwfBNeD@7XiO^y%XA{4r00m1m0Hhjdulet~du zFFUxn%UqNk!XONsg7GI(0vSkwtM7hcgZ(1l~) zn5CGEOF_TtvnEMimx`4bJ-5ib$hbzEE{n`BD!o($FKw{}!^_%iZ6*z?Uc9C1cb7!e znA(^bPq~?i%$QoGvO^-y21%uMq+CzLHEc#CF$(RTagn62cBb9Tw$x*(d(wNx88tPe zU>Hh@>ruUD+*v6yT)0W}?iNPN4;T&xGOFX4)hC!XQU?7KfjEg|qaBEwNS=en^^$Xd zL}H498afog`x?A;1Sk2HhT$g(iQyLr-Y{lKsu|2`L~Wx4vPIB98R|U%6D`hJ2wNaf z?VL>v2dz0#qckO5Ofn2H8yN$vAs|4>6xkpDrJi>@>(=z!VFoA#H(b`VC% zHWxxIJ#?>0E?MmL21to|)k`N5Z=$QK*#JZA$rBlG*GXq2DSq#0D=3wLsG+fLxo)-T z2h}5i_%o%TB!0Qq16wVJwS%Q{xm$f%e7Z!MMtimsmz#}t)p|EOmAGjxEVoOoDv}Mt zOWjhtMpcvzOAx=(X|<~8k>BnFRUiG^+zU#TL-DZLE)v;&{U5v&PCR5o#+mQX_!&tU z{RD7@;R)9v@ba#~U_AYJDtY7Wp#>`i3NfUg7l3?28u9@u?658lRrmBYA5N5~kmwtbM}`Ld~KU(Cn- z*?cd8w=rPl8uHyw#*nqOAX}cM2{h;q<3q5v2Kad0^|88O`*mNB#ekKq$d@By$mTl+ zIi4?vB)m7=#|Vbq$2;H|!{gAM)V`` zQ*C+5Q}B!T&xU;pTYMk+*gjUlMn686F$^rdPfZxU?n{GOtQoySBjXhWXQ5mRk^Nyl zB5TI;{R{n~6pO8Op#BDeKdo}>Y}`Xt2V(SZQY)mUauFEMV>>( NttaBwj^BUE{{nL)Um^ei literal 0 HcmV?d00001 diff --git a/user/pdclib/functions/string/strxfrm.c b/user/pdclib/functions/string/strxfrm.c new file mode 100644 index 0000000..2f8f7a6 --- /dev/null +++ b/user/pdclib/functions/string/strxfrm.c @@ -0,0 +1,48 @@ +/* $Id$ */ + +/* strxfrm( char *, const char *, size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +/* TODO: Dummy function, no locale support yet. */ +size_t strxfrm( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2, size_t n ) +{ + size_t len = strlen( s2 ); + if ( len < n ) + { + /* Cannot use strncpy() here as the filling of s1 with '\0' is not part + of the spec. + */ + while ( n-- && ( *s1++ = *s2++ ) ); + } + return len; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + char s[] = "xxxxxxxxxxx"; + TESTCASE( strxfrm( NULL, "123456789012", 0 ) == 12 ); + TESTCASE( strxfrm( s, "123456789012", 12 ) == 12 ); + /* + The following test case is true in *this* implementation, but doesn't have to. + TESTCASE( s[0] == 'x' ); + */ + TESTCASE( strxfrm( s, "1234567890", 11 ) == 10 ); + TESTCASE( s[0] == '1' ); + TESTCASE( s[9] == '0' ); + TESTCASE( s[10] == '\0' ); + return TEST_RESULTS; +} +#endif + diff --git a/user/pdclib/functions/string/strxfrm.d b/user/pdclib/functions/string/strxfrm.d new file mode 100644 index 0000000..3e0d229 --- /dev/null +++ b/user/pdclib/functions/string/strxfrm.d @@ -0,0 +1,11 @@ +functions/string/strxfrm.d functions/string/strxfrm.t: \ + functions/string/strxfrm.c includes/string.h internals/_PDCLIB_int.h \ + internals/_PDCLIB_config.h internals/_PDCLIB_aux.h + +includes/string.h: + +internals/_PDCLIB_int.h: + +internals/_PDCLIB_config.h: + +internals/_PDCLIB_aux.h: diff --git a/user/pdclib/functions/string/strxfrm.o b/user/pdclib/functions/string/strxfrm.o new file mode 100644 index 0000000000000000000000000000000000000000..87300f11bba3c516a072504a9ff0e120969352b4 GIT binary patch literal 2684 zcma)8-D@0G6hC)nHal_C&8CUq}(uBTPs32Hh#6O@9T10#(h=Nb`O{#(@6a;+{`lb+nzdQHtPJGb=_x{e;J?GwY zKW5&k9(_hBC6<)9GLl5T^HR&ahJA92%*fK__4PmYovTi4dV7BRduwZJvwGuP^~OTA z6wj@nEXm~iSJt~Fb^1zjFPtVXm(ErF4R({4<@6O=tG-&VPQYVu6$8KhN<>Ymy~XK* zTijioQae>?OvKqEg~EY?>x;OCEsA)P&>oo<$?X!ixWBNVg|R?AIgyI@PaK(Mh=XGa zUiqB3e(L4iB;wC+6UXlphLT^<9KAwMT>`3i(Jg3&$O{G?FV~I|alPC((71l?V}R!! zq@cz=O5v&of0p3nzSNL^nc(FI1V6tEkjtZUer=FN6LOeO2HSqa( z4yOI!obwPKfk3r$-pfbeIm9{d`<)O{DU~{y-p|mFA4Dgo&>RWTEA>}#2YS8l*lo2s zh#E<|7sZu0>9?b%1Qjeb>_@dutocS~uoA{1Fdtv-cY_8G$?|hgFCIN|Xc?|Si}gzf zgLj!Prz`3fRrC9^&fLrsj)RmmuyZ8wi1Y;S6S-PP2H5YEZr3vT>u6`uOnR#14m6!X z%n^lb>qUFqek)u~hLbd6rx!KLx*J4syBUQmWp3(FXtZj5skD0CutK)e2FAU(GKj-| zWo@O=Y1bug_4-M9IE3Tv#I`B_T~!v>R8OZF&4nQjA6qIfmgj@{;8Bx-TJ57Vq?6SH z5$p^ftDV7z=S{rN@%#9TT0Xkf5P)NQ1BU+#t^IZRM9_l#@UgR zAbzu()at;bpJK~${jd`x;qgR*m0D7hpdRB;tc3MJbGcTp_ro_Npi8Q0N2|T8+-XOl z_3rcWgjAA$lCP7XO+N<@VhG`Tfa7R*}N}i@)lsTc~612V;JTO z#4D3AWNjxQXXCwsc)T}U#||_b?>+Dw!+jzBfOtQqtnO)J`_Q2E`wSbsM|-55_4~y5 zS<^LpAdG^3q|ebTPx&YKW$VZJkv>JsuA`G#$4=PnI;Oy9Q~5A_4V@*Mi-;u-sfA4~ zLCKHTBpTzfPRyB&cN_}7+m>uRD_hL!J^6FX>WSO`KqzN3P`0a1N4e=YbQr=N-fC;- zi5!tDC{Bi4;mH}1t9L#tbHyWag;gApE3EK{TvWzJ;KX~Wav~E%1Y}mCetUqoQN||SY49E*ek>}+?{R~R2A?(fyup_YE*o4msP7`; o_l?Xu!n~UXFA$OU1A`ZdD6#g3Ue6nyMXs0rw-Rxw_~oYj4-CXR*8l(j literal 0 HcmV?d00001 diff --git a/user/pdclib/includes/assert.h b/user/pdclib/includes/assert.h new file mode 100644 index 0000000..35c2795 --- /dev/null +++ b/user/pdclib/includes/assert.h @@ -0,0 +1,49 @@ +/* $Id$ */ + +/* 7.2 Diagnostics + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef _PDCLIB_AUX_H +#define _PDCLIB_AUX_H _PDCLIB_AUX_H +#include <_PDCLIB_aux.h> +#endif + +#ifndef _PDCLIB_CONFIG_H +#define _PDCLIB_CONFIG_H _PDCLIB_CONFIG_H +#include <_PDCLIB_config.h> +#endif + +#ifndef _PDCLIB_ASSERT_H +#define _PDCLIB_ASSERT_H _PDCLIB_ASSERT_H +#if _PDCLIB_C_VERSION == 99 +void _PDCLIB_assert( char const * const, char const * const, char const * const ); +#else +void _PDCLIB_assert( char const * const ); +#endif +#endif + +/* If NDEBUG is set, assert() is a null operation. */ +#undef assert + +#ifdef NDEBUG +#define assert( ignore ) ( (void) 0 ) +#else +#if _PDCLIB_C_VERSION == 99 +#define assert( expression ) ( ( expression ) ? (void) 0 \ + : _PDCLIB_assert( "Assertion failed: " #expression \ + ", function ", __func__, \ + ", file " __FILE__ \ + ", line " _PDCLIB_symbol2string( __LINE__ ) \ + "." _PDCLIB_endl ) ) +#else +#define assert( expression ) ( ( expression ) ? (void) 0 \ + : _PDCLIB_assert( "Assertion failed: " #expression \ + ", file " __FILE__ \ + ", line " _PDCLIB_symbol2string( __LINE__ ) \ + "." _PDCLIB_endl ) ) +#endif +#endif + diff --git a/user/pdclib/includes/iso646.h b/user/pdclib/includes/iso646.h new file mode 100644 index 0000000..a97817e --- /dev/null +++ b/user/pdclib/includes/iso646.h @@ -0,0 +1,25 @@ +/* $Id$ */ + +/* 7.9 Alternative spellings + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef _PDCLIB_ISO646_H +#define _PDCLIB_ISO646_H _PDCLIB_ISO646_H + +#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 + diff --git a/user/pdclib/includes/limits.h b/user/pdclib/includes/limits.h new file mode 100644 index 0000000..5eeaf10 --- /dev/null +++ b/user/pdclib/includes/limits.h @@ -0,0 +1,41 @@ +/* $Id$ */ + +/* 7.10 Sizes of integer types + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef _PDCLIB_LIMITS_H +#define _PDCLIB_LIMITS_H _PDCLIB_LIMITS_H + +#ifndef _PDCLIB_INT_H +#define _PDCLIB_INT_H _PDCLIB_INT_H +#include <_PDCLIB_int.h> +#endif + +/* TODO: Defined to 1 as multibyte characters are not supported yet. */ +#define MB_LEN_MAX 1 + +#define LLONG_MIN _PDCLIB_LLONG_MIN +#define LLONG_MAX _PDCLIB_LLONG_MAX +#define ULLONG_MAX _PDCLIB_ULLONG_MAX + +#define CHAR_BIT _PDCLIB_CHAR_BIT +#define CHAR_MAX _PDCLIB_CHAR_MAX +#define CHAR_MIN _PDCLIB_CHAR_MIN +#define SCHAR_MAX _PDCLIB_SCHAR_MAX +#define SCHAR_MIN _PDCLIB_SCHAR_MIN +#define UCHAR_MAX _PDCLIB_UCHAR_MAX +#define SHRT_MAX _PDCLIB_SHRT_MAX +#define SHRT_MIN _PDCLIB_SHRT_MIN +#define INT_MAX _PDCLIB_INT_MAX +#define INT_MIN _PDCLIB_INT_MIN +#define LONG_MAX _PDCLIB_LONG_MAX +#define LONG_MIN _PDCLIB_LONG_MIN +#define USHRT_MAX _PDCLIB_USHRT_MAX +#define UINT_MAX _PDCLIB_UINT_MAX +#define ULONG_MAX _PDCLIB_ULONG_MAX + +#endif + diff --git a/user/pdclib/includes/stdarg.h b/user/pdclib/includes/stdarg.h new file mode 100644 index 0000000..e75cd55 --- /dev/null +++ b/user/pdclib/includes/stdarg.h @@ -0,0 +1,25 @@ +/* $Id$ */ + +/* 7.15 Variable arguments + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef _PDCLIB_STDARG_H +#define _PDCLIB_STDARG_H _PDCLIB_STDARG_H + +#ifndef _PDCLIB_CONFIG_H +#define _PDCLIB_CONFIG_H _PDCLIB_CONFIG_H +#include <_PDCLIB_config.h> +#endif + +typedef _PDCLIB_va_list va_list; + +#define va_arg( ap, type ) _PDCLIB_va_arg( ap, type ) +#define va_copy( dest, src ) _PDCLIB_va_copy( dest, src ) +#define va_end( ap ) _PDCLIB_va_end( ap ) +#define va_start( ap, parmN ) _PDCLIB_va_start( ap, parmN ) + +#endif + diff --git a/user/pdclib/includes/stdbool.h b/user/pdclib/includes/stdbool.h new file mode 100644 index 0000000..66166e1 --- /dev/null +++ b/user/pdclib/includes/stdbool.h @@ -0,0 +1,18 @@ +/* $Id$ */ + +/* 7.16 Boolean type and values + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef _PDCLIB_STDBOOL_H +#define _PDCLIB_STDBOOL_H _PDCLIB_STDBOOL_H + +#define bool _Bool +#define true 1 +#define false 0 +#define __bool_true_false_are_defined 1 + +#endif + diff --git a/user/pdclib/includes/stddef.h b/user/pdclib/includes/stddef.h new file mode 100644 index 0000000..8968577 --- /dev/null +++ b/user/pdclib/includes/stddef.h @@ -0,0 +1,39 @@ +/* $Id$ */ + +/* 7.17 Common definitions + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef _PDCLIB_STDDEF_H +#define _PDCLIB_STDDEF_H _PDCLIB_STDDEF_H + +#ifndef _PDCLIB_CONFIG_H +#define _PDCLIB_CONFIG_H _PDCLIB_CONFIG_H +#include <_PDCLIB_config.h> +#endif + +#ifndef _PDCLIB_INT_H +#define _PDCLIB_INT_H _PDCLIB_INT_H +#include <_PDCLIB_int.h> +#endif + +typedef _PDCLIB_ptrdiff_t ptrdiff_t; + +#ifndef _PDCLIB_SIZE_T_DEFINED +#define _PDCLIB_SIZE_T_DEFINED _PDCLIB_SIZE_T_DEFINED +typedef _PDCLIB_size_t size_t; +#endif + +typedef _PDCLIB_wchar_t wchar_t; + +#ifndef _PDCLIB_NULL_DEFINED +#define _PDCLIB_NULL_DEFINED _PDCLIB_NULL_DEFINED +#define NULL _PDCLIB_NULL +#endif + +#define offsetof( type, member ) _PDCLIB_offsetof( type, member ) + +#endif + diff --git a/user/pdclib/includes/stdint.h b/user/pdclib/includes/stdint.h new file mode 100644 index 0000000..a5dfc5c --- /dev/null +++ b/user/pdclib/includes/stdint.h @@ -0,0 +1,213 @@ +/* $Id$ */ + +/* 7.18 Integer types + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef _PDCLIB_STDINT_H +#define _PDCLIB_STDINT_H _PDCLIB_STDINT_H + +#ifndef _PDCLIB_INT_H +#define _PDCLIB_INT_H _PDCLIB_INT_H +#include <_PDCLIB_int.h> +#endif + +/* 7.18.1.1 Exact-width integer types. */ + +typedef _PDCLIB_int8_t int8_t; +typedef _PDCLIB_int16_t int16_t; +typedef _PDCLIB_int32_t int32_t; +typedef _PDCLIB_int64_t int64_t; + +typedef _PDCLIB_uint8_t uint8_t; +typedef _PDCLIB_uint16_t uint16_t; +typedef _PDCLIB_uint32_t uint32_t; +typedef _PDCLIB_uint64_t uint64_t; + +/* 7.18.1.2 Minimum-width integer types */ + +/* You are allowed to add more types here, e.g. int_least24_t. For the standard + types, int_leastN_t is equivalent to the corresponding exact type intN_t by + definition. +*/ + +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; + +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +/* 7.18.1.3 Fastest minimum-width integer types */ + +/* You are allowed to add more types here, e.g. int_fast24_t. */ + +typedef _PDCLIB_int_fast8_t int_fast8_t; +typedef _PDCLIB_int_fast16_t int_fast16_t; +typedef _PDCLIB_int_fast32_t int_fast32_t; +typedef _PDCLIB_int_fast64_t int_fast64_t; + +typedef _PDCLIB_uint_fast8_t uint_fast8_t; +typedef _PDCLIB_uint_fast16_t uint_fast16_t; +typedef _PDCLIB_uint_fast32_t uint_fast32_t; +typedef _PDCLIB_uint_fast64_t uint_fast64_t; + +/* 7.18.1.4 Integer types capable of holding object pointers */ + +typedef _PDCLIB_intptr_t intptr_t; +typedef _PDCLIB_uintptr_t uintptr_t; + +/* 7.18.1.5 Greatest-width integer types */ + +typedef _PDCLIB_intmax_t intmax_t; +typedef _PDCLIB_uintmax_t uintmax_t; + +/* 7.18.2 Limits of specified-width integer types */ + +#ifdef __cplusplus +#ifndef __STDC_LIMIT_MACROS +#define _PDCLIB_NO_LIMIT_MACROS +#endif +#endif + +#ifndef _PDCLIB_NO_LIMIT_MACROS + +/* 7.18.2.1 Limits of exact-width integer types */ + +#define INT8_MIN _PDCLIB_INT8_MIN +#define INT8_MAX _PDCLIB_INT8_MAX +#define UINT8_MAX _PDCLIB_UINT8_MAX + +#define INT16_MIN _PDCLIB_INT16_MIN +#define INT16_MAX _PDCLIB_INT16_MAX +#define UINT16_MAX _PDCLIB_UINT16_MAX + +#define INT32_MIN _PDCLIB_INT32_MIN +#define INT32_MAX _PDCLIB_INT32_MAX +#define UINT32_MAX _PDCLIB_UINT32_MAX + +#define INT64_MIN _PDCLIB_INT64_MIN +#define INT64_MAX _PDCLIB_INT64_MAX +#define UINT64_MAX _PDCLIB_UINT64_MAX + +/* 7.18.2.2 Limits of minimum-width integer types */ + +/* For the standard widths, least and exact types are equivalent. + You are allowed to add more types here, e.g. int_least24_t. +*/ + +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define UINT_LEAST8_MAX UINT8_MAX + +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define UINT_LEAST16_MAX UINT16_MAX + +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define UINT_LEAST32_MAX UINT32_MAX + +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +/* 7.18.2.3 Limits of fastest minimum-width integer types */ + +#define INT_FAST8_MIN _PDCLIB_INT_FAST8_MIN +#define INT_FAST8_MAX _PDCLIB_INT_FAST8_MAX +#define UINT_FAST8_MAX _PDCLIB_UINT_FAST8_MAX + +#define INT_FAST16_MIN _PDCLIB_INT_FAST16_MIN +#define INT_FAST16_MAX _PDCLIB_INT_FAST16_MAX +#define UINT_FAST16_MAX _PDCLIB_UINT_FAST16_MAX + +#define INT_FAST32_MIN _PDCLIB_INT_FAST32_MIN +#define INT_FAST32_MAX _PDCLIB_INT_FAST32_MAX +#define UINT_FAST32_MAX _PDCLIB_UINT_FAST32_MAX + +#define INT_FAST64_MIN _PDCLIB_INT_FAST64_MIN +#define INT_FAST64_MAX _PDCLIB_INT_FAST64_MAX +#define UINT_FAST64_MAX _PDCLIB_UINT_FAST64_MAX + +/* 7.18.2.4 Limits of integer types capable of holding object pointers */ + +#define INTPTR_MIN _PDCLIB_INTPTR_MIN +#define INTPTR_MAX _PDCLIB_INTPTR_MAX +#define UINTPTR_MAX _PDCLIB_UINTPTR_MAX + +/* 7.18.2.5 Limits of greatest-width integer types */ + +#define INTMAX_MIN _PDCLIB_INTMAX_MIN +#define INTMAX_MAX _PDCLIB_INTMAX_MAX +#define UINTMAX_MAX _PDCLIB_UINTMAX_MAX + +/* 7.18.3 Limits of other integer types */ + +#define PTRDIFF_MIN _PDCLIB_PTRDIFF_MIN +#define PTRDIFF_MAX _PDCLIB_PTRDIFF_MAX + +#define SIG_ATOMIC_MIN _PDCLIB_SIG_ATOMIC_MIN +#define SIG_ATOMIC_MAX _PDCLIB_SIG_ATOMIC_MAX + +#define SIZE_MAX _PDCLIB_SIZE_MAX + +#define WCHAR_MIN _PDCLIB_WCHAR_MIN +#define WCHAR_MAX _PDCLIB_WCHAR_MAX + +#define WINT_MIN _PDCLIB_WINT_MIN +#define WINT_MAX _PDCLIB_WINT_MAX + +#endif + +/* 7.18.4 Macros for integer constants */ + +#ifdef __cplusplus +#ifndef __STDC_CONSTANT_MACROS +#define _PDCLIB_NO_CONSTANT_MACROS +#endif +#endif + +#ifndef _PDCLIB_NO_CONSTANT_MACROS + +/* 7.18.4.1 Macros for minimum-width integer constants */ + +/* As the minimum-width types - for the required widths of 8, 16, 32, and 64 + bits - are expressed in terms of the exact-width types, the mechanism for + these macros is to append the literal of that exact-width type to the macro + parameter. + This is considered a hack, as the author is not sure his understanding of + the requirements of this macro is correct. Any input appreciated. +*/ + +/* Expand to an integer constant of specified value and type int_leastN_t */ + +#define INT8_C( value ) value +#define INT16_C( value ) value +#define INT32_C( value ) _PDCLIB_concat( value, _PDCLIB_INT32_LITERAL ) +#define INT64_C( value ) _PDCLIB_concat( value, _PDCLIB_INT64_LITERAL ) + +/* Expand to an integer constant of specified value and type uint_leastN_t */ + +#define UINT8_C( value ) value +#define UINT16_C( value ) value +#define UINT32_C( value ) _PDCLIB_concat( value, _PDCLIB_UINT32_LITERAL ) +#define UINT64_C( value ) _PDCLIB_concat( value, _PDCLIB_UINT64_LITERAL ) + +/* 7.18.4.2 Macros for greatest-width integer constants */ + +/* Expand to an integer constant of specified value and type intmax_t */ +#define INTMAX_C( value ) _PDCLIB_INTMAX_C( value ) + +/* Expand to an integer constant of specified value and type uintmax_t */ +#define UINTMAX_C( value ) _PDCLIB_UINTMAX_C( value ) + +#endif + +#endif + diff --git a/user/pdclib/includes/stdio.h b/user/pdclib/includes/stdio.h new file mode 100644 index 0000000..68f1cb7 --- /dev/null +++ b/user/pdclib/includes/stdio.h @@ -0,0 +1,796 @@ +/* $Id$ */ + +/* Input/output + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef _PDCLIB_STDIO_H +#define _PDCLIB_STDIO_H _PDCLIB_STDIO_H + +#ifndef _PDCLIB_INT_H +#define _PDCLIB_INT_H _PDCLIB_INT_H +#include <_PDCLIB_int.h> +#endif + +#ifndef _PDCLIB_SIZE_T_DEFINED +#define _PDCLIB_SIZE_T_DEFINED _PDCLIB_SIZE_T_DEFINED +typedef _PDCLIB_size_t size_t; +#endif + +#ifndef _PDCLIB_NULL_DEFINED +#define _PDCLIB_NULL_DEFINED _PDCLIB_NULL_DEFINED +#define NULL _PDCLIB_NULL +#endif + +/* See setvbuf(), third argument */ +#define _IOFBF 1 +#define _IOLBF 2 +#define _IONBF 4 + +/* The following are platform-dependant, and defined in _PDCLIB_config.h. */ +typedef _PDCLIB_fpos_t fpos_t; +typedef struct _PDCLIB_file_t FILE; +#define EOF -1 +#define BUFSIZ _PDCLIB_BUFSIZ +#define FOPEN_MAX _PDCLIB_FOPEN_MAX +#define FILENAME_MAX _PDCLIB_FILENAME_MAX +#define L_tmpnam _PDCLIB_L_tmpnam +#define TMP_MAX _PDCLIB_TMP_MAX + +/* See fseek(), third argument */ +#define SEEK_CUR 1 +#define SEEK_END 2 +#define SEEK_SET 4 + +extern struct _PDCLIB_file_t * stdin; +extern struct _PDCLIB_file_t * stdout; +extern struct _PDCLIB_file_t * stderr; + +/* Operations on files */ + +/* Remove the given file. + Returns zero if successful, non-zero otherwise. + This implementation does detect if the filename corresponds to an open file, + and closes it before attempting the rename. +*/ +int remove( const char * filename ); + +/* Rename the given old file to the given new name. + Returns zero if successful, non-zero otherwise. + This implementation does detect if the old filename corresponds to an open + file, and closes it before attempting the rename. + If the already is a file with the new filename, behaviour is defined by the + OS. +*/ +int rename( const char * old, const char * new ); + +/* Open a temporary file with mode "wb+", i.e. binary-update. Remove the file + automatically if it is closed or the program exits normally (by returning + from main() or calling exit()). + Returns a pointer to a FILE handle for this file. + This implementation does not remove temporary files if the process aborts + abnormally (e.g. abort()). +*/ +struct _PDCLIB_file_t * tmpfile( void ); + +/* Generate a file name that is not equal to any existing filename AT THE TIME + OF GENERATION. Generate a different name each time it is called. + Returns a pointer to an internal static buffer containing the filename if s + is a NULL pointer. (This is not thread-safe!) + Returns s if it is not a NULL pointer (s is then assumed to point to an array + of at least L_tmpnam characters). + Returns NULL if unable to generate a suitable name (because all possible + names already exist, or the function has been called TMP_MAX times already). + Note that this implementation cannot guarantee a file of the name generated + is not generated between the call to this function and a subsequent fopen(). +*/ +char * tmpnam( char * s ); + +/* File access functions */ + +/* Close the file associated with the given stream (after flushing its buffers). + Returns zero if successful, EOF if any errors occur. +*/ +int fclose( struct _PDCLIB_file_t * stream ); + +/* Flush the buffers of the given output stream. If the stream is an input + stream, or an update stream with the last operation being an input operation, + behaviour is undefined. + If stream is a NULL pointer, perform the buffer flushing for all applicable + streams. + Returns zero if successful, EOF if a write error occurs. + Sets the error indicator of the stream if a write error occurs. +*/ +int fflush( struct _PDCLIB_file_t * stream ); + +/* Open the file with the given filename in the given mode, and return a stream + handle for it in which error and end-of-file indicator are cleared. Defined + values for mode are: + + READ MODES + text files binary files + without update "r" "rb" + with update "r+" "rb+" or "r+b" + + Opening in read mode fails if no file with the given filename exists, or if + cannot be read. + + WRITE MODES + text files binary files + without update "w" "wb" + with update "w+" "wb+" or "w+b" + + With write modes, if a file with the given filename already exists, it is + truncated to zero length. + + APPEND MODES + text files binary files + without update "a" "ab" + with update "a+" "ab+" or "a+b" + + With update modes, if a file with the given filename already exists, it is + not truncated to zero length, but all writes are forced to end-of-file (this + regardless to fseek() calls). Note that binary files opened in append mode + might have their end-of-file padded with '\0' characters. + + Update modes mean that both input and output functions can be performed on + the stream, but output must be terminated with a call to either fflush(), + fseek(), fsetpos(), or rewind() before input is performed, and input must + be terminated with a call to either fseek(), fsetpos(), or rewind() before + output is performed, unless input encountered end-of-file. + + If a text file is opened with update mode, the implementation is at liberty + to open a binary stream instead. This implementation honors the exact mode + given. + + The stream is fully buffered if and only if it can be determined not to + refer to an interactive device. + + If the mode string begins with but is longer than one of the above sequences + the implementation is at liberty to ignore the additional characters, or do + implementation-defined things. This implementation only accepts the exact + modes above. + + Returns a pointer to the stream handle if successfull, NULL otherwise. +*/ +struct _PDCLIB_file_t * fopen( const char * _PDCLIB_restrict filename, const char * _PDCLIB_restrict mode ); + +/* Close any file currently associated with the given stream. Open the file + identified by the given filename with the given mode (equivalent to fopen()), + and associate it with the given stream. If filename is a NULL pointer, + attempt to change the mode of the given stream. + This implementation allows the following mode changes: TODO + (Primary use of this function is to redirect stdin, stdout, and stderr.) +*/ +struct _PDCLIB_file_t * freopen( const char * _PDCLIB_restrict filename, const char * _PDCLIB_restrict mode, struct _PDCLIB_file_t * _PDCLIB_restrict stream ); + +/* If buf is a NULL pointer, call setvbuf( stream, NULL, _IONBF, BUFSIZ ). + If buf is not a NULL pointer, call setvbuf( stream, buf, _IOFBF, BUFSIZ ). +*/ +void setbuf( struct _PDCLIB_file_t * _PDCLIB_restrict stream, char * _PDCLIB_restrict buf ); + +/* Set the given stream to the given buffering mode. If buf is not a NULL + pointer, use buf as file buffer (of given size). If buf is a NULL pointer, + use a buffer of given size allocated internally. _IONBF causes unbuffered + behaviour, _IOLBF causes line-buffered behaviour, _IOFBF causes fully + buffered behaviour. Calling this function is only valid right after a file is + opened, and before any other operation (except for any unsuccessful calls to + setvbuf()) has been performed. + Returns zero if successful, nonzero otherwise. +*/ +int setvbuf( struct _PDCLIB_file_t * _PDCLIB_restrict stream, char * _PDCLIB_restrict buf, int mode, size_t size ); + +/* Formatted input/output functions */ + +/* + Write output to the given stream, as defined by the given format string and + 0..n subsequent arguments (the argument stack). + + The format string is written to the given stream verbatim, except for any + conversion specifiers included, which start with the letter '%' and are + documented below. If the given conversion specifiers require more arguments + from the argument stack than provided, behaviour is undefined. Additional + arguments not required by conversion specifiers are evaluated but otherwise + ignored. + + (The standard specifies the format string is allowed to contain multibyte + character sequences as long as it starts and ends in initial shift state, + but this is not yet supported by this implementation, which interprets the + format string as sequence of char.) + TODO: Add multibyte support to printf() functions. + + A conversion specifier consists of: + - Zero or more flags (one of the characters "-+ #0"). + - Optional minimum field width as decimal integer. Default is padding to the + left, using spaces. Note that 0 is taken as a flag, not the beginning of a + field width. Note also that a small field width will not result in the + truncation of a value. + - Optional precision (given as ".#" with # being a decimal integer), + specifying: + - the min. number of digits to appear (diouxX), + - the max. number of digits after the decimal point (aAeEfF), + - the max. number of significant digits (gG), + - the max. number of bytes to be written (s). + - behaviour with other conversion specifiers is undefined. + - Optional length modifier specifying the size of the argument (one of "hh", + "ll", or one of the characters "hljztL"). + - Conversion specifier character specifying the type of conversion to be + applied (and the type of the next argument from the argument stack). One + of the characters "diouxXfFeEgGaAcspn%". + + Minimum field width and/or precision may be given as asterisk ('*') instead + of a decimal integer. In this case, the next argument from the argument + stack is assumed to be an int value specifying the width / precision. A + negative field width is interpreted as flag '-' followed by a positive field + width. A negative precision is interpreted as if no precision was given. + + FLAGS + - Left-justify the conversion result within its field width. + + Prefix a '+' on positive signed conversion results. Prefix a '-' on + floating conversions resulting in negative zero, or negative values + rounding to zero. + space Prefix a space on positive signed conversion results, or if a signed + conversion results in no characters. If both '+' and ' ' are given, + ' ' is ignored. + # Use an "alternative form" for + - 'o' conversion, increasing precision until the first digit of the + result is a zero; + - 'x' or 'X' conversion, prefixing "0x" or "0X" to nonzero results; + - "aAeEfF" conversions, always printing a decimal point even if no + digits are following; + - 'g' or 'G' conversions, always printing a decimal point even if no + digits are following, and not removing trailing zeroes. + - behaviour for other conversions is unspecified. + 0 Use leading zeroes instead of spaces for field width padding. If both + '-' and '0' are given, '0' is ignored. If a precision is specified for + any of the "diouxX" conversions, '0' is ignored. Behaviour is only + defined for "diouxXaAeEfFgG". + + LENGTH MODIFIERS + hh For "diouxX" conversions, the argument from the argument stack is + assumed to be of char width. (It will have been subject to integer + promotion but will be converted back.) For 'n' conversions, the argument + is assumed to be a pointer to signed char. + h For "diouxX" conversions, the argument from the argument stack is + assumed to be of short int width. (It will have been subject to integer + promotion but will be converted back.) For 'n' conversions, the argument + is assumed to be a pointer to short int. + l For "diouxX" conversions, the argument from the argument stack is + assumed to be of long int width. For 'n' conversions, the argument is + assumed to be a pointer to short int. For 'c' conversions, the argument + is assumed to be a wint_t. For 's' conversions, the argument is assumed + to be a pointer to wchar_t. No effect on "aAeEfFgG" conversions. + ll For "diouxX" conversions, the argument from the argument stack is + assumed to be of long long int width. For 'n' conversions, the argument + is assumed to be a pointer to long long int. + j For "diouxX" conversions, the argument from the argument stack is + assumed to be of intmax_t width. For 'n' conversions, the argument is + assumed to be a pointer to intmax_t. + z For "diouxX" conversions, the argument from the argument stack is + assumed to be of size_t width. For 'n' conversions, the argument is + assumed to be a pointer to size_t. + t For "diouxX" conversions, the argument from the argument stack is + assumed to be of ptrdiff_t width. For 'n' conversions, the argument is + assumed to be a pointer to ptrdiff_t. + L For "aAeEfFgG" conversions, the argument from the argument stack is + assumed to be a long double. + Length modifiers appearing for any conversions not mentioned above will have + undefined behaviour. + If a length modifier appears with any conversion specifier other than as + specified above, the behavior is undefined. + + CONVERSION SPECIFIERS + d,i The argument from the argument stack is assumed to be of type int, and + is converted to a signed decimal value with a minimum number of digits + as specified by the precision (default 1), padded with leading zeroes. + A zero value converted with precision zero yields no output. + o The argument from the argument stack is assumed to be of type unsigned + int, and is converted to an unsigned octal value, other behaviour being + as above. + u The argument from the argument stack is assumed to be of type unsigned + int, and converted to an unsigned decimal value, other behaviour being + as above. + x,X The argument from the argument stack is assumed to be of type unsigned + int, and converted to an unsigned hexadecimal value, using lowercase + "abcdef" for 'x' and uppercase "ABCDEF" for 'X' conversion, other + behaviour being as above. + f,F The argument from the argument stack is assumed to be of type double, + and converted to a decimal floating point in decimal-point notation, + with the number of digits after the decimal point as specified by the + precision (default 6) and the value being rounded appropriately. If + precision is zero (and the '#' flag is not given), no decimal point is + printed. At least one digit is always printed before the decimal point. + For 'f' conversions, an infinity value is printed as either [-]inf or + [-]infinity (, depending on the configuration of this implementation. A + NaN value is printed as [-]nan. For 'F' conversions uppercase characters + are used for these special values. The flags '-', '+' and ' ' apply as + usual to these special values, '#' and '0' have no effect. + e,E The argument from the argument stack is assumed to be of type double, + and converted to a decimal floating point in normalized exponential + notation ([?]d.ddd edd). "Normalized" means one nonzero digit before + the decimal point, unless the value is zero. The number of digits after + the decimal point is specified by the precision (default 6), the value + being rounded appropriately. If precision is zero (and the '#' flag is + not given), no decimal point is printed. The exponent has at least two + digits, and not more than necessary to represent the exponent. If the + value is zero, the exponent is zero. The 'e' written to indicate the + exponend is uppercase for 'E' conversions. + Infinity or NaN values are represented as for 'f' and 'F' conversions, + respectively. + g,G The argument from the argument stack is assumed to be of type double, + and converted according to either 'f' or 'e' format for 'g' conversions, + or 'F' or 'E' format for 'G' conversions, respectively, with the actual + conversion chosen depending on the value. 'e' / 'E' conversion is chosen + if the resulting exponent is < -4 or >= the precision (default 1). + Trailing zeroes are removed (unless the '#' flag is given). A decimal + point appears only if followed by a digit. + Infinity or NaN values are represented as for 'f' and 'F' conversions, + respectively. + a,A The argument from the argument stack is assumed to be of type double, + and converted to a floating point hexadecimal notation ([?]0xh.hhhh pd) + with one hexadecimal digit (being nonzero if the value is normalized, + and otherwise unspecified) before the decimal point, and the number of + digits after the decimal point being specified by the precision. If no + precision is given, the default is to print as many digits as nevessary + to give an exact representation of the value (if FLT_RADIX is a power of + 2). If no precision is given and FLT_RADIX is not a power of 2, the + default is to print as many digits to distinguish values of type double + (possibly omitting trailing zeroes). (A precision p is sufficient to + distinguish values of the source type if 16^p-1 > b^n where b is + FLT_RADIX and n is the number of digits in the significand (to base b) + of the source type. A smaller p might suffice depending on the + implementation's scheme for determining the digit to the left of the + decimal point.) The error has the correct sign for the current rounding + direction. + Unless the '#' flag is given, no decimal-point is given for zero + precision. + The 'a' conversion uses lowercase "abcdef", "0x" and 'p', the 'A' + conversion uppercase "ABCDEF", "0X" and 'P'. + The exponent always has at least one digit, and not more than necessary + to represent the decimal exponent of 2. If the value is zero, the + exponent is zero. + Infinity or NaN values are represented as for 'f' and 'F' conversions, + respectively. + Binary implementations are at liberty to chose the hexadecimal digit to + the left of the decimal point so that subsequent digits align to nibble + boundaries. + c The argument from the argument stack is assumed to be of type int, and + converted to a character after the value has been cast to unsigned char. + If the 'l' length modifier is given, the argument is assumed to be of + type wint_t, and converted as by a "%ls" conversion with no precision + and a pointer to a two-element wchar_t array, with the first element + being the wint_t argument and the second a '\0' wide character. + s The argument from the argument stack is assumed to be a char array (i.e. + pointer to char). Characters from that array are printed until a zero + byte is encountered or as many bytes as specified by a given precision + have been written. + If the l length modifier is given, the argument from the argument stack + is assumed to be a wchar_t array (i.e. pointer to wchar_t). Wide + characters from that array are converted to multibyte characters as by + calls to wcrtomb() (using a mbstate_t object initialized to zero prior + to the first conversion), up to and including the terminating null wide + character. The resulting multibyte character sequence is then printed up + to but not including the terminating null character. If a precision is + given, it specifies the maximum number of bytes to be written (including + shift sequences). If the given precision would require access to a wide + character one past the end of the array, the array shall contain a '\0' + wide character. In no case is a partial multibyte character written. + Redundant shift sequences may result if the multibyte characters have a + state-dependent encoding. + TODO: Clarify these statements regarding %ls. + p The argument from the argument stack is assumed to be a void pointer, + and converted to a sequence of printing characters in an implementation- + defined manner. + This implementation casts the pointer to type intptr_t, and prints the + value as if a %#x conversion specifier was given. + n The argument from the argument stack is assumed to be a pointer to a + signed integer, into which the number of characters written so far by + this call to fprintf is stored. The behaviour, should any flags, field + widths, or precisions be given is undefined. + % A verbatim '%' character is written. No argument is taken from the + argument stack. + + Returns the number of characters written if successful, a negative value + otherwise. +*/ +int fprintf( struct _PDCLIB_file_t * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... ); + +/* TODO: fscanf() documentation */ +/* + Read input from a given stream, as defined by the given format string, and + store converted input in the objects pointed to by 0..n subsequent arguments + (the argument stack). + + The format string contains a sequence of directives that are expected to + match the input. If such a directive fails to match, the function returns + (matching error). It also returns if an input error occurs (input error). + + Directives can be: + - one or more whitespaces, matching any number of whitespaces in the input; + - printing characters, matching the input verbatim; + - conversion specifications, which convert an input sequence into a value as + defined by the individual specifier, and store that value in a memory + location pointed to by the next pointer on the argument stack. Details are + documented below. If there is an insufficient number of pointers on the + argument stack, behaviour is undefined. Additional arguments not required + by any conversion specifications are evaluated, but otherwise ignored. + + (The standard specifies the format string is allowed to contain multibyte + character sequences as long as it starts and ends in initial shift state, + but this is not yet supported by this implementation, which interprets the + format string as sequence of char.) + TODO: Add multibyte support to scanf() functions. + + A conversion specifier consists of: + - Optional assignment-suppressing character ('*') that makes the conversion + read input as usual, but does not assign the conversion result. + - Optional maximum field width as decimal integer. + - Optional length modifier specifying the size of the argument (one of "hh", + "ll", or one of the characters "hljztL"). + - Conversion specifier character specifying the type of conversion to be + applied (and the type of the next argument from the argument stack). One + of the characters "diouxXaAeEfFgGcs[pn%". + + LENGTH MODIFIERS + hh For "diouxXn" conversions, the next pointer from the argument stack is + assumed to point to a variable of of char width. + h For "diouxXn" conversions, the next pointer from the argument stack is + assumed to point to a variable of short int width. + l For "diouxXn" conversions, the next pointer from the argument stack is + assumed to point to a variable of long int width. + For "aAeEfFgG" conversions, it is assumed to point to a variable of type + double. + For "cs[" conversions, it is assumed to point to a variable of type + wchar_t. + ll For "diouxXn" conversions, the next pointer from the argument stack is + assumed to point to a variable of long long int width. + j For "diouxXn" conversions, the next pointer from the argument stack is + assumed to point to a variable of intmax_t width. + z For "diouxXn" conversions, the next pointer from the argument stack is + assumed to point to a variable of size_t width. + t For "diouxXn" conversions, the next pointer from the argument stack is + assumed to point to a variable of ptrdiff_t width. + L For "aAeEfFgG" conversions, the next pointer from the argument stack is + assumed to point to a variable of type long double. + Length modifiers appearing for any conversions not mentioned above will have + undefined behaviour. + If a length modifier appears with any conversion specifier other than as + specified above, the behavior is undefined. + + CONVERSION SPECIFIERS + d Matches an (optionally signed) decimal integer of the format expected + by strtol() with base 10. The next pointer from the argument stack is + assumed to point to a signed integer. + i Matches an (optionally signed) integer of the format expected by + strtol() with base 0. The next pointer from the argument stack is + assumed to point to a signed integer. + o Matches an (optionally signed) octal integer of the format expected by + strtoul() with base 8. The next pointer from the argument stack is + assumed to point to an unsigned integer. + u Matches an (optionally signed) decimal integer of the format expected + by strtoul() with base 10. The next pointer from the argument stack is + assumed to point to an unsigned integer. + x Matches an (optionally signed) hexadecimal integer of the format + expected by strtoul() with base 16. The next pointer from the argument + stack is assumed to point to an unsigned integer. + aefg Matches an (optionally signed) floating point number, infinity, or not- + a-number-value of the format expected by strtod(). The next pointer + from the argument stack is assumed to point to a float. + c Matches a number of characters as specified by the field width (default + 1). The next pointer from the argument stack is assumed to point to a + character array large enough to hold that many characters. + If the 'l' length modifier is given, the input is assumed to match a + sequence of multibyte characters (starting in the initial shift state), + which will be converted to a wide character sequence as by successive + calls to mbrtowc() with a mbstate_t object initialized to zero prior to + the first conversion. The next pointer from the argument stack is + assumed to point to a wchar_t array large enough to hold that many + characters. + In either case, note that no '\0' character is added to terminate the + sequence. + s Matches a sequence of non-white-space characters. The next pointer from + the argument stack is assumed to point to a character array large + enough to hold the sequence including terminating '\0' character. + If the 'l' length modifier is given, the input is assumed to match a + sequence of multibyte characters (starting in the initial shift state), + which will be converted to a wide character sequence as by a call to + mbrtowc() with a mbstate_t object initialized to zero prior to the + first conversion. The next pointer from the argument stack is assumed + to point to a wchar_t array large enough to hold the sequence including + terminating '\0' character. + [ Matches a nonempty sequence consisting of any of those characters + specified between itself and a corresponding closing bracket (']'). + If the first character in the list is a circumflex ('^'), this matches + a nonempty sequence consisting of any characters NOT specified. If the + closing bracket appears as the first character in the scanset ("[]" or + "[^]", it is assumed to belong to the scanset, which then ends with the + NEXT closing bracket. + If there is a '-' character in the scanset which is not the first after + the opening bracket (or the circumflex, see above) or the last in the + scanset, behaviour is implementation-defined. This implementation + handles this character like any other. + + The extend of the input field is determined byte-by-byte for the above + conversions ('c', 's', '['), with no special provisions being made for + multibyte characters. The resulting field is nevertheless a multibyte + sequence begining in intial shift state. + + p Matches a sequence of characters as produced by the printf() "%p" + conversion. The next pointer from the argument stack is assumed to + point to a void pointer, which will be filled with the same location + as the pointer used in the printf() statement. Note that behaviour is + undefined if the input value is not the result of an earlier printf() + call. + n Does not read input. The next pointer from the argument stack is + assumed to point to a signed integer, into which the number of + characters read from input so far by this call to fscanf() is stored. + This does not affect the return value of fscanf(). The behaviour, + should an assignment-supressing character of field width be given, + is undefined. + This can be used to test the success of literal matches and suppressed + assignments. + % Matches a single, verbatim '%' character. + + A, E, F, G and X are valid, and equivalent to their lowercase counterparts. + + All conversions except [, c, or n imply that whitespace characters from the + input stream are consumed until a non-whitespace character is encountered. + Such whitespaces do not count against a maximum field width. + + Conversions push at most one character back into the input stream. That + implies that some character sequences converted by the strtol() and strtod() + function families are not converted identically by the scnaf() function + family. + + Returns the number of input items successfully assigned. This can be zero if + an early mismatch occurs. Returns EOF if an input failure occurs before the + first conversion. +*/ +int fscanf( struct _PDCLIB_file_t * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, ... ); + +/* Equivalent to fprintf( stdout, format, ... ). */ +int printf( const char * _PDCLIB_restrict format, ... ); + +/* Equivalent to fscanf( stdin, format, ... ). */ +int scanf( const char * _PDCLIB_restrict format, ... ); + +/* Equivalent to fprintf( stdout, format, ... ), except that the result is + written into the buffer pointed to by s, instead of stdout, and that any + characters beyond the (n-1)th are discarded. The (n)th character is + replaced by a '\0' character in this case. + Returns the number of characters that would have been written (not counting + the terminating '\0' character) if n had been sufficiently large, if + successful, and a negative number if an encoding error ocurred. +*/ +int snprintf( char * _PDCLIB_restrict s, size_t n, const char * _PDCLIB_restrict format, ... ); + +/* Equivalent to fprintf( stdout, format, ... ), except that the result is + written into the buffer pointed to by s, instead of stdout. +*/ +int sprintf( char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, ... ); + +/* Equivalent to fscanf( stdin, format, ... ), except that the input is read + from the buffer pointed to by s, instead of stdin. +*/ +int sscanf( const char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, ... ); + +/* Equivalent to fprintf( stream, format, ... ), except that the argument stack + is passed as va_list parameter. Note that va_list is not declared by + . +*/ +int vfprintf( struct _PDCLIB_file_t * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ); + +/* Equivalent to fscanf( stream, format, ... ), except that the argument stack + is passed as va_list parameter. Note that va_list is not declared by + . +*/ +int vfscanf( struct _PDCLIB_file_t * _PDCLIB_restrict stream, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ); + +/* Equivalent to fprintf( stdout, format, ... ), except that the argument stack + is passed as va_list parameter. Note that va_list is not declared by + . +*/ +int vprintf( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ); + +/* Equivalent to fscanf( stdin, format, ... ), except that the argument stack + is passed as va_list parameter. Note that va_list is not declared by + . +*/ +int vscanf( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ); + +/* Equivalent to snprintf( s, n, format, ... ), except that the argument stack + is passed as va_list parameter. Note that va_list is not declared by + . + */ +int vsnprintf( char * _PDCLIB_restrict s, size_t n, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ); + +/* Equivalent to fprintf( stdout, format, ... ), except that the argument stack + is passed as va_list parameter, and the result is written to the buffer + pointed to by s, instead of stdout. Note that va_list is not declared by + . +*/ +int vsprintf( char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ); + +/* Equivalent to fscanf( stdin, format, ... ), except that the argument stack + is passed as va_list parameter, and the input is read from the buffer + pointed to by s, instead of stdin. Note that va_list is not declared by + . +*/ +int vsscanf( const char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ); + +/* Character input/output functions */ + +/* Retrieve the next character from given stream. + Returns the character, EOF otherwise. + If end-of-file is reached, the EOF indicator of the stream is set. + If a read error occurs, the error indicator of the stream is set. +*/ +int fgetc( struct _PDCLIB_file_t * stream ); + +/* Read at most n-1 characters from given stream into the array s, stopping at + \n or EOF. Terminate the read string with \n. If EOF is encountered before + any characters are read, leave the contents of s unchanged. + Returns s if successful, NULL otherwise. + If a read error occurs, the error indicator of the stream is set. In this + case, the contents of s are indeterminate. +*/ +char * fgets( char * _PDCLIB_restrict s, int n, struct _PDCLIB_file_t * _PDCLIB_restrict stream ); + +/* Write the value c (cast to unsigned char) to the given stream. + Returns c if successful, EOF otherwise. + If a write error occurs, sets the error indicator of the stream is set. +*/ +int fputc( int c, struct _PDCLIB_file_t * stream ); + +/* Write the string s (not including the terminating \0) to the given stream. + Returns a value >=0 if successful, EOF otherwise. + This implementation does set the error indicator of the stream if a write + error occurs. +*/ +int fputs( const char * _PDCLIB_restrict s, struct _PDCLIB_file_t * _PDCLIB_restrict stream ); + +/* Equivalent to fgetc( stream ), but may be implemented as a macro that + evaluates its parameter more than once. +*/ +#define getc( stream ) fgetc( stream ) + +/* Equivalent to fgetc( stdin ), but may be implemented as a macro. */ +#define getchar() fgetc( stdin ) + +/* Read characters from given stream into the array s, stopping at \n or EOF. + The string read is terminated with \0. Returns s if successful. If EOF is + encountered before any characters are read, the contents of s are unchanged, + and NULL is returned. If a read error occurs, the contents of s are indeter- + minate, and NULL is returned. +*/ +char * gets( char * s ); + +/* Equivalent to fputc( c, stream ), but may be implemented as a macro that + evaluates its parameter more than once. +*/ +#define putc( c, stream ) fputc( c, stream ) + +/* Equivalent to fputc( c, stdout ), but may be implemented as a macro that + evaluates its parameter more than once. +*/ +#define putchar( c ) putc( c, stdout ) + +/* Write the string s (not including the terminating \0) to stdout, and append + a newline to the output. Returns a value >= 0 when successful, EOF if a + write error occurred. +*/ +int puts( const char * s ); + +/* Push the value c (cast to unsigned char) back onto the given (input) stream. + A character pushed back in this way will be delivered by subsequent read + operations (and skipped by subsequent file positioning operations) as if it + has not been read. The external representation of the stream is unaffected + by this pushback (it is a buffer operation). One character of pushback is + guaranteed, further pushbacks may fail. EOF as value for c does not change + the input stream and results in failure of the function. + For text files, the file position indicator is indeterminate until all + pushed-back characters are read. For binary files, the file position + indicator is decremented by each successful call of ungetc(). If the file + position indicator for a binary file was zero before the call of ungetc(), + behaviour is undefined. (Older versions of the library allowed such a call.) + Returns the pushed-back character if successful, EOF if it fails. +*/ +int ungetc( int c, struct _PDCLIB_file_t * stream ); + +/* Direct input/output functions */ + +/* Read up to nmemb elements of given size from given stream into the buffer + pointed to by ptr. Returns the number of elements successfully read, which + may be less than nmemb if a read error or EOF is encountered. If a read + error is encountered, the value of the file position indicator is + indeterminate. If a partial element is read, its value is indeterminate. + If size or nmemb are zero, the function does nothing and returns zero. +*/ +size_t fread( void * _PDCLIB_restrict ptr, size_t size, size_t nmemb, struct _PDCLIB_file_t * _PDCLIB_restrict stream ); + +/* Write up to nmemb elements of given size from buffer pointed to by ptr to + the given stream. Returns the number of elements successfully written, which + will be less than nmemb only if a write error is encountered. If a write + error is encountered, the value of the file position indicator is + indeterminate. If size or nmemb are zero, the function does nothing and + returns zero. +*/ +size_t fwrite( const void * _PDCLIB_restrict ptr, size_t size, size_t nmemb, struct _PDCLIB_file_t * _PDCLIB_restrict stream ); + +/* File positioning functions */ + +/* Store the current position indicator (and, where appropriate, the current + mbstate_t status object) for the given stream into the given pos object. The + actual contents of the object are unspecified, but it can be used as second + parameter to fsetpos() to reposition the stream to the exact position and + parse state at the time fgetpos() was called. + Returns zero if successful, nonzero otherwise. + TODO: Implementation-defined errno setting for fgetpos(). +*/ +int fgetpos( struct _PDCLIB_file_t * _PDCLIB_restrict stream, fpos_t * _PDCLIB_restrict pos ); + +/* Set the position indicator for the given stream to the given offset from: + - the beginning of the file if whence is SEEK_SET, + - the current value of the position indicator if whence is SEEK_CUR, + - end-of-file if whence is SEEK_END. + On text streams, non-zero offsets are only allowed with SEEK_SET, and must + have been returned by ftell() for the same file. + Any characters buffered by ungetc() are dropped, the end-of-file indicator + for the stream is cleared. If the given stream is an update stream, the next + operation after a successful fseek() may be either input or output. + Returns zero if successful, nonzero otherwise. If a read/write error occurs, + the error indicator for the given stream is set. +*/ +int fseek( struct _PDCLIB_file_t * stream, long int offset, int whence ); + +/* Set the position indicator (and, where appropriate the mbstate_t status + object) for the given stream to the given pos object (created by an earlier + call to fgetpos() on the same file). + Any characters buffered by ungetc() are dropped, the end-of-file indicator + for the stream is cleared. If the given stream is an update stream, the next + operation after a successful fsetpos() may be either input or output. + Returns zero if successful, nonzero otherwise. If a read/write error occurs, + the error indicator for the given stream is set. + TODO: Implementation-defined errno setting for fsetpos(). +*/ +int fsetpos( struct _PDCLIB_file_t * stream, const fpos_t * pos ); + +/* Return the current offset of the given stream from the beginning of the + associated file. For text streams, the exact value returned is unspecified + (and may not be equal to the number of characters), but may be used in + subsequent calls to fseek(). + Returns -1L if unsuccessful. + TODO: Implementation-defined errno setting for ftell(). +*/ +long int ftell( struct _PDCLIB_file_t * stream ); + +/* Equivalent to (void)fseek( stream, 0L, SEEK_SET ), except that the error + indicator for the stream is also cleared. +*/ +void rewind( struct _PDCLIB_file_t * stream ); + +/* Error-handling functions */ + +/* Clear the end-of-file and error indicators for the given stream. */ +void clearerr( struct _PDCLIB_file_t * stream ); + +/* Return zero if the end-of-file indicator for the given stream is not set, + nonzero otherwise. +*/ +int feof( struct _PDCLIB_file_t * stream ); + +/* Return zero if the error indicator for the given stream is not set, nonzero + otherwise. +*/ +int ferror( struct _PDCLIB_file_t * stream ); + +/* If s is neither a NULL pointer nor an empty string, print the string to + stderr (with appended colon (':') and a space) first. In any case, print an + error message depending on the current value of errno (being the same as if + strerror( errno ) had been called). +*/ +void perror( const char * s ); + +#endif diff --git a/user/pdclib/includes/stdlib.h b/user/pdclib/includes/stdlib.h new file mode 100644 index 0000000..06eb9ce --- /dev/null +++ b/user/pdclib/includes/stdlib.h @@ -0,0 +1,244 @@ +/* $Id$ */ + +/* General utilities + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef _PDCLIB_STDLIB_H +#define _PDCLIB_STDLIB_H _PDCLIB_STDLIB_H + +#ifndef _PDCLIB_INT_H +#define _PDCLIB_INT_H _PDCLIB_INT_H +#include <_PDCLIB_int.h> +#endif + +#ifndef _PDCLIB_SIZE_T_DEFINED +#define _PDCLIB_SIZE_T_DEFINED _PDCLIB_SIZE_T_DEFINED +typedef _PDCLIB_size_t size_t; +#endif + +#ifndef _PDCLIB_NULL_DEFINED +#define _PDCLIB_NULL_DEFINED _PDCLIB_NULL_DEFINED +#define NULL _PDCLIB_NULL +#endif + +/* Numeric conversion functions */ + +/* TODO: atof(), strtof(), strtod(), strtold() */ + +double atof( const char * nptr ); +double strtod( const char * _PDCLIB_restrict nptr, char * * _PDCLIB_restrict endptr ); +float strtof( const char * _PDCLIB_restrict nptr, char * * _PDCLIB_restrict endptr ); +long double strtold( const char * _PDCLIB_restrict nptr, char * * _PDCLIB_restrict endptr ); + +/* Seperate the character array nptr into three parts: A (possibly empty) + sequence of whitespace characters, a character representation of an integer + to the given base, and trailing invalid characters (including the terminating + null character). If base is 0, assume it to be 10, unless the integer + representation starts with 0x / 0X (setting base to 16) or 0 (setting base to + 8). If given, base can be anything from 0 to 36, using the 26 letters of the + base alphabet (both lowercase and uppercase) as digits 10 through 35. + The integer representation is then converted into the return type of the + function. It can start with a '+' or '-' sign. If the sign is '-', the result + of the conversion is negated. + If the conversion is successful, the converted value is returned. If endptr + is not a NULL pointer, a pointer to the first trailing invalid character is + returned in *endptr. + If no conversion could be performed, zero is returned (and nptr in *endptr, + if endptr is not a NULL pointer). If the converted value does not fit into + the return type, the functions return LONG_MIN, LONG_MAX, ULONG_MAX, + LLONG_MIN, LLONG_MAX, or ULLONG_MAX respectively, depending on the sign of + the integer representation and the return type, and errno is set to ERANGE. +*/ +long int strtol( const char * _PDCLIB_restrict nptr, char * * _PDCLIB_restrict endptr, int base ); +long long int strtoll( const char * _PDCLIB_restrict nptr, char * * _PDCLIB_restrict endptr, int base ); +unsigned long int strtoul( const char * _PDCLIB_restrict nptr, char * * _PDCLIB_restrict endptr, int base ); +unsigned long long int strtoull( const char * _PDCLIB_restrict nptr, char * * _PDCLIB_restrict endptr, int base ); + +/* These functions are the equivalent of (int)strtol( nptr, NULL, 10 ), + strtol( nptr, NULL, 10 ) and strtoll(nptr, NULL, 10 ) respectively, with the + exception that they do not have to handle overflow situations in any defined + way. + (PDCLib does not simply forward these to their strtox() equivalents, but + provides a simpler atox() function that saves a couple of tests and simply + continues with the conversion in case of overflow.) +*/ +int atoi( const char * nptr ); +long int atol( const char * nptr ); +long long int atoll( const char * nptr ); + +/* Pseudo-random sequence generation functions */ + +extern unsigned long int _PDCLIB_seed; + +#define RAND_MAX 32767 + +/* Returns the next number in a pseudo-random sequence, which is between 0 and + RAND_MAX. + (PDCLib uses the implementation suggested by the standard document, which is + next = next * 1103515245 + 12345; return (unsigned int)(next/65536) % 32768;) +*/ +int rand( void ); + +/* Initialize a new pseudo-random sequence with the starting seed. Same seeds + result in the same pseudo-random sequence. The default seed is 1. +*/ +void srand( unsigned int seed ); + +/* Memory management functions */ + +/* Allocate a chunk of heap memory of given size. If request could not be + satisfied, return NULL. Otherwise, return a pointer to the allocated + memory. Memory contents are undefined. +*/ +void * malloc( size_t size ); + +/* Allocate a chunk of heap memory that is large enough to hold nmemb elements + of the given size, and zero-initialize that memory. If request could not be + satisfied, return NULL. Otherwise, return a pointer to the allocated + memory. +*/ +void * calloc( size_t nmemb, size_t size ); + +/* De-allocate a chunk of heap memory previously allocated using malloc(), + calloc(), or realloc(), and pointed to by ptr. If ptr does not match a + pointer previously returned by the mentioned allocation functions, or + free() has already been called for this ptr, behaviour is undefined. +*/ +void free( void * ptr ); + +/* Resize a chunk of memory previously allocated with malloc() and pointed to + by ptr to the given size (which might be larger or smaller than the original + size). Returns a pointer to the reallocated memory, or NULL if the request + could not be satisfied. Note that the resizing might include a memcpy() + from the original location to a different one, so the return value might or + might not equal ptr. If size is larger than the original size, the value of + memory beyond the original size is undefined. If ptr is NULL, realloc() + behaves like malloc(). +*/ +void * realloc( void * ptr, size_t size ); + +/* Communication with the environment */ + +/* These two can be passed to exit() or _Exit() as status values, to signal + successful and unsuccessful program termination, respectively. EXIT_SUCCESS + can be replaced by 0. How successful or unsuccessful program termination are + signaled to the environment, and what happens if exit() or _Exit() are being + called with a value that is neither of the three, is defined by the hosting + OS and its glue function. +*/ +#define EXIT_SUCCESS _PDCLIB_SUCCESS +#define EXIT_FAILURE _PDCLIB_FAILURE + +/* Initiate abnormal process termination, unless programm catches SIGABRT and + does not return from the signal handler. + This implementantion flushes all streams, closes all files, and removes any + temporary files before exiting with EXIT_FAILURE. + abort() does not return. +*/ +void abort( void ); + +/* Register a function that will be called on exit(), or when main() returns. + At least 32 functions can be registered this way, and will be called in + reverse order of registration (last-in, first-out). + Returns zero if registration is successfull, nonzero if it failed. +*/ +int atexit( void (*func)( void ) ); + +/* Normal process termination. Functions registered by atexit() (see above) are + called, streams flushed, files closed and temporary files removed before the + program is terminated with the given status. (See comment for EXIT_SUCCESS + and EXIT_FAILURE above.) + exit() does not return. +*/ +void exit( int status ); + +/* Normal process termination. Functions registered by atexit() (see above) are + NOT CALLED. This implementation DOES flush streams, close files and removes + temporary files before the program is teminated with the given status. (See + comment for EXIT_SUCCESS and EXIT_FAILURE above.) + _Exit() does not return. +*/ +void _Exit( int status ); + +/* Search an environment-provided key-value map for the given key name, and + return a pointer to the associated value string (or NULL if key name cannot + be found). The value string pointed to might be overwritten by a subsequent + call to getenv(). The library never calls getenv() itself. + Details on the provided keys and how to set / change them are determined by + the hosting OS and its glue function. +*/ +char * getenv( const char * name ); + +/* If string is a NULL pointer, system() returns nonzero if a command processor + is available, and zero otherwise. If string is not a NULL pointer, it is + passed to the command processor. If system() returns, it does so with a + value that is determined by the hosting OS and its glue function. +*/ +int system( const char * string ); + +/* Searching and sorting */ + +/* Do a binary search for a given key in the array with a given base pointer, + which consists of nmemb elements that are of the given size each. To compare + the given key with an element from the array, the given function compar is + called (with key as first parameter and a pointer to the array member as + second parameter); the function should return a value less than, equal to, + or greater than 0 if the key is considered to be less than, equal to, or + greater than the array element, respectively. + The function returns a pointer to the first matching element found, or NULL + if no match is found. +*/ +void * bsearch( const void * key, const void * base, size_t nmemb, size_t size, int (*compar)( const void *, const void * ) ); + +/* Do a quicksort on an array with a given base pointer, which consists of + nmemb elements that are of the given size each. To compare two elements from + the array, the given function compar is called, which should return a value + less than, equal to, or greater than 0 if the first argument is considered + to be less than, equal to, or greater than the second argument, respectively. + If two elements are compared equal, their order in the sorted array is not + specified. +*/ +void qsort( void * base, size_t nmemb, size_t size, int (*compar)( const void *, const void * ) ); + +/* Integer arithmetic functions */ + +/* Return the absolute value of the argument. Note that on machines using two- + complement's notation (most modern CPUs), the largest negative value cannot + be represented as positive value. In this case, behaviour is unspecified. +*/ +int abs( int j ); +long int labs( long int j ); +long long int llabs( long long int j ); + +/* These structures each have a member quot and a member rem, of type int (for + div_t), long int (for ldiv_t) and long long it (for lldiv_t) respectively. + The order of the members is platform-defined to allow the div() functions + below to be implemented efficiently. +*/ +typedef struct _PDCLIB_div_t div_t; +typedef struct _PDCLIB_ldiv_t ldiv_t; +typedef struct _PDCLIB_lldiv_t lldiv_t; + +/* Return quotient (quot) and remainder (rem) of an integer division in one of + the structs above. +*/ +div_t div( int numer, int denom ); +ldiv_t ldiv( long int numer, long int denom ); +lldiv_t lldiv( long long int numer, long long int denom ); + +/* TODO: Multibyte / wide character conversion functions */ + +/* TODO: Macro MB_CUR_MAX */ + +/* +int mblen( const char * s, size_t n ); +int mbtowc( wchar_t * _PDCLIB_restrict pwc, const char * _PDCLIB_restrict s, size_t n ); +int wctomb( char * s, wchar_t wc ); +size_t mbstowcs( wchar_t * _PDCLIB_restrict pwcs, const char * _PDCLIB_restrict s, size_t n ); +size_t wcstombs( char * _PDCLIB_restrict s, const wchar_t * _PDCLIB_restrict pwcs, size_t n ); +*/ + +#endif diff --git a/user/pdclib/includes/string.h b/user/pdclib/includes/string.h new file mode 100644 index 0000000..a9f935d --- /dev/null +++ b/user/pdclib/includes/string.h @@ -0,0 +1,191 @@ +/* $Id$ */ + +/* String handling + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef _PDCLIB_STRING_H +#define _PDCLIB_STRING_H _PDCLIB_STRING_H + +#ifndef _PDCLIB_INT_H +#define _PDCLIB_INT_H _PDCLIB_INT_H +#include <_PDCLIB_int.h> +#endif + +#ifndef _PDCLIB_SIZE_T_DEFINED +#define _PDCLIB_SIZE_T_DEFINED _PDCLIB_SIZE_T_DEFINED +typedef _PDCLIB_size_t size_t; +#endif + +#ifndef _PDCLIB_NULL_DEFINED +#define _PDCLIB_NULL_DEFINED _PDCLIB_NULL_DEFINED +#define NULL _PDCLIB_NULL +#endif + +/* String function conventions */ + +/* + In any of the following functions taking a size_t n to specify the length of + an array or size of a memory region, n may be 0, but the pointer arguments to + the call shall still be valid unless otherwise stated. +*/ + +/* Copying functions */ + +/* Copy a number of n characters from the memory area pointed to by s2 to the + area pointed to by s1. If the two areas overlap, behaviour is undefined. + Returns the value of s1. +*/ +void * memcpy( void * _PDCLIB_restrict s1, const void * _PDCLIB_restrict s2, size_t n ); + +/* Copy a number of n characters from the memory area pointed to by s2 to the + area pointed to by s1. The two areas may overlap. + Returns the value of s1. +*/ +void * memmove( void * _PDCLIB_restrict s1, const void * _PDCLIB_restrict s2, size_t n ); + +/* Copy the character array s2 (including terminating '\0' byte) into the + character array s1. + Returns the value of s1. +*/ +char * strcpy( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2 ); + +/* Copy a maximum of n characters from the character array s2 into the character + array s1. If s2 is shorter than n characters, '\0' bytes will be appended to + the copy in s1 until n characters have been written. If s2 is longer than n + characters, NO terminating '\0' will be written to s1. If the arrays overlap, + behaviour is undefined. + Returns the value of s1. +*/ +char * strncpy( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2, size_t n ); + +/* Concatenation functions */ + +/* Append the contents of the character array s2 (including terminating '\0') to + the character array s1 (first character of s2 overwriting the '\0' of s1). If + the arrays overlap, behaviour is undefined. + Returns the value of s1. +*/ +char * strcat( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2 ); + +/* Append a maximum of n characters from the character array s1 to the character + array s1 (first character of s2 overwriting the '\0' of s1). A terminating + '\0' is ALWAYS appended, even if the full n characters have already been + written. If the arrays overlap, behaviour is undefined. + Returns the value of s1. +*/ +char * strncat( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2, size_t n ); + +/* Comparison functions */ + +/* Compare the first n characters of the memory areas pointed to by s1 and s2. + Returns 0 if s1 == s2, a negative number if s1 < s2, and a positive number if + s1 > s2. +*/ +int memcmp( const void * s1, const void * s2, size_t n ); + +/* Compare the character arrays s1 and s2. + Returns 0 if s1 == s2, a negative number if s1 < s2, and a positive number if + s1 > s2. +*/ +int strcmp( const char * s1, const char * s2 ); + +/* Compare the character arrays s1 and s2, interpreted as specified by the + LC_COLLATE category of the current locale. + Returns 0 if s1 == s2, a negative number if s1 < s2, and a positive number if + s1 > s2. + TODO: Currently a dummy wrapper for strcmp() as PDCLib does not yet support + locales. +*/ +int strcoll( const char * s1, const char * s2 ); + +/* Compare no more than the first n characters of the character arrays s1 and + s2. + Returns 0 if s1 == s2, a negative number if s1 < s2, and a positive number if + s1 > s2. +*/ +int strncmp( const char * s1, const char * s2, size_t n ); + +/* Transform the character array s2 as appropriate for the LC_COLLATE setting of + the current locale. If length of resulting string is less than n, store it in + the character array pointed to by s1. Return the length of the resulting + string. +*/ +size_t strxfrm( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2, size_t n ); + +/* Search functions */ + +/* Search the first n characters in the memory area pointed to by s for the + character c (interpreted as unsigned char). + Returns a pointer to the first instance found, or NULL. +*/ +void * memchr( const void * s, int c, size_t n ); + +/* Search the character array s (including terminating '\0') for the character c + (interpreted as char). + Returns a pointer to the first instance found, or NULL. +*/ +char * strchr( const char * s, int c ); + +/* Determine the length of the initial substring of character array s1 which + consists only of characters not from the character array s2. + Returns the length of that substring. +*/ +size_t strcspn( const char * s1, const char * s2 ); + +/* Search the character array s1 for any character from the character array s2. + Returns a pointer to the first occurrence, or NULL. +*/ +char * strpbrk( const char * s1, const char * s2 ); + +/* Search the character array s (including terminating '\0') for the character c + (interpreted as char). + Returns a pointer to the last instance found, or NULL. +*/ +char * strrchr( const char * s, int c ); + +/* Determine the length of the initial substring of character array s1 which + consists only of characters from the character array s2. + Returns the length of that substring. +*/ +size_t strspn( const char * s1, const char * s2 ); + +/* Search the character array s1 for the substring in character array s2. + Returns a pointer to that sbstring, or NULL. If s2 is of length zero, + returns s1. +*/ +char * strstr( const char * s1, const char * s2 ); + +/* In a series of subsequent calls, parse a C string into tokens. + On the first call to strtok(), the first argument is a pointer to the to-be- + parsed C string. On subsequent calls, the first argument is NULL unless you + want to start parsing a new string. s2 holds an array of seperator characters + which can differ from call to call. Leading seperators are skipped, the first + trailing seperator overwritten with '\0'. + Returns a pointer to the next token. + WARNING: This function uses static storage, and as such is not reentrant. +*/ +char * strtok( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2 ); + +/* Miscellaneous functions */ + +/* Write the character c (interpreted as unsigned char) to the first n + characters of the memory area pointed to by s. + Returns s. +*/ +void * memset( void * s, int c, size_t n ); + +/* Map an error number to a (locale-specific) error message string. Error + numbers are typically errno values, but any number is mapped to a message. + TODO: PDCLib does not yet support locales. + TODO: strerror() not yet implemented. +char * strerror( int errnum ); +*/ + +/* Returns the length of the string s (excluding terminating '\0'). +*/ +size_t strlen( const char * s ); + +#endif diff --git a/user/pdclib/internals/_PDCLIB_aux.h b/user/pdclib/internals/_PDCLIB_aux.h new file mode 100644 index 0000000..71196a5 --- /dev/null +++ b/user/pdclib/internals/_PDCLIB_aux.h @@ -0,0 +1,66 @@ +/* $Id$ */ + +/* Auxiliary PDCLib code <_PDCLIB_aux.h> + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* -------------------------------------------------------------------------- */ +/* You should not have to edit anything in this file; if you DO have to, it */ +/* would be considered a bug / missing feature: notify the author(s). */ +/* -------------------------------------------------------------------------- */ + +/* -------------------------------------------------------------------------- */ +/* Standard Version */ +/* -------------------------------------------------------------------------- */ + +/* Many a compiler gets this wrong, so you might have to hardcode it instead. */ + +#if __STDC__ != 1 +#error Compiler does not define _ _STDC_ _ to 1 (not standard-compliant)! +#endif + +#ifndef __STDC_VERSION__ +#define _PDCLIB_C_VERSION 90 +#define _PDCLIB_restrict +#define _PDCLIB_inline +#elif __STDC_VERSION__ == 199409L +#define _PDCLIB_C_VERSION 95 +#define _PDCLIB_restrict +#define _PDCLIB_inline +#elif __STDC_VERSION__ == 199901L +#define _PDCLIB_C_VERSION 99 +#define _PDCLIB_restrict restrict +#define _PDCLIB_inline inline +#else +#error Unsupported _ _STDC_VERSION_ _ (__STDC_VERSION__) (supported: ISO/IEC 9899:1990, 9899/AMD1:1995, and 9899:1999). +#endif + +#ifndef __STDC_HOSTED__ +#error Compiler does not define _ _STDC_HOSTED_ _ (not standard-compliant)! +#elif __STDC_HOSTED__ == 0 +#define _PDCLIB_HOSTED 0 +#elif __STDC_HOSTED__ == 1 +#define _PDCLIB_HOSTED 1 +#else +#error Compiler does not define _ _STDC_HOSTED_ _ to 0 or 1 (not standard-compliant)! +#endif + +#if _PDCLIB_C_VERSION != 99 +#error PDCLib might not be fully conforming to either C89 or C95 prior to v2.x. +#endif + +/* -------------------------------------------------------------------------- */ +/* Helper macros: */ +/* _PDCLIB_cc( x, y ) concatenates two preprocessor tokens without extending */ +/* _PDCLIB_concat( x, y ) concatenates two preprocessor tokens with extending */ +/* -------------------------------------------------------------------------- */ + +#define _PDCLIB_cc( x, y ) x ## y +#define _PDCLIB_concat( x, y ) _PDCLIB_cc( x, y ) + +#define _PDCLIB_symbol2value( x ) #x +#define _PDCLIB_symbol2string( x ) _PDCLIB_symbol2value( x ) +#define _PDCLIB_symbol2identity( x ) x + diff --git a/user/pdclib/internals/_PDCLIB_config.h b/user/pdclib/internals/_PDCLIB_config.h new file mode 100644 index 0000000..0df1679 --- /dev/null +++ b/user/pdclib/internals/_PDCLIB_config.h @@ -0,0 +1,283 @@ +/* $Id$ */ + +/* Internal PDCLib configuration <_PDCLIB_config.h> + (Generic Template) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* -------------------------------------------------------------------------- */ +/* Misc */ +/* -------------------------------------------------------------------------- */ + +/* By default, PDCLib does some rather strict checking of function usage, */ +/* especially in . Things that are undefined by the standard - for */ +/* example, mixing byte / wide operations or read / write operations without */ +/* resetting the stream beforehand - are caught and handled graciously. This */ +/* adds some complexity, and eats a couple of clock cycles. If you want to */ +/* disable these checks, define _PDCLIB_STRICT to zero. */ +#define _PDCLIB_STRICT 1 + +/* The character (sequence) your platform uses as newline. */ +#define _PDCLIB_endl "\n" + +/* exit() can signal success to the host environment by the value of zero or */ +/* the constant EXIT_SUCCESS. Failure is signaled by EXIT_FAILURE. Note that */ +/* any other return value is "implementation-defined", i.e. your environment */ +/* is not required to handle it gracefully. Set your definitions here. */ +#define _PDCLIB_SUCCESS 0 +#define _PDCLIB_FAILURE -1 + +/* qsort() in requires a function that swaps two memory areas. */ +/* Below is a naive implementation that can be improved significantly for */ +/* specific platforms, e.g. by swapping int instead of char. */ +#define _PDCLIB_memswp( i, j, size ) char tmp; do { tmp = *i; *i++ = *j; *j++ = tmp; } while ( --size ); + +/* Define this to some compiler directive that can be written after the */ +/* parameter list of a function declaration to indicate the function does */ +/* never return. If your compiler does not support such a directive, define */ +/* to nothing. (This is to avoid warnings with the exit functions under GCC.) */ +#define _PDCLIB_NORETURN __attribute__(( noreturn )) + +/* -------------------------------------------------------------------------- */ +/* Integers */ +/* -------------------------------------------------------------------------- */ +/* Assuming 8-bit char, two's-complement architecture here. 'short' being */ +/* 16 bit, 'int' being either 16, 32 or 64 bit, 'long' being either 32 or 64 */ +/* bit (but 64 bit only if 'int' is 32 bit), and 'long long' being 64 bit if */ +/* 'long' is not, 64 or 128 bit otherwise. */ +/* Author is quite willing to support other systems but would like to hear of */ +/* interest in such support and details on the to-be-supported architecture */ +/* first, before going to lengths about it. */ +/* -------------------------------------------------------------------------- */ + +/* Comment out (or delete) the line below if your 'char' type is unsigned. */ +#define _PDCLIB_CHAR_SIGNED 1 + +/* Width of the integer types short, int, long, and long long, in bytes. */ +/* SHRT == 2, INT >= SHRT, LONG >= INT >= 4, LLONG >= LONG - check your */ +/* compiler manuals. */ +#define _PDCLIB_SHRT_BYTES 2 +#define _PDCLIB_INT_BYTES 4 +#define _PDCLIB_LONG_BYTES 4 +#define _PDCLIB_LLONG_BYTES 8 + +/* defines the div() function family that allows taking quotient */ +/* and remainder of an integer division in one operation. Many platforms */ +/* support this in hardware / opcode, and the standard permits ordering of */ +/* the return structure in any way to fit the hardware. That is why those */ +/* structs can be configured here. */ + +struct _PDCLIB_div_t +{ + int quot; + int rem; +}; + +struct _PDCLIB_ldiv_t +{ + long int quot; + long int rem; +}; + +struct _PDCLIB_lldiv_t +{ + long long int quot; + long long int rem; +}; + +/* -------------------------------------------------------------------------- */ +/* defines a set of integer types that are of a minimum width, and */ +/* "usually fastest" on the system. (If, for example, accessing a single char */ +/* requires the CPU to access a complete int and then mask out the char, the */ +/* "usually fastest" type of at least 8 bits would be int, not char.) */ +/* If you do not have information on the relative performance of the types, */ +/* the standard allows you to define any type that meets minimum width and */ +/* signedness requirements. */ +/* The defines below are just configuration for the real typedefs and limit */ +/* definitions done in <_PDCLIB_int.h>. The uppercase define shall be either */ +/* SHRT, INT, LONG, or LLONG (telling which values to use for the *_MIN and */ +/* *_MAX limits); the lowercase define either short, int, long, or long long */ +/* (telling the actual type to use). */ +/* If you require a non-standard datatype to define the "usually fastest" */ +/* types, PDCLib as-is doesn't support that. Please contact the author with */ +/* details on your platform in that case, so support can be added. */ +/* -------------------------------------------------------------------------- */ + +#define _PDCLIB_FAST8 INT +#define _PDCLIB_fast8 int + +#define _PDCLIB_FAST16 INT +#define _PDCLIB_fast16 int + +#define _PDCLIB_FAST32 INT +#define _PDCLIB_fast32 int + +#define _PDCLIB_FAST64 LLONG +#define _PDCLIB_fast64 long long + +/* -------------------------------------------------------------------------- */ +/* What follows are a couple of "special" typedefs and their limits. Again, */ +/* the actual definition of the limits is done in <_PDCLIB_int.h>, and the */ +/* defines here are merely "configuration". See above for details. */ +/* -------------------------------------------------------------------------- */ + +/* The result type of substracting two pointers */ +#define _PDCLIB_ptrdiff int +#define _PDCLIB_PTRDIFF INT + +/* An integer type that can be accessed as atomic entity (think asynchronous + interrupts). The type itself is not defined in a freestanding environment, + but its limits are. (Don't ask.) +*/ +#define _PDCLIB_sig_atomic int +#define _PDCLIB_SIG_ATOMIC INT + +/* Result type of the 'sizeof' operator (must be unsigned) */ +#define _PDCLIB_size unsigned int +#define _PDCLIB_SIZE UINT + +/* Large enough an integer to hold all character codes of the largest supported + locale. +*/ +#define _PDCLIB_wchar unsigned short +#define _PDCLIB_WCHAR USHRT + +#define _PDCLIB_intptr int +#define _PDCLIB_INTPTR INT + +/* Largest supported integer type. Implementation note: see _PDCLIB_atomax(). */ +#define _PDCLIB_intmax long long int +#define _PDCLIB_INTMAX LLINT +/* You are also required to state the literal suffix for the intmax type */ +#define _PDCLIB_INTMAX_LITERAL ll + +/* -------------------------------------------------------------------------- */ +/* Floating Point */ +/* -------------------------------------------------------------------------- */ + +/* Whether the implementation rounds toward zero (0), to nearest (1), toward + positive infinity (2), or toward negative infinity (3). (-1) signifies + indeterminable rounding, any other value implementation-specific rounding. +*/ +#define _PDCLIB_FLT_ROUNDS -1 + +/* Whether the implementation uses exact-width precision (0), promotes float + to double (1), or promotes float and double to long double (2). (-1) + signifies indeterminable behaviour, any other value implementation-specific + behaviour. +*/ +#define _PDCLIB_FLT_EVAL_METHOD -1 + +/* "Number of the decimal digits (n), such that any floating-point number in the + widest supported floating type with p(max) radix (b) digits can be rounded to + a floating-point number with (n) decimal digits and back again without change + to the value p(max) log(10)b if (b) is a power of 10, [1 + p(max) log(10)b] + otherwise." + 64bit IEC 60559 double format (53bit mantissa) is DECIMAL_DIG 17. + 80bit IEC 60559 double-extended format (64bit mantissa) is DECIMAL_DIG 21. +*/ +#define _PDCLIB_DECIMAL_DIG 17 + +/* -------------------------------------------------------------------------- */ +/* Platform-dependent macros defined by the standard headers. */ +/* -------------------------------------------------------------------------- */ + +/* The offsetof macro + Contract: Expand to an integer constant expression of type size_t, which + represents the offset in bytes to the structure member from the beginning + of the structure. If the specified member is a bitfield, behaviour is + undefined. + There is no standard-compliant way to do this. + This implementation casts an integer zero to 'pointer to type', and then + takes the address of member. This is undefined behaviour but should work on + most compilers. +*/ +#define _PDCLIB_offsetof( type, member ) ( (size_t) &( ( (type *) 0 )->member ) ) + +/* Variable Length Parameter List Handling () + The macros defined by are highly dependent on the calling + conventions used, and you probably have to replace them with builtins of + your compiler. The following generic implementation works only for pure + stack-based architectures, and only if arguments are aligned to pointer + type. Credits to Michael Moody, who contributed this to the Public Domain. +*/ + +/* Internal helper macro. va_round is not part of . */ +#define _PDCLIB_va_round( type ) ( (sizeof(type) + sizeof(void *) - 1) & ~(sizeof(void *) - 1) ) + +typedef char * _PDCLIB_va_list; +#define _PDCLIB_va_arg( ap, type ) ( (ap) += (_PDCLIB_va_round(type)), ( *(type*) ( (ap) - (_PDCLIB_va_round(type)) ) ) ) +#define _PDCLIB_va_copy( dest, src ) ( (dest) = (src), (void)0 ) +#define _PDCLIB_va_end( ap ) ( (ap) = (void *)0, (void)0 ) +#define _PDCLIB_va_start( ap, parmN ) ( (ap) = (char *) &parmN + ( _PDCLIB_va_round(parmN) ), (void)0 ) + +/* -------------------------------------------------------------------------- */ +/* OS "glue", part 1 */ +/* These are values and data type definitions that you would have to adapt to */ +/* the capabilities and requirements of your OS. */ +/* The actual *functions* of the OS interface are declared in _PDCLIB_glue.h. */ +/* -------------------------------------------------------------------------- */ + +/* Memory management -------------------------------------------------------- */ + +/* Set this to the page size of your OS. If your OS does not support paging, set + to an appropriate value. (Too small, and malloc() will call the kernel too + often. Too large, and you will waste memory.) +*/ +#define _PDCLIB_PAGESIZE 4096 + +/* Set this to the minimum memory node size. Any malloc() for a smaller size + will be satisfied by a malloc() of this size instead (to avoid excessive + fragmentation). +*/ +#define _PDCLIB_MINALLOC 8 + +/* I/O ---------------------------------------------------------------------- */ + +/* The type of the file descriptor returned by _PDCLIB_open(). */ +typedef int _PDCLIB_fd_t; + +/* The value (of type _PDCLIB_fd_t) returned by _PDCLIB_open() if the operation + failed. +*/ +#define _PDCLIB_NOHANDLE ( (_PDCLIB_fd_t) -1 ) + +/* A type in which to store file offsets. See fgetpos() / fsetpos(). */ +/* FIXME: The 'int' types here are placeholders. When changed, check out + stdinit.c, too. */ +typedef struct +{ + int position; + int mbstate; +} _PDCLIB_fpos_t; + +/* The default size for file buffers. Must be at least 256. */ +#define _PDCLIB_BUFSIZ 1024 + +/* The minimum number of files the implementation can open simultaneously. Must + be at least 8. Depends largely on how the bookkeeping is done by fopen() / + freopen() / fclose(). +*/ +#define _PDCLIB_FOPEN_MAX 8 + +/* Length of the longest filename the implementation guarantees to support. */ +#define _PDCLIB_FILENAME_MAX 128 + +/* Buffer size for tmpnam(). */ +#define _PDCLIB_L_tmpnam 100 + +/* Number of distinct file names that can be generated by tmpnam(). */ +#define _PDCLIB_TMP_MAX 50 + +/* The number of times fflush() tries to write a file buffer before giving up + if no characters can be written. +*/ +#define _PDCLIB_FLUSH_RETRIES 3 +/* This macro is executed after each try to write characters that results in + no characters being written. You can define this to be empty, wait a short + period of time, or whatever suits your environment. +*/ +#define _PDCLIB_FLUSH_RETRY_PREP + diff --git a/user/pdclib/internals/_PDCLIB_glue.h b/user/pdclib/internals/_PDCLIB_glue.h new file mode 100644 index 0000000..db29f1e --- /dev/null +++ b/user/pdclib/internals/_PDCLIB_glue.h @@ -0,0 +1,71 @@ +/* $Id$ */ + +/* OS glue functions declaration <_PDCLIB_glue.h> + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef _PDCLIB_INT_H +#define _PDCLIB_INT_H _PDCLIB_INT_H +#include <_PDCLIB_int.h> +#endif + +/* -------------------------------------------------------------------------- */ +/* OS "glue", part 2 */ +/* These are the functions you will have to touch, as they are where PDCLib */ +/* interfaces with the operating system. */ +/* Some operate on data types defined by _PDCLIB_config.h. */ +/* -------------------------------------------------------------------------- */ + +/* A system call that terminates the calling process, returning a given status + to the environment. +*/ +void _PDCLIB_Exit( int status ) _PDCLIB_NORETURN; + +/* A system call that adds n pages of memory to the process heap (if n is + positive), or releases n pages from the process heap (if n is negative). + Return a (void *) pointing to the *former* end-of-heap if successful, NULL + otherwise. +*/ +void * _PDCLIB_allocpages( int n ); + +/* A system call that opens a file identified by name in a given mode. Return + a file descriptor uniquely identifying that file. + (The mode is the return value of the _PDCLIB_filemode() function.) +*/ +_PDCLIB_fd_t _PDCLIB_open( char const * const filename, unsigned int mode ); + +/* A system call that writes up to n characters to a file identified by given + file descriptor. Return the number of characters actually written, or -1 + if an error occured. Note that the number of characters may well be lower + than n without an error having occured. +*/ +int _PDCLIB_write( struct _PDCLIB_file_t * stream, char const * buffer, int n ); + +/* A system call that reads n characters into a buffer, from a file identified + by given file descriptor. Return the number of characters read. +*/ +_PDCLIB_size_t _PDCLIB_read( _PDCLIB_fd_t fd, char * buffer, _PDCLIB_size_t n ); + +/* A system call that closes a file identified by given file descriptor. Return + zero on success, non-zero otherwise. +*/ +int _PDCLIB_close( _PDCLIB_fd_t fd ); + +/* A system call that removes a file identified by name. Return zero on success, + non-zero otherwise. +*/ +int _PDCLIB_remove( const char * filename ); + +/* A system call that renames a file from given old name to given new name. + Return zero on success, non-zero otherwise. In case of failure, the file + must still be accessible by old name. +*/ +int _PDCLIB_rename( const char * old, const char * new ); + +/* A system call that returns one if the given file descriptor refers to an + interactive device, and zero otherwise. + */ +int _PDCLIB_interactive_stream( _PDCLIB_fd_t fd ); + diff --git a/user/pdclib/internals/_PDCLIB_int.h b/user/pdclib/internals/_PDCLIB_int.h new file mode 100644 index 0000000..99e99ba --- /dev/null +++ b/user/pdclib/internals/_PDCLIB_int.h @@ -0,0 +1,357 @@ +/* $Id$ */ + +/* PDCLib internal integer logic <_PDCLIB_int.h> + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* -------------------------------------------------------------------------- */ +/* You should not have to edit anything in this file; if you DO have to, it */ +/* would be considered a bug / missing feature: notify the author(s). */ +/* -------------------------------------------------------------------------- */ + +#ifndef _PDCLIB_CONFIG_H +#define _PDCLIB_CONFIG_H _PDCLIB_CONFIG_H +#include <_PDCLIB_config.h> +#endif + +#ifndef _PDCLIB_AUX_H +#define _PDCLIB_AUX_H _PDCLIB_AUX_H +#include <_PDCLIB_aux.h> +#endif + +/* null pointer constant */ +#define _PDCLIB_NULL 0 + +/* -------------------------------------------------------------------------- */ +/* Limits of native datatypes */ +/* -------------------------------------------------------------------------- */ +/* The definition of minimum limits for unsigned datatypes is done because */ +/* later on we will "construct" limits for other abstract types: */ +/* USHRT -> _PDCLIB_ + USHRT + _MIN -> _PDCLIB_USHRT_MIN -> 0 */ +/* INT -> _PDCLIB_ + INT + _MIN -> _PDCLIB_INT_MIN -> ... you get the idea. */ +/* -------------------------------------------------------------------------- */ + +/* Setting 'char' limits */ +#define _PDCLIB_CHAR_BIT 8 +#define _PDCLIB_UCHAR_MIN 0 +#define _PDCLIB_UCHAR_MAX 0xff +#define _PDCLIB_SCHAR_MIN (-0x7f - 1) +#define _PDCLIB_SCHAR_MAX 0x7f +#ifdef _PDCLIB_CHAR_SIGNED +#define _PDCLIB_CHAR_MIN _PDCLIB_SCHAR_MIN +#define _PDCLIB_CHAR_MAX _PDCLIB_SCHAR_MAX +#else +#define _PDCLIB_CHAR_MIN 0 +#define _PDCLIB_CHAR_MAX _PDCLIB_UCHAR_MAX +#endif + +/* Setting 'short' limits */ +#if _PDCLIB_SHRT_BYTES == 2 +#define _PDCLIB_SHRT_MAX 0x7fff +#define _PDCLIB_SHRT_MIN (-0x7fff - 1) +#define _PDCLIB_USHRT_MAX 0xffff +#else +#error Unsupported width of 'short' (not 16 bit). +#endif +#define _PDCLIB_USHRT_MIN 0 + +#if _PDCLIB_INT_BYTES < _PDCLIB_SHRT_BYTES +#error Bogus setting: short > int? Check _PDCLIB_config.h. +#endif + +/* Setting 'int' limits */ +#if _PDCLIB_INT_BYTES == 2 +#define _PDCLIB_INT_MAX 0x7fff +#define _PDCLIB_INT_MIN (-0x7fff - 1) +#define _PDCLIB_UINT_MAX 0xffffU +#elif _PDCLIB_INT_BYTES == 4 +#define _PDCLIB_INT_MAX 0x7fffffff +#define _PDCLIB_INT_MIN (-0x7fffffff - 1) +#define _PDCLIB_UINT_MAX 0xffffffffU +#elif _PDCLIB_INT_BYTES == 8 +#define _PDCLIB_INT_MAX 0x7fffffffffffffff +#define _PDCLIB_INT_MIN (-0x7fffffffffffffff - 1) +#define _PDCLIB_UINT_MAX 0xffffffffffffffff +#else +#error Unsupported width of 'int' (neither 16, 32, nor 64 bit). +#endif +#define _PDCLIB_UINT_MIN 0 + +/* Setting 'long' limits */ +#if _PDCLIB_LONG_BYTES == 4 +#define _PDCLIB_LONG_MAX 0x7fffffffL +#define _PDCLIB_LONG_MIN (-0x7fffffffL - 1L) +#define _PDCLIB_ULONG_MAX 0xffffffffUL +#elif _PDCLIB_LONG_BYTES == 8 +#define _PDCLIB_LONG_MAX 0x7fffffffffffffffL +#define _PDCLIB_LONG_MIN (-0x7fffffffffffffffL - 1L) +#define _PDCLIB_ULONG_MAX 0xffffffffffffffffUL +#else +#error Unsupported width of 'long' (neither 32 nor 64 bit). +#endif +#define _PDCLIB_ULONG_MIN 0 + +/* Setting 'long long' limits */ +#if _PDCLIB_LLONG_BYTES == 8 +#define _PDCLIB_LLONG_MAX 0x7fffffffffffffffLL +#define _PDCLIB_LLONG_MIN (-0x7fffffffffffffffLL - 1LL) +#define _PDCLIB_ULLONG_MAX 0xffffffffffffffffULL +#elif _PDCLIB_LLONG_BYTES == 16 +#define _PDCLIB_LLONG_MAX 0x7fffffffffffffffffffffffffffffffLL +#define _PDCLIB_LLONG_MIN (-0x7fffffffffffffffffffffffffffffffLL - 1LL) +#define _PDCLIB_ULLONG_MAX 0xffffffffffffffffffffffffffffffffLL +#else +#error Unsupported width of 'long long' (neither 64 nor 128 bit). +#endif +#define _PDCLIB_ULLONG_MIN 0 + +/* -------------------------------------------------------------------------- */ +/* exact-width types and their limits */ +/* -------------------------------------------------------------------------- */ + +/* Setting 'int8_t', its limits, and its literal. */ +#if _PDCLIB_CHAR_BIT == 8 +typedef signed char _PDCLIB_int8_t; +typedef unsigned char _PDCLIB_uint8_t; +#define _PDCLIB_INT8_MAX _PDCLIB_CHAR_MAX +#define _PDCLIB_INT8_MIN _PDCLIB_CHAR_MIN +#define _PDCLIB_UINT8_MAX _PDCLIB_UCHAR_MAX +#else +#error Unsupported width of char (not 8 bits). +#endif + +/* Setting 'int16_t', its limits, and its literal */ +#if _PDCLIB_INT_BYTES == 2 +typedef signed int _PDCLIB_int16_t; +typedef unsigned int _PDCLIB_uint16_t; +#define _PDCLIB_INT16_MAX _PDCLIB_INT_MAX +#define _PDCLIB_INT16_MIN _PDCLIB_INT_MIN +#define _PDCLIB_UINT16_MAX _PDCLIB_UINT_MAX +#elif _PDCLIB_SHRT_BYTES == 2 +typedef signed short _PDCLIB_int16_t; +typedef unsigned short _PDCLIB_uint16_t; +#define _PDCLIB_INT16_MAX _PDCLIB_SHRT_MAX +#define _PDCLIB_INT16_MIN _PDCLIB_SHRT_MIN +#define _PDCLIB_UINT16_MAX _PDCLIB_USHRT_MAX +#else +#error Neither 'short' nor 'int' are 16-bit. +#endif + +/* Setting 'int32_t', its limits, and its literal */ +#if _PDCLIB_INT_BYTES == 4 +typedef signed int _PDCLIB_int32_t; +typedef unsigned int _PDCLIB_uint32_t; +#define _PDCLIB_INT32_MAX _PDCLIB_INT_MAX +#define _PDCLIB_INT32_MIN _PDCLIB_INT_MIN +#define _PDCLIB_UINT32_MAX _PDCLIB_UINT_MAX +#define _PDCLIB_INT32_LITERAL +#define _PDCLIB_UINT32_LITERAL +#elif _PDCLIB_LONG_BYTES == 4 +typedef signed long _PDCLIB_int32_t; +typedef unsigned long _PDCLIB_uint32_t; +#define _PDCLIB_INT32_MAX _PDCLIB_LONG_MAX +#define _PDCLIB_INT32_MIN _PDCLIB_LONG_MIN +#define _PDCLIB_UINT32_MAX _PDCLIB_LONG_MAX +#define _PDCLIB_INT32_LITERAL l +#define _PDCLIB_UINT32_LITERAL ul +#else +#error Neither 'int' nor 'long' are 32-bit. +#endif + +#if _PDCLIB_LONG_BYTES == 8 +typedef signed long _PDCLIB_int64_t; +typedef unsigned long _PDCLIB_uint64_t; +#define _PDCLIB_INT64_MAX _PDCLIB_LONG_MAX +#define _PDCLIB_INT64_MIN _PDCLIB_LONG_MIN +#define _PDCLIB_UINT64_MAX _PDCLIB_ULONG_MAX +#define _PDCLIB_INT64_LITERAL l +#define _PDCLIB_UINT64_LITERAL ul +#elif _PDCLIB_LLONG_BYTES == 8 +typedef signed long long _PDCLIB_int64_t; +typedef unsigned long long _PDCLIB_uint64_t; +#define _PDCLIB_INT64_MAX _PDCLIB_LLONG_MAX +#define _PDCLIB_INT64_MIN _PDCLIB_LLONG_MIN +#define _PDCLIB_UINT64_MAX _PDCLIB_ULLONG_MAX +#define _PDCLIB_INT64_LITERAL ll +#define _PDCLIB_UINT64_LITERAL ull +#else +#error Neither 'long' nor 'long long' are 64-bit. +#endif + +/* -------------------------------------------------------------------------- */ +/* "fastest" types and their limits */ +/* -------------------------------------------------------------------------- */ +/* This is, admittedly, butt-ugly. But at least it's ugly where the average */ +/* user of PDCLib will never see it, and makes <_PDCLIB_config.h> much */ +/* cleaner. */ +/* -------------------------------------------------------------------------- */ + +typedef _PDCLIB_fast8 _PDCLIB_int_fast8_t; +typedef unsigned _PDCLIB_fast8 _PDCLIB_uint_fast8_t; +#define _PDCLIB_INT_FAST8_MIN _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_FAST8 ), _MIN ) +#define _PDCLIB_INT_FAST8_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_FAST8 ), _MAX ) +#define _PDCLIB_UINT_FAST8_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_U, _PDCLIB_FAST8 ), _MAX ) + +typedef _PDCLIB_fast16 _PDCLIB_int_fast16_t; +typedef unsigned _PDCLIB_fast16 _PDCLIB_uint_fast16_t; +#define _PDCLIB_INT_FAST16_MIN _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_FAST16 ), _MIN ) +#define _PDCLIB_INT_FAST16_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_FAST16 ), _MAX ) +#define _PDCLIB_UINT_FAST16_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_U, _PDCLIB_FAST16 ), _MAX ) + +typedef _PDCLIB_fast32 _PDCLIB_int_fast32_t; +typedef unsigned _PDCLIB_fast32 _PDCLIB_uint_fast32_t; +#define _PDCLIB_INT_FAST32_MIN _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_FAST32 ), _MIN ) +#define _PDCLIB_INT_FAST32_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_FAST32 ), _MAX ) +#define _PDCLIB_UINT_FAST32_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_U, _PDCLIB_FAST32 ), _MAX ) + +typedef _PDCLIB_fast64 _PDCLIB_int_fast64_t; +typedef unsigned _PDCLIB_fast64 _PDCLIB_uint_fast64_t; +#define _PDCLIB_INT_FAST64_MIN _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_FAST64 ), _MIN ) +#define _PDCLIB_INT_FAST64_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_FAST64 ), _MAX ) +#define _PDCLIB_UINT_FAST64_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_U, _PDCLIB_FAST64 ), _MAX ) + +/* -------------------------------------------------------------------------- */ +/* Various typedefs and limits */ +/* -------------------------------------------------------------------------- */ + +typedef _PDCLIB_ptrdiff _PDCLIB_ptrdiff_t; +#define _PDCLIB_PTRDIFF_MIN _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_PTRDIFF ), _MIN ) +#define _PDCLIB_PTRDIFF_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_PTRDIFF ), _MAX ) + +#define _PDCLIB_SIG_ATOMIC_MIN _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_SIG_ATOMIC ), _MIN ) +#define _PDCLIB_SIG_ATOMIC_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_SIG_ATOMIC ), _MAX ) + +typedef _PDCLIB_size _PDCLIB_size_t; +#define _PDCLIB_SIZE_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_SIZE ), _MAX ) + +typedef _PDCLIB_wchar _PDCLIB_wchar_t; +#define _PDCLIB_WCHAR_MIN _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_WCHAR ), _MIN ) +#define _PDCLIB_WCHAR_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_WCHAR ), _MAX ) + +typedef _PDCLIB_intptr _PDCLIB_intptr_t; +typedef unsigned _PDCLIB_intptr _PDCLIB_uintptr_t; +#define _PDCLIB_INTPTR_MIN _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_INTPTR ), _MIN ) +#define _PDCLIB_INTPTR_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_INTPTR ), _MAX ) +#define _PDCLIB_UINTPTR_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_U, _PDCLIB_INTPTR ), _MAX ) + +typedef _PDCLIB_intmax _PDCLIB_intmax_t; +typedef unsigned _PDCLIB_intmax _PDCLIB_uintmax_t; +#define _PDCLIB_INTMAX_MIN _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_INTMAX ), _MIN ) +#define _PDCLIB_INTMAX_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_, _PDCLIB_INTMAX ), _MAX ) +#define _PDCLIB_UINTMAX_MAX _PDCLIB_concat( _PDCLIB_concat( _PDCLIB_U, _PDCLIB_INTMAX ), _MAX ) +#define _PDCLIB_INTMAX_C( value ) _PDCLIB_concat( value, _PDCLIB_INTMAX_LITERAL ) +#define _PDCLIB_UINTMAX_C( value ) _PDCLIB_concat( value, _PDCLIB_concat( u, _PDCLIB_INTMAX_LITERAL ) ) + +/* -------------------------------------------------------------------------- */ +/* Various internals */ +/* -------------------------------------------------------------------------- */ + +/* Flags for representing mode (see fopen()). Note these must fit the same + status field as the _IO?BF flags in and the internal flags below. +*/ +#define _PDCLIB_FREAD 8u +#define _PDCLIB_FWRITE 16u +#define _PDCLIB_FAPPEND 32u +#define _PDCLIB_FRW 64u +#define _PDCLIB_FBIN 128u + +/* Internal flags, made to fit the same status field as the flags above. */ +#define _PDCLIB_LIBBUFFER 512u +#define _PDCLIB_VIRGINSTR 1024u +#define _PDCLIB_ERRORFLAG 2048u +#define _PDCLIB_EOFFLAG 4096u +#define _PDCLIB_WIDESTREAM 8192u +#define _PDCLIB_BYTESTREAM 16384u +#define _PDCLIB_WROTELAST 32768u + +struct _PDCLIB_file_t +{ + _PDCLIB_fd_t handle; /* OS-specific file descriptor */ + _PDCLIB_fpos_t position; /* file position indicator */ + char * buffer; /* file buffer */ + _PDCLIB_size_t bufsize; /* size of buffer */ + _PDCLIB_size_t bufidx; /* index to point of action in buffer */ + _PDCLIB_size_t bufend; /* index to end of pre-read buffer */ + unsigned int status; /* misc. status bits */ + char * filename; /* name used in fopen() / freopen() */ + struct _PDCLIB_file_t * next; /* provisions for linked list handling */ +}; + +/* -------------------------------------------------------------------------- */ +/* Internal data types */ +/* -------------------------------------------------------------------------- */ + +/* Structure required by both atexit() and exit() for handling atexit functions */ +struct _PDCLIB_exitfunc_t +{ + struct _PDCLIB_exitfunc_t * next; + void (*func)( void ); +}; + +/* Structures required by malloc(), realloc(), and free(). */ +struct _PDCLIB_headnode_t +{ + struct _PDCLIB_memnode_t * first; + struct _PDCLIB_memnode_t * last; +}; + +struct _PDCLIB_memnode_t +{ + _PDCLIB_size_t size; + struct _PDCLIB_memnode_t * next; +}; + +/* Status structure required by _PDCLIB_print(). */ +struct _PDCLIB_status_t +{ + int base; /* base to which the value shall be converted */ + _PDCLIB_int_fast32_t flags; /* flags and length modifiers */ + _PDCLIB_size_t n; /* maximum number of characters to be written */ + _PDCLIB_size_t i; /* number of characters already written */ + _PDCLIB_size_t this; /* output chars in the current conversion */ + char * s; /* target buffer */ + _PDCLIB_size_t width; /* width of current field */ + _PDCLIB_size_t prec; /* precision of current field */ + struct _PDCLIB_file_t * stream;/* for to-stream output */ + _PDCLIB_va_list arg; /* argument stack passed to the printf function */ +}; + +/* -------------------------------------------------------------------------- */ +/* Declaration of helper functions (implemented in functions/_PDCLIB). */ +/* -------------------------------------------------------------------------- */ + +/* This is the main function called by atoi(), atol() and atoll(). */ +_PDCLIB_intmax_t _PDCLIB_atomax( const char * s ); + +/* Two helper functions used by strtol(), strtoul() and long long variants. */ +const char * _PDCLIB_strtox_prelim( const char * p, char * sign, int * base ); +_PDCLIB_uintmax_t _PDCLIB_strtox_main( const char ** p, unsigned int base, _PDCLIB_uintmax_t error, _PDCLIB_uintmax_t limval, int limdigit, char * sign ); + +/* Digits arrays used by various integer conversion functions */ +extern char _PDCLIB_digits[]; +extern char _PDCLIB_Xdigits[]; + +/* The worker for all printf() type of functions. The pointer spec should point + to the introducing '%' of a conversion specifier. The status structure is to + be that of the current printf() function, of which the members n, s, stream + and arg will be preserved, i will be updated, and all others will be trashed + by the function. + Returns a pointer to the first character not parsed as conversion specifier. +*/ +const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status ); + +/* Common denominator of puts() and fputs() */ +int _PDCLIB_puts( const char * s, const char * endl, struct _PDCLIB_file_t * stream ); + +/* Parsing any fopen() style filemode string into a number of flags. */ +unsigned int _PDCLIB_filemode( const char * mode ); + +/* Writing out unwritten buffers of a specific stream. A NULL parameter (as is + possible with standard fflush()) is not supported. + Return 0 if successful, EOF if error occured. Set error flag of stream and + errno as appropriate in case of error. +*/ +_PDCLIB_size_t _PDCLIB_flushbuffer( struct _PDCLIB_file_t * stream, _PDCLIB_size_t written, int retries ); + diff --git a/user/pdclib/internals/_PDCLIB_test.h b/user/pdclib/internals/_PDCLIB_test.h new file mode 100644 index 0000000..302c27b --- /dev/null +++ b/user/pdclib/internals/_PDCLIB_test.h @@ -0,0 +1,24 @@ +/* $Id$ */ + +/* PDCLib testing suite <_PDCLIB_test.h> + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* -------------------------------------------------------------------------- */ +/* Helper macros for test drivers */ +/* -------------------------------------------------------------------------- */ + +#include + +char const abcde[] = "abcde"; +char const abcdx[] = "abcdx"; + +int NO_TESTDRIVER = 0; + +//#define BEGIN_TESTS unsigned int rc = 0 +static unsigned int rc = 0; +#define TESTCASE( x ) if ( x ) {} \ + else { rc += 1; printf( "FAILED: " __FILE__ ", line %d - " #x "\n", __LINE__ ); } +#define TEST_RESULTS rc diff --git a/user/pdclib/pdclib.a b/user/pdclib/pdclib.a new file mode 100644 index 0000000000000000000000000000000000000000..2ffc792275d24b30061b6ab78f0e33ce9026537f GIT binary patch literal 290752 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 D(>zq! literal 0 HcmV?d00001 diff --git a/user/pdclib/platform/_example/Readme.txt b/user/pdclib/platform/_example/Readme.txt new file mode 100644 index 0000000..5ec24bd --- /dev/null +++ b/user/pdclib/platform/_example/Readme.txt @@ -0,0 +1,24 @@ +$Id$ + +"Example" Platform Overlay +========================== + +This is an example platform overlay, as described in the main Readme.txt of +this archive. For ease of development, it applies (and tests) correctly on the +machine of the author; no other guarantees can be given. +It should give you a good idea of what is REQUIRED to make a copy of PDCLib +work. There is a lot more you could do, and even some things you SHOULD do, in +order to experience anything but abysmal performance: + +- Read / write operations on binary streams, and even on text streams for + machines that do not do any text conversion, can be made much more efficient + by using some sort of page buffer instead of the linear buffer implemented + here. It requires some special and platform-dependent manipulations, though, + which is why it is not done by default. + +- Anything relating to floating point logic is written in generic C. While + this is (hopefully) highly portable and should get you started on your + platform of choice, it is also highly inefficient and should be replaced by + inline assembly. Just make sure that your assembly keeps all the promises + the C library makes. + diff --git a/user/pdclib/platform/_example/functions/_PDCLIB/_Exit.c b/user/pdclib/platform/_example/functions/_PDCLIB/_Exit.c new file mode 100644 index 0000000..c3ecfbc --- /dev/null +++ b/user/pdclib/platform/_example/functions/_PDCLIB/_Exit.c @@ -0,0 +1,39 @@ +/* $Id$ */ + +/* _PDCLIB_exit( int ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* This is an example implementation of _PDCLIB_exit() fit for use with POSIX + kernels. +*/ + +#include + +#ifndef REGTEST +#include <_PDCLIB_glue.h> +#include + +void _PDCLIB_Exit( int status ) +{ + _exit( status ); +} + +#endif + +#ifdef TEST +/* TODO: Work around the following undef */ +#undef SEEK_SET +#include <_PDCLIB_test.h> + +int main( void ) +{ + int UNEXPECTED_RETURN = 0; + _PDCLIB_Exit( 0 ); + TESTCASE( UNEXPECTED_RETURN ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/_example/functions/_PDCLIB/allocpages.c b/user/pdclib/platform/_example/functions/_PDCLIB/allocpages.c new file mode 100644 index 0000000..648a9ea --- /dev/null +++ b/user/pdclib/platform/_example/functions/_PDCLIB/allocpages.c @@ -0,0 +1,53 @@ +/* $Id$ */ + +/* _PDCLIB_allocpages( int const ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* This is an example implementation of _PDCLIB_allocpages() (declared in + _PDCLIB_config.h), fit for use with POSIX kernels. +*/ + +#include +#include + +int brk( void * ); +void * sbrk( intptr_t ); + +#ifndef _PDCLIB_GLUE_H +#define _PDCLIB_GLUE_H _PDCLIB_GLUE_H +#include <_PDCLIB_glue.h> +#endif + +static void * membreak = NULL; + +void * _PDCLIB_allocpages( int const n ) +{ + return NULL; +} + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ +#ifndef REGTEST + { + char * startbreak = sbrk( 0 ); + TESTCASE( _PDCLIB_allocpages( 0 ) ); + TESTCASE( ( (char *)sbrk( 0 ) - startbreak ) <= _PDCLIB_PAGESIZE ); + startbreak = sbrk( 0 ); + TESTCASE( _PDCLIB_allocpages( 1 ) ); + TESTCASE( sbrk( 0 ) == startbreak + ( 1 * _PDCLIB_PAGESIZE ) ); + TESTCASE( _PDCLIB_allocpages( 5 ) ); + TESTCASE( sbrk( 0 ) == startbreak + ( 6 * _PDCLIB_PAGESIZE ) ); + TESTCASE( _PDCLIB_allocpages( -3 ) ); + TESTCASE( sbrk( 0 ) == startbreak + ( 3 * _PDCLIB_PAGESIZE ) ); + } +#endif + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/_example/functions/_PDCLIB/close.c b/user/pdclib/platform/_example/functions/_PDCLIB/close.c new file mode 100644 index 0000000..f347597 --- /dev/null +++ b/user/pdclib/platform/_example/functions/_PDCLIB/close.c @@ -0,0 +1,39 @@ +/* $Id$ */ + +/* _PDCLIB_close( _PDCLIB_fd_t fd ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* This is an example implementation of _PDCLIB_close() fit for use with POSIX + kernels. +*/ + +#include + +#ifndef REGTEST +#include <_PDCLIB_glue.h> + +#include +#include +#include +#include + +int _PDCLIB_close( int fd ) +{ + return close( fd ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + /* No testdriver; tested in driver for _PDCLIB_open(). */ + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/_example/functions/_PDCLIB/isinteractive.c b/user/pdclib/platform/_example/functions/_PDCLIB/isinteractive.c new file mode 100644 index 0000000..ec3e778 --- /dev/null +++ b/user/pdclib/platform/_example/functions/_PDCLIB/isinteractive.c @@ -0,0 +1,38 @@ +/* $Id$ */ + +/* _PDCLIB_isinteractive( _PDCLIB_fd_t fd ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* This is an example implementation of _PDCLIB_isinteractive() (declared in + _PDCLIB_glue.h), fit for use in POSIX kernels. + If you do not have an equivalent function, replace this with a return (1) + and you will have all streams line-buffered by default. +*/ + +#ifndef REGTEST +#include <_PDCLIB_glue.h> + +int isatty( int ); + +int _PDCLIB_isinteractive( int fd ) +{ + return isatty( fd ); +} + +#endif + +#ifdef TEST +/* TODO: Work around the following undef */ +#undef SEEK_SET +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/_example/functions/_PDCLIB/open.c b/user/pdclib/platform/_example/functions/_PDCLIB/open.c new file mode 100644 index 0000000..fc82485 --- /dev/null +++ b/user/pdclib/platform/_example/functions/_PDCLIB/open.c @@ -0,0 +1,134 @@ +/* $Id$ */ + +/* _PDCLIB_open( char const * const, int ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* This is an example implementation of _PDCLIB_open() fit for use with POSIX + kernels. +*/ + +#include + +#ifndef REGTEST +#include <_PDCLIB_glue.h> + +#include +#include +#include +#include + +int _PDCLIB_open( char const * const filename, unsigned int mode ) +{ + /* This is an example implementation of _PDCLIB_open() fit for use with + POSIX kernels. + FIXME: The permissions of newly created files should not be hardcoded + here. + */ + int osmode; + switch ( mode & ~_PDCLIB_FBIN ) + { + case _PDCLIB_FREAD: /* "r" */ + osmode = O_RDONLY; + break; + case _PDCLIB_FWRITE: /* "w" */ + osmode = O_WRONLY | O_CREAT | O_TRUNC; + break; + case _PDCLIB_FAPPEND: /* "a" */ + osmode = O_WRONLY | O_APPEND | O_CREAT; + break; + case _PDCLIB_FREAD | _PDCLIB_FRW: /* "r+" */ + osmode = O_RDWR; + break; + case _PDCLIB_FWRITE | _PDCLIB_FRW: /* "w+" */ + osmode = O_RDWR | O_CREAT | O_TRUNC; + break; + case _PDCLIB_FAPPEND | _PDCLIB_FRW: /* "a+" */ + osmode = O_RDWR | O_APPEND | O_CREAT; + break; + default: /* Invalid mode */ + return -1; + } + if ( osmode & O_CREAT ) + { + return open( filename, osmode, S_IRUSR | S_IWUSR ); + } + else + { + return open( filename, osmode ); + } +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +#include +#include + +#include + +int main( void ) +{ + /* This testdriver assumes POSIX, i.e. _PDCLIB_fd_t being int and being + incremented by one on each successful open. + */ + int fh; + char buffer[ 10 ]; + /* Trying to read non-existent file. */ + TESTCASE( _PDCLIB_open( "testfile", _PDCLIB_FREAD ) == _PDCLIB_NOHANDLE ); + /* Writing to file, trying to read from it. */ + TESTCASE( ( fh = _PDCLIB_open( "testfile", _PDCLIB_FWRITE ) ) != _PDCLIB_NOHANDLE ); + TESTCASE( write( fh, "test", 4 ) == 4 ); + TESTCASE( lseek( fh, 0, SEEK_SET ) == 0 ); + TESTCASE( read( fh, buffer, 4 ) == -1 ); + TESTCASE( _PDCLIB_close( fh ) == 0 ); + /* Reading from file, trying to write to it. */ + TESTCASE( ( fh = _PDCLIB_open( "testfile", _PDCLIB_FREAD ) ) != _PDCLIB_NOHANDLE ); + TESTCASE( write( fh, "test", 4 ) == -1 ); + TESTCASE( _PDCLIB_close( fh ) == 0 ); + /* Appending to file, trying to read from it. */ + TESTCASE( ( fh = _PDCLIB_open( "testfile", _PDCLIB_FAPPEND ) ) != _PDCLIB_NOHANDLE ); + TESTCASE( write( fh, "app", 3 ) == 3 ); + TESTCASE( lseek( fh, 0, SEEK_SET ) == 0 ); + TESTCASE( read( fh, buffer, 10 ) == -1 ); + TESTCASE( write( fh, "end", 3 ) == 3 ); + TESTCASE( _PDCLIB_close( fh ) == 0 ); + /* Reading and writing from file ("r+"). */ + TESTCASE( ( fh = _PDCLIB_open( "testfile", _PDCLIB_FREAD | _PDCLIB_FRW ) ) != _PDCLIB_NOHANDLE ); + TESTCASE( read( fh, buffer, 10 ) == 10 ); + TESTCASE( memcmp( buffer, "testappend", 10 ) == 0 ); + TESTCASE( lseek( fh, 0, SEEK_SET ) == 0 ); + TESTCASE( write( fh, "wedo", 4 ) == 4 ); + TESTCASE( lseek( fh, 0, SEEK_SET ) == 0 ); + TESTCASE( read( fh, buffer, 10 ) == 10 ); + TESTCASE( memcmp( buffer, "wedoappend", 10 ) == 0 ); + TESTCASE( _PDCLIB_close( fh ) == 0 ); + /* Writing and reading from file ("w+"). */ + TESTCASE( ( fh = _PDCLIB_open( "testfile", _PDCLIB_FWRITE | _PDCLIB_FRW ) ) != _PDCLIB_NOHANDLE ); + TESTCASE( write( fh, "test", 4 ) == 4 ); + TESTCASE( lseek( fh, 1, SEEK_SET ) == 1 ); + TESTCASE( read( fh, buffer, 2 ) == 2 ); + TESTCASE( memcmp( buffer, "es", 2 ) == 0 ); + TESTCASE( write( fh, "sie", 3 ) == 3 ); + TESTCASE( lseek( fh, 0, SEEK_SET ) == 0 ); + TESTCASE( read( fh, buffer, 6 ) == 6 ); + TESTCASE( memcmp( buffer, "tessie", 6 ) == 0 ); + TESTCASE( _PDCLIB_close( fh ) == 0 ); + /* Appending and reading from file ("a+"). */ + TESTCASE( ( fh = _PDCLIB_open( "testfile", _PDCLIB_FAPPEND | _PDCLIB_FRW ) ) != _PDCLIB_NOHANDLE ); + TESTCASE( write( fh, "baby", 4 ) == 4 ); + TESTCASE( lseek( fh, 0, SEEK_SET ) == 0 ); + TESTCASE( read( fh, buffer, 10 ) == 10 ); + TESTCASE( memcmp( buffer, "tessiebaby", 10 ) == 0 ); + TESTCASE( _PDCLIB_close( fh ) == 0 ); + /* Cleaning up. */ + system( "rm testfile" ); + return TEST_RESULTS; +} + +#endif + diff --git a/user/pdclib/platform/_example/functions/_PDCLIB/read.c b/user/pdclib/platform/_example/functions/_PDCLIB/read.c new file mode 100644 index 0000000..2e35cea --- /dev/null +++ b/user/pdclib/platform/_example/functions/_PDCLIB/read.c @@ -0,0 +1,32 @@ +/* $Id$ */ + +/* _PDCLIB_read( _PDCLIB_fd_t, char *, _PDCLIB_size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include <_PDCLIB_glue.h> + +#ifndef REGTEST + +int read(int, void *, unsigned int); + +_PDCLIB_size_t _PDCLIB_read( int fd, char * buffer, _PDCLIB_size_t n ) +{ + /* FIXME: Might return value < n, might return -1 on error */ + return read( fd, buffer, n ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/_example/functions/_PDCLIB/remove.c b/user/pdclib/platform/_example/functions/_PDCLIB/remove.c new file mode 100644 index 0000000..184a1f2 --- /dev/null +++ b/user/pdclib/platform/_example/functions/_PDCLIB/remove.c @@ -0,0 +1,65 @@ +/* $Id$ */ + +/* _PDCLIB_remove( const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* This is an example implementation of _PDCLIB_remove() (declared in + _PDCLIB_glue.h), fit for use in POSIX kernels. + NOTE: Linux is *not* POSIX-compliant in this, as it sets EISDIR instead of + EPERM if you try to unlink a directory. Check the manpage for unlink(2). +*/ + +#ifndef REGTEST +#include <_PDCLIB_glue.h> +#include +#include + +int _PDCLIB_remove( const char * filename ) +{ + int prev_errno = errno; + int rc; + errno = 0; + if ( ( ( rc = unlink( filename ) ) != 0 ) && ( errno == EISDIR ) ) + { + rc = rmdir( filename ); + } + errno = prev_errno; + return rc; +} + +#endif + +#ifdef TEST +/* TODO: Work around the following undef */ +#undef SEEK_SET +#include <_PDCLIB_test.h> + +#include +#include + +int main( void ) +{ + char filename[] = "touch testfile"; + system( filename ); + /* file is actually readable */ + TESTCASE( fopen( filename + 6, "r" ) != NULL ); + /* remove function does not return error */ + TESTCASE( _PDCLIB_remove( filename + 6 ) == 0 ); + /* file is no longer readable */ + TESTCASE( fopen( filename + 6, "r" ) == NULL ); + /* remove function does return error */ + TESTCASE( _PDCLIB_remove( filename + 6 ) != 0 ); + memcpy( filename, "mkdir", 5 ); + /* create directory */ + system( filename ); + /* remove function does not return error */ + TESTCASE( _PDCLIB_remove( filename + 6 ) == 0 ); + /* remove function does return error */ + TESTCASE( _PDCLIB_remove( filename + 6 ) != 0 ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/_example/functions/_PDCLIB/rename.c b/user/pdclib/platform/_example/functions/_PDCLIB/rename.c new file mode 100644 index 0000000..849f872 --- /dev/null +++ b/user/pdclib/platform/_example/functions/_PDCLIB/rename.c @@ -0,0 +1,74 @@ +/* $Id$ */ + +/* _PDCLIB_rename( const char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef REGTEST +#include +#include <_PDCLIB_glue.h> + +int _PDCLIB_rename( const char * old, const char * new ) +{ + /* Note that the behaviour if new file exists is implementation-defined. + There is nothing wrong with either overwriting it or failing the + operation, but you might want to document whichever you chose. + This example fails if new file exists. + */ + if ( link( old, new ) == 0 ) + { + return unlink( old ); + } + else + { + return -1; + } +} + +#endif + +#ifdef TEST +/* TODO: Work around the following undef */ +#undef SEEK_SET +#include <_PDCLIB_test.h> + +#include + +int main( void ) +{ + char filename1[] = "touch testfile1"; + char filename2[] = "testfile2"; + /* check that neither file exists */ + TESTCASE( fopen( filename1 + 6, "r" ) == NULL ); + TESTCASE( fopen( filename2, "r" ) == NULL ); + /* rename file 1 to file 2 - expected to fail */ + TESTCASE( _PDCLIB_rename( filename1 + 6, filename2 ) == -1 ); + /* create file 1 */ + system( filename1 ); + /* check that file 1 exists */ + TESTCASE( fopen( filename1 + 6, "r" ) != NULL ); + /* rename file 1 to file 2 */ + TESTCASE( _PDCLIB_rename( filename1 + 6, filename2 ) == 0 ); + /* check that file 2 exists, file 1 does not */ + TESTCASE( fopen( filename1 + 6, "r" ) == NULL ); + TESTCASE( fopen( filename2, "r" ) != NULL ); + /* create another file 1 */ + system( filename1 ); + /* check that file 1 exists */ + TESTCASE( fopen( filename1 + 6, "r" ) != NULL ); + /* rename file 1 to file 2 - expected to fail, see comment in + _PDCLIB_rename() itself. + */ + TESTCASE( _PDCLIB_rename( filename1 + 6, filename2 ) == -1 ); + /* remove both files */ + remove( filename1 + 6 ); + remove( filename2 ); + /* check that they're gone */ + TESTCASE( fopen( filename1 + 6, "r" ) == NULL ); + TESTCASE( fopen( filename2, "r" ) == NULL ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/_example/functions/_PDCLIB/stdinit.c b/user/pdclib/platform/_example/functions/_PDCLIB/stdinit.c new file mode 100644 index 0000000..b199043 --- /dev/null +++ b/user/pdclib/platform/_example/functions/_PDCLIB/stdinit.c @@ -0,0 +1,48 @@ +/* $Id$ */ + +/* _PDCLIB_stdinit + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* This is an example initialization of stdin, stdout and stderr to the integer + file descriptors 0, 1, and 2, respectively. This applies for a great variety + of operating systems, including POSIX compliant ones. +*/ + +#include + +#ifndef REGTEST + +/* In a POSIX system, stdin / stdout / stderr are equivalent to the (int) file + descriptors 0, 1, and 2 respectively. +*/ +/* TODO: This is proof-of-concept, requires finetuning. */ +static char _PDCLIB_sin_buffer[BUFSIZ]; +static char _PDCLIB_sout_buffer[BUFSIZ]; +static char _PDCLIB_serr_buffer[BUFSIZ]; + +/* FIXME: serr should handle one character. Buffering on out / in? */ +static struct _PDCLIB_file_t _PDCLIB_serr = { 2, { 0, 0 }, _PDCLIB_serr_buffer, BUFSIZ, 0, 0, _IONBF, NULL }; +static struct _PDCLIB_file_t _PDCLIB_sout = { 1, { 0, 0 }, _PDCLIB_sout_buffer, BUFSIZ, 0, 0, _IOLBF, &_PDCLIB_serr }; +static struct _PDCLIB_file_t _PDCLIB_sin = { 0, { 0, 0 }, _PDCLIB_sin_buffer, BUFSIZ, 0, 0, _IOLBF, &_PDCLIB_sout }; + +struct _PDCLIB_file_t * stdin = &_PDCLIB_sin; +struct _PDCLIB_file_t * stdout = &_PDCLIB_sout; +struct _PDCLIB_file_t * stderr = &_PDCLIB_serr; + +#endif + +#ifdef TEST +/* TODO: Necessity of this undef should probably be circumvented. */ +#undef SEEK_SET +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/_example/functions/_PDCLIB/write.c b/user/pdclib/platform/_example/functions/_PDCLIB/write.c new file mode 100644 index 0000000..67c833f --- /dev/null +++ b/user/pdclib/platform/_example/functions/_PDCLIB/write.c @@ -0,0 +1,75 @@ +/* $Id$ */ + +/* _PDCLIB_write( _PDCLIB_fd_t, char const *, _PDCLIB_size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include <_PDCLIB_glue.h> +#include + +#ifndef REGTEST + +int _PDCLIB_write( struct _PDCLIB_file_t * stream, char const * buffer, int n ) +{ + /* CAUTION: We assume ssize_t <=> int here. We do so implicitly so a smart + compiler can throw a warning in case it does not (and you missed this + note). Somewhere we have to cast the return value of write() to that of + _PDCLIB_write() (since the latter cannot use a return type not defined + by the standard). It would perhaps have been syntactically cleaner to + use ssize_t here and make the cast in the return statement, but this + way we don't have to include yet another non-standard header. + */ + int rc; + if ( ( rc = write( stream->handle, buffer, (size_t)n ) ) == -1 ) + { + /* Error encountered */ + stream->status |= _PDCLIB_ERRORFLAG; + /* FIXME: Map the errno of the OS to PDCLib's errno */ + } + return rc; +} + +#endif + +#ifdef TEST +/* TODO: Work around the following undef */ +#undef SEEK_SET +#include <_PDCLIB_test.h> + +#include +#include + +#include +#include + +#include + +/* TODO: This uses POSIX system calls for now, should use standard calls + once they are in place. Clumsy sunny-path testing. +*/ +int main( void ) +{ + /* See the code comment at the functions' return statement above. */ + int fd, r; + char * buffer = malloc( 13 ); + TESTCASE( buffer != NULL ); + strcpy( buffer, "Test output\n" ); + /* Writing string to file */ + TESTCASE( ( fd = open( "testfile", O_CREAT | O_TRUNC | O_WRONLY, S_IRWXU ) ) != -1 ); + struct _PDCLIB_file_t file = { fd, { 0, 0 }, buffer, BUFSIZ, 12, 0, 0, NULL }; + TESTCASE( _PDCLIB_write( &file, file.buffer, 12 ) == 12 ); + TESTCASE( close( file.handle ) != -1 ); + /* Reading file back in */ + TESTCASE( ( fd = open( "testfile", O_RDONLY ) ) != -1 ); + memset( buffer, '\0', 13 ); + TESTCASE( ( r = read( file.handle, (void *)buffer, 12 ) ) == 12 ); + TESTCASE( strcmp( buffer, "Test output\n" ) == 0 ); + TESTCASE( close( fd ) != -1 ); + TESTCASE( unlink( "testfile" ) != -1 ); + return TEST_RESULTS; +} + +#endif + diff --git a/user/pdclib/platform/_example/functions/stdio/tmpfile.c b/user/pdclib/platform/_example/functions/stdio/tmpfile.c new file mode 100644 index 0000000..79c9569 --- /dev/null +++ b/user/pdclib/platform/_example/functions/stdio/tmpfile.c @@ -0,0 +1,29 @@ +/* $Id$ */ + +/* tmpfile( void ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef REGTEST +#include <_PDCLIB_int.h> + +struct _PDCLIB_file_t * tmpfile( void ) +{ + /* TODO: Implement */ + return NULL; +} + +#endif REGTEST + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main() +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/_example/functions/stdio/tmpnam.c b/user/pdclib/platform/_example/functions/stdio/tmpnam.c new file mode 100644 index 0000000..c4a0a4d --- /dev/null +++ b/user/pdclib/platform/_example/functions/stdio/tmpnam.c @@ -0,0 +1,31 @@ +/* $Id$ */ + +/* tmpnam( char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include + +#ifndef REGTEST + +char * tmpnam( char * s ) +{ + /* TODO: Implement. */ + return NULL; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/_example/functions/stdlib/getenv.c b/user/pdclib/platform/_example/functions/stdlib/getenv.c new file mode 100644 index 0000000..4eb7010 --- /dev/null +++ b/user/pdclib/platform/_example/functions/stdlib/getenv.c @@ -0,0 +1,46 @@ +/* $Id$ */ + +/* getenv( const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* This is an example implementation of getenv() fit for use with POSIX kernels. +*/ + +#include +#include + +#ifndef REGTEST + +extern char * * environ; + +char * getenv( const char * name ) +{ + size_t len = strlen( name ); + size_t index = 0; + while ( environ[ index ] != NULL ) + { + if ( strncmp( environ[ index ], name, len ) == 0 ) + { + return environ[ index ] + len + 1; + } + index++; + } + return NULL; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( strcmp( getenv( "SHELL" ), "/bin/bash" ) == 0 ); + /* TESTCASE( strcmp( getenv( "SHELL" ), "/bin/sh" ) == 0 ); */ + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/_example/functions/stdlib/system.c b/user/pdclib/platform/_example/functions/stdlib/system.c new file mode 100644 index 0000000..b46f6c0 --- /dev/null +++ b/user/pdclib/platform/_example/functions/stdlib/system.c @@ -0,0 +1,51 @@ +/* $Id$ */ + +/* system( const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +/* This is an example implementation of system() fit for use with POSIX kernels. +*/ + +#include +#include + +int system( const char * string ) +{ + // @TODO implement. + /* + char const * const argv[] = { "sh", "-c", (char const * const)string, NULL }; + if ( string != NULL ) + { + int pid = fork(); + if ( pid == 0 ) + { + execve( "/bin/sh", (char * * const)argv, NULL ); + } + else if ( pid > 0 ) + { + while( wait( NULL ) != pid ); + } + } + */ + return -1; +} + +#ifdef TEST +/* TODO: Work around the following undef */ +#undef SEEK_SET +#include <_PDCLIB_test.h> + +#define SHELLCOMMAND "echo 'SUCCESS testing system()'" + +int main( void ) +{ + TESTCASE( system( SHELLCOMMAND ) ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/_example/includes/float.h b/user/pdclib/platform/_example/includes/float.h new file mode 100644 index 0000000..de47aeb --- /dev/null +++ b/user/pdclib/platform/_example/includes/float.h @@ -0,0 +1,80 @@ +/* $Id$ */ + +/* 7.7 Characteristics of floating types + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef _PDCLIB_FLOAT_H +#define _PDCLIB_FLOAT_H _PDCLIB_FLOAT_H + +#ifndef _PDCLIB_CONFIG_H +#define _PDCLIB_CONFIG_H _PDCLIB_CONFIG_H +#include <_PDCLIB_config.h> +#endif + +#define FLT_ROUNDS _PDCLIB_FLT_ROUNDS +#define FLT_EVAL_METHOD _PDCLIB_FLT_EVAL_METHOD +#define DECIMAL_DIG _PDCLIB_DECIMAL_DIG + + /* Radix of exponent representation */ +#define FLT_RADIX __FLT_RADIX__ + /* Number of base-FLT_RADIX digits in the significand of a float */ +#define FLT_MANT_DIG __FLT_MANT_DIG__ + /* Number of decimal digits of precision in a float */ +#define FLT_DIG __FLT_DIG__ + /* Difference between 1.0 and the minimum float greater than 1.0 */ +#define FLT_EPSILON __FLT_EPSILON__ + /* Minimum int x such that FLT_RADIX**(x-1) is a normalised float */ +#define FLT_MIN_EXP __FLT_MIN_EXP__ + /* Minimum normalised float */ +#define FLT_MIN __FLT_MIN__ + /* Minimum int x such that 10**x is a normalised float */ +#define FLT_MIN_10_EXP __FLT_MIN_10_EXP__ + /* Maximum int x such that FLT_RADIX**(x-1) is a representable float */ +#define FLT_MAX_EXP __FLT_MAX_EXP__ + /* Maximum float */ +#define FLT_MAX __FLT_MAX__ + /* Maximum int x such that 10**x is a representable float */ +#define FLT_MAX_10_EXP __FLT_MAX_10_EXP__ + + /* Number of base-FLT_RADIX digits in the significand of a double */ +#define DBL_MANT_DIG __DBL_MANT_DIG__ + /* Number of decimal digits of precision in a double */ +#define DBL_DIG __DBL_DIG__ + /* Difference between 1.0 and the minimum double greater than 1.0 */ +#define DBL_EPSILON __DBL_EPSILON__ + /* Minimum int x such that FLT_RADIX**(x-1) is a normalised double */ +#define DBL_MIN_EXP __DBL_MIN_EXP__ + /* Minimum normalised double */ +#define DBL_MIN __DBL_MIN__ + /* Minimum int x such that 10**x is a normalised double */ +#define DBL_MIN_10_EXP __DBL_MIN_10_EXP__ + /* Maximum int x such that FLT_RADIX**(x-1) is a representable double */ +#define DBL_MAX_EXP __DBL_MAX_EXP__ + /* Maximum double */ +#define DBL_MAX __DBL_MAX__ + /* Maximum int x such that 10**x is a representable double */ +#define DBL_MAX_10_EXP __DBL_MAX_10_EXP__ + + /* Number of base-FLT_RADIX digits in the significand of a long double */ +#define LDBL_MANT_DIG __LDBL_MANT_DIG__ + /* Number of decimal digits of precision in a long double */ +#define LDBL_DIG __LDBL_DIG__ + /* Difference between 1.0 and the minimum long double greater than 1.0 */ +#define LDBL_EPSILON __LDBL_EPSILON__ + /* Minimum int x such that FLT_RADIX**(x-1) is a normalised long double */ +#define LDBL_MIN_EXP __LDBL_MIN_EXP__ + /* Minimum normalised long double */ +#define LDBL_MIN __LDBL_MIN__ + /* Minimum int x such that 10**x is a normalised long double */ +#define LDBL_MIN_10_EXP __LDBL_MIN_10_EXP__ + /* Maximum int x such that FLT_RADIX**(x-1) is a representable long double */ +#define LDBL_MAX_EXP __LDBL_MAX_EXP__ + /* Maximum long double */ +#define LDBL_MAX __LDBL_MAX__ + /* Maximum int x such that 10**x is a representable long double */ +#define LDBL_MAX_10_EXP __LDBL_MAX_10_EXP__ + +#endif diff --git a/user/pdclib/platform/_example/internals/_PDCLIB_config.h b/user/pdclib/platform/_example/internals/_PDCLIB_config.h new file mode 100644 index 0000000..0df1679 --- /dev/null +++ b/user/pdclib/platform/_example/internals/_PDCLIB_config.h @@ -0,0 +1,283 @@ +/* $Id$ */ + +/* Internal PDCLib configuration <_PDCLIB_config.h> + (Generic Template) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* -------------------------------------------------------------------------- */ +/* Misc */ +/* -------------------------------------------------------------------------- */ + +/* By default, PDCLib does some rather strict checking of function usage, */ +/* especially in . Things that are undefined by the standard - for */ +/* example, mixing byte / wide operations or read / write operations without */ +/* resetting the stream beforehand - are caught and handled graciously. This */ +/* adds some complexity, and eats a couple of clock cycles. If you want to */ +/* disable these checks, define _PDCLIB_STRICT to zero. */ +#define _PDCLIB_STRICT 1 + +/* The character (sequence) your platform uses as newline. */ +#define _PDCLIB_endl "\n" + +/* exit() can signal success to the host environment by the value of zero or */ +/* the constant EXIT_SUCCESS. Failure is signaled by EXIT_FAILURE. Note that */ +/* any other return value is "implementation-defined", i.e. your environment */ +/* is not required to handle it gracefully. Set your definitions here. */ +#define _PDCLIB_SUCCESS 0 +#define _PDCLIB_FAILURE -1 + +/* qsort() in requires a function that swaps two memory areas. */ +/* Below is a naive implementation that can be improved significantly for */ +/* specific platforms, e.g. by swapping int instead of char. */ +#define _PDCLIB_memswp( i, j, size ) char tmp; do { tmp = *i; *i++ = *j; *j++ = tmp; } while ( --size ); + +/* Define this to some compiler directive that can be written after the */ +/* parameter list of a function declaration to indicate the function does */ +/* never return. If your compiler does not support such a directive, define */ +/* to nothing. (This is to avoid warnings with the exit functions under GCC.) */ +#define _PDCLIB_NORETURN __attribute__(( noreturn )) + +/* -------------------------------------------------------------------------- */ +/* Integers */ +/* -------------------------------------------------------------------------- */ +/* Assuming 8-bit char, two's-complement architecture here. 'short' being */ +/* 16 bit, 'int' being either 16, 32 or 64 bit, 'long' being either 32 or 64 */ +/* bit (but 64 bit only if 'int' is 32 bit), and 'long long' being 64 bit if */ +/* 'long' is not, 64 or 128 bit otherwise. */ +/* Author is quite willing to support other systems but would like to hear of */ +/* interest in such support and details on the to-be-supported architecture */ +/* first, before going to lengths about it. */ +/* -------------------------------------------------------------------------- */ + +/* Comment out (or delete) the line below if your 'char' type is unsigned. */ +#define _PDCLIB_CHAR_SIGNED 1 + +/* Width of the integer types short, int, long, and long long, in bytes. */ +/* SHRT == 2, INT >= SHRT, LONG >= INT >= 4, LLONG >= LONG - check your */ +/* compiler manuals. */ +#define _PDCLIB_SHRT_BYTES 2 +#define _PDCLIB_INT_BYTES 4 +#define _PDCLIB_LONG_BYTES 4 +#define _PDCLIB_LLONG_BYTES 8 + +/* defines the div() function family that allows taking quotient */ +/* and remainder of an integer division in one operation. Many platforms */ +/* support this in hardware / opcode, and the standard permits ordering of */ +/* the return structure in any way to fit the hardware. That is why those */ +/* structs can be configured here. */ + +struct _PDCLIB_div_t +{ + int quot; + int rem; +}; + +struct _PDCLIB_ldiv_t +{ + long int quot; + long int rem; +}; + +struct _PDCLIB_lldiv_t +{ + long long int quot; + long long int rem; +}; + +/* -------------------------------------------------------------------------- */ +/* defines a set of integer types that are of a minimum width, and */ +/* "usually fastest" on the system. (If, for example, accessing a single char */ +/* requires the CPU to access a complete int and then mask out the char, the */ +/* "usually fastest" type of at least 8 bits would be int, not char.) */ +/* If you do not have information on the relative performance of the types, */ +/* the standard allows you to define any type that meets minimum width and */ +/* signedness requirements. */ +/* The defines below are just configuration for the real typedefs and limit */ +/* definitions done in <_PDCLIB_int.h>. The uppercase define shall be either */ +/* SHRT, INT, LONG, or LLONG (telling which values to use for the *_MIN and */ +/* *_MAX limits); the lowercase define either short, int, long, or long long */ +/* (telling the actual type to use). */ +/* If you require a non-standard datatype to define the "usually fastest" */ +/* types, PDCLib as-is doesn't support that. Please contact the author with */ +/* details on your platform in that case, so support can be added. */ +/* -------------------------------------------------------------------------- */ + +#define _PDCLIB_FAST8 INT +#define _PDCLIB_fast8 int + +#define _PDCLIB_FAST16 INT +#define _PDCLIB_fast16 int + +#define _PDCLIB_FAST32 INT +#define _PDCLIB_fast32 int + +#define _PDCLIB_FAST64 LLONG +#define _PDCLIB_fast64 long long + +/* -------------------------------------------------------------------------- */ +/* What follows are a couple of "special" typedefs and their limits. Again, */ +/* the actual definition of the limits is done in <_PDCLIB_int.h>, and the */ +/* defines here are merely "configuration". See above for details. */ +/* -------------------------------------------------------------------------- */ + +/* The result type of substracting two pointers */ +#define _PDCLIB_ptrdiff int +#define _PDCLIB_PTRDIFF INT + +/* An integer type that can be accessed as atomic entity (think asynchronous + interrupts). The type itself is not defined in a freestanding environment, + but its limits are. (Don't ask.) +*/ +#define _PDCLIB_sig_atomic int +#define _PDCLIB_SIG_ATOMIC INT + +/* Result type of the 'sizeof' operator (must be unsigned) */ +#define _PDCLIB_size unsigned int +#define _PDCLIB_SIZE UINT + +/* Large enough an integer to hold all character codes of the largest supported + locale. +*/ +#define _PDCLIB_wchar unsigned short +#define _PDCLIB_WCHAR USHRT + +#define _PDCLIB_intptr int +#define _PDCLIB_INTPTR INT + +/* Largest supported integer type. Implementation note: see _PDCLIB_atomax(). */ +#define _PDCLIB_intmax long long int +#define _PDCLIB_INTMAX LLINT +/* You are also required to state the literal suffix for the intmax type */ +#define _PDCLIB_INTMAX_LITERAL ll + +/* -------------------------------------------------------------------------- */ +/* Floating Point */ +/* -------------------------------------------------------------------------- */ + +/* Whether the implementation rounds toward zero (0), to nearest (1), toward + positive infinity (2), or toward negative infinity (3). (-1) signifies + indeterminable rounding, any other value implementation-specific rounding. +*/ +#define _PDCLIB_FLT_ROUNDS -1 + +/* Whether the implementation uses exact-width precision (0), promotes float + to double (1), or promotes float and double to long double (2). (-1) + signifies indeterminable behaviour, any other value implementation-specific + behaviour. +*/ +#define _PDCLIB_FLT_EVAL_METHOD -1 + +/* "Number of the decimal digits (n), such that any floating-point number in the + widest supported floating type with p(max) radix (b) digits can be rounded to + a floating-point number with (n) decimal digits and back again without change + to the value p(max) log(10)b if (b) is a power of 10, [1 + p(max) log(10)b] + otherwise." + 64bit IEC 60559 double format (53bit mantissa) is DECIMAL_DIG 17. + 80bit IEC 60559 double-extended format (64bit mantissa) is DECIMAL_DIG 21. +*/ +#define _PDCLIB_DECIMAL_DIG 17 + +/* -------------------------------------------------------------------------- */ +/* Platform-dependent macros defined by the standard headers. */ +/* -------------------------------------------------------------------------- */ + +/* The offsetof macro + Contract: Expand to an integer constant expression of type size_t, which + represents the offset in bytes to the structure member from the beginning + of the structure. If the specified member is a bitfield, behaviour is + undefined. + There is no standard-compliant way to do this. + This implementation casts an integer zero to 'pointer to type', and then + takes the address of member. This is undefined behaviour but should work on + most compilers. +*/ +#define _PDCLIB_offsetof( type, member ) ( (size_t) &( ( (type *) 0 )->member ) ) + +/* Variable Length Parameter List Handling () + The macros defined by are highly dependent on the calling + conventions used, and you probably have to replace them with builtins of + your compiler. The following generic implementation works only for pure + stack-based architectures, and only if arguments are aligned to pointer + type. Credits to Michael Moody, who contributed this to the Public Domain. +*/ + +/* Internal helper macro. va_round is not part of . */ +#define _PDCLIB_va_round( type ) ( (sizeof(type) + sizeof(void *) - 1) & ~(sizeof(void *) - 1) ) + +typedef char * _PDCLIB_va_list; +#define _PDCLIB_va_arg( ap, type ) ( (ap) += (_PDCLIB_va_round(type)), ( *(type*) ( (ap) - (_PDCLIB_va_round(type)) ) ) ) +#define _PDCLIB_va_copy( dest, src ) ( (dest) = (src), (void)0 ) +#define _PDCLIB_va_end( ap ) ( (ap) = (void *)0, (void)0 ) +#define _PDCLIB_va_start( ap, parmN ) ( (ap) = (char *) &parmN + ( _PDCLIB_va_round(parmN) ), (void)0 ) + +/* -------------------------------------------------------------------------- */ +/* OS "glue", part 1 */ +/* These are values and data type definitions that you would have to adapt to */ +/* the capabilities and requirements of your OS. */ +/* The actual *functions* of the OS interface are declared in _PDCLIB_glue.h. */ +/* -------------------------------------------------------------------------- */ + +/* Memory management -------------------------------------------------------- */ + +/* Set this to the page size of your OS. If your OS does not support paging, set + to an appropriate value. (Too small, and malloc() will call the kernel too + often. Too large, and you will waste memory.) +*/ +#define _PDCLIB_PAGESIZE 4096 + +/* Set this to the minimum memory node size. Any malloc() for a smaller size + will be satisfied by a malloc() of this size instead (to avoid excessive + fragmentation). +*/ +#define _PDCLIB_MINALLOC 8 + +/* I/O ---------------------------------------------------------------------- */ + +/* The type of the file descriptor returned by _PDCLIB_open(). */ +typedef int _PDCLIB_fd_t; + +/* The value (of type _PDCLIB_fd_t) returned by _PDCLIB_open() if the operation + failed. +*/ +#define _PDCLIB_NOHANDLE ( (_PDCLIB_fd_t) -1 ) + +/* A type in which to store file offsets. See fgetpos() / fsetpos(). */ +/* FIXME: The 'int' types here are placeholders. When changed, check out + stdinit.c, too. */ +typedef struct +{ + int position; + int mbstate; +} _PDCLIB_fpos_t; + +/* The default size for file buffers. Must be at least 256. */ +#define _PDCLIB_BUFSIZ 1024 + +/* The minimum number of files the implementation can open simultaneously. Must + be at least 8. Depends largely on how the bookkeeping is done by fopen() / + freopen() / fclose(). +*/ +#define _PDCLIB_FOPEN_MAX 8 + +/* Length of the longest filename the implementation guarantees to support. */ +#define _PDCLIB_FILENAME_MAX 128 + +/* Buffer size for tmpnam(). */ +#define _PDCLIB_L_tmpnam 100 + +/* Number of distinct file names that can be generated by tmpnam(). */ +#define _PDCLIB_TMP_MAX 50 + +/* The number of times fflush() tries to write a file buffer before giving up + if no characters can be written. +*/ +#define _PDCLIB_FLUSH_RETRIES 3 +/* This macro is executed after each try to write characters that results in + no characters being written. You can define this to be empty, wait a short + period of time, or whatever suits your environment. +*/ +#define _PDCLIB_FLUSH_RETRY_PREP + diff --git a/user/pdclib/platform/csos/functions/_PDCLIB/_Exit.c b/user/pdclib/platform/csos/functions/_PDCLIB/_Exit.c new file mode 100644 index 0000000..c3ecfbc --- /dev/null +++ b/user/pdclib/platform/csos/functions/_PDCLIB/_Exit.c @@ -0,0 +1,39 @@ +/* $Id$ */ + +/* _PDCLIB_exit( int ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* This is an example implementation of _PDCLIB_exit() fit for use with POSIX + kernels. +*/ + +#include + +#ifndef REGTEST +#include <_PDCLIB_glue.h> +#include + +void _PDCLIB_Exit( int status ) +{ + _exit( status ); +} + +#endif + +#ifdef TEST +/* TODO: Work around the following undef */ +#undef SEEK_SET +#include <_PDCLIB_test.h> + +int main( void ) +{ + int UNEXPECTED_RETURN = 0; + _PDCLIB_Exit( 0 ); + TESTCASE( UNEXPECTED_RETURN ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/csos/functions/_PDCLIB/allocpages.c b/user/pdclib/platform/csos/functions/_PDCLIB/allocpages.c new file mode 100644 index 0000000..648a9ea --- /dev/null +++ b/user/pdclib/platform/csos/functions/_PDCLIB/allocpages.c @@ -0,0 +1,53 @@ +/* $Id$ */ + +/* _PDCLIB_allocpages( int const ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* This is an example implementation of _PDCLIB_allocpages() (declared in + _PDCLIB_config.h), fit for use with POSIX kernels. +*/ + +#include +#include + +int brk( void * ); +void * sbrk( intptr_t ); + +#ifndef _PDCLIB_GLUE_H +#define _PDCLIB_GLUE_H _PDCLIB_GLUE_H +#include <_PDCLIB_glue.h> +#endif + +static void * membreak = NULL; + +void * _PDCLIB_allocpages( int const n ) +{ + return NULL; +} + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ +#ifndef REGTEST + { + char * startbreak = sbrk( 0 ); + TESTCASE( _PDCLIB_allocpages( 0 ) ); + TESTCASE( ( (char *)sbrk( 0 ) - startbreak ) <= _PDCLIB_PAGESIZE ); + startbreak = sbrk( 0 ); + TESTCASE( _PDCLIB_allocpages( 1 ) ); + TESTCASE( sbrk( 0 ) == startbreak + ( 1 * _PDCLIB_PAGESIZE ) ); + TESTCASE( _PDCLIB_allocpages( 5 ) ); + TESTCASE( sbrk( 0 ) == startbreak + ( 6 * _PDCLIB_PAGESIZE ) ); + TESTCASE( _PDCLIB_allocpages( -3 ) ); + TESTCASE( sbrk( 0 ) == startbreak + ( 3 * _PDCLIB_PAGESIZE ) ); + } +#endif + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/csos/functions/_PDCLIB/close.c b/user/pdclib/platform/csos/functions/_PDCLIB/close.c new file mode 100644 index 0000000..f347597 --- /dev/null +++ b/user/pdclib/platform/csos/functions/_PDCLIB/close.c @@ -0,0 +1,39 @@ +/* $Id$ */ + +/* _PDCLIB_close( _PDCLIB_fd_t fd ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* This is an example implementation of _PDCLIB_close() fit for use with POSIX + kernels. +*/ + +#include + +#ifndef REGTEST +#include <_PDCLIB_glue.h> + +#include +#include +#include +#include + +int _PDCLIB_close( int fd ) +{ + return close( fd ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + /* No testdriver; tested in driver for _PDCLIB_open(). */ + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/csos/functions/_PDCLIB/isinteractive.c b/user/pdclib/platform/csos/functions/_PDCLIB/isinteractive.c new file mode 100644 index 0000000..ec3e778 --- /dev/null +++ b/user/pdclib/platform/csos/functions/_PDCLIB/isinteractive.c @@ -0,0 +1,38 @@ +/* $Id$ */ + +/* _PDCLIB_isinteractive( _PDCLIB_fd_t fd ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* This is an example implementation of _PDCLIB_isinteractive() (declared in + _PDCLIB_glue.h), fit for use in POSIX kernels. + If you do not have an equivalent function, replace this with a return (1) + and you will have all streams line-buffered by default. +*/ + +#ifndef REGTEST +#include <_PDCLIB_glue.h> + +int isatty( int ); + +int _PDCLIB_isinteractive( int fd ) +{ + return isatty( fd ); +} + +#endif + +#ifdef TEST +/* TODO: Work around the following undef */ +#undef SEEK_SET +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/csos/functions/_PDCLIB/open.c b/user/pdclib/platform/csos/functions/_PDCLIB/open.c new file mode 100644 index 0000000..fc82485 --- /dev/null +++ b/user/pdclib/platform/csos/functions/_PDCLIB/open.c @@ -0,0 +1,134 @@ +/* $Id$ */ + +/* _PDCLIB_open( char const * const, int ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* This is an example implementation of _PDCLIB_open() fit for use with POSIX + kernels. +*/ + +#include + +#ifndef REGTEST +#include <_PDCLIB_glue.h> + +#include +#include +#include +#include + +int _PDCLIB_open( char const * const filename, unsigned int mode ) +{ + /* This is an example implementation of _PDCLIB_open() fit for use with + POSIX kernels. + FIXME: The permissions of newly created files should not be hardcoded + here. + */ + int osmode; + switch ( mode & ~_PDCLIB_FBIN ) + { + case _PDCLIB_FREAD: /* "r" */ + osmode = O_RDONLY; + break; + case _PDCLIB_FWRITE: /* "w" */ + osmode = O_WRONLY | O_CREAT | O_TRUNC; + break; + case _PDCLIB_FAPPEND: /* "a" */ + osmode = O_WRONLY | O_APPEND | O_CREAT; + break; + case _PDCLIB_FREAD | _PDCLIB_FRW: /* "r+" */ + osmode = O_RDWR; + break; + case _PDCLIB_FWRITE | _PDCLIB_FRW: /* "w+" */ + osmode = O_RDWR | O_CREAT | O_TRUNC; + break; + case _PDCLIB_FAPPEND | _PDCLIB_FRW: /* "a+" */ + osmode = O_RDWR | O_APPEND | O_CREAT; + break; + default: /* Invalid mode */ + return -1; + } + if ( osmode & O_CREAT ) + { + return open( filename, osmode, S_IRUSR | S_IWUSR ); + } + else + { + return open( filename, osmode ); + } +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +#include +#include + +#include + +int main( void ) +{ + /* This testdriver assumes POSIX, i.e. _PDCLIB_fd_t being int and being + incremented by one on each successful open. + */ + int fh; + char buffer[ 10 ]; + /* Trying to read non-existent file. */ + TESTCASE( _PDCLIB_open( "testfile", _PDCLIB_FREAD ) == _PDCLIB_NOHANDLE ); + /* Writing to file, trying to read from it. */ + TESTCASE( ( fh = _PDCLIB_open( "testfile", _PDCLIB_FWRITE ) ) != _PDCLIB_NOHANDLE ); + TESTCASE( write( fh, "test", 4 ) == 4 ); + TESTCASE( lseek( fh, 0, SEEK_SET ) == 0 ); + TESTCASE( read( fh, buffer, 4 ) == -1 ); + TESTCASE( _PDCLIB_close( fh ) == 0 ); + /* Reading from file, trying to write to it. */ + TESTCASE( ( fh = _PDCLIB_open( "testfile", _PDCLIB_FREAD ) ) != _PDCLIB_NOHANDLE ); + TESTCASE( write( fh, "test", 4 ) == -1 ); + TESTCASE( _PDCLIB_close( fh ) == 0 ); + /* Appending to file, trying to read from it. */ + TESTCASE( ( fh = _PDCLIB_open( "testfile", _PDCLIB_FAPPEND ) ) != _PDCLIB_NOHANDLE ); + TESTCASE( write( fh, "app", 3 ) == 3 ); + TESTCASE( lseek( fh, 0, SEEK_SET ) == 0 ); + TESTCASE( read( fh, buffer, 10 ) == -1 ); + TESTCASE( write( fh, "end", 3 ) == 3 ); + TESTCASE( _PDCLIB_close( fh ) == 0 ); + /* Reading and writing from file ("r+"). */ + TESTCASE( ( fh = _PDCLIB_open( "testfile", _PDCLIB_FREAD | _PDCLIB_FRW ) ) != _PDCLIB_NOHANDLE ); + TESTCASE( read( fh, buffer, 10 ) == 10 ); + TESTCASE( memcmp( buffer, "testappend", 10 ) == 0 ); + TESTCASE( lseek( fh, 0, SEEK_SET ) == 0 ); + TESTCASE( write( fh, "wedo", 4 ) == 4 ); + TESTCASE( lseek( fh, 0, SEEK_SET ) == 0 ); + TESTCASE( read( fh, buffer, 10 ) == 10 ); + TESTCASE( memcmp( buffer, "wedoappend", 10 ) == 0 ); + TESTCASE( _PDCLIB_close( fh ) == 0 ); + /* Writing and reading from file ("w+"). */ + TESTCASE( ( fh = _PDCLIB_open( "testfile", _PDCLIB_FWRITE | _PDCLIB_FRW ) ) != _PDCLIB_NOHANDLE ); + TESTCASE( write( fh, "test", 4 ) == 4 ); + TESTCASE( lseek( fh, 1, SEEK_SET ) == 1 ); + TESTCASE( read( fh, buffer, 2 ) == 2 ); + TESTCASE( memcmp( buffer, "es", 2 ) == 0 ); + TESTCASE( write( fh, "sie", 3 ) == 3 ); + TESTCASE( lseek( fh, 0, SEEK_SET ) == 0 ); + TESTCASE( read( fh, buffer, 6 ) == 6 ); + TESTCASE( memcmp( buffer, "tessie", 6 ) == 0 ); + TESTCASE( _PDCLIB_close( fh ) == 0 ); + /* Appending and reading from file ("a+"). */ + TESTCASE( ( fh = _PDCLIB_open( "testfile", _PDCLIB_FAPPEND | _PDCLIB_FRW ) ) != _PDCLIB_NOHANDLE ); + TESTCASE( write( fh, "baby", 4 ) == 4 ); + TESTCASE( lseek( fh, 0, SEEK_SET ) == 0 ); + TESTCASE( read( fh, buffer, 10 ) == 10 ); + TESTCASE( memcmp( buffer, "tessiebaby", 10 ) == 0 ); + TESTCASE( _PDCLIB_close( fh ) == 0 ); + /* Cleaning up. */ + system( "rm testfile" ); + return TEST_RESULTS; +} + +#endif + diff --git a/user/pdclib/platform/csos/functions/_PDCLIB/read.c b/user/pdclib/platform/csos/functions/_PDCLIB/read.c new file mode 100644 index 0000000..2e35cea --- /dev/null +++ b/user/pdclib/platform/csos/functions/_PDCLIB/read.c @@ -0,0 +1,32 @@ +/* $Id$ */ + +/* _PDCLIB_read( _PDCLIB_fd_t, char *, _PDCLIB_size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include <_PDCLIB_glue.h> + +#ifndef REGTEST + +int read(int, void *, unsigned int); + +_PDCLIB_size_t _PDCLIB_read( int fd, char * buffer, _PDCLIB_size_t n ) +{ + /* FIXME: Might return value < n, might return -1 on error */ + return read( fd, buffer, n ); +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/csos/functions/_PDCLIB/remove.c b/user/pdclib/platform/csos/functions/_PDCLIB/remove.c new file mode 100644 index 0000000..184a1f2 --- /dev/null +++ b/user/pdclib/platform/csos/functions/_PDCLIB/remove.c @@ -0,0 +1,65 @@ +/* $Id$ */ + +/* _PDCLIB_remove( const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* This is an example implementation of _PDCLIB_remove() (declared in + _PDCLIB_glue.h), fit for use in POSIX kernels. + NOTE: Linux is *not* POSIX-compliant in this, as it sets EISDIR instead of + EPERM if you try to unlink a directory. Check the manpage for unlink(2). +*/ + +#ifndef REGTEST +#include <_PDCLIB_glue.h> +#include +#include + +int _PDCLIB_remove( const char * filename ) +{ + int prev_errno = errno; + int rc; + errno = 0; + if ( ( ( rc = unlink( filename ) ) != 0 ) && ( errno == EISDIR ) ) + { + rc = rmdir( filename ); + } + errno = prev_errno; + return rc; +} + +#endif + +#ifdef TEST +/* TODO: Work around the following undef */ +#undef SEEK_SET +#include <_PDCLIB_test.h> + +#include +#include + +int main( void ) +{ + char filename[] = "touch testfile"; + system( filename ); + /* file is actually readable */ + TESTCASE( fopen( filename + 6, "r" ) != NULL ); + /* remove function does not return error */ + TESTCASE( _PDCLIB_remove( filename + 6 ) == 0 ); + /* file is no longer readable */ + TESTCASE( fopen( filename + 6, "r" ) == NULL ); + /* remove function does return error */ + TESTCASE( _PDCLIB_remove( filename + 6 ) != 0 ); + memcpy( filename, "mkdir", 5 ); + /* create directory */ + system( filename ); + /* remove function does not return error */ + TESTCASE( _PDCLIB_remove( filename + 6 ) == 0 ); + /* remove function does return error */ + TESTCASE( _PDCLIB_remove( filename + 6 ) != 0 ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/csos/functions/_PDCLIB/rename.c b/user/pdclib/platform/csos/functions/_PDCLIB/rename.c new file mode 100644 index 0000000..849f872 --- /dev/null +++ b/user/pdclib/platform/csos/functions/_PDCLIB/rename.c @@ -0,0 +1,74 @@ +/* $Id$ */ + +/* _PDCLIB_rename( const char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef REGTEST +#include +#include <_PDCLIB_glue.h> + +int _PDCLIB_rename( const char * old, const char * new ) +{ + /* Note that the behaviour if new file exists is implementation-defined. + There is nothing wrong with either overwriting it or failing the + operation, but you might want to document whichever you chose. + This example fails if new file exists. + */ + if ( link( old, new ) == 0 ) + { + return unlink( old ); + } + else + { + return -1; + } +} + +#endif + +#ifdef TEST +/* TODO: Work around the following undef */ +#undef SEEK_SET +#include <_PDCLIB_test.h> + +#include + +int main( void ) +{ + char filename1[] = "touch testfile1"; + char filename2[] = "testfile2"; + /* check that neither file exists */ + TESTCASE( fopen( filename1 + 6, "r" ) == NULL ); + TESTCASE( fopen( filename2, "r" ) == NULL ); + /* rename file 1 to file 2 - expected to fail */ + TESTCASE( _PDCLIB_rename( filename1 + 6, filename2 ) == -1 ); + /* create file 1 */ + system( filename1 ); + /* check that file 1 exists */ + TESTCASE( fopen( filename1 + 6, "r" ) != NULL ); + /* rename file 1 to file 2 */ + TESTCASE( _PDCLIB_rename( filename1 + 6, filename2 ) == 0 ); + /* check that file 2 exists, file 1 does not */ + TESTCASE( fopen( filename1 + 6, "r" ) == NULL ); + TESTCASE( fopen( filename2, "r" ) != NULL ); + /* create another file 1 */ + system( filename1 ); + /* check that file 1 exists */ + TESTCASE( fopen( filename1 + 6, "r" ) != NULL ); + /* rename file 1 to file 2 - expected to fail, see comment in + _PDCLIB_rename() itself. + */ + TESTCASE( _PDCLIB_rename( filename1 + 6, filename2 ) == -1 ); + /* remove both files */ + remove( filename1 + 6 ); + remove( filename2 ); + /* check that they're gone */ + TESTCASE( fopen( filename1 + 6, "r" ) == NULL ); + TESTCASE( fopen( filename2, "r" ) == NULL ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/csos/functions/_PDCLIB/stdinit.c b/user/pdclib/platform/csos/functions/_PDCLIB/stdinit.c new file mode 100644 index 0000000..b199043 --- /dev/null +++ b/user/pdclib/platform/csos/functions/_PDCLIB/stdinit.c @@ -0,0 +1,48 @@ +/* $Id$ */ + +/* _PDCLIB_stdinit + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* This is an example initialization of stdin, stdout and stderr to the integer + file descriptors 0, 1, and 2, respectively. This applies for a great variety + of operating systems, including POSIX compliant ones. +*/ + +#include + +#ifndef REGTEST + +/* In a POSIX system, stdin / stdout / stderr are equivalent to the (int) file + descriptors 0, 1, and 2 respectively. +*/ +/* TODO: This is proof-of-concept, requires finetuning. */ +static char _PDCLIB_sin_buffer[BUFSIZ]; +static char _PDCLIB_sout_buffer[BUFSIZ]; +static char _PDCLIB_serr_buffer[BUFSIZ]; + +/* FIXME: serr should handle one character. Buffering on out / in? */ +static struct _PDCLIB_file_t _PDCLIB_serr = { 2, { 0, 0 }, _PDCLIB_serr_buffer, BUFSIZ, 0, 0, _IONBF, NULL }; +static struct _PDCLIB_file_t _PDCLIB_sout = { 1, { 0, 0 }, _PDCLIB_sout_buffer, BUFSIZ, 0, 0, _IOLBF, &_PDCLIB_serr }; +static struct _PDCLIB_file_t _PDCLIB_sin = { 0, { 0, 0 }, _PDCLIB_sin_buffer, BUFSIZ, 0, 0, _IOLBF, &_PDCLIB_sout }; + +struct _PDCLIB_file_t * stdin = &_PDCLIB_sin; +struct _PDCLIB_file_t * stdout = &_PDCLIB_sout; +struct _PDCLIB_file_t * stderr = &_PDCLIB_serr; + +#endif + +#ifdef TEST +/* TODO: Necessity of this undef should probably be circumvented. */ +#undef SEEK_SET +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/csos/functions/_PDCLIB/write.c b/user/pdclib/platform/csos/functions/_PDCLIB/write.c new file mode 100644 index 0000000..67c833f --- /dev/null +++ b/user/pdclib/platform/csos/functions/_PDCLIB/write.c @@ -0,0 +1,75 @@ +/* $Id$ */ + +/* _PDCLIB_write( _PDCLIB_fd_t, char const *, _PDCLIB_size_t ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include <_PDCLIB_glue.h> +#include + +#ifndef REGTEST + +int _PDCLIB_write( struct _PDCLIB_file_t * stream, char const * buffer, int n ) +{ + /* CAUTION: We assume ssize_t <=> int here. We do so implicitly so a smart + compiler can throw a warning in case it does not (and you missed this + note). Somewhere we have to cast the return value of write() to that of + _PDCLIB_write() (since the latter cannot use a return type not defined + by the standard). It would perhaps have been syntactically cleaner to + use ssize_t here and make the cast in the return statement, but this + way we don't have to include yet another non-standard header. + */ + int rc; + if ( ( rc = write( stream->handle, buffer, (size_t)n ) ) == -1 ) + { + /* Error encountered */ + stream->status |= _PDCLIB_ERRORFLAG; + /* FIXME: Map the errno of the OS to PDCLib's errno */ + } + return rc; +} + +#endif + +#ifdef TEST +/* TODO: Work around the following undef */ +#undef SEEK_SET +#include <_PDCLIB_test.h> + +#include +#include + +#include +#include + +#include + +/* TODO: This uses POSIX system calls for now, should use standard calls + once they are in place. Clumsy sunny-path testing. +*/ +int main( void ) +{ + /* See the code comment at the functions' return statement above. */ + int fd, r; + char * buffer = malloc( 13 ); + TESTCASE( buffer != NULL ); + strcpy( buffer, "Test output\n" ); + /* Writing string to file */ + TESTCASE( ( fd = open( "testfile", O_CREAT | O_TRUNC | O_WRONLY, S_IRWXU ) ) != -1 ); + struct _PDCLIB_file_t file = { fd, { 0, 0 }, buffer, BUFSIZ, 12, 0, 0, NULL }; + TESTCASE( _PDCLIB_write( &file, file.buffer, 12 ) == 12 ); + TESTCASE( close( file.handle ) != -1 ); + /* Reading file back in */ + TESTCASE( ( fd = open( "testfile", O_RDONLY ) ) != -1 ); + memset( buffer, '\0', 13 ); + TESTCASE( ( r = read( file.handle, (void *)buffer, 12 ) ) == 12 ); + TESTCASE( strcmp( buffer, "Test output\n" ) == 0 ); + TESTCASE( close( fd ) != -1 ); + TESTCASE( unlink( "testfile" ) != -1 ); + return TEST_RESULTS; +} + +#endif + diff --git a/user/pdclib/platform/csos/functions/stdio/tmpfile.c b/user/pdclib/platform/csos/functions/stdio/tmpfile.c new file mode 100644 index 0000000..79c9569 --- /dev/null +++ b/user/pdclib/platform/csos/functions/stdio/tmpfile.c @@ -0,0 +1,29 @@ +/* $Id$ */ + +/* tmpfile( void ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef REGTEST +#include <_PDCLIB_int.h> + +struct _PDCLIB_file_t * tmpfile( void ) +{ + /* TODO: Implement */ + return NULL; +} + +#endif REGTEST + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main() +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/csos/functions/stdio/tmpnam.c b/user/pdclib/platform/csos/functions/stdio/tmpnam.c new file mode 100644 index 0000000..c4a0a4d --- /dev/null +++ b/user/pdclib/platform/csos/functions/stdio/tmpnam.c @@ -0,0 +1,31 @@ +/* $Id$ */ + +/* tmpnam( char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include +#include + +#ifndef REGTEST + +char * tmpnam( char * s ) +{ + /* TODO: Implement. */ + return NULL; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( NO_TESTDRIVER ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/csos/functions/stdlib/getenv.c b/user/pdclib/platform/csos/functions/stdlib/getenv.c new file mode 100644 index 0000000..4eb7010 --- /dev/null +++ b/user/pdclib/platform/csos/functions/stdlib/getenv.c @@ -0,0 +1,46 @@ +/* $Id$ */ + +/* getenv( const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* This is an example implementation of getenv() fit for use with POSIX kernels. +*/ + +#include +#include + +#ifndef REGTEST + +extern char * * environ; + +char * getenv( const char * name ) +{ + size_t len = strlen( name ); + size_t index = 0; + while ( environ[ index ] != NULL ) + { + if ( strncmp( environ[ index ], name, len ) == 0 ) + { + return environ[ index ] + len + 1; + } + index++; + } + return NULL; +} + +#endif + +#ifdef TEST +#include <_PDCLIB_test.h> + +int main( void ) +{ + TESTCASE( strcmp( getenv( "SHELL" ), "/bin/bash" ) == 0 ); + /* TESTCASE( strcmp( getenv( "SHELL" ), "/bin/sh" ) == 0 ); */ + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/csos/functions/stdlib/system.c b/user/pdclib/platform/csos/functions/stdlib/system.c new file mode 100644 index 0000000..b46f6c0 --- /dev/null +++ b/user/pdclib/platform/csos/functions/stdlib/system.c @@ -0,0 +1,51 @@ +/* $Id$ */ + +/* system( const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +/* This is an example implementation of system() fit for use with POSIX kernels. +*/ + +#include +#include + +int system( const char * string ) +{ + // @TODO implement. + /* + char const * const argv[] = { "sh", "-c", (char const * const)string, NULL }; + if ( string != NULL ) + { + int pid = fork(); + if ( pid == 0 ) + { + execve( "/bin/sh", (char * * const)argv, NULL ); + } + else if ( pid > 0 ) + { + while( wait( NULL ) != pid ); + } + } + */ + return -1; +} + +#ifdef TEST +/* TODO: Work around the following undef */ +#undef SEEK_SET +#include <_PDCLIB_test.h> + +#define SHELLCOMMAND "echo 'SUCCESS testing system()'" + +int main( void ) +{ + TESTCASE( system( SHELLCOMMAND ) ); + return TEST_RESULTS; +} + +#endif diff --git a/user/pdclib/platform/csos/includes/float.h b/user/pdclib/platform/csos/includes/float.h new file mode 100644 index 0000000..de47aeb --- /dev/null +++ b/user/pdclib/platform/csos/includes/float.h @@ -0,0 +1,80 @@ +/* $Id$ */ + +/* 7.7 Characteristics of floating types + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#ifndef _PDCLIB_FLOAT_H +#define _PDCLIB_FLOAT_H _PDCLIB_FLOAT_H + +#ifndef _PDCLIB_CONFIG_H +#define _PDCLIB_CONFIG_H _PDCLIB_CONFIG_H +#include <_PDCLIB_config.h> +#endif + +#define FLT_ROUNDS _PDCLIB_FLT_ROUNDS +#define FLT_EVAL_METHOD _PDCLIB_FLT_EVAL_METHOD +#define DECIMAL_DIG _PDCLIB_DECIMAL_DIG + + /* Radix of exponent representation */ +#define FLT_RADIX __FLT_RADIX__ + /* Number of base-FLT_RADIX digits in the significand of a float */ +#define FLT_MANT_DIG __FLT_MANT_DIG__ + /* Number of decimal digits of precision in a float */ +#define FLT_DIG __FLT_DIG__ + /* Difference between 1.0 and the minimum float greater than 1.0 */ +#define FLT_EPSILON __FLT_EPSILON__ + /* Minimum int x such that FLT_RADIX**(x-1) is a normalised float */ +#define FLT_MIN_EXP __FLT_MIN_EXP__ + /* Minimum normalised float */ +#define FLT_MIN __FLT_MIN__ + /* Minimum int x such that 10**x is a normalised float */ +#define FLT_MIN_10_EXP __FLT_MIN_10_EXP__ + /* Maximum int x such that FLT_RADIX**(x-1) is a representable float */ +#define FLT_MAX_EXP __FLT_MAX_EXP__ + /* Maximum float */ +#define FLT_MAX __FLT_MAX__ + /* Maximum int x such that 10**x is a representable float */ +#define FLT_MAX_10_EXP __FLT_MAX_10_EXP__ + + /* Number of base-FLT_RADIX digits in the significand of a double */ +#define DBL_MANT_DIG __DBL_MANT_DIG__ + /* Number of decimal digits of precision in a double */ +#define DBL_DIG __DBL_DIG__ + /* Difference between 1.0 and the minimum double greater than 1.0 */ +#define DBL_EPSILON __DBL_EPSILON__ + /* Minimum int x such that FLT_RADIX**(x-1) is a normalised double */ +#define DBL_MIN_EXP __DBL_MIN_EXP__ + /* Minimum normalised double */ +#define DBL_MIN __DBL_MIN__ + /* Minimum int x such that 10**x is a normalised double */ +#define DBL_MIN_10_EXP __DBL_MIN_10_EXP__ + /* Maximum int x such that FLT_RADIX**(x-1) is a representable double */ +#define DBL_MAX_EXP __DBL_MAX_EXP__ + /* Maximum double */ +#define DBL_MAX __DBL_MAX__ + /* Maximum int x such that 10**x is a representable double */ +#define DBL_MAX_10_EXP __DBL_MAX_10_EXP__ + + /* Number of base-FLT_RADIX digits in the significand of a long double */ +#define LDBL_MANT_DIG __LDBL_MANT_DIG__ + /* Number of decimal digits of precision in a long double */ +#define LDBL_DIG __LDBL_DIG__ + /* Difference between 1.0 and the minimum long double greater than 1.0 */ +#define LDBL_EPSILON __LDBL_EPSILON__ + /* Minimum int x such that FLT_RADIX**(x-1) is a normalised long double */ +#define LDBL_MIN_EXP __LDBL_MIN_EXP__ + /* Minimum normalised long double */ +#define LDBL_MIN __LDBL_MIN__ + /* Minimum int x such that 10**x is a normalised long double */ +#define LDBL_MIN_10_EXP __LDBL_MIN_10_EXP__ + /* Maximum int x such that FLT_RADIX**(x-1) is a representable long double */ +#define LDBL_MAX_EXP __LDBL_MAX_EXP__ + /* Maximum long double */ +#define LDBL_MAX __LDBL_MAX__ + /* Maximum int x such that 10**x is a representable long double */ +#define LDBL_MAX_10_EXP __LDBL_MAX_10_EXP__ + +#endif diff --git a/user/pdclib/platform/csos/internals/_PDCLIB_config.h b/user/pdclib/platform/csos/internals/_PDCLIB_config.h new file mode 100644 index 0000000..0df1679 --- /dev/null +++ b/user/pdclib/platform/csos/internals/_PDCLIB_config.h @@ -0,0 +1,283 @@ +/* $Id$ */ + +/* Internal PDCLib configuration <_PDCLIB_config.h> + (Generic Template) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +/* -------------------------------------------------------------------------- */ +/* Misc */ +/* -------------------------------------------------------------------------- */ + +/* By default, PDCLib does some rather strict checking of function usage, */ +/* especially in . Things that are undefined by the standard - for */ +/* example, mixing byte / wide operations or read / write operations without */ +/* resetting the stream beforehand - are caught and handled graciously. This */ +/* adds some complexity, and eats a couple of clock cycles. If you want to */ +/* disable these checks, define _PDCLIB_STRICT to zero. */ +#define _PDCLIB_STRICT 1 + +/* The character (sequence) your platform uses as newline. */ +#define _PDCLIB_endl "\n" + +/* exit() can signal success to the host environment by the value of zero or */ +/* the constant EXIT_SUCCESS. Failure is signaled by EXIT_FAILURE. Note that */ +/* any other return value is "implementation-defined", i.e. your environment */ +/* is not required to handle it gracefully. Set your definitions here. */ +#define _PDCLIB_SUCCESS 0 +#define _PDCLIB_FAILURE -1 + +/* qsort() in requires a function that swaps two memory areas. */ +/* Below is a naive implementation that can be improved significantly for */ +/* specific platforms, e.g. by swapping int instead of char. */ +#define _PDCLIB_memswp( i, j, size ) char tmp; do { tmp = *i; *i++ = *j; *j++ = tmp; } while ( --size ); + +/* Define this to some compiler directive that can be written after the */ +/* parameter list of a function declaration to indicate the function does */ +/* never return. If your compiler does not support such a directive, define */ +/* to nothing. (This is to avoid warnings with the exit functions under GCC.) */ +#define _PDCLIB_NORETURN __attribute__(( noreturn )) + +/* -------------------------------------------------------------------------- */ +/* Integers */ +/* -------------------------------------------------------------------------- */ +/* Assuming 8-bit char, two's-complement architecture here. 'short' being */ +/* 16 bit, 'int' being either 16, 32 or 64 bit, 'long' being either 32 or 64 */ +/* bit (but 64 bit only if 'int' is 32 bit), and 'long long' being 64 bit if */ +/* 'long' is not, 64 or 128 bit otherwise. */ +/* Author is quite willing to support other systems but would like to hear of */ +/* interest in such support and details on the to-be-supported architecture */ +/* first, before going to lengths about it. */ +/* -------------------------------------------------------------------------- */ + +/* Comment out (or delete) the line below if your 'char' type is unsigned. */ +#define _PDCLIB_CHAR_SIGNED 1 + +/* Width of the integer types short, int, long, and long long, in bytes. */ +/* SHRT == 2, INT >= SHRT, LONG >= INT >= 4, LLONG >= LONG - check your */ +/* compiler manuals. */ +#define _PDCLIB_SHRT_BYTES 2 +#define _PDCLIB_INT_BYTES 4 +#define _PDCLIB_LONG_BYTES 4 +#define _PDCLIB_LLONG_BYTES 8 + +/* defines the div() function family that allows taking quotient */ +/* and remainder of an integer division in one operation. Many platforms */ +/* support this in hardware / opcode, and the standard permits ordering of */ +/* the return structure in any way to fit the hardware. That is why those */ +/* structs can be configured here. */ + +struct _PDCLIB_div_t +{ + int quot; + int rem; +}; + +struct _PDCLIB_ldiv_t +{ + long int quot; + long int rem; +}; + +struct _PDCLIB_lldiv_t +{ + long long int quot; + long long int rem; +}; + +/* -------------------------------------------------------------------------- */ +/* defines a set of integer types that are of a minimum width, and */ +/* "usually fastest" on the system. (If, for example, accessing a single char */ +/* requires the CPU to access a complete int and then mask out the char, the */ +/* "usually fastest" type of at least 8 bits would be int, not char.) */ +/* If you do not have information on the relative performance of the types, */ +/* the standard allows you to define any type that meets minimum width and */ +/* signedness requirements. */ +/* The defines below are just configuration for the real typedefs and limit */ +/* definitions done in <_PDCLIB_int.h>. The uppercase define shall be either */ +/* SHRT, INT, LONG, or LLONG (telling which values to use for the *_MIN and */ +/* *_MAX limits); the lowercase define either short, int, long, or long long */ +/* (telling the actual type to use). */ +/* If you require a non-standard datatype to define the "usually fastest" */ +/* types, PDCLib as-is doesn't support that. Please contact the author with */ +/* details on your platform in that case, so support can be added. */ +/* -------------------------------------------------------------------------- */ + +#define _PDCLIB_FAST8 INT +#define _PDCLIB_fast8 int + +#define _PDCLIB_FAST16 INT +#define _PDCLIB_fast16 int + +#define _PDCLIB_FAST32 INT +#define _PDCLIB_fast32 int + +#define _PDCLIB_FAST64 LLONG +#define _PDCLIB_fast64 long long + +/* -------------------------------------------------------------------------- */ +/* What follows are a couple of "special" typedefs and their limits. Again, */ +/* the actual definition of the limits is done in <_PDCLIB_int.h>, and the */ +/* defines here are merely "configuration". See above for details. */ +/* -------------------------------------------------------------------------- */ + +/* The result type of substracting two pointers */ +#define _PDCLIB_ptrdiff int +#define _PDCLIB_PTRDIFF INT + +/* An integer type that can be accessed as atomic entity (think asynchronous + interrupts). The type itself is not defined in a freestanding environment, + but its limits are. (Don't ask.) +*/ +#define _PDCLIB_sig_atomic int +#define _PDCLIB_SIG_ATOMIC INT + +/* Result type of the 'sizeof' operator (must be unsigned) */ +#define _PDCLIB_size unsigned int +#define _PDCLIB_SIZE UINT + +/* Large enough an integer to hold all character codes of the largest supported + locale. +*/ +#define _PDCLIB_wchar unsigned short +#define _PDCLIB_WCHAR USHRT + +#define _PDCLIB_intptr int +#define _PDCLIB_INTPTR INT + +/* Largest supported integer type. Implementation note: see _PDCLIB_atomax(). */ +#define _PDCLIB_intmax long long int +#define _PDCLIB_INTMAX LLINT +/* You are also required to state the literal suffix for the intmax type */ +#define _PDCLIB_INTMAX_LITERAL ll + +/* -------------------------------------------------------------------------- */ +/* Floating Point */ +/* -------------------------------------------------------------------------- */ + +/* Whether the implementation rounds toward zero (0), to nearest (1), toward + positive infinity (2), or toward negative infinity (3). (-1) signifies + indeterminable rounding, any other value implementation-specific rounding. +*/ +#define _PDCLIB_FLT_ROUNDS -1 + +/* Whether the implementation uses exact-width precision (0), promotes float + to double (1), or promotes float and double to long double (2). (-1) + signifies indeterminable behaviour, any other value implementation-specific + behaviour. +*/ +#define _PDCLIB_FLT_EVAL_METHOD -1 + +/* "Number of the decimal digits (n), such that any floating-point number in the + widest supported floating type with p(max) radix (b) digits can be rounded to + a floating-point number with (n) decimal digits and back again without change + to the value p(max) log(10)b if (b) is a power of 10, [1 + p(max) log(10)b] + otherwise." + 64bit IEC 60559 double format (53bit mantissa) is DECIMAL_DIG 17. + 80bit IEC 60559 double-extended format (64bit mantissa) is DECIMAL_DIG 21. +*/ +#define _PDCLIB_DECIMAL_DIG 17 + +/* -------------------------------------------------------------------------- */ +/* Platform-dependent macros defined by the standard headers. */ +/* -------------------------------------------------------------------------- */ + +/* The offsetof macro + Contract: Expand to an integer constant expression of type size_t, which + represents the offset in bytes to the structure member from the beginning + of the structure. If the specified member is a bitfield, behaviour is + undefined. + There is no standard-compliant way to do this. + This implementation casts an integer zero to 'pointer to type', and then + takes the address of member. This is undefined behaviour but should work on + most compilers. +*/ +#define _PDCLIB_offsetof( type, member ) ( (size_t) &( ( (type *) 0 )->member ) ) + +/* Variable Length Parameter List Handling () + The macros defined by are highly dependent on the calling + conventions used, and you probably have to replace them with builtins of + your compiler. The following generic implementation works only for pure + stack-based architectures, and only if arguments are aligned to pointer + type. Credits to Michael Moody, who contributed this to the Public Domain. +*/ + +/* Internal helper macro. va_round is not part of . */ +#define _PDCLIB_va_round( type ) ( (sizeof(type) + sizeof(void *) - 1) & ~(sizeof(void *) - 1) ) + +typedef char * _PDCLIB_va_list; +#define _PDCLIB_va_arg( ap, type ) ( (ap) += (_PDCLIB_va_round(type)), ( *(type*) ( (ap) - (_PDCLIB_va_round(type)) ) ) ) +#define _PDCLIB_va_copy( dest, src ) ( (dest) = (src), (void)0 ) +#define _PDCLIB_va_end( ap ) ( (ap) = (void *)0, (void)0 ) +#define _PDCLIB_va_start( ap, parmN ) ( (ap) = (char *) &parmN + ( _PDCLIB_va_round(parmN) ), (void)0 ) + +/* -------------------------------------------------------------------------- */ +/* OS "glue", part 1 */ +/* These are values and data type definitions that you would have to adapt to */ +/* the capabilities and requirements of your OS. */ +/* The actual *functions* of the OS interface are declared in _PDCLIB_glue.h. */ +/* -------------------------------------------------------------------------- */ + +/* Memory management -------------------------------------------------------- */ + +/* Set this to the page size of your OS. If your OS does not support paging, set + to an appropriate value. (Too small, and malloc() will call the kernel too + often. Too large, and you will waste memory.) +*/ +#define _PDCLIB_PAGESIZE 4096 + +/* Set this to the minimum memory node size. Any malloc() for a smaller size + will be satisfied by a malloc() of this size instead (to avoid excessive + fragmentation). +*/ +#define _PDCLIB_MINALLOC 8 + +/* I/O ---------------------------------------------------------------------- */ + +/* The type of the file descriptor returned by _PDCLIB_open(). */ +typedef int _PDCLIB_fd_t; + +/* The value (of type _PDCLIB_fd_t) returned by _PDCLIB_open() if the operation + failed. +*/ +#define _PDCLIB_NOHANDLE ( (_PDCLIB_fd_t) -1 ) + +/* A type in which to store file offsets. See fgetpos() / fsetpos(). */ +/* FIXME: The 'int' types here are placeholders. When changed, check out + stdinit.c, too. */ +typedef struct +{ + int position; + int mbstate; +} _PDCLIB_fpos_t; + +/* The default size for file buffers. Must be at least 256. */ +#define _PDCLIB_BUFSIZ 1024 + +/* The minimum number of files the implementation can open simultaneously. Must + be at least 8. Depends largely on how the bookkeeping is done by fopen() / + freopen() / fclose(). +*/ +#define _PDCLIB_FOPEN_MAX 8 + +/* Length of the longest filename the implementation guarantees to support. */ +#define _PDCLIB_FILENAME_MAX 128 + +/* Buffer size for tmpnam(). */ +#define _PDCLIB_L_tmpnam 100 + +/* Number of distinct file names that can be generated by tmpnam(). */ +#define _PDCLIB_TMP_MAX 50 + +/* The number of times fflush() tries to write a file buffer before giving up + if no characters can be written. +*/ +#define _PDCLIB_FLUSH_RETRIES 3 +/* This macro is executed after each try to write characters that results in + no characters being written. You can define this to be empty, wait a short + period of time, or whatever suits your environment. +*/ +#define _PDCLIB_FLUSH_RETRY_PREP + diff --git a/user_linker.ld b/user_linker.ld index 97f1fc6..4e73d10 100644 --- a/user_linker.ld +++ b/user_linker.ld @@ -1,5 +1,5 @@ ENTRY (main) -STARTUP("user/crt.o") +STARTUP("user/crt/crt_asm.o") OUTPUT_FORMAT("binary") SECTIONS{ @@ -23,4 +23,4 @@ SECTIONS{ *(.bss) ebss = .; } -} \ No newline at end of file +} diff --git a/util/bin2nasm b/util/bin2nasm index e1c45ae1fab448dcd99458d3df16bf76727e2bca..c676ac8519f093ca2b5d215042b794cadb23f31b 100755 GIT binary patch literal 7183 zcmeHMZEPGz8J;^|+KX|+#c}B+J*q`HmjoqSCv{9xgs9_>#Hky%j^k3CWOKe-`;Oj+ zb+;FsDiSe=1(t2q0)9lQ3Pec#frM0qL@lKP7e@`1iZJ~Zst6gikuEqOS2Cf9kmY%1 zZrnX5MeyHqdUxiT_nEJE-r1d*`({UXr_bjTI`~D6AUa(N1e+1>+N?Cq!Vp2RLp&lL z7WW~Gy5{rXKx6?F+JL+Oq=q`+<}v6YTYxFlv2KbCEDKpgK?=)@kkZ$ET8O$I1%gsg zpaH^msrMr?pf{kWEC5reXB(8m;2%cYly+c>);)XONdVpzbopNBz3s1nNnv^R{jqdv z@Ue7acRH0Vj+%v>xmW4XHK{*z^f*$gpR5yIm1P?c(>B!S-s^pFXZUyDJ<+oLH}AN2 z&h(ovFHuK6$Hz3=TN`L2_JJIomUc6Qfh?K#v!~vlW7->4`HgggzYdDk3S_LPTcPvZ5BypOeMOa-u$W5fOR1LqJVgqCI!OsdY`Tg6j>yE$cY$%(^E#KfHin3oFczfR6_YrD# z8*k&uGHxSVNHTe25yjj_wv?pq#)8CbG0AS;n3I?-C&R?A0q^lEDB6^N5kF%zXexzq;z@Lz{Jgy^CdLvoBchhebI=n z_abOZuU1)WhJ9T-zUTUnm3z?XvH7hJ!$3D9<$wI!b*C?dVeRP>pF6L->H5cAC%Wg> zWJd_yL`Po>L|fm7DW`N>FhUbaVny2$rZ=_A+Ka*3&- znbK0gU6`yvR&hlceU+fzuji%AY(OS;hdRVu>x&_uPux^2M3#?mU z-2&?t`0p0Lp3fyi$4v8_#LayjWbs>pAPyno1U9BT2TkE@`S&|+ZWb}mVEdux`Ryt& zH(-5`PeEAzK?no)eJj{8^5|kfcqZf#`yt32$}>HSm}f8^GI(xgjBR7?0`k$f9Q(A4 zcnTQF|2y!^tP4GgbAAh?6VeaS`G?xto-lSCA1r2_qS0(Nn~(2qE=sg-r@}&*g|ita zHi+2Ct2n7sIP=;05n*O?j%~Ic?Aq{4X(19nx<&$MOyY6UKSef%C_(9dbW} zJb70Eg@LpV`ux8K8Jd@bZzaKtY7%12JB&2_koD0wr@-5VG<}kRJW4y{7W{`i`tEF{ z-L<@<(9?g(qfcK2?=;fv3zD)f`gT8reoY?NzSJg#TWn?jm>Wj@#X zB6v+m>p&jEcOaSA-MRwaTKkdr zo`)C0?MMg{aIf($g2#Ne%UhK2C-AOA&;B(*7|7eMlJZF%h3|CMrNfuN`jU+!!1oa|)h(}j?ri37DKP%Z zH>yUiTp{nNm41`dbNwg`CqUpjQJ9t!g6lzH&WiGTh55zB_Za@8uzF+Dj}_*Z8uPJ= z)fb(9sq~+bditNj{Gy}3@E?WcMVj;{g)wQKP$Raj`T?^8;zO4s=DH;I;Z~M+u)2Rf zd{K4)>;Cz$lh_A5Q?ZX(SmeV7_MoCH|aeK%8CvC!vFZMB5tt95DTb_Te4(DPZkS^|-}Pc=)Vu z4EUUfKLf1$7efDD0dARKpn!%PkT9~J0e~XD>StD`FNfxs&n1iE2{tY87 GC;kJgeQ44E literal 4765 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 EFBEv~kpKVy literal 6267 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 P1KoS^Sc

-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�j4q! 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