€h’’’’’ž’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’ž’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’A@ŽNœ#ĄA€XNœ# Ąū[Nœ# ^ \Nœ# €žMœ#€5Nœ#€ZņUNœ#^_`abcdf€B[Nœ#ÜŻŽßąĄA ÓNœ#ခ‘Nœ#āĄd’Nœ#楁ŗ“Nœ#䀁F”Nœ#åĄ¼ •Nœ#ęēč送© —Nœ#źėģĄ šNœ#ķī§œNœ#šĄŠŸNœ#ńņóōõö÷Ą`”Nœ#ųłśūü€Ö¢Nœ#żĄ†„Nœ#ž’€]§Nœ#Ą`ŖNœ#  €«Nœ# Ą °Nœ#  €?²Nœ#Ą|³Nœ#Ą` µNœ#€ū¶Nœ#Ąp¹Nœ# €k»Nœ#!Ą½Nœ#"#$%&€±ĄNœ#'()Ą"ĆNœ#*+,-€ŽÅNœ#.ĄČNœ#/01234€ŹNœ#5ĄųĶNœ#6789:€mĪNœ#;€ ŅNœ#<€ÓÓNœ#=>...lib test...myrunorderREAD_MElibc.alibsrc.alibtermcap.a# Run this to create a new library # You must have all the .s files in # the current directory. # To do this, unarchive the existing `libc.a' # to get the assembly files & object files. # If you wish to recompile the library, then # do the following: # for i in [a-m]*.c # do echo $i # cc -c -LIB -Di8088 $i # done # for i in [n-z]*.c # do echo $i # cc -c -LIB -Di8088 $i # done # rm libc.a split -30 order for i in xa? do ar vq libc.a `cat $i` rm $i done rm [a-h]*.s rm [i-r]*.s rm *.s bcmp.s bsearch.s bzero.s ctermid.s cuserid.s execlp.s ffs.s fgetc.s fputc.s getcwd.s getlogin.s lsearch.s memccpy.s memchr.s memcmp.s memcpy.s memset.s strchr.s strcspn.s strpbrk.s strrchr.s strspn.s strstr.s strtok.s swab.s ttyname.s regexp.s regsub.s getpwent.s qsort.s popen.s scanf.s system.s fgets.s fprintf.s puts.s fputs.s fread.s freopen.s fclose.s fopen.s fseek.s ftell.s fwrite.s gets.s printdat.s setbuf.s ctime.s fdopen.s getgrent.s sprintf.s doprintf.s printk.s putc.s ungetc.s getc.s strcmp.s access.s chdir.s chmod.s chown.s chroot.s creat.s dup.s dup2.s exec.s exit.s cleanup.s fflush.s fork.s isatty.s fstat.s getegid.s getenv.s geteuid.s getgid.s getpass.s close.s getuid.s gtty.s stty.s ioctl.s abort.s kill.s link.s lseek.s malloc.s brk.s brk2.s brksize.s mknod.s mktemp.s getpid.s mount.s open.s perror.s pipe.s prints.s read.s setgid.s setuid.s sleep.s alarm.s pause.s signal.s catchsig.s stat.s stime.s strcat.s strcpy.s strlen.s strncat.s strncmp.s strncpy.s sync.s time.s times.s umask.s umount.s unlink.s utime.s wait.s stderr.s write.s syslib.s call.s atoi.s message.s sendrec.s itoa.s stb.s abs.s atol.s ctype.s index.s bcopy.s getutil.s rand.s rindex.s setjmp.s adi.s and.s cii.s cms.s cmu4.s com.s csa2.s csb2.s cuu.s _dup.s dvi4.s dvu4.s exg.s fakfp.s gto.s iaar.s ilar.s inn.s ior.s isar.s lar2.s loi.s mli4.s mon.s nop.s rck.s rmi4.s rmu4.s sar2.s sbi.s set.s sti.s strhp.s xor.s error.s unknown.s fat.s trp.s stop.s ret6.s ret8.s lfr6.s lfr8.s retarea.s blm.s vars.s return.s cmi4.s crypt.s The sources to the library are contained in an archive to save disk space. Since MINIX uses a minimum of 1K for each file, no matter how small, the sources take up less space when packed together in an archive. To extract them, make sure there is at least 130K of free disk space, and type: ar xv libsrc.a Furthermore, please note that not all the library routines are contained in /usr/lib/libc.a in order to save disk space. If you have a hard disk, compare the contents of libsrc.a with libc.a, and compile the missing routines with cc -c -LIB file.c. Add these to libc.a. With a floppy disk system, you may not have room for the missing ones. e’bcmp.s—#¶õ€šČ_bcmp É_bcmp † _bcmp: ƒ ‚ € € Įļ ĄčĪ Įš ĄéÅ  ĄäŌ cwd išv ķ ” ĄäŌ Öį1 ¬ Ķčš ŁI0016 ‡ € š ½ óĘ jl I001C Ąåš Äé#2 ĮĒ Ąåļ Äč#2 « Ćķ Ķęė je I0016  € š I001C: óĻ jl I001B Ąåš Üš Œ ‹ Ąåļ Üļ € Œ ‹ Ćķ Ķęė je I001C  € š I001B: ‡ € Ÿ  jmp .dsret bsearch.s—#ēõ€ķČ_bsearch É_bsearch † _bsearch: ƒ ‚ € € Įļ Įš ĄéŌ • Ķé#0 jbe I0012 Ąäš shr į1 mul 10(ń) » ÄåĪ Ąčģ Ąä12(ń) Įļ ˆ Ó(ė) ‰ ‰ ¬ ĶĻö ŁI0016 Įļ š ½ ĶĻö jge I0019 Ąäš shr į1 Ąéė ­ I0019: Ąå10(ń) Äåļ ĄĪ,ģ Ąäš ×į1 shr į1 Ąéė ­   ‡ € Ÿ  jmp .dsret Čbzero.ss—#ńõ€›Č_bzero É_bzero † _bzero: ƒ ‚ € € Įļ ĄčÅ Įš  ĄäĪ cwd išv ķ Ąéė ĄäĪ Öį1 ¬ • óš or éš jl I0016 Ą(ļ)ö Äč#2 ­ ½ óĻ jl I0015 Ź(ļ)ö Üļ ĢI0016 I0015: jmp .dsret Čctermid.s—#„ö€¤Č_ctermid É_ctermid † _ctermid: ƒ ‚ Įļ ĄčÅ ³ _1: .zerow 10/2 † or čļ ŁI0013 Ąč#_1 • Ąį_2 € Įļ Ó_strcpy ‰ ‰ Ąäļ Ģ.s ® _2: Ā25647 Ā30309 Ā29743 Ā31092 .word 0 .text cuserid.s—#°ö€øČ_cuserid É_cuserid † _cuserid: ƒ ‚ € Įļ ĄčÅ Įš ³ _1: .zerow 10/2 † or čļ ŁI0013 Ąč#_1 • Ó_geteuid € Ó_getpwuid ‰ Ąéė or éš ŁI0016 Ź(ļ)ö ‡ € š ½ Į(š) Įļ Ó_strcpy ‰ ‰ Įļ Ÿ  jmp .dsret execlp.s—#÷€}Č_execvp Č_execlp É_execlp † _execlp: ƒ ‚ ŪäĪ € ˆ Ó_execvp ‰ ‰ Ģ.c É_execvp _execvp: ƒ ‚ ×ņ,#104 Įļ Įš Ąį_1 € Ó_getenv ‰ Ąčė or čļ ŁI0023 Ąč#_2 I0023: ’ cmpb Ē,#47 ŁI002A Ąč#_3 I002A: Ąį58 € Įļ Ó_index ‰ ‰ Ąéė or éš ŁI002C Įļ Ūä-100(ń) € Ó_strcpy ‰ ‰ ĢI002D I002C: Ź-100(ń)ö Ąäš ×äļ € Įļ Ūä-100(ń) € Ó_strncat ¤ Ūä1(š) Ąčė I002D: cmpb -100(ń)ö je I002F Ąį_4 € Ūä-100(ń) € Ó_strcat ‰ ‰ I002F: ˆ Ūä-100(ń) € Ó_strcat ‰ ‰  € Ūä-100(ń) € Ó_access ‰ ‰ ™ ŁI0029 Į_environ “ Ūä-100(ń) € Óõ ¤ I0029: or éš ŁI002A Ą_errno,#2 mov ax,#-1 Ģ.ds ® _1: Ā16720 Ā18516 ø _2: Ā12090 Ā26978 Ā14958 Ā29999 Ā29299 Ā25135 Ā28265 ø _3: ø _4: .word 47 .text Čffs.s.s—#J÷€Č_ffs É_ffs † _ffs: ƒ ‚ € Įļ Įš ĄéÅ or éš ŁI0013 ‡ € š • Ąč#1 I0018: test é#1 je I0016 Įļ š ½ Üļ sar é#1 ĢI0018 Ÿ  jmp .dsret Čfgetc.s—#W÷€»Č_fgetc É_fgetc † _fgetc: ƒ ‚ € Įļ ĄčÅ testb 4(ļ),#24 je I0013 Ąį-1 € š • testb 4(ļ),#1 ŁI0016 Ąį-1 € š ½ Ķ2(ļ)ö jg I0019 testb 4(ļ),#4 je I001C  € ŪäĘ € Į(ļ) Ó_read ¤ Ą2(ļ),ė ĢI001D I001C: 024 € Į6(ļ) Į(ļ) Ó_read ¤ Ą2(ļ),ė I001D: Ķ2(ļ)ö jg I001F Ķ2(ļ)ö ŁI00112 or 4(ļ),#8 š3 I00112: or 4(ļ),Ń I00113: Ąį-1 € š I001F: Ąä6(ļ) Ą8(ļ),ė I0019: Ąä2(ļ) óė Ą2(ļ),ė testb 4(ļ),#4 je I00115 — „ € š I00115: Ąä8(ļ) » Äā1 Ą8(ļ),ģ » ‡ Œ € Ÿ  jmp .sret Čfputc.s—#š÷€Č_fputc É_fputc † _fputc: ƒ ‚ € € Įļ ĄčĪ Įš Ėéš testb 4(ļ),#24 je I0013 Ąį-1 € š • testb 4(ļ),#2 ŁI0016 Ąį-1 € š ½ testb 4(ļ),#4 je I0019  € ŪäÅ € Į(ļ) Ó_write ¤ ” Ą2(ļ),#1 Üš ĢI001A I0019: Ą___cleanup,#__cleanup Ąä8(ļ) » Äā1 Ėęķ Źcl,Å Įķ Ą8(ļ),ģ »  ŗ Ąä2(ļ) Üė Ą2(ļ),ė Ķ2(ļ),#1024 jl I001A testb 4(ļ),#128 ŁI001A Į2(ļ) Į6(ļ) Į(ļ) Ó_write ¤ ” Ąä6(ļ) Ą8(ļ),ė Üš I001A: or éš je I00110 ĶĘö jle I00112 — Ķ2(ļ),ė je I00113 I00112: ĶĘö jge I00117 or 4(ļ),Ń š8 I00117: or 4(ļ),#8 I00118: Ąį-1 € š I00113: Ą2(ļ)ö I00110: ‡ Źal,Å € Ÿ  jmp .dsret Čgetcwd.s—##ł€·Č_getcwd É_getcwd † _getcwd: ƒ ‚ ×ņ,#82 Įļ ĄčÅ ³ _1: .zerow 128/2 _6: .zerow 16/2 _7: .zerow 30/2 † or čļ ± ĶĪö ŁI0013   Ą_errno,#22 ‡ € š • Ź_1ö Ūä-30(ń) € Ąį_2 € Ó_stat ‰ ‰ Ķį-1 ŁI0017 ‡ € š I0017: Ąä-2Ī Öį61440 Ķį16384 je I001D ‡ € š I001D: Ą-7Ōö Ą-80(ń)ö Ąį_3 € Ó_chšr ‰ Ķį-1 ŁI00110 ‡ € š I00110: Ūä-60(ń) € Ąį_4 € Ó_stat ‰ ‰ Ķį-1 ŁI00113 ‡ € š I00113: Ąä-5Ī Öį61440 Ķį16384 je I00116 ‡ € š I00116: Ąä-60(ń) Ķ-30(ń),ė ŁI00119 Ą-7Ō,#1 I00119: Ķ-7Ōö je I0011C Ąä-5Ō Ķ-2Ō,ė ŁI0011C ĢI001C I0011C: ‡ € Ąį_5 € Ó_open pop bx pop ģ Ą-82(ń),ė Ķ-82(ń),#-1 ŁI00123 ‡ € š I00123: Ķ-80(ń)ö ŁI00122 6 € Ūä-7Ī € Į-82(ń) Ó_read ¤ Ķį16 ŁI00122 Ķ-7Ōö ±7 Ąä-7Ī Ķ-2Ō,ė ŁI00123 Ą-80(ń),#1 ĢI00123 I00127: Ź_6ö 4 € Ūä-7Å € Ąį_6 € Ó_strncat ¤ Ąį_7 € Ąį_6 € Ó_stat ‰ ‰ Ķį-1 ŁI0012D Į-82(ń) Ó_close ‰ ‡ € š I0012D: Ąę_7 Ķ-30(ń),ķ ŁI00123 Ąę_7+2 Ķ-2Ō,ķ ŁI00123 Ą-80(ń),#1 ĢI00123 I00122: Į-82(ń) Ó_close ‰ Ķ-80(ń)ö ŁI00134 ‡ € š I00134: Ąį_1 € Ó_strlen ‰ Äį15 Ķį127 jle I00137 Ą_errno,#34 ‡ € š I00137: Ąį_8 € Ąį_1 € Ó_strcat ‰ ‰ 4 € Ūä-7Å € Ąį_1 € Ó_strncat add ņ,#6 Ąä-60(ń) Ą-30(ń),ė Ąä-5Ō Ą-2Ō,ė ĢI001D I001C: Ąį_1 € Ó_strlen ‰ Üė ĶĪ,ė jge I0013A Ą_errno,#34 ‡ € š I0013A: Ąį_1 € Ó_strlen ‰ ™ ŁI0013D Ąį_9 € Įļ Ó_strcpy ‰ ‰ Įļ š I0013D: Ź(ļ)ö I00140: Ąį47 € Ąį_1 € Ó_rindex ‰ ‰ Ą-32(ń),ė Ķ-32(ń)ö je I0013F Į-32(ń) Įļ Ó_strcat ‰ ‰ Ąå-32(ń) ŹĒö ĢI00140 I0013F: Įļ Ó_chšr ‰ ™ je I00143 ‡ € š I00143: Įļ Ÿ  Ģ.s ® _2: Ā46 _3: Ā11822 ø _4: Ā46 _5: Ā46 _8: Ā47 _9: .word 47 .text Čgetlogin.s—#oł€ŸČ_getlogin É_getlogin † _getlogin: ƒ ‚ € Įļ ³ _1: .zerow 10/2 † Ó_getuid € Ó_getpwuid ‰ Ąčė or čļ ŁI0013 ‡ € š • Į(ļ) Ąį_1 € Ó_strcpy ‰ ‰ Ąį_1 € Ÿ  jmp .sret Člsearch.s—#3ś€†Č_lfind Č_lsearch É_lsearch † _lsearch: ƒ ‚ € € Įļ Įš › « mul 10(ń) » ÄåĪ Ąéģ ĄčĪ I0015: Ķéļ jbe I0012 Ąä12(ń) Įļ ˆ Ó(ė) ‰ ‰ ™ ŁI0013 Įļ š • Ąå10(ń) Äåļ Ąčģ ĢI0015   Į10(ń) Įš ˆ Ó_bcopy ¤ › ÄĒ,#1 Įš Ÿ  Ģ.ds É_lfind _lfind: ƒ ‚ € € Įļ Įš › « mul 10(ń) » ÄåĪ Ąéģ ĄčĪ I0025: Ķéļ jbe I0022 Ąä12(ń) Įļ ˆ Ó(ė) ‰ ‰ ™ ŁI0023 Įļ ĢI0021 I0023: Ąå10(ń) Äåļ Ąčģ ĢI0025 I0022: ‡ € I0021:  jmp .dsret memccpy.s—#fś€‚Č_memccpy É_memccpy † _memccpy: ƒ ‚ Įļ ĄčĪ Įš Ąé10(ń) • óš or éš jl I0012 Ąåļ Üļ Œ ’ ŗ ÜÅ ‹ ĶŌ,ė ŁI0013 Įļ š   ‡ € Ÿ  jmp .dsret memchr.s—#oś€{Č_memchr É_memchr † _memchr: ƒ ‚ Įļ ĄčÅ Įš ĄéŌ • óš or éš jl I0012 Ąåļ Üļ Œ ‹ ĶĪ,ė ŁI0013 Ūä-1(ļ) € š   ‡ € Ÿ  jmp .dsret Čmemcmp.s—#yś€œČ_memcmp É_memcmp † _memcmp: ƒ ‚ € Įļ Įš ĄéĪ ĶÅ,š ŁI0016 ‡ € š ½ óŌ jl I0015 ’ ÜÅ Œ ‹ Ąåš Üš € Œ ‹ Ćķ ×ęė Ąčķ or čļ je I0016 Įļ š I0015: ‡ € Ÿ  jmp .dsret memcpy.s—#…ś€bČ_memcpy É_memcpy † _memcpy: ƒ ‚ ×ņ,#6 Įļ ĄčÅ Įš ĄéĪ  ĄäŌ cwd išv ķ ” ĄäŌ Öį1 ¬ ĄŠ,ļ Ķéļ jae I001D › Äåš Ķåļ jbe I001D › Äåš Ąéģ › Äåļ Ąčģ I0017: óĻ jl I001A óš óļ Źal,(š) Ź(ļ),al ĢI0017 I001A: óĘ jl I0014 Äé#-2 Äč#-2 Ąä(š) Ą(ļ),ė ĢI001A I001D: óĘ jl I00110 Ąåš Äé#2 « Ą(ļ),ė Äč#2 ĢI001D I00110: óĻ jl I0014 Ąåš Üš Œ Ź(ļ),al Üļ š0 I0014: ĄäŠ jmp .dsret memset.s—#Žś€eČ_memset É_memset † _memset: ƒ ‚ € Įļ Įš ĄéŌ ĄčÅ • óš or éš jl I0012 ĄäĪ Ź(ļ),al Üļ ­   ¢ jmp .dsret Čstrchr.s—#ŗü€€Č_strchr É_strchr † _strchr: ƒ ‚ Įļ ĄčÅ I0014: Źal,(ļ) ‹ € Źal,Ī ‹ Ćķ Ķęė ŁI0013 Įļ š • Ąåļ Üļ cmpb Ēö ŁI0014 ‡ € Ÿ  jmp .sret strcspn.s—#×ü€ Č_strcņn É_strcņn † _strcņn: ƒ ‚ € € Įļ Įš ĶÅö ŁI0013 ‡ € š • ĶĪö ŁI0016 ˆ Ó_strlen ‰ € š ½ ĄčÅ I001B: cmpb (ļ)ö je I0018 ĄéĪ I001F: cmpb (š)ö je I0019 Źal,(ļ) ‹ € Źal,(š) ‹ Ćķ Ķęė ŁI001D Ąäļ ×äÅ € š I001D: Üš ĢI001F I0019: Üļ ĢI001B I0018: Ąäļ ×äÅ € Ÿ  jmp .dsret strpbrk.s—#ż€źČ_strpbrk É_strpbrk † _strpbrk: ƒ ‚ € € Įļ Įš ĄéÅ or éš ± ĶĪö ŁI0017   ‡ € š I0017: Ąåš Üš Œ Ź-1(ń),al ‹ ™ je I0016 ĄčĪ I001C: cmpb (ļ)ö je I0017 Źal,-1(ń) ‹ € Źal,(ļ) ‹ Ćķ Ķęė ŁI001A Ūä-1(š) € š I001A: Üļ ĢI001C ½ ‡ € Ÿ  jmp .dsret strrchr.s—#ż€‰Č_strrchr É_strrchr † _strrchr: ƒ ‚ € Įļ ĄčÅ Įš Ėéš I0014: Źal,(ļ) ‹ € Źal,Ī ‹ Ćķ Ķęė ŁI0013 Ąéļ • Ąåļ Üļ cmpb Ēö ŁI0014 Ąädi jmp .dsret Čstrspn.s—#ż€ Č_strņn É_strņn † _strņn: ƒ ‚ € € Įļ Įš ĶÅö ± ĶĪö ŁI0013   ‡ € š • ĄčÅ I0019: cmpb (ļ)ö je I0016 ĄéĪ I001D: cmpb (š)ö je I001A Źal,(ļ) ‹ € Źal,(š) ‹ Ćķ Ķęė ŁI001B ĢI001A I001B: Üš ĢI001D I001A: cmpb (š)ö ŁI0017 Ąäļ ×äÅ € š I0017: Üļ ĢI0019 ½ Ąäļ ×äÅ € Ÿ  jmp .dsret Čstrstr.s—#'ż€)Č_strstr É_strstr † _strstr: ƒ ‚ ×ņ,#6 Įļ ĄčÅ Įš ĄéĪ or čļ ± or éš ŁI0013   ‡ € š • Ąåš Üš Œ ŹĘ,al I0017: Ąåļ Üļ Œ Ź-1(ń),al ‹ ™ je I0016 Źal,-1(ń) ‹ € Źal,Ę ‹ Ćķ Ķęė ŁI0017 ĄĻ,ļ ĄŠ,š I001E: ĄåŠ cmpb Ēö ŁI001D Ūä-1(ļ) € š I001D: ĄåĻ ÜĻ Œ ‹ ĄåŠ ÜŠ € Œ ‹ Ćķ Ķęė je I001E ĢI0017 ½ ‡ € Ÿ  jmp .dsret Čstrtok.s—#2ż€ōČ_strtok É_strtok † _strtok: ƒ ‚ € € Įļ Įš ĄéÅ ® _1: Ā_2 † or éš ŁI0013 Ąé_1 • ĶĪö ŁI0019 ‡ € š I0019: cmpb (š)ö je I0018 ĄčĪ I001E: cmpb (ļ)ö je I001B Źal,(š) ‹ € Źal,(ļ) ‹ Ćķ Ķęė ŁI001C ĢI001B I001C: Üļ ĢI001E I001B: cmpb (ļ)ö ŁI00113 ĢI0018 I00113: Üš ĢI0019 I0018: cmpb (š)ö ŁI00116 ‡ € š I00116: ĄĻ,š I00119: cmpb (š)ö je I00118 ĄčĪ I0011E: cmpb (ļ)ö je I0011B Źal,(š) ‹ € Źal,(ļ) ‹ Ćķ Ķęė ŁI0011C Ź(š)ö Ūę1(š) Ą_1,ķ ¹ š I0011C: Üļ šE I0011B: Üš š9 I00118: Ą_1,š ¹ Ÿ  Ģ.ds ® _2: .word 0 .text swab.ss—#Eż€”Č_swab É_swab † _swab: ƒ ‚ € Įļ ĄčĪ Įš ĄéÅ ĄäŌ sar į1 ĄŌ,ė • óŌ jl I0012 Ąåš Üš Œ Ź-1(ń),al Ąå !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]š Üš Œ Ź(ļ),al Üļ Źal,-1(ń) Ź(ļ),al Üļ ­   jmp .dsret ttyname.s—#Éż€‹Č_ttyname É_ttyname † _ttyname: ƒ ‚ ×ņ,#78 Įļ Ūä-4Ō € ˆ Ó_fstat ‰ ‰ ™ jge I0013 ‡ € š • Ąä-4Å Öį61440 Ķį8192 je I0016 ‡ € š ½ ‡ € Ąį_1 € Ó_open ‰ ‰ Ąčė or čļ jge I001C ‡ € š I001C: 6 € Ūä-1Ō € Įļ Ó_read ¤ ™ jle I001B Ąä-1Ō Ķ-4Ī,ė je I001F ĢI001C I001F: Ąį_2 € Ąį_file_name € Ó_strcpy ‰ ‰ 4 € Ūä-1Ī € Ąį_file_name € Ó_strncat ¤ Ūä-7Ō € Ąį_file_name € Ó_stat ‰ ‰ ™ jge I00112 ĢI001C I00112: Ąä-7Å Öį61440 Ķį8192 je I00115 ĢI001C I00115: Ąä-7Ī Ķ-4Ī,ė ŁI001C Ąä-7Ō Ķ-4Ō,ė ŁI001C Ąä-6Ī Ķ-36(bp),ax jne I001C Įļ Ó_close ‰ Ąį_file_name € š I001B: Įļ Ó_close ‰ ‡ € Ÿ  Ģ.s ³ _file_name: .zerow 40/2 ® _1: Ā25647 Ā30309 Ā47 _2: Ā25647 Ā30309 .word 47 .text Čregexp.s—#ķū€„.Č_regexec Č_regcomp É_regcomp † _regcomp: ƒ ‚ ×ņ,#10 Įļ Įš ĶÅö ŁI0013 Ąį_1 € Ó_regerror ‰ ‡ € š • ĄęÅ Ą_regparse,ķ Ą_regnpar,#1 Ą_regļzeö Ą_regļze+2ö Ą_regcode,#_regdummy 56 € Ó_regc ‰ Ūä-10(ń) € ‡ € Ó_reg ‰ ‰ ™ ŁI0016 ‡ € š ½ Į_regļze+2 Į_regļze ‡ € Ąį32767 € Ó.cmi4 ™ jl I0019 Ąį_2 € Ó_regerror ‰ ‡ € š I0019: Ąę_regļze Äć48 Įķ Ó_malloc ‰ Ąčė or čļ ŁI001C Ąį_3 € Ó_regerror ‰ ‡ € š I001C: ĄęÅ Ą_regparse,ķ Ą_regnpar,#1 Ūę46(ļ) Ą_regcode,ķ 56 € Ó_regc ‰ Ūä-10(ń) € ‡ € Ó_reg ‰ ‰ ™ ŁI001F ‡ push ax š I001F: Ź40(ļ)ö Ź41(ļ)ö Ą42(ļ)ö Ą44(ļ)ö Ūä47(ļ) Ąéė Įš Ó_regnext ‰ » cmpb Ēö ŁI00112 Äé#3 cmpb (š),#8 ŁI00115 Źal,3(š) Ź40(ļ),al š6 I00115: cmpb (š),#1 ŁI00116 Źal,41(ļ) ‹ Üė Ź41(ļ),al I00116: testb -10(ń),#4 je I00112 ĄŠö ĄŲö I00120: or éš je I0011D cmpb (š),#8 ŁI0011E Ūä3(š) € Ó_strlen ‰ ĶŲ,ė jg I0011E Ūä3(š) ĄŠ,ė Ūä3(š) € Ó_strlen ‰ ĄŲ,ė I0011E: Įš Ó_regnext ‰ Ąéė ĢI00120 I0011D: ĄäŠ Ą42(ļ),ė ĄäŲ Ą44(ļ),ė I00112: Įļ Ÿ  Ģ.ds _reg: ƒ ‚ ×ņ,#10 Įļ Įš Æ ĄĒ,#1 ĶÅö je I0023 Ķ_regnpar,#10 jl I0026 Ąį_4 € Ó_regerror ‰ ‡ € ĢI0021 I0026: Ąę_regnpar ĄŲ,ķ Ü_regnpar ĄäŲ Äį20 € call _regnode ‰ Ąéė ĢI0024 I0023: Ėéš I0024: Ūä-10(ń) € Ó_regbranch ‰ Ąčė or čļ ŁI0029 ‡ € ĢI0021 I0029: or éš je I002C Įļ Įš Ó_regtail ‰ ‰ ĢI002D I002C: Ąéļ I002D: testb -10(ń),#1 ŁI002F Æ ÖĒ,#65534 I002F: Æ Ąä-10(ń) Öį4 or äĒ ° I00212: Ąå_regparse cmpb Ē,#124 ŁI00211 Ü_regparse Ūä-10(ń) € Ó_regbranch ‰ Ąčė or čļ ŁI00215 ‡ € ĢI0021 I00215: Įļ Įš Ó_regtail ‰ ‰ testb -10(ń),#1 ŁI00218 Æ ÖĒ,#65534 I00218: Æ Ąä-10(ń) Öį4 or äĒ ° ĢI00212 I00211: ĶÅö je I0021B ĄäŲ Äį30 € ĢI0021C I0021B: ‡ € I0021C: Ó_regnode ‰ ĄŠ,ė ĮŠ Įš Ó_regtail ‰ ‰ Ąčš I00220: or čļ je I0021D ĮŠ Įļ Ó_regoptail ‰ pop bx push ļ Ó_regnext ‰ Ąčė ĢI00220 I0021D: ĶÅö je I00222 Ąå_regparse Ü_regparse cmpb Ē,#41 je I00222 Ąį_5 € Ó_regerror ‰ ‡ € ĢI0021 I00222: ĶÅö ŁI00223 Ąå_regparse cmpb Ēö je I00223 Ąå_regparse cmpb Ē,#41 ŁI0022A Ąį_6 € Ó_regerror ‰ ‡ € ĢI0021 I0022A: Ąį_7 € Ó_regerror ‰ ‡ € ĢI0021 I00223: Įš I0021:  Ģ.ds _regbranch: ƒ ‚ ×ņ,#8 Įļ Įš ’ ĄĒö Ąį6 € Ó_regnode ‰ ” Ėčļ I0033: Ąå_regparse cmpb Ēö je I0032 Ąå_regparse cmpb Ē,#124 je I0032 Ąå_regparse cmpb Ē,#41 je I0032 ŪäŲ € Ó_regpiece ‰ Ąéė or éš ŁI0038 ‡ € ĢI0031 I0038: ’ ĄäŲ Öį1 or äĒ ° or čļ ŁI003B ’ ĄäŲ Öį4 or äĒ mov (bx),ax ĢI003C I003B: Įš Įļ Ó_regtail ‰ ‰ I003C: Ąčš ĢI0033 I0032: or čļ ŁI003E Ąį9 € Ó_regnode ‰ I003E: ” I0031:  Ģ.ds _regpiece: ƒ ‚ ×ņ,#8 Įļ Įš ŪäŲ € Ó_regatom ‰ Ąčė or čļ ŁI0043 ‡ € ĢI0041 I0043: Ąå_regparse Œ Ź-3(ń),al cmpb -3(ń),#42 je I0046 cmpb -3(ń),#43 je I0046 cmpb -3(ń),#63 je I0046 ĄäŲ ’ ° Įļ ĢI0041 I0046: testb Ų,#1 ŁI004B cmpb -3(ń),#63 je I004B Ąį_8 € Ó_regerror ‰ ‡ € ĢI0041 I004B: cmpb -3(ń),#43 je I004F Ąį4 € ĢI00410 I004F:  € I00410: ’ ĆĒ cmpb -3(ń),#42 ŁI00412 testb Ų,#2 je I00412 Įļ 0 € Ó_reginsert ‰ ‰ ĢI00413 I00412: cmpb -3(ń),#42 ŁI00416 Įļ Ąį6 € Ó_reginsert ‰ ‰ Ąį7 € call _regnode ‰ € Įļ Ó_regoptail ‰ ‰ Įļ Įļ Ó_regoptail ‰ ‰ Ąį6 € Ó_regnode ‰ € Įļ Ó_regtail ‰ ‰ Ąį9 € Ó_regnode ‰ € Įļ Ó_regtail ‰ ‰ ĢI00413 I00416: cmpb -3(ń),#43 ŁI00419 testb Ų,#2 je I00419 Įļ 1 € Ó_reginsert ‰ ‰ ĢI00413 I00419: cmpb -3(ń),#43 ŁI0041D Ąį6 € Ó_regnode ‰ Ąéė Įš Įļ Ó_regtail ‰ ‰ Įļ Ąį7 € Ó_regnode ‰ € Ó_regtail ‰ ‰ Ąį6 € Ó_regnode ‰ € Įš Ó_regtail ‰ ‰ Ąį9 € Ó_regnode ‰ € Įļ Ó_regtail ‰ ‰ ĢI00413 I0041D: cmpb -3(ń),#63 ŁI00413 Įļ Ąį6 € Ó_reginsert ‰ ‰ Ąį6 € Ó_regnode ‰ € Įļ Ó_regtail ‰ ‰ Ąį9 € Ó_regnode ‰ Ądi,ax push di Įļ Ó_regtail ‰ ‰ Įš Įļ Ó_regoptail ‰ ‰ I00413: Ü_regparse Ąå_regparse cmpb Ē,#42 je I00422 Ąå_regparse cmpb Ē,#43 je I00422 Ąå_regparse cmpb Ē,#63 ŁI00423 I00422: Ąį_9 € Ó_regerror ‰ ‡ € ĢI0041 I00423: Įļ I0041:  Ģ.ds _regatom: ƒ ‚ ×ņ,#8 Įļ Įš ĄéÅ ® _17: ĀI00532 Ā12 ø ĀI0052A Ā36 ĀI0055 Ā40 ĀI00524 Ā41 ĀI0052A Ā42 ĀI0052D Ā43 ĀI0052D Ā46 ĀI0056 Ā63 ĀI0052D Ā91 ĀI0057 Ā92 ĀI0052E Ā94 ĀI0054 Ā124 ĀI0052A † Ą(š)ö Ąå_regparse Ü_regparse Œ ‹ € ĢI0052 I0054:  € Ó_regnode ‰ Ąčė ĢI0053 I0055: “ € Ó_regnode ‰ Ąčė ĢI0053 I0056: Ąį3 € Ó_regnode ‰ Ąčė or (š),#3 ĢI0053 I0057: mov bx,_regparse cmpb Ē,#94 ŁI0059 Ąį5 € Ó_regnode ‰ Ąčė Ü_regparse ĢI005A I0059: Ąį4 € Ó_regnode ‰ Ąčė I005A: Ąå_regparse cmpb Ē,#93 je I005B Ąå_regparse cmpb Ē,#45 ŁI00510 I005B: Ąå_regparse Ü_regparse Œ ‹ € Ó_regc ‰ I00510: Ąå_regparse cmpb Ēö je I005F Ąå_regparse cmpb Ē,#93 je I005F Ąå_regparse cmpb Ē,#45 ŁI00514 Ü_regparse Ąå_regparse cmpb Ē,#93 je I00516 Ąå_regparse cmpb Ēö ŁI00517 I00516: Ąį45 € Ó_regc ‰ ĢI00510 I00517: Ąå_regparse Źal,-2Ē Ž Üė ĄŠ,ė Œ Ž ĄŲ,ė ĄäŲ Üė ĶŠ,ė jle I00520 Ąį_10 € Ó_regerror ‰ ‡ € ĢI0051 I00520: ĄäŲ ĶŠ,ė jg I0051D ĮŠ Ó_regc ‰ ÜŠ ĢI00520 I0051D: Ü_regparse ĢI00510 I00514: Ąå_regparse Ü_regparse Œ cbw push ė Ó_regc ‰ ĢI00510 I005F: ‡ € Ó_regc ‰ Ąå_regparse cmpb Ē,#93 je I00522 Ąį_11 € Ó_regerror ‰ ‡ € ĢI0051 I00522: Ü_regparse or (š),#3 ĢI0053 I00524: ŪäĻ €  € Ó_reg ‰ ‰ Ąčė or čļ ŁI00526 ‡ € ĢI0051 I00526: £ Öį5 or ä(š) Ą(š),ė ĢI0053 I0052A: Ąį_12 € Ó_regerror ‰ ‡ € ĢI0051 I0052D: Ąį_13 € Ó_regerror ‰ ‡ € ĢI0051 I0052E: Ąå_regparse cmpb Ēö ŁI00530 Ąį_14 € Ó_regerror ‰ ‡ € ĢI0051 I00530: Ąį8 € Ó_regnode ‰ Ąčė Ąå_regparse Ü_regparse Œ ‹ € Ó_regc ‰ ‡ € Ó_regc ‰ or (š),#3 ĢI0053 I00532: ó_regparse Ąį_15 € Į_regparse Ó_strcņn ‰ ‰ ĄŠ,ė ĶŠö jg I00534 mov ax,#_16 € Ó_regerror ‰ ‡ € ĢI0051 I00534: ĄåŠ Äå_regparse Œ Ź-7(ń),al ĶŠ,#1 jle I00537 cmpb -7(ń),#42 je I00536 cmpb -7(ń),#43 je I00536 cmpb -7(ń),#63 ŁI00537 I00536: óŠ I00537: or (š),#1 ĶŠ,#1 ŁI0053D or (š),#2 I0053D: Ąį8 € Ó_regnode ‰ Ąčė I00540: ĶŠö jle I0053F Ąå_regparse Ü_regparse Œ ‹ € Ó_regc ‰ óŠ ĢI00540 I0053F: ‡ € Ó_regc ‰ ĢI0053 I0052: Ąā_17  Ģ.csb2 I0053: Įļ I0051:  Ģ.ds _regnode: ƒ ‚ € € Įļ Įš Ąé_regcode Ķé#_regdummy ŁI0063 Ä_regļze,#3 adc _regļze+2ö Įš ĢI0061 I0063: Ąčš Źal,Å Ź(ļ),al Üļ Ź(ļ)ö Üļ Ź(ļ)ö Üļ Ą_regcode,ļ Įš I0061:  Ģ.ds _regc: ƒ ‚ Ķ_regcode,#_regdummy je I0073 Ąå_regcode Źal,Å movb (bx),al inc _regcode ĢI0074 I0073: Ä_regļze,#1 adc _regļze+2ö I0074: Ģ.c _reginsert: ƒ ‚ ×ņ,#6 Įļ Įš Ķ_regcode,#_regdummy ŁI0083 Ä_regļze,#3 adc _regļze+2ö Ģ.ds I0083: Ąé_regcode Ä_regcode,#3 Ąę_regcode ĄĻ,ķ I0086: ĶĪ,š jae I0085 óš ‡ Źal,(š) € óĻ ĄåĻ  ŗ ĢI0086 I0085: ĄčĪ Źal,Å Ź(ļ),al Üļ Ź(ļ)ö Üļ Ź(ļ)ö Üļ Ģ.ds _regtail: ƒ ‚ ×ņ,#6 Įļ Įš ĶÅ,#_regdummy ŁI0093 Ģ.ds I0093: ĄčÅ I0098: Įļ Ó_regnext ‰ Ąéė or éš ŁI009A ĢI0095 I009A: Ąčš ĢI0098 I0095: cmpb (ļ),#7 ŁI009D Ąäļ ×äĪ ĄŠ,ė ĢI009E I009D: ĄäĪ ×äļ ĄŠ,ė I009E: Ąć8 ĄäŠ sar äcl „ Ź1(ļ),al ĄäŠ „ Ź2(ļ),al Ģ.ds _regoptail: ƒ ‚ Įsi mov si,4(bp) or čļ je I00A2 Ķč#_regdummy je I00A2 cmpb (ļ),#6 je I00A3 I00A2: Ģ.s I00A3: “ Ūä3(ļ) € Ó_regtail ‰ ‰ Ģ.s É_regexec _regexec: ƒ ‚ € Įļ Įš ĄéÅ or éš je I00B2 ĶĪö ŁI00B3 I00B2: Ąį_18 € Ó_regerror ‰ ‡ € ĢI00B1 I00B3: cmpb 46(š),#156 je I00B7 Ąį_19 € Ó_regerror ‰ ‡ € ĢI00B1 I00B7: Ķ42(š)ö je I00BA ĄčĪ I00BD: Ąå42(š) Œ ‹ € Įļ Ó_index ‰ ‰ Ąčė or čļ je I00BC Į44(š) Į42(š) Įļ Ó_strncmp ¤ ™ ŁI00B10 ĢI00BC I00B10: Üļ ĢI00BD I00BC: or čļ ŁI00BA ‡ € ĢI00B1 I00BA: ĶŌö je I00B16 ĄęĪ Ą_regbol,ķ ĢI00B17 I00B16: Ą_regbolö I00B17: cmpb 41(š)ö je I00B19 “ Įš Ó_regtry ‰ ‰ € ĢI00B1 I00B19: ĄčĪ cmpb 40(š)ö je I00B26 I00B1F: Źal,40(š) ‹ € Įļ Ó_index ‰ ‰ Ąčė or čļ je I00B1D Įļ Įš Ó_regtry ‰ ‰ ™ je I00B22  € ĢI00B1 I00B22: Üļ ĢI00B1F I00B26: Įļ Įš Ó_regtry ‰ ‰ ™ je I00B25  € ĢI00B1 I00B25: Ąåļ Üļ cmpb Ēö ŁI00B26 I00B1D: ‡ € I00B1:  Ģ.ds _regtry: ƒ ‚ ×ņ,#6 Įļ Įš ĄęĪ Ą_reginput,ķ ĄęÅ Ą_regstartp,ķ ’ Äā20 Ą_regendp,ģ ĄčÅ ’ Äā20 Ąéģ ĄĘ,#10 I00C5: ĶĘö jle I00C2 Ą(ļ)ö Äč#2 Ą(š)ö Äé#2 óĘ ĢI00C5 I00C2: ’ Äā47 ¦ Ó_regmatch ‰ ™ je I00C7 ĄäĪ ’ ° ’ Ąę_reginput Ą20Ē,ķ  € ĢI00C1 I00C7: ‡ € I00C1:  Ģ.ds _regmatch: ƒ ‚ ×ņ,#12 Įsi push di .data _21: ĀI00D63 ø Ā39 ĀI00D62 ĀI00D7 ĀI00DB ĀI00DF ĀI00D1B ĀI00D20 ĀI00D45 ĀI00D6 ĀI00D13 ĀI00D6 ĀI00D51 ĀI00D51 ĀI00D63 ĀI00D63 ĀI00D63 ĀI00D63 ĀI00D63 ĀI00D63 ĀI00D63 ĀI00D63 ĀI00D63 ĀI00D2F ĀI00D2F ĀI00D2F ĀI00D2F ĀI00D2F ĀI00D2F ĀI00D2F ĀI00D2F ĀI00D2F ĀI00D63 ĀI00D3E ĀI00D3E ĀI00D3E ĀI00D3E ĀI00D3E ĀI00D3E ĀI00D3E ĀI00D3E ĀI00D3E † ĄčÅ I00D3: or čļ je I00D2 Įļ Ó_regnext ‰ Ąéė Źal,(ļ) ‹ € ĢI00D5 I00D7: Ąę_regbol Ķ_reginput,ķ je I00D6 ‡ € ĢI00D1 I00DB: Ąå_reginput cmpb Ēö je I00D6 ‡ € ĢI00D1 I00DF: Ąå_reginput cmpb Ēö ŁI00D11 ‡ € ĢI00D1 I00D11: Ü_reginput ĢI00D6 I00D13: Ūä3(ļ) ĄŲ,ė ĄåŲ Œ ‹ Ąå_reginput push ax movb al,Ē ‹ Ćķ Ķęė je I00D15 ‡ € ĢI00D1 I00D15: ĮŲ Ó_strlen ‰ ĄŠ,ė ĶŠ,#1 jle I00D18 ĮŠ Į_reginput ĮŲ Ó_strncmp ¤ ™ je I00D18 ‡ € ĢI00D1 I00D18: ĄåŠ Äå_reginput Ą_reginput,ģ ĢI00D6 I00D1B: Ąå_reginput cmpb Ēö je I00D1C Ąå_reginput Œ ‹ € Ūä3(ļ) € Ó_index ‰ ‰ ™ ŁI00D1D I00D1C: ‡ € ĢI00D1 I00D1D: Ü_reginput ĢI00D6 I00D20: Ąå_reginput cmpb Ēö je I00D21 Ąå_reginput Œ ‹ € Ūä3(ļ) € Ó_index ‰ ‰ ™ je I00D22 I00D21: ‡ € ĢI00D1 I00D22: Ü_reginput ĢI00D6 I00D2F: Źal,(ļ) ‹ ×į20 ĄŠ,ė Ąę_reginput ĄŲ,ķ Įš Ó_regmatch ‰ ™ je I00D31 ĄåŠ sal ā1 Äå_regstartp ĶĒö ŁI00D34 ĄåŠ sal ā1 Äå_regstartp mov ax,-8(bp) mov Ē,ė I00D34:  € ĢI00D1 I00D31: ‡ € ĢI00D1 I00D3E: Źal,(ļ) ‹ ×į30 ĄŠ,ė Ąę_reginput ĄŲ,ķ Įš Ó_regmatch ‰ ™ je I00D40 ĄåŠ sal ā1 Äå_regendp ĶĒö ŁI00D43 ĄåŠ sal ā1 Äå_regendp ĄäŲ ° I00D43:  € ĢI00D1 I00D40: ‡ € ĢI00D1 I00D45: cmpb (š),#6 je I00D4B Ūä3(ļ) Ąéė ĢI00D6 I00D4B: Ąę_reginput ĄŠ,ķ Ūä3(ļ) € Ó_regmatch ‰ ™ je I00D4D  € ĢI00D1 I00D4D: ĄęŠ Ą_reginput,ķ Įļ Ó_regnext ‰ Ąčė or čļ je I00D49 cmpb (ļ),#6 je I00D4B I00D49: ‡ € ĢI00D1 I00D51: Ź-5(ń)ö cmpb (š),#8 ŁI00D53 Źal,3(š) Ź-5(ń),al I00D53: cmpb (ļ),#10 ŁI00D56 ‡ € ĢI00D57 I00D56:  € I00D57: Ć-12(ń) Ąę_reginput Ą-10(ń),ķ Ūä3(ļ) € Ó_regrepeat pop bx mov Ų,ė I00D59: Ąä-12(ń) ĶŲ,ė jl I00D58 cmpb -5(ń)ö je I00D5B Ąå_reginput Œ ‹ € Źal,-5(ń) ‹ Ćķ Ķęė ŁI00D5C I00D5B: Įš Ó_regmatch ‰ ™ je I00D5C  € ĢI00D1 I00D5C: óŲ ĄåŲ Äå-10(ń) Ą_reginput,ģ ĢI00D59 I00D58: ‡ € ĢI00D1 I00D62:  € ĢI00D1 I00D63: Ąį_20 € Ó_regerror ‰ ‡ € ĢI00D1 I00D5: Ąā_21  Ģ.csa2 I00D6: Ąčš ĢI00D3 I00D2: Ąį_22 € Ó_regerror ‰ ‡ € I00D1:  Ģ.ds _regrepeat: ƒ ‚ ×ņ,#6 Įļ Įš ® _24: ĀI00E13 Ā3 Ā5 ĀI00E4 ĀI00EB ĀI00E10 ĀI00E13 ĀI00E13 ĀI00E7 † Ėéš Ąč_reginput ’ Äā3 ĄŠ,ģ ’ Œ ‹ € ĢI00E2 I00E4: Įļ Ó_strlen ‰ Ąéė Ąåš Äåļ Ąčģ ĢI00E3 I00E7: ĄåŠ Œ ‹ € Źal,(ļ) ‹ Ćķ Ķęė ŁI00E3 Üš Üļ ĢI00E7 I00EB: cmpb (ļ)ö je I00E3 Źal,(ļ) ‹ € ĮŠ Ó_index ‰ ‰ ™ je I00E3 Üš Üļ ĢI00EB I00E10: cmpb (ļ)ö je I00E3 Źal,(ļ) ‹ € ĮŠ Ó_index ‰ ‰ ™ ŁI00E3 Üš Üļ ĢI00E10 I00E13: Ąį_23 € Ó_regerror ‰ Ėéš ĢI00E3 I00E2: Ąā_24  Ģ.csa2 I00E3: Ą_reginput,ļ Ąäš Ģ.ds _regnext: ƒ ‚ € Įļ ĄčÅ Įš Ķč#_regdummy ŁI00F3 ‡ € ĢI00F1 I00F3: Ąć8 Źal,1(ļ) Ž sal äcl Źcl,2(ļ) Õch,ch Ääķ Ąéė or éš ŁI00F6 ‡ € ĢI00F1 I00F6: cmpb (ļ),#7 ŁI00F9 Ąäš ōė » Äåļ ¦ ĢI00F1 I00F9: Ąåš Äåļ ¦ I00F1:  Ģ.ds _strcņn: ƒ ‚ ×ņ,#6 Įļ Įš ĄŠ,#0 mov si,4(bp) I0105: cmpb (ļ)ö je I0102 ĄéĪ I0109: cmpb (š)ö je I0106 Źal,(ļ) ‹ Ąåš Üš € Œ ‹ Ćķ Ķęė ŁI0109 ĮŠ ĢI0101 I0106: ÜŠ Üļ ĢI0105 I0102: ĮŠ I0101:  Ģ.ds ³ _regendp: .zerow 2/2 _regstartp: .zerow 2/2 _regbol: .zerow 2/2 _reginput: .zerow 2/2 _regļze: .zerow 4/2 _regcode: .zerow 2/2 _regdummy: .zerow 2/2 _regnpar: .zerow 2/2 _regparse: .zerow 2/2 ® _1: Ā21838 Ā19532 Ā24864 Ā26482 Ā28021 Ā28261 Ā116 _2: Ā25970 Ā25959 Ā28792 Ā29728 Ā28527 Ā25120 Ā26473 ø _3: Ā30063 Ā8308 Ā26223 Ā29472 Ā24944 Ā25955 ø _4: Ā28532 Ā8303 Ā24941 Ā31086 Ā10272 Ā41 _5: Ā28277 Ā24941 Ā25460 Ā25960 Ā8292 Ā10536 ø _6: Ā28277 Ā24941 Ā25460 Ā25960 Ā8292 Ā10536 ø _7: Ā30058 Ā27502 Ā28448 Ā8302 .word 28261 Ā100 _8: Ā11050 Ā28448 Ā25968 Ā24946 æ10 Ā25376 Ā30063 æ08 Ā25120 Ā8293 Ā28005 Ā29808 Ā121 _9: Ā25966 Ā29811 æ01 Ā10784 Ā11071 ø _10: Ā28265 Ā24950 Ā26988 Ā8292 Ā23899 Ā29216 Ā28257 Ā25959 ø _11: Ā28277 Ā24941 Ā25460 Ā25960 Ā8292 Ā23899 ø _12: Ā28265 Ā25972 Ā28274 Ā27745 Ā29984 Ā28786 ø _13: Ā11071 Ā8234 Ā28518 Ā27756 Ā30575 Ā8307 Ā28526 Ā26740 Ā28265 Ā103 _14: Ā29300 Ā26977 Ā26988 Ā26478 Ā23584 ø _15: Ā9310 Ā23342 Ā10536 Ā16252 Ā10795 Ā92 _16: Ā28265 Ā25972 Ā28274 Ā27745 Ā25632 Ā29545 Ā29537 Ā25972 Ā114 _18: Ā21838 Ā19532 Ā28704 Ā29281 Ā28001 Ā29797 Ā29285 ø _19: Ā28515 .word 29298 Ā28789 Ā25972 Ā8292 Ā29296 Ā26479 Ā24946 Ā109 _20: Ā25965 Ā28525 Ā31090 Ā25376 Ā29295 Ā30066 Ā29808 Ā28521 Ā110 _22: Ā28515 Ā29298 Ā28789 Ā25972 Ā8292 Ā28528 Ā28265 Ā25972 Ā29554 ø _23: Ā28265 Ā25972 Ā28274 Ā27745 Ā26144 Ā30063 Ā30060 Ā112 .text jregsub.s—#žū€Č_regsub É_regsub † _regsub: ƒ ‚ ×ņ,#10 Įļ Įš ĶÅö ± ĶĪö ± ĶŌö ŁI0013   Ąį_1 € Ó_regerror ‰ Ģ.ds • ’ cmpb 46Ē,#156 je I0018 Ąį_2 € Ó_regerror ‰ Ģ.ds I0018: ĄčĪ ĄéŌ I001B: Ąåļ Üļ Œ Ź-5(ń),al ‹ ™ je I001A cmpb -5(ń),#38 ŁI001E ĄŲö ĢI001F I001E: cmpb -5(ń),#92 ŁI00111 Źal,(ļ) ‹ Ķį48 jl I00111 Źal,(ļ) ‹ Ķį57 jg I00111 Ąåļ Üļ Œ ‹ ×į48 ĄŲ,ė ĢI001F I00111: ĄŲ,#-1 I001F: ĶŲö jge I00116 cmpb -5(ń),#92 ŁI00119 cmpb (ļ),#92 je I00118 cmpb (ļ),#38 ŁI00119 I00118: Ąåļ Üļ Œ Ź-5(ń),al I00119: Źal,-5(ń) Ź(š),al Üš ĢI001B I00116: ĄåŲ sal ā1 ÄåÅ ĶĒö je I001B ’ Ūä20Ē ĄåŲ sal ā1 Äbx,ax cmp (bx)ö je I001B ’ Ūä20Ē ĄåŲ sal ā1 Äåė ĮĒ ĄåŲ sal ā1 ÄåÅ  ×äĒ Ą-10(ń),ė ĄåŲ sal ā1 ÄåÅ Į-10(ń) ĮĒ Įš Ó_strncpy ¤ Ąå-10(ń) Äåš Ąéģ Ķ-10(ń)ö je I001B cmpb -1(š)ö ŁI001B Ąį_3 € Ó_regerror ‰ Ģ.ds I001A: Ź(š)ö Üš Ģ.ds ® _1: Ā21838 Ā19532 Ā28704 Ā29281 Ā8301 Ā28532 Ā29216 Ā26469 Ā30067 Ā98 _2: Ā24932 Ā24941 Ā25959 Ā8292 Ā25970 Ā25959 Ā28792 Ā26144 æ01 Ā29728 Ā8303 Ā25970 Ā29543 Ā25205 ø _3: Ā24932 Ā24941 Ā25959 Ā8292 Ā24941 Ā25460 Ā8296 Ā29811 Ā26994 Ā26478 .word 0 .text getpwent.s—#™ł€@Č_getpwent Č_setpwent Č_getpwnam Č_getpwuid Č_endpwent ® __pw_file: Ā25903 Ā25460 Ā28719 Ā29537 Ā30579 Ā100 __pw: É_setpwent Ā-1 † _setpwent: ƒ ‚ Ķ__pwö jl I0013 ‡ € € € Į__pw Ó_lseek Äņ,#8 ĢI0014 • ‡ € Ąį__pw_file € Ó_open ‰ ‰ Ą__pw,ė I0014: Ą__bufcntö Ąä__pw Ģ.c É_endpwent _endpwent: ƒ ‚ Ķ__pwö jl I0023 Į__pw Ó_close ‰ I0023: Ą__pw,#-1 Ą__bufcntö Ģ.c _getline: ƒ ‚ Ķ__pwö jge I0033 Ó_setpwent ™ jge I0033 ‡ € ĢI0031 I0033: Ą__buf,#__pwbuf I0038: ó__bufcnt jg I003A 024 € Ąį__buffer € Į__pw Ó_read ¤ Ą__bufcnt,ė Ķ__bufcntö jg I003D ‡ € ĢI0031 I003D: Ą__pnt,#__buffer I003A: Ąå__pnt Ü__pnt ‡ Œ push ax mov å__buf  ŗ Ü__buf Ąå__pnt cmpb Ē,#10 ŁI0038 Ü__pnt ó__bufcnt Ąå__buf ŹĒö Ą__buf,#__pwbuf  € I0031:  Ģ.c _skip_period: ƒ ‚ I0043: Ąå__buf cmpb Ē,#58 je I0042 Ü__buf ĢI0043 I0042: Ąå__buf ŹĒö Ü__buf Ģ.c É_getpwent _getpwent: ƒ ‚ Ó_getline ™ ŁI0053 ‡ € ĢI0051 I0053: Ąę__buf Ą_pwd,ķ Ó_skip_period Ąę__buf Ą_pwd+2,ķ Ó_skip_period Į__buf Ó_atoi ‰ Ą_pwd+4,ė Ó_skip_period Į__buf Ó_atoi ‰ Ą_pwd+6,ė Ó_skip_period Ąę__buf Ą_pwd+8,ķ Ó_skip_period Ąę__buf Ą_pwd+10,ķ Ó_skip_period Ąę__buf Ą_pwd+12,ķ Ąį_pwd € I0051:  Ģ.c É_getpwnam _getpwnam: ƒ ‚ € Įļ Ó_setpwent I0063: Ó_getpwent Ąčė or čļ je I0062 ˆ Į(ļ) Ó_strcmp ‰ ‰ ™ jne I0063 I0062: Ó_endpwent or čļ je I0069 Įļ ĢI0061 I0069: ‡ € I0061:  Ģ.s É_getpwuid _getpwuid: ƒ ‚ € Įļ Ó_setpwent I0073: Ó_getpwent Ąčė or čļ je I0072 ¢ Ķ4(ļ),ė ŁI0073 I0072: Ó_endpwent or čļ je I0079 Įļ ĢI0071 I0079: ‡ € I0071:  Ģ.s ³ _pwd: .zerow 14/2 __bufcnt: .zerow 2/2 __buf: .zerow 2/2 __pnt: .zerow 2/2 __buffer: .zerow 1024/2 __pwbuf: .zerow 256/2 .text qsort.s.s—#ƒū€£Č_qsort É_qsort † _qsort: ƒ ‚ Įļ ĄčÅ Ąę10(ń) Ą_qcompar,ķ ĄäĪ óė mul Ō » Äåļ ĮŌ ¦ Įļ Ó_qsort1 ¤ Ģ.s _qsort1: ƒ ‚ ×ņ,#10 Įļ Įš I0025: ¢ ĶĪ,ė ja I0027 Ģ.ds I0027: ĄéÅ ĄäĪ ¬ ĄäĪ ×äÅ ÄäŌ ĄęŌ sal ć1 cwd išv ķ mul Ō » ÄåÅ ĄŲ,ģ ĄčŲ I002B: Ķčš jbe I00212 Ąę_qcompar Įļ Įš Ó(ķ) ‰ ‰ Ą-10(ń),ė Ķ-10(ń)ö jg I00212 Ķ-10(ń)ö jge I002F › Äåš Ąéģ ĢI002B I002F: ĄäŌ ōė » Äåļ Ąčģ ĮŌ Įļ Įš Ó_qexchange ¤ ĢI002B I00212: ĄäŲ ĶĻ,ė jbe I00211 Ąę_qcompar ĮŲ ¹ Ó(ķ) ‰ ‰ Ą-10(ń),ė Ķ-10(ń)ö jge I00215 Ķčš jbe I00218 ĮŌ push -4(bp) Įš Ó_qexchange ¤ › Äåš Ąéģ ĄäŌ ōė » ÄåĻ ĄĻ,ģ ĢI002B I00218: › ÄåŲ ĄŲ,ģ ĮŌ ¹ ĮŲ Įš Ó_q3exchange Äņ,#8 › Äåļ Ąčģ Ąéļ ĢI00212 I00215: Ķ-10(ń)ö ŁI0021B › ÄåŲ ĄŲ,ģ ĮŌ ĮŲ ¹ Ó_qexchange ¤ ĢI00212 I0021B: ĄäŌ ōė » ÄåĻ ĄĻ,ģ ĢI00212 I00211: Ķčš jbe I0021E ĄäŌ ōė » Äåļ Ąčģ ĮŌ Įš Įļ ¹ Ó_q3exchange Äņ,#8 ĄäŌ ōė » ÄåŲ ĄŲ,ģ ĄäŲ ¬ ĢI002B I0021E: ĄäŌ ōė » Äåļ ĮŌ ¦ ˆ Ó_qsort1 ¤ › ÄåŲ ĄÅ,ģ ĢI0025 _qexchange: ƒ ‚ € Įļ ĄčĪ Įš ĄéÅ I0033: mov ax,8(bp) óŌ ™ jle I0032 Źal,(š) ‹ ” Źal,(ļ) Ź(š),al Üš — Ź(ļ),al Üļ ĢI0033 I0032: Ģ.ds _q3exchange: ƒ ‚ € Įļ ĄčŌ Įš ĄéĪ I0043: Ąä10(ń) ó10(ń) ™ jle I0042 ’ Œ ‹ ” Źal,(ļ) ŗ ÜÅ Źal,(š) Ź(ļ),al Üļ — Ź(š),al Üš ĢI0043 I0042: Ģ.ds ³ _qcompar: .zerow 2/2 .text Čpopen.s—# ū€pČ_popen Č_pclose É_popen † _popen: ƒ ‚ ×ņ,#10 Įļ Įš ĄéĪ cmpb (š),#114 ŁI0013 ‡ € ĢI0014 • cmpb (š),#119 ŁI0016  € ĢI0014 ½ “ € I0014: Š Ķč#2 je I0018 ŪäĻ € Ó_pipe ‰ ™ jl I0018 Ó_fork ĄŲ,ė ĶŲö jge I0019 I0018: ‡ € š I0019: ĶŲö ŁI001E Ą-10(ń),#_pids I00113: Ķ-10(ń),#_pids+40 jae I00110 Ąå-10(ń) ĶĒö je I00111 Ąä-10(ń) ×į_pids  cwd išv ķ € Ó_close ‰ I00111: Ä-10(ń),#2 š3 I00110: Ąåļ sal ā1 ŪäĻ Äåė ĮĒ Ó_close ‰ ‡ or čļ Ł1f Üė 1: Ėęķ or čļ Ł1f Üķ 1: Ąåķ sal ā1 ŪęĻ Äåķ € ĮĒ Ó_dup2 ‰ ‰ ‡ or čļ Ł1f Üė 1: » sal ā1 ŪäĻ Äåė ĮĒ Ó_close pop bx xor äė € ˆ Ąį_3 € Ąį_2 € Ąį_1 € Ó_execl Äņ,#10 27 € Ó_exit ‰ I001E: Ąåļ sal ā1 ŪäĻ Äåė ĄåĒ sal ā1 ĄäŲ Ą_pidsĒ,ė ‡ or čļ Ł1f Üė 1: » sal ā1 ŪäĻ Äåė ĮĒ Ó_close ‰ Ąåļ sal ā1 ŪäĻ Äåė Įš ĮĒ Ó_fdopen ‰ ‰ € Ÿ  Ģ.ds É_pclose _pclose: ƒ ‚ ×ņ,#10 Įļ Įš ’ ĄčĒ  € “ € Ó_ļgnal ‰ ‰ ĄŲ,ė  € Ąį3 € Ó_ļgnal ‰ ‰ Ą-10(ń),ė ˆ Ó_fclose ‰ I0023: ŪäĻ € Ó_wait ‰ Ąéė Ķé#-1 je I0022 Ąåļ sal ā1 Ķ_pidsĒ,š ŁI0023 I0022: Ķé#-1 ŁI0029 ĄĻ,#-1 I0029: ĮŲ “ € Ó_ļgnal ‰ ‰ Į-10(ń) Ąax,#3 push ax Ó_ļgnal ‰ ‰ Ąåļ sal ā1 Ą_pidsĒö £ Ģ.ds ³ _pids: .zerow 40/2 ® _1: Ā25135 Ā28265 Ā29487 Ā104 _2: Ā26739 ø _3: Ā25389 .word 0 .text scanf.s—#,ü€Č_scanf Č__doscanf Č_sscanf Č_fscanf É_scanf † _scanf: ƒ ‚ ŪäĪ € ˆ Į__io_table ‡ € Ó__doscanf Äņ,#8 Ģ.c É_fscanf _fscanf: ƒ ‚ ŪäŌ € “ ˆ ‡ € Ó__doscanf Äņ,#8 Ģ.c É_sscanf _sscanf: ƒ ‚ ŪäŌ € “ ˆ  € Ó__doscanf Äņ,#8 Ģ.c _rnc: ƒ ‚ Ķ_rnc_codeö je I0043 Ąå_rnc_arg Ü_rnc_arg Œ ‹ Ą_ic,ė Ķ_icö ŁI0044 Ą_ic,#-1 ĢI0044 I0043: Į_rnc_arg Ó_fgetc ‰ Ą_ic,ė I0044: Ģ.c _ugc: ƒ ‚ Ķ_rnc_codeö je I0053 ó_rnc_arg ĢI0054 I0053: Į_rnc_arg Į_ic Ó_ungetc ‰ ‰ I0054: Ģ.c _scnindex: ƒ ‚ Įļ ĄčĪ I0063: Ąåļ Üļ Œ ‹ € Źal,Å ‹ Ćķ Ķęė je I0062 cmpb (si),#0 jne I0063 ‡ € ĢI0061 I0062:  € I0061:  Ģ.s _iswhite: ƒ ‚ Įļ ĄčÅ Ķč#32 je I0074 Ķč#9 je I0074 Ķč#10 je I0074 Ķč#13 ŁI0073 I0074:  € ĢI0071 I0073: ‡ € I0071:  Ģ.s _isšgit: ƒ ‚ ĶÅ,#48 jl I0083 ĶÅ,#57 jg I0083  € ĢI0081 I0083: ‡ € I0081:  Ģ.c _tolower: ƒ ‚ Įļ ĄčÅ Ķč#65 jl I0093 Ķč#90 jg I0093 Äč#32 I0093: Ąäļ Ģ.s É__doscanf __doscanf: ƒ ‚ ×ņ,#24 Įļ ĄčŌ Įš Ąé10(ń) ® _1: ĀI00A30 Ā7 Ā91 ĀI00A8B Ā99 ĀI00A64 Ā100 ĀI00A34 Ā111 ĀI00A31 Ā115 ĀI00A76 Ā117 ĀI00A34 Ā120 ĀI00A35 † ¼ ĄęĪ Ą_rnc_arg,ķ ĄęÅ Ą_rnc_code,ķ Ó_rnc Ķ_ic,#-1 ŁI00AA ĄĘ,#-1 ĢI00A5 I00AA: movb al,(ļ) ‹ € Ó_iswhite ‰ ™ je I00A9 Üļ ĢI00AA I00A9: cmpb (ļ)ö ŁI00AD ĢI00AF I00AD: Ķ_icö jge I00A11 ĢI00A5 I00A11: cmpb (ļ),#37 je I00A14 I00A17: Į_ic Ó_iswhite ‰ ™ je I00A16 Ó_rnc ĢI00A17 I00A16: Źal,(ļ) ‹ Ķ_ic,ė je I00A1A ĢI00AF I00A1A: Üļ Ó_rnc ĢI00AA I00A14: Üļ Ą-12(ń),#1 cmpb (ļ),#42 ŁI00A1D Üļ Ą-12(ń)ö I00A1D: Źal,(ļ) ‹ € Ó_isšgit ‰ ™ je I00A20 Ą-1Ī,#1 Ą-1Åö I00A25: Źal,(ļ) ‹ € Ó_isšgit ‰ ™ je I00A21 Ąåļ Üļ Œ ‹ € 0 mul -1Å Ćķ Äęė ×ć48 Ą-1Å,ķ ĢI00A25 I00A20: Ą-1Īö I00A21: Źal,(ļ) ‹ € Ó_tolower ‰ Ėęķ Ķį108 Ł1f Üķ 1: Ą-1Ō,ķ Ķ-1Ōö je I00A27 Üļ I00A27: cmpb (ļ),#99 je I00A2A I00A2D: Į_ic Ó_iswhite ‰ ™ je I00A2A Ó_rnc ĢI00A2D I00A2A: Ą-20(bp),#0 movb al,(ļ) ‹ € ĢI00A2F I00A31: ĄĻ,#8 ĢI00A32 I00A34: ĄĻ,#10 ĢI00A32 I00A35: ĄĻ,Ń Ķ-1Īö je I00A39 Ķ-1Å,#2 jb I00A32 I00A39: Ķ_ic,#48 ŁI00A32 Ó_rnc Į_ic Ó_tolower ‰ Ķį120 ŁI00A3C Ąä-1Å ×į2 Ą-1Å,ė Ą-20(ń),#1 Ó_rnc ĢI00A32 I00A3C: Ó_ugc Ą_ic,#48 I00A32: ĄŲö ĄŠö Ą-10(ń)ö Ķ-1Īö ŁI00A3F Ą-1Å,#65535 I00A3F: Ķ-1Åö je I00A42 Ķ_ic,#43 ŁI00A42 Ó_rnc ĢI00A4A I00A42: Ķ-1Åö je I00A4A Ķ_ic,#45 ŁI00A4A Ą-10(ń),#1 Ó_rnc I00A4A: Ąä-1Å Ąęė ×ć1 Ą-1Å,ķ ™ je I00A49 Į_ic Ó_isšgit ‰ ™ je I00A4D Ąę_ic ×ć48 ĶĻ,ķ jle I00A4D Ąę_ic ×ć48 Ą_ic,ķ ĢI00A4E I00A4D: ĶĻ,Ń ŁI00A49 Į_ic Ó_tolower ‰ Ķį97 jl I00A49 Į_ic Ó_tolower ‰ Ķį102 jg I00A49 Į_ic Ó_tolower ‰ add ax,#-87 Ą_ic,ė I00A4E: £ cwd œ € ĄäŲ ĄēŠ Ó.mli4 œ € Ąä_ic cwd Ćķ ‰ Äęė adc åī ĄŲ,ķ ĄŠ,ģ Ó_rnc Ą-20(ń),#1 ĢI00A4A I00A49: Ķ-12(ń)ö je I00A56 Ķ-10(ń)ö je I00A59 ōŲ ōŠ sbb Šö I00A59: Ķ-1Ōö je I00A5C Ąåš Äé#2 ĄåĒ ĄäŲ ĄęŠ ° Ą2Ē,ķ ĢI00A56 I00A5C: Ąåš Äé#2 ĄåĒ ĄäŲ ° I00A56: Ķ-20(ń)ö je I00AF Ķ-12(ń)ö je I00A30 ÜĘ ĢI00A30 I00A64: Ķ-1Īö ŁI00A69 Ą-1Å,#1 I00A69: Ąä-1Å Ąęė ×ć1 Ą-1Å,ķ ™ je I00A68 Ķ_icö jl I00A68 Ķ-12(ń)ö je I00A6D Į_ic Į(š) Ü(š) ‰  ŗ I00A6D: Ó_rnc Ą-20(ń),#1 ĢI00A69 I00A68: Ķ-12(ń)ö je I00A70 Äé#2 I00A70: Ķ-20(ń)ö je I00A30 Ķ-12(ń)ö je I00A30 ÜĘ ĢI00A30 I00A76: Ķ-1Īö ŁI00A7B mov -14(ń),#65535 I00A7B: Ąä-1Å Ąęė ×ć1 Ą-1Å,ķ ™ je I00A7A Į_ic Ó_iswhite ‰ ™ ŁI00A7A Ķ_icö jle I00A7A Ķ-12(ń)ö je I00A80 Į_ic Į(š) Ü(š) ‰  ŗ I00A80: Ó_rnc Ą-20(ń),#1 ĢI00A7B I00A7A: Ķ-12(ń)ö je I00A83 Ąåš Äé#2 ĄåĒ ŹĒö I00A83: Ķ-20(ń)ö je I00AF Ķ-12(ń)ö je I00A30 ÜĘ ĢI00A30 I00A8B: Ķ-1Īö ŁI00A8D Ą-1Å,#65535 I00A8D: Üļ cmpb (ļ),#94 ŁI00A90 Ą-22(ń),#1 Üļ ĢI00A91 I00A90: Ą-22(ń)ö I00A91: Ą-2Å,ļ I00A93: Ąå-2Å cmpb Ē,#93 je I00A92 Ąå-2Å cmpb Ēö je I00A92 Ü-2Å ĢI00A93 I00A92: Ąå-2Å cmpb Ēö ŁI00A97 ĢI00A5 I00A97: Ąå-2Å ŹĒö I00A9A: Ąä-1Å Ąęė ×ć1 Ą-1Å,ķ ™ je I00A99 Į_ic Ó_iswhite ‰ ™ ŁI00A99 Ķ_icö jle I00A99 Įļ Į_ic Ó_scnindex ‰ ‰ xor ax,-22(bp) ™ je I00A99 Ķ-12(ń)ö je I00AA0 Į_ic Į(š) Ü(š) ‰  ŗ I00AA0: Ó_rnc Ą-20(ń),#1 ĢI00A9A I00A99: Ąč-2Å Ź(ļ),#93 Ķ-12(ń)ö je I00AA3 Ąåš Äé#2 ĄåĒ ŹĒö I00AA3: Ķ-20(ń)ö je I00AF Ķ-12(ń)ö je I00A30 ÜĘ ĢI00A30 I00A2F: Ąā_1  Ģ.csb2 I00A30: Üļ ĢI00AA I00AF: Ķ_icö jl I00A5 Ó_ugc I00A5: — Ģ.ds ³ _rnc_code: .zerow 2/2 _rnc_arg: .zerow 2/2 _ic: .zerow 2/2 .text Čsystem.s—#vż€JČ_system É_system † _system: ƒ ‚ ×ņ,#6 Įļ Įš Ó_fork Ąčė or čļ ŁI0013 ‡ € ˆ Ąį_3 € Ąį_2 € Ąį_1 € Ó_execl Äņ,#10 27 € Ó_exit ‰ • or čļ jge I0019  € Ó_exit ‰ I0019: ŪäĘ € Ó_wait ‰ Ąéė Ķčš je I0018 Ķé#-1 je I0018 ĢI0019 I0018: Ķé#-1 ŁI001D ĄĘ,#-1 I001D: — Ģ.ds ® _1: Ā25135 Ā28265 Ā29487 Ā104 _2: Ā26739 ø _3: Ā25389 .word 0 .text fgets.s—#a÷€½Č_fgets É_fgets † _fgets: ƒ ‚ € € Įļ Įš ĄčÅ • ĄäĪ ×į1 ĄĪ,ė ĶĪö jbe I0012 ĮŌ Ó_fgetc ‰ Ąéė Ķé#-1 ± Ąäš Ź(ļ),al Üļ Ķé#10 ŁI0013   Ķé#-1 ŁI001A ĶÅ,ļ ŁI001A ‡ € š I001A: Ź(ļ)ö ˆ Ÿ  jmp .dsret Čfprintf.s—#÷€Č_fprintf Č_printf É_fprintf † _fprintf: ƒ ‚ Įļ ĄčÅ ŪäŌ € “ Įļ Ó__doprintf ¤ testb 4(ļ),#64 je I0013 Įļ Ó_fflush ‰ • Ģ.s É_printf _printf: ƒ ‚ ŪäĪ € ˆ Į__io_table+2 Ó__doprintf ¤ Ąå__io_table+2 testb 4Ē,#64 je I0023 Į__io_table+2 Ó_fflush ‰ I0023: jmp .cret Čputs.s.s—#mū€zČ_puts É_puts † _puts: ƒ ‚ € Į__io_table+2 ˆ Ó_fputs ‰ ‰ Ź-1(ń),al Į__io_table+2 0 € Ó_fputc ‰ ‰ Źal,-1(ń) cbw jmp .cret fputs.ss—#£÷€\Č_fputs É_fputs † _fputs: ƒ ‚ Įļ ĄčÅ • cmpb (ļ)ö ± Ąåļ Üļ Œ ‹ “ € Ó_fputc ‰ ‰ ­   jmp .sret fread.ss—#®÷€ŪČ_fread É_fread † _fread: ƒ ‚ ×ņ,#6 Įļ Įš Ėéš ĶĪö je I0013 ½ ĶŌ,š jbe I0013 ĄäĪ ĄŠ,ė I001A: Į10(ń) Ó_fgetc ‰ Ąčė Ķč#-1 je I001C ’ Ąäļ ŗ ÜÅ ĢI0019 I001C: Įš š I0019: ĄäŠ ×į1 ĄŠ,ė ĶŠö ŁI001A Üš ĢI0016 • Įš Ÿ  jmp .dsret Čfreopen.s—#·÷€eČ_freopen É_freopen † _freopen: ƒ ‚ ĮŌ Ó_fclose ‰ ™ je I0013 ‡ € š • “ ˆ Ó_fopen ‰ ‰ € Ÿ  jmp .cret Čfclose.s—#+÷€HČ_fclose É_fclose † _fclose: ƒ ‚ € Įļ Įš ĄéÅ Ėčļ I0015: Ķč#20 jge I0012 Ąåļ sal ā1 Ķ__io_tableĒ,š ŁI0013 Ąåļ sal ā1 Ą__io_tableĒö ĢI0012 • Üļ ĢI0015   Ķč#20 jl I001A Ąį-1 € š I001A: Įš Ó_fflush ‰ Į(š) Ó_close ‰ testb 4(š),#32 je I001D Ķ6(š)ö je I001D Į6(š) Ó_free ‰ I001D: Ķč#2 jle I00111 Įš Ó_free ‰ I00111: ‡ € Ÿ  jmp .dsret fopen.s—#u÷€ėČ_fopen É_fopen † _fopen: ƒ ‚ ×ņ,#8 Įļ Įš ® _1: ĀI0011B Ā3 Ā97 ĀI001F Ā114 ĀI00117 Ā119 ĀI001B † ĄŲö Ėéš I0015: Ąåš sal ā1 Ķ__io_tableĒö ± Ķé#20 jl I0013 ‡ € š • Üš ĢI0015   Æ Œ ‹ € ĢI0019 I001B: or Ų,#2 Ąį438 € ˆ Ó_creat ‰ ‰ ĄŠ,ė ĶŠö jge I001A ‡ € š I001F: or Ų,#2  € ˆ Ó_open ‰ ‰ ĄŠ,ė ĶŠö jge I00111 Ķ_errno,#2 ŁI00113 Ąį438 € ˆ Ó_creat ‰ ‰ ĄŠ,ė ĶŠö jge I00111 I00113: ‡ € š I00111: “ € ‡ € € ĮŠ Ó_lseek Äņ,#8 ĢI001A I00117: or Ų,#1 ‡ € ˆ Ó_open ‰ ‰ ĄŠ,ė ĶŠ,#0 jge I001A ‡ € š I0011B: ‡ € š I0019: Ąā_1  Ģ.csb2 I001A: 0 € Ó_malloc ‰ Ąčė or čļ ŁI0011D ‡ € š I0011D: Ą2(ļ)ö ĄäŠ Ą(ļ),ė ĄäŲ Ą4(ļ),ė 024 € Ó_malloc ‰ Ą6(ļ),ė Ķ6(ļ)ö ŁI00120 or 4(ļ),#4 ĢI00121 I00120: or 4(ļ),#32 I00121: Ąä6(ļ) Ą8(ļ),ė Ąåš sal ā1 Ą__io_tableĒ,ļ Įļ Ÿ  jmp .dsret Čfseek.s—#Ę÷€Č_fseek É_fseek † _fseek: ƒ ‚ ×ņ,#10 Įļ ĄčÅ Įš ĄŠ,#65535 ĄĻ,#-1 Ö4(ļ),#-25 testb 4(ļ),#1 je I0013 Ķ10(ń),#2 jge I0016 Ķ6(ļ)ö je I0016 testb 4(ļ),#4 ŁI0016 Ąé2(ļ) ĄäĪ ĄęŌ ĄŠ,ė ĄĻ,ķ Ķ10(ń)ö ŁI001B  € ‡ € € Į(ļ) Ó_lseek Äņ,#8 Ą-10(ń),ė ĄŲ,ī Ąäš cwd ×ä-10(ń) sbb ēŲ ÄäŠ adc ēĻ ĄŠ,ė ĄĻ,ī ĢI001C I001B: Ąäš cwd ĄęĪ › ×ęė sbb åī ĄĪ,ķ ĄŌ,ģ I001C: or éš jle I001E Ąäš cwd ¹ ĮŠ œ € Ó.cmi4 ™ jg I001E Ąä6(ļ) cwd ¹ ĮŠ œ € Ąä8(ļ) cwd Ćķ ‰ ×ęė sbb åī ¦ Įķ Ó.cmi4 ™ jl I001E ĄåŠ Äå8(ļ) Ą8(ļ),ģ Ąä2(ļ) ×äŠ Ą2(ļ),ė ‡ € š I001E: cmp 10(ń),#1 ŁI0016 Ąäš cwd ÄäĪ adc ēŌ ĄĪ,ė ĄŌ,ī ½ Į10(ń) ĮŌ “ Į(ļ) Ó_lseek Äņ,#8 ĄŠ,ė ĄĻ,ī Ą2(ļ)ö ĢI0014 • testb 4(ļ),#2 je I0014 Įļ Ó_fflush ‰ Į10(ń) ĮŌ “ Į(ļ) Ó_lseek Äņ,#8 ĄŠ,ė ĄĻ,ī I0014: ĶŠ,#65535 ŁI00119 ĶĻ,#-1 ŁI00119 Ąį-1 € š I00119: ‡ € Ÿ  jmp .dsret ftell.s—#ß÷€BČ_ftell É_ftell † _ftell: ƒ ‚ ×ņ,#6 Įļ ĄčÅ Įš Ėéš testb 4(ļ),#1 je I0013 Ąäš ×ä2(ļ) Ąéė ĢI0014 • testb 4(ļ),#2 je I0016 Ķ6(ļ)ö je I0016 testb 4(ļ),#4 ŁI0016 Ąä8(ļ) ×ä6(ļ) Ąéė ĢI0014 ½ Ąį-1 € Ąį65535 € š I0014:  € ‡ € € Į(ļ) Ó_lseek Äņ,#8 ¬ ĄĘ,ī ĶĘö jge I001B ” ¹ š I001B: Ąäš cwd ÄäĻ adc ēĘ ¬ ĄĘ,ī ” ¹ Ÿ  Ćdx jmp .dsret fwrite.s—#é÷€ÕČ_fwrite É_fwrite † _fwrite: ƒ ‚ € € Įļ Įš Ėčļ ĶĪö je I0013 ½ ĶŌ,ļ jbe I0013 ĄéĪ I001A: ’ ÜÅ Œ ‹ Į10(ń) € Ó_fputc ‰ ‰ Ąå10(ń) testb 4Ē,Ń je I0019 Įļ š I0019: Ąäš ×į1 Ąéė or éš ŁI001A Üļ ĢI0016 • Įļ Ÿ  jmp .dsret Čgets.ss—#£ł€™Č_gets É_gets † _gets: ƒ ‚ € € Įļ Įš ĄčÅ • Į__io_table Ó_fgetc ‰ Ąéė Ķé#-1 ± Ķé#10 ± Ąäš Ź(ļ),al Üļ ­   Ķé#-1 ŁI0017 ‡ € š I0017: Ź(ļ)ö ˆ Ÿ  jmp .dsret Čprintdat.s—#*ū€\Č__io_table Č___stšn Č__stderr Č___stdout Č__stdout Č__stšn É__stšn ® __stšn: ø ø Ā1 Ā___stšn Ā___stšn É__stdout __stdout: Ā1 ø Ā66 Ā___stdout Ā___stdout É__stderr __stderr: Ā2 ø Ā6 ø É__io_table ø __io_table: Ā__stšn Ā__stdout Ā__stderr ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø ø É___stdout ø ³ ___stdout: .zerow 1024/2 É___stšn ___stšn: .zerow 1024/2 .text setbuf.ss—#6ü€»Č_setbuf É_setbuf † _setbuf: ƒ ‚ Įļ ĄčÅ Ķ6(ļ)ö je I0013 testb 4(ļ),#32 je I0013 Į6(ļ) Ó_free ‰ • Ö4(ļ),#-101 ĄäĪ Ą6(ļ),ė Ķ6(ļ)ö ŁI0017 or 4(ļ),#4 I0017: Ąä6(ļ) Ą8(ļ),ė Ą2(ļ),#0 jmp .sret Čctime.ss—#›ö€ Č_localtime Č_ctime Č_gmtime ® _days_per_month: Ā31 Ā28 Ā31 Ā30 Ā31 Ā30 Ā31 Ā31 Ā30 Ā31 Ā30 Ā31 _months: Ā_1 Ā_2 Ā_3 Ā_4 Ā_5 Ā_6 Ā_7 Ā_8 Ā_9 Ā_10 Ā_11 Ā_12 _days: Ā_13 Ā_14 Ā_15 Ā_16 Ā_17 Ā_18 Ā_19 É_ctime † _ctime: ƒ ‚ ×ņ,#8 ’ « Ąę2Ē ¬ ĄĘ,ķ Ą_tm+10ö Ą_tm+8ö Ą_tm+6,#1 Ą_tm+4ö Ą_tm+2ö Ą_tmö ” ¹  € “0864 € Ó.dvi4 Äį4 adc ē#0 Ąć7 cwd išv ķ Ą_tm+12,ī • Ąć4 Ąä_tm+10 cwd išv ķ ” ¹ Ķē#2 ŁI0016 Ąį482 € Ąį34048 € ĢI0017 ½ Ąį481 € 3184 € I0017: ĆŲ ĆŠ ĮŠ ĮŲ Ó.cmi4 ™ jl I0012 Ü_tm+10 £ Ącx,-2(bp) sub äŲ sbb ęŠ ¬ ĄĘ,ķ ­   Ä_tm+10,#1970 ” ¹  € “0864 € Ó.dvi4 Ą_tm+14,ė Ą_days_per_month+2,#28 Ąć4 Ąä_tm+10 cwd išv ķ or ēī ŁI001C Ü_days_per_month+2 I001C: Ąå_tm+8 sal ā1 Ąä_days_per_monthĒ cwd ” ¹ œ € “0864 Ąē#1 Ó.mli4 œ € Ó.cmi4 ™ jl I001F Ąę_tm+8 Ü_tm+8 Ąåķ sal ā1 Ąä_days_per_monthĒ cwd ” ¹ œ € “0864 Ąē#1 Ó.mli4 Ćķ ‰ ×ęė sbb åī ĄĻ,ķ ĄĘ,ģ ĢI001C I001F: ” ¹  € “0864 € Ó.cmi4 ™ jl I00112 £ ĄęĘ ×į20864 sbb ć1 ¬ ĄĘ,ķ Ü_tm+6 ĢI001F I00112: ” ¹ ‡ € Ąį3600 € Ó.cmi4 ™ jl I00115 £ ĄęĘ sub ax,#3600 sbb ć0 ¬ ĄĘ,ķ Ü_tm+4 š2 I00115: ” ¹ ‡ € Ąį60 € Ó.cmi4 ™ jl I00114 £ ĄęĘ ×į60 sbb ć0 ¬ ĄĘ,ķ Ü_tm+2 š5 I00114: ĄęĻ Ą_tm,ķ Ąå_tm+8 sal ā1 Į_tm+10 Į_tm Į_tm+2 Į_tm+4 Į_tm+6 Į_monthsĒ Ąå_tm+12 sal ā1 Į_daysĒ Ąį_20 € Ąį_buf € Ó_ņrintf Äņ,#18 Ąį_buf Ģ.c É_localtime _localtime: ƒ ‚ ˆ Ó_ctime ‰ Ąį_tm Ģ.c É_gmtime _gmtime: ƒ ‚ ˆ Ó_ctime ‰ Ąį_tm Ģ.c ³ _buf: .zerow 26/2 _tm: .zerow 18/2 ® _1: Ā24906 Ā110 _2: Ā25926 Ā98 _3: Ā24909 Ā114 _4: Ā28737 Ā114 _5: Ā24909 Ā121 _6: Ā30026 Ā110 _7: Ā30026 Ā108 _8: Ā30017 Ā103 _9: Ā25939 Ā112 _10: Ā25423 Ā116 _11: .word 28494 Ā118 _12: Ā25924 Ā99 _13: Ā30035 Ā110 _14: Ā28493 Ā110 _15: Ā30036 Ā101 _16: Ā25943 Ā100 _17: Ā26708 Ā117 _18: Ā29254 Ā105 _19: Ā24915 Ā116 _20: Ā29477 Ā9504 Ā8307 Ā12837 Ā8292 Ā12325 Ā25650 Ā9530 Ā12848 Ā14948 Ā12325 Ā25650 Ā9504 Ā2660 .word 0 .text Čfdopen.ss—#7÷€(Č_fdopen É_fdopen † _fdopen: ƒ ‚ ×ņ,#6 Įļ Įš ® _1: ĀI001E Ā3 Ā97 ĀI001C Ā114 ĀI001D Ā119 ĀI001B † ĄŠö Ėéš I0015: Ąåš sal ā1 Ķ__io_tableĒö ± Ķé#20 jl I0013 ‡ € š • Üš ĢI0015   Æ Œ ‹ € ĢI0019 I001B: or Š,#2 ĢI001A I001C: or Š,#2 “ € ‡ € € ˆ Ó_lseek Äņ,#8 ĢI001A I001D: or Š,#1 ĢI001A I001E: ‡ € š I0019: Ąā_1  Ģ.csb2 I001A: 0 € Ó_malloc ‰ Ąčė or čļ ŁI00110 ‡ € š I00110: Ą2(ļ)ö ¢ Ą(ļ),ė ĄäŠ Ą4(ļ),ė 024 € Ó_malloc ‰ Ą6(ļ),ė Ķ6(ļ)ö ŁI00113 or 4(ļ),#4 š4 I00113: or 4(ļ),#32 I00114: Ąä6(ļ) Ą8(ļ),ė Ąåš sal ā1 Ą__io_tableĒ,si push si I0011:  jmp .dsret getgrent.s—#eł€čČ_endgrent Č_getgrnam Č_getgrgid Č_setgrent Č_getgrent ® __gr_file: Ā25903 Ā25460 Ā26415 Ā28530 Ā28789 ø __gfd: É_setgrent Ā-1 † _setgrent: ƒ ‚ Ķ__gfdö jl I0013 ‡ € € € Į__gfd Ó_lseek Äņ,#8 ĢI0014 • ‡ € Ąį__gr_file € Ó_open ‰ ‰ Ą__gfd,ė I0014: Ą__bufcntö Ąä__gfd Ģ.c É_endgrent _endgrent: ƒ ‚ Ķ__gfdö jl I0023 Į__gfd Ó_close ‰ I0023: Ą__gfd,#-1 Ą__bufcntö Ģ.c _getline: ƒ ‚ Ķ__gfdö jge I0033 Ó_setgrent ™ jge I0033 ‡ € ĢI0031 I0033: Ą__buf,#__grbuf I0038: ó__bufcnt jg I003A 024 € Ąį__buffer € Į__gfd Ó_read ¤ Ą__bufcnt,ė Ķ__bufcntö jg I003D ‡ € ĢI0031 I003D: Ą__pnt,#__buffer I003A: Ąå__pnt Ü__pnt ‡ movb al,(bx) push ė Ąå__buf  ŗ Ü__buf Ąå__pnt cmpb Ē,#10 ŁI0038 Ü__pnt ó__bufcnt Ąå__buf ŹĒö Ą__buf,#__grbuf  € I0031:  Ģ.c _skip_period: ƒ ‚ I0043: Ąå__buf cmpb Ēö je I0042 Ąå__buf cmpb Ē,#58 je I0042 Ü__buf ĢI0043 I0042: Ąå__buf ŹĒö Ü__buf Ģ.c É_getgrent _getgrent: ƒ ‚ Ó_getline ™ ŁI0053 ‡ € ĢI0051 I0053: Ąę__buf Ą_grp,ķ Ó_skip_period Ąę__buf Ą_grp+2,ķ Ó_skip_period Į__buf Ó_atoi ‰ Ą_grp+4,ė Ó_skip_period Ąį_grp € I0051:  Ģ.c É_getgrnam _getgrnam: ƒ ‚ € Įļ Ó_setgrent I0063: Ó_getgrent Ąčė or čļ je I0062 ˆ Į(ļ) Ó_strcmp ‰ ‰ ™ ŁI0063 I0062: Ó_endgrent or čļ je I0069 Įļ ĢI0061 I0069: ‡ € I0061:  Ģ.s É_getgrgid _getgrgid: ƒ ‚ € Įļ Ó_setgrent I0073: Ó_getgrent Ąčė or čļ je I0072 ¢ Ķ4(ļ),ė ŁI0073 I0072: Ó_endgrent or čļ je I0079 Įļ ĢI0071 I0079: ‡ € I0071:  Ģ.s ³ _grp: .zerow 6/2 __bufcnt: .zerow 2/2 __buf: .zerow 2/2 __pnt: .zerow 2/2 __buffer: .zerow 1024/2 __grbuf: .zerow 256/2 .text sprintf.s—#yü€˜Č_ņrintf É_ņrintf † _ņrintf: ƒ ‚ ×ņ,#10 Įļ ĄčÅ Ą-10(ń),#-1 ĄŠ,#130 ĄĻ,ļ ĄĘ,ļ ŪäŌ € “ Ūä-10(ń) € Ó__doprintf ¤ Ūä-10(ń) € ‡ € Ó_fputc ‰ ‰ Ąäsi jmp .sret doprintf.s—#Īö€W Č__doprintf † __itoa: ƒ ‚ € € Įļ Įš ’ Äā11 Ąčģ I0014: ĄäĪ Ėēī šv Ō Ąéī Äé#48 Ķé#57 jle I0016 Äé#7 ½ óļ Ąäš Ź(ļ),al ĄäĪ Ėēī šv Ō ĄĪ,ė ĶĪö ŁI0014 ’ ×åļ Äā11 Ąéģ I001A: Ąåļ Üļ ‡ Œ € ’  ŗ ÜÅ óš or éš ŁI001A ¢ Ģ.ds _ltoa: ƒ ‚ € € Įļ Įš ’ Äā11 Ąčģ I0024: Ąä10(ń) cwd ĮŌ “ œ € Ó.rmu4 Ąéė Äé#48 Ķé#57 jle I0026 Äé#7 I0026: óļ Ąäš Ź(ļ),al Ąä10(ń) cwd ĮŌ “ œ € Ó.dvu4 ĄĪ,ė ĄŌ,ī ĮŌ “ ‡ € € Ó.cmu4 ™ ŁI0024 ’ ×åļ Äā11 Ąéģ I002A: Ąåļ Üļ ‡ movb al,Ē € ’  ŗ ÜÅ óš or éš ŁI002A ¢ Ģ.ds É__doprintf __doprintf: ƒ ‚ ×ņ,#36 Įļ Įš ® _2: ĀI00359 Ā13 Ā68 ĀI0033E Ā79 ĀI00339 Ā85 ĀI00337 Ā88 ĀI00334 Ā99 ĀI0034C Ā100 ĀI0033F Ā101 ĀI0034B Ā102 ĀI0034B Ā103 ĀI0034B Ā111 ĀI0033A Ā115 ĀI0034D Ā117 ĀI00338 Ā120 ĀI00335 † I0035: Æ ÜĪ Œ ‹ Ąéė or éš ŁI0037 Ģ.ds I0037: Ķé#37 je I003A ˆ Įš Ó_fputc ‰ ‰ ĢI0035 I003A: Ūä-12(ń) Ąčė Ūä-12(ń) Ą-1Ī,ė Ą-2Ōö Æ cmpb Ē,#45 ŁI003D ÜĪ Ü-2Ō I003D: Ą-30(ń),#32 Æ cmpb Ē,#48 ŁI00310 ÜĪ Ą-30(ń),#48 I00310: Ą-22(ń)ö I00315: Æ ÜĪ Œ ‹ Ąéė Ķé#48 jl I00317 cmp di,#57 jg I00317 ×é#48 ĢI00318 I00317: Ķé#42 ŁI00312 › ÄŌ,#2 ĄéĒ I00318: 0 mul -22(ń) Ą-22(ń),ė Ä-22(ń),š ĢI00315 I00312: Ą-2Īö Ą-2Åö Ķé#46 ŁI0031E I00323: Æ ÜĪ Œ ‹ Ąéė Ķé#48 jl I00325 Ķé#57 jg I00325 ×é#48 ĢI00326 I00325: Ķé#42 ŁI0031E › ÄŌ,#2 ĄéĒ I00326: 0 mul -2Å Ą-2Å,ė Ä-2Å,š Ü-2Ī ĢI00323 I0031E: Ą-32(ń)ö Ķé#108 je I0032B Ķé#76 ŁI0032C I0032B: Ü-32(ń) Æ cmpb Ēö je I0032C Æ ÜĪ Œ ‹ Ąéė I0032C: Įš ĢI00332 I00334: Ü-32(ń) I00335: ĄéŃ ĢI00336 I00337: Ü-32(ń) I00338: Ąé#10 ĢI00336 I00339: Ü-32(ń) I0033A: Ąé#8 I00336: Ķ-32(ń)ö je I0033C › ÄŌ,#4 Įš Į2Ē ĮĒ Įļ Ó_ltoa Äņ,#8 Ąčė ĢI00333 I0033C: › ÄŌ,#2 push di push Ē Įļ Ó__itoa ¤ Ąčė ĢI00333 I0033E: Ü-32(ń) I0033F: Ķ-32(ń)ö je I00341 › ÄŌ,#4 « Ąę2Ē Ą-3Ī,ė Ą-3Å,ķ Ķ-3Åö jge I00344 Ź(ļ),#45 Üļ ō-3Ī ō-3Å sbb -3Åö I00344: 0 € Į-3Å Į-3Ī Įļ Ó_ltoa Äņ,#8 Ąčė ĢI00333 I00341: › ÄŌ,#2 « Ą-20(ń),ė Ķ-20(ń)ö jge I00347 Ź(ļ),#45 Üļ ō-20(ń) I00347: 0 € Į-20(ń) Įļ Ó__itoa ¤ Ąčė ĢI00333 I0034B: Ą-30(ń),#32 Ź(ļ),#63 Üļ ĢI00333 I0034C: Ą-30(ń),#32 › ÄŌ,#2 « Ź(ļ),al Üļ ĢI00333 I0034D: Ą-30(ń),#32 › ÄŌ,#2 « Ą-1Ī,ė Ķ-1Īö ŁI0034F Ą-1Ī,#_1 I0034F: Ķ-2Åö ŁI00352 Ą-2Å,#32767 I00352: Ąč-1Ī I00357: cmpb (ļ)ö je I00333 ó-2Å jl I00333 Üļ ĢI00357 I00359: mov ax,š Ź(ļ),al Üļ ĢI00333 I00332: Ąā_2  Ģ.csb2 I00333: Ąäļ ×ä-1Ī Ą-20(ń),ė Ąä-22(ń) ×ä-20(ń) Ą-22(ń),ė Ķ-22(ń)ö jge I0035B Ą-22(ń)ö I0035B: Ķ-2Ōö ŁI0035E ō-22(ń) I0035E: Ķ-22(ń)ö jge I0036B Ąå-1Ī cmpb Ē,#45 ŁI00369 Ķ-30(ń),#48 ŁI00369 Ąå-1Ī Ü-1Ī Œ ‹ ˆ € Ó_fputc ‰ ‰ ó-20(ń) I00369: ˆ Į-30(ń) Ó_fputc ‰ ‰ Ü-22(ń) ŁI00369 I0036B: ó-20(ń) jl I0036E Ąå-1Ī Ü-1Ī Œ ‹ ˆ € Ó_fputc ‰ ‰ ĢI0036B I0036E: Ķ-22(ń)ö je I0035 ˆ Į-30(ń) Ó_fputc ‰ ‰ ó-22(ń) ĢI0036E ® _1: Ā28200 Ā27765 Ā10604 .word 0 .text Čprintk.ss—#Gū€: Č_printk † _itoa: ƒ ‚ € € Įļ Įš ’ Äā11 Ąčģ I0014: ĄäĪ Ėēī šv Ō Ąéī Äé#48 Ķé#57 jle I0016 Äé#7 ½ óļ Ąäš Ź(ļ),al ĄäĪ Ėēī šv Ō ĄĪ,ė ĶĪö ŁI0014 ’ ×åļ Äā11 Ąéģ I001A: Ąåļ Üļ ‡ Œ € ’  ŗ ÜÅ óš or éš ŁI001A ¢ Ģ.ds _ltoa: ƒ ‚ € € Įļ Įš ’ Äā11 Ąčģ I0024: Ąä10(ń) cwd ĮŌ “ œ € Ó.rmu4 Ąéė Äé#48 Ķé#57 jle I0026 Äé#7 I0026: óļ Ąäš Ź(ļ),al Ąä10(ń) cwd ĮŌ “ œ € Ó.dvu4 ĄĪ,ė ĄŌ,ī ĮŌ “ ‡ € € Ó.cmu4 ™ ŁI0024 ’ ×åļ Äā11 Ąéģ I002A: Ąåļ Üļ ‡ movb al,(bx) € ’  ŗ ÜÅ óš or éš ŁI002A ¢ Ģ.ds É_printk _printk: ƒ ‚ ×ņ,#38 Įļ Įš ® _2: ĀI00359 Ā13 Ā68 ĀI0033E Ā79 ĀI00339 Ā85 ĀI00337 Ā88 ĀI00334 Ā99 ĀI0034C Ā100 ĀI0033F Ā101 ĀI0034B Ā102 ĀI0034B Ā103 ĀI0034B Ā111 ĀI0033A Ā115 ĀI0034D Ā117 ĀI00338 Ā120 ĀI00335 † ŪäĪ Ą-1Å,ė I0035: ’ ÜÅ Œ ‹ Ąéė or éš ŁI0037 Ģ.ds I0037: Ķé#37 je I003A Įš Ó_putc ‰ ĢI0035 I003A: Ūä-12(ń) Ąčė Ūä-12(ń) Ą-1Ō,ė Ą-30(ń)ö ’ cmpb Ē,#45 ŁI003D ÜÅ Ü-30(ń) I003D: Ą-32(ń),#32 ’ cmpb Ē,#48 ŁI00310 ÜÅ Ą-32(ń),#48 I00310: Ą-2Åö I00315: ’ ÜÅ Œ ‹ Ąéė Ķé#48 jl I00317 cmp di,#57 jg I00317 ×é#48 ĢI00318 I00317: Ķé#42 ŁI00312 Ąå-1Å Ä-1Å,#2 ĄéĒ I00318: 0 mul -2Å Ą-2Å,ė Ä-2Å,š ĢI00315 I00312: Ą-2Ōö Ą-2Īö Ķé#46 ŁI0031E I00323: ’ ÜÅ Œ ‹ Ąéė Ķé#48 jl I00325 Ķé#57 jg I00325 ×é#48 ĢI00326 I00325: Ķé#42 ŁI0031E Ąå-1Å Ä-1Å,#2 ĄéĒ I00326: 0 mul -2Ī Ą-2Ī,ė Ä-2Ī,š Ü-2Ō ĢI00323 I0031E: Ą-3Åö Ķé#108 je I0032B Ķé#76 ŁI0032C I0032B: Ü-3Å ’ cmpb Ēö je I0032C ’ ÜÅ Œ ‹ Ąéė I0032C: Įš ĢI00332 I00334: Ü-3Å I00335: ĄéŃ ĢI00336 I00337: Ü-3Å I00338: Ąé#10 ĢI00336 I00339: Ü-3Å I0033A: Ąé#8 I00336: Ķ-3Åö je I0033C Ąå-1Å Ä-1Å,#4 Įš Į2Ē ĮĒ Įļ Ó_ltoa Äņ,#8 Ąčė ĢI00333 I0033C: Ąå-14(bp) add -14(bp),#2 Įš ĮĒ Įļ Ó_itoa ¤ Ąčė ĢI00333 I0033E: Ü-3Å I0033F: Ķ-3Åö je I00341 Ąå-1Å Ä-1Å,#4 « Ąę2Ē Ą-3Ō,ė Ą-3Ī,ķ Ķ-3Īö jge I00344 Ź(ļ),#45 Üļ ō-3Ō ō-3Ī sbb -3Īö I00344: 0 € Į-3Ī Į-3Ō Įļ Ó_ltoa Äņ,#8 Ąčė ĢI00333 I00341: Ąå-1Å Ä-1Å,#2 « Ą-22(ń),ė Ķ-22(ń)ö jge I00347 Ź(ļ),#45 Üļ ō-22(ń) I00347: 0 € Į-22(ń) Įļ Ó_itoa ¤ Ąčė ĢI00333 I0034B: Ą-32(ń),#32 Ź(ļ),#63 Üļ ĢI00333 I0034C: Ą-32(ń),#32 Ąå-1Å Ä-1Å,#2 « Ź(ļ),al Üļ ĢI00333 I0034D: Ą-32(ń),#32 Ąå-1Å Ä-1Å,#2 « Ą-1Ō,ė Ķ-1Ōö ŁI0034F Ą-1Ō,#_1 I0034F: Ķ-2Īö ŁI00352 Ą-2Ī,#32767 I00352: Ąč-1Ō I00357: cmpb (ļ)ö je I00333 ó-2Ī jl I00333 inc ļ ĢI00357 I00359: Ąäš Ź(ļ),al Üļ ĢI00333 I00332: Ąā_2  Ģ.csb2 I00333: Ąäļ ×ä-1Ō Ą-22(ń),ė Ąä-2Å ×ä-22(ń) Ą-2Å,ė Ķ-2Åö jge I0035B Ą-2Åö I0035B: Ķ-30(ń)ö ŁI0035E ō-2Å I0035E: Ķ-2Åö jge I0036B Ąå-1Ō cmpb Ē,#45 ŁI00369 Ķ-32(ń),#48 ŁI00369 Ąå-1Ō Ü-1Ō Œ ‹ € Ó_putc ‰ ó-22(ń) I00369: Į-32(ń) Ó_putc ‰ Ü-2Å ŁI00369 I0036B: ó-22(ń) jl I0036E Ąå-1Ō Ü-1Ō Œ ‹ € Ó_putc ‰ ĢI0036B I0036E: Ķ-2Åö je I0035 Į-32(ń) Ó_putc ‰ ó-2Å ĢI0036E ® _1: Ā28200 Ā27765 Ā10604 .word 0 .text putc.sss—#dū€Č_fputc É_fputc † _fputc: ƒ ‚ € € Įļ ĄčĪ Įš Ėéš testb 4(ļ),#24 je I0013 Ąį-1 € š • testb 4(ļ),#2 ŁI0016 Ąį-1 € š ½ testb 4(ļ),#4 je I0019  € ŪäÅ € Į(ļ) Ó_write ¤ ” Ą2(ļ),#1 Üš ĢI001A I0019: Ą___cleanup,#__cleanup Ąä8(ļ) » Äā1 Ėęķ Źcl,Å Įķ Ą8(ļ),ģ »  ŗ Ąä2(ļ) Üė Ą2(ļ),ė Ķ2(ļ),#1024 jl I001A testb 4(ļ),#128 ŁI001A Į2(ļ) Į6(ļ) Į(ļ) Ó_write ¤ ” Ąä6(ļ) Ą8(ļ),ė Üš I001A: or éš je I00110 ĶĘö jle I00112 — Ķ2(ļ),ė je I00113 I00112: ĶĘö jge I00117 or 4(ļ),Ń š8 I00117: or 4(ļ),#8 I00118: Ąį-1 € š I00113: Ą2(ļ)ö I00110: ‡ € Ÿ  jmp .dsret Čungetc.ss—#ļż€ńČ_ungetc É_ungetc † _ungetc: ƒ ‚ Įļ ĄčĪ Įš ĄéÅ or éš jl I0012 testb 4(ļ),#1 ± testb 4(ļ),#4 je I0013   Ąį-1 € š • Ķ2(ļ),#1024 jl I0018 Ąį-1 € š I0018: Ąä6(ļ) Ķ8(ļ),ė ŁI001B Ü8(ļ) I001B: Ąä2(ļ) Üė Ą2(ļ),ė ó8(ļ) Ąå8(ļ) Ąäš ŗ Įš Ÿ  jmp .dsret Čgetc.sss—#ł€»Č_fgetc É_fgetc † _fgetc: ƒ ‚ € Įļ ĄčÅ testb 4(ļ),#24 je I0013 Ąį-1 € š • testb 4(ļ),#1 ŁI0016 Ąį-1 € š ½ Ķ2(ļ)ö jg I0019 testb 4(ļ),#4 je I001C  € ŪäĘ € Į(ļ) Ó_read ¤ Ą2(ļ),ė ĢI001D I001C: 024 € Į6(ļ) Į(ļ) Ó_read ¤ Ą2(ļ),ė I001D: Ķ2(ļ)ö jg I001F Ķ2(ļ)ö ŁI00112 or 4(ļ),#8 š3 I00112: or 4(ļ),Ń I00113: Ąį-1 € š I001F: Ąä6(ļ) Ą8(ļ),ė I0019: Ąä2(ļ) óė Ą2(ļ),ė testb 4(ļ),#4 je I00115 — „ € š I00115: Ąä8(ļ) » Äā1 Ą8(ļ),ģ » ‡ Œ € Ÿ  jmp .sret Čstrcmp.ss—#Äü€°Č_strcmp É_strcmp † _strcmp: ƒ ‚ Įļ ĄčÅ Įš ĄéĪ • Źal,(ļ) ‹ € Źal,(š) ‹ Ćķ Ķęė je I0016 Źal,(ļ) ‹ € Źal,(š) ‹ Ćķ ×ęė Įķ š ½ cmpb (ļ)ö ŁI0019 ‡ € š I0019: Üļ Üš ­ Ÿ  jmp .dsret access.ss—#{õ€IČ_access É_access † _access: ƒ ‚ ˆ “ Ąį33 €  € Ó_callm3 Äņ,#8 jmp .cret Čchdir.ss—#ö€CČ_chšr É_chšr † _chšr: ƒ ‚ ˆ ‡ € 2 €  € Ó_callm3 Äņ,#8 jmp .cret Čchmod.ss—#ö€DČ_chmod É_chmod † _chmod: ƒ ‚ ˆ “ 5 €  € Ó_callm3 Äņ,#8 jmp .cret chown.s—#+ö€SČ_chown É_chown † _chown: ƒ ‚ Įļ ĄčÅ ‡ € € Įļ ĮŌ “ Įļ µ ‰ € 6 €  €  ‘ jmp .sret Čchroot.s—#9ö€KČ_chroot É_chroot † _chroot: ƒ ‚ ˆ ‡ € Ąį61 €  € Ó_callm3 Äņ,#8 jmp .cret Čcreat.s—#^ö€EČ_creat É_creat † _creat: ƒ ‚ ˆ “ Ąį8 €  € Ó_callm3 Äņ,#8 jmp .cret Čdup.ss—#Ūö€?Č_dup É_dup † _dup: ƒ ‚ ‡ € € € € € ˆ Ąį41 €  €  ‘ jmp .cret Čdup2.s—#éö€OČ_dup2 É_dup2 † _dup2: ƒ ‚ ¢ Äį64 Ėęķ Įķ Įķ Įķ Įķ “ € Ąį41 €  €  ‘ jmp .cret Čexec.s—#÷€`Č_execl Čõ Č_execle Č_execn Č_execv É_execl † _execl: ƒ ‚ Į_environ ŪäĪ € ˆ Óõ ¤ Ģ.c É_execle _execle: ƒ ‚ € Įļ ŪäĪ Ąčė I0023: Ąåļ Äč#2 ĶĒö je I0022 ĢI0023 I0022: Į(ļ) ŪäĪ € ˆ Óõ ¤ Ģ.s É_execv _execv: ƒ ‚ Į_environ “ ˆ Óõ ¤ Ģ.c Éõ õ: ƒ ‚ ×ņ,#2068 Įļ Įš Ą-2062(ń)ö Ą-206Åö ĄäĪ Ą-2050(ń),ė ĄäŌ Ą-2052(ń),ė I0043: Ąå-2050(ń) Ä-2050(ń),#2 ĶĒö je I0046 Ü-2062(ń) ĢI0043 I0046: Ąå-2052(ń) Ä-2052(ń),#2 ĶĒö je I0045 Ü-206Å ĢI0046 I0045: Ąä-206Å Ää-2062(ń) sal į1 Äį6 Ūå-204Ō Äåė Ąčģ Ąå-2062(ń) Äåļ Äå-2064(bp) lea ä0(ń) Ķåė jb I0049 Ą_errno,#7 Ąį-1 € ĢI0041 I0049: Ūä-204Ō Ąéė Ąä-2062(ń) Ą(š),ė Äé#2 Ą-2060(ń)ö I004E: Ąä-2062(ń) Ķ-2060(ń),ė jge I004B Ūä-204Ō Ąęļ ×ęė Ą-206Ō,ķ Ąä-206Ō Ą(š),ė Äé#2 Æ ÄĪ,#2 « Ą-205Ō,ė I00410: Ąå-205Ō cmpb Ēö je I004F Ąå-205Ō Ü-205Ō Œ Ź(ļ),al Üļ Ūä0(ń) Ķčė jb I00410 Ą_errno,#7 Ąį-1 € ĢI0041 I004F: Ź(ļ)ö Üļ Ü-2060(ń) ĢI004E I004B: Ą(š)ö Äé#2 Ą-2060(ń)ö I00418: Ąä-206Å Ķ-2060(ń),ė jge I00415 Ūä-204Ō Ąęļ ×ęė Ą-206Ō,ķ Ąä-206Ō Ą(š),ė Äé#2 › ÄŌ,#2 « Ą-205Ō,ė I0041A: Ąå-205Ō cmpb Ēö je I00419 Ąå-205Ō Ü-205Ō Œ Ź(ļ),al Üļ Ūä0(ń) Ķčė jb I0041A Ą_errno,#7 Ąax,#-1 push ax ĢI0041 I00419: Ź(ļ)ö Üļ Ü-2060(ń) ĢI00418 I00415: Ą(š)ö Äé#2 Ūä-204Ō Ąęļ ×ęė Üķ ž Ąäķ cwd išv ģ sal į1 Ą-206Ī,ė ‡ € Ūä-204Ō € ˆ ‡ € Į-206Ī ˆ µ ‰ € Ąį59 € ‡ €  ‘ € I0041:  Ģ.ds É_execn _execn: ƒ ‚ Įļ ĄčÅ ³ _1: .zerow 6/2 † ‡ € Ąį_1 € Įļ ‡ € Ąį6 € Įļ µ ‰ € Ąį59 € ‡ €  ‘ jmp .sret exit.s—# ÷€ÖČ__exit Č_exit Č___cleanup É_exit † _exit: ƒ ‚ Ķ___cleanupö je I0013 Ąę___cleanup Ó(ķ) • ‡ € € € € € ˆ  € ‡ €  ‘ Ģ.c É__exit __exit: ƒ ‚ ‡ € € € € € ˆ  € ‡ €  ‘ Ģ.c É___cleanup ³ ___cleanup: .zerow 2/2 .text cleanup.s—#Bö€¤Č__cleanup É__cleanup † __cleanup: ƒ ‚ € Įļ Ėčļ I0015: Ķč#20 jge I0012 Ąåļ sal ā1 Ķ__io_tableĒö je I0013 Ąåļ sal ā1 Į__io_tableĒ Ó_fflush ‰ • Üļ ĢI0015   jmp .sret fflush.s—#B÷€īČ_fflush É_fflush † _fflush: ƒ ‚ € Įļ ĄčÅ Įš testb 4(ļ),#4 ŁI0012 testb 4(ļ),#2 ŁI0013   ‡ € š • Ķ2(ļ)ö jg I0017 ‡ € š I0017: Į2(ļ) Į6(ļ) Į(ļ) Ó_write ¤ Ąéė Ķ2(ļ),š ŁI001A Ą2(ļ)ö Ąä6(ļ) Ą8(ļ),ė Įš š I001A: or 4(ļ),Ń Ąį-1 € Ÿ  jmp .dsret fork.ss—#ƒ÷€?Č_fork É_fork † _fork: ƒ ‚ ‡ € € € € € € “ € ‡ €  ‘ jmp .cret Čisatty.s—#ś€qČ_isatty É_isatty † _isatty: ƒ ‚ Ą_M+8,#29704 ĄęÅ Ą_M+4,ķ Ąį54 €  € ¶ ‰ ‰ ™ jge I0013 ‡ € š •  € Ÿ  jmp .cret Čfstat.s—#Ō÷€QČ_fstat É_fstat † _fstat: ƒ ‚ € Įļ ‡ € € “ € € ˆ “8 €  €  ‘ Ąčė Ąäsi jmp .sret Čgetegid.s—#0ł€uČ_getegid É_getegid † _getegid: ƒ ‚ € Įļ ‡ € € € € € € Ąį47 € ‡ €  ‘ Ąčė or čļ jge I0013 Įļ š • Į_M+4 Ÿ  jmp .sret Čgetenv.s—#:ł€*Č_getenv É_getenv † _getenv: ƒ ‚ ×ņ,#6 Įļ Įš Ķ_environö ± ĶÅö ŁI0013   ‡ € š • Ąę_environ ĄĘ,ķ I0019: § ĶĒö je I0016 ĄčÅ § ĄéĒ I001B: Źal,(ļ) ‹ € Źal,(š) ‹ Ćķ Ķęė ŁI001A cmpb (ļ)ö je I001A Üļ Üš ĢI001B I001A: cmpb (ļ)ö ŁI0017 cmpb (š),#61 ŁI0017 Ūä1(š) € š I0017: ÄĘ,#2 ĢI0019 ½ ‡ € Ÿ  jmp .dsret geteuid.s—#Hł€sČ_geteuid É_geteuid † _geteuid: ƒ ‚ € Įļ ‡ € € € € € € “4 € ‡ €  ‘ Ąčė or čļ jge I0013 Įļ š • Į_M+4 Ÿ  jmp .sret Čgetgid.s—#Uł€VČ_getgid É_getgid † _getgid: ƒ ‚ € Įļ ‡ € € € € € € Ąį47 € ‡ €  ‘ Ąčė Ąäsi jmp .sret getpass.s—#{ł€†Č_getpass É_getpass † _getpass: ƒ ‚ ×ņ,#10 Įļ Įš Ėčļ ˆ Ó_prints ‰ Ūä-10(ń) € “9704 € ‡ € Ó_ioctl ¤ ĄéŠ ÖŠ,#65527 Ūä-10(ń) € “9705 € ‡ € Ó_ioctl ¤ Ąį9 € Ąį_pwdbuf € ‡ € Ó_read ¤ Ąčė • Ąäļ óė » cmpb _pwdbufĒ,#10 ± Ąäļ óė »  € Äā_pwdbuf ¦ ‡ € Ó_read ¤ ­   Ąäļ óė » Ź_pwdbufĒö ĄŠ,š Ūä-10(ń) € “9705 € ‡ € Ó_ioctl ¤ Ąį_1 € Ó_prints ‰ Ąį_pwdbuf Ģ.ds ³ _pwdbuf: .zerow 10/2 ® _1: .word 10 .text close.ss—#Pö€DČ_close É_close † _close: ƒ ‚ ‡ € € € € € ˆ Ąį6 €  €  ‘ jmp .cret getuid.s—#°ł€TČ_getuid É_getuid † _getuid: ƒ ‚ € Įļ ‡ € € € € € € “4 € ‡ €  ‘ Ąčė Ąäsi jmp .sret gtty.ss—#¹ł€;Č_gtty É_gtty † _gtty: ƒ ‚ “ “9704 € ˆ Ó_ioctl ¤ jmp .cret Čstty.ss—#;ż€;Č_stty É_stty † _stty: ƒ ‚ “ “9705 € ˆ Ó_ioctl ¤ jmp .cret Čioctl.s—#īł€$Č_ioctl É_ioctl † _ioctl: ƒ ‚ ×ņ,#42 Įļ ĄčŌ Įš ® _1: ĀI0018 Ā4 Ā29704 ĀI0016 Ā29705 ĀI0014 Ā29713 ĀI0015 Ā29714 ĀI0017 † ĄęĪ Ą_M+8,ķ ĄęÅ Ą_M+4,ķ “ ĢI0012 I0014: ‡ Źcl,2(ļ) Õch,ch Ą-10(ń),ķ ĄŲ,ė ‡ Źcl,3(ļ) Õch,ch Ą-1Å,ķ Ą-12(ń),ė Ąć8 Ąä-10(ń) ĄēŲ © 2: sal į1 rcl ē#1 Ø 1: or ä-1Å or ē-12(ń) ĄŻ,ė ĄŻ+2,ī Ąä4(ļ) cwd Ą_M+14,ė Ą_M+14+2,ī Źal,1(ļ) ‹ Ąć8 sal äcl € Źal,(ļ) ‹ Ćķ or äķ Ą_M+6,ė Ąį54 €  € ¶ ‰ ‰ Ąéė Įš š I0015: ‡ Źcl,(ļ) Õch,ch Ą-1Ō,ķ Ą-1Ī,ė ‡ Źcl,1(ļ) Õch,ch Ą-22(ń),ķ Ą-20(ń),ė ‡ Źcl,2(ļ) Õch,ch Ą-2Ī,ķ Ą-2Å,ė ‡ movb cl,3(ļ) Õch,ch Ą-30(ń),ķ Ą-2Ō,ė ‡ Źcl,4(ļ) Õch,ch Ą-3Å,ķ Ą-32(ń),ė ‡ Źcl,5(ļ) Õch,ch Ą-3Ō,ķ Ą-3Ī,ė Ąć16 Ąä-22(ń) Ąē-20(ń) © 2: sal į1 rcl ē#1 Ø 1: œ 4 Ąē-1Ō Ąå-1Ī © 2: sal ē#1 rcl ā1 Ø 1: Ćķ or äī or ęģ Įķ Ąć8 Ąē-2Ī Ąå-2Å © 2: sal ē#1 rcl ā1 Ø 1: Ćķ or äī or ęģ Įķ Ėęķ Ąē-30(ń) Ąå-2Ō © 2: sal ē#1 rcl ā1 Ø 1: Ćķ or äī or ęģ ĄŻ,ė ĄŻ+2,ķ Ėęķ Ąä-3Ō Ąē-3Ī © 2: sal į1 rcl ē#1 Ø 1: œ Ąć8 Ąē-3Å Ąå-32(ń) © 2: sal ē#1 rcl ā1 Ø 1: Ćķ or äī or ęģ Ą_M+14,ė Ą_M+14+2,ķ Ąį54 €  € ¶ ‰ ‰ Ąéė Įš š ½ Ąį54 €  € ¶ ‰ pop bx mov éė Ąć8 ĄēŻ ĄåŻ+2 © 2: sar ā1 rcr ē#1 Ø 1: ÖēŽ Öā0 Ź2(ļ),dl Ėęķ ĄēŻ ĄåŻ+2 © 2: sar ā1 rcr ē#1 Ø 1: ÖēŽ Öā0 Ź3(ļ),dl Ąę_M+14 Ąē_M+14+2 Öć65535 Öē#0 Ą4(ļ),ķ Ąć16 Ąē_M+14 Ąå_M+14+2 © 2: sar ā1 rcr ē#1 Ø 1: Öē#65535 Öā0 Ą-42(ń),ī Ą-40(ń),ģ Ąä-42(ń) Ąę-40(ń) „ Öć0 Ź(ļ),al Ąć8 Ąä-42(ń) Ąē-40(ń) © 2: sar ē#1 rcr į1 Ø 1: „ Öē#0 Ź1(ļ),al Įš š I0017: Ąį54 €  € ¶ ‰ ‰ Ąéė 4 ĄēŻ ĄåŻ+2 © 2: sar ā1 rcr ē#1 Ø 1: ÖēŽ Öā0 Ź(ļ),dl Ąć16 ĄēŻ ĄåŻ+2 © 2: sar ā1 rcr ē#1 Ø 1: ÖēŽ Öā0 Ź1(ļ),dl Ąć8 ĄēŻ ĄåŻ+2 © 2: sar ā1 rcr dx,#1 loop 2b 1: ÖēŽ Öā0 Ź2(ļ),dl Ėęķ ĄēŻ ĄåŻ+2 © 2: sar ā1 rcr ē#1 Ø 1: ÖēŽ Öā0 Ź3(ļ),dl Ąć8 Ąē_M+14 Ąå_M+14+2 © 2: sar ā1 rcr ē#1 Ø 1: ÖēŽ Öā0 Ź4(ļ),dl Ąć8 Ąē_M+14 Ąå_M+14+2 © 2: sar ā1 rcr ē#1 Ø 1: ÖēŽ Öā0 Ź5(ļ),dl Įš š I0018: Ąé#-1 Ą_errno,#-22 Įš š   Ąā_1  Ģ.csb2 Ÿ  jmp .dsret abort.s—#dõ€DČ_abort É_abort † _abort: ƒ ‚ Ąį6 € Ó_getpid € Ó_kill ‰ ‰ jmp .cret kill.s—#ś€BČ_kill É_kill † _kill: ƒ ‚ ‡ € € € € “ ˆ Ąį37 € ‡ €  ‘ jmp .cret link.s—#'ś€`Č_link É_link † _link: ƒ ‚ Įļ ĄčĪ Įš ĄéÅ ‡ € Įļ Įš € Įļ µ ‰ € Įš µ ‰ € Ąį9 €  €  ‘ jmp .dsret lseek.s—#Bś€ŸČ_lseek É_lseek † _lseek: ƒ ‚ € Įļ ĄęÅ Ą_M+4,ķ ĄęĪ ĄēŌ ĄŻ,ķ ĄŻ+2,ī Ąę10(ń) Ą_M+6,ķ 9 €  € ¶ ‰ ‰ Ąčė or čļ je I0013 Ąäļ cwd œ € š • ĮŻ+2 ĮŻ Ÿ  Ćdx jmp .sret Čmalloc.s—#\ś€øČ_calloc Č_malloc Č_free Č_realloc † _grow: ƒ ‚ € Įļ Ąę__top ÄęÅ Äć1023 Öć64512 Ąčķ Ķ__top,ļ ja I0012 Įļ Ó_brk ‰ ™ je I0013   ‡ € š • Ąå__top Ą-2Ē,ļ Ą-2(ļ)ö Į__top Ó_free ‰ Ą__top,ļ  € Ÿ  Ģ.s É_malloc _malloc: ƒ ‚ ×ņ,#12 Įļ Įš ĶÅö ŁI0023 ĄÅ,#2 I0023: Ą-12(ń)ö I0028: Ķ-12(ń),#2 jae I0025 ¢ Üė Öį65534 Äį2 Ą-10(ń),ė Ķ__bottomö ŁI002A Ąį4 € Ó_sbrk ‰ Ąčė Ąäļ Üė Öį-2 Ąčė Äč#2 Ą__bottom,ļ Ą__top,ļ Ą-2(ļ)ö I002A: ¼ Ąč__empty I002F: or čļ je I002C Ąä-2(ļ) ĄŠ,ė Ąå-10(ń) Äåļ Ąéģ ĶŠ,š jae I00211 ĢI002D I00211: ĄäŠ Ūę2(š) Ķęė jae I00214 Ąax,-6(bp) mov -2(š),ė Ą-2(ļ),š Ąä(ļ) Ą(š),ė Ą(ļ),š I00214: ĶĘö je I00217 Ąä(ļ) § ° ĢI00218 I00217: Ąę(ļ) Ą__empty,ķ I00218: Įļ ĢI0021 I002D: ĄĘ,ļ Ąč(ļ) ĢI002F I002C: Į-10(ń) Ó_grow ‰ ™ ŁI0026 ĢI0025 I0026: Ü-12(ń) ĢI0028 I0025: ‡ € I0021:  Ģ.ds É_realloc _realloc: ƒ ‚ ×ņ,#12 Įļ Įš ĄäĪ Üė Öį65534 Äį2 Ą-10(ń),ė ’ Ąä-2Ē ĄŠ,ė ĄäŠ ×äÅ Ą-12(ń),ė ¼ Ąč__empty I0035: or čļ je I0032 ĶŠ,ļ jae I0037 ĢI0032 I0037: ĶŠ,ļ ŁI0033 ’ Ąä-2(ļ) Ą-2Ē,ė ĶĘö je I003D Ąä(ļ) § ° ĢI003E I003D: Ąę(ļ) Ą__empty,ķ I003E: ’ Ąä-2Ē ĄŠ,ė ĢI0032 I0033: ĄĘ,ļ Ąč(ļ) ĢI0035 I0032: Ąå-10(ń) ÄåÅ mov di,bx cmp -Ī,š jb I00310 ĄäŠ Ūę2(š) Ķęė jae I00313 ĄäŠ Ą-2(š),ė ’ Ą-2Ē,š Įš Ó_free ‰ I00313: ˆ ĢI0031 I00310: “ Ó_malloc ‰ Ąéė or éš ŁI00316 ‡ € ĢI0031 I00316: Į-12(ń) Įš ˆ Ó_bcopy ¤ ˆ Ó_free ‰ Įš I0031:  Ģ.ds _bcopy: ƒ ‚ Įļ ĄčĪ Įš ĄéÅ I0043: ĄäŌ óŌ ™ je I0042 Ąåš Üš Œ Ź(ļ),al Üļ ĢI0043 I0042: Ģ.ds É_calloc _calloc: ƒ ‚ € € Įļ Įš ¢ mul Ī ĄÅ,ė ˆ Ó_malloc ‰ Ąčė or čļ ŁI0053 ‡ € ĢI0051 I0053: Ąéļ I0058: ¢ Ąęė ×ć1 ĄÅ,ķ ™ je I0055 Ź(š)ö Üš ĢI0058 I0055: Įļ I0051:  Ģ.ds É_free _free: ƒ ‚ € € push si push š Ėéš Ąč__empty I0065: or čļ je I0062 ĶÅ,ļ jae I0063 ĢI0062 I0063: Ąéļ Ąč(ļ) ĢI0065 I0062: ’ ĄĒ,ļ or éš je I006A ¢ Ą(š),ė ĢI006B I006A: ĄęÅ Ą__empty,ķ I006B: or čļ je I006D ’ Ķ-2Ē,ļ ŁI006D ’ Ąä-2(ļ) Ą-2Ē,ė Ąä(ļ) ’ ° I006D: or éš je I00613 ¢ Ķ-2(š),ė ŁI00613 ’ Ąä-2Ē Ą-2(š),ė ’ « Ą(š),ė I00613: Ģ.ds ³ __empty: .zerow 2/2 __top: .zerow 2/2 __bottom: .zerow 2/2 .text brk.s.s—#Ļõ€KČ_brk Č_sbrk É_brk † _brk: ƒ ‚ € Įļ ‡ € € ˆ € € € 7 € ‡ €  ‘ Ąčė or čļ ŁI0013 Ąę_M+18 Ą_brkļze,ķ ‡ € š • Ąį-1 € Ÿ  Ģ.s É_sbrk _sbrk: ƒ ‚ € € Įļ Įš Ąé_brkļze ’ Äå_brkļze Ąčģ ĶÅö jle I0025 Ķéļ ja I0022 I0025: ĶÅö jge I0023 Ķéļ jae I0023 I0022: Ąį-1 € ĢI0021 I0023: Įļ Ó_brk ‰ ™ ŁI0029 Įš ĢI0021 I0029: Ąį-1 € I0021:  jmp .dsret Čbrk2.ss—#Üõ€]Č_brk2 É_brk2 † _brk2: ƒ ‚ € € Įļ Įš Ó_get_ļze Ąčė ‡ € Įš Įļ € € € Ąį66 € ‡ €  ‘ jmp .dsret Čbrksize.s—#)õ€-Č_brkļze Éendbss, _brkļze ® _brkļze: Āendbss Čmknod.s—#§ś€SČ_mknod É_mknod † _mknod: ƒ ‚ Įļ ĄčÅ ‡ € € Įļ ĮŌ “ Įļ µ ‰ € 4 €  €  ‘ jmp .sret Čmktemp.s—#±ś€æČ_mktemp É_mktemp † _mktemp: ƒ ‚ ×ņ,#6 Įļ Įš Ó_getpid Ąéė ĄčÅ • Ąåļ Üļ cmpb Ēö ± ­   óļ ½ óļ cmpb (ļ),#88 ŁI0015 Ąć10 Ąäš cwd išv ķ Äē#48 Ź(ļ),dl Ąäš cwd išv ķ Ąéė ĢI0016 I0015: ¢ jmp .dsret Čgetpid.s—#ˆł€FČ_getpid É_getpid † _getpid: ƒ ‚ ‡ € € € € € € “0 € ‡ €  ‘ jmp .cret mount.s—#æś€cČ_mount É_mount † _mount: ƒ ‚ Įļ ĄčĪ Įš ĄéÅ ‡ € Įļ Įš ĮŌ Įļ µ ‰ € Įš µ ‰ € “1 €  €  ‘ jmp .dsret Čopen.s—#ßś€BČ_open É_open † _open: ƒ ‚ ˆ “ Ąį5 €  € Ó_callm3 Äņ,#8 jmp .cret perror.s—#üś€÷ Č_perror Č_sys_errlist Č_sys_nerr É_sys_errlist ® _sys_errlist: Ā_1 Ā_2 Ā_3 Ā_4 Ā_5 Ā_6 Ā_7 Ā_8 Ā_9 Ā_10 Ā_11 Ā_12 Ā_13 Ā_14 Ā_15 Ā_16 Ā_17 Ā_18 Ā_19 Ā_20 Ā_21 Ā_22 Ā_23 Ā_24 Ā_25 Ā_26 Ā_27 Ā_28 Ā_29 Ā_30 Ā_31 Ā_32 Ā_33 Ā_34 Ā_35 É_sys_nerr _sys_nerr: É_perror Ā35 † _perror: ƒ ‚ Įļ ĄčÅ Ķ_errnoö jl I0012 Ķ_errno,#35 jl I0013   4 € Ąį_36 € “ € Ó_write ¤ ĢI0014 • Įļ Ó_slen ‰ € Įļ “ € Ó_write ¤ “ € Ąį_37 € “ € Ó_write ¤ Ąå_errno sal ā1 Į_sys_errlistĒ Ó_slen ‰ Ąå_errno sal ā1 € Į_sys_errlistĒ “ € Ó_write ¤ mov ax,#1 push ė Ąį_38 € “ € Ó_write ¤ I0014: Ģ.s _slen: ƒ ‚ € Įļ Įš ĄéÅ Ėčļ I0023: Ąåš Üš cmpb Ēö je I0022 Üļ ĢI0023 I0022: Ąäļ Ģ.ds ® _1: Ā29253 Ā28530 Ā8306 Ā48 _2: · Ā8308 Ā30575 Ā25966 Ā114 _3: · Ā29472 Ā25461 Ā8296 Ā26982 Ā25964 Ā28448 Ā8306 Ā26980 Ā25970 Ā29795 Ā29295 Ā121 _4: · Ā29472 Ā25461 Ā8296 Ā29296 Ā25455 Ā29541 Ā115 _5: Ā28233 Ā25972 Ā29298 Ā28789 Ā25972 Ā8292 Ā31091 Ā29811 Ā28005 Ā25376 Ā27745 Ā108 _6: Ā12105 Ā8271 Ā29285 Ā28530 Ā114 _7: · Ā29472 Ā25461 Ā8296 Ā25956 Ā26998 Ā25955 Ā28448 Ā8306 Ā25697 Ā29284 Ā29541 Ā115 _8: Ā29249 Ā8295 Ā26988 .word 29811 Ā29728 Ā28527 Ā27680 Ā28271 Ā103 _9: Ā30789 Ā25445 Ā26144 Ā29295 Ā24941 Ā8308 Ā29285 Ā28530 Ā114 _10: Ā24898 Ā8292 Ā26982 Ā25964 Ā28192 Ā28021 Ā25954 Ā114 _11: · Ā25376 Ā26984 æ08 Ā25970 Ā110 _12: · Ā27936 Ā29295 Ā8293 Ā29296 Ā25455 Ā29541 Ā25971 Ā115 _13: · Ā8308 Ā28261 Ā30063 Ā26727 Ā25376 Ā29295 Ā101 _14: Ā25936 Ā28018 Ā29545 Ā26995 Ā28271 Ā25632 Ā28261 Ā25961 Ā100 _15: Ā24898 Ā8292 Ā25697 Ā29284 Ā29541 Ā115 _16: Ā27714 Ā25455 Ā8299 Ā25956 Ā26998 Ā25955 Ā29216 Ā29029 Ā26997 Ā25970 Ā100 _17: Ā28493 Ā28277 Ā8308 Ā25956 Ā26998 Ā25955 Ā25120 Ā29557 Ā121 _18: Ā26950 Ā25964 .word 25888 Ā27000 Ā29811 Ā115 _19: Ā29251 Ā29551 Ā11635 Ā25956 Ā26998 Ā25955 Ā27680 Ā28265 Ā107 _20: · Ā29472 Ā25461 Ā8296 Ā25956 Ā26998 Ā25955 ø _21: · Ā8308 Ā8289 Ā26980 Ā25970 Ā29795 Ā29295 Ā121 _22: Ā29513 Ā24864 Ā25632 Ā29289 Ā25445 Ā28532 Ā31090 ø _23: Ā28233 Ā24950 Ā26988 Ā8292 Ā29281 Ā30055 Ā25965 Ā29806 ø _24: Ā26950 Ā25964 Ā29728 Ā25185 Ā25964 Ā28448 Ā25974 Ā26226 Ā28524 Ā119 _25: Ā28500 Ā8303 Ā24941 Ā31086 Ā28448 Ā25968 Ā8302 Ā26982 Ā25964 Ā115 _26: · Ā8308 Ā8289 Ā31092 Ā25968 Ā29303 Ā29801 Ā29285 ø _27: Ā25940 Ā29816 Ā26144 Ā27753 Ā8293 Ā30050 Ā31091 ø _28: Ā26950 Ā25964 .word 29728 Ā28527 Ā27680 Ā29281 Ā25959 ø _29: · Ā29472 Ā24944 Ā25955 Ā27680 Ā26213 Ā8308 Ā28271 Ā25632 Ā30309 Ā25449 Ā101 _30: Ā27721 Ā25964 Ā24935 Ā8300 Ā25971 Ā27493 ø _31: Ā25938 Ā25697 Ā28461 Ā27758 Ā8313 Ā26982 Ā25964 Ā29472 Ā29561 Ā25972 Ā109 _32: Ā28500 Ā8303 Ā24941 Ā31086 Ā27680 Ā28265 Ā29547 ø _33: Ā29250 Ā27503 Ā28261 Ā28704 Ā28777 Ā101 _34: Ā24909 Ā26740 Ā24864 Ā26482 Ā28021 Ā28261 Ā116 _35: Ā25938 Ā30067 Ā29804 Ā29728 Ā28527 Ā27680 Ā29281 Ā25959 ø _36: Ā28233 Ā24950 Ā26988 Ā8292 Ā29285 Ā28274 Ā2671 ø _37: Ā8250 ø _38: .word 10 .text Čpipe.ss—# ū€ŽČ_pipe É_pipe † _pipe: ƒ ‚ € Įļ Įš ĄéÅ ‡ € € € € € € Ąį42 €  €  ‘ Ąčė or čļ jl I0013 Ąę_M+4 Ą(š),ķ Ąę_M+6 Ą2(š),ķ ‡ € š • Įļ Ÿ  jmp .dsret prints.s—#Wū€DČ_prints Č_Buf Č_Bufp É_prints † _prints: ƒ ‚ ×ņ,#14 Įļ ĄčÅ Įš ® _1: ĀI00119 Ā2 Ā99 ĀI001E Ā115 ĀI001F † Ą_Bufp,#_Buf ŪäĪ ĄŲ,ė • cmpb (ļ)ö ± cmpb (ļ),#37 je I0016 Ąåļ Üļ Œ ‹ € Ó_put ‰ ­ ½ Ėéš Üļ I0019: Źal,(ļ) ‹ Ķį48 jl I0018 Źal,(ļ) ‹ Ķį57 jg I0018 Źal,(ļ) ‹ ×į48 € 0 mul š Ćķ Äęė Ąéķ Üļ ĢI0019 I0018: Źal,(ļ) ‹ € ĢI001C I001E: ĄåŲ ÄŲ,#2 « ¬ ¹ Ó_put ‰ Üļ ­ I001F: ĄåŲ « Ą-10(ń),ė ÄŲ,#2 Ąä-10(ń) Ą-12(ń),ė I00111: Ąå-10(ń) Ü-10(ń) Œ Ź-13(ń),al ‹ ™ je I00110 Źal,-13(ń) ‹ € Ó_put ‰ š1 I00110: Üļ Ąä-10(ń) ×ä-12(ń) dec ax sub ax,š ōė ¬ ĶĻö jle I0013 I00117: £ óĻ ™ je I0013 Ąį32 € Ó_put ‰ š7 I00119: Ąį37 € Ó_put ‰ Ąåļ Üļ Œ ‹ € Ó_put ‰ ­ I001C: Ąā_1  Ģ.csb2   Ąä_Bufp ×į_Buf € Ąį_Buf €  € Ó_write ¤ Ģ.ds _put: ƒ ‚ Ķ_Bufp,#_Buf+128 jae I0023 Ąå_Bufp Źal,Å ŗ Ü_Bufp I0023: Ģ.c É_Bufp ³ _Bufp: .zerow 2/2 É_Buf _Buf: .zerow 128/2 .text read.ss—#œū€PČ_read É_read † _read: ƒ ‚ € Įļ ‡ € € “ € ĮŌ ˆ Ąį3 €  €  ‘ Ąčė Ąäsi jmp .sret setgid.s—#Cü€HČ_setgid É_setgid † _setgid: ƒ ‚ ‡ € € € € € ˆ Ąį46 € ‡ €  ‘ jmp .cret setuid.s—#Qü€FČ_setuid É_setuid † _setuid: ƒ ‚ ‡ € € € € € ˆ “3 € ‡ €  ‘ jmp .cret sleep.s—#oü€iČ_sleep † _alfun: ƒ ‚ Ģ.c É_sleep _sleep: ƒ ‚ Ąį_alfun € 4 € Ó_ļgnal ‰ ‰ ˆ Ó_alarm ‰ Ó_pause jmp .cret Čalarm.s—#ˆõ€CČ_alarm É_alarm † _alarm: ƒ ‚ ‡ € € € € € ˆ “7 € ‡ €  ‘ jmp .cret Čpause.s—#ķś€CČ_pause É_pause † _pause: ƒ ‚ ‡ € € € € € € “9 € ‡ €  ‘ jmp .cret Čsignal.s—#aü€)Č_ļgnal Č_vectab É_ļgnal † _ļgnal: ƒ ‚ € € Įļ ĄčĪ Įš ¢ sal į1 ×į2 » Ąé_vectabĒ ¢ sal į1 ×į2 » Ą_vectabĒ,ļ ĄęÅ Ą_M+4,ķ Ķč#1 ± or čļ ŁI0013   Įļ ĢI0014 • Ąį_begļg € I0014: Ć_M+14 Ąį48 € ‡ € ¶ ‰ ‰ ” ĶĘ,#1 ŁI0017 Ąé#1 I0017: ĶĘö jge I001A ” š I001A: Įš Ÿ  Ģ.ds É_vectab ³ _vectab: .zerow 32/2 .text Čcatchsig.s—#)õ€ĘČ_begļg É_begļg É_vectab, _M mtype = 2 _begļg: € ¦ Įķ œ Įļ Įš ƒ Įds Įes Ąåņ Ąå18Ē Ąäģ óģ Äåģ Ąå_vectabĒ Į_M+mtype € ÓĒ back:  Ć_M+mtype Ćes Ćds „ Ćš Š Ćī Ćķ ‰  Ćdummy i ® dummy: ø stat.sg.s—#‡ü€^Č_stat É_stat † _stat: ƒ ‚ € Įļ Įš ĄéÅ ‡ € “ Įš € € Įš µ ‰ € 8 €  €  ‘ Ąčė Ąäsi jmp .dsret stime.s.s—#§ü€NČ_stime É_stime † _stime: ƒ ‚ ’ ĄęĒ Ąē2Ē ĄŻ,ķ ĄŻ+2,ī “5 €  € ¶ ‰ ‰ jmp .cret strcat.ss—#±ü€šČ_strcat É_strcat † _strcat: ƒ ‚ € Įļ ĄčÅ Įš ĄéĪ ĄĘ,ļ • cmpb (ļ)ö je I0016 Üļ ­ ½ cmpb (š)ö je I0015 Ąåš Üš Œ Ź(ļ),al Üļ ĢI0016 I0015: Ź(ļ)ö — jmp .dsret strcpy.ss—#Ķü€oČ_strcpy É_strcpy † _strcpy: ƒ ‚ € Įļ ĄčÅ Įš ĄéĪ ĄĘ,ļ • cmpb (š)ö ± Ąåš Üš Œ Ź(ļ),al Üļ ­   Ź(ļ)ö — jmp .dsret Čstrlen.ss—#įü€ZČ_strlen É_strlen † _strlen: ƒ ‚ € Įļ ĄčÅ Įš Ąéļ • cmpb (ļ)ö ± Üļ ­   Ąäļ ×ädi jmp .dsret strncat.s—#źü€“Č_strncat É_strncat † _strncat: ƒ ‚ € Įļ Įš ĄéĪ ĄčÅ ĶŌö jle I0013 ½ Ąåļ Üļ cmpb Ēö je I0015 ĢI0016 I0015: óļ I0019: Ąåš Üš Œ Ź(ļ),al Üļ ‹ ™ je I0013 óŌ ŁI0019 Ź(ļ)ö • ¢ jmp .dsret strncmp.s—#ōü€ÓČ_strncmp É_strncmp † _strncmp: ƒ ‚ Įļ ĄčÅ Įš ĄéĪ ĶŌö jg I0016 ‡ € š ½ Ąåļ Üļ Œ ‹ Ąåš Üš € Œ ‹ Ćķ Ķęė ŁI0015 cmpb -1(ļ)ö je I0018 óŌ ŁI0016 I0018: ‡ € š I0015: Źal,-1(ļ) ‹ € Źal,-1(š) ‹ Ćķ ×ęė Įķ Ÿ  jmp .dsret Čstrncpy.s—#žü€¾Č_strncpy É_strncpy † _strncpy: ƒ ‚ € Įļ Įš ĄéĪ ĄčÅ ĶŌö jle I0013 ½ Ąåš Üš Œ Ź(ļ),al Üļ ‹ ™ je I0015 óŌ je I0015 ĢI0016 I0015: ĶŌö je I0013 I001D: óŌ je I0013 Ź(ļ)ö Üļ ĢI001D • ¢ jmp .dsret sync.s.s—#Rż€BČ_sync É_sync † _sync: ƒ ‚ ‡ € € € € € € Ąį36 €  €  ‘ jmp .cret time.s.s—#«ż€ķČ_time É_time † _time: ƒ ‚ ×ņ,#6 Įļ Įš ĄéÅ ‡ € € € € € € 3 €  €  ‘ Ąčė Ķ_M+2ö jl I0012 or čļ je I0013   Ąę_M+2 ōķ Ą_errno,ķ Ąį-1 € Ąį65535 € š • ĄęŻ ĄēŻ+2 ĄŠ,ķ ĄĻ,ī or éš je I0017 ĄäŠ ĄęĻ Ą(š),ė Ą2(š),ķ I0017: ¹ ĮŠ Ÿ  Ćdx jmp .dsret Čtimes.ss—#¼ż€įČ_times É_times † _times: ƒ ‚ € Įļ ĄčÅ Įš ‡ € € € € € € Ąį43 €  €  ‘ Ąéė Ąę_M+4 Ąē_M+4+2 Ą(ļ),ķ Ą2(ļ),ī Ąę_M+8 Ąē_M+8+2 Ą4(ļ),ķ Ą6(ļ),ī Ąę_M+12 Ąē_M+12+2 Ą8(ļ),ķ Ą10(ļ),ī Ąę_M+16 Ąē_M+16+2 Ą12(ļ),ķ Ą14(ļ),ī Ąädi jmp .dsret Čumask.ss—#׿€EČ_umask É_umask † _umask: ƒ ‚ ‡ € € € € € ˆ Ąį60 €  €  ‘ jmp .cret Čumount.s—#俀IČ_umount É_umount † _umount: ƒ ‚ ˆ ‡ € “2 €  € Ó_callm3 Äņ,#8 jmp .cret Čunlink.s—#ž€IČ_unlink É_unlink † _unlink: ƒ ‚ ˆ ‡ € 0 €  € Ó_callm3 Äņ,#8 jmp .cret Čutime.s—#ž€›Č_utime É_utime † _utime: ƒ ‚ Įļ ĄčĪ Įš ĄéÅ Įš µ ‰ Ą_M+4,ė Ąę(ļ) Ąē2(ļ) ĄŻ,ķ ĄŻ+2,ī Ąę4(ļ) Ąē6(ļ) Ą_M+14,ķ Ą_M+14+2,ī Ą_M+18,š Ąį30 €  € ¶ ‰ ‰ jmp .dsret Čwait.s—#ž€…Č_wait É_wait † _wait: ƒ ‚ € Įļ Įš ĄéÅ ‡ € € € € € € Ąį7 € ‡ €  ‘ Ąčė or čļ jl I0013 or éš je I0013 Ąę_M+4 Ą(š),ķ • Ąäsi jmp .dsret Čstderr.s—#™ü€oČ_std_err É_std_err † _std_err: ƒ ‚ € Įļ Įš ĄéÅ Ąčš • cmpb (ļ)ö ± Üļ ­   Ąäļ ×äš € Įš “ € Ó_write ¤ jmp .dsret Čwrite.s—#,ž€EČ_write É_write † _write: ƒ ‚ ‡ € € “ € ĮŌ ˆ Ąį4 €  €  ‘ jmp .cret Čsyslib.s—#lż€qČ_sys_newmap Č_sys_kill Č_tell_fs Č_sys_times Č_sys_abort Č_sys_exec Č_sys_getņ Č_sys_ļg Č_sys_fork Č_sys_copy Č_sys_xit É_sys_xit † _sys_xit: ƒ ‚ ‡ € € € € “ ˆ  € Ąį-2 €  ‘ Ģ.c É_sys_getņ _sys_getņ: ƒ ‚ ‡ € € € € € ˆ “ € Ąį-2 €  ‘ ĄęŻ Æ ĄĒ,ķ Ģ.c É_sys_ļg _sys_ļg: ƒ ‚ ĄęÅ Ą_M+4,ķ ĄęĪ Ą_M+6,ķ ĄęŌ Ą_M+14,ķ Ąį3 € Ąį-2 € ¶ ‰ ‰ Ģ.c É_sys_fork _sys_fork: ƒ ‚ ‡ € € € ĮŌ “ ˆ Ąį4 € Ąį-2 €  ‘ Ģ.c É_sys_exec _sys_exec: push bp ‚ ‡ € € “ € € ˆ Ąį7 € Ąį-2 €  ‘ Ģ.c É_sys_newmap _sys_newmap: ƒ ‚ ‡ € € “ € € ˆ Ąį5 € Ąį-2 €  ‘ Ģ.c É_sys_copy _sys_copy: ƒ ‚ Įļ ĄčÅ Ą2(ļ),#6 Įļ Ąį-2 € Ó_sendrec ‰ ‰ ™ je I0073 Ąį32768 € Ąį_1 € Ó_panic ‰ ‰ I0073: Ģ.s É_sys_times _sys_times: ƒ ‚ Įļ ĄčĪ ‡ € € Įļ € € ˆ Ąį8 € Ąį-2 €  ‘ Ąę_M+4 Ąē_M+4+2 Ą(ļ),ķ Ą2(ļ),ī Ąę_M+8 Ąē_M+8+2 Ą4(ļ),ķ Ą6(ļ),ī Ąę_M+12 Ąē_M+12+2 Ą8(ļ),ķ Ą10(ļ),ī Ąę_M+16 Ąē_M+16+2 Ą12(ļ),ķ Ą14(ļ),ī Ģ.s É_sys_abort _sys_abort: push ń ‚ ‡ € € € € € € Ąį9 € Ąį-2 €  ‘ Ģ.c É_sys_kill _sys_kill: ƒ ‚ ĄęÅ Ą_M+4,ķ ĄęĪ Ą_M+6,ķ 1 € Ąį-2 € ¶ ‰ ‰ Ģ.c É_tell_fs _tell_fs: ƒ ‚ ‡ € € € Į10(ń) ĮŌ “ ˆ  €  ‘ Ģ.c ® _1: Ā31091 Ā24435 Ā28515 Ā31088 Ā25376 Ā28257 Ā29735 Ā29472 Ā28261 Ā100 .text Čcall.ss—#ö€{Č_errno ČŅ Č_callx Č_callm3 Č_len ÉŅ † Ņ: ƒ ‚ ĄęŌ Ą_M+4,ķ Ąę10(ń) Ą_M+6,ķ Ąę12(ń) Ą_M+8,ķ Ąę1Å ĄŻ,ķ Ąę1Ī Ą_M+12,ķ Ąę1Ō Ą_M+14,ķ “ ˆ ¶ ‰ ‰ Ģ.c É_callm3 _callm3: ƒ ‚ € € Įļ Įš Į10(ń) µ ‰ Ąéė Ą_M+4,š ĄęŌ Ą_M+6,ķ Ąę10(ń) Ą_M+8,ķ Ąč#Ż Ķé#14 jg I0023 I0026: Ąäš óš ™ je I0023 Ąå10(ń) Ü10(ń) Œ Ź(ļ),al Üļ ĢI0026 I0023: “ ˆ ¶ ‰ ‰ Ģ.ds É_callx _callx: ƒ ‚ € Įļ ĄęĪ Ą_M+2,ķ Ąį_M € ˆ Ó_sendrec ‰ ‰ Ąčė or čļ je I0033 Įļ ĢI0031 I0033: Ķ_M+2ö jge I0036 Ąę_M+2 ōķ Ą_errno,ķ Ąį-1 € ĢI0031 I0036: push _M+2 I0031:  Ģ.s É_len _len: ƒ ‚ € Įļ ĄčÅ Įš Ėéš I0043: Ąåļ Üļ cmpb Ēö je I0042 Üš ĢI0043 I0042: Ąäš Üė Ģ.ds É_errno ³ _errno: .zerow 2/2 .text Čatoi.ss—#Ÿõ€^Č_atoi É_atoi † _atoi: ƒ ‚ ×ņ,#6 Įļ ĄčÅ Įš Ėéš ĄŠö • Źal,(ļ) ‹ Ą__c_,ė Ķ__c_,#32 je I0014 Ķ__c_,#9 je I0014 Ķ__c_,#13 je I0014 Ķ__c_,#10 je I0014 Ķ__c_,#12 ŁI0012 I0014: Üļ ­   cmpb (ļ),#45 ŁI001D Üļ ĄŠ,#1 I001D: Ąåļ Üļ Œ ‹ ×į48 ¬ ĶĻ,#10 jae I001C 0 mul š Ąéė ÄéĻ ĢI001D I001C: ĶŠö je I00110 Ąäš ōė € š I00110: Įš Ÿ  Ģ.ds ³ __c_: .zerow 2/2 .text message.s—#™ś€2Č_M É_M ® _M: ø ø ø ø ø ø ø ø ø ø ø .word 0 .text sendrec.s—#:õ€ŅČ_send, _receive, _sendrec É_send, _receive, _sendrec SEND = 1 RECEIVE = 2 BOTH = 3 SYSVEC = 32 _send: Ąę*SEND ĢL0 _receive: Ąę*RECEIVE ĢL0 _sendrec: Ąę*BOTH ĢL0 L0: ƒ ‚ ¢ Æ int SYSVEC „  itoa.s.s—# ś€¤Č_itoa É_itoa † _itoa: ƒ ‚ ×ņ,#6 Įļ Įš ĄŠö Ą_nextö ĶÅö jge I0013 Ąę_next Ü_next Ąåķ Ź_qbufĒ,#45 ōÅ • ĶÅö ŁI0016 Ąę_next Ü_next Ąåķ Ź_qbufĒ,#48 ĢI0017 ½ Ąč#10000 I0019: or čļ jle I0017 ¢ cwd išv ļ Ąéė ĶŠö ŁI001B or éš jle I001C I001B: Ąäš Äį48 Ąę_next Ü_next Ąåķ Ź_qbufĒ,al ĄŠ,#1 I001C: Ąäļ mul š ×äÅ ōė ĄÅ,ė Ąć10 Ąäļ cwd išv ķ Ąčė ĢI0019 I0017: Ąå_next Ź_qbufĒö Ąį_qbuf Ģ.ds ³ _qbuf: .zerow 8/2 _next: .zerow 2/2 .text stb.s.s—#ü€lČ___stb É___stb † ___stb: ƒ ‚ Įļ ĄčŌ Įš ĄéĪ ĶÅö jle I0013 I0017: Ąåš Üš Œ Ź(ļ),al Üļ óÅ ŁI0017 • jmp .dsret abs.s.s—#mõ€MČ_abs É_abs † _abs: ƒ ‚ Įļ ĄčÅ or čļ jge I0013 Ąäļ ōė € š • Įļ Ÿ  jmp .sret Čatol.s.s—#¬õ€@Č_atol É_atol † _atol: ƒ ‚ ×ņ,#8 Įļ ĄčÅ Įš ĄĻö ¼ Ėéš • Źal,(ļ) ‹ » Źal,__ctype_+1Ē ‹ testb al,#8 ± Üļ ­   cmpb (ļ),#45 ŁI0019 Üļ Ąé#1 I0019: Ąåļ Üļ Œ ‹ ×į48 ĄŠ,ė ĶŠ,#10 jae I0018 0 Ėēī ” ¹ Ó.mli4 ¬ ĄĘ,ī ‡ ĄęĻ ĄēĘ ÄęŠ adc ēė ĄĻ,ķ ĄĘ,ī ĢI0019 I0018: or éš je I001C £ ĄęĘ ōķ ōė sbb ć0 Įķ € š I001C: ” ¹ Ÿ  Ćdx jmp .dsret ctype.ss—#¦ö€łČ__ctype_ É__ctype_ ® __ctype_: Ā8192 ² ² ² ² Ā2056 Ā2056 Ā8200 ² ² ² ² ² ² ² ² Ā2080 Ŗ Ŗ Ŗ Ŗ Ŗ Ŗ Ŗ Ā1040 Ā1028 Ā1028 Ā1028 Ā1028 Ā4100 Ŗ Ŗ Ŗ Ā16705 Ā16705 Ā16705 æ æ æ æ æ æ æ æ æ æ Ŗ Ŗ Ŗ Ā16962 Ā16962 Ā16962 ¾ ¾ ¾ ¾ ¾ ¾ ¾ ¾ ¾ ¾ Ŗ Ŗ .word 32 .text Čindex.ss—#Āł€}Č_index É_index † _index: ƒ ‚ Įļ ĄčÅ I0014: Źal,(ļ) ‹ € Źal,Ī ‹ Ćķ Ķęė ŁI0013 Įļ š • Ąåļ Üļ cmpb Ēö ŁI0014 ‡ € Ÿ  jmp .sret Čbcopy.ss—#æõ€\Č_bcopy É_bcopy † _bcopy: ƒ ‚ Įļ ĄčĪ Įš ĄéÅ • ĄäŌ óŌ ™ ± Ąåš Üš Œ Ź(ļ),al Üļ ­   jmp .dsret getutil.s—#0õ€Č_get_base, _get_ļze, _get_tot_mem É_get_base, _get_ļze, _get_tot_mem Éendbss _get_base: Ąäds  _get_ļze: Ąįendbss  _get_tot_mem: cli Įes Įš 6384 ×éš L1: Ąes,ė seg es Ą(š)öxA5A4 Ėåģ seg es Ąå(š) Ķā0xA5A4 ŁL2 Äį4096 Ķį0xA000 ŁL1 L2: Ćš Ćes sti  rand.s.s—#Žū€įČ_rand Č_srand ® _seed: Ā1,0 É_srand † _srand: ƒ ‚ ‡ ĄęÅ Ą_seed,ķ Ą_seed+2,ė Ģ.c É_rand _rand: ƒ ‚ “0077 ĄēŃ838 Į_seed+2 Į_seed Ó.mli4 Äį12345 adc ē#0 Öį65535 Öē#32767 Ą_seed,ė Ą_seed+2,ī Ąę_seed Öć32767 Öē#0 Ąäcx jmp .cret Črindex.s—#ü€†Č_rindex É_rindex † _rindex: ƒ ‚ € Įļ ĄčÅ Įš Ėéš I0014: Źal,(ļ) ‹ € Źal,Ī ‹ Ćķ Ķęė ŁI0013 Ąéļ • Ąåļ Üļ cmpb Ēö ŁI0014 Ąädi jmp .dsret setjmp.s—#;õ€ĶČ_setjmp, _longjmp É_setjmp, _longjmp † _setjmp: Ąåņ « Ąå*2Ē ĄĒ,ń Ą*2Ē,ņ Ą*4Ē,ė ‡  _longjmp: ‡ ƒ ‚ Ąå*Å Ąä*Ī ™ ŁL1 Üė L1: ĄęĒ L2: Ķę*0(ń) je L3 Ąź*0(ń) or źń ŁL2 hlt L3: Ąź*0(ń) Ąņ,*2Ē Ąę*4Ē Ąåņ ĄĒ,ķ  Čadi.s.s—#(õ€qČ.aš † .aš: Ć ģ Ķ ć2 Ł 1f Ć ķ Ä äķ Ģ Ē 1: Ķ ć4 Ł 9f Ć ī Ć ķ Ä äķ Ć ķ adc ēķ Į ī Ģ Ē 9: É.trpilin ¦ Ģ .trpilin Čand.s.s—#(õ€DČ.and † .and: ‰ Ąēš Ąéņ Äéķ sar ć1 1:  Öä(š) stow ß 1b Ąéī ĢĒ cii.s.s—#*õ€«Č.cii † .cii: Ć ģ Ķē#1 Ł2f ‹ Ąē#2 2: Ķ ēķ je 8f Ķ ē#2 je 1f Ķ ē#4 Ł 9f Ķ ć2 Ł 9f Ć ī 8: Ģ Ē 1: Ķ ć4 Ł 9f cwd Į ī Ģ Ē 9: Į ė EILLINS = 18 É.fat Ą įEILLINS Į ė Ģ .fat Čcms.s.s—#+õ€`Č.cms † .cms: Ć ģ Ą ēņ Įļ Įš Ą čī Ä ēķ Ą éī Ä ēķ sar ć1 repe cmp je 1f Ü ķ 1: Ćš Š Ą ņ,ī Ģ Ē cmu4.ss—#+õ€pČ.cmu4 † .cmu4: Ć ģ Ć ķ Ć ī Ć ė Įļ Ąčņ xchg å2(ļ) Š Ķ åī ja 1f jb 2f Ķ äķ ja 1f je 3f 2: Ąį-1  3: ‡  1:   com.ss—#+õ€7Č.com † .com: Ąåņ Üģ Üģ sar ć1 1: not Ē Üģ Üģ ß 1b  Čcsa2.ss—#,õ€ŽČ.csa2 † .csa2: Ą ēĒ × ä2Ē Ķ ä4Ē ja 1f sal į1 Äåė Ą å6Ē test åģ jnz 2f 1: Ą åī test åģ jnz 2f ECASE = 20 É.fat Ą įECASE Į ė Ģ .fat 2: Ģ Ē csb2.ss—#,õ€…Č.csb2 † .csb2: ĄēĒ Ąę2Ē 1: Äā4 ó ķ jl 4f Ķ äĒ Ł 1b Ąå2Ē 2: test åģ jnz 3f ECASE = 20 É.fat Ą įECASE Į ė Ģ .fat 3: Ģ Ē 4: Ąåī Ģ2b Čcuu.ss—#-õ€«Č.ciu Č.cui ČŚ † .ciu: .cui: Ś: Ć ģ Ķ ēķ je 8f Ķ ē#2 je 1f Ķ ē#4 Ł 9f Ķ ć2 Ł 9f Ć ī 8: Ģ Ē 1: Ķ ć4 Ł 9f Ė ēī Į ī Ģ Ē 9: Į ė EILLINS = 18 É.fat Ą įEILLINS Į ė Ģ .fat Č_dup.ss—#'õ€BČ.dup † .dup: ‰ Ąäļ Ąēš Ąčņ ×ņ,ķ Ąéņ sar ć1 rep mov Ąčė Ąéī ĢĒ dvi4.s—#-õ€ŽČ.dvi4 yl=6 yh=8 xl=10 xh=12 † .dvi4: Įļ Įš Ą čņ Ą åyl(ļ) Ą äyh(ļ) cwd Ą éī Ķ ēė Ł 7f Ö ēī jge 1f ō ģ je 7f 1: Ė ēī Ą ęxl(ļ) Ą äxh(ļ) Ö äė jge 2f ō ė ō ķ sbb äī not š 2: šv ģ xchg äķ šv ģ 9: Ö éš jge 1f ō ķ ō ė sbb ć0 1: Ąēķ Ćš Š ‰ Äņ,#8 ĢĒ 7: Į ī Ą éė Ė åģ Ö éš jge 1f ō š ō yl(ļ) sbb éģ 1: Ą äxl(ļ) Ą ēxh(ļ) Ö ēī jge 1f ō ī ō ė sbb ēģ not -2(ļ) 1: Ą ć16 1: shl į1 rcl ē#1 rcl ā1 Ķ éģ ja 3f jb 2f Ķ yl(ļ),ī jbe 2f 3: ß 1b Ģ 1f 2: × ēyl(ļ) sbb åš Ü ė ß 1b 1: Ć š Ģ 9b dvu4.s—#-õ€#Č.dvu4 yl=6 yh=8 xl=10 xh=12 † .dvu4: Įļ Įš Ą čņ Ą åyl(ļ) Ą äyh(ļ) or äė Ł 7f Ė ēī Ą ęxl(ļ) Ą äxh(ļ) šv ģ xchg äķ šv ģ 9: Ąēķ Ćš Š ‰ Äņ,#8 ĢĒ 7: Ą éė Ė åģ Ą äxl(ļ) Ą ēxh(ļ) Ą ć16 1: shl į1 rcl ē#1 rcl ā1 Ķ éģ ja 3f jb 2f Ķ yl(ļ),ī jbe 2f 3: ß 1b Ģ 9b 2: × ēyl(ļ) sbb åš Ü ė ß 1b Ģ 9b Čexg.s—#.õ€JČ.exg † .exg: Įš Ąņ,š Äé#4 Ąåš Äåķ sar ć1 1: « xchg ä(š) ° ß 1b 2: Ćš  fakfp.s—#/õ€¹Č.mlf,.dvf,.ngf,.adf,.sbf,.cmf,.zrf,.fif,.fef Č.mlf8,.dvf8,.ngf8,.adf8,.sbf8,.cmf8,.zrf8,.fif8,.fef8 Č.mlf4,.dvf4,.ngf4,.adf4,.sbf4,.cmf4,.zrf4,.fif4,.fef4 Č.cif,.cfi,.cuf,.cfu,.cff † .mlf: .dvf: .ngf: .adf: .sbf: .cmf: .zrf: .fif: .fef: .mlf4: .dvf4: .ngf4: .adf4: .sbf4: .cmf4: .zrf4: .fif4: .fef4: .mlf8: .dvf8: .ngf8: .adf8: .sbf8: .cmf8: .zrf8: .fif8: .fef8: .cif: .cfi: .cuf: .cfu: .cff: Ć ģ EILLINS = 18 É.fat Ą įEILLINS Į ė Ģ .fat Čgto.ss—#0õ€!Č.gto † .gto: Ą ź4Ē Ą ņ,2Ē Ģ @Ē Čiaar.s—#1õ€]Č.iaar † .iaar: Ć ķ Ć ī Ķ ē#2 É.unknown Ł .unknown Ć ģ Ć ė Ć ī × äĒ mul 4Ē Ąåī Ä åė Įķ  Čilar.s—#1õ€QČ.ilar † .ilar: Ć ķ Ć ī É.unknown Ķ ē#2 Ł .unknown Ć ģ Ć ė Į ķ É.lar2 Ģ .lar2 Činn.s—#1õ€”Č.inn † .inn: Ė ēī Ą ā8 šv ģ Ą åņ Äā2 Ä åė Ķ äķ jae 1f Œ Ąåī testb al,bitsĒ jz 1f  Ģ2f 1: ‡ 2: ‰ Ä ņ,ķ Ģ Ē ® bits: .byte 1,2,4,8,16,32,64,128 ior.s—#2õ€DČ.ior † .ior: ‰ Ąēš Ąéņ Äéķ sar ć1 1:  or ä(š) stow ß 1b Ąéī ĢĒ isar.s—#2õ€PČ.isar † .isar: Ć ķ Ć ė Ķ į2 É.unknown Ł .unknown Ć ģ Ć ė Į ķ É.sar2 Ģ .sar2 lar2.s—#3õ€•Č.lar2 † .lar2: Ćķ Ćī Įķ Įļ Ąčī × äĒ Ą ę4Ē imul ķ Ä čė sar ć1 jnb 1f Õ ah,ah lodb Š ‰ Į ė Ģ Ē 1: Ćī Ąä4Ē ‰ × ņ,ė Ąäš Ą éņ rep mov Ąéė Ąčī Ģ Ē Čloi.s—#4õ€rČ.loi † .loi: Ć ė Ąēļ Ąčģ » Ą äķ sar ć1 jnb 1f Õ ah,ah lodb Ąčī Į ė Ģ Ē 1: × ņ,ė Ąäš Ą éņ rep mov Ąčī Ąéė Ģ Ē mli4.s—#4õ€oČ.mli4 † yl=2 yh=4 .mli4: Ąåņ œ Ąęė mul yhĒ Ćī € Ąäī mul ylĒ Ćī Ä ēė Ą äķ Ąęī mul ylĒ Ä ēķ ‰ Äņ,#4 ĢĒ Čmon.s—#5õ€Č.mon † .mon: É.stop Ó .stop nop.s—#5õ€Č.nop † .nop:  rck.s—#6õ€]Č.rck † .rck: Ķ äĒ jl 2f Ķ ä2Ē jg 2f  2: Į ė ERANGE = 1 É.error Ą įERANGE Ó .error Ć ė  Črmi4.s—#8õ€ĪČ.rmi4 † yl=6 yh=8 xl=10 xh=12 .rmi4: Įļ Įš Ą čņ Ą åyl(ļ) Ą äyh(ļ) cwd Ķ ēė Ł 7f Ö ēī jge 1f ō ģ je 7f 1: Ė ēī Ą ęxl(ļ) Ą äxh(ļ) Ö äė jge 2f ō ė ō ķ sbb äī 2: šv ģ xchg äķ šv ģ Ė åģ 9: Ķ xh(ļ)ö jge 1f ō ģ ō ī sbb ā0 1: Ąäī Ąēģ Ćš Š ‰ Äņ,#8 ĢĒ 7: Ą éė Ė åģ Ö éš jge 1f ō š ō yl(ļ) sbb éģ 1: Ą äxl(ļ) Ą ēxh(ļ) Ö ēī jge 1f ō ī ō ė sbb ēģ 1: Ą ć16 1: shl į1 rcl ē#1 rcl ā1 Ķ éģ ja 3f jb 2f Ķ yl(ļ),ī jbe 2f 3: ß 1b Ģ 9b 2: × ēyl(ļ) sbb åš Ü ė ß 1b 1: Ģ 9b rmu4.s—#8õ€7Č.rmu4 † yl=6 yh=8 xl=10 xh=12 .rmu4: Įļ Įš Ą čņ Ą åyl(ļ) Ą äyh(ļ) or äė Ł 7f 1: Ė ēī Ą ęxl(ļ) Ą äxh(ļ) 2: šv ģ xchg äķ šv ģ Ė åģ 9: Ąäī Ąēģ Ćš Š ‰ Äņ,#8 ĢĒ 7: Ą éė Ė åģ Ą äxl(ļ) Ą ēxh(ļ) Ą ć16 1: shl į1 rcl ē#1 rcl ā1 Ķ éģ ja 3f jb 2f Ķ yl(ļ),ī jbe 2f 3: ß 1b Ģ 9b 2: × ēyl(ļ) sbb åš Ü ė ß 1b 1: Ģ 9b Čsar2.s—#9õ€‹Č.sar2 † .sar2: Ćķ Ćī Įķ xchg éī × äĒ Ą ę4Ē œ imul ķ Ćī Ä éė sar ć1 jnb 1f ‰ Ć ė stob Ąéī Ģ Ē 1: ‰ Ąäļ Ą čņ rep mov Ą ņ,ļ Ąčė Ąéī Ģ Ē Čsbi.s—#9õ€~Č.sbi † .sbi: Ć ģ Ķ ć2 Ł 1f Ć ķ × äķ ō ė Ģ Ē 1: Ķ ć4 Ł 9f Ć ī Ć ķ × ęė Ą äķ Ć ķ sbb ęī Į ķ Ģ Ē 9: É.trpilin Į ģ Ģ .trpilin set.s—#:õ€ŽČ.set † .set: Ć ģ Ė ēī ×ņ,ķ ¦ Įš Ą åņ Ėéš sar ć1 1: Ą 4(ģ_š),ī Üš Üš ß 1b Ą ā8 šv ģ Ķ äš jae 2f Ąéī Źdl,bits(š) Ą éņ Ä éė orb 4(š),dl Ćš  2: ESET = 2 É.error Ćš Ą įESET Ó.error  ® bits: .byte 1,2,4,8,16,32,64,128 sti.s—#;õ€gČ.sti † .sti: Ąēš Ć ė Ąéģ » sar ć1 jnb 1f Ć ė stob Ąéī Ģ Ē 1: Ąäļ Ą čņ rep mov Ą ņ,ļ Ąéī Ąčė Ģ Ē Čstrhp.s—#<õ€Č.strhp † É.reghp, .limhp, .fat EHEAP = 17 .strhp: ‰  Ą.reghp,ė Ķä.limhp jb 1f Äį01000 Öį0177000 Ą.limhp,ė Ķäņ jae 2f 1: ĢĒ 2: ĄįEHEAP Ģ.fat Čxor.ss—#>õ€BČ.xor † .xor: ‰ Ąēš Ąéņ Äéķ sar ć1 1:  Ėä(š) stow ß 1b Ąéī ĢĒ error.s—#.õ€†Č.error † .error: ƒ Įļ Įš œ Įķ ¦ € Ą ęė Ą ā1 sal åcl É.ignmask É.trp test å.ignmask Ł 2f Ó .trp 2: Ć ė Ć ģ Ć ķ Ć ī Ć š Ć ļ Ć ń  unknown.s—#=õ€>Č.unknown † É.fat EILLINS = 18 .unknown: Ą įEILLINS € Ģ .fat fat.sn.s—#/õ€,Č.fat † .fat: É.trp É.stop Ó .trp Ó .stop trp.sn.s—#=õ€pČ.trpšvz Č.trpilin Č.trpcase Č.trprang Č.trpset Č.trpnofp Č.trpheap Č.trp ³ .M: .zerow 24/2 † É.trpšvz É.trpilin É.trpcase É.trprang É.trpset É.trpnofp É.trpheap É.trp .trpšvz: Ąį6 Ąē#.Mšvz Ģ.Trp .trpilin: 8 Ąē#.Milin Ģ.Trp .trpcase: “0 Ąē#.Mcase Ģ.Trp .trprang:  Ąē#.Mrang Ģ.Trp .trpset: “ Ąē#.Mset Ģ.Trp .trpnofp: 8 Ąē#.Mnofp Ģ.Trp .trpheap: 7 Ąē#.Mheap Ģ.Trp .Trp: Ė åģ É.trppc xchg å.trppc test åģ jz 2f Į ė Ó Ē Ć ė  2: ž2 ¦ œ “ € Ó.Write Ó_exit .trp: Ąēė Ķē#21 jae 1f sal ē#1 Ąā.Mtable Äåī ĄåĒ test åģ jz 1f Ąēģ Ģ2f 1: Ąā.Mtrp+14 Ąć6 Ąēė 1: Öē#7 Äē'0' ŹĒ,dl óģ sar ē#1 sar ē#1 sar ē#1 ß 1b Ąē#.Mtrp 2: Ģ.Trp .Write: ƒ ‚ Ą.M+2,#4 ’ Ą.M+4,ģ › Ą.M+6,ģ Æ Ą.M+10,ģ Ąį.M €  €  Ąā.M Ąć3 int 32 … „  ® .Mtable: ø, .Mrang, .Mset, 0, 0, 0, .Mšvz, 0 ø, 0, 0, 0, 0, 0, 0, 0 ø, .Mheap, .Milin, .Milin, .Mcase .Mšvz: .asciz "Error: Diviļon by 0 \n" .Milin: .asciz "Illegal EM instruct'n\n" .Mcase: .asciz "Err in EM case instr \n" .Mrang: .asciz "Variable out of range\n" .Mset: .asciz "Err in EM set instr \n" .Mnofp: .asciz "Floating pt not impl.\n" .Mheap: .asciz "Heap overflow \n" .Mtrp: .asciz "EM trap 0000000 octal\n" stop.s.s—#<õ€Č.stop † .stop: Ó_exit Čret6.s.s—#6õ€6Č.6 † É.area .6: ‰ Ć.area Ć.area+2 Ć.area+4 ĢĒ ret8.s—#7õ€@Č.8 † É.area .8: ‰ Ć.area Ć.area+2 Ć.area+4 Ć.area+6 ĢĒ lfr6.s—#3õ€:Č.lfr6 † É.area .lfr6: ‰ Į.area+4 Į.area+2 Į.area ĢĒ lfr8.s—#4õ€DČ.lfr8 † É.area .lfr8: ‰ Į.area+6 Į.area+4 Į.area+2 Į.area ĢĒ retarea.s—#7õ€Č.area ³ .area: .zerow 8/2 blm.sa.s—#)õ€BČ.blm † .blm: Ąåņ Ąäļ Ąēš Ąé2Ē Ąč4Ē rep mov Ąčė Ąéī ‰ Äņ,#4 ĢĒ vars.s.s—#=õ€ƒČ.reghp, .limhp, .ignmask, .trppc É.reghp, .limhp, .ignmask, .trppc ® .reghp: Ā endbss .limhp: Ā endbss .ignmask: Ā 0 .trppc: Ā 0 Čreturn.s—#8õ€.define .sdret, .dsret, .sret, .dret, .cret .text .dsret: pop di .sret: pop si .cret: mov sp,bp pop bp ret .sdret: pop si .dret: pop di jmp .cret .cmi4.ss—#*õ€.define .cmi4 .text .cmi4: pop bx | return address pop cx pop dx pop ax push si mov si,sp xchg bx,2(si) pop si cmp bx,dx jg 1f jl 2f cmp ax,cx ja 1f je 3f 2: mov ax,#-1 ret 3: xor ax,ax ret 1: mov ax,#1 ret .crypt.s—#{ö€„Č_crypt É_crypt † _crypt: ƒ ‚ ×ņ,#76 Įļ Įš ³ _1: .zerow 14/2 † Ėčļ I0015: Ķč#67 jge I0012 Ź-67(ń_ļ)ö Üļ ĢI0015   Æ cmpb 1Ēö ŁI0017 Æ ĄäĪ Üė Ėęķ Źcl,Ē Įķ »  ŗ I0017: Æ Źal,1Ē ‹  sal äcl € Œ ‹ Ćķ ×ęė Ąā128 Ąäķ cwd išv ģ Ą-7Å,ī Ėčļ I001C: ’ cmpb Ēö je I0019 Ķč#8 jge I0019 Ėéš I00111: Ķé#7 jge I001E ’ Œ ‹ Ąęš Ąē#1 sal ēcl test ēė je I00113  € š4 I00113: ‡ € I00114: Ąć3 Ąäš sal äcl Ääļ Ūå-67(ń) Äåė  ŗ Üš š1 I001E: Ąć4 Ąäļ cwd išv ķ » ÄåĪ Œ ‹ € Ąäļ cwd išv ķ Ąęī  sal äcl Ćķ test ęė je I00116  push ax jmp I00117 I00116: ‡ € I00117: Ąäļ Äį56 Ūå-67(ń) Äåė  ŗ ÜÅ Üļ ĢI001C I0019: Æ Œ ‹ testb al,#1 je I00119  € šA I00119: ‡ € I0011A:  Ź-3(ń),al Æ Źal,1Ē ‹ testb al,#1 je I0011C  € šD I0011C: ‡ € I0011D:  ŹĘ,al test -7Å,#1 je I0011F  € ĢI00120 I0011F: ‡ € I00120:  Ź-1(ń),al I00122: Ąä-7Å ó-7Å ™ ±1 Ąč#65 I00127: or čļ jl I00124 Ąäļ Üė Ūå-67(ń) Äåė Źal,-67(ń_ļ) ŗ óļ ĢI00127 I00124: Źal,-1(ń) Ź-67(ń),al ĢI00122 I00121: Ėčļ I0012B: Ķč#12 jge I00128 Ąäļ Äį2 » Ź_1Ēö Ėéš I0012F: Ķé#6 jge I0012C Ąäļ Äį2 » Äā_1 Ą-7Ī,ģ Ąå-7Ī Œ ‹ € Ąį6 mul ļ Äax,di lea bx,-67(ń) Äåė cmpb Ēö je I00131 Ąęš  sal äcl € ­2 I00131: ‡ € I00132:  Ćķ or äķ Ąå-7Ī ŗ Üš ĢI0012F I0012C: Ąäļ Äį2 » Äā_1 Ą-7Ī,ģ Ąå-7Ī Œ ‹ Äį48 ŗ Ąäļ Äį2 » Źal,_1Ē ‹ Ķį57 jle I00134 Ąäļ Äį2 » Äā_1 Ą-7Ī,ģ Ąå-7Ī Œ ‹ Äį7 ŗ I00134: Ąäļ Äį2 » Źal,_1Ē ‹ Ķį90 jle I00129 Ąäļ Äį2 » Äā_1 Ą-7Ī,ģ Ąå-7Ī Œ ‹ Äį6 ŗ I00129: Üļ ĢI0012B I00128: Æ Źbl,Ē Ź_1,bl Æ Źbl,1Ē Ź_1+1,bl Ź_1+13ö Ąį_1 jmp .dsret Čportio.s›#{õ€ĻČ_port_out, _port_in, _peek _port_out: ¦ Ąåņ € œ Ąē4Ē Ąä6Ē out Ćī  ‰  _port_in: ¦ Ąåņ € œ Ąē4Ē in Ž Ąå6Ē ° Ćī  ‰  _peek: ƒ ‚ Įes Ąes,Å Æ seg es Œ Ž Ćes „  Če’abort.c–#»¤C#include abort() { return(kill(getpid(), SIGIOT)); } #abs.cc–#»¤#abs(i){ return i < 0 ? -i : i; } aaccess.c–# »¤t#include "lib.h" PUBLIC int access(name, mode) char *name; int mode; { return callm3(FS, ACCESS, mode, name); } alarm.c–# »¤‚#include "lib.h" PUBLIC int alarm(sec) unsigned sec; { return callm1(MM, ALARM, (int) sec, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); } amoeba.c–# »€7/* * Library routines for Amoeba Transactions * compile with cc -c -LIB -Di8088 amoeba.c */ #define AMOEBA #include "lib.h" #include #include #include static unshort Timeout = 300; /* default timeout = 30 seconds */ PRIVATE message mess; PUBLIC unshort trans(h1, b1, c1, h2, b2, c2) header * h1; bufptr b1; unshort c1; header * h2; bufptr b2; unshort c2; { int r; Trpar params; /* set up parameter block */ params.tp_par[0].p_hdr = h1; params.tp_par[0].p_buf = b1; params.tp_par[0].p_cnt = c1; params.tp_par[1].p_hdr = h2; params.tp_par[1].p_buf = b2; params.tp_par[1].p_cnt = c2; params.tp_maxloc = Timeout; /* set up message to send to fileserver */ mess.m_type = AM_SYSCALL; mess.AM_OP = AM_TRANS; mess.AM_ADDRESS = (char *)¶ms; mess.AM_COUNT = sizeof params; if ((r = sendrec(MM, &mess)) != OK) return r; return (unshort)mess.m_type; } PUBLIC unshort getreq(h, b, c) header * h; bufptr b; unshort c; { int r; Trpar params; /* set up parameter block */ params.tp_par[0].p_hdr = h; params.tp_par[0].p_buf = b; params.tp_par[0].p_cnt = c; /* set up message to send to fileserver */ mess.m_type = AM_SYSCALL; mess.AM_OP = AM_GETREQ; mess.AM_ADDRESS = (char *)¶ms; mess.AM_COUNT = sizeof params; if ((r = sendrec(MM, &mess)) != OK) return r; return (unshort)mess.m_type; } PUBLIC unshort putrep(h, b, c) header * h; bufptr b; unshort c; { int r; Trpar params; /* set up parameter block */ params.tp_par[0].p_hdr = h; params.tp_par[0].p_buf = b; params.tp_par[0].p_cnt = c; /* set up message to send to fileserver */ mess.m_type = AM_SYSCALL; mess.AM_OP = AM_PUTREP; mess.AM_ADDRESS = (char *)¶ms; mess.AM_COUNT = sizeof params; if ((r = sendrec(MM, &mess)) != OK) return r; return (unshort)mess.m_type; } PUBLIC unshort timeout(t) /* set locate timeout in milliseconds */ unshort t; { unshort oldtimeout = Timeout; if (t >=0 ) Timeout = t; return oldtimeout; } /atoi.cc–# »¤#define isascii(c) (((unsigned) (c) & 0xFF) < 0200) /* For all the following functions the parameter must be ASCII */ #define _between(a,b,c) ((unsigned) ((b) - (a)) < (c) - (a)) #define isupper(c) _between('A', c, 'Z') #define islower(c) _between('a', c, 'z') #define isdigit(c) _between('0', c, '9') #define isprint(c) _between(' ', c, '~') /* The others are problematic as the parameter may only be evaluated once */ static _c_; /* used to store the evaluated parameter */ #define isalpha(c) (isupper(_c_ = (c)) || islower(_c_)) #define isalnum(c) (isalpha(c) || isdigit(_c_)) #define _isblank(c) ((_c_ = (c)) == ' ' || _c_ == '\t') #define isspace(c) (_isblank(c) || _c_=='\r' || _c_=='\n' || _c_=='\f') #define iscntrl(c) ((_c_ = (c)) == 0177 || _c_ < ' ') atoi(s) register char *s; { register int total = 0; register unsigned digit; register minus = 0; while (isspace(*s)) s++; if (*s == '-') { s++; minus = 1; } while ((digit = *s++ - '0') < 10) { total *= 10; total += digit; } return(minus ? -total : total); } atol.cc–# »¤4#include long atol(s) register char *s; { register long total = 0; register unsigned digit; register minus = 0; while (isspace(*s)) s++; if (*s == '-') { s++; minus = 1; } while ((digit = *s++ - '0') < 10) { total *= 10; total += digit; } return(minus ? -total : total); } bcmp.cc–# »€ļ/* bcmp(3) * * Author: Terrence W. Holm Sep. 1988 */ int bcmp( vector1, vector2, count ) char *vector1; char *vector2; int count; { int word_count = count / sizeof(int); int byte_count = count & ( sizeof(int) - 1 ); if ( vector1 == vector2 ) return( 0 ); while( --word_count >= 0 ) if ( *((int *) vector1)++ != *((int *) vector2)++ ) return( 1 ); while( --byte_count >= 0 ) if ( *vector1++ != *vector2++ ) return( 1 ); return( 0 ); } /bcopy.c–# »¤tbcopy(old, new, n) register char *old, *new; int n; { /* Copy a block of data. */ while (n--) *new++ = *old++; } brk.cc–# »¤#include "lib.h" extern char *brksize; PUBLIC char *brk(addr) char *addr; { int k; k = callm1(MM, BRK, 0, 0, 0, addr, NIL_PTR, NIL_PTR); if (k == OK) { brksize = M.m2_p1; return(NIL_PTR); } else { return( (char*) -1 ); } } PUBLIC char *sbrk(incr) int incr; { char *newsize, *oldsize; oldsize = brksize; newsize = brksize + incr; if (incr > 0 && newsize < oldsize || incr < 0 && newsize > oldsize) return( (char *) -1); if (brk(newsize) == 0) return(oldsize); else return( (char *) -1 ); } brk2.c–# »¤€#include "lib.h" PUBLIC brk2() { char *p1, *p2; p1 = (char *) get_size(); callm1(MM, BRK2, 0, 0, 0, p1, p2, NIL_PTR); } bsearch.c–# »€ę/* bsearch(3) * * Author: Terrence Holm Aug. 1988 * * * Performs a binary search for a given within a sorted * table. The table contains entries of size * and starts at . * * Entries are compared using keycmp( key, entry ), each argument * is a (char *), the function returns an int < 0, = 0 or > 0 * according to the order of the two arguments. * * Bsearch(3) returns a pointer to the matching entry, if found, * otherwise NULL is returned. */ #define NULL (char *) 0 char *bsearch( key, base, count, width, keycmp ) char *key; char *base; unsigned int count; unsigned int width; int (*keycmp)(); { char *mid_point; int cmp; while ( count > 0 ) { mid_point = base + width * (count >> 1); cmp = keycmp( key, mid_point ); if ( cmp == 0 ) return( mid_point ); if ( cmp < 0 ) count >>= 1; else { base = mid_point + width; count = (count - 1) >> 1; } } return( NULL ); } bzero.cc–# »€I/* bzero(3) * * Author: Terrence W. Holm Sep. 1988 */ bzero( vector, count ) char *vector; int count; { int word_count = count / sizeof(int); int byte_count = count & ( sizeof(int) - 1 ); while( --word_count >= 0 ) *((int *) vector)++ = 0; while( --byte_count >= 0 ) *vector++ = 0; } /call.cc–# »¤#include "lib.h" PUBLIC int errno; /* place where error numbers go */ PUBLIC int callm1(proc, syscallnr, int1, int2, int3, ptr1, ptr2, ptr3) int proc; /* FS or MM */ int syscallnr; /* which system call */ int int1; /* first integer parameter */ int int2; /* second integer parameter */ int int3; /* third integer parameter */ char *ptr1; /* pointer parameter */ char *ptr2; /* pointer parameter */ char *ptr3; /* pointer parameter */ { /* Send a message and get the response. The 'M.m_type' field of the * reply contains a value (>= 0) or an error code (<0). Use message format m1. */ M.m1_i1 = int1; M.m1_i2 = int2; M.m1_i3 = int3; M.m1_p1 = ptr1; M.m1_p2 = ptr2; M.m1_p3 = ptr3; return callx(proc, syscallnr); } PUBLIC int callm3(proc, syscallnr, int1, name) int proc; /* FS or MM */ int syscallnr; /* which system call */ int int1; /* integer parameter */ char *name; /* string */ { /* This form of system call is used for those calls that contain at most * one integer parameter along with a string. If the string fits in the * message, it is copied there. If not, a pointer to it is passed. */ register int k; register char *rp; k = len(name); M.m3_i1 = k; M.m3_i2 = int1; M.m3_p1 = name; rp = &M.m3_ca1[0]; if (k <= M3_STRING) while (k--) *rp++ = *name++; return callx(proc, syscallnr); } PUBLIC int callx(proc, syscallnr) int proc; eghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ”¢£¤„¦§Ø©Ŗ«¬­®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪ/* FS or MM */ int syscallnr; /* which system call */ { /* Send a message and get the response. The 'M.m_type' field of the * reply contains a value (>= 0) or an error code (<0). */ int k; M.m_type = syscallnr; k = sendrec(proc, &M); if (k != OK) return(k); /* send itself failed */ if (M.m_type < 0) {errno = -M.m_type; return(-1);} return(M.m_type); } PUBLIC int len(s) register char *s; /* character string whose length is needed */ { /* Return the length of a character string, including the 0 at the end. */ register int k; k = 0; while (*s++ != 0) k++; return(k+1); /* return length including the 0-byte at end */ } chdir.cc–#»¤_#include "lib.h" PUBLIC int chdir(name) char *name; { return callm3(FS, CHDIR, 0, name); } #chmod.cc–#»¤r#include "lib.h" PUBLIC int chmod(name, mode) char* name; int mode; { return callm3(FS, CHMOD, mode, name); } chown.cc–#»¤ #include "lib.h" PUBLIC int chown(name, owner, grp) char *name; int owner, grp; { return callm1(FS, CHOWN, len(name), owner, grp, name, NIL_PTR, NIL_PTR); } chroot.c–#»¤a#include "lib.h" PUBLIC int chroot(name) char* name; { return callm3(FS, CHROOT, 0, name); } #cleanup.c–#»¤Ž#include _cleanup() { register int i; for ( i = 0 ; i < NFILES ; i++ ) if ( _io_table[i] != NULL ) fflush(_io_table[i]); } close.cc–#»¤u#include "lib.h" PUBLIC int close(fd) int fd; { return callm1(FS, CLOSE, fd, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); } #creat.cc–#»¤q#include "lib.h" PUBLIC int creat(name, mode) char* name; int mode; { return callm3(FS, CREAT, mode, name); } #crypt.cc–#»¤pchar *crypt(pw, salt) char *pw, *salt; { static char buf[14]; register char bits[67]; register int i; register int j, rot; for (i=0; i < 67; i++) bits[i] = 0; if (salt[1] == 0) salt[1] = salt[0]; rot = (salt[1] * 4 - salt[0]) % 128; for (i=0; *pw && i < 8; i++) { for (j=0; j < 7; j++) bits[i+j*8] = (*pw & (1 << j) ? 1 : 0); bits[i+56] = (salt[i / 4] & (1 << (i % 4)) ? 1 : 0); pw++; } bits[64] = (salt[0] & 1 ? 1 : 0); bits[65] = (salt[1] & 1 ? 1 : 0); bits[66] = (rot & 1 ? 1 : 0); while (rot--) { for (i=65; i >= 0; i--) bits[i+1] = bits[i]; bits[0] = bits[66]; } for (i=0; i < 12; i++) { buf[i+2] = 0; for (j=0; j < 6; j++) buf[i+2] |= (bits[i*6+j] ? (1 << j) : 0); buf[i+2] += 48; if (buf[i+2] > '9') buf[i+2] += 7; if (buf[i+2] > 'Z') buf[i+2] += 6; } buf[0] = salt[0]; buf[1] = salt[1]; buf[13] = '\0'; return(buf); } ctermid.c–#»€k/* ctermid(3) * * Author: Terrence Holm Aug. 1988 * * * Ctermid(3) returns a pointer to a string naming the controlling * terminal. If is NULL then local static storage * is used, otherwise must point to storage of at * least L_ctermid characters. * * Returns a pointer to "/dev/tty". */ #include #ifndef L_ctermid #define L_ctermid 9 #endif char *ctermid( name_space ) char *name_space; { static char termid[ L_ctermid ]; if ( name_space == NULL ) name_space = termid; strcpy( name_space, "/dev/tty" ); return( name_space ); } /ctime.cc–#»¤Ø#include static int days_per_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; static char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; static char *days[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; #define MIN 60L /* # seconds in a minute */ #define HOUR (60 * MIN) /* # seconds in an hour */ #define DAY (24 * HOUR) /* # seconds in a day */ #define YEAR (365 * DAY) /* # seconds in a year */ static struct tm tm; static char buf[26]; char *ctime(pt) long *pt; { register long t = *pt; long year; tm.tm_year = 0; tm.tm_mon = 0; tm.tm_mday = 1; tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; /* t is elapsed time in seconds since Jan 1, 1970. */ tm.tm_wday = (int) (t/DAY + 4L) % 7; /* Jan 1, 1970 is 4th wday */ while (t >= (year=((tm.tm_year%4)==2) ? YEAR+DAY : YEAR)) { tm.tm_year += 1; t -= year; } tm.tm_year += 1970; /* t is now the offset into the current year, in seconds. */ tm.tm_yday = (t/DAY); /* day # of the year, Jan 1 = 0 */ days_per_month[1] = 28; if ((tm.tm_year % 4) == 0) /* check for leap year */ days_per_month[1]++; /* Compute month. */ while (t >= (days_per_month[tm.tm_mon] * DAY)) t -= days_per_month[tm.tm_mon++] * DAY; /* Month established, now compute day of the month */ while (t >= DAY) { t -= DAY; tm.tm_mday++; } /* Day established, now do hour. */ while (t >= HOUR) { t -= HOUR; tm.tm_hour++; } /* Hour established, now do minute. */ while (t >= MIN) { t -= MIN; tm.tm_min++; } /* Residual time is # seconds. */ tm.tm_sec = (int) t; /* Generate output in ASCII in buf. */ sprintf(buf, "%s %s %2d %02d:%02d:%02d %d\n", days[tm.tm_wday], months[tm.tm_mon], tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_year); return buf; } struct tm *localtime(pt) long *pt; { ctime(pt); return &tm; } struct tm *gmtime(pt) long *pt; { ctime(pt); return &tm; } ctype.cc–#»¤a#include char _ctype_[] = { 0, _C, _C, _C, _C, _C, _C, _C, _C, _C, _S, _S, _S, _S, _S, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C, _S, _P, _P, _P, _P, _P, _P, _P, _P, _P, _P, _P, _P, _P, _P, _P, _N, _N, _N, _N, _N, _N, _N, _N, _N, _N, _P, _P, _P, _P, _P, _P, _P, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _P, _P, _P, _P, _P, _P, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _P, _P, _P, _P, _C }; #cuserid.c–#»€)/* cuserid(3) * * Author: Terrence W. Holm Sept. 1987 */ #include #include #ifndef L_cuserid #define L_cuserid 9 #endif extern struct passwd *getpwuid(); char *cuserid( user_name ) char *user_name; { static char userid[ L_cuserid ]; struct passwd *pw_entry; if ( user_name == NULL ) user_name = userid; pw_entry = getpwuid( geteuid() ); if ( pw_entry == NULL ) { *user_name = '\0'; return( NULL ); } strcpy( user_name, pw_entry->pw_name ); return( user_name ); } /doprintf.c–#»¤#include /* * three compile time options: * STACKUP fetch arguments using *p-- instead of *p++ * NO_LONGD %d and %ld/%D are equal * NO_FLOAT abort on %e, %f and %g */ #define NO_FLOAT #ifdef NO_FLOAT #define MAXDIG 11 /* 32 bits in radix 8 */ #else #define MAXDIG 128 /* this must be enough */ #endif static char * _itoa(p, num, radix) register char *p; register unsigned num; register radix; { register i; register char *q; q = p + MAXDIG; do { i = (int)(num % radix); i += '0'; if (i > '9') i += 'A' - '0' - 10; *--q = i; } while (num = num / radix); i = p + MAXDIG - q; do *p++ = *q++; while (--i); return(p); } #ifndef NO_LONGD static char * ltoa(p, num, radix) register char *p; register unsigned long num; register radix; { register i; register char *q; q = p + MAXDIG; do { i = (int)(num % radix); i += '0'; if (i > '9') i += 'A' - '0' - 10; *--q = i; } while (num = num / radix); i = p + MAXDIG - q; do *p++ = *q++; while (--i); return(p); } #endif #ifndef NO_FLOAT extern char *_ecvt(); extern char *_fcvt(); extern char *_gcvt(); #endif #ifdef STACKUP #define GETARG(typ) *((typ *)args)-- #else #define GETARG(typ) *((typ *)args)++ #endif STACKUP _doprintf(iop, fmt, args) FILE *iop; register char *fmt; register int *args; { char buf[MAXDIG+1]; /* +1 for sign */ register char *p; register char *s; register c; register i; register short width; register short ndigit; register ndfnd; register ljust; register zfill; #ifndef NO_LONGD register lflag; register long l; #endif for (;;) { c = *fmt++; if (c == 0) return; if (c != '%') { putc(c, iop); continue; } p = buf; s = buf; ljust = 0; if (*fmt == '-') { fmt++; ljust++; } zfill = ' '; if (*fmt == '0') { fmt++; zfill = '0'; } for (width = 0;;) { c = *fmt++; if (c >= '0' && c <= '9') c -= '0'; else if (c == '*') c = GETARG(int); else break; width *= 10; width += c; } ndfnd = 0; ndigit = 0; if (c == '.') { for (;;) { c = *fmt++; if (c >= '0' && c <= '9') c -= '0'; else if (c == '*') c = GETARG(int); else break; ndigit *= 10; ndigit += c; ndfnd++; } } #ifndef NO_LONGD lflag = 0; #endif if (c == 'l' || c == 'L') { #ifndef NO_LONGD lflag++; #endif if (*fmt) c = *fmt++; } switch (c) { case 'X': #ifndef NO_LONGD lflag++; #endif case 'x': c = 16; goto oxu; case 'U': #ifndef NO_LONGD lflag++; #endif case 'u': c = 10; goto oxu; case 'O': #ifndef NO_LONGD lflag++; #endif case 'o': c = 8; oxu: #ifndef NO_LONGD if (lflag) { p = ltoa(p, GETARG(long), c); break; } #endif p = _itoa(p, GETARG(int), c); break; case 'D': #ifndef NO_LONGD lflag++; #endif case 'd': #ifndef NO_LONGD if (lflag) { if ((l = GETARG(long)) < 0) { *p++ = '-'; l = -l; } p = ltoa(p, l, 10); break; } #endif if ((i = GETARG(int)) < 0) { *p++ = '-'; i = -i; } p = _itoa(p, i, 10); break; #ifdef NO_FLOAT case 'e': case 'f': case 'g': zfill = ' '; *p++ = '?'; break; #else case 'e': if (ndfnd == 0) ndigit = 6; ndigit++; p = _ecvt(p, GETARG(double), ndigit); break; case 'f': if (ndfnd == 0) ndigit = 6; p = _fcvt(p, GETARG(double), ndigit); break; case 'g': if (ndfnd == 0) ndigit = 6; p = _gcvt(p, GETARG(double), ndigit); break; #endif case 'c': zfill = ' '; *p++ = GETARG(int); break; case 's': zfill = ' '; if ((s = GETARG(char *)) == 0) s = "(null)"; if (ndigit == 0) ndigit = 32767; for (p = s; *p && --ndigit >= 0; p++) ; break; default: *p++ = c; break; } i = p - s; if ((width -= i) < 0) width = 0; if (ljust == 0) width = -width; if (width < 0) { if (*s == '-' && zfill == '0') { putc(*s++, iop); i--; } do putc(zfill, iop); while (++width != 0); } while (--i >= 0) putc(*s++, iop); while (width) { putc(zfill, iop); width--; } } } dup.ctf.c–#»¤p#include "lib.h" PUBLIC int dup(fd) int fd; { return callm1(FS, DUP, fd, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); } dup2.cf.c–#»¤‚#include "lib.h" PUBLIC int dup2(fd, fd2) int fd, fd2; { return callm1(FS, DUP, fd+0100, fd2, 0, NIL_PTR, NIL_PTR, NIL_PTR); } exec.cf.c–#»¤ #include "lib.h" extern char **environ; /* environment pointer */ #define PTRSIZE sizeof(char *) PUBLIC int execl(name, arg0) char *name; char *arg0; { return execve(name, &arg0, environ); } PUBLIC int execle(name, argv) char *name, *argv; { char **p; p = (char **) &argv; while (*p++) /* null statement */ ; return execve(name, &argv, *p); } PUBLIC int execv(name, argv) char *name, *argv[]; { return execve(name, argv, environ); } PUBLIC int execve(name, argv, envp) char *name; /* pointer to name of file to be executed */ char *argv[]; /* pointer to argument array */ char *envp[]; /* pointer to environment */ { char stack[MAX_ISTACK_BYTES]; char **argorg, **envorg, *hp, **ap, *p; int i, nargs, nenvps, stackbytes, offset; extern errno; /* Count the argument pointers and environment pointers. */ nargs = 0; nenvps = 0; argorg = argv; envorg = envp; while (*argorg++ != NIL_PTR) nargs++; while (*envorg++ != NIL_PTR) nenvps++; /* Prepare to set up the initial stack. */ hp = &stack[(nargs + nenvps + 3) * PTRSIZE]; if (hp + nargs + nenvps >= &stack[MAX_ISTACK_BYTES]) { errno = E2BIG; return(-1); } ap = (char **) stack; *ap++ = (char *) nargs; /* Prepare the argument pointers and strings. */ for (i = 0; i < nargs; i++) { offset = hp - stack; *ap++ = (char *) offset; p = *argv++; while (*p) { *hp++ = *p++; if (hp >= &stack[MAX_ISTACK_BYTES]) { errno = E2BIG; return(-1); } } *hp++ = (char) 0; } *ap++ = NIL_PTR; /* Prepare the environment pointers and strings. */ for (i = 0; i < nenvps; i++) { offset = hp - stack; *ap++ = (char *) offset; p = *envp++; while (*p) { *hp++ = *p++; if (hp >= &stack[MAX_ISTACK_BYTES]) { errno = E2BIG; return(-1); } } *hp++ = (char) 0; } *ap++ = NIL_PTR; stackbytes = ( ( (int)(hp - stack) + PTRSIZE - 1)/PTRSIZE) * PTRSIZE; return callm1(MM_PROC_NR, EXEC, len(name), stackbytes, 0,name, stack,NIL_PTR); } PUBLIC execn(name) char *name; /* pointer to file to be exec'd */ { /* Special version used when there are no args and no environment. This call * is principally used by INIT, to avoid having to allocate MAX_ISTACK_BYTES. */ static char stack[3 * PTRSIZE]; return callm1(MM_PROC_NR, EXEC, len(name), sizeof(stack), 0, name, stack, NIL_PTR); } #execlp.cc–#»€B/* execlp(3) and execvp(3) * * Author: Terrence W. Holm July 1988 */ /* * Execlp(3) and execvp(3) are like execl(3) and execv(3), * except that they use the environment variable $PATH as * a search list of possible locations for the executable * file, if does not start with a '/'. * * The path search list is a list of directory names separated * by ':'s. If a colon appears at the beginning or end of the * list, or two appear together, then an empty prefix is * tried. If $PATH is not in the environment, it defaults to * ":/bin:/usr/bin". * * For example, if is "sh", and the $PATH is * ":/bin:/usr/local:/usr/bin", then the attempts will be: * "sh", "/bin/sh", "/usr/local/sh" and "/usr/bin/sh". * * If the is not an executable file in one of the * directories, then -1 is returned. */ #include /* #include */ /* #include */ #ifndef X_OK #define X_OK 1 #endif #define NULL (char *) 0 extern char *index(); extern char *getenv(); extern char **environ; extern int errno; execlp( file, arg0 ) char *file; char *arg0; { return( execvp( file, &arg0 ) ); } execvp( file, argv ) char *file; char *argv[]; { char path_name[100]; char *next; char *path = getenv( "PATH" ); if ( path == NULL ) path = ":/bin:/usr/bin"; if ( file[0] == '/' ) path = ""; do { next = index( path, ':' ); if ( next == NULL ) strcpy( path_name, path ); else { *path_name = '\0'; strncat( path_name, path, next - path ); path = next + 1; } if ( *path_name != '\0' ) strcat( path_name, "/" ); strcat( path_name, file ); if ( access( path_name, X_OK ) == 0 ) execve( path_name, argv, environ ); } while ( next != NULL ); errno = ENOENT; return( -1 ); } exit.ccc–#»¤*#include "lib.h" PUBLIC int (*__cleanup)(); PUBLIC int exit(status) int status; { if (__cleanup) (*__cleanup)(); return callm1(MM, EXIT, status, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); } PUBLIC int _exit(status) int status; { return callm1(MM, EXIT, status, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); } fclose.cc–#»¤:#include fclose(fp) FILE *fp; { register int i; for (i=0; i= NFILES) return(EOF); fflush(fp); close(fp->_fd); if ( testflag(fp,IOMYBUF) && fp->_buf ) free( fp->_buf ); if (i > 2) free(fp); return(NULL); } fdopen.cc–#»€>/* fdopen - YAH (yet another hack) hacked from fopen.c */ #include #define PMODE 0644 FILE *fdopen(fd,mode) int fd; char *mode; { register int i; FILE *fp; char *malloc(); int flags = 0; for (i = 0; _io_table[i] != 0 ; i++) if ( i >= NFILES ) return(NULL); switch(*mode){ case 'w': flags |= WRITEMODE; break; case 'a': flags |= WRITEMODE; lseek(fd,0L,2); break; case 'r': flags |= READMODE; break; default: return(NULL); } if (( fp = (FILE *) malloc (sizeof( FILE))) == NULL ) return(NULL); fp->_count = 0; fp->_fd = fd; fp->_flags = flags; fp->_buf = malloc( BUFSIZ ); if ( fp->_buf == NULL ) fp->_flags |= UNBUFF; else fp->_flags |= IOMYBUF; fp->_ptr = fp->_buf; _io_table[i] = fp; return(fp); } fflush.cc–#»¤d#include fflush(iop) FILE *iop; { int count; if ( testflag(iop,UNBUFF) || !testflag(iop,WRITEMODE) ) return(0); if ( iop->_count <= 0 ) return(0); count = write(iop->_fd,iop->_buf,iop->_count); if ( count == iop->_count) { iop->_count = 0; iop->_ptr = iop->_buf; return(count); } iop->_flags |= _ERR; return(EOF); } ffs.c.cc–#»€ą/* ffs(3) * * Author: Terrence W. Holm Sep. 1988 */ int ffs( word ) int word; { int i; if ( word == 0 ) return( 0 ); for ( i = 1; ; ++i, word >>= 1 ) if ( word & 1 ) return( i ); } fgetc.cc–#»€i#include fgetc(iop) FILE *iop; { int ch; if ( testflag(iop, (_EOF | _ERR ))) return (EOF); if ( !testflag(iop, READMODE) ) return (EOF); if (iop->_count <= 0){ if ( testflag(iop, UNBUFF) ) iop->_count = read(iop->_fd,&ch,1); else iop->_count = read(iop->_fd,iop->_buf,BUFSIZ); if (iop->_count <= 0){ if (iop->_count == 0) iop->_flags |= _EOF; else iop->_flags |= _ERR; return (EOF); } else iop->_ptr = iop->_buf; } iop->_count--; /* account one char */ if (testflag(iop,UNBUFF)) return (ch & CMASK); else return (*iop->_ptr++ & CMASK); } #fgets.cc–#»¤1#include char *fgets(str, n, file) char *str; unsigned n; FILE *file; { register int ch; register char *ptr; ptr = str; while ( --n > 0 && (ch = getc(file)) != EOF){ *ptr++ = ch; if ( ch == '\n') break; } if (ch == EOF && ptr==str) return(NULL); *ptr = '\0'; return(str); } #fopen.cc–#»¤Ł#include #include #include "lib.h" #define PMODE 0666 FILE *fopen(name,mode) char *name , *mode; { register int i; FILE *fp; char *malloc(); int fd, flags = 0; for (i = 0; _io_table[i] != 0 ; i++) if ( i >= NFILES ) return(NULL); switch(*mode){ case 'w': flags |= WRITEMODE; if (( fd = creat (name,PMODE)) < 0) return(NULL); break; case 'a': flags |= WRITEMODE; if (( fd = open(name,1)) < 0 ) if(errno != ENOENT || (fd = creat(name, PMODE)) < 0) return(NULL); lseek(fd,0L,2); break; case 'r': flags |= READMODE; if (( fd = open (name,0)) < 0 ) return(NULL); break; default: return(NULL); } if (( fp = (FILE *) malloc (sizeof( FILE))) == NULL ) return(NULL); fp->_count = 0; fp->_fd = fd; fp->_flags = flags; fp->_buf = malloc( BUFSIZ ); if ( fp->_buf == NULL ) fp->_flags |= UNBUFF; else fp->_flags |= IOMYBUF; fp->_ptr = fp->_buf; _io_table[i] = fp; return(fp); } #fork.cc–#»¤g#include "lib.h" PUBLIC int fork() { return callm1(MM, FORK, 0, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); } #fprintf.c–#»¤5#include fprintf (file, fmt, args) FILE *file; char *fmt; int args; { _doprintf (file, fmt, &args); if ( testflag(file,PERPRINTF) ) fflush(file); } printf (fmt, args) char *fmt; int args; { _doprintf (stdout, fmt, &args); if ( testflag(stdout,PERPRINTF) ) fflush(stdout); } #fputc.cc–#»€Ń#include extern int (*__cleanup)(); extern int _cleanup(); fputc(ch, iop) char ch; FILE *iop; { int n, didwrite = 0; if (testflag(iop, (_ERR | _EOF))) return (EOF); if ( !testflag(iop,WRITEMODE)) return(EOF); if ( testflag(iop,UNBUFF)){ n = write(iop->_fd,&ch,1); iop->_count = 1; didwrite++; } else{ __cleanup = _cleanup; *iop->_ptr++ = ch; if ((++iop->_count) >= BUFSIZ && !testflag(iop,STRINGS) ){ n = write(iop->_fd,iop->_buf,iop->_count); iop->_ptr = iop->_buf; didwrite++; } } if (didwrite){ if (n<=0 || iop->_count != n){ if (n < 0) iop->_flags |= _ERR; else iop->_flags |= _EOF; return (EOF); } iop->_count=0; } return(ch & CMASK); } #fputs.cc–#»¤f#include fputs(s,file) register char *s; FILE *file; { while ( *s ) putc(*s++,file); } fread.cc–#»¤^#include fread(ptr, size, count, file) char *ptr; unsigned size, count; FILE *file; { register int c; unsigned ndone = 0, s; ndone = 0; if (size) while ( ndone < count ) { s = size; do { if ((c = getc(file)) != EOF) *ptr++ = (char) c; else return(ndone); } while (--s); ndone++; } return(ndone); } freopen.c–#»¤Æ#include FILE *freopen(name,mode,stream) char *name,*mode; FILE *stream; { FILE *fopen(); if ( fclose(stream) != 0 ) return NULL; return fopen(name,mode); } #fseek.cc–#»¤É#include fseek(iop, offset, where) FILE *iop; long offset; { int count; long lseek(); long pos = -1L; iop->_flags &= ~(_EOF | _ERR); /* Clear both the end of file and error flags */ if ( testflag(iop,READMODE) ) { if ( where < 2 && iop->_buf && !testflag(iop,UNBUFF) ) { count = iop->_count; pos = offset; if ( where == 0 ) { long L_tmp = lseek(fileno(iop), 0L, 1); /* determine where we are */ pos += (long) count - L_tmp; } else offset -= (long) count; if ( count > 0 && pos <= (long) count && pos >= (long) iop->_buf - (long) iop->_ptr ) { iop->_ptr += (int) pos; iop->_count -= (int) pos; return(0); } if (where == 1) offset += (long) count; /* restore offset */ } pos = lseek(fileno(iop), offset, where); iop->_count = 0; } else if ( testflag(iop,WRITEMODE) ) { fflush(iop); pos = lseek(fileno(iop), offset, where); } return((pos == -1L) ? -1 : 0 ); } #fstat.cc–#»¤œ#include "lib.h" PUBLIC int fstat(fd, buffer) int fd; char *buffer; { int n; n = callm1(FS, FSTAT, fd, 0, 0, buffer, NIL_PTR, NIL_PTR); return(n); } ftell.cc–#»¤—#include long ftell(iop) FILE *iop; { long result; long lseek(); int adjust = 0; if ( testflag(iop,READMODE) ) adjust -= iop->_count; else if ( testflag(iop,WRITEMODE) && iop->_buf && !testflag(iop,UNBUFF)) adjust = iop->_ptr - iop->_buf; else return(-1); result = lseek(fileno(iop), 0L, 1); if ( result < 0 ) return ( result ); result += (long) adjust; return(result); } #fwrite.c–#»¤;#include fwrite(ptr, size, count, file) unsigned size, count; char *ptr; FILE *file; { unsigned s; unsigned ndone = 0; if (size) while ( ndone < count ) { s = size; do { putc(*ptr++, file); if (ferror(file)) return(ndone); } while (--s); ndone++; } return(ndone); } #getc.cc–#»¤h#include getc(iop) FILE *iop; { int ch; if ( testflag(iop, (_EOF | _ERR ))) return (EOF); if ( !testflag(iop, READMODE) ) return (EOF); if (iop->_count <= 0){ if ( testflag(iop, UNBUFF) ) iop->_count = read(iop->_fd,&ch,1); else iop->_count = read(iop->_fd,iop->_buf,BUFSIZ); if (iop->_count <= 0){ if (iop->_count == 0) iop->_flags |= _EOF; else iop->_flags |= _ERR; return (EOF); } else iop->_ptr = iop->_buf; } iop->_count--; /* account one char */ if (testflag(iop,UNBUFF)) return (ch & CMASK); else return (*iop->_ptr++ & CMASK); } getcwd.c–#»€ą /* getcwd(3) * * Author: Terrence W. Holm Aug. 1988 * * Directly derived from Adri Koppes' pwd(1). */ #include #include #include #include #define NULL (char *) 0 #define O_RDONLY 0 #define DIRECT_SIZE (sizeof (struct direct)) #define PATH_MAX 127 extern char *rindex(); extern int errno; char *getcwd( buffer, size ) char *buffer; int size; { static char path[ PATH_MAX + 1 ]; struct stat current; if ( buffer == NULL || size == 0 ) { errno = EINVAL; return( NULL ); } path[0] = '\0'; /* Get the inode for the current directory */ if ( stat( ".", ¤t ) == -1 ) return( NULL ); if ( (current.st_mode & S_IFMT) != S_IFDIR ) return( NULL ); /* Run backwards up the directory tree, grabbing */ /* directory names on the way. */ while (1) { struct stat parent; struct direct d; int same_device = 0; int found = 0; int fd; /* Get the inode for the parent directory */ if ( chdir( ".." ) == -1 ) return( NULL ); if ( stat( ".", &parent ) == -1 ) return( NULL ); if ( (parent.st_mode & S_IFMT) != S_IFDIR ) return( NULL ); if ( current.st_dev == parent.st_dev ) same_device = 1; /* At the root, "." is the same as ".." */ if ( same_device && current.st_ino == parent.st_ino ) break; /* Search the parent directory for the current entry */ if ( (fd = open( ".", O_RDONLY )) == -1 ) return( NULL ); while ( ! found && read(fd, &d, DIRECT_SIZE) == DIRECT_SIZE ) { if ( same_device ) { if ( current.st_ino == d.d_ino ) found = 1; } else { static char temp_name[ DIRSIZ + 1 ]; static struct stat dir_entry; temp_name[0] = '\0'; strncat( temp_name, d.d_name, DIRSIZ ); if ( stat( temp_name, &dir_entry ) == -1 ) { close( fd ); return( NULL ); } if ( current.st_dev == dir_entry.st_dev && current.st_ino == dir_entry.st_ino ) found = 1; } } close( fd ); if ( ! found ) return( NULL ); if ( strlen(path) + DIRSIZ + 1 > PATH_MAX ) { errno = ERANGE; return( NULL ); } strcat( path, "/" ); strncat( path, d.d_name, DIRSIZ ); current.st_dev = parent.st_dev; current.st_ino = parent.st_ino; } /* Copy the reversed path name into */ if ( strlen(path) + 1 > size ) { errno = ERANGE; return( NULL ); } if ( strlen(path) == 0 ) { strcpy( buffer, "/" ); return( buffer ); } *buffer = '\0'; { char *r; while ( (r = rindex( path, '/' )) != NULL ) { strcat( buffer, r ); *r = '\0'; } } return( chdir( buffer ) ? NULL : buffer ); } getegid.c–#»¤¬#include "lib.h" PUBLIC gid getegid() { int k; k = callm1(MM, GETGID, 0, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); if (k < 0) return ( (gid) k); return( (gid) M.m2_i1); } getenv.c–#»¤ī/* getenv(3) * * Author: Terrence W. Holm Aug. 1988 */ #define NULL (char *) 0 extern char **environ; char *getenv( name ) char *name; { char **v; register char *n; register char *p; if ( environ == (char **) NULL || name == NULL ) return(NULL); for ( v = environ; *v != NULL; ++v ) { n = name; p = *v; while ( *n == *p && *n != '\0' ) ++n, ++p; if ( *n == '\0' && *p == '=' ) return( p + 1 ); } return(NULL); } geteuid.c–#»¤¬#include "lib.h" PUBLIC uid geteuid() { int k; k = callm1(MM, GETUID, 0, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); if (k < 0) return ( (uid) k); return ((uid) M.m2_i1); } getgid.c–#»¤…#include "lib.h" PUBLIC gid getgid() { int k; k = callm1(MM, GETGID, 0, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); return( (gid) k); } #getgrent.c–#»¤/* * get entry from group file * * By: Patrick van Kleef */ #include #define PRIVATE static PRIVATE char _gr_file[] = "/etc/group"; PRIVATE char _grbuf[256]; PRIVATE char _buffer[1024]; PRIVATE char *_pnt; PRIVATE char *_buf; PRIVATE int _gfd = -1; PRIVATE int _bufcnt; PRIVATE struct group grp; setgrent () { if (_gfd >= 0) lseek (_gfd, 0L, 0); else _gfd = open (_gr_file, 0); _bufcnt = 0; return (_gfd); } endgrent () { if (_gfd >= 0) close (_gfd); _gfd = -1; _bufcnt = 0; } static getline () { if (_gfd < 0 && setgrent () < 0) return (0); _buf = _grbuf; do { if (--_bufcnt <= 0){ if ((_bufcnt = read (_gfd, _buffer, 1024)) <= 0) return (0); else _pnt = _buffer; } *_buf++ = *_pnt++; } while (*_pnt != '\n'); _pnt++; _bufcnt--; *_buf = 0; _buf = _grbuf; return (1); } static skip_period () { while ((*_buf) && (*_buf != ':')) _buf++; *_buf++ = '\0'; } struct group *getgrent () { if (getline () == 0) return (0); grp.gr_name = _buf; skip_period (); grp.gr_passwd = _buf; skip_period (); grp.gr_gid = atoi (_buf); skip_period (); return (&grp); } struct group *getgrnam (name) char *name; { struct group *grp; setgrent (); while ((grp = getgrent ()) != 0) if (!strcmp (grp -> gr_name, name)) break; endgrent (); if (grp != 0) return (grp); else return (0); } struct group *getgrgid (gid) int gid; { struct group *grp; setgrent (); while ((grp = getgrent ()) != 0) if (grp -> gr_gid == gid) break; endgrent (); if (grp != 0) return (grp); else return (0); } /getlogin.c–#»€­/* getlogin(3) * * Author: Terrence W. Holm Aug. 1988 */ #include #include #ifndef L_cuserid #define L_cuserid 9 #endif extern struct passwd *getpwuid(); char *getlogin() { static char userid[ L_cuserid ]; struct passwd *pw_entry; pw_entry = getpwuid( getuid() ); if ( pw_entry == NULL ) return( NULL ); strcpy( userid, pw_entry->pw_name ); return( userid ); } /getpass.c–#»¤½#include static char pwdbuf[9]; char * getpass(prompt) char *prompt; { int i = 0, save; struct sgttyb tty; prints(prompt); ioctl(0, TIOCGETP, &tty); save = tty.sg_flags; tty.sg_flags = tty.sg_flags & ~ECHO; ioctl(0, TIOCSETP, &tty); i = read(0, pwdbuf, 9); while (pwdbuf[i - 1] != '\n') read(0, &pwdbuf[i - 1], 1); pwdbuf[i - 1] = '\0'; tty.sg_flags = save; ioctl(0, TIOCSETP, &tty); prints("\n"); return(pwdbuf); } #getpid.c–#»¤k#include "lib.h" PUBLIC int getpid() { return callm1(MM, GETPID, 0, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); } #getpwent.c–# »¤Ę/* * get entry from password file * * By Patrick van Kleef * */ #include #define PRIVATE static PRIVATE char _pw_file[] = "/etc/passwd"; PRIVATE char _pwbuf[256]; PRIVATE char _buffer[1024]; PRIVATE char *_pnt; PRIVATE char *_buf; PRIVATE int _pw = -1; PRIVATE int _bufcnt; PRIVATE struct passwd pwd; setpwent() { if (_pw >= 0) lseek (_pw, 0L, 0); else _pw = open (_pw_file, 0); _bufcnt = 0; return (_pw); } endpwent () { if (_pw >= 0) close (_pw); _pw = -1; _bufcnt = 0; } static getline () { if (_pw < 0 && setpwent () < 0) return (0); _buf = _pwbuf; do { if (--_bufcnt <= 0){ if ((_bufcnt = read (_pw, _buffer, 1024)) <= 0) return (0); else _pnt = _buffer; } *_buf++ = *_pnt++; } while (*_pnt != '\n'); _pnt++; _bufcnt--; *_buf = 0; _buf = _pwbuf; return (1); } static skip_period () { while (*_buf != ':') _buf++; *_buf++ = '\0'; } struct passwd *getpwent () { if (getline () == 0) return (0); pwd.pw_name = _buf; skip_period (); pwd.pw_passwd = _buf; skip_period (); pwd.pw_uid = atoi (_buf); skip_period (); pwd.pw_gid = atoi (_buf); skip_period (); pwd.pw_gecos = _buf; skip_period (); pwd.pw_dir = _buf; skip_period (); pwd.pw_shell = _buf; return (&pwd); } struct passwd *getpwnam (name) char *name; { struct passwd *pwd; setpwent (); while ((pwd = getpwent ()) != 0) if (!strcmp (pwd -> pw_name, name)) break; endpwent (); if (pwd != 0) return (pwd); else return (0); } struct passwd *getpwuid (uid) int uid; { struct passwd *pwd; setpwent (); while ((pwd = getpwent ()) != 0) if (pwd -> pw_uid == uid) break; endpwent (); if (pwd != 0) return (pwd); else return (0); } gets.ct.c–# »¤ä#include char *gets(str) char *str; { register int ch; register char *ptr; ptr = str; while ((ch = getc(stdin)) != EOF && ch != '\n') *ptr++ = ch; if (ch == EOF) return(NULL); *ptr = '\0'; return(str); } getuid.cc–#!»¤…#include "lib.h" PUBLIC uid getuid() { int k; k = callm1(MM, GETUID, 0, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); return( (uid) k); } #gtty.ccc–#!»€`#include gtty(fd, argp) int fd; char *argp; { return ioctl(fd, TIOCGETP, argp); } index.cc–#!»¤qchar *index(s, c) register char *s, c; { do { if (*s == c) return(s); } while (*s++ != 0); return(0); } cioctl.cc—#'ō¤®#include "lib.h" #include #include PUBLIC int ioctl(fd, request, u) int fd; int request; union { struct sgttyb *argp; struct tchars *argt; } u; { int n, ispeed, ospeed; long erase, kill, intr, quit, xon, xoff, eof, brk, speed; M.TTY_REQUEST = request; M.TTY_LINE = fd; switch(request) { case TIOCSETP: erase = u.argp->sg_erase & BYTE; kill = u.argp->sg_kill & BYTE; M.TTY_SPEK = (erase << 8) | kill; M.TTY_FLAGS = u.argp->sg_flags; M.TTY_SPEED = (u.argp->sg_ospeed << 8) | u.argp->sg_ispeed; n = callx(FS, IOCTL); return(n); case TIOCSETC: intr = u.argt->t_intrc & BYTE; quit = u.argt->t_quitc & BYTE; xon = u.argt->t_startc & BYTE; xoff = u.argt->t_stopc & BYTE; eof = u.argt->t_eofc & BYTE; brk = u.argt->t_brkc & BYTE; /* not used at the moment */ M.TTY_SPEK = (intr<<24) | (quit<<16) | (xon<<8) | (xoff<<0); M.TTY_FLAGS = (eof<<8) | (brk<<0); n = callx(FS, IOCTL); return(n); case TIOCGETP: n = callx(FS, IOCTL); u.argp->sg_erase = (M.TTY_SPEK >> 8) & BYTE; u.argp->sg_kill = (M.TTY_SPEK >> 0) & BYTE; u.argp->sg_flags = M.TTY_FLAGS & 0xFFFF; speed = (M.TTY_FLAGS >> 16) & 0xFFFFL; u.argp->sg_ispeed = speed & BYTE; u.argp->sg_ospeed = (speed >> 8) & BYTE; return(n); case TIOCGETC: n = callx(FS, IOCTL); u.argt->t_intrc = (M.TTY_SPEK >> 24) & BYTE; u.argt->t_quitc = (M.TTY_SPEK >> 16) & BYTE; u.argt->t_startc = (M.TTY_SPEK >> 8) & BYTE; u.argt->t_stopc = (M.TTY_SPEK >> 0) & BYTE; u.argt->t_eofc = (M.TTY_FLAGS >> 8) & BYTE; u.argt->t_brkc = (M.TTY_FLAGS >> 8) & BYTE; return(n); default: n = -1; errno = -(EINVAL); return(n); } } isatty.cc–#"»¤»#include "lib.h" #include #include int isatty(fd) int fd; { M.TTY_REQUEST = TIOCGETP; M.TTY_LINE = fd; if (callx(FS, IOCTL) < 0) return(0); return(1); } #itoa.ccc–##»¤¶/* Integer to ASCII for signed decimal integers. */ static int next; static char qbuf[8]; char *itoa(n) int n; { register int r, k; int flag = 0; next = 0; if (n < 0) { qbuf[next++] = '-'; n = -n; } if (n == 0) { qbuf[next++] = '0'; } else { k = 10000; while (k > 0) { r = n/k; if (flag || r > 0) { qbuf[next++] = '0' + r; flag = 1; } n -= r * k; k = k/10; } } qbuf[next] = 0; return(qbuf); } kill.ccc–##»¤Ķ#include "lib.h" PUBLIC int kill(proc, sig) int proc; /* which process is to be sent the signal */ int sig; /* signal number */ { return callm1(MM, KILL, proc, sig, 0, NIL_PTR, NIL_PTR, NIL_PTR); } #link.ccc–##»¤’#include "lib.h" PUBLIC int link(name, name2) char *name, *name2; { return callm1(FS, LINK, len(name), len(name2), 0, name, name2, NIL_PTR); } lsearch.c–#$»€+/* lsearch(3) and lfind(3) * * Author: Terrence W. Holm Sep. 1988 */ #define NULL (char *) 0 char *lsearch( key, base, count, width, keycmp ) char *key; char *base; unsigned *count; unsigned width; int (*keycmp)(); { char *entry; char *last = base + *count * width; for ( entry = base; entry < last; entry += width ) if ( keycmp( key, entry ) == 0 ) return( entry ); bcopy( key, last, width ); *count += 1; return( last ); } char *lfind( key, base, count, width, keycmp ) char *key; char *base; unsigned *count; unsigned width; int (*keycmp)(); { char *entry; char *last = base + *count * width; for ( entry = base; entry < last; entry += width ) if ( keycmp( key, entry ) == 0 ) return( entry ); return( NULL ); } /lseek.cc–#$»¤#include "lib.h" PUBLIC long lseek(fd, offset, whence) int fd; long offset; int whence; { int k; M.m2_i1 = fd; M.m2_l1 = offset; M.m2_i2 = whence; k = callx(FS, LSEEK); if (k != OK) return( (long) k); /* send itself failed */ return(M.m2_l1); } #malloc.c–#%»¤’#define i8088 1 /* For IBM PC only */ /* replace undef by define */ #undef DEBUG /* check assertions */ #undef SLOWDEBUG /* some extra test loops (requires DEBUG) */ #ifdef DEBUG #define ASSERT(b) if (!(b)) assert_failed(); #else #define ASSERT(b) /* empty */ #endif #ifdef i8088 #define ptrint int #endif #ifdef ATARI_ST #define ptrint long #endif #define BRKSIZE 1024 #define PTRSIZE sizeof(char *) #define Align(x,a) (((x) + (a - 1)) & ~(a - 1)) #define NextSlot(p) (* (char **) ((p) - PTRSIZE)) #define NextFree(p) (* (char **) (p)) /* * A short explanation of the data structure and algorithms. * An area returned by malloc() is called a slot. Each slot * contains the number of bytes requested, but preceeded by * an extra pointer to the next the slot in memory. * '_bottom' and '_top' point to the first/last slot. * More memory is asked for using brk() and appended to top. * The list of free slots is maintained to keep malloc() fast. * '_empty' points the the first free slot. Free slots are * linked together by a pointer at the start of the * user visable part, so just after the next-slot pointer. * Free slots are merged together by free(). */ extern char *sbrk(), *brk(); static char *_bottom, *_top, *_empty; static grow(len) unsigned len; { register char *p; ASSERT(NextSlot(_top) == 0); p = (char *) Align((ptrint)_top + len, BRKSIZE); if (p < _top || brk(p) != 0) return(0); NextSlot(_top) = p; NextSlot(p) = 0; free(_top); _top = p; return(1); } char *malloc(size) unsigned size; { register char *prev, *p, *next, *new; register unsigned len, ntries; if (size == 0) size = PTRSIZE; /* avoid slots less that 2*PTRSIZE */ for (ntries = 0; ntries < 2; ntries++) { len = Align(size, PTRSIZE) + PTRSIZE; if (_bottom == 0) { p = sbrk(2 * PTRSIZE); p = (char *) Align((ptrint)p, PTRSIZE); p += PTRSIZE; _top = _bottom = p; NextSlot(p) = 0; } #ifdef SLOWDEBUG for (p = _bottom; (next = NextSlot(p)) != 0; p = next) ASSERT(next > p); ASSERT(p == _top); #endif for (prev = 0, p = _empty; p != 0; prev = p, p = NextFree(p)) { next = NextSlot(p); new = p + len; if (new > next) continue; /* too small */ if (new + PTRSIZE < next) { /* too big, so split */ /* + PTRSIZE avoids tiny slots on free list */ NextSlot(new) = next; NextSlot(p) = new; NextFree(new) = NextFree(p); NextFree(p) = new; } if (prev) NextFree(prev) = NextFree(p); else _empty = NextFree(p); return(p); } if (grow(len) == 0) break; } ASSERT(ntries != 2); return(0); } char *realloc(old, size) char *old; unsigned size; { register char *prev, *p, *next, *new; register unsigned len, n; len = Align(size, PTRSIZE) + PTRSIZE; next = NextSlot(old); n = (int)(next - old); /* old length */ /* * extend old if there is any free space just behind it */ for (prev = 0, p = _empty; p != 0; prev = p, p = NextFree(p)) { if (p > next) break; if (p == next) { /* 'next' is a free slot: merge */ NextSlot(old) = NextSlot(p); if (prev) NextFree(prev) = NextFree(p); else _empty = NextFree(p); next = NextSlot(old); break; } } new = old + len; /* * Can we use the old, possibly extended slot? */ if (new <= next) { /* it does fit */ if (new + PTRSIZE < next) { /* too big, so split */ /* + PTRSIZE avoids tiny slots on free list */ NextSlot(new) = next; NextSlot(old) = new; free(new); } return(old); } if ((new = malloc(size)) == 0) /* it didn't fit */ return(0); bcopy(old, new, n); /* n < size */ free(old); return(new); } static bcopy(old, new, n) register char *old, *new; register n; { while (n--) *new++ = *old++; } char *calloc(n, size) unsigned n, size; { register char *p, *cp; n *= size; cp = malloc(n); if (cp == (char *)0) return ((char *)0); for (p = cp; n-- != 0; ) *p++ = '\0'; return(cp); } free(p) char *p; { register char *prev, *next; ASSERT(NextSlot(p) > p); for (prev = 0, next = _empty; next != 0; prev = next, next = NextFree(next)) if (p < next) break; NextFree(p) = next; if (prev) NextFree(prev) = p; else _empty = p; if (next) { ASSERT(NextSlot(p) <= next); if (NextSlot(p) == next) { /* merge p and next */ NextSlot(p) = NextSlot(next); NextFree(p) = NextFree(next); } } if (prev) { ASSERT(NextSlot(prev) <= p); if (NextSlot(prev) == p) { /* merge prev and p */ NextSlot(prev) = NextSlot(p); NextFree(prev) = NextFree(p); } } } #ifdef DEBUG static assert_failed() { write(2, "assert failed in lib/malloc.c\n", 30); abort(); } #endif ememccpy.c–#&»€(/* memccpy(3) * * Author: Terrence W. Holm Sep. 1988 */ #define NULL (char *) 0 char *memccpy( to, from, chr, count ) char *to; char *from; int chr; int count; { while( --count >= 0 ) if ( (*to++ = *from++) == chr ) return( from ); return( NULL ); } memchr.c–#&»€/* memchr(3) * * Author: Terrence W. Holm Sep. 1988 */ #define NULL (char *) 0 char *memchr( vector, chr, count ) char *vector; int chr; int count; { while( --count >= 0 ) if ( *vector++ == chr ) return( vector - 1 ); return( NULL ); } memcmp.c–#&»€K/* memcmp(3) * * Author: Terrence W. Holm Sep. 1988 */ int memcmp( vector1, vector2, count ) char *vector1; char *vector2; int count; { register int cmp; if ( vector1 == vector2 ) return( 0 ); while( --count >= 0 ) if ( cmp = *vector1++ - *vector2++ ) return( cmp ); return( 0 ); } /memcpy.c–#'»€³/* memcpy(3) * * Author: Terrence W. Holm Sep. 1988 */ char *memcpy( to, from, count ) char *to; char *from; int count; { int word_count = count / sizeof(int); int byte_count = count & ( sizeof(int) - 1 ); char *temp_to = to; if ( to > from && to < from + count ) { /* Must copy backwards */ from += count; to += count; while( --byte_count >= 0 ) *--to = *--from; while( --word_count >= 0 ) *--((int *) to) = *--((int *) from); } else { while( --word_count >= 0 ) *((int *) to)++ = *((int *) from)++; while( --byte_count >= 0 ) *to++ = *from++; } return( temp_to ); } /memset.c–#'»€/* memset(3) * * Author: Terrence W. Holm Sep. 1988 */ char *memset( vector, chr, count ) char *vector; int chr; int count; { register char *memory = vector; while( --count >= 0 ) *memory++ = chr; return( vector ); } message.c–#'»¤‹#include #include /* some compilers require an initializer to force storage allocation */ message M = {0}; #mknod.cc–#(»¤ #include "lib.h" PUBLIC int mknod(name, mode, addr) char *name; int mode, addr; { return callm1(FS, MKNOD, len(name), mode, addr, name, NIL_PTR, NIL_PTR); } mktemp.c–#(»¤¤/* mktemp - make a name for a temporary file */ char *mktemp(template) char *template; { int pid, k; char *p; pid = getpid(); /* get process id as semi-unique number */ p = template; while (*p++) ; /* find end of string */ p--; /* backup to last character */ /* Replace XXXXXX at end of template with pid. */ while (*--p == 'X') { *p = '0' + (pid % 10); pid = pid/10; } return(template); } mount.c–#)»¤µ#include "lib.h" PUBLIC int mount(special, name, rwflag) char *name, *special; int rwflag; { return callm1(FS, MOUNT, len(special), len(name), rwflag, special, name, NIL_PTR); } #open.c–#)»¤o#include "lib.h" PUBLIC int open(name, mode) char* name; int mode; { return callm3(FS, OPEN, mode, name); } #pause.c–#)»¤i#include "lib.h" PUBLIC int pause() { return callm1(MM, PAUSE, 0, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); } #perror.c–#*»¶Ā/* perror(s) print the current error message. */ #include extern int errno; char *sys_errlist[] = { "Error 0", "Not owner", "No such file or directory", "No such process", "Interrupted system call", "I/O error", "No such device or address", "Arg list too long", "Exec format error", "Bad file number", "No children", "No more processes", "Not enough core", "Permission denied", "Bad address", "Block device required", "Mount device busy", "File exists", "Cross-device link", "No such device", "Not a directory", "Is a directory", "Invalid argument", "File table overflow", "Too many open files", "Not a typewriter", "Text file busy", "File too large", "No space left on device", "Illegal seek", "Read-only file system", "Too many links", "Broken pipe", "Math argument", "Result too large" }; int sys_nerr = sizeof(sys_errlist)/sizeof(char *); perror(s) char *s; { if (errno < 0 || errno >= sizeof(sys_errlist)/sizeof(char *)) { write(2, "Invalid errno\n", 14); } else { write(2, s, slen(s)); write(2, ": ", 2); write(2, sys_errlist[errno], slen(sys_errlist[errno])); write(2, "\n", 1); } } static int slen(s) char *s; { int k = 0; while (*s++) k++; return(k); } pipe.cc–#*»¤×#include "lib.h" PUBLIC int pipe(fild) int fild[2]; { int k; k = callm1(FS, PIPE, 0, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); if (k >= 0) { fild[0] = M.m1_i1; fild[1] = M.m1_i2; return(0); } else return(k); } #popen.c–#+»¤#include #include static int pids[20]; FILE * popen(command, type) char *command, *type; { int piped[2]; int Xtype = *type == 'r' ? 0 : *type == 'w' ? 1 : 2; int pid; extern FILE *fdopen(); if (Xtype == 2 || pipe(piped) < 0 || (pid = fork()) < 0) return 0; if (pid == 0) { /* child */ register int *p; for (p = pids; p < &pids[20]; p++) { if (*p) close(p - pids); } close(piped[Xtype]); dup2(piped[!Xtype], !Xtype); close(piped[!Xtype]); execl("/bin/sh", "sh", "-c", command, (char *) 0); exit(127); /* like system() ??? */ } pids[piped[Xtype]] = pid; close(piped[!Xtype]); return fdopen(piped[Xtype], type); } pclose(iop) FILE *iop; { int fd = fileno(iop); int status, wret; int (*intsave)() = signal(SIGINT, SIG_IGN); int (*quitsave)() = signal(SIGQUIT, SIG_IGN); fclose(iop); while ((wret = wait(&status)) != -1) { if (wret == pids[fd]) break; } if (wret == -1) status = -1; signal(SIGINT, intsave); signal(SIGQUIT, quitsave); pids[fd] = 0; return status; } printdat.c–#+»¤h#include char __stdin[BUFSIZ]; char __stdout[BUFSIZ]; struct _io_buf _stdin = { 0, 0, READMODE , __stdin, __stdin }; struct _io_buf _stdout = { 1, 0, WRITEMODE + PERPRINTF, __stdout, __stdout }; struct _io_buf _stderr = { 2, 0, WRITEMODE + UNBUFF, NULL, NULL }; struct _io_buf *_io_table[NFILES] = { &_stdin, &_stdout, &_stderr, 0 }; printk.cc–#,»¤Ģ/* * three compile time options: * STACKUP fetch arguments using *p-- instead of *p++ * NO_LONGD %d and %ld/%D are equal * NO_FLOAT abort on %e, %f and %g */ #define NO_FLOAT #ifdef NO_FLOAT #define MAXDIG 11 /* 32 bits in radix 8 */ #else #define MAXDIG 128 /* this must be enough */ #endif static char * itoa(p, num, radix) register char *p; register unsigned num; register radix; { register i; register char *q; q = p + MAXDIG; do { i = (int)(num % radix); i += '0'; if (i > '9') i += 'A' - '0' - 10; *--q = i; } while (num = num / radix); i = p + MAXDIG - q; do *p++ = *q++; while (--i); return(p); } #ifndef NO_LONGD static char * ltoa(p, num, radix) register char *p; register unsigned long num; register radix; { register i; register char *q; q = p + MAXDIG; do { i = (int)(num % radix); i += '0'; if (i > '9') i += 'A' - '0' - 10; *--q = i; } while (num = num / radix); i = p + MAXDIG - q; do *p++ = *q++; while (--i); return(p); } #endif #ifndef NO_FLOAT extern char *_ecvt(); extern char *_fcvt(); extern char *_gcvt(); #endif #ifdef STACKUP #define GETARG(typ) *((typ *)args)-- #else #define GETARG(typ) *((typ *)args)++ #endif STACKUP printk(fmt, arg1) register char *fmt; { char buf[MAXDIG+1]; /* +1 for sign */ register int *args = &arg1; register char *p; register char *s; register c; register i; register short width; register short ndigit; register ndfnd; register ljust; register zfill; #ifndef NO_LONGD register lflag; register long l; #endif for (;;) { c = *fmt++; if (c == 0) return; if (c != '%') { putc(c); continue; } p = buf; s = buf; ljust = 0; if (*fmt == '-') { fmt++; ljust++; } zfill = ' '; if (*fmt == '0') { fmt++; zfill = '0'; } for (width = 0;;) { c = *fmt++; if (c >= '0' && c <= '9') c -= '0'; else if (c == '*') c = GETARG(int); else break; width *= 10; width += c; } ndfnd = 0; ndigit = 0; if (c == '.') { for (;;) { c = *fmt++; if (c >= '0' && c <= '9') c -= '0'; else if (c == '*') c = GETARG(int); else break; ndigit *= 10; ndigit += c; ndfnd++; } } #ifndef NO_LONGD lflag = 0; #endif if (c == 'l' || c == 'L') { #ifndef NO_LONGD lflag++; #endif if (*fmt) c = *fmt++; } switch (c) { case 'X': #ifndef NO_LONGD lflag++; #endif case 'x': c = 16; goto oxu; case 'U': #ifndef NO_LONGD lflag++; #endif case 'u': c = 10; goto oxu; case 'O': #ifndef NO_LONGD lflag++; #endif case 'o': c = 8; oxu: #ifndef NO_LONGD if (lflag) { p = ltoa(p, GETARG(long), c); break; } #endif p = itoa(p, GETARG(int), c); break; case 'D': #ifndef NO_LONGD lflag++; #endif case 'd': #ifndef NO_LONGD if (lflag) { if ((l = GETARG(long)) < 0) { *p++ = '-'; l = -l; } p = ltoa(p, l, 10); break; } #endif if ((i = GETARG(int)) < 0) { *p++ = '-'; i = -i; } p = itoa(p, i, 10); break; #ifdef NO_FLOAT case 'e': case 'f': case 'g': zfill = ' '; *p++ = '?'; break; #else case 'e': if (ndfnd == 0) ndigit = 6; ndigit++; p = _ecvt(p, GETARG(double), ndigit); break; case 'f': if (ndfnd == 0) ndigit = 6; p = _fcvt(p, GETARG(double), ndigit); break; case 'g': if (ndfnd == 0) ndigit = 6; p = _gcvt(p, GETARG(double), ndigit); break; #endif case 'c': zfill = ' '; *p++ = GETARG(int); break; case 's': zfill = ' '; if ((s = GETARG(char *)) == 0) s = "(null)"; if (ndigit == 0) ndigit = 32767; for (p = s; *p && --ndigit >= 0; p++) ; break; default: *p++ = c; break; } i = p - s; if ((width -= i) < 0) width = 0; if (ljust == 0) width = -width; if (width < 0) { if (*s == '-' && zfill == '0') { putc(*s++); i--; } do putc(zfill); while (++width != 0); } while (--i >= 0) putc(*s++); while (width) { putc(zfill); width--; } } } prints.cc–#-»¤É/* prints() is like printf(), except that it can only handle %s and %c. It * cannot print any of the numeric types such as %d, %o, etc. It has the * advantage of not requiring the runtime code for converting binary numbers * to ASCII, which saves 1K bytes in the object program. Since many of the * small utilities do not need numeric printing, they all use prints. */ static put(); #define TRUNC_SIZE 128 char Buf[TRUNC_SIZE], *Bufp; #define OUT 1 prints(s, arglist) register char *s; int *arglist; { register w; int k, r, *valp; char *p, *p1, c; Bufp = Buf; valp = (int *) &arglist; while (*s != '\0') { if (*s != '%') { put(*s++); continue; } w = 0; s++; while (*s >= '0' && *s <= '9') { w = 10 * w + (*s - '0'); s++; } switch(*s) { case 'c': k = *valp++; put(k); s++; continue; case 's': p = *((char **)valp); valp += sizeof(char *) / sizeof(int); p1 = p; while(c = *p++) put(c); s++; if ( (k = w - ((int)(p-p1)-1)) > 0) while (k--) put(' '); continue; default: put('%'); put(*s++); continue; } } write(OUT, Buf, (int)(Bufp - Buf)); /* write everything in one blow. */ } static put(c) char c; { if (Bufp < &Buf[TRUNC_SIZE]) *Bufp++ = c; } /putc.ccc–#-»¤Ē#include extern int (*__cleanup)(); extern int _cleanup(); putc(ch, iop) char ch; FILE *iop; { int n, didwrite = 0; if (testflag(iop, (_ERR | _EOF))) return (EOF); if ( !testflag(iop,WRITEMODE)) return(EOF); if ( testflag(iop,UNBUFF)){ n = write(iop->_fd,&ch,1); iop->_count = 1; didwrite++; } else{ __cleanup = _cleanup; *iop->_ptr++ = ch; if ((++iop->_count) >= BUFSIZ && !testflag(iop,STRINGS) ){ n = write(iop->_fd,iop->_buf,iop->_count); iop->_ptr = iop->_buf; didwrite++; } } if (didwrite){ if (n<=0 || iop->_count != n){ if (n < 0) iop->_flags |= _ERR; else iop->_flags |= _EOF; return (EOF); } iop->_count=0; } return(0); } #puts.ccc–#.»¤u#include "stdio.h" int puts(s) char *s; { char c; c = fputs(s,stdout); putchar('\n'); return(c); } #qsort.cc–#.»¤ static qsort1(); static int (*qcompar)(); static qexchange(); static q3exchange(); qsort(base, nel, width, compar) char *base; int (*compar)(); { qcompar = compar; qsort1(base, base + (nel - 1) * width, width); } static qsort1(a1, a2, width) char *a1, *a2; register int width; { register char *left, *right; register char *lefteq, *righteq; int cmp; for (;;) { if (a2 <= a1) return; left = a1; right = a2; lefteq = righteq = a1 + width * (((a2-a1)+width)/(2*width)); /* Pick an element in the middle of the array. We will collect the equals around it. "lefteq" and "righteq" indicate the left and right bounds of the equals respectively. Smaller elements end up left of it, larger elements end up right of it. */ again: while (left < lefteq && (cmp = (*qcompar)(left, lefteq)) <= 0) { if (cmp < 0) { /* leave it where it is */ left += width; } else { /* equal, so exchange with the element to the left of the "equal"-interval. */ lefteq -= width; qexchange(left, lefteq, width); } } while (right > righteq) { if ((cmp = (*qcompar)(right, righteq)) < 0) { /* smaller, should go to left part */ if (left < lefteq) { /* yes, we had a larger one at the left, so we can just exchange */ qexchange(left, right, width); left += width; right -= width; goto again; } /* no more room at the left part, so we move the "equal-interval" one place to the right, and the smaller element to the left of it. This is best expressed as a three-way exchange. */ righteq += width; q3exchange(left, righteq, right, width); lefteq += width; left = lefteq; } else if (cmp == 0) { /* equal, so exchange with the element to the right of the "equal-interval" */ righteq += width; qexchange(right, righteq, width); } else /* just leave it */ right -= width; } if (left < lefteq) { /* larger element to the left, but no more room, so move the "equal-interval" one place to the left, and the larger element to the right of it. */ lefteq -= width; q3exchange(right, lefteq, left, width); righteq -= width; right = righteq; goto again; } /* now sort the "smaller" part */ qsort1(a1, lefteq - width, width); /* and now the larger, saving a subroutine call because of the for(;;) */ a1 = righteq + width; } /*NOTREACHED*/ } static qexchange(p, q, n) register char *p, *q; register int n; { register int c; while (n-- > 0) { c = *p; *p++ = *q; *q++ = c; } } static q3exchange(p, q, r, n) register char *p, *q, *r; register int n; { register int c; while (n-- > 0) { c = *p; *p++ = *r; *r++ = *q; *q++ = c; } } rand.cc–#/»¤¬static long seed = 1L; int srand(x) unsigned x; { seed = (long)x; } int rand() { seed = (1103515245L * seed + 12345) & 0x7FFFFFFF; return((int) (seed & 077777)); } read.cc–#/»¤³#include "lib.h" PUBLIC int read(fd, buffer, nbytes) int fd; char *buffer; int nbytes; { int n; n = callm1(FS, READ, fd, nbytes, 0, buffer, NIL_PTR, NIL_PTR); return(n); } #regexp.cc–#3»¤l/* * regcomp and regexec -- regsub and regerror are elsewhere * * Copyright (c) 1986 by University of Toronto. * Written by Henry Spencer. Not derived from licensed software. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to redistribute it freely, * subject to the following restrictions: * * 1. The author is not responsible for the consequences of use of * this software, no matter how awful, even if they arise * from defects in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. * * Beware that some of this code is subtly aware of the way operator * precedence is structured in regular expressions. Serious changes in * regular-expression syntax might require a total rethink. * * The third parameter to regexec was added by Martin C. Atkins. * Andy Tanenbaum also made some changes. */ #include #include /* * The first byte of the regexp internal "program" is actually this magic * number; the start node begins in the second byte. */ #define MAGIC 0234 /* * The "internal use only" fields in regexp.h are present to pass info from * compile to execute that permits the execute phase to run lots faster on * simple cases. They are: * * regstart char that must begin a match; '\0' if none obvious * reganch is the match anchored (at beginning-of-line only)? * regmust string (pointer into program) that match must include, or NULL * regmlen length of regmust string * * Regstart and reganch permit very fast decisions on suitable starting points * for a match, cutting down the work a lot. Regmust permits fast rejection * of lines that cannot possibly match. The regmust tests are costly enough * that regcomp() supplies a regmust only if the r.e. contains something * potentially expensive (at present, the only such thing detected is * or + * at the start of the r.e., which can involve a lot of backup). Regmlen is * supplied because the test in regexec() needs it and regcomp() is computing * it anyway. */ /* * Structure for regexp "program". This is essentially a linear encoding * of a nondeterministic finite-state machine (aka syntax charts or * "railroad normal form" in parsing technology). Each node is an opcode * plus a "next" pointer, possibly plus an operand. "Next" pointers of * all nodes except BRANCH implement concatenation; a "next" pointer with * a BRANCH on both ends of it is connecting two alternatives. (Here we * have one of the subtle syntax dependencies: an individual BRANCH (as * opposed to a collection of them) is never concatenated with anything * because of operator precedence.) The operand of some types of node is * a literal string; for others, it is a node leading into a sub-FSM. In * particular, the operand of a BRANCH node is the first node of the branch. * (NB this is *not* a tree structure: the tail of the branch connects * to the thing following the set of BRANCHes.) The opcodes are: */ /* definition number opnd? meaning */ #define END 0 /* no End of program. */ #define BOL 1 /* no Match "" at beginning of line. */ #define EOL 2 /* no Match "" at end of line. */ #define ANY 3 /* no Match any one character. */ #define ANYOF 4 /* str Match any character in this string. */ #define ANYBUT 5 /* str Match any character not in this string. */ #define BRANCH 6 /* node Match this alternative, or the next... */ #define BACK 7 /* no Match "", "next" ptr points backward. */ #define EXACTLY 8 /* str Match this string. */ #define NOTHING 9 /* no Match empty string. */ #define STAR 10 /* node Match this (simple) thing 0 or more times. */ #define PLUS 11 /* node Match this (simple) thing 1 or more times. */ #define OPEN 20 /* no Mark this point in input as start of #n. */ /* OPEN+1 is number 1, etc. */ #define CLOSE 30 /* no Analogous to OPEN. */ /* * Opcode notes: * * BRANCH The set of branches constituting a single choice are hooked * together with their "next" pointers, since precedence prevents * anything being concatenated to any individual branch. The * "next" pointer of the last BRANCH in a choice points to the * thing following the whole choice. This is also where the * final "next" pointer of each individual branch points; each * branch starts with the operand node of a BRANCH node. * * BACK Normal "next" pointers all implicitly point forward; BACK * exists to make loop structures possible. * * STAR,PLUS '?', and complex '*' and '+', are implemented as circular * BRANCH structures using BACK. Simple cases (one character * per match) are implemented with STAR and PLUS for speed * and to minimize recursive plunges. * * OPEN,CLOSE ...are numbered at compile time. */ /* * A node is one char of opcode followed by two chars of "next" pointer. * "Next" pointers are stored as two 8-bit pieces, high order first. The * value is a positive offset from the opcode of the node containing it. * An operand, if any, simply follows the node. (Note that much of the * code generation knows about this implicit relationship.) * * Using two bytes for the "next" pointer is vast overkill for most things, * but allows patterns to get big without disasters. */ #define OP(p) (*(p)) #define NEXT(p) (((*((p)+1)&0377)<<8) + (*((p)+2)&0377)) #define OPERAND(p) ((p) + 3) /* * Utility definitions. */ #ifndef CHARBITS #define UCHARAT(p) ((int)*(unsigned char *)(p)) #else #define UCHARAT(p) ((int)*(p)&CHARBITS) #endif #define FAIL(m) { regerror(m); return(NULL); } #define ISMULT(c) ((c) == '*' || (c) == '+' || (c) == '?') #define META "^$.[()|?+*\\" /* * Flags to be passed up and down. */ #define HASWIDTH 01 /* Known never to match null string. */ #define SIMPLE 02 /* Simple enough to be STAR/PLUS operand. */ #define SPSTART 04 /* Starts with * or +. */ #define WORST 0 /* Worst case. */ /* * Global work variables for regcomp(). */ static char *regparse; /* Input-scan pointer. */ static int regnpar; /* () count. */ static char regdummy; static char *regcode; /* Code-emit pointer; ®dummy = don't. */ static long regsize; /* Code size. */ /* * Forward declarations for regcomp()'s friends. */ #ifndef STATIC #define STATIC static #endif STATIC char *reg(); STATIC char *regbranch(); STATIC char *regpiece(); STATIC char *regatom(); STATIC char *regnode(); STATIC char *regnext(); STATIC void regc(); STATIC void reginsert(); STATIC void regtail(); STATIC void regoptail(); STATIC int strcspn(); /* - regcomp - compile a regular expression into internal code * * We can't allocate space until we know how big the compiled form will be, * but we can't compile it (and thus know how big it is) until we've got a * place to put the code. So we cheat: we compile it twice, once with code * generation turned off and size counting turned on, and once "for real". * This also means that we don't allocate space until we are sure that the * thing really will compile successfully, and we never have to move the * code and thus invalidate pointers into it. (Note that it has to be in * one piece because free() must be able to free it all.) * * Beware that the optimization-preparation code in here knows about some * of the structure of the compiled regexp. */ regexp * regcomp(exp) char *exp; { register regexp *r; register char *scan; register char *longest; register int len; int flags; extern char *malloc(); if (exp == NULL) FAIL("NULL argument"); /* First pass: determine size, legality. */ regparse = exp; regnpar = 1; regsize = 0L; regcode = ®dummy; regc(MAGIC); if (reg(0, &flags) == NULL) return(NULL); /* Small enough for pointer-storage convention? */ if (regsize >= 32767L) /* Probably could be 65535L. */ FAIL("regexp too big"); /* Allocate space. */ r = (regexp *)malloc(sizeof(regexp) + (unsigned)regsize); if (r == NULL) FAIL("out of space"); /* Second pass: emit code. */ regparse = exp; regnpar = 1; regcode = r->program; regc(MAGIC); if (reg(0, &flags) == NULL) return(NULL); /* Dig out information for optimizations. */ r->regstart = '\0'; /* Worst-case defaults. */ r->reganch = 0; r->regmust = NULL; r->regmlen = 0; scan = r->program+1; /* First BRANCH. */ if (OP(regnext(scan)) == END) { /* Only one top-level choice. */ scan = OPERAND(scan); /* Starting-point info. */ if (OP(scan) == EXACTLY) r->regstart = *OPERAND(scan); else if (OP(scan) == BOL) r->reganch++; /* * If there's something expensive in the r.e., find the * longest literal string that must appear and make it the * regmust. Resolve ties in favor of later strings, since * the regstart check works with the beginning of the r.e. * and avoiding duplication strengthens checking. Not a * strong reason, but sufficient in the absence of others. */ if (flags&SPSTART) { longest = NULL; len = 0; for (; scan != NULL; scan = regnext(scan)) if (OP(scan) == EXACTLY && strlen(OPERAND(scan)) >= len) { longest = OPERAND(scan); len = strlen(OPERAND(scan)); } r->regmust = longest; r->regmlen = len; } } return(r); } /* - reg - regular expression, i.e. main body or parenthesized thing * * Caller must absorb opening parenthesis. * * Combining parenthesis handling with the base level of regular expression * is a trifle forced, but the need to tie the tails of the branches to what * follows makes it hard to avoid. */ static char * reg(paren, flagp) int paren; /* Parenthesized? */ int *flagp; { register char *ret; register char *br; register char *ender; register int parno; int flags; *flagp = HASWIDTH; /* Tentatively. */ /* Make an OPEN node, if parenthesized. */ if (paren) { if (regnpar >= NSUBEXP) FAIL("too many ()"); parno = regnpar; regnpar++; ret = regnode(OPEN+parno); } else ret = NULL; /* Pick up the branches, linking them together. */ br = regbranch(&flags); if (br == NULL) return(NULL); if (ret != NULL) regtail(ret, br); /* OPEN -> first. */ else ret = br; if (!(flags&HASWIDTH)) *flagp &= ~HASWIDTH; *flagp |= flags&SPSTART; while (*regparse == '|') { regparse++; br = regbranch(&flags); if (br == NULL) return(NULL); regtail(ret, br); /* BRANCH -> BRANCH. */ if (!(flags&HASWIDTH)) *flagp &= ~HASWIDTH; *flagp |= flags&SPSTART; } /* Make a closing node, and hook it on the end. */ ender = regnode((paren) ? CLOSE+parno : END); regtail(ret, ender); /* Hook the tails of the branches to the closing node. */ for (br = ret; br != NULL; br = regnext(br)) regoptail(br, ender); /* Check for proper termination. */ if (paren && *regparse++ != ')') { FAIL("unmatched ()"); } else if (!paren && *regparse != '\0') { if (*regparse == ')') { FAIL("unmatched ()"); } else FAIL("junk on end"); /* "Can't happen". */ /* NOTREACHED */ } return(ret); } /* - regbranch - one alternative of an | operator * * Implements the concatenation operator. */ static char * regbranch(flagp) int *flagp; { register char *ret; register char *chain; register char *latest; int flags; *flagp = WORST; /* Tentatively. */ ret = regnode(BRANCH); chain = NULL; while (*regparse != '\0' && *regparse != '|' && *regparse != ')') { latest = regpiece(&flags); if (latest == NULL) return(NULL); *flagp |= flags&HASWIDTH; if (chain == NULL) /* First piece. */ *flagp |= flags&SPSTART; else regtail(chain, latest); chain = latest; } if (chain == NULL) /* Loop ran zero times. */ (void) regnode(NOTHING); return(ret); } /* - regpiece - something followed by possible [*+?] * * Note that the branching code sequences used for ? and the general cases * of * and + are somewhat optimized: they use the same NOTHING node as * both the endmarker for their branch list and the body of the last branch. * It might seem that this node could be dispensed with entirely, but the * endmarker role is not redundant. */ static char * regpiece(flagp) int *flagp; { register char *ret; register char op; register char *next; int flags; ret = regatom(&flags); if (ret == NULL) return(NULL); op = *regparse; if (!ISMULT(op)) { *flagp = flags; return(ret); } if (!(flags&HASWIDTH) && op != '?') FAIL("*+ operand could be empty"); *flagp = (op != '+') ? (WORST|SPSTART) : (WORST|HASWIDTH); if (op == '*' && (flags&SIMPLE)) reginsert(STAR, ret); else if (op == '*') { /* Emit x* as (x&|), where & means "self". */ reginsert(BRANCH, ret); /* Either x */ regoptail(ret, regnode(BACK)); /* and loop */ regoptail(ret, ret); /* back */ regtail(ret, regnode(BRANCH)); /* or */ regtail(ret, regnode(NOTHING)); /* null. */ } else if (op == '+' && (flags&SIMPLE)) reginsert(PLUS, ret); else if (op == '+') { /* Emit x+ as x(&|), where & means "self". */ next = regnode(BRANCH); /* Either */ regtail(ret, next); regtail(regnode(BACK), ret); /* loop back */ regtail(next, regnode(BRANCH)); /* or */ regtail(ret, regnode(NOTHING)); /* null. */ } else if (op == '?') { /* Emit x? as (x|) */ reginsert(BRANCH, ret); /* Either x */ regtail(ret, regnode(BRANCH)); /* or */ next = regnode(NOTHING); /* null. */ regtail(ret, next); regoptail(ret, next); } regparse++; if (ISMULT(*regparse)) FAIL("nested *?+"); return(ret); } /* - regatom - the lowest level * * Optimization: gobbles an entire sequence of ordinary characters so that * it can turn them into a single node, which is smaller to store and * faster to run. Backslashed characters are exceptions, each becoming a * separate node; the code is simpler that way and it's not worth fixing. */ static char * regatom(flagp) int *flagp; { register char *ret; int flags; *flagp = WORST; /* Tentatively. */ switch (*regparse++) { case '^': ret = regnode(BOL); break; case '$': ret = regnode(EOL); break; case '.': ret = regnode(ANY); *flagp |= HASWIDTH|SIMPLE; break; case '[': { register int class; register int classend; if (*regparse == '^') { /* Complement of range. */ ret = regnode(ANYBUT); regparse++; } else ret = regnode(ANYOF); if (*regparse == ']' || *regparse == '-') regc(*regparse++); while (*regparse != '\0' && *regparse != ']') { if (*regparse == '-') { regparse++; if (*regparse == ']' || *regparse == '\0') regc('-'); else { class = UCHARAT(regparse-2)+1; classend = UCHARAT(regparse); if (class > classend+1) FAIL("invalid [] range"); for (; class <= classend; class++) regc(class); regparse++; } } else regc(*regparse++); } regc('\0'); if (*regparse != ']') FAIL("unmatched []"); regparse++; *flagp |= HASWIDTH|SIMPLE; } break; case '(': ret = reg(1, &flags); if (ret == NULL) return(NULL); *flagp |= flags&(HASWIDTH|SPSTART); break; case '\0': case '|': case ')': FAIL("internal urp"); /* Supposed to be caught earlier. */ break; case '?': case '+': case '*': FAIL("?+* follows nothing"); break; case '\\': if (*regparse == '\0') FAIL("trailing \\"); ret = regnode(EXACTLY); regc(*regparse++); regc('\0'); *flagp |= HASWIDTH|SIMPLE; break; default: { register int len; register char ender; regparse--; len = strcspn(regparse, META); if (len <= 0) FAIL("internal disaster"); ender = *(regparse+len); if (len > 1 && ISMULT(ender)) len--; /* Back off clear of ?+* operand. */ *flagp |= HASWIDTH; if (len == 1) *flagp |= SIMPLE; ret = regnode(EXACTLY); while (len > 0) { regc(*regparse++); len--; } regc('\0'); } break; } return(ret); } /* - regnode - emit a node */ static char * /* Location. */ regnode(op) char op; { register char *ret; register char *ptr; ret = regcode; if (ret == ®dummy) { regsize += 3; return(ret); } ptr = ret; *ptr++ = op; *ptr++ = '\0'; /* Null "next" pointer. */ *ptr++ = '\0'; regcode = ptr; return(ret); } /* - regc - emit (if appropriate) a byte of code */ static void regc(b) char b; { if (regcode != ®dummy) *regcode++ = b; else regsize++; } /* - reginsert - insert an operator in front of already-emitted operand * * Means relocating the operand. */ static void reginsert(op, opnd) char op; char *opnd; { register char *src; register char *dst; register char *place; if (regcode == ®dummy) { regsize += 3; return; } src = regcode; regcode += 3; dst = regcode; while (src > opnd) *--dst = *--src; place = opnd; /* Op node, where operand used to be. */ *place++ = op; *place++ = '\0'; *place++ = '\0'; } /* - regtail - set the next-pointer at the end of a node chain */ static void regtail(p, val) char *p; char *val; { register char *scan; register char *temp; register int offset; if (p == ®dummy) return; /* Find last node. */ scan = p; for (;;) { temp = regnext(scan); if (temp == NULL) break; scan = temp; } if (OP(scan) == BACK) offset = scan - val; else offset = val - scan; *(scan+1) = (offset>>8)&0377; *(scan+2) = offset&0377; } /* - regoptail - regtail on operand of first argument; nop if operandless */ static void regoptail(p, val) char *p; char *val; { /* "Operandless" and "op != BRANCH" are synonymous in practice. */ if (p == NULL || p == ®dummy || OP(p) != BRANCH) return; regtail(OPERAND(p), val); } /* * regexec and friends */ /* * Global work variables for regexec(). */ static char *reginput; /* String-input pointer. */ static char *regbol; /* Beginning of input, for ^ check. */ static char **regstartp; /* Pointer to startp array. */ static char **regendp; /* Ditto for endp. */ /* * Forwards. */ STATIC int regtry(); STATIC int regmatch(); STATIC int regrepeat(); #ifdef DEBUG int regnarrate = 0; void regdump(); STATIC char *regprop(); #endif /* - regexec - match a regexp against a string */ int regexec(prog, string, bolflag) register regexp *prog; register char *string; int bolflag; { register char *s; extern char *strchr(); /* Be paranoid... */ if (prog == NULL || string == NULL) { regerror("NULL parameter"); return(0); } /* Check validity of program. */ if (UCHARAT(prog->program) != MAGIC) { regerror("corrupted program"); return(0); } /* If there is a "must appear" string, look for it. */ if (prog->regmust != NULL) { s = string; while ((s = strchr(s, prog->regmust[0])) != NULL) { if (strncmp(s, prog->regmust, prog->regmlen) == 0) break; /* Found it. */ s++; } if (s == NULL) /* Not present. */ return(0); } /* Mark beginning of line for ^ . */ if(bolflag) regbol = string; else regbol = NULL; /* Simplest case: anchored match need be tried only once. */ if (prog->reganch) return(regtry(prog, string)); /* Messy cases: unanchored match. */ s = string; if (prog->regstart != '\0') /* We know what char it must start with. */ while ((s = strchr(s, prog->regstart)) != NULL) { if (regtry(prog, s)) return(1); s++; } else /* We don't -- general case. */ do { if (regtry(prog, s)) return(1); } while (*s++ != '\0'); /* Failure. */ return(0); } /* - regtry - try match at specific point */ static int /* 0 failure, 1 success */ regtry(prog, string) regexp *prog; char *string; { register int i; register char **sp; register char **ep; reginput = string; regstartp = prog->startp; regendp = prog->endp; sp = prog->startp; ep = prog->endp; for (i = NSUBEXP; i > 0; i--) { *sp++ = NULL; *ep++ = NULL; } if (regmatch(prog->program + 1)) { prog->startp[0] = string; prog->endp[0] = reginput; return(1); } else return(0); } /* - regmatch - main matching routine * * Conceptually the strategy is simple: check to see whether the current * node matches, call self recursively to see whether the rest matches, * and then act accordingly. In practice we make some effort to avoid * recursion, in particular by going through "ordinary" nodes (that don't * need to know whether the rest of the match failed) by a loop instead of * by recursion. */ static int /* 0 failure, 1 success */ regmatch(prog) char *prog; { register char *scan; /* Current node. */ char *next; /* Next node. */ extern char *strchr(); scan = prog; #ifdef DEBUG if (scan != NULL && regnarrate) fprintf(stderr, "%s(\n", regprop(scan)); #endif while (scan != NULL) { #ifdef DEBUG if (regnarrate) fprintf(stderr, "%s...\n", regprop(scan)); #endif next = regnext(scan); switch (OP(scan)) { case BOL: if (reginput != regbol) return(0); break; case EOL: if (*reginput != '\0') return(0); break; case ANY: if (*reginput == '\0') return(0); reginput++; break; case EXACTLY: { register int len; register char *opnd; opnd = OPERAND(scan); /* Inline the first character, for speed. */ if (*opnd != *reginput) return(0); len = strlen(opnd); if (len > 1 && strncmp(opnd, reginput, len) != 0) return(0); reginput += len; } break; case ANYOF: if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) == NULL) return(0); reginput++; break; case ANYBUT: if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) != NULL) return(0); reginput++; break; case NOTHING: break; case BACK: break; case OPEN+1: case OPEN+2: case OPEN+3: case OPEN+4: case OPEN+5: case OPEN+6: case OPEN+7: case OPEN+8: case OPEN+9: { register int no; register char *save; no = OP(scan) - OPEN; save = reginput; if (regmatch(next)) { /* * Don't set startp if some later * invocation of the same parentheses * already has. */ if (regstartp[no] == NULL) regstartp[no] = save; return(1); } else return(0); } break; case CLOSE+1: case CLOSE+2: case CLOSE+3: case CLOSE+4: case CLOSE+5: case CLOSE+6: case CLOSE+7: case CLOSE+8: case CLOSE+9: { register int no; register char *save; no = OP(scan) - CLOSE; save = reginput; if (regmatch(next)) { /* * Don't set endp if some later * invocation of the same parentheses * already has. */ if (regendp[no] == NULL) regendp[no] = save; return(1); } else return(0); } break; case BRANCH: { register char *save; if (OP(next) != BRANCH) /* No choice. */ next = OPERAND(scan); /* Avoid recursion. */ else { do { save = reginput; if (regmatch(OPERAND(scan))) return(1); reginput = save; scan = regnext(scan); } while (scan != NULL && OP(scan) == BRANCH); return(0); /* NOTREACHED */ } } break; case STAR: case PLUS: { register char nextch; register int no; register char *save; register int min; /* * Lookahead to avoid useless match attempts * when we know what character comes next. */ nextch = '\0'; if (OP(next) == EXACTLY) nextch = *OPERAND(next); min = (OP(scan) == STAR) ? 0 : 1; save = reginput; no = regrepeat(OPERAND(scan)); while (no >= min) { /* If it could work, try it. */ if (nextch == '\0' || *reginput == nextch) if (regmatch(next)) return(1); /* Couldn't or didn't -- back up. */ no--; reginput = save + no; } return(0); } break; case END: return(1); /* Success! */ break; default: regerror("memory corruption"); return(0); break; } scan = next; } /* * We get here only if there's trouble -- normally "case END" is * the terminating point. */ regerror("corrupted pointers"); return(0); } /* - regrepeat - repeatedly match something simple, report how many */ static int regrepeat(p) char *p; { register int count = 0; register char *scan; register char *opnd; scan = reginput; opnd = OPERAND(p); switch (OP(p)) { case ANY: count = strlen(scan); scan += count; break; case EXACTLY: while (*opnd == *scan) { count++; scan++; } break; case ANYOF: while (*scan != '\0' && strchr(opnd, *scan) != NULL) { count++; scan++; } break; case ANYBUT: while (*scan != '\0' && strchr(opnd, *scan) == NULL) { count++; scan++; } break; default: /* Oh dear. Called inappropriately. */ regerror("internal foulup"); count = 0; /* Best compromise. */ break; } reginput = scan; return(count); } /* - regnext - dig the "next" pointer out of a node */ static char * regnext(p) register char *p; { register int offset; if (p == ®dummy) return(NULL); offset = NEXT(p); if (offset == 0) return(NULL); if (OP(p) == BACK) return(p-offset); else return(p+offset); } #ifdef DEBUG STATIC char *regprop(); /* - regdump - dump a regexp onto stdout in vaguely comprehensible form */ void regdump(r) regexp *r; { register char *s; register char op = EXACTLY; /* Arbitrary non-END op. */ register char *next; extern char *strchr(); s = r->program + 1; while (op != END) { /* While that wasn't END last time... */ op = OP(s); printf("%2d%s", (int)(s-r->program), regprop(s)); /* Where, what. */ next = regnext(s); if (next == NULL) /* Next ptr. */ printf("(0)"); else printf("(%d)", (int)(s-r->program)+(int)(next-s)); s += 3; if (op == ANYOF || op == ANYBUT || op == EXACTLY) { /* Literal string, where present. */ while (*s != '\0') { putchar(*s); s++; } s++; } putchar('\n'); } /* Header fields of interest. */ if (r->regstart != '\0') printf("start `%c' ", r->regstart); if (r->reganch) printf("anchored "); if (r->regmust != NULL) printf("must have \"%s\"", r->regmust); printf("\n"); } /* - regprop - printable representation of opcode */ static char * regprop(op) char *op; { register char *p; static char buf[50]; (void) strcpy(buf, ":"); switch (OP(op)) { case BOL: p = "BOL"; break; case EOL: p = "EOL"; break; case ANY: p = "ANY"; break; case ANYOF: p = "ANYOF"; break; case ANYBUT: p = "ANYBUT"; break; case BRANCH: p = "BRANCH"; break; case EXACTLY: p = "EXACTLY"; break; case NOTHING: p = "NOTHING"; break; case BACK: p = "BACK"; break; case END: p = "END"; break; case OPEN+1: case OPEN+2: case OPEN+3: case OPEN+4: case OPEN+5: case OPEN+6: case OPEN+7: case OPEN+8: case OPEN+9: sprintf(buf+strlen(buf), "OPEN%d", OP(op)-OPEN); p = NULL; break; case CLOSE+1: case CLOSE+2: case CLOSE+3: case CLOSE+4: case CLOSE+5: case CLOSE+6: case CLOSE+7: case CLOSE+8: case CLOSE+9: sprintf(buf+strlen(buf), "CLOSE%d", OP(op)-CLOSE); p = NULL; break; case STAR: p = "STAR"; break; case PLUS: p = "PLUS"; break; default: regerror("corrupted opcode"); break; } if (p != NULL) (void) strcat(buf, p); return(buf); } #endif /* * The following is provided for those people who do not have strcspn() in * their C libraries. They should get off their butts and do something * about it; at least one public-domain implementation of those (highly * useful) string routines has been published on Usenet. */ /* * strcspn - find length of initial segment of s1 consisting entirely * of characters not from s2 */ static int strcspn(s1, s2) char *s1; char *s2; { register char *scan1; register char *scan2; register int count; count = 0; for (scan1 = s1; *scan1 != '\0'; scan1++) { for (scan2 = s2; *scan2 != '\0';) /* ++ moved down. */ if (*scan1 == *scan2++) return(count); count++; } return(count); } oregsub.cc–#4»€:/* * regsub * * Copyright (c) 1986 by University of Toronto. * Written by Henry Spencer. Not derived from licensed software. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to redistribute it freely, * subject to the following restrictions: * * 1. The author is not responsible for the consequences of use of * this software, no matter how awful, even if they arise * from defects in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. */ #include #include /* * The first byte of the regexp internal "program" is actually this magic * number; the start node begins in the second byte. */ #define MAGIC 0234 #define CHARBITS 0377 #ifndef CHARBITS #define UCHARAT(p) ((int)*(unsigned char *)(p)) #else #define UCHARAT(p) ((int)*(p)&CHARBITS) #endif /* - regsub - perform substitutions after a regexp match */ regsub(prog, source, dest) regexp *prog; char *source; char *dest; { register char *src; register char *dst; register char c; register int no; register int len; extern char *strncpy(); if (prog == NULL || source == NULL || dest == NULL) { regerror("NULL parm to regsub"); return; } if (UCHARAT(prog->program) != MAGIC) { regerror("damaged regexp fed to regsub"); return; } src = source; dst = dest; while ((c = *src++) != '\0') { if (c == '&') no = 0; else if (c == '\\' && '0' <= *src && *src <= '9') no = *src++ - '0'; else no = -1; if (no < 0) { /* Ordinary character. */ if (c == '\\' && (*src == '\\' || *src == '&')) c = *src++; *dst++ = c; } else if (prog->startp[no] != NULL && prog->endp[no] != NULL) { len = (int)(prog->endp[no] - prog->startp[no]); strncpy(dst, prog->startp[no], len); dst += len; if (len !=0 && *(dst-1) == '\0') { /* strncpy hit NUL. */ regerror("damaged match string"); return; } } } *dst++ = '\0'; } rindex.cc–#5»¤œchar *rindex(s, c) register char *s, c; { register char *result; result = 0; do if (*s == c) result = s; while (*s++ != 0); return(result); } scanf.cc–#6»¤(/* scanf - formatted input conversion Author: Patrick van Kleef */ #include int scanf (format, args) char *format; unsigned args; { return _doscanf (0, stdin, format, &args); } int fscanf (fp, format, args) FILE *fp; char *format; unsigned args; { return _doscanf (0, fp, format, &args); } int sscanf (string, format, args) char *string; /* source of data */ char *format; /* control string */ unsigned args; /* our args */ { return _doscanf (1, string, format, &args); } union ptr_union { char *chr_p; unsigned int *uint_p; unsigned long *ulong_p; }; static int ic; /* the current character */ static char *rnc_arg; /* the string or the filepointer */ static rnc_code; /* 1 = read from string, else from FILE */ /* get the next character */ static rnc () { if (rnc_code) { if (!(ic = *rnc_arg++)) ic = EOF; } else ic = getc ((FILE *) rnc_arg); } /* * unget the current character */ static ugc () { if (rnc_code) --rnc_arg; else ungetc (ic, rnc_arg); } static scnindex(ch, string) char ch; char *string; { while (*string++ != ch) if (!*string) return 0; return 1; } /* * this is cheaper than iswhite from */ static iswhite (ch) int ch; { return (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r'); } static isdigit (ch) int ch; { return (ch >= '0' && ch <= '9'); } static tolower (ch) int ch; { if (ch >= 'A' && ch <= 'Z') ch = ch + 'a' - 'A'; return ch; } /* * the routine that does the job */ _doscanf (code, funcarg, format, argp) int code; /* function to get a character */ char *funcarg; /* an argument for the function */ char *format; /* the format control string */ union ptr_union *argp; /* our argument list */ { int done = 0; /* number of items done */ int base; /* conversion base */ long val; /* an integer value */ int sign; /* sign flag */ int do_assign; /* assignment suppression flag */ unsigned width; /* width of field */ int widflag; /* width was specified */ int longflag; /* true if long */ int done_some; /* true if we have seen some data */ int reverse; /* reverse the checking in [...] */ char *endbracket; /* position of the ] in format string */ rnc_arg = funcarg; rnc_code = code; rnc (); /* read the next character */ if (ic == EOF) { done = EOF; goto quit; } while (1) { while (iswhite (*format)) ++format; /* skip whitespace */ if (!*format) goto all_done; /* end of format */ if (ic < 0) goto quit; /* seen an error */ if (*format != '%') { while (iswhite (ic)) rnc (); if (ic != *format) goto all_done; ++format; rnc (); continue; } ++format; do_assign = 1; if (*format == '*') { ++format; do_assign = 0; } if (isdigit (*format)) { widflag = 1; for (width = 0; isdigit (*format);) width = width * 10 + *format++ - '0'; } else widflag = 0; /* no width spec */ if (longflag = (tolower (*format) == 'l')) ++format; if (*format != 'c') while (iswhite (ic)) rnc (); done_some = 0; /* nothing yet */ switch (*format) { case 'o': base = 8; goto decimal; case 'u': case 'd': base = 10; goto decimal; case 'x': base = 16; if (((!widflag) || width >= 2) && ic == '0') { rnc (); if (tolower (ic) == 'x') { width -= 2; done_some = 1; rnc (); } else { ugc (); ic = '0'; } } decimal: val = 0L; /* our result value */ sign = 0; /* assume positive */ if (!widflag) width = 0xffff; /* very wide */ if (width && ic == '+') rnc (); else if (width && ic == '-') { sign = 1; rnc (); } while (width--) { if (isdigit (ic) && ic - '0' < base) ic -= '0'; else if (base == 16 && tolower (ic) >= 'a' && tolower (ic) <= 'f') ic = 10 + tolower (ic) - 'a'; else break; val = val * base + ic; rnc (); done_some = 1; } if (do_assign) { if (sign) val = -val; if (longflag) *(argp++)->ulong_p = (unsigned long) val; else *(argp++)->uint_p = (unsigned) val; } if (done_some) { if(do_assign) ++done; } else goto all_done; break; case 'c': if (!widflag) width = 1; while (width-- && ic >= 0) { if (do_assign) *(argp)->chr_p++ = (char) ic; rnc (); done_some = 1; } if (do_assign) argp++; /* done with this one */ if (done_some && do_assign) ++done; break; case 's': if (!widflag) width = 0xffff; while (width-- && !iswhite (ic) && ic > 0) { if (do_assign) *(argp)->chr_p++ = (char) ic; rnc (); done_some = 1; } if (do_assign) /* terminate the string */ *(argp++)->chr_p = '\0'; if (done_some) { if(do_assign) ++done; } else goto all_done; break; case '[': if (!widflag) width = 0xffff; if ( *(++format) == '^' ) { reverse = 1; format++; } else reverse = 0; endbracket = format; while ( *endbracket != ']' && *endbracket != '\0') endbracket++; if (!*endbracket) goto quit; *endbracket = '\0'; /* change format string */ while (width-- && !iswhite (ic) && ic > 0 && (scnindex (ic, format) ^ reverse)) { if (do_assign) *(argp)->chr_p++ = (char) ic; rnc (); done_some = 1; } format = endbracket; *format = ']'; /* put it back */ if (do_assign) /* terminate the string */ *(argp++)->chr_p = '\0'; if (done_some) { if(do_assign) ++done; } else goto all_done; break; } /* end switch */ ++format; } all_done: if (ic >= 0) ugc (); /* restore the character */ quit: return done; } setbuf.cc–#6»¤+#include setbuf(iop, buffer) FILE *iop; char *buffer; { if ( iop->_buf && testflag(iop,IOMYBUF) ) free(iop->_buf); iop->_flags &= ~(IOMYBUF | UNBUFF | PERPRINTF); iop->_buf = buffer; if ( iop->_buf == NULL ) iop->_flags |= UNBUFF; iop->_ptr = iop->_buf; iop->_count = 0; } #setgid.cc–#6»¤y#include "lib.h" PUBLIC int setgid(grp) int grp; { return callm1(MM, SETGID, grp, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); } #setuid.cc–#7»¤y#include "lib.h" PUBLIC int setuid(usr) int usr; { return callm1(MM, SETUID, usr, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); } #signal.cc–#7»¤K#include "lib.h" #include int (*vectab[NSIG])(); /* array of functions to catch signals */ /* The definition of signal really should be * PUBLIC int (*signal(signr, func))() * but some compilers refuse to accept this, even though it is correct. * The only thing to do if you are stuck with such a defective compiler is * change it to * PUBLIC int *signal(signr, func) * and change ../h/signal.h accordingly. */ PUBLIC int (*signal(signr, func))() int signr; /* which signal is being set */ int (*func)(); /* pointer to function that catches signal */ { int r,(*old)(); old = vectab[signr - 1]; vectab[signr - 1] = func; M.m6_i1 = signr; M.m6_f1 = ( (func == SIG_IGN || func == SIG_DFL) ? func : begsig); r = callx(MM, SIGNAL); if (r == 1) old = SIG_IGN; return( (r < 0 ? (int (*)()) r : old) ); } #sleep.cc–#8»¤ė#include "lib.h" #include PRIVATE alfun(){} /* used with sleep() below */ PUBLIC sleep(n) int n; { /* sleep(n) pauses for 'n' seconds by scheduling an alarm interrupt. */ signal(SIGALRM, alfun); alarm(n); pause(); } #sprintf.c–#8»¤&#include char *sprintf(buf,format,args) char *buf, *format; int args; { FILE _tempfile; _tempfile._fd = -1; _tempfile._flags = WRITEMODE + STRINGS; _tempfile._buf = buf; _tempfile._ptr = buf; _doprintf(&_tempfile,format,&args); putc('\0',&_tempfile); return buf; } stat.c.c–#8»¤¤#include "lib.h" PUBLIC int stat(name, buffer) char *name; char *buffer; { int n; n = callm1(FS, STAT, len(name), 0, 0, name, buffer, NIL_PTR); return(n); } stb.c.c–#9»¤Ó /* library routine for copying structs with unpleasant alignment */ __stb(n, f, t) register char *f, *t; register int n; { if (n > 0) do *t++ = *f++; while (--n); } stderr.c–#9»¤[std_err(s) char *s; { char *p = s; while(*p != 0) p++; write(2, s, (int)(p - s)); } sstime.c–#:»¤d#include "lib.h" PUBLIC int stime(top) long *top; { M.m2_l1 = *top; return callx(FS, STIME); } strcat.c–#:»¤ char *strcat(s1, s2) register char *s1, *s2; { /* Append s2 to the end of s1. */ char *original = s1; /* Find the end of s1. */ while (*s1 != 0) s1++; /* Now copy s2 to the end of s1. */ while (*s2 != 0) *s1++ = *s2++; *s1 = 0; return(original); } cstrchr.c–#:»€/* strchr(3) * * Derived from MINIX index(3) */ #define NULL (char *) 0 char *strchr( string, chr ) register char *string; register char chr; { do { if ( *string == chr ) return( string ); } while ( *string++ != '\0' ); return( NULL ); } strcmp.c–#;»¤§int strcmp(s1, s2) register char *s1, *s2; { /* Compare 2 strings. */ while (1) { if (*s1 != *s2) return(*s1 - *s2); if (*s1 == 0) return(0); s1++; s2++; } } istrcpy.c–#;»¤Ÿchar *strcpy(s1, s2) register char *s1, *s2; { /* Copy s2 to s1. */ char *original = s1; while (*s2 != 0) *s1++ = *s2++; *s1 = 0; return(original); } cstrcspn.c–#<»€ŗ/* strcspn(3) * * Author: Terrence W. Holm July 1988 * * * This function determines the length of a span from the * beginning of which contains none of the * characters specified in . The length of the * span is returned. */ #define NULL (char *) 0 int strcspn( string, char_set ) char *string; char *char_set; { register char *str; register char *chr; if ( string == NULL ) return( 0 ); if ( char_set == NULL ) return( strlen(string) ); for ( str = string; *str != '\0'; ++str ) for ( chr = char_set; *chr != '\0'; ++chr ) if ( *str == *chr ) return( str - string ); return( str - string ); } strlen.c–#<»¤|int strlen(s) char *s; { /* Return length of s. */ char *original = s; while (*s != 0) s++; return(s - original); } strncat.c–#<»¤ŗ/* strncat.c - char *strncat( char *s1, char *s2, int n ) Strncat appends up to n characters from s2 to the end of s1. It returns s1. */ char *strncat( s1, s2, n ) char *s1; register char *s2; int n; { register char *rs1; rs1 = s1; if ( n > 0 ) { while ( *rs1++ != 0 ) ; --rs1; while ( (*rs1++ = *s2++) != 0 ) if ( --n == 0 ) { *rs1 = 0; break; } } return s1; } strncmp.c–#=»¤ę/* strncmp.c - int strncmp( char *s1, char *s2, int n ) Strcmp compares s1 to s2, up to at most n characters (lexicographically with native character comparison). It returns positive if s1 > s2 zero if s1 = s2 negative if s1 < s2. */ int strncmp( s1, s2, n ) register char *s1; register char *s2; int n; { if ( n <= 0 ) return 0; while ( *s1++ == *s2++ ) if ( s1[-1] == 0 || --n == 0 ) return 0; return s1[-1] - s2[-1]; } strncpy.c–#=»¤/* strncpy.c - char *strncpy( char *s1, char *s2, int n ) Strncpy writes exactly n (or 0 if n < 0) characters to s1. It copies up to n characters from s2, and null-pads the rest. The result is null terminated iff strlen( s2 ) < n. It returns the target string. */ char *strncpy( s1, s2, n ) char *s1; register char *s2; int n; { register char *rs1; rs1 = s1; if ( n > 0 ) { while ( (*rs1++ = *s2++) != 0 && --n != 0 ) ; if ( n != 0 ) while ( --n != 0 ) *rs1++ = 0; } return s1; } /strpbrk.c–#>»€ž/* strpbrk(3) * * Author: Terrence W. Holm July 1988 * * * Strpbrk(3) scans for the first occurrence of a * character from the string . If a character from * the was found then a pointer to it within * is returned, otherwise NULL is returned. */ #define NULL (char *) 0 char *strpbrk( string, char_set ) char *string; char *char_set; { register char c; register char *p; if ( string == NULL || char_set == NULL ) return( NULL ); while ( (c = *string++) != '\0' ) for ( p = char_set; *p != '\0'; ++p ) if ( c == *p ) return( string - 1 ); return( NULL ); } strrchr.c–#>»€-/* strrchr(3) * * Derived from MINIX rindex(3) */ #define NULL (char *) 0 char *strrchr( string, chr ) register char *string; register char chr; { char *index = NULL; do { if ( *string == chr ) index = string; } while ( *string++ != '\0' ); return( index ); } /strspn.c–#?»€Į/* strspn(3) * * Author: Terrence W. Holm July 1988 * * * This function determines the length of a span from the * beginning of which contains only characters * specified in . The length of the span is * returned. */ #define NULL (char *) 0 int strspn( string, char_set ) char *string; char *char_set; { register char *str; register char *chr; if ( string == NULL || char_set == NULL ) return( 0 ); for ( str = string; *str != '\0'; ++str ) { for ( chr = char_set; *chr != '\0'; ++chr ) if ( *str == *chr ) break; if ( *chr == '\0' ) return( str - string ); } return( str - string ); } /strstr.c–#?»€X/* strstr(3) * * Author: Terrence W. Holm July 1988 * * * Finds the first occurrence of a substring, pointed to by * , within a string pointed to by . * If the substring is found then a pointer to it within * is returned, otherwise NULL is returned. */ #define NULL (char *) 0 char *strstr( string, substr ) char *string; char *substr; { register char head_string; register char head_substr; if ( string == NULL || substr == NULL ) return( NULL ); head_substr = *substr++; while ( (head_string = *string++) != '\0' ) if ( head_string == head_substr ) { register char *tail_string = string; register char *tail_substr = substr; do { if ( *tail_substr == '\0' ) return( string - 1 ); } while ( *tail_string++ == *tail_substr++ ); } return( NULL ); } strtok.c–#@»€/* strtok(3) * * Author: Terrence W. Holm July 1988 * * * This function is used to divide up a string into tokens. * Strtok(3) is called with pointing to the string * to be scanned and pointing to a string which * consists of the set of separator characters. Tokens are * substrings bordered by separator characters. A pointer to * the first token encountered is returned. If is * NULL then the scan is continued from the last token * returned. Each token is terminated by a '\0'. If there are * no tokens remaining in the string then NULL is returned. */ #define NULL (char *) 0 char *strtok( string, char_set ) char *string; char *char_set; { static char *last_string = ""; register char *chr; char *next_token; if ( string == NULL ) string = last_string; if ( char_set == NULL ) return( NULL ); /* First skip over any separator characters */ while ( *string != '\0' ) { for ( chr = char_set; *chr != '\0'; ++chr ) if ( *string == *chr ) break; if ( *chr == '\0' ) break; ++string; } /* Check if we have reached the end of the string */ if ( *string == '\0' ) return( NULL ); /* If not, then we have found the next token */ next_token = string; /* Scan for the end of this token */ while ( *string != '\0' ) { for ( chr = char_set; *chr != '\0'; ++chr ) if ( *string == *chr ) { *string = '\0'; last_string = string + 1; return( next_token ); } ++string; } last_string = string; return( next_token ); } /stty.cc–#@»€`#include stty(fd, argp) int fd; char *argp; { return ioctl(fd, TIOCSETP, argp); } swab.cc–#A»€/* swab(3) * * Author: Terrence W. Holm Sep. 1988 */ swab( from, to, count ) char *from; char *to; int count; { register char temp; count >>= 1; while( --count >= 0 ) { temp = *from++; *to++ = *from++; *to++ = temp; } } sync.cc–#A»¤g#include "lib.h" PUBLIC int sync() { return callm1(FS, SYNC, 0, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); } #syslib.c–#B»¤#include #include #include #include #include #define FS FS_PROC_NR #define MM MMPROCNR extern message M; /*---------------------------------------------------------------------------- Messages to systask (special calls) ----------------------------------------------------------------------------*/ #ifdef ATARI_ST PUBLIC sys_xit(parent, proc, basep, sizep) phys_clicks *basep, *sizep; #else PUBLIC sys_xit(parent, proc) #endif int parent; /* parent of exiting proc. */ int proc; /* which proc has exited */ { /* A proc has exited. Tell the kernel. */ callm1(SYSTASK, SYS_XIT, parent, proc, 0, NIL_PTR, NIL_PTR, NIL_PTR); #ifdef ATARI_ST *basep = (phys_clicks)M.m1_i1; *sizep = (phys_clicks)M.m1_i2; #endif } PUBLIC sys_getsp(proc, newsp) int proc; /* which proc has enabled signals */ vir_bytes *newsp; /* place to put sp read from kernel */ { /* Ask the kernel what the sp is. */ callm1(SYSTASK, SYS_GETSP, proc, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); *newsp = (vir_bytes) M.STACK_PTR; } PUBLIC sys_sig(proc, sig, sighandler) int proc; /* which proc has exited */ int sig; /* signal number: 1 - 16 */ int (*sighandler)(); /* pointer to signal handler in user space */ { /* A proc has to be signaled. Tell the kernel. */ M.m6_i1 = proc; M.m6_i2 = sig; M.m6_f1 = sighandler; callx(SYSTASK, SYS_SIG); } #ifdef ATARI_ST PUBLIC sys_fork(parent, child, pid, shadow) #ifdef ALCYON_C_BUG_FIXED phys_clicks shadow; /* memory allocated for shadow */ #endif #else PUBLIC sys_fork(parent, child, pid) #endif int parent; /* proc doing the fork */ int child; /* which proc has been created by the fork */ int pid; /* process id assigned by MM */ { /* A proc has forked. Tell the kernel. */ #ifdef ATARI_ST callm1(SYSTASK, SYS_FORK, parent, child, pid, (char *)shadow, NIL_PTR, NIL_PTR); #else callm1(SYSTASK, SYS_FORK, parent, child, pid, NIL_PTR, NIL_PTR, NIL_PTR); #endif } PUBLIC sys_exec(proc, ptr) int proc; /* proc that did exec */ char *ptr; /* new stack pointer */ { /* A proc has exec'd. Tell the kernel. */ callm1(SYSTASK, SYS_EXEC, proc, 0, 0, ptr, NIL_PTR, NIL_PTR); } PUBLIC sys_newmap(proc, ptr) int proc; /* proc whose map is to be changed */ char *ptr; /* pointer to new map */ { /* A proc has been assigned a new memory map. Tell the kernel. */ callm1(SYSTASK, SYS_NEWMAP, proc, 0, 0, ptr, NIL_PTR, NIL_PTR); } PUBLIC sys_copy(mptr) message *mptr; /* pointer to message */ { /* A proc wants to use local copy. */ /* Make this routine better. Also check other guys' error handling -DEBUG */ mptr->m_type = SYS_COPY; if (sendrec(SYSTASK, mptr) != OK) panic("sys_copy can't send", NO_NUM); } PUBLIC sys_times(proc, ptr) int proc; /* proc whose times are needed */ real_time ptr[4]; /* pointer to time buffer */ { /* Fetch the accounting info for a proc. */ callm1(SYSTASK, SYS_TIMES, proc, 0, 0, ptr, NIL_PTR, NIL_PTR); ptr[0] = M.USER_TIME; ptr[1] = M.SYSTEM_TIME; ptr[2] = M.CHILD_UTIME; ptr[3] = M.CHILD_STIME; } PUBLIC sys_abort() { /* Something awful has happened. Abandon ship. */ callm1(SYSTASK, SYS_ABORT, 0, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); } #ifdef ATARI_ST PUBLIC sys_fresh(proc, ptr, dc, basep, sizep) int proc; /* proc whose map is to be changed */ char *ptr; /* pointer to new map */ phys_clicks dc; /* size of initialized data */ phys_clicks *basep, *sizep; /* base and size for free_mem() */ { /* Create a fresh process image for exec(). Tell the kernel. */ callm1(SYSTASK, SYS_FRESH, proc, (int)dc, 0, ptr, NIL_PTR, NIL_PTR); *basep = (phys_clicks)M.m1_i1; *sizep = (phys_clicks)M.m1_i2; } #endif PUBLIC sys_kill(proc, sig) int proc; /* which proc has exited */ int sig; /* signal number: 1 - 16 */ { /* A proc has to be signaled via MM. Tell the kernel. */ M.m6_i1 = proc; M.m6_i2 = sig; callx(SYSTASK, SYS_KILL); } PUBLIC int tell_fs(what, p1, p2, p3) int what, p1, p2, p3; { /* This routine is only used by MM to inform FS of certain events: * tell_fs(CHDIR, slot, dir, 0) * tell_fs(EXIT, proc, 0, 0) * tell_fs(FORK, parent, child, pid) * tell_fs(SETGID, proc, realgid, effgid) * tell_fs(SETUID, proc, realuid, effuid) * tell_fs(SYNC, 0, 0, 0) * tell_fs(UNPAUSE, proc, signr, 0) * tell_fs(SETPGRP, proc, 0, 0) */ callm1(FS, what, p1, p2, p3, NIL_PTR, NIL_PTR, NIL_PTR); } tsystem.c–#C»¤“#include system(cmd) char *cmd; { int retstat, procid, waitstat; if ( (procid = fork()) == 0) { /* Child does an exec of the command. */ execl( "/bin/sh", "sh", "-c", cmd, 0 ); exit( 127 ); } /* Check to see if fork failed. */ if (procid < 0) exit(1); while ( (waitstat = wait(&retstat)) != procid && waitstat != -1 ) ; if (waitstat == -1) retstat = -1; return(retstat); } termcap.c–#D»€L/* * termcap.c 1.1 20/7/87 agc Joypace Ltd * * Copyright Joypace Ltd, London, UK, 1987. All rights reserved. * This file may be freely distributed provided that this notice * remains attached. * * A public domain implementation of the termcap(3) routines. */ /* efth 1988-Apr-29 - Correct when TERM != name and TERMCAP is defined [tgetent] - Correct the comparison for the terminal name [tgetent] - Correct the value of ^x escapes [tgetstr] - Added %r to reverse row/column [tgoto] */ #include #define CAPABLEN 2 #define ISSPACE(c) ((c) == ' ' || (c) == '\t' || (c) == '\r' || (c) == '\n') #define ISDIGIT(x) ((x) >= '0' && (x) <= '9') char *capab; /* the capability itself */ extern char *getenv(); /* new, improved getenv */ extern FILE *fopen(); /* old fopen */ /* * tgetent - get the termcap entry for terminal name, and put it * in bp (which must be an array of 1024 chars). Returns 1 if * termcap entry found, 0 if not found, and -1 if file not found. */ int tgetent(bp, name) char *bp; char *name; { FILE *fp; char *file; char *cp; short len = strlen(name); capab = bp; /* Fixed problem: If TERM != name and TERMCAP was defined, */ /* then should look in /etc/termcap, but didn't. (efth) */ if ( (file = getenv("TERMCAP")) == NULL ) file = "/etc/termcap"; else if ( *file != '/' ) if ( (cp = getenv("TERM")) != NULL && strcmp( name, cp ) == 0 ) { strcpy( bp, file ); return( 1 ); } else file = "/etc/termcap"; if ((fp = fopen(file, "r")) == (FILE *) NULL) return(-1); while (fgets(bp, 1024, fp) != NULL) { /* Read in the rest of the definition now (efth) */ while (*(cp = &bp[strlen(bp) - 2]) == '\\') fgets(cp, 1024, fp); /* skip V6 two letter name */ for (cp = bp ; *cp != '|' ; cp++) ; for (++cp ; ISSPACE(*cp) ; cp++) ; /* Make sure "name" matches exactly (efth) */ if (strncmp(name, cp, len) == 0 && cp[len] == '|') { fclose(fp); return(1); } } fclose(fp); return(0); } /* * tgetnum - get the numeric terminal capability corresponding * to id. Returns the value, -1 if invalid. */ int tgetnum(id) char *id; { char *cp; int ret; if ((cp = capab) == NULL || id == NULL) return(-1); while (*++cp != ':') ; for (++cp ; *cp ; cp++) { while (ISSPACE(*cp)) cp++; if (strncmp(cp, id, CAPABLEN) == 0) { while (*cp && *cp != ':' && *cp != '#') cp++; if (*cp != '#') return(-1); for (ret = 0, cp++ ; *cp && ISDIGIT(*cp) ; cp++) ret = ret * 10 + *cp - '0'; return(ret); } while (*cp && *cp != ':') cp++; } return(-1); } /* * tgetflag - get the boolean flag corresponding to id. Returns -1 * if invalid, 0 if the flag is not in termcap entry, or 1 if it is * present. */ int tgetflag(id) char *id; { char *cp; if ((cp = capab) == NULL || id == NULL) return(-1); while (*++cp != ':') ; for (++cp ; *cp ; cp++) { while (ISSPACE(*cp)) cp++; if (strncmp(cp, id, CAPABLEN) == 0) return(1); while (*cp && *cp != ':') cp++; } return(0); } /* * tgetstr - get the string capability corresponding to id and place * it in area (advancing area at same time). Expand escape sequences * etc. Returns the string, or NULL if it can't do it. */ char * tgetstr(id, area) char *id; char **area; { char *cp; char *ret; int i; if ((cp = capab) == NULL || id == NULL) return(NULL); while (*++cp != ':') ; for (++cp ; *cp ; cp++) { while (ISSPACE(*cp)) cp++; if (strncmp(cp, id, CAPABLEN) == 0) { while (*cp && *cp != ':' && *cp != '=') cp++; if (*cp != '=') return(NULL); for (ret = *area, cp++; *cp && *cp != ':' ; (*area)++, cp++) switch(*cp) { case '^' : **area = *++cp - '@'; /* fix (efth)*/ break; case '\\' : switch(*++cp) { case 'E' : **area = '\033'; break; case 'n' : **area = '\n'; break; case 'r' : **area = '\r'; break; case 't' : **area = '\t'; break; case 'b' : **area = '\b'; break; case 'f' : **area = '\f'; break; case '0' : case '1' : case '2' : case '3' : for (i=0 ; *cp && ISDIGIT(*cp) ; cp++) i = i * 8 + *cp - '0'; **area = i; cp--; break; case '^' : case '\\' : **area = *cp; break; } break; default : **area = *cp; } *(*area)++ = '\0'; return(ret); } while (*cp && *cp != ':') cp++; } return(NULL); } /* * tgoto - given the cursor motion string cm, make up the string * for the cursor to go to (destcol, destline), and return the string. * Returns "OOPS" if something's gone wrong, or the string otherwise. */ char * tgoto(cm, destcol, destline) char *cm; int destcol; int destline; { register char *rp; static char ret[24]; int incr = 0; int argno = 0, numval; for (rp = ret ; *cm ; cm++) { switch(*cm) { case '%' : switch(*++cm) { case '+' : numval = (argno == 0 ? destline : destcol); argno = 1 - argno; *rp++ = numval + incr + *++cm; break; case '%' : *rp++ = '%'; break; case 'i' : incr = 1; break; case 'd' : numval = (argno == 0 ? destline : destcol); numval += incr; argno = 1 - argno; *rp++ = '0' + (numval/10); *rp++ = '0' + (numval%10); break; case 'r' : argno = 1; break; } break; default : *rp++ = *cm; } } *rp = '\0'; return(ret); } /* * tputs - put the string cp out onto the terminal, using the function * outc. This should do padding for the terminal, but I can't find a * terminal that needs padding at the moment... */ int tputs(cp, affcnt, outc) register char *cp; int affcnt; int (*outc)(); { if (cp == NULL) return(1); /* do any padding interpretation - left null for MINIX just now */ while (*cp) (*outc)(*cp++); return(1); } /* * That's all, folks... */ time.c.c–#D»¤#include "lib.h" PUBLIC long time(tp) long *tp; { int k; long l; k = callm1(FS, TIME, 0, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); if (M.m_type < 0 || k != OK) {errno = -M.m_type; return(-1L);} l = M.m2_l1; if (tp != (long *) 0) *tp = l; return(l); } times.cc–#E»¤0#include "lib.h" #include #include PUBLIC int times(buf) struct tms *buf; { int k; k = callm1(FS, TIMES, 0, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); buf->tms_utime = M.m4_l1; buf->tms_stime = M.m4_l2; buf->tms_cutime = M.m4_l3; buf->tms_cstime = M.m4_l4; return(k); } ttyname.c–#E»€W/* ttyname(3) */ #include #include #include #define NULL (char *) 0 #define DEV "/dev/" static char file_name[40]; char *ttyname( tty_file_desc ) int tty_file_desc; { int dev_dir_desc; struct direct dir_entry; struct stat tty_stat; struct stat dev_stat; /* Make sure the supplied file descriptor is for a terminal */ if ( fstat(tty_file_desc, &tty_stat) < 0 ) return( NULL ); if ( (tty_stat.st_mode & S_IFMT) != S_IFCHR ) return( NULL ); /* Open /dev for reading */ if ( (dev_dir_desc = open(DEV,0)) < 0 ) return( NULL ); while( read(dev_dir_desc, (char *) &dir_entry, sizeof (struct direct)) > 0 ) { /* Find an entry in /dev with the same inode number */ if ( tty_stat.st_ino != dir_entry.d_ino ) continue; /* Put the name of the device in static storage */ strcpy( file_name, DEV ); strncat( file_name, dir_entry.d_name, sizeof (dir_entry.d_name) ); /* Be absolutely certain the inodes match */ if ( stat(file_name, &dev_stat) < 0 ) continue; if ( (dev_stat.st_mode & S_IFMT) != S_IFCHR ) continue; if ( tty_stat.st_ino == dev_stat.st_ino && tty_stat.st_dev == dev_stat.st_dev && tty_stat.st_rdev == dev_stat.st_rdev ) { close( dev_dir_desc ); return( file_name ); } } close( dev_dir_desc ); return( NULL ); } /umask.cc–#E»¤‰#include "lib.h" PUBLIC int umask(complmode) int complmode; { return callm1(FS, UMASK, complmode, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); } #umount.c–#F»¤`#include "lib.h" PUBLIC int umount(name) char* name; { return callm3(FS, UMOUNT, 0, name); } ungetc.c–#F»¤#include ungetc(ch, iop) int ch; FILE *iop; { if ( ch < 0 || !testflag(iop,READMODE) || testflag(iop,UNBUFF) ) return( EOF ); if ( iop->_count >= BUFSIZ) return(EOF); if ( iop->_ptr == iop->_buf) iop->_ptr++; iop->_count++; *--iop->_ptr = ch; return(ch); } uniqport.c–#G»€v#include uniqport(p) port *p; { register char *c; register short r; register n; static been_here; if (!been_here) { long t, time(); time(&t); srand(getpid() + (int)((t>>16) + t)); been_here = 1; } do { c = (char *) p; n = PORTSIZE / 2; do { r = rand(); *c++ ^= r >> 8; *c++ ^= r & 0377; } while (--n); } while (NullPort(p)); } unlink.cc–#G»¤`#include "lib.h" PUBLIC int unlink(name) char *name; { return callm3(FS, UNLINK, 0, name); } utime.cc–#H»¤»#include "lib.h" PUBLIC int utime(name, timp) char *name; long timp[2]; { M.m2_i1 = len(name); M.m2_l1 = timp[0]; M.m2_l2 = timp[1]; M.m2_p1 = name; return callx(FS, UTIME); } #wait.cc–#H»¤½#include "lib.h" PUBLIC int wait(status) int *status; { int k; k = callm1(MM, WAIT, 0, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR); if (k >= 0 && status != 0) *status = M.m2_i1; return(k); } #write.cc–#H»¤š#include "lib.h" PUBLIC int write(fd, buffer, nbytes) char *buffer; int nbytes; { return callm1(FS, WRITE, fd, nbytes, 0, buffer, NIL_PTR, NIL_PTR); } e’termcap.s—#›ż€&Č_tputs Č_tgetflag Č_tgetent Č_capab Č_tgoto Č_tgetstr Č_tgetnum É_tgetent † _tgetent: ƒ ‚ ×ņ,#8 Įļ Įš “ Ó_strlen ‰ ĄŲ,ė ĄęÅ Ą_capab,ķ Ąį_1 € Ó_getenv ‰ Ąéė or éš ŁI0013 Ąé#_2 ĢI0014 • cmpb (š),#47 je I0014 Ąį_3 € Ó_getenv ‰ Ąčė or čļ je I0019 Įļ “ Ó_strcmp ‰ ‰ ™ ŁI0019 Įš ˆ Ó_strcpy ‰ ‰  € š I0019: Ąé#_4 I0014: Ąį_5 € Įš Ó_fopen ‰ ‰ ” ĶĘö ŁI00110 Ąį-1 € š I00110: ” 024 € ˆ Ó_fgets ¤ ™ je I001F I00113: ¢ € € Ó_strlen ‰ ×į2 ‰ Äåė Ąčģ cmpb (ļ),#92 ŁI00112 ” 024 € Įļ Ó_fgets ¤ jmp I00113 I00112: ĄčÅ I00118: cmpb (ļ),#124 je I00115 Üļ š8 I00115: Üļ I0011C: cmpb (ļ),#32 je I0011A cmpb (ļ),#9 je I0011A cmpb (ļ),#13 je I0011A cmpb (ļ),#10 ŁI00119 I0011A: Üļ šC I00119: ĮŲ Įļ “ Ó_strncmp ¤ ™ ŁI00110 ĄåŲ Äåļ cmpb Ē,#124 ŁI00110 ” Ó_fclose ‰  € š I001F: ” Ó_fclose ‰ ‡ € Ÿ  Ģ.ds É_tgetnum _tgetnum: ƒ ‚ € € Įļ Įš Ąę_capab Ąčķ or ęķ je I0022 ĶÅö ŁI0027 I0022: Ąį-1 € ĢI0021 I0027: Üļ cmpb (ļ),#58 je I0026 ĢI0027 I0026: Üļ I002C: cmpb (ļ)ö je I0029 I002E: cmpb (ļ),#32 je I002F cmpb (ļ),#9 je I002F cmpb (ļ),#13 je I002F cmpb (ļ),#10 ŁI002D I002F: Üļ ĢI002E I002D: “ € ˆ Įļ Ó_strncmp ¤ ™ ŁI00225 I00217: cmpb (ļ)ö je I00216 cmpb (ļ),#58 je I00216 cmpb (ļ),#35 je I00216 Üļ ĢI00217 I00216: cmpb (ļ),#35 je I0021C Ąį-1 € ĢI0021 I0021C: Ėéš Üļ I00221: cmpb (ļ)ö je I0021E Źal,(ļ) ‹ Ķį48 jl I0021E Źal,(ļ) ‹ Ķį57 jg I0021E Źal,(ļ) ‹ € 0 mul š Ćķ Äęė ×ć48 Ąéķ Üļ ĢI00221 I0021E: Įš ĢI0021 I00225: cmpb (ļ)ö je I002A cmpb (ļ),#58 je I002A Üļ ĢI00225 I002A: Üļ ĢI002C I0029: Ąį-1 € I0021:  Ģ.ds É_tgetflag _tgetflag: ƒ ‚ € Įļ Įš ĄéÅ Ąę_capab Ąčķ or ęķ je I0032 or éš ŁI0037 I0032: Ąį-1 € ĢI0031 I0037: Üļ cmpb (ļ),#58 je I0036 ĢI0037 I0036: Üļ I003C: cmpb (ļ)ö je I0039 I003E: cmpb (ļ),#32 je I003F cmpb (ļ),#9 je I003F cmpb (ļ),#13 je I003F cmpb (ļ),#10 ŁI003D I003F: Üļ ĢI003E I003D: “ € Įš Įļ Ó_strncmp ¤ ™ ŁI00317  € ĢI0031 I00317: cmpb (ļ)ö je I003A cmpb (ļ),#58 je I003A Üļ ĢI00317 I003A: Üļ ĢI003C I0039: ‡ € I0031:  Ģ.ds É_tgetstr _tgetstr: ƒ ‚ ×ņ,#6 Įļ Įš ĄéĪ ® _6: ĀI0041F Ā12 Ā48 ĀI00432 Ā49 ĀI00432 Ā50 ĀI00432 Ā51 ĀI00432 Ā69 ĀI00429 Ā92 ĀI0043A Ā94 ĀI0043A Ā98 ĀI0042D Ā102 ĀI0042E Ā110 ĀI0042A Ā114 ĀI0042B Ā116 ĀI0042C _7: ĀI0043B Ā92 Ā2 ĀI00426 ĀI0043B ĀI00425 † Ąę_capab Ąčķ or ęķ je I0042 ĶÅö ŁI0047 I0042: ‡ € ĢI0041 I0047: Üļ cmpb (ļ),#58 je I0046 ĢI0047 I0046: Üļ I004C: cmpb (ļ)ö je I0049 I004E: cmpb (ļ),#32 je I004F cmpb (ļ),#9 je I004F cmpb (ļ),#13 je I004F cmpb (ļ),#10 ŁI004D I004F: Üļ ĢI004E I004D: “ € ˆ Įļ Ó_strncmp ¤ ™ ŁI0043D I00417: cmpb (si),#0 je I00416 cmpb (ļ),#58 je I00416 cmpb (ļ),#61 je I00416 Üļ ĢI00417 I00416: cmpb (ļ),#61 je I0041C ‡ € ĢI0041 I0041C: Ąä(š) ¬ Üļ I00421: cmpb (ļ)ö je I0041E cmpb (ļ),#58 je I0041E Źal,(ļ) ‹ € ĢI00423 I00425: Üļ Źal,(ļ) ‹ ×į64 Ąå(š) ŗ ĢI0041F I00426: Üļ Źal,(ļ) ‹ € ĢI00427 I00429: Ąå(š) ŹĒ,#27 ĢI0041F I0042A: Ąå(š) ŹĒ,#10 ĢI0041F I0042B: Ąå(š) ŹĒ,#13 ĢI0041F I0042C: Ąå(š) ŹĒ,#9 ĢI0041F I0042D: Ąå(š) ŹĒ,#8 ĢI0041F I0042E: Ąå(š) ŹĒ,#12 ĢI0041F I00432: ĄŠö I00436: cmpb (ļ)ö je I00433 Źal,(ļ) ‹ Ķį48 jl I00433 Źal,(ļ) ‹ Ķį57 jg I00433 Źal,(ļ) ‹ Ąć3 ĄēŠ sal ēcl Äēė ×ē#48 ĄŠ,ī Üļ ĢI00436 I00433: Ąå(š) ĄäŠ ŗ óļ ĢI0041F I0043A: Ąå(š) Źal,(ļ) ŗ jmp I0041F I00427: Ąā_6  Ģ.csb2 I0043B: Ąå(š) Źal,(ļ) ŗ ĢI0041F I00423: Ąā_7  Ģ.csa2 I0041F: Ü(š) Üļ ĢI00421 I0041E: ‡ € Į(š) Ü(š) ‰  ŗ ¹ ĢI0041 I0043D: cmpb (ļ)ö je I004A cmpb (ļ),#58 je I004A Üļ ĢI0043D I004A: Üļ ĢI004C I0049: ‡ € I0041:  Ģ.ds É_tgoto _tgoto: ƒ ‚ ×ņ,#8 Įļ Įš ĄéÅ ³ _8: .zerow 24/2 ® _9: ĀI0053 Ā5 Ā37 ĀI005F Ā43 ĀI005B Ā100 ĀI00511 Ā105 ĀI00510 Ā114 ĀI00515 _10: ĀI00516 Ā37 ø ĀI0058 † ĄĻö ĄŠö Ąč#_8 I0055: cmpb (š)ö je I0052 Źal,(š) ‹ € ĢI0056 I0058: Üš Źal,(š) ‹ € ĢI0059 I005B: ĶŠö ŁI005D ĮŌ ĢI005E I005D: “ I005E: ĆŲ  ×äŠ ĄŠ,ė Üš Źal,(š) ‹ ĄęĻ add cx,-8(ń) Äęė Ź(ļ),cl Üļ ĢI0053 I005F: Ź(ļ),#37 Üļ ĢI0053 I00510: ĄĻ,#1 ĢI0053 I00511: ĶŠö ŁI00513 ĮŌ ĢI00514 I00513: “ I00514: ĆŲ £ ÄŲ,ė  ×äŠ ĄŠ,ė Ąć10 ĄäŲ cwd išv ķ Äį48 Ź(ļ),al Üļ ĄäŲ cwd išv ķ Äē#48 Ź(ļ),dl Üļ ĢI0053 I00515: ĄŠ,#1 ĢI0053 I0059: Ąā_9  Ģ.csb2 I00516: Źal,(š) Ź(ļ),al Üļ ĢI0053 I0056: Ąā_10  Ģ.csa2 I0053: Üš ĢI0055 I0052: Ź(ļ)ö Ąį_8 Ģ.ds É_tputs _tputs: ƒ ‚ Įļ ĄčÅ or čļ ŁI0066  € ĢI0061 I0066: cmpb (ļ)ö je I0065 Ąåļ Üļ Œ ‹ ĄęŌ € Ó(ķ) ‰ ĢI0066 I0065:  € I0061:  Ģ.s É_capab ³ _capab: .zerow 2/2 ® _1: Ā17748 Ā19794 Ā16707 Ā80 _2: Ā25903 Ā25460 .word 29743 Ā29285 Ā25453 Ā28769 ø _3: Ā17748 Ā19794 ø _4: Ā25903 Ā25460 Ā29743 Ā29285 Ā25453 Ā28769 ø _5: Ā114 .text ... t11a.c.Z run t10a t11b.c.Zt11atest0.c.Zt11btest1.c.Ztest0test1test10.c.Ztest10test11.c.Ztest11test2.c.Ztest2test3.c.Ztest3test4makefiletest5test4.c.Z test6!test5.c.Z"test7#test6.c.Z$test8%t10a.c&test9'test7.c.Z(test8.c.Z)test9.c.Zm¤qƒ"Œœ3cX€0xʎĀ2nģĄI”` …ĒģP0A*ŚŁŅE” ˆInÜ£ą… SŹ”‘Ę Ę3uŚ@¤3œ0sę”!āĶ _(PDĒaĀl”Ńe#Sš6Q©i¦ąĮ‘0J‚A'FŒ0"R¤Q…Œ)66­ B+WÆ ·Ä+‚!Œ“kŪŹ÷*]»fŗŠÜ"ƒ/ÀٺQxnÖ­‰ńŽœįų ŒČ‚iTĘZsW”p¶„U(b9Ļ€v[cōaÓ(Pėå;'§N9³eŲ°•į!z€-YʍĀW]‚pņę”3éŅA3ÓL6ezœi© „–ėŹ)† Š £*Œ£žŚä 7ĒA¼nTÕ] §Ü šĮĒBRķ% 9ęVƒV„‡ĀeŠQGī­Õƒrō98 żMXafø`‡’Ķ—\¤‰HĒ¢ ”r2€˜"a,F!eĄh"~5zHY„-¾D(™B6ņ‚mĶ ZŽY‰$YŸ1¹–“P¾W‹eą‘(ŠāF},…Ū1(4ay$HlšōęJW݁Ęw3•¹K ¦› lų$&˜@§ …*gćzŹAŠ™ šÕ 1,8Ø~Ö!©Ÿ%Ąę +„ś&©,¦™¦m¹A‘E øgSÆYŌ•EČ!Ēs–@nˆ «h*test0 test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 echo All tests completed.  € ‰ć‹ƒĆ‰Č@ŃąŲ£€PSQčƒÄPč U‰å1ĄPč[éFU‰åƒ> t‹ ’Ń1ĄPPPPP’vøP1ĄPč#ƒÄéU‰å1ĄPPPPP’vøP1ĄPčƒÄé’U‰å‹N‰†‹N ‰ˆ‹N ‰Š‹N‰Œ‹N‰Ž‹N‰’v’včQ[[éÄU‰åPPVW’v č~[‰Ē‰>†‹N‰ˆ‹N ‰Š¾Œƒ’‰ųO Ąt ‹^ ’F ŠˆFėģ’v’vč[[évU‰åPV‹N‰„ø‚P’včN[[‰Ę ötVėƒ>„}‹„÷ى¢ø’’Pė’6„Xė8U‰åPV‹vW1’‰óF€?tGėõ‰ų@ė¹ė ¹ė¹ėU‰å‹F‹^Ķ ]Ć_^‰ģ]Ć^_ėųm¤qƒ"Œœ3cX€0xĘN é,<8f‡‚1h ‚PĮŠĪ–.÷(x”Ĕ2e@¤13ńL6eÜŠ™N˜9sʐńf‹/”’% 2+Ķ<čF…"čĈ!FDŠ Ź ˜#…E¢+AMŗ“į–OAˆ#fŒU¬ZgČšŖ¬Q¤f”vÜ"#­2e̜A“ęmÖ­3茋W/Ó-3üŖ1—†ā¢b÷Ņč"D0ąn­q9lŁ1?[><ĆŻŗYń¤”ƒāi‹}„6F1'†Ā9s/f”³±·BĄC¾C˜MJ]AˆL`y =>ĆaĀDqŲµc•S†N9C[¤nŌzźļć˟'Ųu}ļ+ģĖĄ’DīÜ håĘCą†rDĮ!GDJ‰P„r¼A\ dpᆠˆ› ą ¼ ‰ć‹ƒĆ‰Č@ŃąŲ£ą PSQčƒÄPčAU‰åPPV‹vW‹~øā P’4čA[[ ĄtøPčh[øč P’tč)[[ ĄtøPčP[øī P’tč[[ ĄtøPč8[øō P’tčł[[ ĄtøPč [øś P’5čā[[ ĄtøPč [ø P’učŹ[[ ĄtøPčń[ƒ~tøPčć[øčPFüPøPčƒÄ=tøPčÄ[€~üu€~ż tøPč°[čž= uøPč [čB= tøPč[č]=uø Pč€[č÷=tø!Pčp[1ĄPø Pčx[[ Ą}ø"PčX[1ĄPø Pč`[[ Ą}ø#Pč@[ødPčī[éa U‰åV‹vW‹~€=u €<u1ĄPėŠ˜PŠ˜Y9ĮtøPėGFėŪXé- U‰å’vø Pč([[é U‰åV‹vFP’vVčƒÄöD@tVčõ[éłU‰åFP’v’6< čōƒÄ‹< öG@t’6< čĢ[éŃU‰åPPVW‹^ƒĆ ‰Ž‹F1Ņ÷v‰×ƒĒ0ƒ’9~ƒĒN‰ųˆ‹F1Ņ÷v‰Fƒ~uՋ^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹FéoU‰åPPVW‹^ƒĆ ‰Ž‹F ™’v’vRPč0‰ĒƒĒ0ƒ’9~ƒĒN‰ųˆ‹F ™’v’vRP辉F‰V’v’v1ĄPPčf Ąu¹‹^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹FéóU‰åƒģ$VW‹^’FŠ˜‰Ē ’uéŁƒ’%t ’vWč‘[[ėŽFō‰ĘFō‰FšĒFä‹^€?-u’F’FäĒFā ‹^€?0u’FĒFā0ĒFź‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fź‰Fź~źėŹĒFęĒF胒.u9‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fč‰Fč~č’FęėĒĒFąƒ’ltƒ’Lu’Fą‹^€?t ‹^’FŠ˜‰ĒWé’Fąæė’Fąæ ė’Fąæƒ~ąt‹^ƒFW’w’7VčNžƒÄ‰Ęéé‹^ƒFW’7VčŲżƒÄ‰ĘéÓ’Fąƒ~ąt<‹^ƒF‹‹O‰F܉Nރ~Ž}Ę-F÷^Ü÷^ރ^Žø P’vŽ’vÜVčóżƒÄ‰Ę鎋^ƒF‹‰Fģƒ~ģ}Ę-F÷^ģø P’vģVčgżƒÄ‰ĘėcĒFā Ę?FėXĒFā ‹^ƒF‹ˆFėEĒFā ‹^ƒF‹‰Fšƒ~šuĒF𚠃~čuĒFč’‹vš€<t’Nč|Fėó‰ųˆFė»b Xé7‰š+Fš‰Fģ‹Fź+Fģ‰Fźƒ~ź}ĒFźƒ~äu÷^źƒ~ź}3‹^š€?-uƒ~ā0u‹^š’FšŠ˜’vPčG[[’Nģ’v’vāč9[[’Fźuš’Nģ|‹^š’FšŠ˜’vPč[[ėēƒ~źuéaż’v’vāč[[’NźėēU‰åPPV‹vW1’öDtø’’PéØöDuø’’Pé›öDtøPFP’4č+ƒÄ‰FžĒDGėHĒ ¦‹D‰ĆƒĆ1ɊNQ‰\‰ĆXˆ‹D@‰D||öD€u’t’t’4čāƒÄ‰Fž‹D‰DG ’t+ƒ~ž~‹Fž9Dtƒ~ž}LėLø’’PėĒD1ĄPXéwU‰åƒ> t‹ ’Ń1ĄPPPPP’vøP1ĄPčƒÄéOU‰å1ĄPPPPP’vøP1ĄPč€ƒÄé2U‰åPV1öƒž}‰óŃヿ: t ‰óŃć’·: č[FėįéU‰åPV‹vWöDuöDu1ĄPė7ƒ|1ĄPė,’t’t’4蒃ĉĒ9|uĒD‹D‰DWė Lø’’PXé²U‰åPV1ĄPPPPPPø/P1ĄPčåƒÄ‰Ę ö}Vė’6¦ XéˆU‰åPV1ĄPPPPPPøP1ĄP躃Ä‰Ę ö}Vė’6¦ Xé]U‰åPV1ĄPPPPPPø/P1ĄP菃ĉʉšé<U‰åPV1ĄPPPPPPøP1ĄPčnƒÄ‰Ę‰šéU‰å’v’vøPøP苃ÄéU‰åPV1ĄPP’vP’v’vøPøPč,ƒÄ‰Ę‰šéŁU‰å1ĄPP’vP’v’vøPøPčƒÄéøU‰å‹N‰¦ ‹N ‰Ø ‹N ‰Ŗ ‹N‰¬ ‹N‰® ‹N‰° ’v’včQ[[é}U‰åPPVW’v č[‰Ē‰>¦ ‹N‰Ø ‹N ‰Ŗ ¾¬ ƒ’‰ųO Ąt ‹^ ’F ŠˆFėģ’v’vč[[é/U‰åPV‹N‰¤ ø¢ P’včP[[‰Ę ötVėƒ>¤ }‹¤ ÷ى¢ø’’Pė’6¤ XéšU‰åPV‹vW1’‰óF€?tGėõ‰ų@éÓ¹ė ¹ė¹ėU‰å‹F‹^Ķ ]Ć[YZXV‰ę‡\^9Ówr9Čw tø’’Ć1ĄĆøƋ‹OƒĆI|;uö‹_…ŪuøP鬒ć‰ÓėļVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó‰Ź_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŌ+Tū@āćėŹVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó1ۉЉŚ_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŅ+Tū@āćėČčYčĆøŗä ė0øŗū ė(øŗ ė øŗ) ėøŗ@ ėøŗV ėøŗm ė1Ū‡š …ŪtP’ÓXĆ»SRøPč;čłū‰ĀƒśsŃ⻺ Ӌ…Ūt‰Śė»‹ ¹‰Āā0ˆKќќќāķŗ} ėŖU‰åǦ‹^‰Ø‹^‰Ŗ‹^‰®ø¤PøPø»¤¹Ķ ‰ģ]Ćč‰ū_^‰ģ]Ć^_ėųt11aarg0arg1arg2springsummert1t2Error %d   B     & 0 ü D7OüUōXģc²d:e§f§g§o’sÅu÷xļ(null)) @ ä m ū ū  Error: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow EM trap 0000000 octal ¼¼#ŅøƦ™2 xĢÉ3ēÅ:ačø@ćC‚2x蔑ć„@: 6r|³CĮǐr䌔Sņ¤Ę‡nä”Äؑ#6oܜ¹9§L™5(R”“8⠁Į“©Ó0˜(hF`P{0=™¦$Ó1hĀȹY†„E¦pä|4ƒB•2™Ā!BØVfތE‘D0vxL‚†ą4+V¤‘5ĮK:0`-é.ä“ļö¹›Ę "Wśż #…‚i×¶}³†‹›ŗ^C²éy:µ:lE€(A„½s\‹`į{„ŻĶ“++D˜0[bDīR’łX1[htńĖ‹,d°˜Ń‡ų˜ģŪ’ī‘Ž;T4`”A=÷=6XÜ`ƒEŽ>%į¤tÄ0Ōc‘]•/ØĀ[q„õĘr„Ń^zšeø”y8õō!cČQFD#š#Ž”–F#ĪęP)ø‚ /pv›GĹŃ#x ø!ClīDqt¤ŃF#†!Ff ŪCrŌ!ŚC0ĒPw=wrę (tōW‰'ŅŃV^Ų p¦°XͰXc¶įÖÖ*&9`x„ĮB&ŅQGeōvŌ ōĮUbpŠ‘!o¹ńЉ½½į٠±ą†] 0ƒ]Lm¶Õ˜eĘĄš(ŠĄ&nĀē r‚@ga‹1)©”*äŖ}¶õB¬³Özk £†„‚±uöAoˆų©­¤åŠ ¼:K¦™r蔫o“I\isÖim Łś*wvŲ–š ZF¬Ęž…¬µ6¤ūlˆLŗ‘ģ­„)KėPL5¤GsˆB9±‘‡†n0ģmoÜa#ŽwåµW_¤Fؐ%vēiž›f[FČ+±qR¦mÉ·bĖXž¹± Ri”ĮĘAŠ’ŃoÄaÄįJ‰Ö©æB)‹ƒP›% m™ėžÕī·)ŗņøõ‚€®²9€Ŗ-“Ņž[­²Ņy=&ŲżīJ-`ÖĘ0jl¦‚P‡l”U—±²¾( ]f¹l“½+Į :l:hĀh÷ÆÅ3„ńgę1 €Œ˜bŒŅ_ŅÕĄ„˾šÜź«,Ó ød3{Ś×üž½vĄ¢bKśge²ėķšįĀJÜ®«·īP ¬"/ø˜†FZ–0ĘN©<Œ>‚ q2ĒÜv¾·£p|™Ä=‡=ą“£ĆĄÆ)ćOąĘÖ³3ŃöŅŻ_½ųø®-³Ø]w’Ü0ŲĄ@Ą>8:1 čhĄ’É@™cą·0²NW„鎜€R½ØĄ`ņS– Ž–¾Ļl°}2x˹źjp%ō¦Ś‡æģżEmŗr]ō>óæ®m]œ`×6 :‚@l t*HDkÉĄv1ż9‘{Qģ ū:ØĀ€Š‰č£żĀā”mmł!żbŲCĪ%ˆ’ā­THčō/3j_ lŠFĄMņŠP1› ÕČĮßĮ >*TŪ­dšIJZk$”ć ļWĒŗqlLš Į(Åq©…¤¤)•5rń9_Ō–Ū7†2j—P¤%'ŪēĮŽ”5ˆŹ)µØĢHNń“Ķ|e갉I4&ą—^Ō¤ WDĆV’Ņ’å›AµÕĒŁ)r 5šć;mĮDr 9€`|N¹Ēj®ŃŽ0Į rPIDt ˜|$‡Y=2üī™Öڧ—Y½P1sč(A#šJmĶń€żaDgÉNčųšV6x§ ’B+eŃ@‡ŚŖ%”¢é<‘ -č­hjSą4…M¦0_4Fėó/ū»5cJQ[VŃ}õ&S­IœP2¤ƒ ØOU ”$•qg0ĒōQüIG›yd śYRŹóž+Ģ;™8Čwjē‡ 8Möš€{Ƴ‰.UčT’¹ĶČd󙆕¦²¢)N†’1ĒdR :Ŗ¾¦‚Ą«·D¬a™‚s‘”¬«¤ćQó'Y˜Ž©YU)#ßyČ[Ae®ś,_ „z¶ŲM `ēZŖÆTu¦`K\oŠSš+ÕŚF«_,”mēV77Ü uv9Į ha Ė‘Į„†4$ģ1 XŅz’°:ĄAa±ī@`‡0¤ žć)Gwš‡(‰I& Ø>ē>Źš7IKBA~Å ĢĶW‚ ńn XÉ*”椌J÷ģą¦|6Č`|IC_0æśżXd8Ä 8Ä †ęmŹ’õöd"ųš¢ę5®bQĘIPr+w`wĒQ"iz<ƒk«&Žń}gģ& /sžģg°¤&%/‰ÉÄ1Įž8&ŁĄ“SvĮC¾‘ūĪŽČųJ&uLČ@6øń“‚œĄøĪŻCņ}Ū"cy5yĪ\ʰn§ ‘*÷yPnŅr ńUÜ0y%fŲÓŠ¬sL̵Ÿ—ģēE+Ėl5nŲ<ķeĮŽéĆs@“/l-Ū%r Ų r@å4ŒDl袂t’®d,C|Łńå\˜qīiØs`0kaĘ4Y™®enb7ādڹĔ2qĢ mś˜×ŚT™ĆX µa š"ƒ Ź#^ójčя¶Ķ†0œ!6ÖqβOā`‡ßŌ¹ •¬*k)Ūaź’e¾tĆŲLŽ/=(v_ |‘u.u7P4ĆܽøUT˜±Z+(·MœĶ½[ČŻ$‚ˆŻaå¤Ę¢8S„;wµ¼ /łCc®Ć‡«AŲšžX j 5X:jسŗēXēünčĻ„ŗKÅi? ]/sR„Ō% *3Ō{';Ļžs½čgē’¾6ģ$}1^·wbŗ÷3ąKœ×V¹Čc~é}Wv<(_Øż>jVsmę.ī–Ķ]¾r¬-Ęš¢Ņ°*Éé/?}kZߚØRYwa‹Ų?ļXŠĶNtx§ż“k‡ Ū»÷ÆĻ=†uo „ė 'TŒD »®†¬„Bo›ŹŁ!•ß…óʃ@ѐ7˜Q01Óį mxĆAfwVćŠ|“uōóéf7D OœĶóŅ „džŠ“'· Ŗ,Ļ!Y&'[ߙļü/Äk{żļ??š×_ o1ššŅ6¦¦}Š'}ę÷ś7fŃwN$yŚ~Ū—rXÜē\NDYXiŠ·Ņ€ĻēdąDRFcvx)ųN“|ųrp,ų|3XvąDه‚Ļ7~åWƒ_ąƒeąDƒĘƒdöa@XfKrFāä7H“|20yG|9W¬†X“G§‘qa n(€Mˆ×6Ó!©Sr]†EČ|ģē3`†īĒs8&1ų€ Õ§N§Ä(0…nh†/]„ĀlÉŃ/¦qnP 4ÓSPb^@Ć"1)½įšņ3ļč&^"ņoĄ+’zѰq”AÆ· @  ‰ć‹ƒĆ‰Č@ŃąŲ£@ PSQčƒÄPčwU‰åV‹vøB P’4č}[[ ĄtøPč¤[øH P’tče[[ Ątø PčŒ[øL P’tčM[[ Ątø!Pčt[øT P’tč5[[ Ątø"Pč\[ƒ|tø#PčN[ƒ~tø$Pč@[øKPčī[éˆU‰åV‹vW‹~€=u €<u1ĄPėŠ˜PŠ˜Y9ĮtøPėGFėŪXéSU‰å’vøV Pč([[éCU‰åV‹vFP’vVčƒÄöD@tVčõ[éU‰åFP’v’6€ čōƒÄ‹€ öG@t’6€ čĢ[é÷U‰åPPVW‹^ƒĆ ‰Ž‹F1Ņ÷v‰×ƒĒ0ƒ’9~ƒĒN‰ųˆ‹F1Ņ÷v‰Fƒ~uՋ^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹Fé•U‰åPPVW‹^ƒĆ ‰Ž‹F ™’v’vRPčV‰ĒƒĒ0ƒ’9~ƒĒN‰ųˆ‹F ™’v’vRPčä‰F‰V’v’v1ĄPPčŒ Ąu¹‹^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹FéU‰åƒģ$VW‹^’FŠ˜‰Ē ’ué’ƒ’%t ’vWč‘[[ėŽFō‰ĘFō‰FšĒFä‹^€?-u’F’FäĒFā ‹^€?0u’FĒFā0ĒFź‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fź‰Fź~źėŹĒFęĒF胒.u9‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fč‰Fč~č’FęėĒĒFąƒ’ltƒ’Lu’Fą‹^€?t ‹^’FŠ˜‰ĒWé’Fąæė’Fąæ ė’Fąæƒ~ąt‹^ƒFW’w’7VčNžƒÄ‰Ęéé‹^ƒFW’7VčŲżƒÄ‰ĘéÓ’Fąƒ~ąt<‹^ƒF‹‹O‰F܉Nރ~Ž}Ę-F÷^Ü÷^ރ^Žø P’vŽ’vÜVčóżƒÄ‰Ę鎋^ƒF‹‰Fģƒ~ģ}Ę-F÷^ģø P’vģVčgżƒÄ‰ĘėcĒFā Ę?FėXĒFā ‹^ƒF‹ˆFėEĒFā ‹^ƒF‹‰Fšƒ~šuĒFšŽ ƒ~čuĒFč’‹vš€<t’Nč|Fėó‰ųˆF뻦 Xé]‰š+Fš‰Fģ‹Fź+Fģ‰Fźƒ~ź}ĒFźƒ~äu÷^źƒ~ź}3‹^š€?-uƒ~ā0u‹^š’FšŠ˜’vPčG[[’Nģ’v’vāč9[[’Fźuš’Nģ|‹^š’FšŠ˜’vPč[[ėēƒ~źuéaż’v’vāč[[’NźėēU‰åPPV‹vW1’öDtø’’PéØöDuø’’Pé›öDtøPFP’4čQƒÄ‰FžĒDGėHĒąÜ‹D‰ĆƒĆ1ɊNQ‰\‰ĆXˆ‹D@‰D||öD€u’t’t’4čƒÄ‰Fž‹D‰DG ’t+ƒ~ž~‹Fž9Dtƒ~ž}LėLø’’PėĒD1ĄPXéU‰åƒ>ąt‹ą’Ń1ĄPPPPP’vøP1ĄPčƃÄéuU‰å1ĄPPPPP’vøP1ĄP覃ÄéXU‰åPV1öƒž}‰óŃヿ~ t ‰óŃć’·~ č[Fėįé.U‰åPV‹vWöDuöDu1ĄPė7ƒ|1ĄPė,’t’t’4č%ƒÄ‰Ē9|uĒD‹D‰DWė Lø’’PXéŲU‰å1ĄPP’vP’v’vøPøPčƒÄéøU‰å‹N‰ź ‹N ‰ģ ‹N ‰ī ‹N‰š ‹N‰ņ ‹N‰ō ’v’včQ[[é}U‰åPPVW’v č[‰Ē‰>ź ‹N‰ģ ‹N ‰ī ¾š ƒ’‰ųO Ąt ‹^ ’F ŠˆFėģ’v’vč[[é/U‰åPV‹N‰č øę P’včP[[‰Ę ötVėƒ>č }‹č ÷ىāø’’Pė’6č XéšU‰åPV‹vW1’‰óF€?tGėõ‰ų@éÓ¹ė ¹ė¹ėU‰å‹F‹^Ķ ]Ć[YZXV‰ę‡\^9Ówr9Čw tø’’Ć1ĄĆøƋ‹OƒĆI|;uö‹_…ŪuøP鬒ć‰ÓėļVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó‰Ź_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŌ+Tū@āćėŹVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó1ۉЉŚ_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŅ+Tū@āćėČčYčĆøŗ( ė0øŗ? ė(øŗV ė øŗm ėøŗ„ ėøŗš ėøŗ± ė1Ū‡Ž …ŪtP’ÓXĆ»SRøPč;čÓü‰ĀƒśsŃā»ž Ӌ…Ūt‰Śė»Ļ ¹‰Āā0ˆKќќќāķŗĮ ėŖU‰åĒę‹^‰č‹^‰ź‹^‰īøäPøPø»ä¹Ķ ‰ģ]Ćčcü_^‰ģ]Ć^_ėųt11babcdefghijError %d ąąBą ą ` j t 2 DmO2U*X"cčdpeŻfŻgŻo5sūu-x%(null)m „ ( ± ? ? V Error: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow EM trap 0000000 octal üü#ŅøƦ™2 DĢIsĘM6.ЈP @ gŲ¼±Ćć:;”ĮC§Œ7 ,‚0yņMH•,?†qЌ@„S’qR„ ˆ0(RlF Š ö(‘ŅĶÅ4!—‚€#Ē¢"ؔ™sńgĀQ™šy#Š4 z€€±#%?k“M³bE J”ä ōhH½[éĈįWj©i̘y±‡ZHPµŠõĶ.nD€•Z†Ķœ2 $WuzUˆdVŹ‘Cvfof:2 CV°W0Œ£I;MŁŃMG8iȄR-bɚEūxī[ęsėŽĶĖ4±Y³ČÉō+gĶŃ»ŪC'šŽ"üuČx§Ž¦S³V®^ÉÆa¦(›2d¼ÖJxŲ†B `–€daČQ†S…%ĄT+yŚ‚c ‘dœ5‡ķGƒކ”RĀ]äĘrĶaTįĘŌEŻf‚›ķ–ᆦ”JPׯp+RÄT‹g¼懵Żę£nõ6pJ łTGktdF&yÓ„µ–up=—’vLå•ŃFb²ŚB =„BN;õ¤%—cl¶žb(˜µĘxd™—Ā x©ĒŽ~pA¶Ēd¤außE1š(ž(`[M˜ z#:čakčIagŸ©·#‡ ~¢P–HŲ©d„÷ćp°†ŠVbg¤¤e”Š"[Ģ]W Ķ嚊p‡†’ł¹!(Ԛ\GtņŌÄ]‰Žõ‚ ĢÕĮ pFIm”‚ /€,ޘ#E[vy¢TkŚQW²g|tƇĮšjEĆ­q«TĖnˆ õ¦õŲ]Éfš/ļ U†Æ³Ŗ80SŒŅ‡fE¬&j“­ęĘ=€œPq±‰üʇp°DVšAĒŲ¾») P`ˆ‰ć‹ƒĆ‰Č@ŃąŲ£PPSQčƒÄPč†U‰åPPVø^PčĄ [1öƒž} č'č Fėņƒ>u øhPč” [ė ’6ølPč“ [[éåU‰åƒģ:VWĒø’PøxPčö[[‰ĘƒžtVø~Pčd [[øPč [ø’PøøPčŠ[[‰Fśƒ~śtøPčó [ø’Pø¾Pč²[[‰Fųƒ~ų’tøPčÕ [Vč¾[ ĄtøPčÄ [1ĄPøĄPč;[[‰ĘƒžtøPč© [1ĄPøĘPč [[‰Fųƒ~ų’tøPčŒ [’vśčs[ ĄtøPčy [1’ƒ’|épø’PøĪPč.[[‰Fśƒ~śt’vśøŌPč˜ [[øPčE [1ĄPøöPč¼[[‰Fųƒ~ųtø Pč( [’vśč[ Ątø Pč [’vųčü[ Ątø Pč [G눸üPč„[Včą[ Ątø Pčę [1’ƒ’|écĒFōiĒFöø’PøPč‘[[‰Ęƒžtø Pč¶ [VčŸ[ ĄtøPč„ [øPøPč[[‰ĘƒžtøPč‰ [øPøRPVčDƒÄ=tøPčm [øPø“PVč›ƒÄ ĄtøPčR [1ĄPPPVč‚ƒÄ ĀtøPč: [øPø“PVčhƒÄ=tøPč [€>“u€>µu€>¶u€>·tøPčś[1ĄPPPVč*ƒÄ ĀtøPčā[øP1ĄPøPVč ƒÄ=uƒśtøPč¾[øPø“PVčģƒÄ=tøPč¢[€>“u€>µu€>¶u€>·tøPč~[1ĄPPøPVč«ƒÄ=uƒśtøPč][čäøPøVPVčƒÄ=tøPč>[1ĄPPPVčnƒÄ ĀtøPč&[ø Pø“PVčTƒÄ=tøPč [€>“u€>µu€>¶ u€>·tøPčę[1ĄPPøPVčƒÄ=uƒśtøPčÅ[øP1ĄPøųPVčļ ƒÄ=žuƒśtøPč”[ø Pø“PVčĻƒÄ Ątø Pč†[øP1ĄPPVč³ ƒÄ=žuƒśtø!Pče[čģøPøVPVčƒÄ=tø"PčF[øP1ĄPPVčs ƒÄ=uƒśtø#Pč%[1ĄPPøųPVčR ƒÄ=ųuƒśtø$Pč[苸Pø“PVč/ƒÄ= tø%Pčå[€>“u€>¹u€>ŗ u€>½(tø&PčĮ[1ĄPPø’'PVčī ƒÄ=’'uƒśtø'Pč [øPøZPVč[ƒÄ=tø(Pč„[øPø’’Pøž’PVč­ ƒÄ=’'uƒśtø)Pč_[øPø“PVč ƒÄ=tø*PčC[€>“u€>µtø+Pč-[1ĄPPøžwPVčZ ƒÄ=žwuƒśtø,Pč [øPøRPVčĒ ƒÄ=tø-Pčš[1ĄPPPVč ƒÄ Ātø.PčŲ[øPø’’Pøś’PVč ƒÄ=üwuƒśtø/Pč³[č:ødPø“PVčŽ ƒÄ=tø0Pč”[€>“u€>µu€>·u€>øu€>¹tø1Pči[1ĄPPø NPVč– ƒÄ= Nuƒśtø2PčH[øPøVPVč ƒÄ=tø3Pč,[øPø’’Pøü’PVčU ƒÄ= Nuƒśtø4Pč[øPø“PVč5 ƒÄ=tø5Pčė[€>“ u€>µu€>¶u€>·(tø6PčĒ[Vč° [ Ątø7Pč¶[ø’PøPču [[‰Fśƒ~śtø8Pč˜[’vśč [ Ątø9Pč…[øPč+ [G镶éU‰åPV1öƒžd} ‰óʇ“FėńéżU‰åģDVWĒĒFžƒ~ž|é<1ĄPčÉ [øĀPøPčų[[‰Ē ’}øPč[ø"PøPč [[ Ą}øPč[øPø(Pč{ [[‰Fųƒ~ų}øPčē[1öž’} ‰šˆ‚÷žFėńø’P†÷žPWč ƒÄ=’tøPč¹[ø’P†ųżP’vųčä ƒÄ=’tøPčš[ĒFö1öž’}Š‚÷ž˜PŠ‚ųż˜Y9Įt’FöFėäƒ~ötøPči[ø.Pč [ Ą}øPčU[Wč> [ Ą}øPčD[’vųč+ [ Ą}ø Pč1[1ĄPø2PčØ [[‰Fųƒ~ų}ø Pč[ø’P†ųżP’vųč? ƒÄ=’tø Pčõ[ĒFö1öž’}Š‚÷ž˜PŠ‚ųż˜Y9Įt’FöFėäƒ~ötø PčÄ[†ŚżPø8Pč [[ Ą}ø PčŖ[¾ŽżĀtøPčš[ƒ¾ążtøPč‹[¾čż’uƒ¾źżtøPčt[†¼żP’vųč0[[ Ą}øPč[[‹†¼ż9†ŚżtøPčI[‹†¾ż9†ÜżtøPč7[‹†Ąż9†ŽżtøPč%[‹†Āż9†ążtøPč[‹†Äż9†āżtøPč[‹†Ęż9†äżtøPčļ[‹†Čż9†ężtøPčŻ[‹†Źż‹ŽĢż9†čżu9ŽźżtøPčĮ[‹†Īż‹ŽŠż9†ģżu9ŽīżtøPč„[’vųčŒ[ Ą}øPč’[ø>Pč8 [ Ą}øPč~[ø Pč [ø’PøDPč5[[‰Ē ’}øPč[[†ŚżPøHPč±[[ Ą}øPčA[¾ŽżßtøPč1[øLPč×[ Ą}ø Pč[’vųč[ Ą}ø!Pč [ø’PøPPčÉ[[‰Ē ’}ø"Pčļ[WčŲ[ Ą}ø#PčŽ[øPøTPčT[[‰Ē ’}ø$PčĆ[Wč£[‰Fų‰ų@9Fųtø%Pč«[ø’P†÷žPWčeƒÄ=’tø&PčŽ[øP†ųżP’vųč¹ƒÄ1ĄPPPWč¬ƒÄ Ātø'Pčd[øP†ųżP’vųčƒÄ‰Ęž’tø(PčB[øXPčč[ Ą}ø)Pč.[Wč[ Ą}ø*Pč[’vųč[ Ą}ø+Pč [’Fžé»ūé  U‰å’6$’v’6ø\Pč5ƒÄø~Pč}[’é{ U‰åV‹vFP’vVčƒÄöD@tVč-[éW U‰åFP’v’6 čōƒÄ‹ öG@t’6 č[é/ U‰åPPVW‹^ƒĆ ‰Ž‹F1Ņ÷v‰×ƒĒ0ƒ’9~ƒĒN‰ųˆ‹F1Ņ÷v‰Fƒ~uՋ^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹FéĶ U‰åPPVW‹^ƒĆ ‰Ž‹F ™’v’vRPčŽ‰ĒƒĒ0ƒ’9~ƒĒN‰ųˆ‹F ™’v’vRPč‰F‰V’v’v1ĄPPčÄ Ąu¹‹^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹FéQ U‰åƒģ$VW‹^’FŠ˜‰Ē ’ué7 ƒ’%t ’vWč‘[[ėŽFō‰ĘFō‰FšĒFä‹^€?-u’F’FäĒFā ‹^€?0u’FĒFā0ĒFź‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fź‰Fź~źėŹĒFęĒF胒.u9‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fč‰Fč~č’FęėĒĒFąƒ’ltƒ’Lu’Fą‹^€?t ‹^’FŠ˜‰ĒWé’Fąæė’Fąæ ė’Fąæƒ~ąt‹^ƒFW’w’7VčNžƒÄ‰Ęéé‹^ƒFW’7VčŲżƒÄ‰ĘéÓ’Fąƒ~ąt<‹^ƒF‹‹O‰F܉Nރ~Ž}Ę-F÷^Ü÷^ރ^Žø P’vŽ’vÜVčóżƒÄ‰Ę鎋^ƒF‹‰Fģƒ~ģ}Ę-F÷^ģø P’vģVčgżƒÄ‰ĘėcĒFā Ę?FėXĒFā ‹^ƒF‹ˆFėEĒFā ‹^ƒF‹‰Fšƒ~šuĒFšžƒ~čuĒFč’‹vš€<t’Nč|Fėó‰ųˆFė»ĘX镉š+Fš‰Fģ‹Fź+Fģ‰Fźƒ~ź}ĒFźƒ~äu÷^źƒ~ź}3‹^š€?-uƒ~ā0u‹^š’FšŠ˜’vPčG[[’Nģ’v’vāč9[[’Fźuš’Nģ|‹^š’FšŠ˜’vPč[[ėēƒ~źuéaż’v’vāč[[’NźėēU‰åPPV‹vW1’öDtø’’PéØöDuø’’Pé›öDtøPFP’4č‰ƒÄ‰FžĒDGėHĒ$ė‹D‰ĆƒĆ1ɊNQ‰\‰ĆXˆ‹D@‰D||öD€u’t’t’4č@ƒÄ‰Fž‹D‰DG ’t+ƒ~ž~‹Fž9Dtƒ~ž}LėLø’’PėĒD1ĄPXéÕU‰å’v’vøPøPčFƒÄé½U‰å1ĄPPPPP’vø)PøPčķƒÄéŸU‰åƒ>$t‹$’Ń1ĄPPPPP’vøP1ĄPčĆƒÄéuU‰å1ĄPPPPP’vøP1ĄPč¦ƒÄéXU‰åPV1öƒž}‰óŃヿžt ‰óŃć’·žč[Fėįé.U‰åPV‹vWöDuöDu1ĄPė7ƒ|1ĄPė,’t’t’4č%ƒÄ‰Ē9|uĒD‹D‰DWė Lø’’PXéŲU‰åPV1ĄPP’vPP’vøPøPčƒÄ‰Ę‰šé³U‰å1ĄPPPPP’vøPøPčäƒÄé–U‰åV‹vW‹~1ĄPVWPVč[PWčŠ[Pø PøPč¶ƒÄéfU‰åPV‹N‰ŗ‹N‹V‰Ą‰Ā‹N ‰¼øPøPč [[‰Ę öt‰š™RPė’6Ā’6ĄXZéU‰å’v’vøPøPčƒÄéU‰åV‹vƒ>$|ƒ>$#|øPø PøPčƒÄėXVčW[PVøPčõƒÄøPø°PøPčćƒÄ‹$Ńć’·č+[‹$ŃćP’·øP襃ÄøPø“PøP讃ÄéU‰åPVW‹~1ö‰ūG€?tFėõ‰šéeU‰åPV1ĄPP’vP’v’vøPøP葃ĉʉšé>U‰åPVW‹~1ĄP’vWPPWč8[PøPøPčdƒÄ‰Ę‰šéU‰å1ĄPPPPP’vø<PøPčBƒÄéōU‰å’v1ĄPø PøPčcƒÄéŚU‰å1ĄPP’vP’v’vøPøPčƒÄéøU‰å‹N‰ŗ‹N ‰¼‹N ‰¾‹N‰Ą‹N‰Ā‹N‰Ä’v’včQ[[é}U‰åPPVW’v č[‰Ē‰>ŗ‹N‰¼‹N ‰¾¾Ąƒ’‰ųO Ąt ‹^ ’F ŠˆFėģ’v’vč[[é/U‰åPV‹N‰øø¶P’včP[[‰Ę ötVėƒ>ø}‹ø÷ى$ø’’Pė’6øXéšU‰åPV‹vW1’‰óF€?tGėõ‰ų@éÓ¹ė ¹ė¹ėU‰å‹F‹^Ķ ]Ć[YZXV‰ę‡\^9Ówr9Čw tø’’Ć1ĄĆøƋ‹OƒĆI|;uö‹_…ŪuøP鬒ć‰ÓėļVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó‰Ź_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŌ+Tū@āćėŹVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó1ۉЉŚ_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŅ+Tū@āćėČčYčĆøŗųė0øŗė(øŗ&ė øŗ=ėøŗTėøŗjėøŗė1Ū‡®…ŪtP’ÓXĆ»SRøPč;čÓś‰ĀƒśsŃā»ĪӋ…Ūt‰Śė»Ÿ¹‰Āā0ˆKќќќāķŗ‘ėŖU‰åĒ"$‹^‰$$‹^‰&$‹^‰*$ø $PøPø» $¹Ķ ‰ģ]Ćčcś_^‰ģ]Ć^_ėų ( Test 0 ok %d errors foopCreating a file returned file descriptor %d instead of 3 foop/foopnofileFile2creat yielded fd=%d, expected 4 File2File2foopfoopfoopfoopT3T3newT3newT3T3newT3newT3newT3T3aT3aT3aT3bT3bT3bSubtest %d, error %d errno=%d   B€Š”  DDO UXł cædGe“f“g“o sŅuxü (null)NV`zŠ¢¬ĘŲźś(:F\nzŒœ¬¼Īāö(@Ndt€Ž#Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo childrenNo more processesNot enough corePermission deniedBad addressBlock device requiredMount device busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeMath argumentResult too largeInvalid errno : =Tų&Error: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow EM trap 0000000 octal 8$8$ ° B‰ć‹ƒĆ‰Č@ŃąŲ£° PSQčƒÄPčU‰åPVø² Pč’[1öƒž} č.č—Fėņƒ>@u ø¼ Pčs[ė ’6@øĄ Pče[[1ĄPčŽ[é9 U‰åƒģVWæ1ö9÷~/苉Fśƒ~śtƒ~ś}øĢ Pč/[øPčØ[č ėVč[FėĶéõ U‰åPč‰FžFžPčŁ[éā U‰åPčz‰Fž’včr[éĪ U‰åPPVW1öƒž}?ĒDøQPø Pč[[č‰Ē ’t ’}øā Pčø[øPč1[Wč[ėWčG[Fė¼é| U‰åPĒFž~žˆ}’Fžėōø P’včß[[ Ą}ėīFžPčC[éL U‰å’D’Bé> U‰åƒ>Duė÷’6BčĖ[é' U‰å’6h’vøö Pč5ƒÄø PčĘ[’@é U‰åV‹vFP’vVčƒÄöD@tVčõ[éą U‰åFP’v’6. čōƒÄ‹. öG@t’6. čĢ[éø U‰åPPVW‹^ƒĆ ‰Ž‹F1Ņ÷v‰×ƒĒ0ƒ’9~ƒĒN‰ųˆ‹F1Ņ÷v‰Fƒ~uՋ^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹FéV U‰åPPVW‹^ƒĆ ‰Ž‹F ™’v’vRPč‰ĒƒĒ0ƒ’9~ƒĒN‰ųˆ‹F ™’v’vRP脉F‰V’v’v1ĄPPčM Ąu¹‹^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹FéŚU‰åƒģ$VW‹^’FŠ˜‰Ē ’uéĄƒ’%t ’vWč‘[[ėŽFō‰ĘFō‰FšĒFä‹^€?-u’F’FäĒFā ‹^€?0u’FĒFā0ĒFź‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fź‰Fź~źėŹĒFęĒF胒.u9‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fč‰Fč~č’FęėĒĒFąƒ’ltƒ’Lu’Fą‹^€?t ‹^’FŠ˜‰ĒWé’Fąæė’Fąæ ė’Fąæƒ~ąt‹^ƒFW’w’7VčNžƒÄ‰Ęéé‹^ƒFW’7VčŲżƒÄ‰ĘéÓ’Fąƒ~ąt<‹^ƒF‹‹O‰F܉Nރ~Ž}Ę-F÷^Ü÷^ރ^Žø P’vŽ’vÜVčóżƒÄ‰Ę鎋^ƒF‹‰Fģƒ~ģ}Ę-F÷^ģø P’vģVčgżƒÄ‰ĘėcĒFā Ę?FėXĒFā ‹^ƒF‹ˆFėEĒFā ‹^ƒF‹‰Fšƒ~šuĒFšŒ ƒ~čuĒFč’‹vš€<t’Nč|Fėó‰ųˆFė»T X鉚+Fš‰Fģ‹Fź+Fģ‰Fźƒ~ź}ĒFźƒ~äu÷^źƒ~ź}3‹^š€?-uƒ~ā0u‹^š’FšŠ˜’vPčG[[’Nģ’v’vāč9[[’Fźuš’Nģ|‹^š’FšŠ˜’vPč[[ėēƒ~źuéaż’v’vāč[[’NźėēU‰åPPV‹vW1’öDtø’’PéØöDuø’’Pé›öDtøPFP’4čƒÄ‰FžĒDGėHĒF„‹D‰ĆƒĆ1ɊNQ‰\‰ĆXˆ‹D@‰D||öD€u’t’t’4čɃĉFž‹D‰DG ’t+ƒ~ž~‹Fž9Dtƒ~ž}LėLø’’PėĒD1ĄPXé^U‰åƒ>Ft‹F’Ń1ĄPPPPP’vøP1ĄPč„ƒÄé6U‰å1ĄPPPPP’vøP1ĄPčgƒÄéU‰åPV1öƒž}‰óŃヿ, t ‰óŃć’·, č[FėįéļU‰åPV‹vWöDuöDu1ĄPė7ƒ|1ĄPė,’t’t’4čęƒÄ‰Ē9|uĒD‹D‰DWė Lø’’PXé™U‰å1ĄPPPPPPøP1ĄPčĪƒÄé€U‰å1ĄPPPP’v’vø%P1ĄPčÆƒÄéaU‰å1ĄPPPPPPøP1ĄPč”ƒÄéFU‰åV‹vƒ>h|ƒ>h#|øPø.PøPčHƒÄėXVčW[PVøPč5ƒÄøPø>PøPč#ƒÄ‹hŃć’·” č+[‹hŃćP’·” øPčƒÄøPøBPøPčīƒÄéĮU‰åPVW‹~1ö‰ūG€?tFėõ‰šé„U‰åPPV‹vW‹FŃą-‰Ć‹æH‹FŃą-‰Ć‰·H‹N‰Jƒžt öuVėø_PTø0P1ĄPč+[[‰Fžƒ~žuæƒ~ž}’vžėWXé<PSQRVWU‰ć‹_‰ŲKŪ‹ŸH’6HP’ÓXH]_^ZY[XDĻU‰åPVW‹~1ĄPPPPPPøP1ĄPč:ƒÄ‰Ę ö| ’t‹J‰ ‰šéŲU‰å1ĄPP’vP’v’vøPøPčƒÄéøU‰å‹N‰J‹N ‰L‹N ‰N‹N‰P‹N‰R‹N‰T’v’včQ[[é}U‰åPPVW’v č[‰Ē‰>J‹N‰L‹N ‰N¾Pƒ’‰ųO Ąt ‹^ ’F ŠˆFėģ’v’vč[[é/U‰åPV‹N‰HøFP’včP[[‰Ę ötVėƒ>H}‹H÷ىhø’’Pė’6HXéšU‰åPV‹vW1’‰óF€?tGėõ‰ų@éÓ¹ė ¹ė¹ėU‰å‹F‹^Ķ ]Ć[YZXV‰ę‡\^9Ówr9Čw tø’’Ć1ĄĆøƋ‹OƒĆI|;uö‹_…ŪuøP鬒ć‰ÓėļVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó‰Ź_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŌ+Tū@āćėŹVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó1ۉЉŚ_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŅ+Tū@āćėČčYčĆøŗˆė0øŗŸė(øŗ¶ė øŗĶėøŗäėøŗśėøŗė1Ū‡>…ŪtP’ÓXĆ»SRøPč;čū‰ĀƒśsŃā»^Ӌ…Ūt‰Śė»/¹‰Āā0ˆKќќќāķŗ!ėŖU‰åĒl‹^‰n‹^‰p‹^‰tøjPøPø»j¹Ķ ‰ģ]Ćč¢ś_^‰ģ]Ć^_ėųTest 1 ok %d errors Test 1 fork failed Test 1 fork failed Error %d errno=%d FFBFF  " Ś DOŚUŅXŹcde…f…g…oŻs£uÕxĶ(null)Ü ä ī   0 : T f x ˆ ” ¦ ¶ Č Ō ź ü *:J\p„–¦¶ĪÜņ#Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo childrenNo more processesNot enough corePermission deniedBad addressBlock device requiredMount device busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeMath argumentResult too largeInvalid errno : Ķ䈟Ÿ¶Error: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow EM trap 0000000 octal ‚‚cŠ„‘B…›0mŹl颈="čĀF‹ˆÅXÄcĢF‰0Č|œXf$ 3&ϘDc2I5"śģP   :eäø‘Ę 9u¾™ŁógŠ1tf²yćę 8rޜŁ2Œ.D}>“FO™™ Ś„é‰"…‚= @šŌš†7nį¤!V-Ō¢fPˆ RfĪω D¤˜iwnCgŹŠ‘K¦l]/T€"§Lœ ̤aÓH1 \ˆö<MĮiA“Y£™óĒ4Õ¦1EāÅsĖ6tČ8OŚ(̼‘³Fw‡0|ļ±Yf ½ +ŗEp`AßÉwœ†Šģ}RĻ®}›±qŽs}>¼øļć ’?dīzF‹µ«T}šöīß žlĄ•—Ū{č‘”pĀw^|ŹŃ÷GM§ßujg€ą‰W bę!ųTzæÕÖ {»A8ĶM’H “_rē]‡©5X[‡Į <€`ƒ<­°‚r $0aÜį Ȇ„` 7 –Ś€™ ·c?‚$ ?éŪcyg‚ZXŪQ?Į—\’wł”—o¬Į…‚s”A§xéB d%GTṟ'~p¶e­õ›ZŽØex ,Łä“l*PŌ[3”%›VŒ¹µĘcė1ÖŠ‰e!™š®9X D­?é8Ē Šf‰¢0e 0U†o* ¦VśP’k&! %“…]Äh& §‘3%P'w±Ūµs¹qĀOt„±F.d¶Y=”0‡¢BõKĘ£ne«·nåĘZ& „ū¾Öp¦–{īW 'mйUIPńn¼óžGĒ£žm©§«U*ńYāie]9&źŠp”ń$GŅe甉‰)ßė5Ĕ%ć¬3i”\#€1˜\yuXea46s\QįVU0Ø@ƒ¤cČńE„öĮ ‘[1 é³ZeŸ½oŚ‚ V‘m6ŚĮ‚ `ė-7gi—ōõDo »÷Ü”ä– x'7ß ©Äö yū99ć ±Äv ™§¶9į¹äVä’/N:H0=.čd/hp ĪÄ©£—-BeøUõ²øĖXĮYżō;X¦®Õ+ĶSw½… 9„ĀRMłv|͇•m™w»…e 5Hz”8ŃεTqżū³Ļ¼)M»\ĢjÕį=Ē‘F’Śæś‰Gśwæü„M$ü_IҧŌųĻ€k`ż Ą“©$ģœAšĄ –nƒ\ `ņ> Öą ‰ć‹ƒĆ‰Č@ŃąŲ£PSQčƒÄPčn U‰åƒģVWøāPčš[čY ‰Ēč5čQ 9Ēuč Ąu1ĄPøģPč[[1ĄPč6 [č0 9Ēučš Ąu1ĄPøņPčó[[1ĄPč [č 9ĒučĻ Ąu1ĄPøųPčŅ[[1ĄPčō[čī 9Ēuč® Ąu1ĄPøžPč±[[1ĄPčÓ[1öƒž<}č£ %PčA[Fėķ1öƒž} FüPč$ [Fėšƒ>"u øPčŲ[ė ’6"øPčŹ[[čT1ĄPč„[él U‰åPPč= ‰Fžƒ~žt FPčŻ [ėA‹^Ńć1ĄP’·’č,[[‰Fü’"‹^Ńć’6,’·’øPčtƒÄčż1ĄPč-[ø@Pč`[é U‰åPV1ĄPø^Pč+ [[‰Ę ö}ødPč>[øPčū[ø°PørPVč! ƒÄ£pø@PøvPčr[[øxPø|Pče[[øüPø‚PčX[[ø PøˆPčK[[ø` PøŽPč>[[ø¤Pø”Pč1[[øÜPøšPč$[[ø Pø Pč[[øŹPø¦Pč [[VčO[éX U‰åPV‹F™£Š‰ŒøķP’vč [[‰Ę’6pørPVčéƒÄVč[é# U‰åø¬Pč‡[ø²Pč[øøPčw[ø¾Pčo[øÄPčg[øŹPč_[øŠPčW[øÖPčO[øÜPčG[éÖ U‰åV‹vFP’vVčƒÄöD@tVč9[é² U‰åFP’v’6čōƒÄ‹öG@t’6č[éŠ U‰åPPVW‹^ƒĆ ‰Ž‹F1Ņ÷v‰×ƒĒ0ƒ’9~ƒĒN‰ųˆ‹F1Ņ÷v‰Fƒ~uՋ^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹Fé( U‰åPPVW‹^ƒĆ ‰Ž‹F ™’v’vRPčé ‰ĒƒĒ0ƒ’9~ƒĒN‰ųˆ‹F ™’v’vRPčV ‰F‰V’v’v1ĄPPčž Ąu¹‹^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹Fé¬ U‰åƒģ$VW‹^’FŠ˜‰Ē ’ué’ ƒ’%t ’vWč‘[[ėŽFō‰ĘFō‰FšĒFä‹^€?-u’F’FäĒFā ‹^€?0u’FĒFā0ĒFź‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fź‰Fź~źėŹĒFęĒF胒.u9‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fč‰Fč~č’FęėĒĒFąƒ’ltƒ’Lu’Fą‹^€?t ‹^’FŠ˜‰ĒWé’Fąæė’Fąæ ė’Fąæƒ~ąt‹^ƒFW’w’7VčNžƒÄ‰Ęéé‹^ƒFW’7VčŲżƒÄ‰ĘéÓ’Fąƒ~ąt<‹^ƒF‹‹O‰F܉Nރ~Ž}Ę-F÷^Ü÷^ރ^Žø P’vŽ’vÜVčóżƒÄ‰Ę鎋^ƒF‹‰Fģƒ~ģ}Ę-F÷^ģø P’vģVčgżƒÄ‰ĘėcĒFā Ę?FėXĒFā ‹^ƒF‹ˆFėEĒFā ‹^ƒF‹‰Fšƒ~šuĒFš`ƒ~čuĒFč’‹vš€<t’Nč|Fėó‰ųˆFė»(Xéωš+Fš‰Fģ‹Fź+Fģ‰Fźƒ~ź}ĒFźƒ~äu÷^źƒ~ź}3‹^š€?-uƒ~ā0u‹^š’FšŠ˜’vPčG[[’Nģ’v’vāč9[[’Fźuš’Nģ|‹^š’FšŠ˜’vPč[[ėēƒ~źuéaż’v’vāč[[’NźėēU‰åPPV‹vW1’öDtø’’PéØöDuø’’Pé›öDtøPFP’4čxƒÄ‰FžĒDGėHĒ*Ó ‹D‰ĆƒĆ1ɊNQ‰\‰ĆXˆ‹D@‰D||öD€u’t’t’4č/ƒÄ‰Fž‹D‰DG ’t+ƒ~ž~‹Fž9Dtƒ~ž}LėLø’’PėĒD1ĄPXé0U‰å’v’vøPøPč5ƒÄéU‰å’6FP’včDƒÄéU‰åPVF‰Ę‰óƒĘƒ?tėō’4FP’včƒÄéŲU‰å’6’v’včƒÄéĆU‰åģVWdžņ÷džš÷‹F‰†ž÷‹F‰†ü÷‹žž÷ƒ†ž÷ƒ?t’†ņ÷ėģ‹žü÷ƒ†ü÷ƒ?t’†š÷ė싆š÷†ņ÷ŃąžųÉދžņ÷óžš÷F9Ćr Ē,ø’’Pé'†ų‰Ē‹†ņ÷‰ƒĒdžō÷‹†ņ÷9†ō÷}V†ų‰ń)Į‰Žģ÷‹†ģ÷‰ƒĒ‹^ƒF‹‰†ö÷‹žö÷€?t!‹žö÷’†ö÷ŠˆFF9ĘrćĒ,ø’’Pé¼ĘF’†ō÷ė ĒƒĒdžō÷‹†š÷9†ō÷}U†ų‰ń)Į‰Žģ÷‹†ģ÷‰ƒĒ‹^ƒF‹‰†ö÷‹žö÷€?t ‹žö÷’†ö÷ŠˆFF9ĘrćĒ,ø’’PėPĘF’†ō÷ė”ĒƒĒ†ų‰ń)ĮA»‰Č™÷ūŃą‰†ī÷1ĄP†ųP’v1ĄP’¶ī÷’včŃ[Pø;P1ĄPčžƒÄPXéU‰åV‹v1ĄPø$PV1ĄPøPVč£[Pø;P1ĄPčŠƒÄéķU‰åƒ>*t‹*’Ń1ĄPPPPP’vøP1ĄPč¦ƒÄéÄU‰å1ĄPPPPP’vøP1ĄPč‰ƒÄé§U‰åPV1öƒž}‰óŃヿt ‰óŃć’·č[Fėįé}U‰åPV‹vWöDuöDu1ĄPė7ƒ|1ĄPė,’t’t’4čƒÄ‰Ē9|uĒD‹D‰DWė Lø’’PXé'U‰å1ĄPPPPPPøP1ĄP蚃ÄéU‰å1ĄPPPPP’vøPøPč҃ÄéšU‰å1ĄPPPPPPøP1ĄP跃ÄéÕU‰å’v’vøPøPč؃Äé»U‰åPV1ĄPP’vP’v’vøPøPčyƒÄ‰Ę‰šé’U‰å’v1ĄPø PøP薃ÄéyU‰åPVW‹~1ĄPPPPPPøP1ĄPč:ƒÄ‰Ę ö| ’t‹l‰ ‰šéDU‰å1ĄPP’vP’v’vøPøPčƒÄé$U‰å‹N‰l‹N ‰n‹N ‰p‹N‰r‹N‰t‹N‰v’v’včQ[[ééU‰åPPVW’v č[‰Ē‰>l‹N‰n‹N ‰p¾rƒ’‰ųO Ąt ‹^ ’F ŠˆFėģ’v’vč[[é›U‰åPV‹N‰jøhP’včP[[‰Ę ötVėƒ>j}‹j÷ى,ø’’Pė’6jXé\U‰åPV‹vW1’‰óF€?tGėõ‰ų@é?¹ė ¹ė¹ėU‰å‹F‹^Ķ ]ĆU‰å1Ą‹N‰€£‚éU‰åømNŗĘA’6‚’6€č»90ƒŅ%’’ā’£€‰‚‹€į’ā‰ČéŚ[YZXV‰ę‡\^9Ówr9Čw tø’’Ć1ĄĆøƋ‹OƒĆI|;uö‹_…ŪuøPéĶ’ć‰ÓėļVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó‰Ź_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŌ+Tū@āćėŹ‰ćR‰Į÷gZP‰Š÷gZ‰ȉŃ÷gŹ[ƒÄ’ćVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó1ۉЉŚ_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŅ+Tū@āćėČčYčĆøŗ®ė0øŗÅė(øŗÜė øŗóėøŗ ėøŗ ėøŗ7ė1Ū‡d…ŪtP’ÓXĆ»SRøPč;č„ū‰ĀƒśsŃ⻄Ӌ…Ūt‰Śė»U¹‰Āā0ˆKќќќāķŗGėŖU‰åĒ0‹^‰2‹^‰4‹^‰8ø.PøPø».¹Ķ ‰ģ]Ćčū_^‰ģ]Ć^_ėų¦¬²ø¾ÄŹŠÖÜt10at10bt10ct10dt10et10ft10gt10ht10it10jTest 10 t10at10bt10ct10dok %d errors Child execl didn't take. file=%s errno=%d Worse yet, EXIT didn't exit t10aCan't open t10a t10bt10ct10dt10et10ft10gt10ht10it10jt10bt10ct10dt10et10ft10gt10ht10it10j$$B$$āģöå D OåUŻXÕc›d#efgočs®uąxŲ(null)ó ®7ÅÅÜError: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow EM trap 0000000 octal FFcŠ„‘BE7vąl™ŃD{D́#'›3"X€X§M›2r2‚€Ńg‡ešŠéH9nޘ“HĒ„9cč˜TŠ&ŒE)ģQM£;‹R¤i…*eęԌcc “Eͼ!ˆ"Ć‘;ŒņČ6͊) *H°R*U@M²J‡jŒøDAōÉ›Ę /s:|#h‚„nč4ńf 7"®ę-ĆfN™µˆ;Q‚ŒM9[ē<˜Žä¢)ÓŠAQŲ䮓ePø zŌÉ”J+&^üøČĶ­œÉø@}3ę×ĪE3ŗŃų2ęip^nuėēœg]Ÿ<ٶn øA‡¾PŖT—xʌ)ų‚obĖA˜!£q~ i¬"L˜-4t±_~” •k•ÖP ÜįÓj&Ģ&W_µĀC2Ō` …¹„B ’%P‡lX” uU·Öˆ%ŗq"2ØXT.UV†Z PˆB@oÜį†SŽ…!ŅwÉŠ!#„› !ŌĘdI•Į`ƕ’­5^yhÜØlōhŃ Œ˜ ́Ęu°į™>±‚ź…Q‡e ŠŃ%O’q£@sĄ÷XĢ©Z oøįĀZ„_aĢY™l”AG Ŗ0bJŃåTlä‘fcŒQʧéyc@iø Ā­Ź™Yn0Jžt}4Ēaœqć™šēžŃŃA—ö'Ēw€vŃ¢ °·VJź±!e TžµA*¤sĮqUQ[ŖÉ¦«p¶ B -JØ”É&*­–ä ‘( Éin›žńĘG t¹lf¬DŖņÅł)zÕ5œ ķ%ą$”×fke ‡Øć_ó}5Ʋa¬†b "YÉa i]Ā J¢Ąņ„ަe’‘’ĘFƒĘ¾Ż#‹Ä$*³ģa @u øbPčē[ė ’6@øfPčŁ[[1ĄPčŁ [éĢU‰å’6J’vørPč¼ƒÄøŒPč² [’@éŖU‰åƒģ Včm Ąt*FžPčˆ [~ždtøPč¹’[øŽPčW [ø’PčO [éõøPø Pø–PčžƒÄ Ą}øP舒[ø¶PøœPčŹ[[øBP1ĄPø¢PčƒÄøm PøØPč¬[[ø€Pø®Pčā[[‰ĘƒžtøPčA’[Včh [ Ą}øPč0’[øPø²Pč× [[=tøPč’[øcPø Pø¶PčnƒÄ Ą}øPčųž[ø0PøŗPč}[[‰ĘƒžtøPčÜž[Vč [ Ą}øPčĖž[øPø¾Pčr [[=tø P豞[øPøcPøĀPč ƒÄ Ą}ø P蓾[øPč÷ [ Ą}ø Pčž[øPč [ Ą}ø Pčkž[č± =tø Pč[ž[č7 =tøPčKž[čR =tøPč;ž[čģ=tøPč+ž[ĘFōĘFõĘFöĘF÷ øPFōPøPčž ƒÄ=tøPčüż[1ĄPPøPøPčW ƒÄøBP1ĄPøŽPøŲPøŅPøĢPøĘPčƒÄøPčĮż[øäPč†[øPč†[éy U‰åƒģ č> ĄtFžPčY [~žKt8øP芿[ė.ĒFōöĒFöüĒFųĒFśĒFüFōPø PčM[[øPčZż[é# U‰åV‹vFP’vVčƒÄöD@tVč|[é’ U‰åFP’v’60čōƒÄ‹0öG@t’60čS[é× U‰åPPVW‹^ƒĆ ‰Ž‹F1Ņ÷v‰×ƒĒ0ƒ’9~ƒĒN‰ųˆ‹F1Ņ÷v‰Fƒ~uՋ^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹Féu U‰åPPVW‹^ƒĆ ‰Ž‹F ™’v’vRPč6 ‰ĒƒĒ0ƒ’9~ƒĒN‰ųˆ‹F ™’v’vRPčÄ ‰F‰V’v’v1ĄPPčl Ąu¹‹^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹Féł U‰åƒģ$VW‹^’FŠ˜‰Ē ’uéß ƒ’%t ’vWč‘[[ėŽFō‰ĘFō‰FšĒFä‹^€?-u’F’FäĒFā ‹^€?0u’FĒFā0ĒFź‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fź‰Fź~źėŹĒFęĒF胒.u9‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fč‰Fč~č’FęėĒĒFąƒ’ltƒ’Lu’Fą‹^€?t ‹^’FŠ˜‰ĒWé’Fąæė’Fąæ ė’Fąæƒ~ąt‹^ƒFW’w’7VčNžƒÄ‰Ęéé‹^ƒFW’7VčŲżƒÄ‰ĘéÓ’Fąƒ~ąt<‹^ƒF‹‹O‰F܉Nރ~Ž}Ę-F÷^Ü÷^ރ^Žø P’vŽ’vÜVčóżƒÄ‰Ę鎋^ƒF‹‰Fģƒ~ģ}Ę-F÷^ģø P’vģVčgżƒÄ‰ĘėcĒFā Ę?FėXĒFā ‹^ƒF‹ˆFėEĒFā ‹^ƒF‹‰Fšƒ~šuĒFšŽƒ~čuĒFč’‹vš€<t’Nč|Fėó‰ųˆFė»VXé=‰š+Fš‰Fģ‹Fź+Fģ‰Fźƒ~ź}ĒFźƒ~äu÷^źƒ~ź}3‹^š€?-uƒ~ā0u‹^š’FšŠ˜’vPčG[[’Nģ’v’vāč9[[’Fźuš’Nģ|‹^š’FšŠ˜’vPč[[ėēƒ~źuéaż’v’vāč[[’NźėēU‰åPPV‹vW1’öDtø’’PéØöDuø’’Pé›öDtøPFP’4č1ƒÄ‰FžĒDGėHĒH ‹D‰ĆƒĆ1ɊNQ‰\‰ĆXˆ‹D@‰D||öD€u’t’t’4ččƒÄ‰Fž‹D‰DG ’t+ƒ~ž~‹Fž9Dtƒ~ž}LėLø’’PėĒD1ĄPXé}U‰å’v’vøPøPčīƒÄéeU‰åV‹v1ĄPPV’v’vVč^[PøPøPčŠƒÄé;U‰å’v’vøPøPč«ƒÄé"U‰å’6@FP’včDƒÄé U‰åPVF‰Ę‰óƒĘƒ?tėō’4FP’včƒÄéāU‰å’6@’v’včƒÄéĶU‰åģVWdžņ÷džš÷‹F‰†ž÷‹F‰†ü÷‹žž÷ƒ†ž÷ƒ?t’†ņ÷ėģ‹žü÷ƒ†ü÷ƒ?t’†š÷ė싆š÷†ņ÷ŃąžųÉދžņ÷óžš÷F9Ćr ĒJø’’Pé'†ų‰Ē‹†ņ÷‰ƒĒdžō÷‹†ņ÷9†ō÷}V†ų‰ń)Į‰Žģ÷‹†ģ÷‰ƒĒ‹^ƒF‹‰†ö÷‹žö÷€?t!‹žö÷’†ö÷ŠˆFF9ĘrćĒJø’’Pé¼ĘF’†ō÷ė ĒƒĒdžō÷‹†š÷9†ō÷}U†ų‰ń)Į‰Žģ÷‹†ģ÷‰ƒĒ‹^ƒF‹‰†ö÷‹žö÷€?t ‹žö÷’†ö÷ŠˆFF9ĘrćĒJø’’PėPĘF’†ō÷ė”ĒƒĒ†ų‰ń)ĮA»‰Č™÷ūŃą‰†ī÷1ĄP†ųP’v1ĄP’¶ī÷’včG[Pø;P1ĄPčtƒÄPXé"U‰åV‹v1ĄPøBPV1ĄPøPVč[Pø;P1ĄPčFƒÄé÷U‰åƒ>Ht‹H’Ń1ĄPPPPP’vøP1ĄPčƒÄéĪU‰å1ĄPPPPP’vøP1ĄPč’ƒÄé±U‰åPV1öƒž}‰óŃヿ.t ‰óŃć’·.č[Fėįé‡U‰åPV‹vWöDuöDu1ĄPė7ƒ|1ĄPė,’t’t’4č~ƒÄ‰Ē9|uĒD‹D‰DWė Lø’’PXé1U‰å1ĄPPPPPPøP1ĄPčfƒÄéU‰åPV1ĄPPPPPPø/P1ĄPčIƒÄ‰Ę ö}Vė’6JXéģU‰åPV1ĄPPPPPPøP1ĄPčƒÄ‰Ę ö}Vė’6JXéĮU‰åPV1ĄPPPPPPø/P1ĄPčóƒÄ‰Ę‰šé U‰å1ĄPPPPP’vøPøPčŃƒÄéƒU‰åPV1ĄPPPPPPøP1ĄPč“ƒÄ‰Ę‰šéaU‰åPV‹N‰J‹N‹V‰P‰R‹N ‰LøPøPč[[‰Ę öt‰š™RPė’6R’6PXZéU‰å’v’vøPøPč‰ƒÄéU‰åV‹vƒ>J|ƒ>J#|øPø0PøPčƒÄėXVčW[PVøPčļƒÄøPø@PøP诃Ä‹JŃć’·–č+[‹JŃćP’·–øP躃ÄøPøDPøP訃Äé{U‰åPVW‹~1ö‰ūG€?tFėõ‰šé_U‰å1ĄPPPPP’vø.P1ĄP蒃ÄéDU‰å1ĄPPPPP’vøP1ĄPčuƒÄé'U‰å’v1ĄPø PøP薃Äé U‰åPVW‹~1ĄPPPPPPøP1ĄPč:ƒÄ‰Ę ö| ’t‹J‰ ‰šéŲU‰å1ĄPP’vP’v’vøPøPčƒÄéøU‰å‹N‰J‹N ‰L‹N ‰N‹N‰P‹N‰R‹N‰T’v’včQ[[é}U‰åPPVW’v č[‰Ē‰>J‹N‰L‹N ‰N¾Pƒ’‰ųO Ąt ‹^ ’F ŠˆFėģ’v’vč[[é/U‰åPV‹N‰HøFP’včP[[‰Ę ötVėƒ>H}‹H÷ىJø’’Pė’6HXéšU‰åPV‹vW1’‰óF€?tGėõ‰ų@éÓ¹ė ¹ė¹ėU‰å‹F‹^Ķ ]Ć[YZXV‰ę‡\^9Ówr9Čw tø’’Ć1ĄĆøƋ‹OƒĆI|;uö‹_…ŪuøP鬒ć‰ÓėļVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó‰Ź_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŌ+Tū@āćėŹVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó1ۉЉŚ_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŅ+Tū@āćėČčYčĆøŗˆė0øŗŸė(øŗ¶ė øŗĶėøŗäėøŗśėøŗė1Ū‡>…ŪtP’ÓXĆ»SRøPč;čzś‰ĀƒśsŃā»^Ӌ…Ūt‰Śė»/¹‰Āā0ˆKќќќāķŗ!ėŖU‰åĒN‹^‰P‹^‰R‹^‰VøLPøPø»L¹Ķ ‰ģ]Ćč ś_^‰ģ]Ć^_ėųHPspringsummerTest 11 ok %d errors Error %d. errno = %d t1t2t11at11at11at11at1t1t1t2t2t2t11at11aarg0arg1arg2Can't exec t11a t11babcdefghijt11bBBBBB$N D‰ONUFX>cdŒełfłgłoQsuIxA(null)Žęš 2<VhzŠ–ØøŹÖģž ,<L^r†˜ØøŠŽō#Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo childrenNo more processesNot enough corePermission deniedBad addressBlock device requiredMount device busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeMath argumentResult too largeInvalid errno : Ķ䈟Ÿ¶Error: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow EM trap 0000000 octal dd Źą”SFŽ ¾Ł” : ֬郔‚1hĀČ!¦Ž™-2`ŠĄŃ…a›0Q¤P°G!¦±ųŽœ˜fPˆ RfD2@ˆHĮš„™7Q¤ŃDE˜É¦Ó„Švc‚0CdɱŠŻ°€9YĶä4–AÄ”8Łdm8G¤ Ó p—AĮ+¹YĖ>Ģ)"5a„rä uń2”›7MKQ+b²ļ7Dāy—hŻ—K›•³ę+dÓJA¼Ęŗ‡ģĶŁ:§ÆYŒ’M™įk“»…+w‡XčŲ—†h [k_P4–ybĢ2e†Xc°ńĘ«1¶ ]Ģ•Ąt§„AUišŅHZ…UG„ŃS0`‚S3ÜpC"uŚfOÅĮTÅ”aV $@9ŻqA¬5C“q8Ł…8¤°V6ŹFm:¾ m&Än õ q,—\6®×Š ˆf˜  ¢xJp™‡ƒ8®Ā|@Õ`ƒ 5ŪwKź¤ćnœ”Ü[żżą•k±š&Uƒ²ēœK} Ä‚4&pßh¤Į…( ™"Ųć?:! ,ĘČĆ 2Ä8#’5%Ga1*ƒAz4Y 1ČąąŲ¹1ƾī”$m³Ö Bi”±éy ĒQ\uöDÄbé†zĖ9ź—§Ŗ1!jšąUjhČ%|§½„‡[ØŃ… 0”xVt¢ шõšˆ) ™Ą±~ź(d„AG:DĖ©“ŅŖ% –Į+/½ö²°oæ÷‚łR¤ĪR*°DV)¦˜^ę9×Ēt) Š ‰ć‹ƒĆ‰Č@ŃąأРPSQčƒÄPč:U‰åPVøŌ Pč­[1öƒž}čFėõøŽ Pč˜[1ĄPč[é| U‰åƒģVWĒFņĒFīFüPčó[ Ą}’6ņøā Pčd[[1ĄPčŻ[čž‰Ę ö}øś PčK[1ĄPčÅ[ öué…’vüč—[1öž}‰š%’‰óˆ‡š FėģĒFņƒ~ņ}.øPøš P’vžčƒÄ Ą}’6ņø Pčō[[1ĄPčm[’FņėĢ’vžčA[FņPč»[~ņ:ué§’vņø$ PčĆ[[1ĄPč<[é‘’vžč[ĒFņƒ~ņ |étøPøš P’vüčOƒÄ‰Fś~śt’vśø8 Pč}[[1ĄPčö[1’9~ś~:‰ū‹Ņ į’Їš 0ä9Čt‹Ņ į’‰ūQ1ĄŠ‡š PWøX Pč?ƒÄė’Ņ GėĮ’Fņ냸:PčØ[é U‰åV‹vFP’vVčƒÄöD@tVčõ[éļU‰åFP’v’6 čōƒÄ‹ öG@t’6 čĢ[éĒU‰åPPVW‹^ƒĆ ‰Ž‹F1Ņ÷v‰×ƒĒ0ƒ’9~ƒĒN‰ųˆ‹F1Ņ÷v‰Fƒ~uՋ^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹FéeU‰åPPVW‹^ƒĆ ‰Ž‹F ™’v’vRPč&‰ĒƒĒ0ƒ’9~ƒĒN‰ųˆ‹F ™’v’vRP蓉F‰V’v’v1ĄPPč\ Ąu¹‹^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹FééU‰åƒģ$VW‹^’FŠ˜‰Ē ’uéĻƒ’%t ’vWč‘[[ėŽFō‰ĘFō‰FšĒFä‹^€?-u’F’FäĒFā ‹^€?0u’FĒFā0ĒFź‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fź‰Fź~źėŹĒFęĒF胒.u9‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fč‰Fč~č’FęėĒĒFąƒ’ltƒ’Lu’Fą‹^€?t ‹^’FŠ˜‰ĒWé’Fąæė’Fąæ ė’Fąæƒ~ąt‹^ƒFW’w’7VčNžƒÄ‰Ęéé‹^ƒFW’7VčŲżƒÄ‰ĘéÓ’Fąƒ~ąt<‹^ƒF‹‹O‰F܉Nރ~Ž}Ę-F÷^Ü÷^ރ^Žø P’vŽ’vÜVčóżƒÄ‰Ę鎋^ƒF‹‰Fģƒ~ģ}Ę-F÷^ģø P’vģVčgżƒÄ‰ĘėcĒFā Ę?FėXĒFā ‹^ƒF‹ˆFėEĒFā ‹^ƒF‹‰Fšƒ~šuĒFšī ƒ~čuĒFč’‹vš€<t’Nč|Fėó‰ųˆFė»¶ Xé-‰š+Fš‰Fģ‹Fź+Fģ‰Fźƒ~ź}ĒFźƒ~äu÷^źƒ~ź}3‹^š€?-uƒ~ā0u‹^š’FšŠ˜’vPčG[[’Nģ’v’vāč9[[’Fźuš’Nģ|‹^š’FšŠ˜’vPč[[ėēƒ~źuéaż’v’vāč[[’NźėēU‰åPPV‹vW1’öDtø’’PéØöDuø’’Pé›öDtøPFP’4č!ƒÄ‰FžĒDGėHĒšŸ‹D‰ĆƒĆ1ɊNQ‰\‰ĆXˆ‹D@‰D||öD€u’t’t’4čŲƒÄ‰Fž‹D‰DG ’t+ƒ~ž~‹Fž9Dtƒ~ž}LėLø’’PėĒD1ĄPXémU‰åƒ>št‹š’Ń1ĄPPPPP’vøP1ĄPč“ƒÄéEU‰å1ĄPPPPP’vøP1ĄPčvƒÄé(U‰åPV1öƒž}‰óŃヿŽ t ‰óŃć’·Ž č[FėįéžU‰åPV‹vWöDuöDu1ĄPė7ƒ|1ĄPė,’t’t’4čõƒÄ‰Ē9|uĒD‹D‰DWė Lø’’PXéØU‰å1ĄPPPPPPøP1ĄP诃ÄéU‰å1ĄPPPPP’vøPøP迃ÄéqU‰åPVW‹~1ĄPPPPPPø*PøP蝃Ä‰Ę ö|‹ś ‰ ‹ü ‰M1ĄPėVXé3U‰åPV1ĄPP’vP’v’vøPøPč_ƒÄ‰Ę‰šé U‰åPVW‹~1ĄPPPPPPøP1ĄPč:ƒÄ‰Ę ö| ’t‹ś ‰ ‰šéŲU‰å1ĄPP’vP’v’vøPøPčƒÄéøU‰å‹N‰ś ‹N ‰ü ‹N ‰ž ‹N‰ ‹N‰ ‹N‰ ’v’včQ[[é}U‰åPPVW’v č[‰Ē‰>ś ‹N‰ü ‹N ‰ž ¾ ƒ’‰ųO Ąt ‹^ ’F ŠˆFėģ’v’vč[[é/U‰åPV‹N‰ų øö P’včP[[‰Ę ötVėƒ>ų }‹ų ÷ىņø’’Pė’6ų XéšU‰åPV‹vW1’‰óF€?tGėõ‰ų@éÓ¹ė ¹ė¹ėU‰å‹F‹^Ķ ]Ć[YZXV‰ę‡\^9Ówr9Čw tø’’Ć1ĄĆøƋ‹OƒĆI|;uö‹_…ŪuøP鬒ć‰ÓėļVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó‰Ź_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŌ+Tū@āćėŹVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó1ۉЉŚ_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŅ+Tū@āćėČčYčĆøŗ8 ė0øŗO ė(øŗf ė øŗ} ėøŗ” ėøŗŖ ėøŗĮ ė1Ū‡ī …ŪtP’ÓXĆ»SRøPč;čü‰ĀƒśsŃā» Ӌ…Ūt‰Śė»ß ¹‰Āā0ˆKќќќāķŗŃ ėŖU‰åĒö‹^‰ų‹^‰ś‹^‰žøōPøPø»ō¹Ķ ‰ģ]Ćč“ū_^‰ģ]Ć^_ėųTest 2 ok pipe error. errno= %d fork failed write pipe err. errno=%d wrong exit code %d read yielded %d bytes, not 512 wrong data: %d %d %d ššBššp z „ õ D0OõUķXåc«d3e f g oųs¾ušxč(null)} ” 8 Į O O f Error: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow EM trap 0000000 octal  #ŅøƦ™2 xĢIsĘM6.ŠųP ˆ4sX€#GN˜<[htŁAэE8žÉ„8iČht9¦N’AØCGcĶ6*5–éȓ¤‚6a¢H”`M^4 ŽœŠfPˆ RfŽE3@ˆHAŖ™7r@ H¢;.&‘#nš+R€pš€NW:9b,%Ł÷oƒŸ‚č£8µ?U‚į6‡Ž2(fmüÅP9<Ūŗ…Į4U¬Z߬įāflYeŲĢ)£ĄōU“YE” »#Ś9¬E%Jg3c üzĶciSÅešų•ćĘ0tĘ IÜXŖ›™1©¶ä“·Ū3eč”O U„C6(bĄš‰]ūfĪjĖ·qVΚ„zńui°™K*Ķ!Ś[zę˜Zk_yY6i°Å·Yw$E &ø±įƒ(TG]—” ĆfPõ›lń!’“FņmˆR³±·˜Ē)p]vŪ1åTU)14^ÆŃd“@"‡™ˆ%YäIG¶t¹į[Z»A%œˆÆ}Ę”U}†–V®E‰œr€ f¤bQYd[ČŠ…FßéÄLpųØG ˆQ‡!„\{ …6Śkī=„ĀIEP”‘J€²ŲRp`v§§$ö÷_ Öö‚ @ĮQR©šBm½Ńć[ĄŠÅ†ˆ ;YŌĆh©&ĄįU~”€k {z( 1lȇ‚H¦b.Ę6Ū^Ŗ²:lš&+­lŲ**žŗnXė­x2»ati|HŚkŒĒ)ØĪe,šÖ٤”AĀyX¾Żt#W.źgC’RzDNP”‘Ć_a¤*ų(~( Ą‘G a„W=˜ >0Čm$zÜŃG[ˆ¼É&£Š²Ź|±Ü™Ė ǼäĢ%£uŖ^)c˜³Ījń ³Ģ4 }rŃÅ›@¤š9 ±Ä P\©J=#|Ƭėĕ^ݵ±_+ ³d?ńŁ ¤6Hz¶m6a^KØö34kõŪxŪa¼ÖĀ=ų‡!^māSK8ćµ›-Œ+K½cgO›ĄäŪ}9f]OĖyŒ‘žŲęŲ¾Ųym¦{ZÆ \V‰ć‹ƒĆ‰Č@ŃąŲ£ PSQčƒÄPčöU‰åPVø Pči[1öƒž } čĪčDFėņƒ>b tøPčœ[ƒ>`u ø Pč;[ė ’6`ø Pč-[[é} U‰åPPVč½£hø×Pø PčĄ[[čR‰Ę öt7ƒ>juė÷ø PVčt[[ Ą}øPč:[FžPč) [ƒ~ž tøPč$[ėø P’6hčC[[čSé U‰å’j’fé U‰å’vø Pč”[[’`ø( PčM[éę U‰åƒģ ĒdønPø Pč([[FüPčČ[č² Ąt+’vüčĆ[ƒ>duøPFöP’vžčČƒÄėęFśPč‰[ė’vüč˜[’vžč‘[1ĄPčŖ[é{ U‰å’d’bém U‰åPP1ĄPøPč·[[ĒtčC‹t’t‰ĖŃ扇l Ąé½č)‹t’t‰ĖŃ扇l Ąéžč‹t’t‰ĖŃ扇l Ąéčõ‹t’t‰ĖŃ扇l Ą~cøPøPč?[[øP’6lč[[øP’6nčõ[[øP’6pčč[[øP’6rčŪ[[FüPčœ[FüPč”[FüPčŒ[FüPč„[ėčÉė čÄėčæėčŗéy U‰åV‹vFP’vVčƒÄöD@tVčõ[éU U‰åFP’v’6J čōƒÄ‹J öG@t’6J čĢ[é- U‰åPPVW‹^ƒĆ ‰Ž‹F1Ņ÷v‰×ƒĒ0ƒ’9~ƒĒN‰ųˆ‹F1Ņ÷v‰Fƒ~uՋ^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹FéĖ U‰åPPVW‹^ƒĆ ‰Ž‹F ™’v’vRPčŒ‰ĒƒĒ0ƒ’9~ƒĒN‰ųˆ‹F ™’v’vRPč‰F‰V’v’v1ĄPPčĀ Ąu¹‹^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹FéO U‰åƒģ$VW‹^’FŠ˜‰Ē ’ué5 ƒ’%t ’vWč‘[[ėŽFō‰ĘFō‰FšĒFä‹^€?-u’F’FäĒFā ‹^€?0u’FĒFā0ĒFź‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fź‰Fź~źėŹĒFęĒF胒.u9‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fč‰Fč~č’FęėĒĒFąƒ’ltƒ’Lu’Fą‹^€?t ‹^’FŠ˜‰ĒWé’Fąæė’Fąæ ė’Fąæƒ~ąt‹^ƒFW’w’7VčNžƒÄ‰Ęéé‹^ƒFW’7VčŲżƒÄ‰ĘéÓ’Fąƒ~ąt<‹^ƒF‹‹O‰F܉Nރ~Ž}Ę-F÷^Ü÷^ރ^Žø P’vŽ’vÜVčóżƒÄ‰Ę鎋^ƒF‹‰Fģƒ~ģ}Ę-F÷^ģø P’vģVčgżƒÄ‰ĘėcĒFā Ę?FėXĒFā ‹^ƒF‹ˆFėEĒFā ‹^ƒF‹‰Fšƒ~šuĒF𨠃~čuĒFč’‹vš€<t’Nč|Fėó‰ųˆFė»p X铉š+Fš‰Fģ‹Fź+Fģ‰Fźƒ~ź}ĒFźƒ~äu÷^źƒ~ź}3‹^š€?-uƒ~ā0u‹^š’FšŠ˜’vPčG[[’Nģ’v’vāč9[[’Fźuš’Nģ|‹^š’FšŠ˜’vPč[[ėēƒ~źuéaż’v’vāč[[’NźėēU‰åPPV‹vW1’öDtø’’PéØöDuø’’Pé›öDtøPFP’4č‡ƒÄ‰FžĒDGėHĒv[‹D‰ĆƒĆ1ɊNQ‰\‰ĆXˆ‹D@‰D||öD€u’t’t’4č>ƒÄ‰Fž‹D‰DG ’t+ƒ~ž~‹Fž9Dtƒ~ž}LėLø’’PėĒD1ĄPXéÓU‰åƒ>vt‹v’Ń1ĄPPPPP’vøP1ĄPčłƒÄé«U‰å1ĄPPPPP’vøP1ĄPč܃ÄéŽU‰åPV1öƒž}‰óŃヿH t ‰óŃć’·H č[FėįédU‰åPV‹vWöDuöDu1ĄPė7ƒ|1ĄPė,’t’t’4č[ƒÄ‰Ē9|uĒD‹D‰DWė Lø’’PXéU‰å1ĄPPPPPPøP1ĄPčCƒÄéõU‰å1ĄPPPPP’vøPøPč%ƒÄé×U‰å1ĄPPPP’v’vø%P1ĄPčƒÄéøU‰å1ĄPPPPPPøP1ĄPčėƒÄéU‰åV‹vƒ>˜|ƒ>˜#|øPøJPøPčŸƒÄėXVčW[PVøPčŒƒÄøPøZPøPčzƒÄ‹˜Ńć’·° č+[‹˜ŃćP’·° øPčWƒÄøPø^PøPčEƒÄéU‰åPVW‹~1ö‰ūG€?tFėõ‰šéüU‰åPVW‹~1ĄPPPPPPø*PøPč*ƒÄ‰Ę ö|‹f‰ ‹h‰M1ĄPėVXéĄU‰å1ĄPPPPPPøP1ĄPčõƒÄé§U‰åPPV‹vW‹FŃą-‰Ć‹æx‹FŃą-‰Ć‰·x‹N‰fƒžt öuVėø« Ppø0P1ĄPč+[[‰Fžƒ~žuæƒ~ž}’vžėWXé<PSQRVWU‰ć‹_‰ŲKŪ‹Ÿx’6dP’ÓXd]_^ZY[X`ĻU‰åPVW‹~1ĄPPPPPPøP1ĄPč:ƒÄ‰Ę ö| ’t‹f‰ ‰šéŲU‰å1ĄPP’vP’v’vøPøPčƒÄéøU‰å‹N‰f‹N ‰h‹N ‰j‹N‰l‹N‰n‹N‰p’v’včQ[[é}U‰åPPVW’v č[‰Ē‰>f‹N‰h‹N ‰j¾lƒ’‰ųO Ąt ‹^ ’F ŠˆFėģ’v’vč[[é/U‰åPV‹N‰døbP’včP[[‰Ę ötVėƒ>d}‹d÷ى˜ø’’Pė’6dXéšU‰åPV‹vW1’‰óF€?tGėõ‰ų@éÓ¹ė ¹ė¹ėU‰å‹F‹^Ķ ]Ć[YZXV‰ę‡\^9Ówr9Čw tø’’Ć1ĄĆøƋ‹OƒĆI|;uö‹_…ŪuøP鬒ć‰ÓėļVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó‰Ź_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŌ+Tū@āćėŹVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó1ۉЉŚ_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŅ+Tū@āćėČčYčĆøŗ¤ė0øŗ»ė(øŗŅė øŗéėøŗėøŗėøŗ-ė1Ū‡Z…ŪtP’ÓXĆ»SRøPč;蝶‰ĀƒśsŃā»zӋ…Ūt‰Śė»K¹‰Āā0ˆKќќќāķŗ=ėŖU‰åĒœ‹^‰ž‹^‰ ‹^‰¤øšPøPø»š¹Ķ ‰ģ]Ćč-ś_^‰ģ]Ć^_ėųTest 3 ok %d errors Error %d vvBvv* 4 > ± DģO±U©X”cgdļe\f\g\o“szu¬x¤(null)ų  $4LVp‚”¤°ĀŅäš$6FVfxŒ ²ĀŅźų*8#Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo childrenNo more processesNot enough corePermission deniedBad addressBlock device requiredMount device busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeMath argumentResult too largeInvalid errno : é¤-»»ŅError: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow EM trap 0000000 octal ²² € Ą, ‰ć‹ƒĆ‰Č@ŃąŲ£€ PSQčƒÄPčKU‰åPVø’P’6‚ č![[ø Pč—[1öƒž}čFėõøš Pč‚[’6‚ č×[é U‰åčŠ£Nƒ>Nué"ƒ>N}č č¶£Lƒ>Luéƒ>L}ččœ£Jƒ>Juéäƒ>J}čģč‚£Hƒ>Htgƒ>H}čÕĒD>D'}’Dėņø P’6Jčˆ[[ø P’6Lč{[[ø P’6Nčn[[øFPčC[øFPč;[øFPč3[øFPč+[ėu1ĄP’6‚ čĀ[[£B”@™1ÉQRPøP1ŅčņRP’6Bč@ƒÄĒDƒ>D }øPø@ P’6BčžƒÄ’Dėį’@’6BčŠ[1ĄPčé[ėčHėūčCėūč>ėūéŽ U‰åøž Pč/[øPčĀ[éČ U‰åV‹vFP’vVčƒÄöD@tVč[é¤ U‰åFP’v’6ą čōƒÄ‹ą öG@t’6ą čę[é| U‰åPPVW‹^ƒĆ ‰Ž‹F1Ņ÷v‰×ƒĒ0ƒ’9~ƒĒN‰ųˆ‹F1Ņ÷v‰Fƒ~uՋ^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹Fé U‰åPPVW‹^ƒĆ ‰Ž‹F ™’v’vRPčŪ‰ĒƒĒ0ƒ’9~ƒĒN‰ųˆ‹F ™’v’vRPčH‰F‰V’v’v1ĄPPčš Ąu¹‹^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹FéžU‰åƒģ$VW‹^’FŠ˜‰Ē ’u鄃’%t ’vWč‘[[ėŽFō‰ĘFō‰FšĒFä‹^€?-u’F’FäĒFā ‹^€?0u’FĒFā0ĒFź‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fź‰Fź~źėŹĒFęĒF胒.u9‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fč‰Fč~č’FęėĒĒFąƒ’ltƒ’Lu’Fą‹^€?t ‹^’FŠ˜‰ĒWé’Fąæė’Fąæ ė’Fąæƒ~ąt‹^ƒFW’w’7VčNžƒÄ‰Ęéé‹^ƒFW’7VčŲżƒÄ‰ĘéÓ’Fąƒ~ąt<‹^ƒF‹‹O‰F܉Nރ~Ž}Ę-F÷^Ü÷^ރ^Žø P’vŽ’vÜVčóżƒÄ‰Ę鎋^ƒF‹‰Fģƒ~ģ}Ę-F÷^ģø P’vģVčgżƒÄ‰ĘėcĒFā Ę?FėXĒFā ‹^ƒF‹ˆFėEĒFā ‹^ƒF‹‰Fšƒ~šuĒFš> ƒ~čuĒFč’‹vš€<t’Nč|Fėó‰ųˆFė» XéĮ‰š+Fš‰Fģ‹Fź+Fģ‰Fźƒ~ź}ĒFźƒ~äu÷^źƒ~ź}3‹^š€?-uƒ~ā0u‹^š’FšŠ˜’vPčG[[’Nģ’v’vāč9[[’Fźuš’Nģ|‹^š’FšŠ˜’vPč[[ėēƒ~źuéaż’v’vāč[[’NźėēU‰åPPV‹vW1’öDtø’’PéØöDuø’’Pé›öDtøPFP’4čµƒÄ‰FžĒDGėHĒP°‹D‰ĆƒĆ1ɊNQ‰\‰ĆXˆ‹D@‰D||öD€u’t’t’4člƒÄ‰Fž‹D‰DG ’t+ƒ~ž~‹Fž9Dtƒ~ž}LėLø’’PėĒD1ĄPXé"U‰å’v’vøPøPčrƒÄé U‰åƒ>Pt‹P’Ń1ĄPPPPP’vøP1ĄPč ƒÄéąU‰å1ĄPPPPP’vøP1ĄPčšƒÄéĆU‰åPV1öƒž}‰óŃćƒæŽ t ‰óŃć’·Ž č[Fėįé™U‰åPV‹vWöDuöDu1ĄPė7ƒ|1ĄPė,’t’t’4čoƒÄ‰Ē9|uĒD‹D‰DWė Lø’’PXéCU‰å1ĄPPPPPPøP1ĄPčWƒÄé*U‰å1ĄPPPPP’vøPøPč9ƒÄé U‰å1ĄPPPP’v’vø%P1ĄPčƒÄéķU‰åPV‹N‰J ‹N‹V‰P ‰R ‹N ‰L øPøPčo[[‰Ę öt‰š™RPė’6R ’6P XZé¤U‰å1ĄPPPPPPøP1ĄP跃ÄéŠU‰å’v’vøPøPč؃ÄépU‰åPV1ĄPP’vP’v’vøPøPčyƒÄ‰Ę‰šéGU‰å’v1ĄPø PøP薃Äé.U‰åPVW‹~1ĄPPPPPPøP1ĄPč:ƒÄ‰Ę ö| ’t‹J ‰ ‰šéłU‰å1ĄPP’vP’v’vøPøPčƒÄéŁU‰å‹N‰J ‹N ‰L ‹N ‰N ‹N‰P ‹N‰R ‹N‰T ’v’včQ[[éžU‰åPPVW’v č[‰Ē‰>J ‹N‰L ‹N ‰N ¾P ƒ’‰ųO Ąt ‹^ ’F ŠˆFėģ’v’vč[[éPU‰åPV‹N‰H øF P’včP[[‰Ę ötVėƒ>H }‹H ÷ىRø’’Pė’6H XéU‰åPV‹vW1’‰óF€?tGėõ‰ų@éō¹ė ¹ė¹ėU‰å‹F‹^Ķ ]Ć[YZXV‰ę‡\^9Ówr9Čw tø’’Ć1ĄĆøƋ‹OƒĆI|;uö‹_…ŪuøPéĶ’ć‰ÓėļVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó‰Ź_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŌ+Tū@āćėŹ‰ćR‰Į÷gZP‰Š÷gZ‰ȉŃ÷gŹ[ƒÄ’ćVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó1ۉЉŚ_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŅ+Tū@āćėČčYčĆøŗˆ ė0øŗŸ ė(øŗ¶ ė øŗĶ ėøŗä ėøŗś ėøŗ ė1Ū‡> …ŪtP’ÓXĆ»SRøPč;čhū‰ĀƒśsŃā»^ Ӌ…Ūt‰Śė»/ ¹‰Āā0ˆKќќќāķŗ! ėŖU‰åĒV‹^‰X‹^‰Z‹^‰^øTPøPø»T¹Ķ ‰ģ]Ćčųś_^‰ģ]Ć^_ėų„ test4.tempTest 4 ok Fork failed. Not enough memory. PPBPPĄ Ź Ō ģ D'OģUäXÜc¢d*e—f—g—oļsµuēxß(null)Ķ ä ˆ  Ÿ Ÿ ¶ Error: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow EM trap 0000000 octal ll# To make 'test0', type: make f=test0 # To make 'test1', type: make f=test1 # To make 'test2', type: make f=test2 # Get the idea? l=/usr/lib CFLAGS = -I/usr/include -F file: $l/libc.a $f.s @asld -o $f $l/crtso.s $f.s $l/libc.a $l/end.s  pąD‰ć‹ƒĆ‰Č@ŃąŲ£pPSQčƒÄPčŃ U‰åPVø|PčD[1ö öčUč÷čGčäč"čÓFėēƒ>Vu ø†Pč[ė ’6VøŠPč [[1ĄPč… [éšU‰å’6z$’vø–PčļƒÄ’VéÖU‰åƒģVWĒFś¾PžPsƒ<tĒFśƒĘėėƒ~śt1ĄPč“’[øęPøPčņ [[=søP蚒[ø Pø PčŲ [[=søP耒[č² ‰Fžč¼ ‰Ē ’t ’}č+Wč?[ė’vžč•[1ĄPøPč› [[=søPčC’[1ĄPø Pč‚ [[=søPč*’[éU‰åPĒFžƒ~ž}*øP’vč$ [[ Ą}øPč’[ƒ>Ruė÷’R’FžėŠFžPčŹ [ Ą}øP茞[~žtøPčĖž[éøU‰åPV1öƒž}(ƒ>Tuė÷’Tø P’vč» [[ Ą}ø P藾[FėÓøPč [éxU‰åøęPøPčÄ [[=sø Pčlž[’TéUU‰åø Pø Pč  [[=sø PčHž[’Ré1U‰åƒģVWč{ ‰Ę öuéŒ ö}čēčh ‰Ę öuép ö}čŌčU ‰Ē ’t[ ’}čÄø PWč [[ Ą}ø Pčķż[FüPčÉ [ Ą}ø P裿[FüPčµ [ Ą}øPčÅż[FüPč” [ Ą}øP豿[ėčŚ ėž1ĄPč$ [ė1ĄPč [é…U‰åƒģVWčĮ ‰Ēč¼ 9ĒučÅ ‰Ę ö}č8č© 9Ēuč² ‰Ę ö}č%č– 9ĒučŸ ‰Ę ö}ččƒ 9ĒuVø P1ĄPčV [[ Ą}øPč2ż[FüPč [ Ą}øPčż[FüPčś [ Ą}øPč ż[FüPčę [ Ą} øPčöü[ėč éÜU‰åƒģVW1öƒž|é‹č ‰Ē ’uéq ’}čŠøPč¶ [‰óŃć’·rWčĖ [[ Ą}øPč§ü[øPč [FžPč{ [‰Fųƒ~ų}øPč†ü[‹Fž%?‰óŃć9‡rtøPčnü[9~ųtøPčaü[ė čŠ 1ĄPčÖ[Fém’é<U‰åPVĒP1öƒž},ø_PøPčz [[øPč9 [čR ‰š@9PtøPčü[FėĻéü U‰åƒģøPøPčE [[=søPčķū[č/‰Fžƒ~žtXƒ~ž}虸PčÅ [øP’vžčÜ[[ Ą}øPčøū[FžPč” [ Ą}øPč¤ū[1ĄPøPčć [[=s1øPč‹ū[ė'č“ ‰Füƒ>z$t‹z$÷كłtøPčiū[1ĄPčć[éO U‰åéI U‰åƒģVWč“‰Ē ’}č ’t.FžPč [¹‹FžÓų%’‰Fž‰ų%’9FžuéĄøPčū[éµčʉFžčj‰Fü‹FüFž%’‰ĘVč©[ Ą}øPččś[č›9Ętø P補[č69Ętø!P菜[載FžčL‰Fü‹FüFž@%’‰ĘVč[ Ą}ø"P蔜[č“9Ętø#P蒶[č9Ętø$P胜[čµ%’‰FžFüPčV [=’’tø%Pčeś[’vžčß[éI U‰åø&PčPś[é= U‰åPVøPø Pč†[[øPø Pčy[[č`‰Ęø PVč7[[1ĄPø Pč^[[é’ U‰å’Péö U‰åƒģ øPøPč>[[=sø&Pčęł[FöPč/[č ‰Fžƒ~žtfƒ~ž}芸Pč¶[øP’vžčĶ[[ Ą}ø'P詳[FžPč…[ Ą}ø(P蕳[1ĄPøPčŌ[[=sø)Pč|ł[’vöčM[’vųčF[ė*øPFžP’vöčźƒÄ‰Füƒ>z$tø*PčIł[1ĄPčĆ[é/ U‰å’6z$ø¬Pč0[[øPčØ[é U‰åV‹vFP’vVčƒÄöD@tVčõ[éš U‰åFP’v’6īčōƒÄ‹īöG@t’6īčĢ[éČ U‰åPPVW‹^ƒĆ ‰Ž‹F1Ņ÷v‰×ƒĒ0ƒ’9~ƒĒN‰ųˆ‹F1Ņ÷v‰Fƒ~uՋ^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹Féf U‰åPPVW‹^ƒĆ ‰Ž‹F ™’v’vRPč' ‰ĒƒĒ0ƒ’9~ƒĒN‰ųˆ‹F ™’v’vRP赉F‰V’v’v1ĄPPč] Ąu¹‹^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹Féź U‰åƒģ$VW‹^’FŠ˜‰Ē ’uéŠ ƒ’%t ’vWč‘[[ėŽFō‰ĘFō‰FšĒFä‹^€?-u’F’FäĒFā ‹^€?0u’FĒFā0ĒFź‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fź‰Fź~źėŹĒFęĒF胒.u9‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fč‰Fč~č’FęėĒĒFąƒ’ltƒ’Lu’Fą‹^€?t ‹^’FŠ˜‰ĒWé’Fąæė’Fąæ ė’Fąæƒ~ąt‹^ƒFW’w’7VčNžƒÄ‰Ęéé‹^ƒFW’7VčŲżƒÄ‰ĘéÓ’Fąƒ~ąt<‹^ƒF‹‹O‰F܉Nރ~Ž}Ę-F÷^Ü÷^ރ^Žø P’vŽ’vÜVčóżƒÄ‰Ę鎋^ƒF‹‰Fģƒ~ģ}Ę-F÷^ģø P’vģVčgżƒÄ‰ĘėcĒFā Ę?FėXĒFā ‹^ƒF‹ˆFėEĒFā ‹^ƒF‹‰Fšƒ~šuĒFšLƒ~čuĒFč’‹vš€<t’Nč|Fėó‰ųˆFė»Xé.‰š+Fš‰Fģ‹Fź+Fģ‰Fźƒ~ź}ĒFźƒ~äu÷^źƒ~ź}3‹^š€?-uƒ~ā0u‹^š’FšŠ˜’vPčG[[’Nģ’v’vāč9[[’Fźuš’Nģ|‹^š’FšŠ˜’vPč[[ėēƒ~źuéaż’v’vāč[[’NźėēU‰åPPV‹vW1’öDtø’’PéØöDuø’’Pé›öDtøPFP’4č"ƒÄ‰FžĒDGėHĒX$6 ‹D‰ĆƒĆ1ɊNQ‰\‰ĆXˆ‹D@‰D||öD€u’t’t’4čŁƒÄ‰Fž‹D‰DG ’t+ƒ~ž~‹Fž9Dtƒ~ž}LėLø’’PėĒD1ĄPXénU‰åƒ>X$t‹X$’Ń1ĄPPPPP’vøP1ĄPč”ƒÄéFU‰å1ĄPPPPP’vøP1ĄPčwƒÄé)U‰åPV1öƒž}‰óŃヿģt ‰óŃć’·ģč[Fėįé’U‰åPV‹vWöDuöDu1ĄPė7ƒ|1ĄPė,’t’t’4čöƒÄ‰Ē9|uĒD‹D‰DWė Lø’’PXé©U‰å1ĄPPPPPPøP1ĄPčŽƒÄéU‰åPV1ĄPPPPPPø/P1ĄPčĮƒÄ‰Ę ö}Vė’6ZXédU‰åPV1ĄPPPPPPøP1ĄPč–ƒÄ‰Ę ö}Vė’6ZXé9U‰åPV1ĄPPPPPPø/P1ĄPčkƒÄ‰Ę‰šéU‰å1ĄPPPPP’vøPøPčIƒÄéūU‰åPV1ĄPPPPPPøP1ĄPč,ƒÄ‰Ę‰šéŁU‰å1ĄPPPP’v’vø%P1ĄPč ƒÄé»U‰å1ĄPPPPPPøP1ĄPčīƒÄé U‰åPVW‹~1ĄPPPPPPø*PøPčĢƒÄ‰Ę ö|‹Z‰ ‹\‰M1ĄPėVXébU‰åPV1ĄPP’vP’v’vøPøPčŽƒÄ‰Ę‰šé;U‰å1ĄPPPPP’vø.P1ĄPčmƒÄéU‰å1ĄPPPPP’vøP1ĄPčPƒÄéU‰åéüU‰åø]PøPčG[[’vč[č éßU‰å1ĄPPPPP’vøP1ĄPčƒÄéĀU‰å1ĄPPPPPPøP1ĄPčõƒÄé§U‰åPPV‹vW‹FŃą-‰Ć‹æZ$‹FŃą-‰Ć‰·Z$‹N‰Zƒžt öuVėø!Pdø0P1ĄPč+[[‰Fžƒ~žuæƒ~ž}’vžėWXé<PSQRVWU‰ć‹_‰ŲKŪ‹ŸZ$’6XP’ÓXX]_^ZY[XTĻU‰åPVW‹~1ĄPPPPPPøP1ĄPč:ƒÄ‰Ę ö| ’t‹Z‰ ‰šéŲU‰å1ĄPP’vP’v’vøPøPčƒÄéøU‰å‹N‰Z‹N ‰\‹N ‰^‹N‰`‹N‰b‹N‰d’v’včQ[[é}U‰åPPVW’v č[‰Ē‰>Z‹N‰\‹N ‰^¾`ƒ’‰ųO Ąt ‹^ ’F ŠˆFėģ’v’vč[[é/U‰åPV‹N‰XøVP’včP[[‰Ę ötVėƒ>X}‹X÷ىz$ø’’Pė’6XXéšU‰åPV‹vW1’‰óF€?tGėõ‰ų@éÓ¹ė ¹ė¹ėU‰å‹F‹^Ķ ]Ć[YZXV‰ę‡\^9Ówr9Čw tø’’Ć1ĄĆøƋ‹OƒĆI|;uö‹_…ŪuøP鬒ć‰ÓėļVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó‰Ź_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŌ+Tū@āćėŹVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó1ۉЉŚ_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŅ+Tū@āćėČčYčĆøŗ˜ė0øŗÆė(øŗĘė øŗŻėøŗōėøŗ ėøŗ!ė1Ū‡N…ŪtP’ÓXĆ»SRøPč;čś‰ĀƒśsŃā»nӋ…Ūt‰Śė»?¹‰Āā0ˆKќќќāķŗ1ėŖU‰åĒ~$‹^‰€$‹^‰‚$‹^‰†$ø|$PøPø»|$¹Ķ ‰ģ]Ć蒳_^‰ģ]Ć^_ėų Test 5 ok %d errors Error %d. errno=%d Test 5. fork failed. Errno=%d X X BXXĪŲāŒ DĒ OŒ U„ X| cB dŹ e7 f7 g7 o sU u‡ x (null)Żō˜!ÆÆĘError: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow EM trap 0000000 octal ”$”$iÜŠ' ,Œ‘°  ĪH8g‡‚€Ó$4CĘ"FnŹą”#Ęā4aä€PA§ 3iؔф:eꊔį§K&QŖSĒĢ–0dŠčbQA›0Q¤±G×4½:FN™0tP“|³LB7Ҧ°xŽŒfPˆ ’s 6×ZaęJkh‚€±D` d6¼bÅŌŖWĢ©#FŽT¶ śģu Wī›5\܈Š{µŽ6׈u S¦^Ķ L®,Ud¬f@ PxPp_9ŖS¤Øšą… PR–8xå  ŅäFįÄ0¦ŗyó;øÅčÓyĒšķ7ųcčŏ'÷Ź|¼Šē Ąėv8»vīå/£—>ß  ņĄIu^|é!§s’½‡ž|ŌłwŻ`÷u§üķęŠ šGՂ®·Ü@*H ƒ>˜HųØ×ˆæé–FM‹„ĮR0ŌXXMõkÄÄFƒ%”ĆŠ<ś$C ¹c|=²ńcuBßP…eĀR&@eVb¹¤–U¢pe–[v)e ”ĮĘ3G G‚½Ēr«‘%ÓYY®YFŖq”b4ą*„4’x~Ł" /vćŒ1ę‚Wa‚ŸD™ĮRJei(I}9o°y)YŠÄ% Ł-©Y|hŖÉę†ށFYŗÅ0ÕeŠįŠ„ ¼«ž“jy«L¹īŚėÆ+jvÕ°³g+®(č ƾ¤ß³ Ą¶„)Ų¶Ł[Å%‚åń•Ldøp•o “Üuœm”ц_yøŚh˜©–®i   \"‰ć‹ƒĆ‰Č@ŃąŲ£  PSQčƒÄPč¾U‰åPVø¢ Pč1[1öƒžF}čEFėõƒ>u ø¬ Pč[ė ’6ø° Pč[[1ĄPč€[é2 U‰å’vø¼ Pčī[[øČ Pč¤[é U‰åƒģVW1ĄPčP[‰Ę1ĄPčG[‰Ę1’ƒ’ } ø÷ēPč4[Gėī1’ƒ’ } øł’÷ēPč [Gėī1ĄPč[9ĘtøPč’’[øPč[VčĘ[ ĄtøPčy’[1ĄPčź[9ĘtøPčf’[ĒFö’Fö‹^öóSč•[1ĄPčÅ[‰Fü9vütä‹Fü)š‰Fōø’’Pč­[1ĄPč¦[9ĘtøPč"’[Vč^[1ĄPčŽ[9ĘtøPč ’[ĒFö’Fö‹Fö÷Ų‰ĆóSč5[1ĄPče[‰Fś9vśtą‰š+Fś‰FņøPčM[1ĄPčF[9ĘtøPčĀž[Včž[1ĄPč.[9ĘtøPčŖž[‹Fņ9Fōtø P蚾[‹^ōŃćóSčĻ[1ĄPč’[‹^ōŃćó9Ćtø Pčtž[ø÷fōPčį[1ĄPčŚ[Pø÷fō‰ĆóX9Ųtø PčJž[øū’÷fōPč·[1ĄPč°[9Ętø Pč,ž[éY U‰åV‹vFP’vVčƒÄöD@tVčõ[é7 U‰åFP’v’6ź čōƒÄ‹ź öG@t’6ź čĢ[é U‰åPPVW‹^ƒĆ ‰Ž‹F1Ņ÷v‰×ƒĒ0ƒ’9~ƒĒN‰ųˆ‹F1Ņ÷v‰Fƒ~uՋ^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹Fé­U‰åPPVW‹^ƒĆ ‰Ž‹F ™’v’vRPčn‰ĒƒĒ0ƒ’9~ƒĒN‰ųˆ‹F ™’v’vRPčü‰F‰V’v’v1ĄPPč¤ Ąu¹‹^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹Fé1U‰åƒģ$VW‹^’FŠ˜‰Ē ’u郒%t ’vWč‘[[ėŽFō‰ĘFō‰FšĒFä‹^€?-u’F’FäĒFā ‹^€?0u’FĒFā0ĒFź‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fź‰Fź~źėŹĒFęĒF胒.u9‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fč‰Fč~č’FęėĒĒFąƒ’ltƒ’Lu’Fą‹^€?t ‹^’FŠ˜‰ĒWé’Fąæė’Fąæ ė’Fąæƒ~ąt‹^ƒFW’w’7VčNžƒÄ‰Ęéé‹^ƒFW’7VčŲżƒÄ‰ĘéÓ’Fąƒ~ąt<‹^ƒF‹‹O‰F܉Nރ~Ž}Ę-F÷^Ü÷^ރ^Žø P’vŽ’vÜVčóżƒÄ‰Ę鎋^ƒF‹‰Fģƒ~ģ}Ę-F÷^ģø P’vģVčgżƒÄ‰ĘėcĒFā Ę?FėXĒFā ‹^ƒF‹ˆFėEĒFā ‹^ƒF‹‰Fšƒ~šuĒFšH ƒ~čuĒFč’‹vš€<t’Nč|Fėó‰ųˆFė» Xéu‰š+Fš‰Fģ‹Fź+Fģ‰Fźƒ~ź}ĒFźƒ~äu÷^źƒ~ź}3‹^š€?-uƒ~ā0u‹^š’FšŠ˜’vPčG[[’Nģ’v’vāč9[[’Fźuš’Nģ|‹^š’FšŠ˜’vPč[[ėēƒ~źuéaż’v’vāč[[’NźėēU‰åPPV‹vW1’öDtø’’PéØöDuø’’Pé›öDtøPFP’4čiƒÄ‰FžĒDGėHĒ#‹D‰ĆƒĆ1ɊNQ‰\‰ĆXˆ‹D@‰D||öD€u’t’t’4č ƒÄ‰Fž‹D‰DG ’t+ƒ~ž~‹Fž9Dtƒ~ž}LėLø’’PėĒD1ĄPXéµU‰åƒ>t‹’Ń1ĄPPPPP’vøP1ĄPčŪƒÄéU‰å1ĄPPPPP’vøP1ĄPč¾ƒÄépU‰åPV1öƒž}‰óŃヿč t ‰óŃć’·č č[FėįéFU‰åPV‹vWöDuöDu1ĄPė7ƒ|1ĄPė,’t’t’4č=ƒÄ‰Ē9|uĒD‹D‰DWė Lø’’PXéšU‰åPV1ĄPP’vPPPøP1ĄPč!ƒÄ‰Ę öu ‹‰P 1ĄPėø’’PXéŗU‰åPPVW‹>P ‹^P ‰Žƒ~~9÷w ƒ~} 9÷sø’’PėVč—’[ ĄuWėø’’PXéwU‰åV‹vƒ>|ƒ>#|øPøģPøPč{ƒÄėXVčW[PVøPčhƒÄøPøüPøPčVƒÄ‹Ńć’·R č+[‹ŃćP’·R øPč3ƒÄøPøPøPč!ƒÄéōU‰åPVW‹~1ö‰ūG€?tFėõ‰šéŲU‰å1ĄPP’vP’v’vøPøPčƒÄéøU‰å‹N‰‹N ‰‹N ‰ ‹N‰ ‹N‰‹N‰’v’včQ[[é}U‰åPPVW’v č[‰Ē‰>‹N‰‹N ‰ ¾ ƒ’‰ųO Ąt ‹^ ’F ŠˆFėģ’v’vč[[é/U‰åPV‹N‰øP’včP[[‰Ę ötVėƒ>}‹÷ىø’’Pė’6XéšU‰åPV‹vW1’‰óF€?tGėõ‰ų@éÓ¹ė ¹ė¹ėU‰å‹F‹^Ķ ]Ć[YZXV‰ę‡\^9Ówr9Čw tø’’Ć1ĄĆøƋ‹OƒĆI|;uö‹_…ŪuøP鬒ć‰ÓėļVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó‰Ź_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŌ+Tū@āćėŹVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó1ۉЉŚ_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŅ+Tū@āćėČčYčĆøŗDė0øŗ[ė(øŗrė øŗ‰ėøŗ ėøŗ¶ėøŗĶė1Ū‡ś…ŪtP’ÓXĆ»SRøPč;č»ū‰ĀƒśsŃā»Ӌ…Ūt‰Śė»ė¹‰Āā0ˆKќќќāķŗŻėŖU‰åĒ‹^‰ ‹^‰ ‹^‰øPøPø»¹Ķ ‰ģ]ĆčKū_^‰ģ]Ć^_ėųTest 6 ok %d errors Error %d BŹ Ō Ž y D“OyUqXic/d·e$f$g$o|sButxl(null)š ¢ ¬ Ę Ö ī ų  $ 6 F R d t † ’ Ø ŗ Ę Ų č ų .BTdtŒš°ĄĢŚ#Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo childrenNo more processesNot enough corePermission deniedBad addressBlock device requiredMount device busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeMath argumentResult too largeInvalid errno : ‰ DĶ[[rError: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow EM trap 0000000 octal #ŅøƦ™2 DĢIsĘM6.ЈPp`Įƒ ĖȑćęMĉešŠŃč„@: 4r|³CĮɔĒŠi©Ą„”fź Œ" 9wĀčł3čDźóPN›¤FcšLŃņå4iؐYxfĪO8aäpõ āaŲ6sZ‚0y„o¶Ä€!ƒFšmĀģ©`‚µ/ÓŠ\ GĪI3(DP)3%ˆ ©žśFi@ōc‡I1<§Y±"æ F6®1TrjĘtjLmłzõŒž“UǦ[AķŲ5z’®a£÷Ś>“Ó˜¹¬R¦ęĶ0Rų.|8ń›5\܈¼¶ ›9e¦¾‰XD 20åTž“]‹ętø§Ä“†Šč-‘+(ƒĀō—n“äaćŃQ^vElTē¹ŠŻFõp^{?¹ń“JÉiłÕT“n¬ń5 [(%ińÓUY‘¢Š@±Ę?© ƒÅ8£fœ©E™e(ÜČ£ o©· w¹<€@$\rŃe—g7’fšr—ŁødŠ™f†ŒgšZrĖ”šåŒ¦ń‡_ ¼ W•1Ę&-'Ęs˜”'Ae„Uzt¼Į*¼@ęe\9Ä 1µT ¦5]JŒŹ‡% ‰>Ä( Ž )gi¢ ƒ|&¾ČćeŠń¢qu^Ę¢V/ö`FekōdŚi¾]śŖ‹)2 ź|Ā™XĘM(ģś¢|}¤ōBØķŠB©)"{(¦ )ŹčOS$qÄDĮħ“ņGƒ„efŗč\ŲjĖ­·ą†Zƒdś K¬±ŃŚ„½d˜\[‚Õ“Ö¬@fh¾Ī š•ø&péY-ŠļOś. 6øvVlšgāXĻżJŪĘ ĶŃB >"X™wčeŸ i“Ké ä^–— Č@œ Sм59 -’µõ³¾ū¢ŌļdĖĢcg&|pi _œ»rÜC— ŠVuČ#Ó¶pĆφõ"ēJjŅvGŸ}wØ@T"NkīµJķä2sÉ·uW* _T­õ%wµš¢[÷yKŖT¤†5Vßś)āT‚ÖÖcƒ`!/ęxée±\k ¦™†Ś„¦š ¬kŸ?Ūėf¢÷é +\f꿆$œķ®†N«­µó^,īįā±»š ³įpęh+Ni £ŅĘę„)ׇ‚ ž9÷ ®M²Ź×gÆ:ŽćJ/|õ+‹Ÿ;£ļJŸ¬wąVą/uʕŗļŪūĖÖ’õųŁßdų?ŌüĻ><Žß>›Č n–+QŠ*ō“5äČT›A•ŖRÄŖKipU¦¹ē¢:ĮīwTiÓ›Žą6äs~j‹čņTØiŃi|ʋ >ČĮnęX%äQģRč&°Š…0”ưpB+źd—¹aīrč#¦ „¢ 4ŗØŠˆ-|”¼˜(‡58цڣ¢æZµĆ+ö0‹$<]™’·(N yćcTŪrõ=ėaļnŒ‚™×ś˜>@Ę`gƒ¼ śĀgH“•LYą™NčĒžŁ \É ¶Pƒ.lf9 ÄbЇ–€č6Ņ€~’†ÆLwčÜ‹ø˜Ę̧>˜¤Cč@?8½į yJZaŽ0ʀ'OtüÄšBsĶĮA5üׂ0³4‚5IO3A—"Y”P›Žć&zpø»9d¬ p@Aū¾ˆ¾Į c€ŌüāWĆp¢€Ž®ƒQ&ưÉ4tĮe{ą šsKū@jȱ' bŁĶEž28Øo„ץą0ĶöŁĻRJћ(źzE3†ķ£Ü£ ™5ŃyVRz¼kLäčD¼I„h ›²ČČ)„2TŃL’#³8%OCŚ4Ö£¦5 ŁLŲܲu„ 0A MčSŲą×õ)M€K…s©Æę‰f£‰˜@Ė7ĄzDĮŃiƀ†a•“„cC ;2§<…sź)&žcÄ: ä ˹B’@#Z AØĀŠĄJ£åiu€ŽžxžåMA’ą*H”,yRɂ³Kś9CØėœ@@4ģŅŸ}"‰4÷5°ŅsåŹ+ p ÕiOTķ›–¼YFą”¦ˆPˆ!JŚ@?”DF/ ΐ; dWw½J‚ķŗš†^IČés–łŪę=Į¶9ćęQ{<ųžx\R¾s#.Øŗ®oõ‘„$K •ue h6ŚŅžÖ&A $¬ŃĶTŲ“”’#}ÓÖtFAŠN‘¢āč4‚&ém+”£’œ°¹:\ļ;X¦ģ”Ę”-óØé€Ąø†Į 0šH4fU2Fiǟ˜x„ cŖ¹Kį48ƒ©*—…³Ej® >sF“¼ä4¢će6GķÉX;]ŪźÖ·Üf”¦<Å4•óéYę¹·6Pł›k]KņWsķ•˜f¼ė0{ĢĀv9PH(kĖb2³›ķ,mßšYo‹–“¦EmzV«K^>s-±•j{ŪÜus¾1PȰÜe— pqéŒ`¤ü1ŠŖŲcęŽœŠ•.ØkĖė†!»‚ā®wߣ¢šŚ–¼‡!%Ń+_O8ī…Æ”‘GߟŲw}3±~żØ¾‰Ń €Ā“9¶ÓĶ®ćŅ ¬įlĪYŽ$׼~:—Ė? æ7Z‰ačrŽ‘ōģA Ā́Є=Œq)„Š~.±“ō£»¶:Šéi ^+: č%cdxm‚V"!2P(=ņQL%Ŗ  r^/‰ć‹ƒĆ‰Č@ŃąŲ£ PSQčƒÄPčQU‰åPVø’ PčÄ[1öž–}č$Fėōƒ> 6u øœ Pč§[ė ’6 6ø  Pč™[[é& U‰åƒģVWøPøPč [[1’1öžˆ}‰óŃヿtGFėė ’~øPč[øPčøPč•[[éŪ U‰å’6F>’v’6"6ø¬ Pč5ƒÄøĪ Pč«[’ 6é¶ U‰åV‹vFP’vVčƒÄöD@tVčõ[é’ U‰åFP’v’6š čōƒÄ‹š öG@t’6š čĢ[éj U‰åPPVW‹^ƒĆ ‰Ž‹F1Ņ÷v‰×ƒĒ0ƒ’9~ƒĒN‰ųˆ‹F1Ņ÷v‰Fƒ~uՋ^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹Fé U‰åPPVW‹^ƒĆ ‰Ž‹F ™’v’vRPčÉ‰ĒƒĒ0ƒ’9~ƒĒN‰ųˆ‹F ™’v’vRPčW‰F‰V’v’v1ĄPPč’ Ąu¹‹^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹FéŒU‰åƒģ$VW‹^’FŠ˜‰Ē ’uérƒ’%t ’vWč‘[[ėŽFō‰ĘFō‰FšĒFä‹^€?-u’F’FäĒFā ‹^€?0u’FĒFā0ĒFź‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fź‰Fź~źėŹĒFęĒF胒.u9‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fč‰Fč~č’FęėĒĒFąƒ’ltƒ’Lu’Fą‹^€?t ‹^’FŠ˜‰ĒWé’Fąæė’Fąæ ė’Fąæƒ~ąt‹^ƒFW’w’7VčNžƒÄ‰Ęéé‹^ƒFW’7VčŲżƒÄ‰ĘéÓ’Fąƒ~ąt<‹^ƒF‹‹O‰F܉Nރ~Ž}Ę-F÷^Ü÷^ރ^Žø P’vŽ’vÜVčóżƒÄ‰Ę鎋^ƒF‹‰Fģƒ~ģ}Ę-F÷^ģø P’vģVčgżƒÄ‰ĘėcĒFā Ę?FėXĒFā ‹^ƒF‹ˆFėEĒFā ‹^ƒF‹‰Fšƒ~šuĒFšN ƒ~čuĒFč’‹vš€<t’Nč|Fėó‰ųˆFė» X銉š+Fš‰Fģ‹Fź+Fģ‰Fźƒ~ź}ĒFźƒ~äu÷^źƒ~ź}3‹^š€?-uƒ~ā0u‹^š’FšŠ˜’vPčG[[’Nģ’v’vāč9[[’Fźuš’Nģ|‹^š’FšŠ˜’vPč[[ėēƒ~źuéaż’v’vāč[[’NźėēU‰åPPV‹vW1’öDtø’’PéØöDuø’’Pé›öDtøPFP’4čăĉFžĒDGėHĒ$>¶‹D‰ĆƒĆ1ɊNQ‰\‰ĆXˆ‹D@‰D||öD€u’t’t’4č{ƒÄ‰Fž‹D‰DG ’t+ƒ~ž~‹Fž9Dtƒ~ž}LėLø’’PėĒD1ĄPXéU‰åƒ>$>t‹$>’Ń1ĄPPPPP’vøP1ĄPč6ƒÄéčU‰å1ĄPPPPP’vøP1ĄPčƒÄéĖU‰åPV1öƒž}‰óŃヿī t ‰óŃć’·ī č[Fėįé”U‰åPV‹vWöDuöDu1ĄPė7ƒ|1ĄPė,’t’t’4č˜ƒÄ‰Ē9|uĒD‹D‰DWė Lø’’PXéKU‰å1ĄPPPP’v’vø%P1ĄPč|ƒÄé.U‰å1ĄPPPPPPøP1ĄPčaƒÄéU‰åV‹vƒ>F>|ƒ>F>#|øPøš PøPčƒÄėXVčW[PVøPčƒÄøPøPøP蚃Ä‹F>Ńć’·V č+[‹F>ŃćP’·V øPč̓ÄøPøPøP軃ÄéŽU‰åPVW‹~1ö‰ūG€?tFėõ‰šérU‰åPPV‹vW‹FŃą-‰Ć‹æ&>‹FŃą-‰Ć‰·&>‹N‰ ƒžt öuVėøvPø0P1ĄPčų[[‰Fžƒ~žuæƒ~ž}’vžėWXé PSQRVWU‰ć‹_‰ŲKŪ‹Ÿ&>’6 P’ÓX ]_^ZY[XĻU‰å1ĄPP’vP’v’vøPøPčƒÄéøU‰å‹N‰ ‹N ‰‹N ‰‹N‰‹N‰‹N‰’v’včQ[[é}U‰åPPVW’v č[‰Ē‰> ‹N‰‹N ‰¾ƒ’‰ųO Ąt ‹^ ’F ŠˆFėģ’v’vč[[é/U‰åPV‹N‰ øP’včP[[‰Ę ötVėƒ> }‹ ÷ىF>ø’’Pė’6 XéšU‰åPV‹vW1’‰óF€?tGėõ‰ų@éÓ¹ė ¹ė¹ėU‰å‹F‹^Ķ ]Ć[YZXV‰ę‡\^9Ówr9Čw tø’’Ć1ĄĆøƋ‹OƒĆI|;uö‹_…ŪuøP鬒ć‰ÓėļVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó‰Ź_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŌ+Tū@āćėŹVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó1ۉЉŚ_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŅ+Tū@āćėČčYčĆøŗJė0øŗaė(øŗxė øŗėøŗ¦ėøŗ¼ėøŗÓė1Ū‡…ŪtP’ÓXĆ»SRøPč;č`ū‰ĀƒśsŃā» Ӌ…Ūt‰Śė»ń¹‰Āā0ˆKќќќāķŗćėŖU‰åĒJ>‹^‰L>‹^‰N>‹^‰R>øH>PøPø»H>¹Ķ ‰ģ]Ćčšś_^‰ģ]Ć^_ėųTest 7 ok %d errors Subtest %d, error %d errno=%d $:$:B$6$6Š Ś ä  DGO UXücĀdJe·f·g·osÕux’(null)ž ¦ ° Ź Ś ņ ü  ( : J V h x Š – ¬ ¾ Ź Ü ģ ü  2 F X h x  ž “ Ä Š Ž #Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo childrenNo more processesNot enough corePermission deniedBad addressBlock device requiredMount device busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeMath argumentResult too largeInvalid errno : ¦JÓaaxError: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow EM trap 0000000 octal `>`> Źą”SFŽcŠ„‘B…9kP¤`ŃpĪƈ)vXš`7t@4ųFćǐ#ĒŠŃŲ&ĢG‰ ö(ādM3AĄ‘sŅ TŹĢ ĀsšyĆE=@ĄŲQ7¦Ö\±"™ µC¢Fš}r¦1Eʐ=¢ĀH” ĮĪž?߬įāéY‘lꔩ{¤O J)GÓ9|EP|›”¦Ą4tPĢ՘¶ 7tmŗŃ(“fa:‡łiĢ4ńā£A’…3’éOæ Ņ*Ų-–Y˜2_Øt(‹%‚ćfńE‰.¾ŲM3į†aȐ‘CQEöķ2ŗ—3ćÆĶ4ɔaCq ›4cÖ“_Nšć”¾9gžØČE“Y ĀRrŒQ•Ę ŠńĘrŃ”oŌŃÜByH§TkNé§ÕSWÅ0"W^ˆĀ *¤Qف >%U$‚`"(ī—\ ,ŗh[(Ø8!D5žWžÅš¢Š3ōGÓZm=w$‘r!‰‚ /B$^¹œvrX9CR9©Ē†ˆ‘1!Xfr„QR‚¹‚™I%0ž ś łb ܁Fl,ˆĀP ę‹īĮ””ąŠĀ—Ūż„b[ÖÉ”‚W-(łc[zR i˜"”@Ƌqn—%z9„g5I“™h–¹f]m®šf©r“@ē›ć͐'—ńé' ‚öZ览Zˆ'£ =Ś«¤ĻQŖ„^iŖŖ\zŗ* 6šÜ‘›n™ÜŖ*§Rj”§‰Öge®2ų-˜ ¬‚ *“»Fŗā Ų%³õŽ›Æ…Všøäs3 ¬(æ©lo ĒW°µ4©ŲÄś2œm¹¦†–œķ `Ž ‰ć‹ƒĆ‰Č@ŃąŲ£`PSQčƒÄPčśU‰åPVøbPčö[1öƒž}čFėõølPčį[éU‰åƒģ"VWĒš1’ƒ’|é|1ĄPč× [øpPčR[ Ą}øPče[1ĄPøĄAPørPč„ ƒÄ Ą}øPčH[øxPøvPč] [[ Ą}øPč/[1ĄPø’Pø€Pčo ƒÄ Ą}øPč[1ĄPø’Pø„PčR ƒÄ Ą}øPčõ[1ĄPø’PøŽPč5 ƒÄ Ą}øPčŲ[1ĄPø–PčE [[‰Ę ö}øPč¾[Vč¼[ Ą}øPč­[1ĄPø Pč [[‰Ę ö}ø Pč“[Vč‘[ Ą}ø Pč‚[øØPč[[ Ą}ø Pčn[1ĄPø¬PčŪ[[‰Ę ö}ø PčT[VčR[ Ą}ø PčC[1ĄPø°Pč°[[‰Ę ö}øPč)[Vč'[ Ą}øPč[1ĄPøøPč…[[‰Ę ö}øPčž[Včü[ Ą}øPčķ[øSPøąPčÜ[[ Ą}øPčŌ[FŽPøPčł[[ Ą}øPč»[‹Fā%’=StøPčØ[ø.Pø Pč—[[ Ą}øPč[FŽPø6Pč“[[ Ą}øPčv[‹Fā%’=.tøPčc[øPøPø>PčhƒÄ Ą}øPčE[FŽPøTPčj[[ Ą}øPč,[ƒ~ętøPč[ƒ~čtøPč[1ĄPø\Pč}[[‰Ę ö|øPčö[1ĄPøbPčc[[‰Ę ö}øPčÜ[VčŚ[ Ą}øPčĖ[øPøhPč†[[ Ą}øPč²[øPønPčm[[ Ą}ø Pč™[øPøxPčT[[ Ą|ø!Pč€[ø‚Pčō[ Ą}ø"Pčl[ø†Pčą[ Ą}ø#PčX[øŠPčĢ[ Ą}ø$PčD[øŽPč[ Ą}ø%Pč0[øPč¤[ Ą}ø&Pč[ø”Pč[ Ą}ø'Pč[Gé|üén U‰å’6ō’v’6šøšPč1ƒÄø¼Pčs[éM U‰åV‹vFP’vVčƒÄöD@tVčl[é) U‰åFP’v’6ŽčōƒÄ‹ŽöG@t’6ŽčC[é U‰åPPVW‹^ƒĆ ‰Ž‹F1Ņ÷v‰×ƒĒ0ƒ’9~ƒĒN‰ųˆ‹F1Ņ÷v‰Fƒ~uՋ^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹FéŸ U‰åPPVW‹^ƒĆ ‰Ž‹F ™’v’vRPč`‰ĒƒĒ0ƒ’9~ƒĒN‰ųˆ‹F ™’v’vRPčī‰F‰V’v’v1ĄPPč– Ąu¹‹^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹Fé# U‰åƒģ$VW‹^’FŠ˜‰Ē ’ué ƒ’%t ’vWč‘[[ėŽFō‰ĘFō‰FšĒFä‹^€?-u’F’FäĒFā ‹^€?0u’FĒFā0ĒFź‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fź‰Fź~źėŹĒFęĒF胒.u9‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fč‰Fč~č’FęėĒĒFąƒ’ltƒ’Lu’Fą‹^€?t ‹^’FŠ˜‰ĒWé’Fąæė’Fąæ ė’Fąæƒ~ąt‹^ƒFW’w’7VčNžƒÄ‰Ęéé‹^ƒFW’7VčŲżƒÄ‰ĘéÓ’Fąƒ~ąt<‹^ƒF‹‹O‰F܉Nރ~Ž}Ę-F÷^Ü÷^ރ^Žø P’vŽ’vÜVčóżƒÄ‰Ę鎋^ƒF‹‰Fģƒ~ģ}Ę-F÷^ģø P’vģVčgżƒÄ‰ĘėcĒFā Ę?FėXĒFā ‹^ƒF‹ˆFėEĒFā ‹^ƒF‹‰Fšƒ~šuĒFš<ƒ~čuĒFč’‹vš€<t’Nč|Fėó‰ųˆFė»Xég‰š+Fš‰Fģ‹Fź+Fģ‰Fźƒ~ź}ĒFźƒ~äu÷^źƒ~ź}3‹^š€?-uƒ~ā0u‹^š’FšŠ˜’vPčG[[’Nģ’v’vāč9[[’Fźuš’Nģ|‹^š’FšŠ˜’vPč[[ėēƒ~źuéaż’v’vāč[[’NźėēU‰åPPV‹vW1’öDtø’’PéØöDuø’’Pé›öDtøPFP’4č[ƒÄ‰FžĒDGėHĒņ_ ‹D‰ĆƒĆ1ɊNQ‰\‰ĆXˆ‹D@‰D||öD€u’t’t’4čƒÄ‰Fž‹D‰DG ’t+ƒ~ž~‹Fž9Dtƒ~ž}LėLø’’PėĒD1ĄPXé§U‰å’v’vø!PøPčƒÄéU‰å’v1ĄPø PøPčžƒÄéuU‰å’v’vøPøPčäƒÄé[U‰åV‹v1ĄPPV’v’vVčT[PøPøPč€ƒÄé1U‰åƒ>ņt‹ņ’Ń1ĄPPPPP’vøP1ĄPčVƒÄéU‰å1ĄPPPPP’vøP1ĄPč9ƒÄéėU‰åPV1öƒž}‰óŃヿÜt ‰óŃć’·Üč[FėįéĮU‰åPV‹vWöDuöDu1ĄPė7ƒ|1ĄPė,’t’t’4čøƒÄ‰Ē9|uĒD‹D‰DWė Lø’’PXékU‰å1ĄPPPPP’vøPøPčƒÄéOU‰åV‹vW‹~1ĄPVWPVčI[PWčC[Pø PøPčoƒÄéU‰åV‹v1ĄPPV’v’vVč[PøPøPčFƒÄé÷U‰å’v’vøPøPčgƒÄéŽU‰åV‹vƒ>ō|ƒ>ō#|øPøŽPøP蹃ÄėXVčW[PVøPč̓ÄøPøīPøP軃Ä‹ōŃć’·Dč+[‹ōŃćP’·DøP蘃ÄøPøņPøP膃ÄéYU‰åPVW‹~1ö‰ūG€?tFėõ‰šé=U‰åPVW‹~1ĄP’vWPPWč8[PøPøPčdƒÄ‰Ę‰šéU‰å1ĄPPPPP’vø<PøPčBƒÄéōU‰å’v1ĄPø PøPčcƒÄéŚU‰å1ĄPP’vP’v’vøPøPčƒÄéøU‰å‹N‰ų‹N ‰ś‹N ‰ü‹N‰ž‹N‰‹N‰’v’včQ[[é}U‰åPPVW’v č[‰Ē‰>ų‹N‰ś‹N ‰ü¾žƒ’‰ųO Ąt ‹^ ’F ŠˆFėģ’v’vč[[é/U‰åPV‹N‰öøōP’včP[[‰Ę ötVėƒ>ö}‹ö÷ىōø’’Pė’6öXéšU‰åPV‹vW1’‰óF€?tGėõ‰ų@éÓ¹ė ¹ė¹ėU‰å‹F‹^Ķ ]Ć[YZXV‰ę‡\^9Ówr9Čw tø’’Ć1ĄĆøƋ‹OƒĆI|;uö‹_…ŪuøP鬒ć‰ÓėļVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó‰Ź_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŌ+Tū@āćėŹVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó1ۉЉŚ_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŅ+Tū@āćėČčYčĆøŗ6ė0øŗMė(øŗdė øŗ{ėøŗ’ėøŗØėøŗæė1Ū‡ģ…ŪtP’ÓXĆ»SRøPč;č@ū‰ĀƒśsŃā» Ӌ…Ūt‰Śė»Ż¹‰Āā0ˆKќќќāķŗĻėŖU‰åĒų‹^‰ś‹^‰ü‹^‰øöPøPø»ö¹Ķ ‰ģ]Ć芜_^‰ģ]Ć^_ėųTest 8 ok /dir//dir/..T3a/dir/T3bdir/T3c/dir/T3bdir/T3cdirT3b../T3a../dir/../dir/../dir/../dir/../dir/T3c../dir/../dir/../dir/../dir/../T3a../dir/../dir/../dir/../T3a../dir/../dir/../T3a../T3a../dir/../dir/../T3a../T3a/T3c/T3a/T3a/dir/T3b/dir/T3dT3bT3c../dir/T3aSubtest %d, error %d errno=%d ņņBņņ¾ČŅ> DyO>U6X.cōd|eéfégéoAsu9x1(null)Œ”žøČąź(8DVfx„š¬øŹŚźś  4FVf~Œ¢²¾Ģ#Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo childrenNo more processesNot enough corePermission deniedBad addressBlock device requiredMount device busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesNot a typewriterText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeMath argumentResult too largeInvalid errno : {’6æMMdError: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow EM trap 0000000 octal main() { exit(0); }  phP ‰ć‹ƒĆ‰Č@ŃąŲ£pPSQčƒÄPčt U‰åƒģ VWø‚Pčä[ĒFöƒ~öd}č©čČčśčAč`č’’Föėćƒ>čt’6čøŒPčÆ[[’6čč' [ĒFųFśPčŌ [ ĄuĒFųøPFśPčŃ [[ė&ƒ~ųuėƒ~ųu ø Pčk[ėøPča[øPė ø<PčS[é¤ Xé  U‰å’č’6ź’vø@P’6xčƒÄéƒ U‰åPVĒź¾Čč;žČtøPčĆ’[é` U‰åPPVWĒź¾Čæ,聞ČtøP蜒[’,tøP莒[é* U‰åƒģVWĒź¾Čæ,ĒFś裁žČtøPča’[’,tøPčS’[~śtøPčD’[éą U‰åPVĒź¾J蚁žJtøPč"’[éæ U‰åPPVWĒź¾Jæ®čsžJtøPčūž[’®tøPčķž[é‰ U‰åƒģVWĒź¾Jæ®ĒFśč8žJtøP襞[’®tøPč²ž[~śtøPč£ž[é? U‰åPF’é7 U‰åƒģVWĒFųĒFövĒFōŚĒFž ĒFüĒFśøąPčī [PéŚčĮ’‰FņøPøąPčź [[éĖƒ~ž tø Pč@ž[ƒ~ütø Pč2ž[ƒ~śtø Pč$ž[~ųtøPčž[~övtøPčž[~ōŚtøPč÷ż[čT’£ę9FņtøPčäż[čié[ƒ~ž tøP芿[ƒ~ütøPčĀż[ƒ~śtøP蓿[~ųtøP脿[~övtøP薿[~ōŚtøP臿[č䞣ę9FņtøPčtż[čéėƒ~ž tøPč`ż[ƒ~ütø PčRż[ƒ~śtø!PčDż[~ųtø"Pč5ż[~övtø#Pč&ż[~ōŚtø$Pčż[čtž£ę9Fņtø%Pčż[č÷ƒ~ž tø)Pčóü[ƒ~ütø*Pčåü[ƒ~śtø+Pč×ü[~ųtø,PčČü[~övtø-Pč¹ü[~ōŚtø.PčŖü[čž£ę9Fņtø/Pč—ü[é3 ødPčŒü[ė»rXéiøČPč{ü[é U‰åPPVWæč¾šæČ¾śøPøąPčń[[éō U‰åPPVW怾č‰ųˆčéŻ U‰åPPVWæ¾é‰ųˆøPøąPč¹[[é¼ U‰åøPøąPč¦[[é« U‰åPVøŖPøPčÄ[[¾ęžåwĘFėōøPč‘Pčn[[éy U‰åV‹vFP’vVčƒÄöD@tVčõ[éV U‰åFP’v’6včōƒÄ‹vöG@t’6včĢ[é. U‰åPPVW‹^ƒĆ ‰Ž‹F1Ņ÷v‰×ƒĒ0ƒ’9~ƒĒN‰ųˆ‹F1Ņ÷v‰Fƒ~uՋ^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹FéĢU‰åPPVW‹^ƒĆ ‰Ž‹F ™’v’vRPč‰ĒƒĒ0ƒ’9~ƒĒN‰ųˆ‹F ™’v’vRPč‰F‰V’v’v1ĄPPčŸ Ąu¹‹^)óƒĆ ‰ß‰óF1ĄŠP‹^Xˆ’FO ’uź‹FéPU‰åƒģ$VW‹^’FŠ˜‰Ē ’ué6ƒ’%t ’vWč‘[[ėŽFō‰ĘFō‰FšĒFä‹^€?-u’F’FäĒFā ‹^€?0u’FĒFā0ĒFź‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fź‰Fź~źėŹĒFęĒF胒.u9‹^’FŠ˜‰Ēƒ’0| ƒ’9ƒļ0ėƒ’*u‹^ƒF‹?ø ÷fč‰Fč~č’FęėĒĒFąƒ’ltƒ’Lu’Fą‹^€?t ‹^’FŠ˜‰ĒWé’Fąæė’Fąæ ė’Fąæƒ~ąt‹^ƒFW’w’7VčNžƒÄ‰Ęéé‹^ƒFW’7VčŲżƒÄ‰ĘéÓ’Fąƒ~ąt<‹^ƒF‹‹O‰F܉Nރ~Ž}Ę-F÷^Ü÷^ރ^Žø P’vŽ’vÜVčóżƒÄ‰Ę鎋^ƒF‹‰Fģƒ~ģ}Ę-F÷^ģø P’vģVčgżƒÄ‰ĘėcĒFā Ę?FėXĒFā ‹^ƒF‹ˆFėEĒFā ‹^ƒF‹‰Fšƒ~šuĒFšŌƒ~čuĒFč’‹vš€<t’Nč|Fėó‰ųˆFė»œX锉š+Fš‰Fģ‹Fź+Fģ‰Fźƒ~ź}ĒFźƒ~äu÷^źƒ~ź}3‹^š€?-uƒ~ā0u‹^š’FšŠ˜’vPčG[[’Nģ’v’vāč9[[’Fźuš’Nģ|‹^š’FšŠ˜’vPč[[ėēƒ~źuéaż’v’vāč[[’NźėēU‰åPPV‹vW1’öDtø’’PéØöDuø’’Pé›öDtøPFP’4č%ƒÄ‰FžĒDGėHĒģŁ ‹D‰ĆƒĆ1ɊNQ‰\‰ĆXˆ‹D@‰D||öD€u’t’t’4č܃ĉFž‹D‰DG ’t+ƒ~ž~‹Fž9Dtƒ~ž}LėLø’’PėĒD1ĄPXéŌU‰åƒ>ģt‹ģ’Ń1ĄPPPPP’vøP1ĄPč—ƒÄé¬U‰å1ĄPPPPP’vøP1ĄPčzƒÄéU‰åPV1öƒž}‰óŃヿtt ‰óŃć’·tč[FėįéeU‰åPV‹vWöDuöDu1ĄPė7ƒ|1ĄPė,’t’t’4賃ĉĒ9|uĒD‹D‰DWė Lø’’PXéU‰å1ĄPPPP’v’vø%P1ĄP诃ÄéņU‰å1ĄPPPPPPøP1ĄPčƒÄé×U‰åPPV‹vW‹FŃą-‰Ć‹æī‹FŃą-‰Ć‰·ī‹N‰āƒžt öuVėøś Pģø0P1ĄPčų[[‰Fžƒ~žuæƒ~ž}’vžėWXélPSQRVWU‰ć‹_‰ŲKŪ‹Ÿī’6ąP’ÓXą]_^ZY[XÜĻU‰å1ĄPP’vP’v’vøPøPčƒÄéU‰å‹N‰ā‹N ‰ä‹N ‰ę‹N‰č‹N‰ź‹N‰ģ’v’včQ[[éąU‰åPPVW’v č[‰Ē‰>ā‹N‰ä‹N ‰ę¾čƒ’‰ųO Ąt ‹^ ’F ŠˆFėģ’v’vč[[é’U‰åPV‹N‰ąøŽP’včP[[‰Ę ötVėƒ>ą}‹ą÷ىø’’Pė’6ąXéSU‰åPV‹vW1’‰óF€?tGėõ‰ų@é6¹ė ¹ė¹ėU‰å‹F‹^Ķ ]Ɖć‹‹_‰/‰g‰G1ĄĆ1ĄU‰å‹^‹F Ąu@‹;Nt‹n ķuōō‹n‹g‹O‰ć‰Ć[YZXV‰ę‡\^9Ówr9Čw tø’’Ć1ĄĆøƋ+G;Gw ŃąƋ_…Ūu ‰Ó…ŪuøPéĖ’ć‹‹OƒĆI|;uö‹_…ŪuøP鬒ć‰ÓėļVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó‰Ź_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŌ+Tū@āćėŹVW‰ę‹\‹D Ąu1Ņ‹L ‹D ÷ó‘÷ó1ۉЉŚ_^[ƒÄ’ć‰Ē1Ū‹D ‹T ¹ŃąŃŅŃÓ9ßwr 9TvāķėŅ+Tū@āćėČčYčĆøŗ ė0øŗ7ė(øŗNė øŗeėøŗ|ėøŗ’ėøŗ©ė1Ū‡Ö…ŪtP’ÓXĆ»SRøPč;čœū‰ĀƒśsŃā»öӋ…Ūt‰Śė»Ē¹‰Āā0ˆKќќќāķŗ¹ėŖU‰åĒ‹^‰‹^‰‹^‰øPøPø»¹Ķ ‰ģ]Ćč,ū_^‰ģ]Ć^_ėų3cyéYĘTest 9 %d errors detected WARNING: The setjmp/longjmp of this machine restore register variables to the value they had at the time of the "setjmp" Aha, I just found one last error ok Error %d in test %d ģģBģģV`j/ DjO/U'XcådmeŚfŚgŚo2sųu*x"(null)e| ©77NError: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow EM trap 0000000 octal ((#ŅøƦ™2 DĢIsĘM6.ЈPP2r܀Hƌov(ąāā:näˆ$łq ‘#ŻtŌ“†Ķ4[jĄŲŁf›0Q¤P°Gˆ27Ā< GG3(DP)sņ荄)D5óFi@ōcĒF<@ÄŠi6͊)@M`’Ī Bµ‚čct£™Æ-;ö ch‚¦O£¾YĆōˆ¬}˰™SFĮa§2”Š(AĘ£9]ē4Į³—ł*X]÷®P¢}I¦)ż±4œ4d–‚XŲš!Š)IŽD©’„JiąG¾włčG±dõrõ ¶GŁ3˹ē Ļ0$ąH›Žł‚办ā T3;žŸ Ź¾Ž ^»ŽśŸrčŽ”Ś¾ĆŽ Àǭ—E†YD )˜„n”DSN!•SŌ!] ”`™Q"yžÓ!É1Rā5"]+]fZś#iÅTłå‰@˜{/T€ RfsŹŠQÓˆ;ič !§Ģ™4ĖČa'Œœ4aİ)č"A‚ u$¾‘£Äiʰ”$̘7bę€PńB‚ ŅøƦ™2 D$\ŲŠ?ƒ-z4©A2iŽ8… T(Q£H•¦9ć& ›­>…ŅIpMš1h褳CŚn4ŹY9§.\;é4 SWA›0BQ¤±G į|SĒ ˆ2nģ“©ūøāŌÕå,õ šĀį|tCĒ  >Ī‘4i3+A P¢; ƒąpČ+V,nœ@®ĮŠė6Ÿ+#ŗ‚égXĒN‡Ęvētj|ŸkĆść>ŽƒZF‘WĪ^9s–_W­Öµˆd.»ē āØÜ1r‘Į…"°B{ļÅ']xDĞ^|Ł–zé„Ń1–ĘzKE†fš-փo0ȗ€…¾É oøq†‡ ¶a` ž—žL 1v݆ŗ”˜¢‰ ĀMī•ąN=%€^8"Å# >b$}¬ŁwER8‘„G“DHuŲŠ ,ŗoX&F —PHUdŠJqZ„‘\uōQH#Ķ1  Šń!ÕQQHšh„‘_Jhm •&”`‚Ą…R E¶é€"HØäuMźh•­½D£&Y²įV‡łµˆaČ” Šš@EtŌ!‡J‡ž©­–Ŗo¬Ńk]–Įž|!ČWr·”źŚUz± Būm„ŸT„Ī~ ²ą m½×\RtŌRd'h ĄŚCnĮŽ…¦ēPŠĘ‘v†Gb„q†“5Ŗ§›C!\āe(Š­OąUWÆgwj”/ qģŪ®æę¦HŚĄ ČP0q\8CĮé,GĀ ›ē0 K¼˜“Wø^ĖƒšņÄŅŹozĪ„ŻĘ÷āłq,Č!ræļŹęŪ '_Øņq-_½ņF¾Ńóc2Ó̰†ė圲q;WÜš“@{M4 F£­ŪFA‹=÷ G?¦Ą_r$@™[Ōƒ ]žwLę4ą;éėÓc#W}PŲYūfĀą[Cā1#¬šŁ>? BŠ›WÖ¹q]“ݳ¼s‰×xĒA®,ØņäüŗūÆo5dBź„{ž8ĖæÅÖ “-zĶo§}ŗęœļzōŗÅ=<ēĢ·]·°TŽģųŚŽ»ī¹KĶ{心`ƒšŹ\×Ū«Ī|p`×OųŠĶƒPöč6{’ŚāĒŗėŁ ŚS^÷(ö½Ē< oŌS’ŚĘ·‹) 2“©Ģe2S˜€üJ!Ā"–£Č '\ŠEc0 G<‘”Įéł›ī†EŻ))$\Œ“LA Sa¢ƒMzČ&7¼į pxŠ ņäoŚˆ 0B9(FGax¬o‹śō°h/ĒiäD,P Ö@Ž•/Š ø]ī ¦õe1Š;Ł¢YCØ}”Lyü# ż”§·žåOy5`†vŽ,8=ōię:Ąb‚Ƈ2“‚z„0G0ŠĮuĀp”*n§L/jČ&ķĄ‚ž ®"a`cz>‰”ˆņDė±PЊć:W>‰7AS™ė¾‡KŻō0h/s]w$=Ōqn‚‹ D·ééo …t] ع^3‘Ÿs D%8Ņ7¦“×CŹ •3 ®»ØFb™ŠK:b€„,³˜+¤Čą–OŅ„oxÉ@_®˜ó1ŸtLÆyo™Åę5Y@NS:Õt¦ź²ÉĄmb“›å8[ĒĄqJē„$ £³NŻ“Ó7ļōž·H‰Į{ĢM*a”|B¹½énÓćĘĒįńvĮ5ćpyW\lķ¹öėßķ.”†Ō*±¦Ö”Žk‡ķöV¼Cś®äīK»÷B0(z÷§^”µWŗ-J„&AĂeR(…–Dƒ}A0]U2˜ŖŠė„»ū[żīkc) P0…$ U€ —†įƊ(ÜĀÄ.18’³˜õ’HĮKĻҰD,ŒpHƒ\SĄ‚Ÿ8ÅGöööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööö